├── .github └── workflows │ └── deploy.yml ├── .gitignore ├── .npmignore ├── .prettierignore ├── .prettierrc ├── CHANGELOG.md ├── LICENSE ├── README.md ├── build ├── cleanup.js └── deploy.js ├── package-lock.json ├── package.json ├── src ├── notifications.ts ├── snackbar.ts ├── sonner.ts ├── toaster.ts └── types.d.ts ├── test ├── CNAME ├── brixi.css ├── index.html ├── notifications.css ├── snackbar.css ├── sonner.css └── toaster.css └── tsconfig.json /.github/workflows/deploy.yml: -------------------------------------------------------------------------------- 1 | name: Deployment 2 | 3 | on: 4 | push: 5 | branches: 6 | - master 7 | 8 | jobs: 9 | deploy: 10 | runs-on: ubuntu-latest 11 | 12 | steps: 13 | - name: Checkout 14 | uses: actions/checkout@master 15 | 16 | - name: Setup Node and NPM 17 | uses: actions/setup-node@v3 18 | with: 19 | node-version: 18.0.0 20 | 21 | - name: Install NPM Packages 22 | run: npm ci 23 | 24 | - name: Deploy 25 | run: npm run deploy 26 | env: 27 | ACCESS_TOKEN: ${{ secrets.ACCESS_TOKEN }} 28 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .DS_Store 3 | dist 4 | _types 5 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | test 2 | .prettierignore 3 | .prettierrc -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | *.html 2 | *.css -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "trailingComma": "es5", 3 | "tabWidth": 4, 4 | "semi": true, 5 | "singleQuote": false, 6 | "printWidth": 180 7 | } -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | 3 | All notable changes to this project will be documented in this file. 4 | 5 | The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), 6 | and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). 7 | 8 | ## [Unreleased] 9 | 10 | ## [4.1.0] - 2023-04-04 11 | 12 | ### Added 13 | 14 | - ability to click-to-close toast 15 | 16 | ## [4.0.0] - 2023-03-28 17 | 18 | ### Added 19 | 20 | - new Toaster functionality 21 | - ES Module exports: 22 | - `@codewithkyle/notifyjs/toaster` 23 | - `@codewithkyle/notifyjs/snackbar` 24 | - `@codewithkyle/notifyjs/notifications` 25 | 26 | ### Removed 27 | 28 | - common JS support 29 | - custom `Notifier` support 30 | 31 | ### Refactored 32 | 33 | - Toast notifications functionality has been moved to new Notifications export 34 | - Each notification type must be explicitly imported 35 | 36 | ## [3.1.0] - 2021-03-26 37 | 38 | ### Fixed 39 | 40 | - improved snackbar rendering performance 41 | - improved toast rendering performance 42 | - reduced package size 43 | 44 | ## [3.0.0] - 2021-03-25 45 | 46 | ### Added 47 | 48 | - type declaration files 49 | - new `append()` function 50 | - alternate CDN version 51 | 52 | ### Fixed 53 | 54 | - autofocus bug ([#19](https://github.com/codewithkyle/notifyjs/issues/19)) 55 | - action button bug ([#20](https://github.com/codewithkyle/notifyjs/issues/20)) 56 | 57 | ## [2.1.1] - 2021-01-21 58 | 59 | ### Fixed 60 | 61 | - snackbar missing element bug 62 | 63 | ## [2.1.0] - 2020-11-09 64 | 65 | ### Added 66 | 67 | - ability to autofocus buttons ([#14](https://github.com/codewithkyle/notifyjs/issues/14)) 68 | - CDN compatible version (ES Module) 69 | - role attributes to snackbar and toast notifications 70 | - toast notificaitons can contain buttons ([#15](https://github.com/codewithkyle/notifyjs/issues/15)) 71 | - toast notification timers ([#13](https://github.com/codewithkyle/notifyjs/issues/13)) 72 | - updated readme 73 | 74 | ### Fixed 75 | 76 | - toast notifications now stack with oldest notifications appearing at the bottom (better UX/expected notification behavior) 77 | 78 | ## [2.0.3] - 2020-09-16 79 | 80 | ### Fixed 81 | 82 | - snackbar button without class string/array bug 83 | 84 | ## [2.0.1] - 2020-04-24 85 | 86 | ### Fixed 87 | 88 | - typescript declaration files 89 | - toast injection 90 | 91 | ## [2.0.0] - 2020-04-23 92 | 93 | ### Added 94 | 95 | - refactored elements into web components 96 | - renamed `NotificationManager()` to `Notifier()` 97 | 98 | ### Fixed 99 | 100 | - toast components use `node.inserBefore()` instead of forcing the `column-reverse` CSS property to render in the correct order 101 | 102 | ### Removed 103 | 104 | - deprecated `position` value 105 | - `notify()` export -- replaced with `snackbar()` 106 | 107 | ## [1.2.2] - 2020-04-17 108 | 109 | ### Fixed 110 | 111 | - toaster notification close button bug 112 | - fixed toaster null check bug 113 | 114 | ## [1.2.0] - 2020-04-04 115 | 116 | ### Added 117 | 118 | - toaster notification `toast()` creation [#5](https://github.com/codewithkyle/notifyjs/issues/5) 119 | - renames existing notification funciton to `snackbar()` 120 | 121 | ## [1.1.0] - 2020-02-11 122 | 123 | ### Added 124 | 125 | - support for applying dynamic notificaiton classes [#6](https://github.com/codewithkyle/notifyjs/issues/6) 126 | - support for dynamic button classes 127 | - testing 128 | - generic material design based CSS stylesheet 129 | 130 | ### Deprecated 131 | 132 | - notifications `position` value 133 | - notifications `element` value 134 | 135 | ## [1.0.3] - 2020-01-09 136 | 137 | ### Fixed 138 | 139 | - updated type declarations 140 | 141 | ## [1.0.2] - 2020-01-09 142 | 143 | ### Added 144 | 145 | - `Notify.d.ts` declaration file to the `files` array in `package.json` 146 | 147 | ## [1.0.1] - 2020-01-09 148 | 149 | ### Added 150 | 151 | - new `notify` export providing access to a global notification manager 152 | 153 | ### Removed 154 | 155 | - [http-server](https://www.npmjs.com/package/http-server) dev dependency 156 | 157 | ## [1.0.0] - 2019-12-15 158 | 159 | ### Added 160 | 161 | - TypeScript declaration file for `Notify.js` 162 | 163 | ### Changed 164 | 165 | - Updated to ES2019 166 | 167 | ### Removed 168 | 169 | - Support for IE 11 170 | - Removed minimum notification duration [#2](https://github.com/codewithkyle/notifyjs/issues/2) 171 | 172 | ## [0.2.0] - 2019-09-30 173 | 174 | ### Added 175 | 176 | - Reworked library to use `window.requestAnimationFrame` instead of `setTimeout` in order to increase performance 177 | - Notifications are queued and will be displayed in the order they're submitted 178 | - Added positioning information/values 179 | - Updated HTML structure to allow for more robust layouts/designs 180 | - Removed the 10 second maximum notification duration 181 | 182 | ### Removed 183 | 184 | - Entire existing codebase due to rewrite 185 | 186 | [unreleased]: https://github.com/codewithkyle/notifyjs/compare/v4.1.0...HEAD 187 | [4.1.0]: https://github.com/codewithkyle/notifyjs/compare/v4.0.0...v4.1.0 188 | [4.0.0]: https://github.com/codewithkyle/notifyjs/compare/v3.2.0...v4.0.0 189 | [3.1.0]: https://github.com/codewithkyle/notifyjs/compare/v3.0.0...v3.2.0 190 | [3.0.0]: https://github.com/codewithkyle/notifyjs/compare/v2.1.1...v3.0.0 191 | [2.1.1]: https://github.com/codewithkyle/notifyjs/compare/v2.1.0...v2.1.1 192 | [2.1.0]: https://github.com/codewithkyle/notifyjs/compare/v2.0.3...v2.1.0 193 | [2.0.3]: https://github.com/codewithkyle/notifyjs/compare/v2.0.1...v2.0.3 194 | [2.0.1]: https://github.com/codewithkyle/notifyjs/compare/v2.0.0...v2.0.1 195 | [2.0.0]: https://github.com/codewithkyle/notifyjs/compare/v1.2.2...v2.0.0 196 | [1.2.2]: https://github.com/codewithkyle/notifyjs/compare/v1.2.0...v1.2.2 197 | [1.2.0]: https://github.com/codewithkyle/notifyjs/compare/v1.1.0...v1.2.0 198 | [1.1.0]: https://github.com/codewithkyle/notifyjs/compare/v1.0.3...v1.1.0 199 | [1.0.3]: https://github.com/codewithkyle/notifyjs/compare/v1.0.2...v1.0.3 200 | [1.0.2]: https://github.com/codewithkyle/notifyjs/compare/v1.0.1...v1.0.2 201 | [1.0.1]: https://github.com/codewithkyle/notifyjs/compare/v1.0.0...v1.0.1 202 | [1.0.0]: https://github.com/codewithkyle/notifyjs/compare/v0.2.0...v1.0.0 203 | [0.2.0]: https://github.com/codewithkyle/notifyjs/compare/v0.1.0...v0.2.0 204 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 Kyle Andrews 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Notify.js 2 | 3 | Notify.js is a lightweight utility library for creating toast, snackbars, and notifications. 4 | 5 | #### CSS Not Included 6 | 7 | This library does not provide any CSS or base styling for the components / HTML Elements it produces. Example styles can be found at [Brixi UI](https://ui.brixi.dev/). 8 | 9 | - [Notifications](https://ui.brixi.dev/notifications) 10 | - [Toast](https://ui.brixi.dev/toast) 11 | - [Snackbar](https://ui.brixi.dev/snackbar) 12 | - Sonner (coming soon) 13 | 14 | ## Installation 15 | 16 | Download Notify.js via NPM: 17 | 18 | ```sh 19 | npm i --save @codewithkyle/notifyjs 20 | ``` 21 | 22 | Or use the CDN version: 23 | 24 | ```javascript 25 | import toaster from "https://cdn.jsdelivr.net/npm/@codewithkyle/notifyjs@5/dist/toaster.js"; 26 | import snackbar from "https://cdn.jsdelivr.net/npm/@codewithkyle/notifyjs@5/dist/snackbar.js"; 27 | import notifications from "https://cdn.jsdelivr.net/npm/@codewithkyle/notifyjs@5/dist/notifications.js"; 28 | import sonner from "https://cdn.jsdelivr.net/npm/@codewithkyle/notifyjs@5/dist/sonner.js"; 29 | ``` 30 | 31 | ## Usage 32 | 33 | 1. [Snackbar Notification](#snackbar-notification) 34 | 1. [Snackbar Interface](#snackbar-interface) 35 | 1. [Snackbar HTML Structure](#snackbar-html-structure) 36 | 1. [Notifications](#notifications) 37 | 1. [Notifications Interface](#notification-interface) 38 | 1. [Notifications HTML Structure](#notification-html-structure) 39 | 1. [Toast Notification](#toast) 40 | 1. [Toast Interface](#toast-interface) 41 | 1. [Toast HTML Structure](#toast-html-structure) 42 | 1. [Sonner Notification](#sonner) 43 | 1. [Sonner Interface](#sonner-interface) 44 | 1. [Sonner HTML Structure](#sonner-html-structure) 45 | 46 | ### Global Manager 47 | 48 | Import the notification type: 49 | 50 | ```typescript 51 | import snackbar from "@codewithkyle/notifyjs/snackbar"; 52 | snackbar({ 53 | message: "All snackbar notifications require a message", 54 | }); 55 | 56 | // Adds an action button 57 | snackbar({ 58 | message: "All snackbar notifications require a message", 59 | buttons: [ 60 | { 61 | label: "Update", 62 | callback: () => { 63 | console.log("User clicked the update button"); 64 | }, 65 | }, 66 | ], 67 | }); 68 | ``` 69 | 70 | ```typescript 71 | import notifications from "@codewithkyle/notifyjs/notifications"; 72 | notifications.push({ 73 | title: "Notificaitons require a title", 74 | message: "They also require a message.", 75 | }); 76 | 77 | // Append custom toast notifications: 78 | class CustomNotificationElement extends HTMLElement { 79 | constructor(message){ 80 | super(); 81 | this.innerText = message; 82 | setTimeout(() => { 83 | this.remove(); 84 | }, 5000); 85 | } 86 | } 87 | notifications.append(new CustomNotificationElement()); 88 | ``` 89 | 90 | ```typescript 91 | import toaster from "@codewithkyle/notifyjs/toaster"; 92 | toaster.push({ 93 | message: "Toast notifications require a message." 94 | }); 95 | ``` 96 | 97 | ```typescript 98 | import sonner from "@codewithkyle/notifyjs/sonner"; 99 | sonner.push({ 100 | heading: "Sonner toast example", 101 | message: "Heading and message are optional." 102 | }); 103 | ``` 104 | 105 | ### Custom Events 106 | 107 | As of version 5 you can trigger notifications using [custom events](https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent) dispatched on the `window`. 108 | 109 | ```typescript 110 | const event = new CustomEvent("notify:sonner", { 111 | detail: { 112 | heading: "Sonner Example", 113 | message: `Example sonner toast message.`, 114 | } 115 | }); 116 | window.dispatchEvent(event); 117 | ``` 118 | 119 | The follow events are supported: 120 | 121 | - `notify:sonner` 122 | - `notify:alert` 123 | - `notify:toast` 124 | - `notify:snackbar` 125 | 126 | The `detail` object accepts the same interfaces as the function versions (see below). 127 | 128 | ### Custom Event Callbacks 129 | 130 | As of version 5 all callback interfaces support `event` and `eventData` properties. When the user interacts with a button a custom event will be fired on the `window`. 131 | 132 | ```typescript 133 | import sonner from "@codewithkyle/notifyjs/sonner"; 134 | sonner.push({ 135 | message: "Heading and message are optional.", 136 | button: { 137 | label: "Test", 138 | event: "test-event", 139 | eventData: "Hi mom!", 140 | } 141 | }); 142 | 143 | // received when the user clicks the button within the sonner notification 144 | window.addEventListener("test-event", (e)=>{ 145 | alert(e.detail); 146 | }); 147 | ``` 148 | 149 | --- 150 | 151 | ## Snackbar Notification 152 | 153 | Snackbar notifications are great for quick one-off notifications that require an action. 154 | 155 | ### Snackbar Interface 156 | 157 | ```typescript 158 | type SnackbarNotification = { 159 | message: string; 160 | duration?: number; // in seconds 161 | closeable?: boolean; 162 | buttons?: Array<{ 163 | label: string; 164 | callback?: Function; 165 | ariaLabel?: string; 166 | classes?: Array | string; 167 | autofocus?: boolean; 168 | event?: string; 169 | eventData?: any; 170 | }>; 171 | force?: boolean; // defaults to true 172 | classes?: Array | string; 173 | autofocus?: boolean; // defaults to true 174 | } 175 | ``` 176 | 177 | ### Snackbar HTML Structure 178 | 179 | ```html 180 | 181 |

Custom notification message

182 | 183 | 184 | 187 | 188 |
189 | ``` 190 | 191 | --- 192 | 193 | ## Notifications 194 | 195 | Notifications are great for application-like notification systems where users will need to recieve warnings, updates, successes, and errors. 196 | 197 | ### Notification Interface 198 | 199 | ```typescript 200 | type Notification = { 201 | title: string; 202 | message: string; 203 | closeable?: boolean; 204 | icon?: string; // svg or img 205 | duration?: number; // in seconds 206 | classes?: string[]; 207 | autofocus?: boolean; // defaults to true 208 | buttons?: Array<{ 209 | label: string; 210 | callback?: Function; 211 | ariaLabel?: string; 212 | classes?: Array | string; 213 | autofocus?: boolean; 214 | event?: string; 215 | eventData?: any; 216 | }>; 217 | timer?: "vertical" | "horizontal" | null; // defaults to null 218 | }; 219 | ``` 220 | 221 | ### Notification HTML Structure 222 | 223 | ```html 224 | 225 | 226 | 227 | 228 | 229 | 230 |

Title

231 |

Custom notification message

232 | 233 | 234 | 235 |
236 | 239 | 240 |
241 |
242 | ``` 243 | 244 | --- 245 | 246 | ## Toast 247 | 248 | Toast notifications are great for simple temporary alerts like "Copied to clipboard" or "Added to playlist". 249 | 250 | ### Toast Interface 251 | 252 | ```typescript 253 | type ToastNotification = { 254 | message: string; 255 | duration?: number; // in seconds 256 | classes?: string | string[]; 257 | }; 258 | ``` 259 | 260 | ### Toast HTML Structure 261 | 262 | ```html 263 | 264 | Custom toast message. 265 | 266 | ``` 267 | 268 | ## Sonner 269 | 270 | Sonner notifications are great for simple temporary alerts. The Sonner notification is slightly opinionated due to the custom interaction and animations. 271 | 272 | ```css 273 | sonner-toast-component { 274 | opacity: var(--opacity); 275 | transform: translateY(var(--y)) translateY(var(--offset)) scale(var(--scale)); 276 | transition: transform 300ms var(--ease-in-out), opacity 300ms var(--ease-in-out); 277 | left: 0; 278 | bottom: 0; 279 | } 280 | ``` 281 | 282 | > **Note**: the sonner components UX is based on the look and feel of the [Sonner react package](https://sonner.emilkowal.ski/). 283 | 284 | ### Sonner Interface 285 | 286 | ```typescript 287 | type SonnerNotification = { 288 | heading?: string, 289 | message?: string, 290 | duration?: number, 291 | classes?: Array|string, 292 | button?: { 293 | callback?: Function, 294 | label: string, 295 | classes?: Array|string, 296 | event?: string; 297 | eventData?: any; 298 | } 299 | }; 300 | ``` 301 | 302 | ### Sonner HTML Structure 303 | 304 | ```html 305 | 306 | 307 | 308 |

Example heading

309 |

This is an example sonner message.

310 |
311 | 312 |
313 |
314 | ``` 315 | -------------------------------------------------------------------------------- /build/cleanup.js: -------------------------------------------------------------------------------- 1 | import fs from "fs"; 2 | import path from "path"; 3 | 4 | const cwd = process.cwd(); 5 | 6 | fs.rmSync(path.join(cwd, "dist"), { recursive: true, force: true }); 7 | -------------------------------------------------------------------------------- /build/deploy.js: -------------------------------------------------------------------------------- 1 | import ghPages from "gh-pages"; 2 | 3 | const NAME = "Kyle Andrews"; 4 | const EMAIL = "codingwithkyle@gmail.com"; 5 | const USERNAME = "codewithkyle"; 6 | const PROJECT = "notifyjs"; 7 | 8 | ghPages.publish( 9 | "test", 10 | { 11 | user: { 12 | name: NAME, 13 | email: EMAIL, 14 | }, 15 | repo: "https://" + process.env.ACCESS_TOKEN + "@github.com/" + USERNAME + "/" + PROJECT + ".git", 16 | silent: true, 17 | }, 18 | (error) => { 19 | if (error) { 20 | console.log(error); 21 | } 22 | } 23 | ); 24 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@codewithkyle/notifyjs", 3 | "version": "4.0.0", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "@codewithkyle/notifyjs", 9 | "version": "4.0.0", 10 | "license": "MIT", 11 | "devDependencies": { 12 | "esbuild": "^0.17.14", 13 | "gh-pages": "^5.0.0", 14 | "serve": "^14.2.0", 15 | "typescript": "^4.2.3" 16 | } 17 | }, 18 | "node_modules/@esbuild/android-arm": { 19 | "version": "0.17.14", 20 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.14.tgz", 21 | "integrity": "sha512-0CnlwnjDU8cks0yJLXfkaU/uoLyRf9VZJs4p1PskBr2AlAHeEsFEwJEo0of/Z3g+ilw5mpyDwThlxzNEIxOE4g==", 22 | "cpu": [ 23 | "arm" 24 | ], 25 | "dev": true, 26 | "optional": true, 27 | "os": [ 28 | "android" 29 | ], 30 | "engines": { 31 | "node": ">=12" 32 | } 33 | }, 34 | "node_modules/@esbuild/android-arm64": { 35 | "version": "0.17.14", 36 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.14.tgz", 37 | "integrity": "sha512-eLOpPO1RvtsP71afiFTvS7tVFShJBCT0txiv/xjFBo5a7R7Gjw7X0IgIaFoLKhqXYAXhahoXm7qAmRXhY4guJg==", 38 | "cpu": [ 39 | "arm64" 40 | ], 41 | "dev": true, 42 | "optional": true, 43 | "os": [ 44 | "android" 45 | ], 46 | "engines": { 47 | "node": ">=12" 48 | } 49 | }, 50 | "node_modules/@esbuild/android-x64": { 51 | "version": "0.17.14", 52 | "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.14.tgz", 53 | "integrity": "sha512-nrfQYWBfLGfSGLvRVlt6xi63B5IbfHm3tZCdu/82zuFPQ7zez4XjmRtF/wIRYbJQ/DsZrxJdEvYFE67avYXyng==", 54 | "cpu": [ 55 | "x64" 56 | ], 57 | "dev": true, 58 | "optional": true, 59 | "os": [ 60 | "android" 61 | ], 62 | "engines": { 63 | "node": ">=12" 64 | } 65 | }, 66 | "node_modules/@esbuild/darwin-arm64": { 67 | "version": "0.17.14", 68 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.14.tgz", 69 | "integrity": "sha512-eoSjEuDsU1ROwgBH/c+fZzuSyJUVXQTOIN9xuLs9dE/9HbV/A5IqdXHU1p2OfIMwBwOYJ9SFVGGldxeRCUJFyw==", 70 | "cpu": [ 71 | "arm64" 72 | ], 73 | "dev": true, 74 | "optional": true, 75 | "os": [ 76 | "darwin" 77 | ], 78 | "engines": { 79 | "node": ">=12" 80 | } 81 | }, 82 | "node_modules/@esbuild/darwin-x64": { 83 | "version": "0.17.14", 84 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.14.tgz", 85 | "integrity": "sha512-zN0U8RWfrDttdFNkHqFYZtOH8hdi22z0pFm0aIJPsNC4QQZv7je8DWCX5iA4Zx6tRhS0CCc0XC2m7wKsbWEo5g==", 86 | "cpu": [ 87 | "x64" 88 | ], 89 | "dev": true, 90 | "optional": true, 91 | "os": [ 92 | "darwin" 93 | ], 94 | "engines": { 95 | "node": ">=12" 96 | } 97 | }, 98 | "node_modules/@esbuild/freebsd-arm64": { 99 | "version": "0.17.14", 100 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.14.tgz", 101 | "integrity": "sha512-z0VcD4ibeZWVQCW1O7szaLxGsx54gcCnajEJMdYoYjLiq4g1jrP2lMq6pk71dbS5+7op/L2Aod+erw+EUr28/A==", 102 | "cpu": [ 103 | "arm64" 104 | ], 105 | "dev": true, 106 | "optional": true, 107 | "os": [ 108 | "freebsd" 109 | ], 110 | "engines": { 111 | "node": ">=12" 112 | } 113 | }, 114 | "node_modules/@esbuild/freebsd-x64": { 115 | "version": "0.17.14", 116 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.14.tgz", 117 | "integrity": "sha512-hd9mPcxfTgJlolrPlcXkQk9BMwNBvNBsVaUe5eNUqXut6weDQH8whcNaKNF2RO8NbpT6GY8rHOK2A9y++s+ehw==", 118 | "cpu": [ 119 | "x64" 120 | ], 121 | "dev": true, 122 | "optional": true, 123 | "os": [ 124 | "freebsd" 125 | ], 126 | "engines": { 127 | "node": ">=12" 128 | } 129 | }, 130 | "node_modules/@esbuild/linux-arm": { 131 | "version": "0.17.14", 132 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.14.tgz", 133 | "integrity": "sha512-BNTl+wSJ1omsH8s3TkQmIIIQHwvwJrU9u1ggb9XU2KTVM4TmthRIVyxSp2qxROJHhZuW/r8fht46/QE8hU8Qvg==", 134 | "cpu": [ 135 | "arm" 136 | ], 137 | "dev": true, 138 | "optional": true, 139 | "os": [ 140 | "linux" 141 | ], 142 | "engines": { 143 | "node": ">=12" 144 | } 145 | }, 146 | "node_modules/@esbuild/linux-arm64": { 147 | "version": "0.17.14", 148 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.14.tgz", 149 | "integrity": "sha512-FhAMNYOq3Iblcj9i+K0l1Fp/MHt+zBeRu/Qkf0LtrcFu3T45jcwB6A1iMsemQ42vR3GBhjNZJZTaCe3VFPbn9g==", 150 | "cpu": [ 151 | "arm64" 152 | ], 153 | "dev": true, 154 | "optional": true, 155 | "os": [ 156 | "linux" 157 | ], 158 | "engines": { 159 | "node": ">=12" 160 | } 161 | }, 162 | "node_modules/@esbuild/linux-ia32": { 163 | "version": "0.17.14", 164 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.14.tgz", 165 | "integrity": "sha512-91OK/lQ5y2v7AsmnFT+0EyxdPTNhov3y2CWMdizyMfxSxRqHazXdzgBKtlmkU2KYIc+9ZK3Vwp2KyXogEATYxQ==", 166 | "cpu": [ 167 | "ia32" 168 | ], 169 | "dev": true, 170 | "optional": true, 171 | "os": [ 172 | "linux" 173 | ], 174 | "engines": { 175 | "node": ">=12" 176 | } 177 | }, 178 | "node_modules/@esbuild/linux-loong64": { 179 | "version": "0.17.14", 180 | "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.14.tgz", 181 | "integrity": "sha512-vp15H+5NR6hubNgMluqqKza85HcGJgq7t6rMH7O3Y6ApiOWPkvW2AJfNojUQimfTp6OUrACUXfR4hmpcENXoMQ==", 182 | "cpu": [ 183 | "loong64" 184 | ], 185 | "dev": true, 186 | "optional": true, 187 | "os": [ 188 | "linux" 189 | ], 190 | "engines": { 191 | "node": ">=12" 192 | } 193 | }, 194 | "node_modules/@esbuild/linux-mips64el": { 195 | "version": "0.17.14", 196 | "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.14.tgz", 197 | "integrity": "sha512-90TOdFV7N+fgi6c2+GO9ochEkmm9kBAKnuD5e08GQMgMINOdOFHuYLPQ91RYVrnWwQ5683sJKuLi9l4SsbJ7Hg==", 198 | "cpu": [ 199 | "mips64el" 200 | ], 201 | "dev": true, 202 | "optional": true, 203 | "os": [ 204 | "linux" 205 | ], 206 | "engines": { 207 | "node": ">=12" 208 | } 209 | }, 210 | "node_modules/@esbuild/linux-ppc64": { 211 | "version": "0.17.14", 212 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.14.tgz", 213 | "integrity": "sha512-NnBGeoqKkTugpBOBZZoktQQ1Yqb7aHKmHxsw43NddPB2YWLAlpb7THZIzsRsTr0Xw3nqiPxbA1H31ZMOG+VVPQ==", 214 | "cpu": [ 215 | "ppc64" 216 | ], 217 | "dev": true, 218 | "optional": true, 219 | "os": [ 220 | "linux" 221 | ], 222 | "engines": { 223 | "node": ">=12" 224 | } 225 | }, 226 | "node_modules/@esbuild/linux-riscv64": { 227 | "version": "0.17.14", 228 | "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.14.tgz", 229 | "integrity": "sha512-0qdlKScLXA8MGVy21JUKvMzCYWovctuP8KKqhtE5A6IVPq4onxXhSuhwDd2g5sRCzNDlDjitc5sX31BzDoL5Fw==", 230 | "cpu": [ 231 | "riscv64" 232 | ], 233 | "dev": true, 234 | "optional": true, 235 | "os": [ 236 | "linux" 237 | ], 238 | "engines": { 239 | "node": ">=12" 240 | } 241 | }, 242 | "node_modules/@esbuild/linux-s390x": { 243 | "version": "0.17.14", 244 | "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.14.tgz", 245 | "integrity": "sha512-Hdm2Jo1yaaOro4v3+6/zJk6ygCqIZuSDJHdHaf8nVH/tfOuoEX5Riv03Ka15LmQBYJObUTNS1UdyoMk0WUn9Ww==", 246 | "cpu": [ 247 | "s390x" 248 | ], 249 | "dev": true, 250 | "optional": true, 251 | "os": [ 252 | "linux" 253 | ], 254 | "engines": { 255 | "node": ">=12" 256 | } 257 | }, 258 | "node_modules/@esbuild/linux-x64": { 259 | "version": "0.17.14", 260 | "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.14.tgz", 261 | "integrity": "sha512-8KHF17OstlK4DuzeF/KmSgzrTWQrkWj5boluiiq7kvJCiQVzUrmSkaBvcLB2UgHpKENO2i6BthPkmUhNDaJsVw==", 262 | "cpu": [ 263 | "x64" 264 | ], 265 | "dev": true, 266 | "optional": true, 267 | "os": [ 268 | "linux" 269 | ], 270 | "engines": { 271 | "node": ">=12" 272 | } 273 | }, 274 | "node_modules/@esbuild/netbsd-x64": { 275 | "version": "0.17.14", 276 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.14.tgz", 277 | "integrity": "sha512-nVwpqvb3yyXztxIT2+VsxJhB5GCgzPdk1n0HHSnchRAcxqKO6ghXwHhJnr0j/B+5FSyEqSxF4q03rbA2fKXtUQ==", 278 | "cpu": [ 279 | "x64" 280 | ], 281 | "dev": true, 282 | "optional": true, 283 | "os": [ 284 | "netbsd" 285 | ], 286 | "engines": { 287 | "node": ">=12" 288 | } 289 | }, 290 | "node_modules/@esbuild/openbsd-x64": { 291 | "version": "0.17.14", 292 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.14.tgz", 293 | "integrity": "sha512-1RZ7uQQ9zcy/GSAJL1xPdN7NDdOOtNEGiJalg/MOzeakZeTrgH/DoCkbq7TaPDiPhWqnDF+4bnydxRqQD7il6g==", 294 | "cpu": [ 295 | "x64" 296 | ], 297 | "dev": true, 298 | "optional": true, 299 | "os": [ 300 | "openbsd" 301 | ], 302 | "engines": { 303 | "node": ">=12" 304 | } 305 | }, 306 | "node_modules/@esbuild/sunos-x64": { 307 | "version": "0.17.14", 308 | "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.14.tgz", 309 | "integrity": "sha512-nqMjDsFwv7vp7msrwWRysnM38Sd44PKmW8EzV01YzDBTcTWUpczQg6mGao9VLicXSgW/iookNK6AxeogNVNDZA==", 310 | "cpu": [ 311 | "x64" 312 | ], 313 | "dev": true, 314 | "optional": true, 315 | "os": [ 316 | "sunos" 317 | ], 318 | "engines": { 319 | "node": ">=12" 320 | } 321 | }, 322 | "node_modules/@esbuild/win32-arm64": { 323 | "version": "0.17.14", 324 | "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.14.tgz", 325 | "integrity": "sha512-xrD0mccTKRBBIotrITV7WVQAwNJ5+1va6L0H9zN92v2yEdjfAN7864cUaZwJS7JPEs53bDTzKFbfqVlG2HhyKQ==", 326 | "cpu": [ 327 | "arm64" 328 | ], 329 | "dev": true, 330 | "optional": true, 331 | "os": [ 332 | "win32" 333 | ], 334 | "engines": { 335 | "node": ">=12" 336 | } 337 | }, 338 | "node_modules/@esbuild/win32-ia32": { 339 | "version": "0.17.14", 340 | "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.14.tgz", 341 | "integrity": "sha512-nXpkz9bbJrLLyUTYtRotSS3t5b+FOuljg8LgLdINWFs3FfqZMtbnBCZFUmBzQPyxqU87F8Av+3Nco/M3hEcu1w==", 342 | "cpu": [ 343 | "ia32" 344 | ], 345 | "dev": true, 346 | "optional": true, 347 | "os": [ 348 | "win32" 349 | ], 350 | "engines": { 351 | "node": ">=12" 352 | } 353 | }, 354 | "node_modules/@esbuild/win32-x64": { 355 | "version": "0.17.14", 356 | "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.14.tgz", 357 | "integrity": "sha512-gPQmsi2DKTaEgG14hc3CHXHp62k8g6qr0Pas+I4lUxRMugGSATh/Bi8Dgusoz9IQ0IfdrvLpco6kujEIBoaogA==", 358 | "cpu": [ 359 | "x64" 360 | ], 361 | "dev": true, 362 | "optional": true, 363 | "os": [ 364 | "win32" 365 | ], 366 | "engines": { 367 | "node": ">=12" 368 | } 369 | }, 370 | "node_modules/@zeit/schemas": { 371 | "version": "2.29.0", 372 | "resolved": "https://registry.npmjs.org/@zeit/schemas/-/schemas-2.29.0.tgz", 373 | "integrity": "sha512-g5QiLIfbg3pLuYUJPlisNKY+epQJTcMDsOnVNkscrDP1oi7vmJnzOANYJI/1pZcVJ6umUkBv3aFtlg1UvUHGzA==", 374 | "dev": true 375 | }, 376 | "node_modules/accepts": { 377 | "version": "1.3.8", 378 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", 379 | "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", 380 | "dev": true, 381 | "dependencies": { 382 | "mime-types": "~2.1.34", 383 | "negotiator": "0.6.3" 384 | }, 385 | "engines": { 386 | "node": ">= 0.6" 387 | } 388 | }, 389 | "node_modules/ajv": { 390 | "version": "8.11.0", 391 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", 392 | "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", 393 | "dev": true, 394 | "dependencies": { 395 | "fast-deep-equal": "^3.1.1", 396 | "json-schema-traverse": "^1.0.0", 397 | "require-from-string": "^2.0.2", 398 | "uri-js": "^4.2.2" 399 | }, 400 | "funding": { 401 | "type": "github", 402 | "url": "https://github.com/sponsors/epoberezkin" 403 | } 404 | }, 405 | "node_modules/ansi-align": { 406 | "version": "3.0.1", 407 | "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", 408 | "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", 409 | "dev": true, 410 | "dependencies": { 411 | "string-width": "^4.1.0" 412 | } 413 | }, 414 | "node_modules/ansi-align/node_modules/ansi-regex": { 415 | "version": "5.0.1", 416 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 417 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 418 | "dev": true, 419 | "engines": { 420 | "node": ">=8" 421 | } 422 | }, 423 | "node_modules/ansi-align/node_modules/emoji-regex": { 424 | "version": "8.0.0", 425 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 426 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 427 | "dev": true 428 | }, 429 | "node_modules/ansi-align/node_modules/string-width": { 430 | "version": "4.2.3", 431 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 432 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 433 | "dev": true, 434 | "dependencies": { 435 | "emoji-regex": "^8.0.0", 436 | "is-fullwidth-code-point": "^3.0.0", 437 | "strip-ansi": "^6.0.1" 438 | }, 439 | "engines": { 440 | "node": ">=8" 441 | } 442 | }, 443 | "node_modules/ansi-align/node_modules/strip-ansi": { 444 | "version": "6.0.1", 445 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 446 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 447 | "dev": true, 448 | "dependencies": { 449 | "ansi-regex": "^5.0.1" 450 | }, 451 | "engines": { 452 | "node": ">=8" 453 | } 454 | }, 455 | "node_modules/ansi-regex": { 456 | "version": "6.0.1", 457 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", 458 | "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", 459 | "dev": true, 460 | "engines": { 461 | "node": ">=12" 462 | }, 463 | "funding": { 464 | "url": "https://github.com/chalk/ansi-regex?sponsor=1" 465 | } 466 | }, 467 | "node_modules/ansi-styles": { 468 | "version": "6.2.1", 469 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", 470 | "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", 471 | "dev": true, 472 | "engines": { 473 | "node": ">=12" 474 | }, 475 | "funding": { 476 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 477 | } 478 | }, 479 | "node_modules/arch": { 480 | "version": "2.2.0", 481 | "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz", 482 | "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==", 483 | "dev": true, 484 | "funding": [ 485 | { 486 | "type": "github", 487 | "url": "https://github.com/sponsors/feross" 488 | }, 489 | { 490 | "type": "patreon", 491 | "url": "https://www.patreon.com/feross" 492 | }, 493 | { 494 | "type": "consulting", 495 | "url": "https://feross.org/support" 496 | } 497 | ] 498 | }, 499 | "node_modules/arg": { 500 | "version": "5.0.2", 501 | "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", 502 | "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", 503 | "dev": true 504 | }, 505 | "node_modules/array-union": { 506 | "version": "1.0.2", 507 | "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", 508 | "integrity": "sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==", 509 | "dev": true, 510 | "dependencies": { 511 | "array-uniq": "^1.0.1" 512 | }, 513 | "engines": { 514 | "node": ">=0.10.0" 515 | } 516 | }, 517 | "node_modules/array-uniq": { 518 | "version": "1.0.3", 519 | "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", 520 | "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==", 521 | "dev": true, 522 | "engines": { 523 | "node": ">=0.10.0" 524 | } 525 | }, 526 | "node_modules/async": { 527 | "version": "3.2.4", 528 | "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", 529 | "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", 530 | "dev": true 531 | }, 532 | "node_modules/balanced-match": { 533 | "version": "1.0.2", 534 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 535 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 536 | "dev": true 537 | }, 538 | "node_modules/boxen": { 539 | "version": "7.0.0", 540 | "resolved": "https://registry.npmjs.org/boxen/-/boxen-7.0.0.tgz", 541 | "integrity": "sha512-j//dBVuyacJbvW+tvZ9HuH03fZ46QcaKvvhZickZqtB271DxJ7SNRSNxrV/dZX0085m7hISRZWbzWlJvx/rHSg==", 542 | "dev": true, 543 | "dependencies": { 544 | "ansi-align": "^3.0.1", 545 | "camelcase": "^7.0.0", 546 | "chalk": "^5.0.1", 547 | "cli-boxes": "^3.0.0", 548 | "string-width": "^5.1.2", 549 | "type-fest": "^2.13.0", 550 | "widest-line": "^4.0.1", 551 | "wrap-ansi": "^8.0.1" 552 | }, 553 | "engines": { 554 | "node": ">=14.16" 555 | }, 556 | "funding": { 557 | "url": "https://github.com/sponsors/sindresorhus" 558 | } 559 | }, 560 | "node_modules/brace-expansion": { 561 | "version": "1.1.11", 562 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 563 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 564 | "dev": true, 565 | "dependencies": { 566 | "balanced-match": "^1.0.0", 567 | "concat-map": "0.0.1" 568 | } 569 | }, 570 | "node_modules/bytes": { 571 | "version": "3.0.0", 572 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", 573 | "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", 574 | "dev": true, 575 | "engines": { 576 | "node": ">= 0.8" 577 | } 578 | }, 579 | "node_modules/camelcase": { 580 | "version": "7.0.1", 581 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.1.tgz", 582 | "integrity": "sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==", 583 | "dev": true, 584 | "engines": { 585 | "node": ">=14.16" 586 | }, 587 | "funding": { 588 | "url": "https://github.com/sponsors/sindresorhus" 589 | } 590 | }, 591 | "node_modules/chalk": { 592 | "version": "5.0.1", 593 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.0.1.tgz", 594 | "integrity": "sha512-Fo07WOYGqMfCWHOzSXOt2CxDbC6skS/jO9ynEcmpANMoPrD+W1r1K6Vx7iNm+AQmETU1Xr2t+n8nzkV9t6xh3w==", 595 | "dev": true, 596 | "engines": { 597 | "node": "^12.17.0 || ^14.13 || >=16.0.0" 598 | }, 599 | "funding": { 600 | "url": "https://github.com/chalk/chalk?sponsor=1" 601 | } 602 | }, 603 | "node_modules/chalk-template": { 604 | "version": "0.4.0", 605 | "resolved": "https://registry.npmjs.org/chalk-template/-/chalk-template-0.4.0.tgz", 606 | "integrity": "sha512-/ghrgmhfY8RaSdeo43hNXxpoHAtxdbskUHjPpfqUWGttFgycUhYPGx3YZBCnUCvOa7Doivn1IZec3DEGFoMgLg==", 607 | "dev": true, 608 | "dependencies": { 609 | "chalk": "^4.1.2" 610 | }, 611 | "engines": { 612 | "node": ">=12" 613 | }, 614 | "funding": { 615 | "url": "https://github.com/chalk/chalk-template?sponsor=1" 616 | } 617 | }, 618 | "node_modules/chalk-template/node_modules/ansi-styles": { 619 | "version": "4.3.0", 620 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 621 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 622 | "dev": true, 623 | "dependencies": { 624 | "color-convert": "^2.0.1" 625 | }, 626 | "engines": { 627 | "node": ">=8" 628 | }, 629 | "funding": { 630 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 631 | } 632 | }, 633 | "node_modules/chalk-template/node_modules/chalk": { 634 | "version": "4.1.2", 635 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", 636 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", 637 | "dev": true, 638 | "dependencies": { 639 | "ansi-styles": "^4.1.0", 640 | "supports-color": "^7.1.0" 641 | }, 642 | "engines": { 643 | "node": ">=10" 644 | }, 645 | "funding": { 646 | "url": "https://github.com/chalk/chalk?sponsor=1" 647 | } 648 | }, 649 | "node_modules/cli-boxes": { 650 | "version": "3.0.0", 651 | "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", 652 | "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", 653 | "dev": true, 654 | "engines": { 655 | "node": ">=10" 656 | }, 657 | "funding": { 658 | "url": "https://github.com/sponsors/sindresorhus" 659 | } 660 | }, 661 | "node_modules/clipboardy": { 662 | "version": "3.0.0", 663 | "resolved": "https://registry.npmjs.org/clipboardy/-/clipboardy-3.0.0.tgz", 664 | "integrity": "sha512-Su+uU5sr1jkUy1sGRpLKjKrvEOVXgSgiSInwa/qeID6aJ07yh+5NWc3h2QfjHjBnfX4LhtFcuAWKUsJ3r+fjbg==", 665 | "dev": true, 666 | "dependencies": { 667 | "arch": "^2.2.0", 668 | "execa": "^5.1.1", 669 | "is-wsl": "^2.2.0" 670 | }, 671 | "engines": { 672 | "node": "^12.20.0 || ^14.13.1 || >=16.0.0" 673 | }, 674 | "funding": { 675 | "url": "https://github.com/sponsors/sindresorhus" 676 | } 677 | }, 678 | "node_modules/color-convert": { 679 | "version": "2.0.1", 680 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 681 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 682 | "dev": true, 683 | "dependencies": { 684 | "color-name": "~1.1.4" 685 | }, 686 | "engines": { 687 | "node": ">=7.0.0" 688 | } 689 | }, 690 | "node_modules/color-name": { 691 | "version": "1.1.4", 692 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 693 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 694 | "dev": true 695 | }, 696 | "node_modules/commander": { 697 | "version": "2.20.3", 698 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", 699 | "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", 700 | "dev": true 701 | }, 702 | "node_modules/commondir": { 703 | "version": "1.0.1", 704 | "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", 705 | "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", 706 | "dev": true 707 | }, 708 | "node_modules/compressible": { 709 | "version": "2.0.18", 710 | "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", 711 | "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", 712 | "dev": true, 713 | "dependencies": { 714 | "mime-db": ">= 1.43.0 < 2" 715 | }, 716 | "engines": { 717 | "node": ">= 0.6" 718 | } 719 | }, 720 | "node_modules/compression": { 721 | "version": "1.7.4", 722 | "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", 723 | "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", 724 | "dev": true, 725 | "dependencies": { 726 | "accepts": "~1.3.5", 727 | "bytes": "3.0.0", 728 | "compressible": "~2.0.16", 729 | "debug": "2.6.9", 730 | "on-headers": "~1.0.2", 731 | "safe-buffer": "5.1.2", 732 | "vary": "~1.1.2" 733 | }, 734 | "engines": { 735 | "node": ">= 0.8.0" 736 | } 737 | }, 738 | "node_modules/concat-map": { 739 | "version": "0.0.1", 740 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 741 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", 742 | "dev": true 743 | }, 744 | "node_modules/content-disposition": { 745 | "version": "0.5.2", 746 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", 747 | "integrity": "sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA==", 748 | "dev": true, 749 | "engines": { 750 | "node": ">= 0.6" 751 | } 752 | }, 753 | "node_modules/cross-spawn": { 754 | "version": "7.0.3", 755 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", 756 | "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", 757 | "dev": true, 758 | "dependencies": { 759 | "path-key": "^3.1.0", 760 | "shebang-command": "^2.0.0", 761 | "which": "^2.0.1" 762 | }, 763 | "engines": { 764 | "node": ">= 8" 765 | } 766 | }, 767 | "node_modules/debug": { 768 | "version": "2.6.9", 769 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 770 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 771 | "dev": true, 772 | "dependencies": { 773 | "ms": "2.0.0" 774 | } 775 | }, 776 | "node_modules/deep-extend": { 777 | "version": "0.6.0", 778 | "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", 779 | "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", 780 | "dev": true, 781 | "engines": { 782 | "node": ">=4.0.0" 783 | } 784 | }, 785 | "node_modules/eastasianwidth": { 786 | "version": "0.2.0", 787 | "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", 788 | "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", 789 | "dev": true 790 | }, 791 | "node_modules/email-addresses": { 792 | "version": "5.0.0", 793 | "resolved": "https://registry.npmjs.org/email-addresses/-/email-addresses-5.0.0.tgz", 794 | "integrity": "sha512-4OIPYlA6JXqtVn8zpHpGiI7vE6EQOAg16aGnDMIAlZVinnoZ8208tW1hAbjWydgN/4PLTT9q+O1K6AH/vALJGw==", 795 | "dev": true 796 | }, 797 | "node_modules/emoji-regex": { 798 | "version": "9.2.2", 799 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", 800 | "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", 801 | "dev": true 802 | }, 803 | "node_modules/esbuild": { 804 | "version": "0.17.14", 805 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.14.tgz", 806 | "integrity": "sha512-vOO5XhmVj/1XQR9NQ1UPq6qvMYL7QFJU57J5fKBKBKxp17uDt5PgxFDb4A2nEiXhr1qQs4x0F5+66hVVw4ruNw==", 807 | "dev": true, 808 | "hasInstallScript": true, 809 | "bin": { 810 | "esbuild": "bin/esbuild" 811 | }, 812 | "engines": { 813 | "node": ">=12" 814 | }, 815 | "optionalDependencies": { 816 | "@esbuild/android-arm": "0.17.14", 817 | "@esbuild/android-arm64": "0.17.14", 818 | "@esbuild/android-x64": "0.17.14", 819 | "@esbuild/darwin-arm64": "0.17.14", 820 | "@esbuild/darwin-x64": "0.17.14", 821 | "@esbuild/freebsd-arm64": "0.17.14", 822 | "@esbuild/freebsd-x64": "0.17.14", 823 | "@esbuild/linux-arm": "0.17.14", 824 | "@esbuild/linux-arm64": "0.17.14", 825 | "@esbuild/linux-ia32": "0.17.14", 826 | "@esbuild/linux-loong64": "0.17.14", 827 | "@esbuild/linux-mips64el": "0.17.14", 828 | "@esbuild/linux-ppc64": "0.17.14", 829 | "@esbuild/linux-riscv64": "0.17.14", 830 | "@esbuild/linux-s390x": "0.17.14", 831 | "@esbuild/linux-x64": "0.17.14", 832 | "@esbuild/netbsd-x64": "0.17.14", 833 | "@esbuild/openbsd-x64": "0.17.14", 834 | "@esbuild/sunos-x64": "0.17.14", 835 | "@esbuild/win32-arm64": "0.17.14", 836 | "@esbuild/win32-ia32": "0.17.14", 837 | "@esbuild/win32-x64": "0.17.14" 838 | } 839 | }, 840 | "node_modules/escape-string-regexp": { 841 | "version": "1.0.5", 842 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 843 | "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", 844 | "dev": true, 845 | "engines": { 846 | "node": ">=0.8.0" 847 | } 848 | }, 849 | "node_modules/execa": { 850 | "version": "5.1.1", 851 | "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", 852 | "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", 853 | "dev": true, 854 | "dependencies": { 855 | "cross-spawn": "^7.0.3", 856 | "get-stream": "^6.0.0", 857 | "human-signals": "^2.1.0", 858 | "is-stream": "^2.0.0", 859 | "merge-stream": "^2.0.0", 860 | "npm-run-path": "^4.0.1", 861 | "onetime": "^5.1.2", 862 | "signal-exit": "^3.0.3", 863 | "strip-final-newline": "^2.0.0" 864 | }, 865 | "engines": { 866 | "node": ">=10" 867 | }, 868 | "funding": { 869 | "url": "https://github.com/sindresorhus/execa?sponsor=1" 870 | } 871 | }, 872 | "node_modules/fast-deep-equal": { 873 | "version": "3.1.3", 874 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", 875 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", 876 | "dev": true 877 | }, 878 | "node_modules/fast-url-parser": { 879 | "version": "1.1.3", 880 | "resolved": "https://registry.npmjs.org/fast-url-parser/-/fast-url-parser-1.1.3.tgz", 881 | "integrity": "sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ==", 882 | "dev": true, 883 | "dependencies": { 884 | "punycode": "^1.3.2" 885 | } 886 | }, 887 | "node_modules/filename-reserved-regex": { 888 | "version": "2.0.0", 889 | "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz", 890 | "integrity": "sha512-lc1bnsSr4L4Bdif8Xb/qrtokGbq5zlsms/CYH8PP+WtCkGNF65DPiQY8vG3SakEdRn8Dlnm+gW/qWKKjS5sZzQ==", 891 | "dev": true, 892 | "engines": { 893 | "node": ">=4" 894 | } 895 | }, 896 | "node_modules/filenamify": { 897 | "version": "4.3.0", 898 | "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-4.3.0.tgz", 899 | "integrity": "sha512-hcFKyUG57yWGAzu1CMt/dPzYZuv+jAJUT85bL8mrXvNe6hWj6yEHEc4EdcgiA6Z3oi1/9wXJdZPXF2dZNgwgOg==", 900 | "dev": true, 901 | "dependencies": { 902 | "filename-reserved-regex": "^2.0.0", 903 | "strip-outer": "^1.0.1", 904 | "trim-repeated": "^1.0.0" 905 | }, 906 | "engines": { 907 | "node": ">=8" 908 | }, 909 | "funding": { 910 | "url": "https://github.com/sponsors/sindresorhus" 911 | } 912 | }, 913 | "node_modules/find-cache-dir": { 914 | "version": "3.3.2", 915 | "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", 916 | "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", 917 | "dev": true, 918 | "dependencies": { 919 | "commondir": "^1.0.1", 920 | "make-dir": "^3.0.2", 921 | "pkg-dir": "^4.1.0" 922 | }, 923 | "engines": { 924 | "node": ">=8" 925 | }, 926 | "funding": { 927 | "url": "https://github.com/avajs/find-cache-dir?sponsor=1" 928 | } 929 | }, 930 | "node_modules/find-up": { 931 | "version": "4.1.0", 932 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", 933 | "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", 934 | "dev": true, 935 | "dependencies": { 936 | "locate-path": "^5.0.0", 937 | "path-exists": "^4.0.0" 938 | }, 939 | "engines": { 940 | "node": ">=8" 941 | } 942 | }, 943 | "node_modules/fs-extra": { 944 | "version": "8.1.0", 945 | "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", 946 | "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", 947 | "dev": true, 948 | "dependencies": { 949 | "graceful-fs": "^4.2.0", 950 | "jsonfile": "^4.0.0", 951 | "universalify": "^0.1.0" 952 | }, 953 | "engines": { 954 | "node": ">=6 <7 || >=8" 955 | } 956 | }, 957 | "node_modules/fs.realpath": { 958 | "version": "1.0.0", 959 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 960 | "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", 961 | "dev": true 962 | }, 963 | "node_modules/get-stream": { 964 | "version": "6.0.1", 965 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", 966 | "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", 967 | "dev": true, 968 | "engines": { 969 | "node": ">=10" 970 | }, 971 | "funding": { 972 | "url": "https://github.com/sponsors/sindresorhus" 973 | } 974 | }, 975 | "node_modules/gh-pages": { 976 | "version": "5.0.0", 977 | "resolved": "https://registry.npmjs.org/gh-pages/-/gh-pages-5.0.0.tgz", 978 | "integrity": "sha512-Nqp1SjkPIB94Xw/3yYNTUL+G2dxlhjvv1zeN/4kMC1jfViTEqhtVz/Ba1zSXHuvXCN9ADNS1dN4r5/J/nZWEQQ==", 979 | "dev": true, 980 | "dependencies": { 981 | "async": "^3.2.4", 982 | "commander": "^2.18.0", 983 | "email-addresses": "^5.0.0", 984 | "filenamify": "^4.3.0", 985 | "find-cache-dir": "^3.3.1", 986 | "fs-extra": "^8.1.0", 987 | "globby": "^6.1.0" 988 | }, 989 | "bin": { 990 | "gh-pages": "bin/gh-pages.js", 991 | "gh-pages-clean": "bin/gh-pages-clean.js" 992 | }, 993 | "engines": { 994 | "node": ">=10" 995 | } 996 | }, 997 | "node_modules/glob": { 998 | "version": "7.2.3", 999 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", 1000 | "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", 1001 | "dev": true, 1002 | "dependencies": { 1003 | "fs.realpath": "^1.0.0", 1004 | "inflight": "^1.0.4", 1005 | "inherits": "2", 1006 | "minimatch": "^3.1.1", 1007 | "once": "^1.3.0", 1008 | "path-is-absolute": "^1.0.0" 1009 | }, 1010 | "engines": { 1011 | "node": "*" 1012 | }, 1013 | "funding": { 1014 | "url": "https://github.com/sponsors/isaacs" 1015 | } 1016 | }, 1017 | "node_modules/globby": { 1018 | "version": "6.1.0", 1019 | "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", 1020 | "integrity": "sha512-KVbFv2TQtbzCoxAnfD6JcHZTYCzyliEaaeM/gH8qQdkKr5s0OP9scEgvdcngyk7AVdY6YVW/TJHd+lQ/Df3Daw==", 1021 | "dev": true, 1022 | "dependencies": { 1023 | "array-union": "^1.0.1", 1024 | "glob": "^7.0.3", 1025 | "object-assign": "^4.0.1", 1026 | "pify": "^2.0.0", 1027 | "pinkie-promise": "^2.0.0" 1028 | }, 1029 | "engines": { 1030 | "node": ">=0.10.0" 1031 | } 1032 | }, 1033 | "node_modules/graceful-fs": { 1034 | "version": "4.2.11", 1035 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", 1036 | "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", 1037 | "dev": true 1038 | }, 1039 | "node_modules/has-flag": { 1040 | "version": "4.0.0", 1041 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 1042 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 1043 | "dev": true, 1044 | "engines": { 1045 | "node": ">=8" 1046 | } 1047 | }, 1048 | "node_modules/human-signals": { 1049 | "version": "2.1.0", 1050 | "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", 1051 | "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", 1052 | "dev": true, 1053 | "engines": { 1054 | "node": ">=10.17.0" 1055 | } 1056 | }, 1057 | "node_modules/inflight": { 1058 | "version": "1.0.6", 1059 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 1060 | "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", 1061 | "dev": true, 1062 | "dependencies": { 1063 | "once": "^1.3.0", 1064 | "wrappy": "1" 1065 | } 1066 | }, 1067 | "node_modules/inherits": { 1068 | "version": "2.0.4", 1069 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 1070 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 1071 | "dev": true 1072 | }, 1073 | "node_modules/ini": { 1074 | "version": "1.3.8", 1075 | "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", 1076 | "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", 1077 | "dev": true 1078 | }, 1079 | "node_modules/is-docker": { 1080 | "version": "2.2.1", 1081 | "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", 1082 | "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", 1083 | "dev": true, 1084 | "bin": { 1085 | "is-docker": "cli.js" 1086 | }, 1087 | "engines": { 1088 | "node": ">=8" 1089 | }, 1090 | "funding": { 1091 | "url": "https://github.com/sponsors/sindresorhus" 1092 | } 1093 | }, 1094 | "node_modules/is-fullwidth-code-point": { 1095 | "version": "3.0.0", 1096 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 1097 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 1098 | "dev": true, 1099 | "engines": { 1100 | "node": ">=8" 1101 | } 1102 | }, 1103 | "node_modules/is-port-reachable": { 1104 | "version": "4.0.0", 1105 | "resolved": "https://registry.npmjs.org/is-port-reachable/-/is-port-reachable-4.0.0.tgz", 1106 | "integrity": "sha512-9UoipoxYmSk6Xy7QFgRv2HDyaysmgSG75TFQs6S+3pDM7ZhKTF/bskZV+0UlABHzKjNVhPjYCLfeZUEg1wXxig==", 1107 | "dev": true, 1108 | "engines": { 1109 | "node": "^12.20.0 || ^14.13.1 || >=16.0.0" 1110 | }, 1111 | "funding": { 1112 | "url": "https://github.com/sponsors/sindresorhus" 1113 | } 1114 | }, 1115 | "node_modules/is-stream": { 1116 | "version": "2.0.1", 1117 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", 1118 | "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", 1119 | "dev": true, 1120 | "engines": { 1121 | "node": ">=8" 1122 | }, 1123 | "funding": { 1124 | "url": "https://github.com/sponsors/sindresorhus" 1125 | } 1126 | }, 1127 | "node_modules/is-wsl": { 1128 | "version": "2.2.0", 1129 | "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", 1130 | "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", 1131 | "dev": true, 1132 | "dependencies": { 1133 | "is-docker": "^2.0.0" 1134 | }, 1135 | "engines": { 1136 | "node": ">=8" 1137 | } 1138 | }, 1139 | "node_modules/isexe": { 1140 | "version": "2.0.0", 1141 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 1142 | "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", 1143 | "dev": true 1144 | }, 1145 | "node_modules/json-schema-traverse": { 1146 | "version": "1.0.0", 1147 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", 1148 | "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", 1149 | "dev": true 1150 | }, 1151 | "node_modules/jsonfile": { 1152 | "version": "4.0.0", 1153 | "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", 1154 | "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", 1155 | "dev": true, 1156 | "optionalDependencies": { 1157 | "graceful-fs": "^4.1.6" 1158 | } 1159 | }, 1160 | "node_modules/locate-path": { 1161 | "version": "5.0.0", 1162 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", 1163 | "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", 1164 | "dev": true, 1165 | "dependencies": { 1166 | "p-locate": "^4.1.0" 1167 | }, 1168 | "engines": { 1169 | "node": ">=8" 1170 | } 1171 | }, 1172 | "node_modules/make-dir": { 1173 | "version": "3.1.0", 1174 | "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", 1175 | "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", 1176 | "dev": true, 1177 | "dependencies": { 1178 | "semver": "^6.0.0" 1179 | }, 1180 | "engines": { 1181 | "node": ">=8" 1182 | }, 1183 | "funding": { 1184 | "url": "https://github.com/sponsors/sindresorhus" 1185 | } 1186 | }, 1187 | "node_modules/merge-stream": { 1188 | "version": "2.0.0", 1189 | "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", 1190 | "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", 1191 | "dev": true 1192 | }, 1193 | "node_modules/mime-db": { 1194 | "version": "1.52.0", 1195 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 1196 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", 1197 | "dev": true, 1198 | "engines": { 1199 | "node": ">= 0.6" 1200 | } 1201 | }, 1202 | "node_modules/mime-types": { 1203 | "version": "2.1.35", 1204 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 1205 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 1206 | "dev": true, 1207 | "dependencies": { 1208 | "mime-db": "1.52.0" 1209 | }, 1210 | "engines": { 1211 | "node": ">= 0.6" 1212 | } 1213 | }, 1214 | "node_modules/mimic-fn": { 1215 | "version": "2.1.0", 1216 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", 1217 | "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", 1218 | "dev": true, 1219 | "engines": { 1220 | "node": ">=6" 1221 | } 1222 | }, 1223 | "node_modules/minimatch": { 1224 | "version": "3.1.2", 1225 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 1226 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 1227 | "dev": true, 1228 | "dependencies": { 1229 | "brace-expansion": "^1.1.7" 1230 | }, 1231 | "engines": { 1232 | "node": "*" 1233 | } 1234 | }, 1235 | "node_modules/minimist": { 1236 | "version": "1.2.8", 1237 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", 1238 | "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", 1239 | "dev": true, 1240 | "funding": { 1241 | "url": "https://github.com/sponsors/ljharb" 1242 | } 1243 | }, 1244 | "node_modules/ms": { 1245 | "version": "2.0.0", 1246 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 1247 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", 1248 | "dev": true 1249 | }, 1250 | "node_modules/negotiator": { 1251 | "version": "0.6.3", 1252 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", 1253 | "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", 1254 | "dev": true, 1255 | "engines": { 1256 | "node": ">= 0.6" 1257 | } 1258 | }, 1259 | "node_modules/npm-run-path": { 1260 | "version": "4.0.1", 1261 | "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", 1262 | "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", 1263 | "dev": true, 1264 | "dependencies": { 1265 | "path-key": "^3.0.0" 1266 | }, 1267 | "engines": { 1268 | "node": ">=8" 1269 | } 1270 | }, 1271 | "node_modules/object-assign": { 1272 | "version": "4.1.1", 1273 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 1274 | "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", 1275 | "dev": true, 1276 | "engines": { 1277 | "node": ">=0.10.0" 1278 | } 1279 | }, 1280 | "node_modules/on-headers": { 1281 | "version": "1.0.2", 1282 | "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", 1283 | "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", 1284 | "dev": true, 1285 | "engines": { 1286 | "node": ">= 0.8" 1287 | } 1288 | }, 1289 | "node_modules/once": { 1290 | "version": "1.4.0", 1291 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1292 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", 1293 | "dev": true, 1294 | "dependencies": { 1295 | "wrappy": "1" 1296 | } 1297 | }, 1298 | "node_modules/onetime": { 1299 | "version": "5.1.2", 1300 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", 1301 | "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", 1302 | "dev": true, 1303 | "dependencies": { 1304 | "mimic-fn": "^2.1.0" 1305 | }, 1306 | "engines": { 1307 | "node": ">=6" 1308 | }, 1309 | "funding": { 1310 | "url": "https://github.com/sponsors/sindresorhus" 1311 | } 1312 | }, 1313 | "node_modules/p-limit": { 1314 | "version": "2.3.0", 1315 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", 1316 | "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", 1317 | "dev": true, 1318 | "dependencies": { 1319 | "p-try": "^2.0.0" 1320 | }, 1321 | "engines": { 1322 | "node": ">=6" 1323 | }, 1324 | "funding": { 1325 | "url": "https://github.com/sponsors/sindresorhus" 1326 | } 1327 | }, 1328 | "node_modules/p-locate": { 1329 | "version": "4.1.0", 1330 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", 1331 | "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", 1332 | "dev": true, 1333 | "dependencies": { 1334 | "p-limit": "^2.2.0" 1335 | }, 1336 | "engines": { 1337 | "node": ">=8" 1338 | } 1339 | }, 1340 | "node_modules/p-try": { 1341 | "version": "2.2.0", 1342 | "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", 1343 | "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", 1344 | "dev": true, 1345 | "engines": { 1346 | "node": ">=6" 1347 | } 1348 | }, 1349 | "node_modules/path-exists": { 1350 | "version": "4.0.0", 1351 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", 1352 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", 1353 | "dev": true, 1354 | "engines": { 1355 | "node": ">=8" 1356 | } 1357 | }, 1358 | "node_modules/path-is-absolute": { 1359 | "version": "1.0.1", 1360 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1361 | "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", 1362 | "dev": true, 1363 | "engines": { 1364 | "node": ">=0.10.0" 1365 | } 1366 | }, 1367 | "node_modules/path-is-inside": { 1368 | "version": "1.0.2", 1369 | "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", 1370 | "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==", 1371 | "dev": true 1372 | }, 1373 | "node_modules/path-key": { 1374 | "version": "3.1.1", 1375 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 1376 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", 1377 | "dev": true, 1378 | "engines": { 1379 | "node": ">=8" 1380 | } 1381 | }, 1382 | "node_modules/path-to-regexp": { 1383 | "version": "2.2.1", 1384 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-2.2.1.tgz", 1385 | "integrity": "sha512-gu9bD6Ta5bwGrrU8muHzVOBFFREpp2iRkVfhBJahwJ6p6Xw20SjT0MxLnwkjOibQmGSYhiUnf2FLe7k+jcFmGQ==", 1386 | "dev": true 1387 | }, 1388 | "node_modules/pify": { 1389 | "version": "2.3.0", 1390 | "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", 1391 | "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", 1392 | "dev": true, 1393 | "engines": { 1394 | "node": ">=0.10.0" 1395 | } 1396 | }, 1397 | "node_modules/pinkie": { 1398 | "version": "2.0.4", 1399 | "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", 1400 | "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", 1401 | "dev": true, 1402 | "engines": { 1403 | "node": ">=0.10.0" 1404 | } 1405 | }, 1406 | "node_modules/pinkie-promise": { 1407 | "version": "2.0.1", 1408 | "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", 1409 | "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", 1410 | "dev": true, 1411 | "dependencies": { 1412 | "pinkie": "^2.0.0" 1413 | }, 1414 | "engines": { 1415 | "node": ">=0.10.0" 1416 | } 1417 | }, 1418 | "node_modules/pkg-dir": { 1419 | "version": "4.2.0", 1420 | "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", 1421 | "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", 1422 | "dev": true, 1423 | "dependencies": { 1424 | "find-up": "^4.0.0" 1425 | }, 1426 | "engines": { 1427 | "node": ">=8" 1428 | } 1429 | }, 1430 | "node_modules/punycode": { 1431 | "version": "1.4.1", 1432 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", 1433 | "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", 1434 | "dev": true 1435 | }, 1436 | "node_modules/range-parser": { 1437 | "version": "1.2.0", 1438 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", 1439 | "integrity": "sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A==", 1440 | "dev": true, 1441 | "engines": { 1442 | "node": ">= 0.6" 1443 | } 1444 | }, 1445 | "node_modules/rc": { 1446 | "version": "1.2.8", 1447 | "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", 1448 | "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", 1449 | "dev": true, 1450 | "dependencies": { 1451 | "deep-extend": "^0.6.0", 1452 | "ini": "~1.3.0", 1453 | "minimist": "^1.2.0", 1454 | "strip-json-comments": "~2.0.1" 1455 | }, 1456 | "bin": { 1457 | "rc": "cli.js" 1458 | } 1459 | }, 1460 | "node_modules/registry-auth-token": { 1461 | "version": "3.3.2", 1462 | "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.2.tgz", 1463 | "integrity": "sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==", 1464 | "dev": true, 1465 | "dependencies": { 1466 | "rc": "^1.1.6", 1467 | "safe-buffer": "^5.0.1" 1468 | } 1469 | }, 1470 | "node_modules/registry-url": { 1471 | "version": "3.1.0", 1472 | "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", 1473 | "integrity": "sha512-ZbgR5aZEdf4UKZVBPYIgaglBmSF2Hi94s2PcIHhRGFjKYu+chjJdYfHn4rt3hB6eCKLJ8giVIIfgMa1ehDfZKA==", 1474 | "dev": true, 1475 | "dependencies": { 1476 | "rc": "^1.0.1" 1477 | }, 1478 | "engines": { 1479 | "node": ">=0.10.0" 1480 | } 1481 | }, 1482 | "node_modules/require-from-string": { 1483 | "version": "2.0.2", 1484 | "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", 1485 | "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", 1486 | "dev": true, 1487 | "engines": { 1488 | "node": ">=0.10.0" 1489 | } 1490 | }, 1491 | "node_modules/safe-buffer": { 1492 | "version": "5.1.2", 1493 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 1494 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", 1495 | "dev": true 1496 | }, 1497 | "node_modules/semver": { 1498 | "version": "6.3.0", 1499 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", 1500 | "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", 1501 | "dev": true, 1502 | "bin": { 1503 | "semver": "bin/semver.js" 1504 | } 1505 | }, 1506 | "node_modules/serve": { 1507 | "version": "14.2.0", 1508 | "resolved": "https://registry.npmjs.org/serve/-/serve-14.2.0.tgz", 1509 | "integrity": "sha512-+HOw/XK1bW8tw5iBilBz/mJLWRzM8XM6MPxL4J/dKzdxq1vfdEWSwhaR7/yS8EJp5wzvP92p1qirysJvnEtjXg==", 1510 | "dev": true, 1511 | "dependencies": { 1512 | "@zeit/schemas": "2.29.0", 1513 | "ajv": "8.11.0", 1514 | "arg": "5.0.2", 1515 | "boxen": "7.0.0", 1516 | "chalk": "5.0.1", 1517 | "chalk-template": "0.4.0", 1518 | "clipboardy": "3.0.0", 1519 | "compression": "1.7.4", 1520 | "is-port-reachable": "4.0.0", 1521 | "serve-handler": "6.1.5", 1522 | "update-check": "1.5.4" 1523 | }, 1524 | "bin": { 1525 | "serve": "build/main.js" 1526 | }, 1527 | "engines": { 1528 | "node": ">= 14" 1529 | } 1530 | }, 1531 | "node_modules/serve-handler": { 1532 | "version": "6.1.5", 1533 | "resolved": "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.5.tgz", 1534 | "integrity": "sha512-ijPFle6Hwe8zfmBxJdE+5fta53fdIY0lHISJvuikXB3VYFafRjMRpOffSPvCYsbKyBA7pvy9oYr/BT1O3EArlg==", 1535 | "dev": true, 1536 | "dependencies": { 1537 | "bytes": "3.0.0", 1538 | "content-disposition": "0.5.2", 1539 | "fast-url-parser": "1.1.3", 1540 | "mime-types": "2.1.18", 1541 | "minimatch": "3.1.2", 1542 | "path-is-inside": "1.0.2", 1543 | "path-to-regexp": "2.2.1", 1544 | "range-parser": "1.2.0" 1545 | } 1546 | }, 1547 | "node_modules/serve-handler/node_modules/mime-db": { 1548 | "version": "1.33.0", 1549 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", 1550 | "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", 1551 | "dev": true, 1552 | "engines": { 1553 | "node": ">= 0.6" 1554 | } 1555 | }, 1556 | "node_modules/serve-handler/node_modules/mime-types": { 1557 | "version": "2.1.18", 1558 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", 1559 | "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", 1560 | "dev": true, 1561 | "dependencies": { 1562 | "mime-db": "~1.33.0" 1563 | }, 1564 | "engines": { 1565 | "node": ">= 0.6" 1566 | } 1567 | }, 1568 | "node_modules/shebang-command": { 1569 | "version": "2.0.0", 1570 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 1571 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 1572 | "dev": true, 1573 | "dependencies": { 1574 | "shebang-regex": "^3.0.0" 1575 | }, 1576 | "engines": { 1577 | "node": ">=8" 1578 | } 1579 | }, 1580 | "node_modules/shebang-regex": { 1581 | "version": "3.0.0", 1582 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 1583 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", 1584 | "dev": true, 1585 | "engines": { 1586 | "node": ">=8" 1587 | } 1588 | }, 1589 | "node_modules/signal-exit": { 1590 | "version": "3.0.7", 1591 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", 1592 | "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", 1593 | "dev": true 1594 | }, 1595 | "node_modules/string-width": { 1596 | "version": "5.1.2", 1597 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", 1598 | "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", 1599 | "dev": true, 1600 | "dependencies": { 1601 | "eastasianwidth": "^0.2.0", 1602 | "emoji-regex": "^9.2.2", 1603 | "strip-ansi": "^7.0.1" 1604 | }, 1605 | "engines": { 1606 | "node": ">=12" 1607 | }, 1608 | "funding": { 1609 | "url": "https://github.com/sponsors/sindresorhus" 1610 | } 1611 | }, 1612 | "node_modules/strip-ansi": { 1613 | "version": "7.0.1", 1614 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", 1615 | "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", 1616 | "dev": true, 1617 | "dependencies": { 1618 | "ansi-regex": "^6.0.1" 1619 | }, 1620 | "engines": { 1621 | "node": ">=12" 1622 | }, 1623 | "funding": { 1624 | "url": "https://github.com/chalk/strip-ansi?sponsor=1" 1625 | } 1626 | }, 1627 | "node_modules/strip-final-newline": { 1628 | "version": "2.0.0", 1629 | "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", 1630 | "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", 1631 | "dev": true, 1632 | "engines": { 1633 | "node": ">=6" 1634 | } 1635 | }, 1636 | "node_modules/strip-json-comments": { 1637 | "version": "2.0.1", 1638 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", 1639 | "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", 1640 | "dev": true, 1641 | "engines": { 1642 | "node": ">=0.10.0" 1643 | } 1644 | }, 1645 | "node_modules/strip-outer": { 1646 | "version": "1.0.1", 1647 | "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz", 1648 | "integrity": "sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==", 1649 | "dev": true, 1650 | "dependencies": { 1651 | "escape-string-regexp": "^1.0.2" 1652 | }, 1653 | "engines": { 1654 | "node": ">=0.10.0" 1655 | } 1656 | }, 1657 | "node_modules/supports-color": { 1658 | "version": "7.2.0", 1659 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 1660 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 1661 | "dev": true, 1662 | "dependencies": { 1663 | "has-flag": "^4.0.0" 1664 | }, 1665 | "engines": { 1666 | "node": ">=8" 1667 | } 1668 | }, 1669 | "node_modules/trim-repeated": { 1670 | "version": "1.0.0", 1671 | "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz", 1672 | "integrity": "sha512-pkonvlKk8/ZuR0D5tLW8ljt5I8kmxp2XKymhepUeOdCEfKpZaktSArkLHZt76OB1ZvO9bssUsDty4SWhLvZpLg==", 1673 | "dev": true, 1674 | "dependencies": { 1675 | "escape-string-regexp": "^1.0.2" 1676 | }, 1677 | "engines": { 1678 | "node": ">=0.10.0" 1679 | } 1680 | }, 1681 | "node_modules/type-fest": { 1682 | "version": "2.19.0", 1683 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", 1684 | "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", 1685 | "dev": true, 1686 | "engines": { 1687 | "node": ">=12.20" 1688 | }, 1689 | "funding": { 1690 | "url": "https://github.com/sponsors/sindresorhus" 1691 | } 1692 | }, 1693 | "node_modules/typescript": { 1694 | "version": "4.9.5", 1695 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", 1696 | "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", 1697 | "dev": true, 1698 | "bin": { 1699 | "tsc": "bin/tsc", 1700 | "tsserver": "bin/tsserver" 1701 | }, 1702 | "engines": { 1703 | "node": ">=4.2.0" 1704 | } 1705 | }, 1706 | "node_modules/universalify": { 1707 | "version": "0.1.2", 1708 | "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", 1709 | "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", 1710 | "dev": true, 1711 | "engines": { 1712 | "node": ">= 4.0.0" 1713 | } 1714 | }, 1715 | "node_modules/update-check": { 1716 | "version": "1.5.4", 1717 | "resolved": "https://registry.npmjs.org/update-check/-/update-check-1.5.4.tgz", 1718 | "integrity": "sha512-5YHsflzHP4t1G+8WGPlvKbJEbAJGCgw+Em+dGR1KmBUbr1J36SJBqlHLjR7oob7sco5hWHGQVcr9B2poIVDDTQ==", 1719 | "dev": true, 1720 | "dependencies": { 1721 | "registry-auth-token": "3.3.2", 1722 | "registry-url": "3.1.0" 1723 | } 1724 | }, 1725 | "node_modules/uri-js": { 1726 | "version": "4.4.1", 1727 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", 1728 | "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", 1729 | "dev": true, 1730 | "dependencies": { 1731 | "punycode": "^2.1.0" 1732 | } 1733 | }, 1734 | "node_modules/uri-js/node_modules/punycode": { 1735 | "version": "2.3.0", 1736 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", 1737 | "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", 1738 | "dev": true, 1739 | "engines": { 1740 | "node": ">=6" 1741 | } 1742 | }, 1743 | "node_modules/vary": { 1744 | "version": "1.1.2", 1745 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 1746 | "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", 1747 | "dev": true, 1748 | "engines": { 1749 | "node": ">= 0.8" 1750 | } 1751 | }, 1752 | "node_modules/which": { 1753 | "version": "2.0.2", 1754 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 1755 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 1756 | "dev": true, 1757 | "dependencies": { 1758 | "isexe": "^2.0.0" 1759 | }, 1760 | "bin": { 1761 | "node-which": "bin/node-which" 1762 | }, 1763 | "engines": { 1764 | "node": ">= 8" 1765 | } 1766 | }, 1767 | "node_modules/widest-line": { 1768 | "version": "4.0.1", 1769 | "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz", 1770 | "integrity": "sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==", 1771 | "dev": true, 1772 | "dependencies": { 1773 | "string-width": "^5.0.1" 1774 | }, 1775 | "engines": { 1776 | "node": ">=12" 1777 | }, 1778 | "funding": { 1779 | "url": "https://github.com/sponsors/sindresorhus" 1780 | } 1781 | }, 1782 | "node_modules/wrap-ansi": { 1783 | "version": "8.1.0", 1784 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", 1785 | "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", 1786 | "dev": true, 1787 | "dependencies": { 1788 | "ansi-styles": "^6.1.0", 1789 | "string-width": "^5.0.1", 1790 | "strip-ansi": "^7.0.1" 1791 | }, 1792 | "engines": { 1793 | "node": ">=12" 1794 | }, 1795 | "funding": { 1796 | "url": "https://github.com/chalk/wrap-ansi?sponsor=1" 1797 | } 1798 | }, 1799 | "node_modules/wrappy": { 1800 | "version": "1.0.2", 1801 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1802 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", 1803 | "dev": true 1804 | } 1805 | } 1806 | } 1807 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@codewithkyle/notifyjs", 3 | "version": "5.0.0", 4 | "description": "A simple JavaScript library for creating toast, snackbars, and notifications", 5 | "type": "module", 6 | "files": [ 7 | "dist/*" 8 | ], 9 | "types": "dist/types.d.ts", 10 | "exports": { 11 | "./snackbar.js": "./dist/snackbar.js", 12 | "./notifications.js": "./dist/notifications.js", 13 | "./toaster.js": "./dist/toaster.js", 14 | "./sonner.js": "./dist/sonner.js" 15 | }, 16 | "scripts": { 17 | "cleanup": "node ./build/cleanup.js", 18 | "build": "tsc && esbuild ./src/snackbar.ts ./src/notifications.ts ./src/toaster.ts ./src/sonner.ts --format=esm --minify --bundle --outdir=dist", 19 | "prerelease": "npm run cleanup && npm run build && cp ./src/types.d.ts ./dist/types.d.ts", 20 | "test": "npm run build && cp -r ./dist ./test/ && serve ./test", 21 | "deploy": "npm run build && cp -r ./dist ./test/ && node ./build/deploy.js" 22 | }, 23 | "keywords": [ 24 | "snackbar", 25 | "notification", 26 | "toaster", 27 | "toast", 28 | "sonner", 29 | "web-components", 30 | "lightweight" 31 | ], 32 | "author": "Kyle Andrews", 33 | "license": "MIT", 34 | "devDependencies": { 35 | "esbuild": "^0.17.14", 36 | "gh-pages": "^5.0.0", 37 | "serve": "^14.2.0", 38 | "typescript": "^4.2.3" 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /src/notifications.ts: -------------------------------------------------------------------------------- 1 | import type { NotificationButton, Notification } from "./types"; 2 | 3 | class Notifications { 4 | private notifications: Array; 5 | private time: number; 6 | 7 | constructor() { 8 | this.notifications = []; 9 | this.time = performance.now(); 10 | this.loop(); 11 | window.addEventListener("notify:alert", (e:CustomEvent) => { 12 | if (e?.detail) this.push(e.detail); 13 | }); 14 | } 15 | 16 | private loop() { 17 | const newTime = performance.now(); 18 | const deltaTime = (newTime - this.time) / 1000; 19 | this.time = newTime; 20 | if (document.hasFocus()) { 21 | for (let i = this.notifications.length - 1; i >= 0; i--) { 22 | if (this.notifications[i]?.duration && this.notifications[i]?.duration !== Infinity) { 23 | this.notifications[i].duration -= deltaTime; 24 | if (this.notifications[i].timer) { 25 | const scale = this.notifications[i].duration / this.notifications[i].timerDuration; 26 | if (this.notifications[i].timer === "vertical") { 27 | this.notifications[i].timerEl.style.transform = `scaleY(${scale})`; 28 | } else { 29 | this.notifications[i].timerEl.style.transform = `scaleX(${scale})`; 30 | } 31 | } 32 | if (this.notifications[i].duration <= 0) { 33 | this.notifications[i].el.remove(); 34 | this.notifications.splice(i, 1); 35 | } 36 | } 37 | } 38 | } 39 | window.requestAnimationFrame(this.loop.bind(this)); 40 | } 41 | 42 | public push(settings: Partial) { 43 | const notification: Notification = Object.assign( 44 | { 45 | title: "Title Required", 46 | message: "Notificaitons require a message.", 47 | closeable: true, 48 | icon: null, 49 | duration: 30, 50 | classes: [], 51 | el: null, 52 | timerEl: null, 53 | autofocus: true, 54 | buttons: [], 55 | timer: null, 56 | timerDuration: 30, 57 | }, 58 | settings 59 | ); 60 | 61 | if (!Array.isArray(notification.buttons)) { 62 | notification.buttons = [notification.buttons]; 63 | } 64 | 65 | if (!Array.isArray(notification.classes)) { 66 | notification.classes = [notification.classes]; 67 | } 68 | 69 | if ((notification.duration !== Infinity && notification.timer === "vertical") || notification.timer === "horizontal") { 70 | notification.timerDuration = notification.duration; 71 | } 72 | 73 | notification.el = new NotificationComponent(notification); 74 | if (notification.timer) { 75 | notification.timerEl = notification.el.querySelector("notification-timer"); 76 | } 77 | this.notifications.push(notification); 78 | const shell = this.getShell(); 79 | shell.appendChild(notification.el); 80 | } 81 | 82 | private getShell(): HTMLElement { 83 | const shell: HTMLElement = document.body.querySelector("notifications-component") || document.createElement("notifications-component"); 84 | if (!shell.isConnected) { 85 | document.body.appendChild(shell); 86 | } 87 | return shell; 88 | } 89 | 90 | public append(el: HTMLElement) { 91 | const shell = this.getShell(); 92 | shell.appendChild(el); 93 | } 94 | } 95 | 96 | class NotificationComponent extends HTMLElement { 97 | private settings: Notification; 98 | constructor(notification: Notification) { 99 | super(); 100 | this.settings = notification; 101 | this.render(); 102 | } 103 | 104 | private handleCloseClickEvent: EventListener = () => { 105 | this.remove(); 106 | }; 107 | 108 | private handleActionButtonClick: EventListener = (e: Event) => { 109 | const target = e.currentTarget as HTMLElement; 110 | const index = parseInt(target.dataset.index); 111 | this.settings.buttons?.[index]?.callback(); 112 | if (this.settings.buttons?.[index]?.event !== null) { 113 | window.dispatchEvent(new CustomEvent(this.settings.buttons[index].event, { 114 | detail: this.settings.buttons[index]?.eventData ?? null, 115 | })); 116 | } 117 | this.remove(); 118 | }; 119 | 120 | private render() { 121 | for (let i = 0; i < this.settings.classes.length; i++) { 122 | this.classList.add(this.settings.classes[i]); 123 | } 124 | this.innerHTML = ` 125 | ${this.settings.icon ? ` 126 | ${this.settings.icon} 127 | ` : ""} 128 | 129 |

${this.settings.title}

130 |

${this.settings.message}

131 | ${this.settings.buttons.length ? ` 132 | 133 | ${this.settings.buttons.map((button:NotificationButton, index:number) => { 134 | return ``; 135 | })} 136 | 137 | ` : ""} 138 |
139 | ${this.settings.closeable ? ` 140 | 143 | ` : ""} 144 | ${this.settings.timer ? ` 145 | 146 | ` : ""} 147 | `; 148 | this.querySelectorAll("button[data-index]").forEach(button => { 149 | button.addEventListener("click", this.handleActionButtonClick); 150 | }); 151 | const closeBttn = this.querySelector(".js-notification-close"); 152 | if (closeBttn){ 153 | closeBttn.addEventListener("click", this.handleCloseClickEvent); 154 | } 155 | } 156 | 157 | connectedCallback(){ 158 | if (this.settings.autofocus){ 159 | const closeButton:HTMLButtonElement = this.querySelector(".js-notification-close"); 160 | if (closeButton){ 161 | // @ts-ignore 162 | document.activeElement.blur(); 163 | closeButton.focus(); 164 | } 165 | } 166 | if (this.settings.buttons.length) { 167 | for (let i = 0; i < this.settings.buttons.length; i++) { 168 | if (this.settings.buttons[i]?.autofocus){ 169 | const button:HTMLButtonElement = this.querySelector(`button[data-index="${i}"]`); 170 | if (button){ 171 | button.focus(); 172 | break; 173 | } 174 | } 175 | } 176 | } 177 | } 178 | } 179 | if (!customElements.get("notification-component")) { 180 | customElements.define("notification-component", NotificationComponent); 181 | } 182 | 183 | const notifications = new Notifications(); 184 | export default notifications; 185 | -------------------------------------------------------------------------------- /src/snackbar.ts: -------------------------------------------------------------------------------- 1 | import type { SnackbarNotification, NotificationButton } from "./types"; 2 | 3 | class Snackbar { 4 | private snackbarQueue: Array; 5 | private time: number; 6 | 7 | constructor() { 8 | this.snackbarQueue = []; 9 | this.time = performance.now(); 10 | this.loop(); 11 | window.addEventListener("notify:snackbar", (e:CustomEvent) => { 12 | if (e?.detail) this.snackbar(e.detail); 13 | }); 14 | } 15 | 16 | private loop() { 17 | const newTime = performance.now(); 18 | const deltaTime = (newTime - this.time) / 1000; 19 | this.time = newTime; 20 | if (document.hasFocus()) { 21 | if (this.snackbarQueue.length) { 22 | if (!this.snackbarQueue?.[0]?.el) { 23 | this.snackbarQueue[0].el = new SnackbarComponent(this.snackbarQueue[0]); 24 | document.body.appendChild(this.snackbarQueue[0].el); 25 | } 26 | if (this.snackbarQueue[0]?.duration && this.snackbarQueue[0]?.duration !== Infinity && this.snackbarQueue[0]?.el?.isConnected) { 27 | this.snackbarQueue[0].duration -= deltaTime; 28 | if (this.snackbarQueue[0].duration <= 0) { 29 | this.snackbarQueue[0].el.remove(); 30 | this.snackbarQueue.splice(0, 1); 31 | } 32 | } 33 | } 34 | } 35 | window.requestAnimationFrame(this.loop.bind(this)); 36 | } 37 | 38 | public snackbar(settings: Partial) { 39 | const snackbar: SnackbarNotification = Object.assign( 40 | { 41 | message: "Snackbar notificaitons require a message", 42 | el: null, 43 | duration: 30, 44 | closeable: true, 45 | buttons: [], 46 | force: true, 47 | classes: [], 48 | autofocus: true, 49 | }, 50 | settings 51 | ); 52 | 53 | if (!Array.isArray(snackbar.buttons)) { 54 | snackbar.buttons = [snackbar.buttons]; 55 | } 56 | 57 | if (!Array.isArray(snackbar.classes)) { 58 | snackbar.classes = [snackbar.classes]; 59 | } 60 | 61 | if (snackbar.force && this.snackbarQueue.length) { 62 | if (this.snackbarQueue[0]?.el?.isConnected) { 63 | this.snackbarQueue[0].el.remove(); 64 | } 65 | this.snackbarQueue.splice(0, 1, snackbar); 66 | } else { 67 | this.snackbarQueue.push(snackbar); 68 | } 69 | } 70 | } 71 | 72 | class SnackbarComponent extends HTMLElement { 73 | private settings: SnackbarNotification; 74 | constructor(snackbar: SnackbarNotification) { 75 | super(); 76 | this.settings = snackbar; 77 | this.render(); 78 | } 79 | 80 | private handleActionButtonClick: EventListener = (e: Event) => { 81 | const target = e.currentTarget as HTMLElement; 82 | const index = parseInt(target.dataset.index); 83 | this.settings.buttons?.[index]?.callback(); 84 | if (this.settings.buttons[index]?.event !== null) { 85 | window.dispatchEvent(new CustomEvent(this.settings.buttons[index].event, { 86 | detail: this.settings.buttons[index]?.eventData ?? null, 87 | })); 88 | } 89 | this.remove(); 90 | }; 91 | 92 | private handleCloseClickEvent: EventListener = () => { 93 | this.remove(); 94 | }; 95 | 96 | private render() { 97 | for (let i = 0; i < this.settings.classes.length; i++) { 98 | this.classList.add(this.settings.classes[i]); 99 | } 100 | this.innerHTML = ` 101 |

${this.settings.message}

102 | ${this.settings.closeable || this.settings.buttons.length ? ` 103 | 104 | ${this.settings.buttons.map((button:NotificationButton, index:number) => { 105 | return ``; 106 | })} 107 | ${this.settings.closeable ? ` 108 | 111 | ` : ""} 112 | 113 | ` : ""} 114 | `; 115 | this.querySelectorAll("button[data-index]").forEach(button => { 116 | button.addEventListener("click", this.handleActionButtonClick); 117 | }); 118 | const closeBttn = this.querySelector(".close"); 119 | if (closeBttn){ 120 | closeBttn.addEventListener("click", this.handleCloseClickEvent); 121 | } 122 | } 123 | 124 | connectedCallback(){ 125 | if (this.settings.autofocus){ 126 | const closeButton:HTMLButtonElement = this.querySelector(".js-snackbar-close"); 127 | if (closeButton){ 128 | // @ts-ignore 129 | document.activeElement.blur(); 130 | closeButton.focus(); 131 | } 132 | } 133 | if (this.settings.buttons.length) { 134 | for (let i = 0; i < this.settings.buttons.length; i++) { 135 | if (this.settings.buttons[i]?.autofocus){ 136 | const button:HTMLButtonElement = this.querySelector(`button[data-index="${i}"]`); 137 | if (button){ 138 | // @ts-ignore 139 | document.activeElement.blur(); 140 | button.focus(); 141 | break; 142 | } 143 | } 144 | } 145 | } 146 | } 147 | } 148 | if (!customElements.get("snackbar-component")) { 149 | customElements.define("snackbar-component", SnackbarComponent); 150 | } 151 | 152 | const snackbarManager = new Snackbar(); 153 | const snackbar:(settings: Partial)=>void = snackbarManager.snackbar.bind(snackbarManager); 154 | export default snackbar; 155 | 156 | -------------------------------------------------------------------------------- /src/sonner.ts: -------------------------------------------------------------------------------- 1 | import type { SonnerNotification } from "./types"; 2 | 3 | class Sonner extends HTMLElement { 4 | private previous: number|undefined; 5 | private queue: Array; 6 | private doUpdate: boolean; 7 | private skipNextUpdate: boolean; 8 | private timeoutID: number|undefined; 9 | 10 | constructor() { 11 | super(); 12 | this.previous = undefined; 13 | this.queue = Array(3).fill(null); 14 | this.doUpdate = true; 15 | this.skipNextUpdate = false; 16 | this.timeoutID = undefined; 17 | } 18 | 19 | connectedCallback() { 20 | document.addEventListener("visibilitychange", () => { 21 | this.doUpdate = !document.hidden; 22 | if (!this.doUpdate) this.skipNextUpdate = true; 23 | }); 24 | this.addEventListener("mouseenter", () => { 25 | this.doUpdate = false; 26 | this.skipNextUpdate = true; 27 | this.classList.add("expand"); 28 | this.expand(); 29 | if (this.timeoutID !== undefined) { 30 | clearTimeout(this.timeoutID); 31 | } 32 | }); 33 | this.addEventListener("mouseleave", () => { 34 | this.timeoutID = setTimeout(()=>{ 35 | this.collapse(); 36 | this.doUpdate = true; 37 | this.classList.remove("expand"); 38 | this.timeoutID = undefined; 39 | }, 80); 40 | }); 41 | window.addEventListener("notify:sonner", (e:CustomEvent) => { 42 | if (e?.detail) this.push(e.detail); 43 | }); 44 | window.requestAnimationFrame(this.first.bind(this)); 45 | } 46 | 47 | private collapse() { 48 | for (let i = 0; i < 3; i++) { 49 | if (this.queue[i] === null) continue; 50 | this.queue[i].el.collapse(); 51 | } 52 | this.style.height = "0px"; 53 | } 54 | 55 | private expand() { 56 | let bottomOffset = 0; 57 | for (let i = 0; i < 3; i++) { 58 | if (this.queue[i] === null) continue; 59 | this.queue[i].el.expand(bottomOffset); 60 | // @ts-ignore 61 | bottomOffset += this.queue[i].el.height + 8; 62 | } 63 | this.style.height = `${bottomOffset}px`; 64 | } 65 | 66 | private loop(ts:number) { 67 | const dt = (ts - this.previous) * 0.001; 68 | this.previous = ts; 69 | 70 | if (this.doUpdate) { 71 | if (!this.skipNextUpdate) { 72 | for (let i = 0; i < 3; i++) { 73 | if (this.queue[i] !== null) { 74 | if (this.queue[i].el.isConnected) { 75 | this.queue[i]?.el?.update(dt); 76 | } else { 77 | this.queue[i] = null; 78 | } 79 | } 80 | } 81 | this.reconcile(); 82 | } else { 83 | this.skipNextUpdate = false; 84 | } 85 | } 86 | 87 | window.requestAnimationFrame(this.loop.bind(this)); 88 | } 89 | 90 | private reconcile() { 91 | for (let i = 2; i >= 0; i--) { 92 | if (this.queue[i] === null) continue; 93 | else if (i === 0) break; 94 | 95 | if (this.queue[i-1] === null) { 96 | this.queue[i-1] = this.queue[i]; 97 | this.queue[i] = null; 98 | } 99 | } 100 | for (let i = 0; i < 3; i++) { 101 | if (this.queue[i] !== null) { 102 | this.queue[i].el.updateIndex(i); 103 | } 104 | } 105 | } 106 | 107 | private first(ts:number) { 108 | this.previous = ts; 109 | window.requestAnimationFrame(this.loop.bind(this)); 110 | } 111 | 112 | public push(settings:Partial) { 113 | const toast:SonnerNotification = Object.assign({ 114 | heading: "", 115 | message: "", 116 | el: null, 117 | duration: 5, 118 | classes: [], 119 | button: { 120 | callback: ()=>{}, 121 | label: "", 122 | classes: "", 123 | event: null, 124 | eventData: null, 125 | }, 126 | }, settings); 127 | 128 | if (toast.duration === Infinity || typeof toast.duration !== "number") { 129 | console.warn("Sonner duration must be a number. Defaulting to 5 seconds."); 130 | toast.duration = 5; 131 | } 132 | if (!Array.isArray(toast.classes)) { 133 | toast.classes = [toast.classes]; 134 | } 135 | if (typeof toast.button?.callback !== "function") { 136 | toast.button.callback = ()=>{}; 137 | } 138 | if (!toast.button?.classes) { 139 | toast.button.classes = []; 140 | } 141 | if (!Array.isArray(toast.button.classes)) { 142 | toast.button.classes = [toast.button.classes]; 143 | } 144 | toast.el = new SonnerToast(toast); 145 | this.insert(toast); 146 | } 147 | 148 | private insert(toast:SonnerNotification) { 149 | if (this.queue[2] !== null) { 150 | this.queue[2]?.el?.delete(); 151 | } 152 | if (this.queue[1] !== null) { 153 | this.queue[2] = this.queue[1]; 154 | } 155 | if (this.queue[0] !== null) { 156 | this.queue[1] = this.queue[0]; 157 | } 158 | this.queue[0] = toast; 159 | this.appendChild(this.queue[0].el); 160 | } 161 | } 162 | if (!customElements.get("sonner-component")) { 163 | customElements.define("sonner-component", Sonner); 164 | } 165 | const sonner = new Sonner(); 166 | document.body.appendChild(sonner); 167 | export default sonner; 168 | 169 | class SonnerToast extends HTMLElement { 170 | private settings: SonnerNotification; 171 | private life: number; 172 | private height: number; 173 | private y: number; 174 | private offset: number; 175 | private index: number; 176 | private dead: boolean; 177 | private scale: number; 178 | private isExpanded: boolean; 179 | private expandedOffset: number; 180 | 181 | constructor(toast:SonnerNotification){ 182 | super(); 183 | this.settings = toast; 184 | this.life = toast.duration; 185 | this.height = 66; 186 | this.y = 0; 187 | this.offset = 0; 188 | this.index = 0; 189 | this.dead = false; 190 | this.scale = 1; 191 | this.isExpanded = false; 192 | this.expandedOffset = 0; 193 | 194 | this.style.setProperty("--y", "0"); 195 | this.style.setProperty("--opacity", "1"); 196 | this.style.setProperty("--offset", "0px"); 197 | this.style.setProperty("--scale", "1"); 198 | } 199 | 200 | connectedCallback() { 201 | this.innerHTML = ` 202 | 203 | ${this.renderHeading()} 204 | ${this.renderMessage()} 205 | 206 | ${this.renderButton()} 207 | `; 208 | const buttonEl = this.querySelector("button"); 209 | if (buttonEl) { 210 | buttonEl.addEventListener("click", ()=>{ 211 | this.settings.button.callback(); 212 | if (this.settings.button?.event !== null) { 213 | window.dispatchEvent(new CustomEvent(this.settings.button.event, { 214 | detail: this.settings.button?.eventData ?? null, 215 | })); 216 | } 217 | this.delete(); 218 | }); 219 | } 220 | const bounds = this.getBoundingClientRect(); 221 | this.height = bounds.height; 222 | const anim = this.animate([ 223 | { opacity: 0, transform: `translateY(100%)` }, 224 | { opacity: 1, transform: `translateY(0px)` } 225 | ], { 226 | duration: 300, 227 | fill: 'forwards', 228 | easing: "cubic-bezier(0.0, 0.0, 0.2, 1)", 229 | }); 230 | anim.finished.then(() => { 231 | this.style.setProperty("--y", `${this.y}px`); 232 | this.style.setProperty("--opacity", "1"); 233 | anim.cancel(); 234 | }); 235 | } 236 | 237 | private renderHeading() { 238 | if (this.settings.heading?.length) { 239 | return `

${this.settings.heading}

` 240 | } 241 | return "" 242 | } 243 | 244 | private renderMessage() { 245 | if (this.settings.message?.length) { 246 | return `

${this.settings.message}

` 247 | } 248 | return "" 249 | } 250 | 251 | private renderButton() { 252 | if (this.settings.button?.label) { 253 | // @ts-ignore 254 | return ``; 255 | } 256 | return ""; 257 | } 258 | 259 | public expand(bottomOffset:number) { 260 | this.isExpanded = true; 261 | this.expandedOffset = bottomOffset; 262 | this.style.setProperty("--offset", `${0}px`); 263 | this.style.setProperty("--scale", "1"); 264 | this.style.setProperty("--y", `-${bottomOffset}px`); 265 | } 266 | 267 | public collapse() { 268 | this.style.setProperty("--offset", `-${this.offset}px`); 269 | this.style.setProperty("--scale", `${this.scale}`); 270 | this.style.setProperty("--y", `${this.y}px`); 271 | } 272 | 273 | public updateIndex(index:number) { 274 | this.index = index; 275 | switch(index) { 276 | case 0: 277 | this.style.zIndex = "3"; 278 | break; 279 | case 1: 280 | this.style.zIndex = "2"; 281 | break; 282 | case 2: 283 | this.style.zIndex = "1"; 284 | break; 285 | } 286 | this.offset = 16 * this.index; 287 | this.scale = 1 - (0.05 * index); 288 | this.style.setProperty("--offset", `-${this.offset}px`); 289 | this.style.setProperty("--scale", `${this.scale}`); 290 | } 291 | 292 | public update(dt:number) { 293 | this.life -= dt; 294 | if (this.life <= 0 && this.isConnected && !this.dead) { 295 | this.dead = true; 296 | this.delete(); 297 | } 298 | } 299 | 300 | public delete() { 301 | this.dead = true; 302 | let anim; 303 | if (this.isExpanded) { 304 | this.style.transformOrigin = "center"; 305 | anim = this.animate([ 306 | { opacity: 1, }, 307 | { opacity: 0, } 308 | ], { 309 | duration: 150, 310 | fill: 'forwards', 311 | easing: "cubic-bezier(0.4, 0.0, 1, 1)", 312 | }); 313 | } else { 314 | this.style.setProperty("--offset", `-${this.offset}px`); 315 | anim = this.animate([ 316 | { opacity: 1, transform: `scale(${this.scale}) translateY(${this.y}px) translateY(-${this.offset}px)` }, 317 | { opacity: 0, transform: `scale(${this.scale - 0.05}) translateY(${this.y}px) translateY(-${this.offset}px)` } 318 | ], { 319 | duration: 200, 320 | fill: 'forwards', 321 | easing: "cubic-bezier(0.4, 0.0, 1, 1)", 322 | }); 323 | } 324 | anim.finished.then(() => { 325 | this.remove(); 326 | }); 327 | } 328 | } 329 | if (!customElements.get("sonner-toast-component")) { 330 | customElements.define("sonner-toast-component", SonnerToast); 331 | } 332 | -------------------------------------------------------------------------------- /src/toaster.ts: -------------------------------------------------------------------------------- 1 | import type { ToastNotification } from "./types"; 2 | 3 | class Toaster { 4 | private toastQueue: Array; 5 | private time: number; 6 | 7 | constructor() { 8 | this.toastQueue = []; 9 | this.time = performance.now(); 10 | this.loop(); 11 | window.addEventListener("notify:toast", (e:CustomEvent) => { 12 | if (e?.detail) this.push(e.detail); 13 | }); 14 | } 15 | 16 | private loop() { 17 | const newTime = performance.now(); 18 | const deltaTime = (newTime - this.time) / 1000; 19 | this.time = newTime; 20 | for (let i = this.toastQueue.length - 1; i >= 0; i--) { 21 | this.toastQueue[i].duration -= deltaTime; 22 | if (this.toastQueue[i].duration <= 0) { 23 | if (this.toastQueue[i].el.isConnected) { 24 | this.toastQueue[i].el.remove(); 25 | } 26 | this.toastQueue.splice(i, 1); 27 | } 28 | } 29 | window.requestAnimationFrame(this.loop.bind(this)); 30 | } 31 | 32 | public push(settings: Partial) { 33 | const toast: ToastNotification = Object.assign( 34 | { 35 | message: "Toast notificaitons require a message", 36 | el: null, 37 | duration: 5, 38 | classes: [], 39 | }, 40 | settings 41 | ); 42 | 43 | if (toast.duration === Infinity || typeof toast.duration !== "number") { 44 | console.warn("Toast duration must be a number"); 45 | toast.duration = 5; 46 | } 47 | if (!Array.isArray(toast.classes)) { 48 | toast.classes = [toast.classes]; 49 | } 50 | 51 | const el = document.createElement("output"); 52 | el.role = "status"; 53 | el.innerHTML = toast.message; 54 | if (toast.classes.length) { 55 | el.classList.add(...toast.classes); 56 | } 57 | toast.el = el; 58 | toast.el.addEventListener("click", () => { 59 | toast.el.remove(); 60 | this.toastQueue.splice(this.toastQueue.indexOf(toast), 1); 61 | }); 62 | this.toastQueue.push(toast); 63 | this.flip(el); 64 | } 65 | 66 | private flip(el: HTMLElement) { 67 | const shell = this.getShell(); 68 | const first = shell.offsetHeight 69 | shell.appendChild(el); 70 | const last = shell.offsetHeight 71 | const invert = last - first 72 | const animation = shell.animate([ 73 | { transform: `translateY(${invert}px)` }, 74 | { transform: 'translateY(0)' } 75 | ], { 76 | duration: 150, 77 | easing: 'ease-out', 78 | }); 79 | animation.startTime = document.timeline.currentTime; 80 | } 81 | 82 | private getShell(): HTMLElement { 83 | const shell: HTMLElement = document.body.querySelector("toaster-component") || document.createElement("toaster-component"); 84 | if (!shell.isConnected) { 85 | document.body.appendChild(shell); 86 | } 87 | return shell; 88 | } 89 | } 90 | const toaster = new Toaster(); 91 | export default toaster; 92 | -------------------------------------------------------------------------------- /src/types.d.ts: -------------------------------------------------------------------------------- 1 | export type NotificationButton = { 2 | label: string; 3 | callback?: Function; 4 | ariaLabel?: string; 5 | classes?: string[]; 6 | autofocus?: boolean; 7 | event: string; 8 | eventData: any; 9 | }; 10 | 11 | export type SnackbarNotification = { 12 | message: string; 13 | duration?: number; 14 | closeable?: boolean; 15 | buttons?: Array; 16 | force?: boolean; 17 | classes?: string[]; 18 | el: HTMLElement; 19 | autofocus?: boolean; 20 | }; 21 | 22 | export type Notification = { 23 | title: string; 24 | message: string; 25 | closeable?: boolean; 26 | icon?: string; 27 | duration?: number; 28 | classes?: string[]; 29 | el: HTMLElement; 30 | timerEl?: HTMLElement; 31 | autofocus?: boolean; 32 | buttons?: Array; 33 | timer?: "vertical" | "horizontal"; 34 | timerDuration?: number; 35 | }; 36 | 37 | export type ToastNotification = { 38 | message: string, 39 | el: HTMLElement, 40 | duration: number, 41 | classes: string | string[], 42 | } 43 | 44 | export type SonnerNotification = { 45 | heading: string, 46 | message: string, 47 | el: SonnerToast, 48 | duration: number, 49 | classes: Array|string, 50 | button: { 51 | callback?: Function, 52 | label: string, 53 | classes: Array|string, 54 | event?: string; 55 | eventData?: any; 56 | } 57 | } 58 | 59 | export interface SonnerToast extends HTMLElement { 60 | expand: (offset:number)=>void, 61 | collapse: Function, 62 | delete: ()=>void, 63 | update: (dt:number)=>void, 64 | updateIndex: (idx:number)=>void, 65 | } 66 | -------------------------------------------------------------------------------- /test/CNAME: -------------------------------------------------------------------------------- 1 | notifyjs.codewithkyle.com 2 | -------------------------------------------------------------------------------- /test/brixi.css: -------------------------------------------------------------------------------- 1 | .bg-white{background-color:var(--white)!important}.bg-black{background-color:var(--black)!important}.bg-primary-100{background-color:var(--primary-100)!important}.bg-primary-200{background-color:var(--primary-200)!important}.bg-primary-300{background-color:var(--primary-300)!important}.bg-primary-400{background-color:var(--primary-400)!important}.bg-primary-500{background-color:var(--primary-500)!important}.bg-primary-600{background-color:var(--primary-600)!important}.bg-primary-700{background-color:var(--primary-700)!important}.bg-primary-800{background-color:var(--primary-800)!important}.bg-primary-900{background-color:var(--primary-900)!important}.bg-danger-100{background-color:var(--danger-100)!important}.bg-danger-200{background-color:var(--danger-200)!important}.bg-danger-300{background-color:var(--danger-300)!important}.bg-danger-400{background-color:var(--danger-400)!important}.bg-danger-500{background-color:var(--danger-500)!important}.bg-danger-600{background-color:var(--danger-600)!important}.bg-danger-700{background-color:var(--danger-700)!important}.bg-danger-800{background-color:var(--danger-800)!important}.bg-danger-900{background-color:var(--danger-900)!important}.bg-warning-100{background-color:var(--warning-100)!important}.bg-warning-200{background-color:var(--warning-200)!important}.bg-warning-300{background-color:var(--warning-300)!important}.bg-warning-400{background-color:var(--warning-400)!important}.bg-warning-500{background-color:var(--warning-500)!important}.bg-warning-600{background-color:var(--warning-600)!important}.bg-warning-700{background-color:var(--warning-700)!important}.bg-warning-800{background-color:var(--warning-800)!important}.bg-warning-900{background-color:var(--warning-900)!important}.bg-success-100{background-color:var(--success-100)!important}.bg-success-200{background-color:var(--success-200)!important}.bg-success-300{background-color:var(--success-300)!important}.bg-success-400{background-color:var(--success-400)!important}.bg-success-500{background-color:var(--success-500)!important}.bg-success-600{background-color:var(--success-600)!important}.bg-success-700{background-color:var(--success-700)!important}.bg-success-800{background-color:var(--success-800)!important}.bg-success-900{background-color:var(--success-900)!important}.bg-grey-100{background-color:var(--grey-100)!important}.bg-grey-200{background-color:var(--grey-200)!important}.bg-grey-300{background-color:var(--grey-300)!important}.bg-grey-400{background-color:var(--grey-400)!important}.bg-grey-500{background-color:var(--grey-500)!important}.bg-grey-600{background-color:var(--grey-600)!important}.bg-grey-700{background-color:var(--grey-700)!important}.bg-grey-800{background-color:var(--grey-800)!important}.bg-grey-900{background-color:var(--grey-900)!important}.bg-neutral-100{background-color:var(--neutral-100)!important}.bg-neutral-200{background-color:var(--neutral-200)!important}.bg-neutral-300{background-color:var(--neutral-300)!important}.bg-neutral-400{background-color:var(--neutral-400)!important}.bg-neutral-500{background-color:var(--neutral-500)!important}.bg-neutral-600{background-color:var(--neutral-600)!important}.bg-neutral-700{background-color:var(--neutral-700)!important}.bg-neutral-800{background-color:var(--neutral-800)!important}.bg-neutral-900{background-color:var(--neutral-900)!important}.w-mobile{width:411px!important}.max-w-mobile{max-width:411px!important}.w-tablet{width:768px!important}.max-w-tablet{max-width:768px!important}.w-laptop{width:1024px!important}.max-w-laptop{max-width:1024px!important}.w-desktop{width:1280px!important}.max-w-desktop{max-width:1280px!important}.w-hd{width:1920px!important}.max-w-hd{max-width:1920px!important}.w-4k{width:3840px!important}.max-w-4k{max-width:3840px!important}.w-1\/2{width:50%!important}.w-1\/3{width:33.33333333333333%!important}.w-2\/3{width:66.66666666666666%!important}.w-1\/4{width:25%!important}.w-2\/4{width:50%!important}.w-3\/4{width:75%!important}.w-auto{width:auto!important}.w-full{width:100%!important}.w-screen{width:100vw!important}.min-w-full{min-width:100%!important}.max-w-full{max-width:100%!important}.max-w-screen{max-width:100vw!important}.h-auto{height:auto!important}.h-full{height:100%!important}.h-screen{height:100vh!important}.min-h-full{min-height:100%!important}.max-h-full{max-height:100%!important}.max-h-screen{max-height:100vh!important}.block{display:block!important}.inline-block{display:inline-block!important}.inline{display:inline!important}.none{display:none!important}.list-item{display:list-item!important}.cursor-default{cursor:default!important}.cursor-pointer{cursor:pointer!important}.cursor-not-allowed{cursor:not-allowed!important}.events-none{pointer-events:none!important}.events-auto{position:auto!important}.select-none{user-select:none!important}.select-auto{user-select:auto!important}.select-all{user-select:all!important}.select-text{user-select:text!important}[flex]{display:flex!important}[flex~=box]{display:flexbox!important}[flex~=justify-center]{justify-content:center!important}[flex~=justify-start]{justify-content:flex-start!important}[flex~=justify-end]{justify-content:flex-end!important}[flex~=justify-between]{justify-content:space-between!important}[flex~=justify-around]{justify-content:space-around!important}[flex~=justify-evenly]{justify-content:space-evenly!important}[flex~=content-center]{align-content:center!important}[flex~=content-start]{align-content:flex-start!important}[flex~=content-end]{align-content:flex-end!important}[flex~=content-between]{align-content:space-between!important}[flex~=content-around]{align-content:space-around!important}[flex~=content-evenly]{align-content:space-evenly!important}[flex~=items-stretch]{align-items:stretch!important}[flex~=items-center]{align-items:center!important}[flex~=items-start]{align-items:flex-start!important}[flex~=items-end]{align-items:flex-end!important}[flex~=row]{flex-direction:row!important}[flex~=row][flex~=reversed]{flex-direction:row-reverse!important}[flex~=column]{flex-direction:column!important}[flex~=column][flex~=reversed]{flex-direction:column-reverse!important}[flex~=wrap]{flex-wrap:wrap!important}[flex~=nowrap]{flex-wrap:nowrap!important}.font-white{color:var(--white)!important}.font-black{color:var(--black)!important}.font-primary-100{color:var(--primary-100)!important}.font-primary-200{color:var(--primary-200)!important}.font-primary-300{color:var(--primary-300)!important}.font-primary-400{color:var(--primary-400)!important}.font-primary-500{color:var(--primary-500)!important}.font-primary-600{color:var(--primary-600)!important}.font-primary-700{color:var(--primary-700)!important}.font-primary-800{color:var(--primary-800)!important}.font-primary-900{color:var(--primary-900)!important}.font-danger-100{color:var(--danger-100)!important}.font-danger-200{color:var(--danger-200)!important}.font-danger-300{color:var(--danger-300)!important}.font-danger-400{color:var(--danger-400)!important}.font-danger-500{color:var(--danger-500)!important}.font-danger-600{color:var(--danger-600)!important}.font-danger-700{color:var(--danger-700)!important}.font-danger-800{color:var(--danger-800)!important}.font-danger-900{color:var(--danger-900)!important}.font-warning-100{color:var(--warning-100)!important}.font-warning-200{color:var(--warning-200)!important}.font-warning-300{color:var(--warning-300)!important}.font-warning-400{color:var(--warning-400)!important}.font-warning-500{color:var(--warning-500)!important}.font-warning-600{color:var(--warning-600)!important}.font-warning-700{color:var(--warning-700)!important}.font-warning-800{color:var(--warning-800)!important}.font-warning-900{color:var(--warning-900)!important}.font-success-100{color:var(--success-100)!important}.font-success-200{color:var(--success-200)!important}.font-success-300{color:var(--success-300)!important}.font-success-400{color:var(--success-400)!important}.font-success-500{color:var(--success-500)!important}.font-success-600{color:var(--success-600)!important}.font-success-700{color:var(--success-700)!important}.font-success-800{color:var(--success-800)!important}.font-success-900{color:var(--success-900)!important}.font-grey-100{color:var(--grey-100)!important}.font-grey-200{color:var(--grey-200)!important}.font-grey-300{color:var(--grey-300)!important}.font-grey-400{color:var(--grey-400)!important}.font-grey-500{color:var(--grey-500)!important}.font-grey-600{color:var(--grey-600)!important}.font-grey-700{color:var(--grey-700)!important}.font-grey-800{color:var(--grey-800)!important}.font-grey-900{color:var(--grey-900)!important}.font-neutral-100{color:var(--neutral-100)!important}.font-neutral-200{color:var(--neutral-200)!important}.font-neutral-300{color:var(--neutral-300)!important}.font-neutral-400{color:var(--neutral-400)!important}.font-neutral-500{color:var(--neutral-500)!important}.font-neutral-600{color:var(--neutral-600)!important}.font-neutral-700{color:var(--neutral-700)!important}.font-neutral-800{color:var(--neutral-800)!important}.font-neutral-900{color:var(--neutral-900)!important}.font-xs{font-size:var(--font-xs)!important}.font-sm{font-size:var(--font-sm)!important}.font-base{font-size:var(--font-base)!important}.font-md{font-size:var(--font-md)!important}.font-lg{font-size:var(--font-lg)!important}.font-xl{font-size:var(--font-xl)!important}.font-2xl{font-size:var(--font-2xl)!important}.font-3xl{font-size:var(--font-3xl)!important}[grid~=gap-1]{gap:1rem!important}[grid~="gap-1.5"]{gap:1.5rem!important}[grid~=gap-2]{gap:2rem!important}[grid]{display:grid!important}[grid~=flow-row]{grid-auto-flow:row!important}[grid~=flow-column]{grid-auto-flow:column!important}[grid~=flow-row][grid~=dense]{grid-auto-flow:row dense!important}[grid~=flow-column][grid~=dense]{grid-auto-flow:column dense!important}[grid~=rows]{grid-template-rows:repeat(1,minmax(0,1fr))!important}[grid~=columns][grid~="1"]{grid-template-columns:repeat(1,minmax(0,1fr))!important}[grid~=columns][grid~="2"]{grid-template-columns:repeat(1,minmax(0,1fr))!important}[grid~=columns][grid~="3"]{grid-template-columns:repeat(1,minmax(0,1fr))!important}[grid~=columns][grid~="4"]{grid-template-columns:repeat(1,minmax(0,1fr))!important}@media (min-width:768px){[grid~=columns][grid~="2"]{grid-template-columns:repeat(2,minmax(0,1fr))!important}[grid~=columns][grid~="3"]{grid-template-columns:repeat(3,minmax(0,1fr))!important}[grid~=columns][grid~="4"]{grid-template-columns:repeat(2,minmax(0,1fr))!important}}@media (min-width:1024px){[grid~=columns][grid~="4"]{grid-template-columns:repeat(4,minmax(0,1fr))!important}}.line-none{line-height:1!important}.line-snug{line-height:1.375!important}.line-normal{line-height:1.618!important}.line-loose{line-height:2!important}.font-base{font-family:var(--font-base)!important}.font-serif{font-family:var(--font-serif)!important}.font-mono{font-family:var(--font-mono)!important}.font-hairline{font-weight:var(--font-hairline)!important}.font-thin{font-weight:var(--font-thin)!important}.font-light{font-weight:var(--font-light)!important}.font-regular{font-weight:var(--font-regular)!important}.font-medium{font-weight:var(--font-medium)!important}.font-semibold{font-weight:var(--font-semibold)!important}.font-bold{font-weight:var(--font-bold)!important}.font-heavy{font-weight:var(--font-heavy)!important}.font-black{font-weight:var(--font-black)!important}.m-auto{margin:auto!important}.mx-auto{margin-left:auto!important;margin-right:auto!important}.my-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-auto{margin-top:auto!important}.mr-auto{margin-right:auto!important}.mb-auto{margin-bottom:auto!important}.ml-auto{margin-left:auto!important}.m-0{margin:0!important}.m-0\.125{margin:.125rem!important}.m-0\.25{margin:.25rem!important}.m-0\.5{margin:.5rem!important}.m-0\.75{margin:.75rem!important}.m-1{margin:1rem!important}.m-1\.25{margin:1.25rem!important}.m-1\.5{margin:1.5rem!important}.m-1\.75{margin:1.75rem!important}.m-2{margin:2rem!important}.m-2\.25{margin:2.25rem!important}.m-2\.5{margin:2.5rem!important}.m-2\.75{margin:2.75rem!important}.m-3{margin:3rem!important}.m-4{margin:4rem!important}.m-5{margin:5rem!important}.m-6{margin:6rem!important}.mt-0{margin-top:0!important}.mt-0\.125{margin-top:.125rem!important}.mt-0\.25{margin-top:.25rem!important}.mt-0\.5{margin-top:.5rem!important}.mt-0\.75{margin-top:.75rem!important}.mt-1{margin-top:1rem!important}.mt-1\.25{margin-top:1.25rem!important}.mt-1\.5{margin-top:1.5rem!important}.mt-1\.75{margin-top:1.75rem!important}.mt-2{margin-top:2rem!important}.mt-2\.25{margin-top:2.25rem!important}.mt-2\.5{margin-top:2.5rem!important}.mt-2\.75{margin-top:2.75rem!important}.mt-3{margin-top:3rem!important}.mt-4{margin-top:4rem!important}.mt-5{margin-top:5rem!important}.mt-6{margin-top:6rem!important}.mr-0{margin-right:0!important}.mr-0\.125{margin-right:.125rem!important}.mr-0\.25{margin-right:.25rem!important}.mr-0\.5{margin-right:.5rem!important}.mr-0\.75{margin-right:.75rem!important}.mr-1{margin-right:1rem!important}.mr-1\.25{margin-right:1.25rem!important}.mr-1\.5{margin-right:1.5rem!important}.mr-1\.75{margin-right:1.75rem!important}.mr-2{margin-right:2rem!important}.mr-2\.25{margin-right:2.25rem!important}.mr-2\.5{margin-right:2.5rem!important}.mr-2\.75{margin-right:2.75rem!important}.mr-3{margin-right:3rem!important}.mr-4{margin-right:4rem!important}.mr-5{margin-right:5rem!important}.mr-6{margin-right:6rem!important}.mb-0{margin-bottom:0!important}.mb-0\.125{margin-bottom:.125rem!important}.mb-0\.25{margin-bottom:.25rem!important}.mb-0\.5{margin-bottom:.5rem!important}.mb-0\.75{margin-bottom:.75rem!important}.mb-1{margin-bottom:1rem!important}.mb-1\.25{margin-bottom:1.25rem!important}.mb-1\.5{margin-bottom:1.5rem!important}.mb-1\.75{margin-bottom:1.75rem!important}.mb-2{margin-bottom:2rem!important}.mb-2\.25{margin-bottom:2.25rem!important}.mb-2\.5{margin-bottom:2.5rem!important}.mb-2\.75{margin-bottom:2.75rem!important}.mb-3{margin-bottom:3rem!important}.mb-4{margin-bottom:4rem!important}.mb-5{margin-bottom:5rem!important}.mb-6{margin-bottom:6rem!important}.ml-0{margin-left:0!important}.ml-0\.125{margin-left:.125rem!important}.ml-0\.25{margin-left:.25rem!important}.ml-0\.5{margin-left:.5rem!important}.ml-0\.75{margin-left:.75rem!important}.ml-1{margin-left:1rem!important}.ml-1\.25{margin-left:1.25rem!important}.ml-1\.5{margin-left:1.5rem!important}.ml-1\.75{margin-left:1.75rem!important}.ml-2{margin-left:2rem!important}.ml-2\.25{margin-left:2.25rem!important}.ml-2\.5{margin-left:2.5rem!important}.ml-2\.75{margin-left:2.75rem!important}.ml-3{margin-left:3rem!important}.ml-4{margin-left:4rem!important}.ml-5{margin-left:5rem!important}.ml-6{margin-left:6rem!important}.mx-0{margin-left:0!important;margin-right:0!important}.mx-0\.125{margin-left:.125rem!important;margin-right:.125rem!important}.mx-0\.25{margin-left:.25rem!important;margin-right:.25rem!important}.mx-0\.5{margin-left:.5rem!important;margin-right:.5rem!important}.mx-0\.75{margin-left:.75rem!important;margin-right:.75rem!important}.mx-1{margin-left:1rem!important;margin-right:1rem!important}.mx-1\.25{margin-left:1.25rem!important;margin-right:1.25rem!important}.mx-1\.5{margin-left:1.5rem!important;margin-right:1.5rem!important}.mx-1\.75{margin-left:1.75rem!important;margin-right:1.75rem!important}.mx-2{margin-left:2rem!important;margin-right:2rem!important}.mx-2\.25{margin-left:2.25rem!important;margin-right:2.25rem!important}.mx-2\.5{margin-left:2.5rem!important;margin-right:2.5rem!important}.mx-2\.75{margin-left:2.75rem!important;margin-right:2.75rem!important}.mx-3{margin-left:3rem!important;margin-right:3rem!important}.mx-4{margin-left:4rem!important;margin-right:4rem!important}.mx-5{margin-left:5rem!important;margin-right:5rem!important}.mx-6{margin-left:6rem!important;margin-right:6rem!important}.my-0{margin-top:0!important;margin-bottom:0!important}.my-0\.125{margin-top:.125rem!important;margin-bottom:.125rem!important}.my-0\.25{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-0\.5{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-0\.75{margin-top:.75rem!important;margin-bottom:.75rem!important}.my-1{margin-top:1rem!important;margin-bottom:1rem!important}.my-1\.25{margin-top:1.25rem!important;margin-bottom:1.25rem!important}.my-1\.5{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-1\.75{margin-top:1.75rem!important;margin-bottom:1.75rem!important}.my-2{margin-top:2rem!important;margin-bottom:2rem!important}.my-2\.25{margin-top:2.25rem!important;margin-bottom:2.25rem!important}.my-2\.5{margin-top:2.5rem!important;margin-bottom:2.5rem!important}.my-2\.75{margin-top:2.75rem!important;margin-bottom:2.75rem!important}.my-3{margin-top:3rem!important;margin-bottom:3rem!important}.my-4{margin-top:4rem!important;margin-bottom:4rem!important}.my-5{margin-top:5rem!important;margin-bottom:5rem!important}.my-6{margin-top:6rem!important;margin-bottom:6rem!important}.p-0{padding:0!important}.p-0\.125{padding:.125rem!important}.p-0\.25{padding:.25rem!important}.p-0\.5{padding:.5rem!important}.p-0\.75{padding:.75rem!important}.p-1{padding:1rem!important}.p-1\.25{padding:1.25rem!important}.p-1\.5{padding:1.5rem!important}.p-1\.75{padding:1.75rem!important}.p-2{padding:2rem!important}.p-2\.25{padding:2.25rem!important}.p-2\.5{padding:2.5rem!important}.p-2\.75{padding:2.75rem!important}.p-3{padding:3rem!important}.p-4{padding:4rem!important}.p-5{padding:5rem!important}.p-6{padding:6rem!important}.pt-0{padding-top:0!important}.pt-0\.125{padding-top:.125rem!important}.pt-0\.25{padding-top:.25rem!important}.pt-0\.5{padding-top:.5rem!important}.pt-0\.75{padding-top:.75rem!important}.pt-1{padding-top:1rem!important}.pt-1\.25{padding-top:1.25rem!important}.pt-1\.5{padding-top:1.5rem!important}.pt-1\.75{padding-top:1.75rem!important}.pt-2{padding-top:2rem!important}.pt-2\.25{padding-top:2.25rem!important}.pt-2\.5{padding-top:2.5rem!important}.pt-2\.75{padding-top:2.75rem!important}.pt-3{padding-top:3rem!important}.pt-4{padding-top:4rem!important}.pt-5{padding-top:5rem!important}.pt-6{padding-top:6rem!important}.pr-0{padding-right:0!important}.pr-0\.125{padding-right:.125rem!important}.pr-0\.25{padding-right:.25rem!important}.pr-0\.5{padding-right:.5rem!important}.pr-0\.75{padding-right:.75rem!important}.pr-1{padding-right:1rem!important}.pr-1\.25{padding-right:1.25rem!important}.pr-1\.5{padding-right:1.5rem!important}.pr-1\.75{padding-right:1.75rem!important}.pr-2{padding-right:2rem!important}.pr-2\.25{padding-right:2.25rem!important}.pr-2\.5{padding-right:2.5rem!important}.pr-2\.75{padding-right:2.75rem!important}.pr-3{padding-right:3rem!important}.pr-4{padding-right:4rem!important}.pr-5{padding-right:5rem!important}.pr-6{padding-right:6rem!important}.pb-0{padding-bottom:0!important}.pb-0\.125{padding-bottom:.125rem!important}.pb-0\.25{padding-bottom:.25rem!important}.pb-0\.5{padding-bottom:.5rem!important}.pb-0\.75{padding-bottom:.75rem!important}.pb-1{padding-bottom:1rem!important}.pb-1\.25{padding-bottom:1.25rem!important}.pb-1\.5{padding-bottom:1.5rem!important}.pb-1\.75{padding-bottom:1.75rem!important}.pb-2{padding-bottom:2rem!important}.pb-2\.25{padding-bottom:2.25rem!important}.pb-2\.5{padding-bottom:2.5rem!important}.pb-2\.75{padding-bottom:2.75rem!important}.pb-3{padding-bottom:3rem!important}.pb-4{padding-bottom:4rem!important}.pb-5{padding-bottom:5rem!important}.pb-6{padding-bottom:6rem!important}.pl-0{padding-left:0!important}.pl-0\.125{padding-left:.125rem!important}.pl-0\.25{padding-left:.25rem!important}.pl-0\.5{padding-left:.5rem!important}.pl-0\.75{padding-left:.75rem!important}.pl-1{padding-left:1rem!important}.pl-1\.25{padding-left:1.25rem!important}.pl-1\.5{padding-left:1.5rem!important}.pl-1\.75{padding-left:1.75rem!important}.pl-2{padding-left:2rem!important}.pl-2\.25{padding-left:2.25rem!important}.pl-2\.5{padding-left:2.5rem!important}.pl-2\.75{padding-left:2.75rem!important}.pl-3{padding-left:3rem!important}.pl-4{padding-left:4rem!important}.pl-5{padding-left:5rem!important}.pl-6{padding-left:6rem!important}.px-0{padding-left:0!important;padding-right:0!important}.px-0\.125{padding-left:.125rem!important;padding-right:.125rem!important}.px-0\.25{padding-left:.25rem!important;padding-right:.25rem!important}.px-0\.5{padding-left:.5rem!important;padding-right:.5rem!important}.px-0\.75{padding-left:.75rem!important;padding-right:.75rem!important}.px-1{padding-left:1rem!important;padding-right:1rem!important}.px-1\.25{padding-left:1.25rem!important;padding-right:1.25rem!important}.px-1\.5{padding-left:1.5rem!important;padding-right:1.5rem!important}.px-1\.75{padding-left:1.75rem!important;padding-right:1.75rem!important}.px-2{padding-left:2rem!important;padding-right:2rem!important}.px-2\.25{padding-left:2.25rem!important;padding-right:2.25rem!important}.px-2\.5{padding-left:2.5rem!important;padding-right:2.5rem!important}.px-2\.75{padding-left:2.75rem!important;padding-right:2.75rem!important}.px-3{padding-left:3rem!important;padding-right:3rem!important}.px-4{padding-left:4rem!important;padding-right:4rem!important}.px-5{padding-left:5rem!important;padding-right:5rem!important}.px-6{padding-left:6rem!important;padding-right:6rem!important}.py-0{padding-top:0!important;padding-bottom:0!important}.py-0\.125{padding-top:.125rem!important;padding-bottom:.125rem!important}.py-0\.25{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-0\.5{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-0\.75{padding-top:.75rem!important;padding-bottom:.75rem!important}.py-1{padding-top:1rem!important;padding-bottom:1rem!important}.py-1\.25{padding-top:1.25rem!important;padding-bottom:1.25rem!important}.py-1\.5{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-1\.75{padding-top:1.75rem!important;padding-bottom:1.75rem!important}.py-2{padding-top:2rem!important;padding-bottom:2rem!important}.py-2\.25{padding-top:2.25rem!important;padding-bottom:2.25rem!important}.py-2\.5{padding-top:2.5rem!important;padding-bottom:2.5rem!important}.py-2\.75{padding-top:2.75rem!important;padding-bottom:2.75rem!important}.py-3{padding-top:3rem!important;padding-bottom:3rem!important}.py-4{padding-top:4rem!important;padding-bottom:4rem!important}.py-5{padding-top:5rem!important;padding-bottom:5rem!important}.py-6{padding-top:6rem!important;padding-bottom:6rem!important}.relative{position:relative!important}.absolute{position:absolute!important}.fixed{position:fixed!important}.sticky{position:sticky!important}.t-auto{top:auto!important}.r-auto{right:auto!important}.b-auto{bottom:auto!important}.l-auto{left:auto!important}.x-auto{right:auto!important;left:auto!important}.y-auto{top:auto!important;bottom:auto!important}.center{top:50%!important;left:50%!important;transform:translate(-50%,-50%)!important}.x-center{left:50%!important;transform:translateX(-50%)!important}.y-center{top:50%!important;transform:translateY(-50%)!important}.t-0{top:0!important}.r-0{right:0!important}.b-0{bottom:0!important}.l-0{left:0!important}.scroll{overflow:scroll!important}.scroll-x{overflow-x:scroll!important}.scroll-y{overflow-y:scroll!important}.no-scroll{overflow:none!important}.no-scroll-x{overflow-x:hidden!important}.no-scroll-y{overflow-y:hidden!important}.scroll-smooth{scroll-behavior:smooth!important}.scroll-auto{overflow:auto!important}.scroll-x-auto{overflow-x:auto!important}.scroll-y-auto{overflow-y:auto!important}.snap-y{scroll-snap-type:y mandatory!important}.snap-x{scroll-snap-type:x mandatory!important}.snap-start{scroll-snap-align:start!important}.snap-center{scroll-snap-align:center!important}.snap-end{scroll-snap-align:end!important}.shadow-xs{box-shadow:var(--shadow-xs)!important}.shadow-sm{box-shadow:var(--shadow-sm)!important}.shadow-md{box-shadow:var(--shadow-md)!important}.shadow-lg{box-shadow:var(--shadow-lg)!important}.shadow-xl{box-shadow:var(--shadow-xl)!important}.shadow-2xl{box-shadow:var(--shadow-2xl)!important}.shadow-3xl{box-shadow:var(--shadow-3xl)!important}.whitespace-normal{white-space:normal!important}.whitespace-nowrap{white-space:nowrap!important}.whitespace-pre{white-space:pre!important}.whitespace-pre-line{white-space:pre-line!important}.whitespace-pre-wrap{white-space:pre-wrap!important}.text-uppercase{text-transform:uppercase!important}.text-lowercase{text-transform:lowercase!important}.text-capitalize{text-transform:capitalize!important}.text-none{text-transform:none!important}.text-left{text-align:left!important}.text-center{text-align:center!important}.text-right{text-align:right!important}.text-justify{text-align:justify!important}:root{--white:#ffffff;--black:#000000;--primary-100:#EBF8FF;--primary-200:#BEE3F8;--primary-300:#90CDF4;--primary-400:#63B3ED;--primary-500:#4299E1;--primary-600:#3182CE;--primary-700:#2B6CB0;--primary-800:#2C5282;--primary-900:#2A4365;--danger-100:#FFF5F5;--danger-200:#FED7D7;--danger-300:#FEB2B2;--danger-400:#FC8181;--danger-500:#F56565;--danger-600:#E53E3E;--danger-700:#C53030;--danger-800:#9B2C2C;--danger-900:#742A2A;--warning-100:#FFFFF0;--warning-200:#FEFCBF;--warning-300:#FAF089;--warning-400:#F6E05E;--warning-500:#ECC94B;--warning-600:#D69E2E;--warning-700:#B7791F;--warning-800:#975A16;--warning-900:#744210;--success-100:#F0FFF4;--success-200:#C6F6D5;--success-300:#9AE6B4;--success-400:#68D391;--success-500:#48BB78;--success-600:#38A169;--success-700:#2F855A;--success-800:#276749;--success-900:#22543D;--grey-100:#F7FAFC;--grey-200:#EDF2F7;--grey-300:#E2E8F0;--grey-400:#CBD5E0;--grey-500:#A0AEC0;--grey-600:#718096;--grey-700:#4A5568;--grey-800:#2D3748;--grey-900:#1A202C;--neutral-100:#f5f5f5;--neutral-200:#eeeeee;--neutral-300:#e0e0e0;--neutral-400:#bdbdbd;--neutral-500:#9e9e9e;--neutral-600:#757575;--neutral-700:#616161;--neutral-800:#424242;--neutral-900:#212121;--font-base:system-ui,-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Oxygen,Ubuntu,Cantarell,'Open Sans','Helvetica Neue',sans-serif;--font-serif:Georgia,Cambria,'Times New Roman',Times,serif;--font-mono:Menlo,Monaco,Consolas,'Liberation Mono','Courier New',monospace;--font-hairline:100;--font-thin:200;--font-light:300;--font-regular:400;--font-medium:500;--font-semibold:600;--font-bold:700;--font-heavy:800;--font-black:900;--font-xs:0.75rem;--font-sm:0.875rem;--font-base:1rem;--font-md:1.125rem;--font-lg:1.25rem;--font-xl:1.5rem;--font-2xl:1.875rem;--font-3xl:2.25rem;--shadow-xs:0 0 0 1px rgba(0, 0, 0, 0.05);--shadow-sm:0 1px 2px 0 rgba(0, 0, 0, 0.05);--shadow-md:0 1px 3px 0 rgba(0, 0, 0, 0.1),0 1px 2px 0 rgba(0, 0, 0, 0.06);--shadow-lg:0 4px 6px -1px rgba(0, 0, 0, 0.1),0 2px 4px -1px rgba(0, 0, 0, 0.06);--shadow-xl:0 10px 15px -3px rgba(0, 0, 0, 0.1),0 4px 6px -2px rgba(0, 0, 0, 0.05);--shadow-2xl:0 20px 25px -5px rgba(0, 0, 0, 0.1),0 10px 10px -5px rgba(0, 0, 0, 0.04);--shadow-3xl:0 25px 50px -12px rgba(0, 0, 0, 0.25);--ease-in-out:cubic-bezier(0.4, 0.0, 0.2, 1);--ease-in:cubic-bezier(0.0, 0.0, 0.2, 1);--ease-out:cubic-bezier(0.4, 0.0, 1, 1);--ease-bounce:cubic-bezier(0.175, 0.885, 0.32, 1.275)}.border-solid{border-style:solid!important}.border-dashed{border-style:dashed!important}.border-dotted{border-style:dotted!important}.border-t-solid{border-top-style:solid!important}.border-t-dashed{border-top-style:dashed!important}.border-t-dotted{border-top-style:dotted!important}.border-r-solid{border-right-style:solid!important}.border-r-dashed{border-right-style:dashed!important}.border-r-dotted{border-right-style:dotted!important}.border-b-solid{border-bottom-style:solid!important}.border-b-dashed{border-bottom-style:dashed!important}.border-b-dotted{border-bottom-style:dotted!important}.border-l-solid{border-left-style:solid!important}.border-l-dashed{border-left-style:dashed!important}.border-l-dotted{border-left-style:dotted!important}.border-0{border-width:0!important}.border-1{border-width:1px!important}.border-2{border-width:2px!important}.border-t-0{border-top-width:0!important}.border-t-1{border-top-width:1px!important}.border-t-2{border-top-width:2px!important}.border-r-0{border-right-width:0!important}.border-r-1{border-right-width:1px!important}.border-r-2{border-right-width:2px!important}.border-b-0{border-bottom-width:0!important}.border-b-1{border-bottom-width:1px!important}.border-b-2{border-bottom-width:2px!important}.border-l-0{border-left-width:0!important}.border-l-1{border-left-width:1px!important}.border-l-2{border-left-width:2px!important}.border-white{border-color:var(--white)!important}.border-black{border-color:var(--black)!important}.border-primary-100{border-color:var(--primary-100)!important}.border-primary-200{border-color:var(--primary-200)!important}.border-primary-300{border-color:var(--primary-300)!important}.border-primary-400{border-color:var(--primary-400)!important}.border-primary-500{border-color:var(--primary-500)!important}.border-primary-600{border-color:var(--primary-600)!important}.border-primary-700{border-color:var(--primary-700)!important}.border-primary-800{border-color:var(--primary-800)!important}.border-primary-900{border-color:var(--primary-900)!important}.border-danger-100{border-color:var(--danger-100)!important}.border-danger-200{border-color:var(--danger-200)!important}.border-danger-300{border-color:var(--danger-300)!important}.border-danger-400{border-color:var(--danger-400)!important}.border-danger-500{border-color:var(--danger-500)!important}.border-danger-600{border-color:var(--danger-600)!important}.border-danger-700{border-color:var(--danger-700)!important}.border-danger-800{border-color:var(--danger-800)!important}.border-danger-900{border-color:var(--danger-900)!important}.border-warning-100{border-color:var(--warning-100)!important}.border-warning-200{border-color:var(--warning-200)!important}.border-warning-300{border-color:var(--warning-300)!important}.border-warning-400{border-color:var(--warning-400)!important}.border-warning-500{border-color:var(--warning-500)!important}.border-warning-600{border-color:var(--warning-600)!important}.border-warning-700{border-color:var(--warning-700)!important}.border-warning-800{border-color:var(--warning-800)!important}.border-warning-900{border-color:var(--warning-900)!important}.border-success-100{border-color:var(--success-100)!important}.border-success-200{border-color:var(--success-200)!important}.border-success-300{border-color:var(--success-300)!important}.border-success-400{border-color:var(--success-400)!important}.border-success-500{border-color:var(--success-500)!important}.border-success-600{border-color:var(--success-600)!important}.border-success-700{border-color:var(--success-700)!important}.border-success-800{border-color:var(--success-800)!important}.border-success-900{border-color:var(--success-900)!important}.border-grey-100{border-color:var(--grey-100)!important}.border-grey-200{border-color:var(--grey-200)!important}.border-grey-300{border-color:var(--grey-300)!important}.border-grey-400{border-color:var(--grey-400)!important}.border-grey-500{border-color:var(--grey-500)!important}.border-grey-600{border-color:var(--grey-600)!important}.border-grey-700{border-color:var(--grey-700)!important}.border-grey-800{border-color:var(--grey-800)!important}.border-grey-900{border-color:var(--grey-900)!important}.border-neutral-100{border-color:var(--neutral-100)!important}.border-neutral-200{border-color:var(--neutral-200)!important}.border-neutral-300{border-color:var(--neutral-300)!important}.border-neutral-400{border-color:var(--neutral-400)!important}.border-neutral-500{border-color:var(--neutral-500)!important}.border-neutral-600{border-color:var(--neutral-600)!important}.border-neutral-700{border-color:var(--neutral-700)!important}.border-neutral-800{border-color:var(--neutral-800)!important}.border-neutral-900{border-color:var(--neutral-900)!important}.border-t-white{border-top-color:var(--white)!important}.border-t-black{border-top-color:var(--black)!important}.border-t-primary-100{border-top-color:var(--primary-100)!important}.border-t-primary-200{border-top-color:var(--primary-200)!important}.border-t-primary-300{border-top-color:var(--primary-300)!important}.border-t-primary-400{border-top-color:var(--primary-400)!important}.border-t-primary-500{border-top-color:var(--primary-500)!important}.border-t-primary-600{border-top-color:var(--primary-600)!important}.border-t-primary-700{border-top-color:var(--primary-700)!important}.border-t-primary-800{border-top-color:var(--primary-800)!important}.border-t-primary-900{border-top-color:var(--primary-900)!important}.border-t-danger-100{border-top-color:var(--danger-100)!important}.border-t-danger-200{border-top-color:var(--danger-200)!important}.border-t-danger-300{border-top-color:var(--danger-300)!important}.border-t-danger-400{border-top-color:var(--danger-400)!important}.border-t-danger-500{border-top-color:var(--danger-500)!important}.border-t-danger-600{border-top-color:var(--danger-600)!important}.border-t-danger-700{border-top-color:var(--danger-700)!important}.border-t-danger-800{border-top-color:var(--danger-800)!important}.border-t-danger-900{border-top-color:var(--danger-900)!important}.border-t-warning-100{border-top-color:var(--warning-100)!important}.border-t-warning-200{border-top-color:var(--warning-200)!important}.border-t-warning-300{border-top-color:var(--warning-300)!important}.border-t-warning-400{border-top-color:var(--warning-400)!important}.border-t-warning-500{border-top-color:var(--warning-500)!important}.border-t-warning-600{border-top-color:var(--warning-600)!important}.border-t-warning-700{border-top-color:var(--warning-700)!important}.border-t-warning-800{border-top-color:var(--warning-800)!important}.border-t-warning-900{border-top-color:var(--warning-900)!important}.border-t-success-100{border-top-color:var(--success-100)!important}.border-t-success-200{border-top-color:var(--success-200)!important}.border-t-success-300{border-top-color:var(--success-300)!important}.border-t-success-400{border-top-color:var(--success-400)!important}.border-t-success-500{border-top-color:var(--success-500)!important}.border-t-success-600{border-top-color:var(--success-600)!important}.border-t-success-700{border-top-color:var(--success-700)!important}.border-t-success-800{border-top-color:var(--success-800)!important}.border-t-success-900{border-top-color:var(--success-900)!important}.border-t-grey-100{border-top-color:var(--grey-100)!important}.border-t-grey-200{border-top-color:var(--grey-200)!important}.border-t-grey-300{border-top-color:var(--grey-300)!important}.border-t-grey-400{border-top-color:var(--grey-400)!important}.border-t-grey-500{border-top-color:var(--grey-500)!important}.border-t-grey-600{border-top-color:var(--grey-600)!important}.border-t-grey-700{border-top-color:var(--grey-700)!important}.border-t-grey-800{border-top-color:var(--grey-800)!important}.border-t-grey-900{border-top-color:var(--grey-900)!important}.border-t-neutral-100{border-top-color:var(--neutral-100)!important}.border-t-neutral-200{border-top-color:var(--neutral-200)!important}.border-t-neutral-300{border-top-color:var(--neutral-300)!important}.border-t-neutral-400{border-top-color:var(--neutral-400)!important}.border-t-neutral-500{border-top-color:var(--neutral-500)!important}.border-t-neutral-600{border-top-color:var(--neutral-600)!important}.border-t-neutral-700{border-top-color:var(--neutral-700)!important}.border-t-neutral-800{border-top-color:var(--neutral-800)!important}.border-t-neutral-900{border-top-color:var(--neutral-900)!important}.border-r-white{border-right-color:var(--white)!important}.border-r-black{border-right-color:var(--black)!important}.border-r-primary-100{border-right-color:var(--primary-100)!important}.border-r-primary-200{border-right-color:var(--primary-200)!important}.border-r-primary-300{border-right-color:var(--primary-300)!important}.border-r-primary-400{border-right-color:var(--primary-400)!important}.border-r-primary-500{border-right-color:var(--primary-500)!important}.border-r-primary-600{border-right-color:var(--primary-600)!important}.border-r-primary-700{border-right-color:var(--primary-700)!important}.border-r-primary-800{border-right-color:var(--primary-800)!important}.border-r-primary-900{border-right-color:var(--primary-900)!important}.border-r-danger-100{border-right-color:var(--danger-100)!important}.border-r-danger-200{border-right-color:var(--danger-200)!important}.border-r-danger-300{border-right-color:var(--danger-300)!important}.border-r-danger-400{border-right-color:var(--danger-400)!important}.border-r-danger-500{border-right-color:var(--danger-500)!important}.border-r-danger-600{border-right-color:var(--danger-600)!important}.border-r-danger-700{border-right-color:var(--danger-700)!important}.border-r-danger-800{border-right-color:var(--danger-800)!important}.border-r-danger-900{border-right-color:var(--danger-900)!important}.border-r-warning-100{border-right-color:var(--warning-100)!important}.border-r-warning-200{border-right-color:var(--warning-200)!important}.border-r-warning-300{border-right-color:var(--warning-300)!important}.border-r-warning-400{border-right-color:var(--warning-400)!important}.border-r-warning-500{border-right-color:var(--warning-500)!important}.border-r-warning-600{border-right-color:var(--warning-600)!important}.border-r-warning-700{border-right-color:var(--warning-700)!important}.border-r-warning-800{border-right-color:var(--warning-800)!important}.border-r-warning-900{border-right-color:var(--warning-900)!important}.border-r-success-100{border-right-color:var(--success-100)!important}.border-r-success-200{border-right-color:var(--success-200)!important}.border-r-success-300{border-right-color:var(--success-300)!important}.border-r-success-400{border-right-color:var(--success-400)!important}.border-r-success-500{border-right-color:var(--success-500)!important}.border-r-success-600{border-right-color:var(--success-600)!important}.border-r-success-700{border-right-color:var(--success-700)!important}.border-r-success-800{border-right-color:var(--success-800)!important}.border-r-success-900{border-right-color:var(--success-900)!important}.border-r-grey-100{border-right-color:var(--grey-100)!important}.border-r-grey-200{border-right-color:var(--grey-200)!important}.border-r-grey-300{border-right-color:var(--grey-300)!important}.border-r-grey-400{border-right-color:var(--grey-400)!important}.border-r-grey-500{border-right-color:var(--grey-500)!important}.border-r-grey-600{border-right-color:var(--grey-600)!important}.border-r-grey-700{border-right-color:var(--grey-700)!important}.border-r-grey-800{border-right-color:var(--grey-800)!important}.border-r-grey-900{border-right-color:var(--grey-900)!important}.border-r-neutral-100{border-right-color:var(--neutral-100)!important}.border-r-neutral-200{border-right-color:var(--neutral-200)!important}.border-r-neutral-300{border-right-color:var(--neutral-300)!important}.border-r-neutral-400{border-right-color:var(--neutral-400)!important}.border-r-neutral-500{border-right-color:var(--neutral-500)!important}.border-r-neutral-600{border-right-color:var(--neutral-600)!important}.border-r-neutral-700{border-right-color:var(--neutral-700)!important}.border-r-neutral-800{border-right-color:var(--neutral-800)!important}.border-r-neutral-900{border-right-color:var(--neutral-900)!important}.border-b-white{border-bottom-color:var(--white)!important}.border-b-black{border-bottom-color:var(--black)!important}.border-b-primary-100{border-bottom-color:var(--primary-100)!important}.border-b-primary-200{border-bottom-color:var(--primary-200)!important}.border-b-primary-300{border-bottom-color:var(--primary-300)!important}.border-b-primary-400{border-bottom-color:var(--primary-400)!important}.border-b-primary-500{border-bottom-color:var(--primary-500)!important}.border-b-primary-600{border-bottom-color:var(--primary-600)!important}.border-b-primary-700{border-bottom-color:var(--primary-700)!important}.border-b-primary-800{border-bottom-color:var(--primary-800)!important}.border-b-primary-900{border-bottom-color:var(--primary-900)!important}.border-b-danger-100{border-bottom-color:var(--danger-100)!important}.border-b-danger-200{border-bottom-color:var(--danger-200)!important}.border-b-danger-300{border-bottom-color:var(--danger-300)!important}.border-b-danger-400{border-bottom-color:var(--danger-400)!important}.border-b-danger-500{border-bottom-color:var(--danger-500)!important}.border-b-danger-600{border-bottom-color:var(--danger-600)!important}.border-b-danger-700{border-bottom-color:var(--danger-700)!important}.border-b-danger-800{border-bottom-color:var(--danger-800)!important}.border-b-danger-900{border-bottom-color:var(--danger-900)!important}.border-b-warning-100{border-bottom-color:var(--warning-100)!important}.border-b-warning-200{border-bottom-color:var(--warning-200)!important}.border-b-warning-300{border-bottom-color:var(--warning-300)!important}.border-b-warning-400{border-bottom-color:var(--warning-400)!important}.border-b-warning-500{border-bottom-color:var(--warning-500)!important}.border-b-warning-600{border-bottom-color:var(--warning-600)!important}.border-b-warning-700{border-bottom-color:var(--warning-700)!important}.border-b-warning-800{border-bottom-color:var(--warning-800)!important}.border-b-warning-900{border-bottom-color:var(--warning-900)!important}.border-b-success-100{border-bottom-color:var(--success-100)!important}.border-b-success-200{border-bottom-color:var(--success-200)!important}.border-b-success-300{border-bottom-color:var(--success-300)!important}.border-b-success-400{border-bottom-color:var(--success-400)!important}.border-b-success-500{border-bottom-color:var(--success-500)!important}.border-b-success-600{border-bottom-color:var(--success-600)!important}.border-b-success-700{border-bottom-color:var(--success-700)!important}.border-b-success-800{border-bottom-color:var(--success-800)!important}.border-b-success-900{border-bottom-color:var(--success-900)!important}.border-b-grey-100{border-bottom-color:var(--grey-100)!important}.border-b-grey-200{border-bottom-color:var(--grey-200)!important}.border-b-grey-300{border-bottom-color:var(--grey-300)!important}.border-b-grey-400{border-bottom-color:var(--grey-400)!important}.border-b-grey-500{border-bottom-color:var(--grey-500)!important}.border-b-grey-600{border-bottom-color:var(--grey-600)!important}.border-b-grey-700{border-bottom-color:var(--grey-700)!important}.border-b-grey-800{border-bottom-color:var(--grey-800)!important}.border-b-grey-900{border-bottom-color:var(--grey-900)!important}.border-b-neutral-100{border-bottom-color:var(--neutral-100)!important}.border-b-neutral-200{border-bottom-color:var(--neutral-200)!important}.border-b-neutral-300{border-bottom-color:var(--neutral-300)!important}.border-b-neutral-400{border-bottom-color:var(--neutral-400)!important}.border-b-neutral-500{border-bottom-color:var(--neutral-500)!important}.border-b-neutral-600{border-bottom-color:var(--neutral-600)!important}.border-b-neutral-700{border-bottom-color:var(--neutral-700)!important}.border-b-neutral-800{border-bottom-color:var(--neutral-800)!important}.border-b-neutral-900{border-bottom-color:var(--neutral-900)!important}.border-l-white{border-left-color:var(--white)!important}.border-l-black{border-left-color:var(--black)!important}.border-l-primary-100{border-left-color:var(--primary-100)!important}.border-l-primary-200{border-left-color:var(--primary-200)!important}.border-l-primary-300{border-left-color:var(--primary-300)!important}.border-l-primary-400{border-left-color:var(--primary-400)!important}.border-l-primary-500{border-left-color:var(--primary-500)!important}.border-l-primary-600{border-left-color:var(--primary-600)!important}.border-l-primary-700{border-left-color:var(--primary-700)!important}.border-l-primary-800{border-left-color:var(--primary-800)!important}.border-l-primary-900{border-left-color:var(--primary-900)!important}.border-l-danger-100{border-left-color:var(--danger-100)!important}.border-l-danger-200{border-left-color:var(--danger-200)!important}.border-l-danger-300{border-left-color:var(--danger-300)!important}.border-l-danger-400{border-left-color:var(--danger-400)!important}.border-l-danger-500{border-left-color:var(--danger-500)!important}.border-l-danger-600{border-left-color:var(--danger-600)!important}.border-l-danger-700{border-left-color:var(--danger-700)!important}.border-l-danger-800{border-left-color:var(--danger-800)!important}.border-l-danger-900{border-left-color:var(--danger-900)!important}.border-l-warning-100{border-left-color:var(--warning-100)!important}.border-l-warning-200{border-left-color:var(--warning-200)!important}.border-l-warning-300{border-left-color:var(--warning-300)!important}.border-l-warning-400{border-left-color:var(--warning-400)!important}.border-l-warning-500{border-left-color:var(--warning-500)!important}.border-l-warning-600{border-left-color:var(--warning-600)!important}.border-l-warning-700{border-left-color:var(--warning-700)!important}.border-l-warning-800{border-left-color:var(--warning-800)!important}.border-l-warning-900{border-left-color:var(--warning-900)!important}.border-l-success-100{border-left-color:var(--success-100)!important}.border-l-success-200{border-left-color:var(--success-200)!important}.border-l-success-300{border-left-color:var(--success-300)!important}.border-l-success-400{border-left-color:var(--success-400)!important}.border-l-success-500{border-left-color:var(--success-500)!important}.border-l-success-600{border-left-color:var(--success-600)!important}.border-l-success-700{border-left-color:var(--success-700)!important}.border-l-success-800{border-left-color:var(--success-800)!important}.border-l-success-900{border-left-color:var(--success-900)!important}.border-l-grey-100{border-left-color:var(--grey-100)!important}.border-l-grey-200{border-left-color:var(--grey-200)!important}.border-l-grey-300{border-left-color:var(--grey-300)!important}.border-l-grey-400{border-left-color:var(--grey-400)!important}.border-l-grey-500{border-left-color:var(--grey-500)!important}.border-l-grey-600{border-left-color:var(--grey-600)!important}.border-l-grey-700{border-left-color:var(--grey-700)!important}.border-l-grey-800{border-left-color:var(--grey-800)!important}.border-l-grey-900{border-left-color:var(--grey-900)!important}.border-l-neutral-100{border-left-color:var(--neutral-100)!important}.border-l-neutral-200{border-left-color:var(--neutral-200)!important}.border-l-neutral-300{border-left-color:var(--neutral-300)!important}.border-l-neutral-400{border-left-color:var(--neutral-400)!important}.border-l-neutral-500{border-left-color:var(--neutral-500)!important}.border-l-neutral-600{border-left-color:var(--neutral-600)!important}.border-l-neutral-700{border-left-color:var(--neutral-700)!important}.border-l-neutral-800{border-left-color:var(--neutral-800)!important}.border-l-neutral-900{border-left-color:var(--neutral-900)!important}.radius-0\.125{border-radius:.125rem!important}.radius-0\.25{border-radius:.25rem!important}.radius-0\.5{border-radius:.5rem!important} -------------------------------------------------------------------------------- /test/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Notify.JS Test 7 | 8 | 9 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 |
25 | 26 | 27 | 28 | 29 | 30 |
31 |
32 | 33 | 34 | 35 | 36 |
37 |
38 | 39 | 185 | 186 | 187 | -------------------------------------------------------------------------------- /test/notifications.css: -------------------------------------------------------------------------------- 1 | notifications-component notification-component{background-color:var(--neutral-800);padding:1rem;border-radius:.25rem;box-shadow:var(--shadow-lg);display:flex;flex-flow:row nowrap;border-left:4px solid #4299e1;width:300px;margin:1rem 0 0; transform-origin:top left;transition:all .3s var(--ease-in-out);pointer-events:all;position:relative} 2 | notifications-component notification-component.-yellow{border-color:#ecc94b} 3 | notifications-component notification-component.-yellow i{color:#ecc94b} 4 | notifications-component notification-component.-red{border-color:#f56565} 5 | notifications-component notification-component.-red i{color:#f56565} 6 | notifications-component notification-component.-green{border-color:#48bb78} 7 | notifications-component notification-component.-green i{color:#48bb78} 8 | notifications-component notification-component i{width:24px;height:24px;position:relative;display:inline-flex;justify-content:center;align-items:center;margin-right:1rem;color:#4299e1} 9 | notifications-component notification-component i svg{width:24px;height:24px} 10 | notifications-component notification-component copy-wrapper{display:block;flex:1;z-index: 2;} 11 | notifications-component notification-component copy-wrapper h3{display:block;color:var(--white);font-weight:var(--font-bold);margin-bottom:.25rem} 12 | notifications-component notification-component copy-wrapper p{display:block;color:var(--neutral-300);font-size:var(--font-sm);line-height:1.618} 13 | notifications-component notification-component .close{z-index: 2;width:24px;height:24px;position:absolute;top:.5rem;right:.5rem;display:flex;justify-content:center;align-items:center;color:var(--white)} 14 | notifications-component notification-component .close:hover::before, 15 | notifications-component notification-component .close:focus::before{transform:scale(1)} 16 | notifications-component notification-component .close:active::before{opacity:.15} 17 | notifications-component notification-component .close::before{content:"";display:inline-block;width:100%;height:100%;border-radius:50%;background-color:var(--white);opacity:.06;position:absolute;transform:scale(0);transition:all 150ms var(--ease-bounce)} 18 | notifications-component notification-component .close svg{width:14px;height:14px} 19 | notifications-component notification-component notification-actions{ 20 | display: flex; 21 | width: 100%; 22 | width: 100%; 23 | flex-flow: row wrap; 24 | align-items: center; 25 | justify-content: flex-end; 26 | margin-top: 0.75rem; 27 | } 28 | notifications-component notification-component notification-actions button{ 29 | height: 36px; 30 | display: inline-flex; 31 | align-items: center; 32 | justify-content: center; 33 | font-size: 0.875rem; 34 | font-weight: 600; 35 | text-transform: uppercase; 36 | padding: 0 0.5rem; 37 | color: var(--primary-300); 38 | margin-left: 0.5rem; 39 | position: relative; 40 | } 41 | notifications-component notification-component notification-actions button:hover::before, 42 | notifications-component notification-component notification-actions button:focus::before{transform:scale(1)} 43 | notifications-component notification-component notification-actions button:active::before{opacity:.15} 44 | notifications-component notification-component notification-actions button::before{content:"";display:inline-block;width:100%;height:100%;border-radius:0.25rem;background-color:var(--primary-500);opacity:.06;position:absolute;top:0;left:0;transform:scale(0);transition:all 150ms var(--ease-bounce)} 45 | @keyframes grow{ 46 | from{ 47 | transform:translateY(50%); 48 | opacity: 0; 49 | } 50 | to{ 51 | transform:translateY(0); 52 | opacity: 1; 53 | } 54 | } 55 | notifications-component { 56 | height: 100vh; 57 | position: fixed; 58 | top: 0; 59 | right: 0; 60 | z-index: 2000; 61 | overflow-y: auto; 62 | overflow-x: hidden; 63 | pointer-events: none; 64 | padding: 0 1rem; 65 | width: calc(300px + 2rem); 66 | } 67 | notification-component{ 68 | transform: translateY(50%); 69 | opacity: 0; 70 | animation: grow 300ms forwards var(--ease-in); 71 | } 72 | notification-timer{ 73 | position: absolute; 74 | background-color: var(--white); 75 | 76 | } 77 | notification-timer.vertical{ 78 | top: 0; 79 | left: 0; 80 | width: 100%; 81 | height: 100%; 82 | opacity: 0.07; 83 | transform-origin: bottom center; 84 | z-index: 1; 85 | } 86 | notification-timer.horizontal{ 87 | opacity: 0.3; 88 | bottom: 0; 89 | left: 0; 90 | height: 8px; 91 | width: 100%; 92 | transform-origin: right center; 93 | } 94 | -------------------------------------------------------------------------------- /test/snackbar.css: -------------------------------------------------------------------------------- 1 | snackbar-component { 2 | display: inline-flex; 3 | align-items: center; 4 | justify-content: space-between; 5 | border-radius: 0.25rem; 6 | background-color: var(--neutral-900); 7 | box-shadow: var(--shadow-lg); 8 | color: var(--white); 9 | min-width: 350px; 10 | max-width: 90vw; 11 | transform: scale(0.87); 12 | opacity: 0; 13 | z-index: 1000; 14 | transform-origin: top left; 15 | animation: notificationPop 300ms cubic-bezier(0.68, -0.55, 0.265, 1.55) forwards; 16 | position: fixed; 17 | bottom: 1rem; 18 | left: 50%; 19 | transform: translateX(-50%); 20 | } 21 | 22 | snackbar-component p { 23 | padding: 0.875rem 1rem; 24 | line-height: 1.618; 25 | font-size: 0.875rem; 26 | } 27 | 28 | snackbar-component button { 29 | user-select: none; 30 | font-weight: 500; 31 | font-size: 0.875rem; 32 | height: 2.5rem; 33 | line-height: 2.5rem; 34 | padding: 0 0.5rem; 35 | color: var(--primary-300); 36 | text-transform: uppercase; 37 | text-align: center; 38 | cursor: pointer; 39 | } 40 | 41 | snackbar-component button:not(:last-child) { 42 | margin-right: 0.5rem; 43 | } 44 | 45 | snackbar-component button:hover::before, 46 | snackbar-component button:focus::before { 47 | transform: scale(1); 48 | opacity: 0.06; 49 | } 50 | 51 | snackbar-component button:active::before { 52 | opacity: 0.1; 53 | } 54 | 55 | snackbar-component button::before { 56 | content: ""; 57 | display: inline-block; 58 | position: absolute; 59 | top: 0; 60 | left: 0; 61 | width: 100%; 62 | height: 100%; 63 | border-radius: 0.25rem; 64 | background-color: var(--primary-500); 65 | transform-origin: center; 66 | transform: scale(0); 67 | opacity: 0; 68 | transition: all 150ms var(--ease-bounce); 69 | } 70 | 71 | snackbar-actions { 72 | display: inline-flex; 73 | flex-flow: row nowrap; 74 | align-items: center; 75 | justify-content: flex-end; 76 | padding-right: 0.5rem; 77 | } 78 | 79 | snackbar-actions .close { 80 | width: 2.5rem; 81 | height: 2.5rem; 82 | display: inline-flex; 83 | justify-content: center; 84 | align-items: center; 85 | flex-flow: column wrap; 86 | color: var(--white); 87 | cursor: pointer; 88 | user-select: none; 89 | transition: all 75ms var(--ease-in-out); 90 | } 91 | 92 | snackbar-actions .close:hover::before, 93 | snackbar-actions .close:focus::before { 94 | transform: scale(1); 95 | opacity: 0.06; 96 | } 97 | 98 | snackbar-actions .close:active::before { 99 | opacity: 0.1; 100 | } 101 | 102 | snackbar-actions .close svg { 103 | width: 20px; 104 | height: 20px; 105 | position: relative; 106 | margin: 0; 107 | } 108 | 109 | snackbar-actions .close::before { 110 | width: 100%; 111 | height: 100%; 112 | position: absolute; 113 | top: 0; 114 | left: 0; 115 | display: inline-block; 116 | content: ""; 117 | border-radius: 50%; 118 | background-color: var(--white); 119 | transform-origin: center; 120 | transform: scale(0); 121 | opacity: 0; 122 | transition: all 150ms var(--ease-bounce); 123 | } 124 | 125 | @keyframes notificationPop { 126 | from { 127 | opacity: 0; 128 | transform: scale(0.87) translateX(-50%); 129 | } 130 | to { 131 | opacity: 1; 132 | transform: scale(1) translateX(-50%); 133 | } 134 | } 135 | -------------------------------------------------------------------------------- /test/sonner.css: -------------------------------------------------------------------------------- 1 | sonner-component { 2 | display: block; 3 | width: 350px; 4 | height: 0; 5 | position: fixed; 6 | bottom: 1.5rem; 7 | right: 1.5rem; 8 | z-index: 99999999; 9 | box-sizing: border-box; 10 | 11 | sonner-toast-component { 12 | position: absolute; 13 | opacity: var(--opacity); 14 | transform: translateY(var(--y)) translateY(var(--offset)) scale(var(--scale)); 15 | transition: transform 300ms var(--ease-in-out), opacity 300ms var(--ease-in-out), height 300ms var(--ease-in-out), box-shadow 300ms var(--ease-in-out); 16 | touch-action: none; 17 | box-sizing: border-box; 18 | padding: 1rem 1.25rem; 19 | display: flex; 20 | flex-flow: row nowrap; 21 | align-items: center; 22 | min-height: 66px; 23 | width: 100%; 24 | left: 0; 25 | bottom: 0; 26 | background: var(--grey-900); 27 | border: 1px solid var(--grey-800); 28 | border-radius: 0.5rem; 29 | 30 | &[data-button] { 31 | padding-right: 1rem; 32 | } 33 | 34 | copy-wrapper { 35 | display: grid; 36 | grid-template-rows: 1fr; 37 | gap: 0.25rem; 38 | width: 100%; 39 | flex: 1; 40 | 41 | h3 { 42 | display: block; 43 | color: var(--grey-100); 44 | font-size: 0.875rem; 45 | font-weight: 600; 46 | } 47 | 48 | p { 49 | display: block; 50 | color: var(--grey-400); 51 | font-size: 0.75rem; 52 | line-height: 1.375; 53 | } 54 | } 55 | 56 | button { 57 | display: inline-flex; 58 | flex-flow: row nowrap; 59 | justify-content: center; 60 | align-items: center; 61 | font-weight: 500; 62 | cursor: pointer; 63 | padding: 0 0.75rem; 64 | background-color: hsl(var(--grey-800-hsl) / 0.87); 65 | border-color: var(--grey-700); 66 | height: 24px; 67 | border-radius: 4px; 68 | min-width: 53px; 69 | font-size: 0.75rem; 70 | color: var(--grey-300); 71 | 72 | &:hover { 73 | color: var(--grey-100); 74 | background-color: hsl(var(--grey-400-hsl) / 0.1); 75 | } 76 | 77 | &:focus-visibile { 78 | color: var(--grey-100); 79 | background-color: hsl(var(--grey-400-hsl) / 0.1); 80 | } 81 | 82 | &:active { 83 | color: var(--grey-50); 84 | background-color: hsl(var(--grey-400-hsl) / 0.15); 85 | } 86 | } 87 | } 88 | } 89 | -------------------------------------------------------------------------------- /test/toaster.css: -------------------------------------------------------------------------------- 1 | toaster-component{ 2 | position: fixed; 3 | z-index: 2000; 4 | width: 300px; 5 | bottom: 0; 6 | left: 0; 7 | padding: 0 0 1.5rem 1rem; 8 | display: grid; 9 | justify-content: start; 10 | justify-items: center; 11 | gap: 0.5rem; 12 | pointer-events: none; 13 | } 14 | toaster-component output{ 15 | background-color: var(--white); 16 | border: 1px solid var(--grey-300); 17 | box-shadow: var(--shadow-md); 18 | color: var(--grey-800); 19 | max-inline-size: min(25ch, 90vw); 20 | padding: 0.5rem; 21 | border-radius: 0.25rem; 22 | animation: 23 | fade-in 0.3s ease, 24 | slide-in 0.3s ease, 25 | fade-out 0.3s 4.4s ease; 26 | animation-fill-mode: forwards; 27 | font-size: var(--font-sm); 28 | user-select: none; 29 | cursor: pointer; 30 | pointer-events: all; 31 | } 32 | toaster-component output:active{ 33 | transform: scale(0.95); 34 | } 35 | @keyframes fade-in { 36 | from { opacity: 0 } 37 | } 38 | 39 | @keyframes fade-out { 40 | to { opacity: 0 } 41 | } 42 | 43 | @keyframes slide-in { 44 | from { transform: translateY(var(--_travel-distance, 10px)) } 45 | } 46 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "outDir": "./dist", 4 | "sourceMap": false, 5 | "noImplicitAny": true, 6 | "experimentalDecorators": true, 7 | "emitDecoratorMetadata": true, 8 | "removeComments": true, 9 | "target": "ES2020", 10 | "module": "ESNext", 11 | "moduleResolution": "node", 12 | "lib": ["DOM", "ES2020"], 13 | "declaration": true, 14 | "emitDeclarationOnly": true 15 | }, 16 | "exclude": ["./node_modules"], 17 | "include": ["./src"] 18 | } 19 | --------------------------------------------------------------------------------