├── .gitignore ├── LICENSE ├── README.md ├── package-lock.json ├── package.json ├── rollup.config.js ├── src ├── core.ts └── tooltip.ts ├── tests └── index.html └── tsconfig.json /.gitignore: -------------------------------------------------------------------------------- 1 | dist/ 2 | node_modules/ 3 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 Ion 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 | # Tooltip 2 | 3 | > A simple and lightweight tooltip library 4 | 5 | A library under 4KB to display informative texts as known as tooltips. 6 | 7 | ## Quick start 8 | 9 | Choose your favorite option below: 10 | 11 | ### Install with NPM 12 | 13 | ``` 14 | npm i @ionited/tooltip 15 | ``` 16 | 17 | ### Get from UNPKG 18 | 19 | [https://unpkg.com/@ionited/tooltip@latest/dist/tooltip.js](https://unpkg.com/@ionited/tooltip@latest/dist/tooltip.js) 20 | 21 | --- 22 | 23 | ## Usage 24 | 25 | To basic usage you can simply call: 26 | 27 | ```js 28 | Tooltip(document.querySelector('button')); // Defaults to get title attribute content 29 | ``` 30 | 31 | ### Options 32 | 33 | ```ts 34 | Tooltip(el: HTMLElement, options?: TooltipOptions): TooltipCore 35 | 36 | interface TooltipOptions { 37 | content?: string; 38 | contentAttr: string = 'title'; 39 | showOnClick: boolean = false; 40 | } 41 | 42 | interface TooltipCore { 43 | destroy(): void; 44 | hide(): void; 45 | show(): void; 46 | update(): void; 47 | } 48 | ``` 49 | 50 | ## License 51 | 52 | Copyright (c) 2021 Ion. Licensed under [Mit License](LICENSE). 53 | 54 | [https://ionited.io](https://ionited.io) 55 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@ionited/tooltip", 3 | "version": "0.1.8", 4 | "lockfileVersion": 2, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "@ionited/tooltip", 9 | "version": "0.1.8", 10 | "license": "MIT", 11 | "devDependencies": { 12 | "rollup-plugin-terser": "^7.0.2", 13 | "rollup-plugin-typescript2": "^0.36.0", 14 | "typescript": "^5.5.2" 15 | } 16 | }, 17 | "node_modules/@babel/code-frame": { 18 | "version": "7.14.5", 19 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz", 20 | "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==", 21 | "dev": true, 22 | "dependencies": { 23 | "@babel/highlight": "^7.14.5" 24 | }, 25 | "engines": { 26 | "node": ">=6.9.0" 27 | } 28 | }, 29 | "node_modules/@babel/helper-validator-identifier": { 30 | "version": "7.14.5", 31 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz", 32 | "integrity": "sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg==", 33 | "dev": true, 34 | "engines": { 35 | "node": ">=6.9.0" 36 | } 37 | }, 38 | "node_modules/@babel/highlight": { 39 | "version": "7.14.5", 40 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", 41 | "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", 42 | "dev": true, 43 | "dependencies": { 44 | "@babel/helper-validator-identifier": "^7.14.5", 45 | "chalk": "^2.0.0", 46 | "js-tokens": "^4.0.0" 47 | }, 48 | "engines": { 49 | "node": ">=6.9.0" 50 | } 51 | }, 52 | "node_modules/@rollup/pluginutils": { 53 | "version": "4.2.1", 54 | "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.2.1.tgz", 55 | "integrity": "sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==", 56 | "dev": true, 57 | "dependencies": { 58 | "estree-walker": "^2.0.1", 59 | "picomatch": "^2.2.2" 60 | }, 61 | "engines": { 62 | "node": ">= 8.0.0" 63 | } 64 | }, 65 | "node_modules/@types/node": { 66 | "version": "16.0.0", 67 | "resolved": "https://registry.npmjs.org/@types/node/-/node-16.0.0.tgz", 68 | "integrity": "sha512-TmCW5HoZ2o2/z2EYi109jLqIaPIi9y/lc2LmDCWzuCi35bcaQ+OtUh6nwBiFK7SOu25FAU5+YKdqFZUwtqGSdg==", 69 | "dev": true 70 | }, 71 | "node_modules/ansi-styles": { 72 | "version": "3.2.1", 73 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 74 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 75 | "dev": true, 76 | "dependencies": { 77 | "color-convert": "^1.9.0" 78 | }, 79 | "engines": { 80 | "node": ">=4" 81 | } 82 | }, 83 | "node_modules/buffer-from": { 84 | "version": "1.1.1", 85 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", 86 | "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", 87 | "dev": true 88 | }, 89 | "node_modules/chalk": { 90 | "version": "2.4.2", 91 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 92 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 93 | "dev": true, 94 | "dependencies": { 95 | "ansi-styles": "^3.2.1", 96 | "escape-string-regexp": "^1.0.5", 97 | "supports-color": "^5.3.0" 98 | }, 99 | "engines": { 100 | "node": ">=4" 101 | } 102 | }, 103 | "node_modules/color-convert": { 104 | "version": "1.9.3", 105 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 106 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 107 | "dev": true, 108 | "dependencies": { 109 | "color-name": "1.1.3" 110 | } 111 | }, 112 | "node_modules/color-name": { 113 | "version": "1.1.3", 114 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 115 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", 116 | "dev": true 117 | }, 118 | "node_modules/commander": { 119 | "version": "2.20.3", 120 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", 121 | "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", 122 | "dev": true 123 | }, 124 | "node_modules/commondir": { 125 | "version": "1.0.1", 126 | "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", 127 | "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", 128 | "dev": true 129 | }, 130 | "node_modules/escape-string-regexp": { 131 | "version": "1.0.5", 132 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 133 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 134 | "dev": true, 135 | "engines": { 136 | "node": ">=0.8.0" 137 | } 138 | }, 139 | "node_modules/estree-walker": { 140 | "version": "2.0.2", 141 | "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", 142 | "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", 143 | "dev": true 144 | }, 145 | "node_modules/find-cache-dir": { 146 | "version": "3.3.2", 147 | "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", 148 | "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", 149 | "dev": true, 150 | "dependencies": { 151 | "commondir": "^1.0.1", 152 | "make-dir": "^3.0.2", 153 | "pkg-dir": "^4.1.0" 154 | }, 155 | "engines": { 156 | "node": ">=8" 157 | }, 158 | "funding": { 159 | "url": "https://github.com/avajs/find-cache-dir?sponsor=1" 160 | } 161 | }, 162 | "node_modules/find-up": { 163 | "version": "4.1.0", 164 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", 165 | "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", 166 | "dev": true, 167 | "dependencies": { 168 | "locate-path": "^5.0.0", 169 | "path-exists": "^4.0.0" 170 | }, 171 | "engines": { 172 | "node": ">=8" 173 | } 174 | }, 175 | "node_modules/fs-extra": { 176 | "version": "10.1.0", 177 | "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", 178 | "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", 179 | "dev": true, 180 | "dependencies": { 181 | "graceful-fs": "^4.2.0", 182 | "jsonfile": "^6.0.1", 183 | "universalify": "^2.0.0" 184 | }, 185 | "engines": { 186 | "node": ">=12" 187 | } 188 | }, 189 | "node_modules/fsevents": { 190 | "version": "2.3.2", 191 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", 192 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", 193 | "dev": true, 194 | "hasInstallScript": true, 195 | "optional": true, 196 | "os": [ 197 | "darwin" 198 | ], 199 | "peer": true, 200 | "engines": { 201 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 202 | } 203 | }, 204 | "node_modules/graceful-fs": { 205 | "version": "4.2.10", 206 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", 207 | "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", 208 | "dev": true 209 | }, 210 | "node_modules/has-flag": { 211 | "version": "3.0.0", 212 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 213 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 214 | "dev": true, 215 | "engines": { 216 | "node": ">=4" 217 | } 218 | }, 219 | "node_modules/jest-worker": { 220 | "version": "26.6.2", 221 | "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", 222 | "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", 223 | "dev": true, 224 | "dependencies": { 225 | "@types/node": "*", 226 | "merge-stream": "^2.0.0", 227 | "supports-color": "^7.0.0" 228 | }, 229 | "engines": { 230 | "node": ">= 10.13.0" 231 | } 232 | }, 233 | "node_modules/jest-worker/node_modules/has-flag": { 234 | "version": "4.0.0", 235 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 236 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 237 | "dev": true, 238 | "engines": { 239 | "node": ">=8" 240 | } 241 | }, 242 | "node_modules/jest-worker/node_modules/supports-color": { 243 | "version": "7.2.0", 244 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 245 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 246 | "dev": true, 247 | "dependencies": { 248 | "has-flag": "^4.0.0" 249 | }, 250 | "engines": { 251 | "node": ">=8" 252 | } 253 | }, 254 | "node_modules/js-tokens": { 255 | "version": "4.0.0", 256 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 257 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", 258 | "dev": true 259 | }, 260 | "node_modules/jsonfile": { 261 | "version": "6.1.0", 262 | "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", 263 | "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", 264 | "dev": true, 265 | "dependencies": { 266 | "universalify": "^2.0.0" 267 | }, 268 | "optionalDependencies": { 269 | "graceful-fs": "^4.1.6" 270 | } 271 | }, 272 | "node_modules/locate-path": { 273 | "version": "5.0.0", 274 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", 275 | "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", 276 | "dev": true, 277 | "dependencies": { 278 | "p-locate": "^4.1.0" 279 | }, 280 | "engines": { 281 | "node": ">=8" 282 | } 283 | }, 284 | "node_modules/lru-cache": { 285 | "version": "6.0.0", 286 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", 287 | "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", 288 | "dev": true, 289 | "dependencies": { 290 | "yallist": "^4.0.0" 291 | }, 292 | "engines": { 293 | "node": ">=10" 294 | } 295 | }, 296 | "node_modules/make-dir": { 297 | "version": "3.1.0", 298 | "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", 299 | "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", 300 | "dev": true, 301 | "dependencies": { 302 | "semver": "^6.0.0" 303 | }, 304 | "engines": { 305 | "node": ">=8" 306 | }, 307 | "funding": { 308 | "url": "https://github.com/sponsors/sindresorhus" 309 | } 310 | }, 311 | "node_modules/merge-stream": { 312 | "version": "2.0.0", 313 | "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", 314 | "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", 315 | "dev": true 316 | }, 317 | "node_modules/p-limit": { 318 | "version": "2.3.0", 319 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", 320 | "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", 321 | "dev": true, 322 | "dependencies": { 323 | "p-try": "^2.0.0" 324 | }, 325 | "engines": { 326 | "node": ">=6" 327 | }, 328 | "funding": { 329 | "url": "https://github.com/sponsors/sindresorhus" 330 | } 331 | }, 332 | "node_modules/p-locate": { 333 | "version": "4.1.0", 334 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", 335 | "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", 336 | "dev": true, 337 | "dependencies": { 338 | "p-limit": "^2.2.0" 339 | }, 340 | "engines": { 341 | "node": ">=8" 342 | } 343 | }, 344 | "node_modules/p-try": { 345 | "version": "2.2.0", 346 | "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", 347 | "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", 348 | "dev": true, 349 | "engines": { 350 | "node": ">=6" 351 | } 352 | }, 353 | "node_modules/path-exists": { 354 | "version": "4.0.0", 355 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", 356 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", 357 | "dev": true, 358 | "engines": { 359 | "node": ">=8" 360 | } 361 | }, 362 | "node_modules/picomatch": { 363 | "version": "2.3.1", 364 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 365 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 366 | "dev": true, 367 | "engines": { 368 | "node": ">=8.6" 369 | }, 370 | "funding": { 371 | "url": "https://github.com/sponsors/jonschlinkert" 372 | } 373 | }, 374 | "node_modules/pkg-dir": { 375 | "version": "4.2.0", 376 | "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", 377 | "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", 378 | "dev": true, 379 | "dependencies": { 380 | "find-up": "^4.0.0" 381 | }, 382 | "engines": { 383 | "node": ">=8" 384 | } 385 | }, 386 | "node_modules/randombytes": { 387 | "version": "2.1.0", 388 | "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", 389 | "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", 390 | "dev": true, 391 | "dependencies": { 392 | "safe-buffer": "^5.1.0" 393 | } 394 | }, 395 | "node_modules/rollup": { 396 | "version": "2.52.7", 397 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.52.7.tgz", 398 | "integrity": "sha512-55cSH4CCU6MaPr9TAOyrIC+7qFCHscL7tkNsm1MBfIJRRqRbCEY0mmeFn4Wg8FKsHtEH8r389Fz38r/o+kgXLg==", 399 | "dev": true, 400 | "peer": true, 401 | "bin": { 402 | "rollup": "dist/bin/rollup" 403 | }, 404 | "engines": { 405 | "node": ">=10.0.0" 406 | }, 407 | "optionalDependencies": { 408 | "fsevents": "~2.3.2" 409 | } 410 | }, 411 | "node_modules/rollup-plugin-terser": { 412 | "version": "7.0.2", 413 | "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz", 414 | "integrity": "sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==", 415 | "dev": true, 416 | "dependencies": { 417 | "@babel/code-frame": "^7.10.4", 418 | "jest-worker": "^26.2.1", 419 | "serialize-javascript": "^4.0.0", 420 | "terser": "^5.0.0" 421 | }, 422 | "peerDependencies": { 423 | "rollup": "^2.0.0" 424 | } 425 | }, 426 | "node_modules/rollup-plugin-typescript2": { 427 | "version": "0.36.0", 428 | "resolved": "https://registry.npmjs.org/rollup-plugin-typescript2/-/rollup-plugin-typescript2-0.36.0.tgz", 429 | "integrity": "sha512-NB2CSQDxSe9+Oe2ahZbf+B4bh7pHwjV5L+RSYpCu7Q5ROuN94F9b6ioWwKfz3ueL3KTtmX4o2MUH2cgHDIEUsw==", 430 | "dev": true, 431 | "dependencies": { 432 | "@rollup/pluginutils": "^4.1.2", 433 | "find-cache-dir": "^3.3.2", 434 | "fs-extra": "^10.0.0", 435 | "semver": "^7.5.4", 436 | "tslib": "^2.6.2" 437 | }, 438 | "peerDependencies": { 439 | "rollup": ">=1.26.3", 440 | "typescript": ">=2.4.0" 441 | } 442 | }, 443 | "node_modules/rollup-plugin-typescript2/node_modules/semver": { 444 | "version": "7.5.4", 445 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", 446 | "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", 447 | "dev": true, 448 | "dependencies": { 449 | "lru-cache": "^6.0.0" 450 | }, 451 | "bin": { 452 | "semver": "bin/semver.js" 453 | }, 454 | "engines": { 455 | "node": ">=10" 456 | } 457 | }, 458 | "node_modules/safe-buffer": { 459 | "version": "5.2.1", 460 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 461 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 462 | "dev": true, 463 | "funding": [ 464 | { 465 | "type": "github", 466 | "url": "https://github.com/sponsors/feross" 467 | }, 468 | { 469 | "type": "patreon", 470 | "url": "https://www.patreon.com/feross" 471 | }, 472 | { 473 | "type": "consulting", 474 | "url": "https://feross.org/support" 475 | } 476 | ] 477 | }, 478 | "node_modules/semver": { 479 | "version": "6.3.0", 480 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", 481 | "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", 482 | "dev": true, 483 | "bin": { 484 | "semver": "bin/semver.js" 485 | } 486 | }, 487 | "node_modules/serialize-javascript": { 488 | "version": "4.0.0", 489 | "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", 490 | "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", 491 | "dev": true, 492 | "dependencies": { 493 | "randombytes": "^2.1.0" 494 | } 495 | }, 496 | "node_modules/source-map": { 497 | "version": "0.7.3", 498 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", 499 | "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", 500 | "dev": true, 501 | "engines": { 502 | "node": ">= 8" 503 | } 504 | }, 505 | "node_modules/source-map-support": { 506 | "version": "0.5.19", 507 | "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", 508 | "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", 509 | "dev": true, 510 | "dependencies": { 511 | "buffer-from": "^1.0.0", 512 | "source-map": "^0.6.0" 513 | } 514 | }, 515 | "node_modules/source-map-support/node_modules/source-map": { 516 | "version": "0.6.1", 517 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 518 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 519 | "dev": true, 520 | "engines": { 521 | "node": ">=0.10.0" 522 | } 523 | }, 524 | "node_modules/supports-color": { 525 | "version": "5.5.0", 526 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 527 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 528 | "dev": true, 529 | "dependencies": { 530 | "has-flag": "^3.0.0" 531 | }, 532 | "engines": { 533 | "node": ">=4" 534 | } 535 | }, 536 | "node_modules/terser": { 537 | "version": "5.7.1", 538 | "resolved": "https://registry.npmjs.org/terser/-/terser-5.7.1.tgz", 539 | "integrity": "sha512-b3e+d5JbHAe/JSjwsC3Zn55wsBIM7AsHLjKxT31kGCldgbpFePaFo+PiddtO6uwRZWRw7sPXmAN8dTW61xmnSg==", 540 | "dev": true, 541 | "dependencies": { 542 | "commander": "^2.20.0", 543 | "source-map": "~0.7.2", 544 | "source-map-support": "~0.5.19" 545 | }, 546 | "bin": { 547 | "terser": "bin/terser" 548 | }, 549 | "engines": { 550 | "node": ">=10" 551 | } 552 | }, 553 | "node_modules/tslib": { 554 | "version": "2.6.2", 555 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", 556 | "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", 557 | "dev": true 558 | }, 559 | "node_modules/typescript": { 560 | "version": "5.5.2", 561 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.2.tgz", 562 | "integrity": "sha512-NcRtPEOsPFFWjobJEtfihkLCZCXZt/os3zf8nTxjVH3RvTSxjrCamJpbExGvYOF+tFHc3pA65qpdwPbzjohhew==", 563 | "dev": true, 564 | "bin": { 565 | "tsc": "bin/tsc", 566 | "tsserver": "bin/tsserver" 567 | }, 568 | "engines": { 569 | "node": ">=14.17" 570 | } 571 | }, 572 | "node_modules/universalify": { 573 | "version": "2.0.0", 574 | "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", 575 | "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", 576 | "dev": true, 577 | "engines": { 578 | "node": ">= 10.0.0" 579 | } 580 | }, 581 | "node_modules/yallist": { 582 | "version": "4.0.0", 583 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", 584 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", 585 | "dev": true 586 | } 587 | }, 588 | "dependencies": { 589 | "@babel/code-frame": { 590 | "version": "7.14.5", 591 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz", 592 | "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==", 593 | "dev": true, 594 | "requires": { 595 | "@babel/highlight": "^7.14.5" 596 | } 597 | }, 598 | "@babel/helper-validator-identifier": { 599 | "version": "7.14.5", 600 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz", 601 | "integrity": "sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg==", 602 | "dev": true 603 | }, 604 | "@babel/highlight": { 605 | "version": "7.14.5", 606 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", 607 | "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", 608 | "dev": true, 609 | "requires": { 610 | "@babel/helper-validator-identifier": "^7.14.5", 611 | "chalk": "^2.0.0", 612 | "js-tokens": "^4.0.0" 613 | } 614 | }, 615 | "@rollup/pluginutils": { 616 | "version": "4.2.1", 617 | "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.2.1.tgz", 618 | "integrity": "sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==", 619 | "dev": true, 620 | "requires": { 621 | "estree-walker": "^2.0.1", 622 | "picomatch": "^2.2.2" 623 | } 624 | }, 625 | "@types/node": { 626 | "version": "16.0.0", 627 | "resolved": "https://registry.npmjs.org/@types/node/-/node-16.0.0.tgz", 628 | "integrity": "sha512-TmCW5HoZ2o2/z2EYi109jLqIaPIi9y/lc2LmDCWzuCi35bcaQ+OtUh6nwBiFK7SOu25FAU5+YKdqFZUwtqGSdg==", 629 | "dev": true 630 | }, 631 | "ansi-styles": { 632 | "version": "3.2.1", 633 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 634 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 635 | "dev": true, 636 | "requires": { 637 | "color-convert": "^1.9.0" 638 | } 639 | }, 640 | "buffer-from": { 641 | "version": "1.1.1", 642 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", 643 | "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", 644 | "dev": true 645 | }, 646 | "chalk": { 647 | "version": "2.4.2", 648 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 649 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 650 | "dev": true, 651 | "requires": { 652 | "ansi-styles": "^3.2.1", 653 | "escape-string-regexp": "^1.0.5", 654 | "supports-color": "^5.3.0" 655 | } 656 | }, 657 | "color-convert": { 658 | "version": "1.9.3", 659 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 660 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 661 | "dev": true, 662 | "requires": { 663 | "color-name": "1.1.3" 664 | } 665 | }, 666 | "color-name": { 667 | "version": "1.1.3", 668 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 669 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", 670 | "dev": true 671 | }, 672 | "commander": { 673 | "version": "2.20.3", 674 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", 675 | "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", 676 | "dev": true 677 | }, 678 | "commondir": { 679 | "version": "1.0.1", 680 | "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", 681 | "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", 682 | "dev": true 683 | }, 684 | "escape-string-regexp": { 685 | "version": "1.0.5", 686 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 687 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 688 | "dev": true 689 | }, 690 | "estree-walker": { 691 | "version": "2.0.2", 692 | "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", 693 | "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", 694 | "dev": true 695 | }, 696 | "find-cache-dir": { 697 | "version": "3.3.2", 698 | "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", 699 | "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", 700 | "dev": true, 701 | "requires": { 702 | "commondir": "^1.0.1", 703 | "make-dir": "^3.0.2", 704 | "pkg-dir": "^4.1.0" 705 | } 706 | }, 707 | "find-up": { 708 | "version": "4.1.0", 709 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", 710 | "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", 711 | "dev": true, 712 | "requires": { 713 | "locate-path": "^5.0.0", 714 | "path-exists": "^4.0.0" 715 | } 716 | }, 717 | "fs-extra": { 718 | "version": "10.1.0", 719 | "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", 720 | "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", 721 | "dev": true, 722 | "requires": { 723 | "graceful-fs": "^4.2.0", 724 | "jsonfile": "^6.0.1", 725 | "universalify": "^2.0.0" 726 | } 727 | }, 728 | "fsevents": { 729 | "version": "2.3.2", 730 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", 731 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", 732 | "dev": true, 733 | "optional": true, 734 | "peer": true 735 | }, 736 | "graceful-fs": { 737 | "version": "4.2.10", 738 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", 739 | "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", 740 | "dev": true 741 | }, 742 | "has-flag": { 743 | "version": "3.0.0", 744 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 745 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 746 | "dev": true 747 | }, 748 | "jest-worker": { 749 | "version": "26.6.2", 750 | "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", 751 | "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", 752 | "dev": true, 753 | "requires": { 754 | "@types/node": "*", 755 | "merge-stream": "^2.0.0", 756 | "supports-color": "^7.0.0" 757 | }, 758 | "dependencies": { 759 | "has-flag": { 760 | "version": "4.0.0", 761 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 762 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 763 | "dev": true 764 | }, 765 | "supports-color": { 766 | "version": "7.2.0", 767 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 768 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 769 | "dev": true, 770 | "requires": { 771 | "has-flag": "^4.0.0" 772 | } 773 | } 774 | } 775 | }, 776 | "js-tokens": { 777 | "version": "4.0.0", 778 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 779 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", 780 | "dev": true 781 | }, 782 | "jsonfile": { 783 | "version": "6.1.0", 784 | "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", 785 | "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", 786 | "dev": true, 787 | "requires": { 788 | "graceful-fs": "^4.1.6", 789 | "universalify": "^2.0.0" 790 | } 791 | }, 792 | "locate-path": { 793 | "version": "5.0.0", 794 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", 795 | "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", 796 | "dev": true, 797 | "requires": { 798 | "p-locate": "^4.1.0" 799 | } 800 | }, 801 | "lru-cache": { 802 | "version": "6.0.0", 803 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", 804 | "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", 805 | "dev": true, 806 | "requires": { 807 | "yallist": "^4.0.0" 808 | } 809 | }, 810 | "make-dir": { 811 | "version": "3.1.0", 812 | "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", 813 | "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", 814 | "dev": true, 815 | "requires": { 816 | "semver": "^6.0.0" 817 | } 818 | }, 819 | "merge-stream": { 820 | "version": "2.0.0", 821 | "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", 822 | "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", 823 | "dev": true 824 | }, 825 | "p-limit": { 826 | "version": "2.3.0", 827 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", 828 | "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", 829 | "dev": true, 830 | "requires": { 831 | "p-try": "^2.0.0" 832 | } 833 | }, 834 | "p-locate": { 835 | "version": "4.1.0", 836 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", 837 | "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", 838 | "dev": true, 839 | "requires": { 840 | "p-limit": "^2.2.0" 841 | } 842 | }, 843 | "p-try": { 844 | "version": "2.2.0", 845 | "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", 846 | "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", 847 | "dev": true 848 | }, 849 | "path-exists": { 850 | "version": "4.0.0", 851 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", 852 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", 853 | "dev": true 854 | }, 855 | "picomatch": { 856 | "version": "2.3.1", 857 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 858 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 859 | "dev": true 860 | }, 861 | "pkg-dir": { 862 | "version": "4.2.0", 863 | "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", 864 | "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", 865 | "dev": true, 866 | "requires": { 867 | "find-up": "^4.0.0" 868 | } 869 | }, 870 | "randombytes": { 871 | "version": "2.1.0", 872 | "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", 873 | "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", 874 | "dev": true, 875 | "requires": { 876 | "safe-buffer": "^5.1.0" 877 | } 878 | }, 879 | "rollup": { 880 | "version": "2.52.7", 881 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.52.7.tgz", 882 | "integrity": "sha512-55cSH4CCU6MaPr9TAOyrIC+7qFCHscL7tkNsm1MBfIJRRqRbCEY0mmeFn4Wg8FKsHtEH8r389Fz38r/o+kgXLg==", 883 | "dev": true, 884 | "peer": true, 885 | "requires": { 886 | "fsevents": "~2.3.2" 887 | } 888 | }, 889 | "rollup-plugin-terser": { 890 | "version": "7.0.2", 891 | "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz", 892 | "integrity": "sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==", 893 | "dev": true, 894 | "requires": { 895 | "@babel/code-frame": "^7.10.4", 896 | "jest-worker": "^26.2.1", 897 | "serialize-javascript": "^4.0.0", 898 | "terser": "^5.0.0" 899 | } 900 | }, 901 | "rollup-plugin-typescript2": { 902 | "version": "0.36.0", 903 | "resolved": "https://registry.npmjs.org/rollup-plugin-typescript2/-/rollup-plugin-typescript2-0.36.0.tgz", 904 | "integrity": "sha512-NB2CSQDxSe9+Oe2ahZbf+B4bh7pHwjV5L+RSYpCu7Q5ROuN94F9b6ioWwKfz3ueL3KTtmX4o2MUH2cgHDIEUsw==", 905 | "dev": true, 906 | "requires": { 907 | "@rollup/pluginutils": "^4.1.2", 908 | "find-cache-dir": "^3.3.2", 909 | "fs-extra": "^10.0.0", 910 | "semver": "^7.5.4", 911 | "tslib": "^2.6.2" 912 | }, 913 | "dependencies": { 914 | "semver": { 915 | "version": "7.5.4", 916 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", 917 | "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", 918 | "dev": true, 919 | "requires": { 920 | "lru-cache": "^6.0.0" 921 | } 922 | } 923 | } 924 | }, 925 | "safe-buffer": { 926 | "version": "5.2.1", 927 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 928 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 929 | "dev": true 930 | }, 931 | "semver": { 932 | "version": "6.3.0", 933 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", 934 | "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", 935 | "dev": true 936 | }, 937 | "serialize-javascript": { 938 | "version": "4.0.0", 939 | "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", 940 | "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", 941 | "dev": true, 942 | "requires": { 943 | "randombytes": "^2.1.0" 944 | } 945 | }, 946 | "source-map": { 947 | "version": "0.7.3", 948 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", 949 | "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", 950 | "dev": true 951 | }, 952 | "source-map-support": { 953 | "version": "0.5.19", 954 | "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", 955 | "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", 956 | "dev": true, 957 | "requires": { 958 | "buffer-from": "^1.0.0", 959 | "source-map": "^0.6.0" 960 | }, 961 | "dependencies": { 962 | "source-map": { 963 | "version": "0.6.1", 964 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 965 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 966 | "dev": true 967 | } 968 | } 969 | }, 970 | "supports-color": { 971 | "version": "5.5.0", 972 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 973 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 974 | "dev": true, 975 | "requires": { 976 | "has-flag": "^3.0.0" 977 | } 978 | }, 979 | "terser": { 980 | "version": "5.7.1", 981 | "resolved": "https://registry.npmjs.org/terser/-/terser-5.7.1.tgz", 982 | "integrity": "sha512-b3e+d5JbHAe/JSjwsC3Zn55wsBIM7AsHLjKxT31kGCldgbpFePaFo+PiddtO6uwRZWRw7sPXmAN8dTW61xmnSg==", 983 | "dev": true, 984 | "requires": { 985 | "commander": "^2.20.0", 986 | "source-map": "~0.7.2", 987 | "source-map-support": "~0.5.19" 988 | } 989 | }, 990 | "tslib": { 991 | "version": "2.6.2", 992 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", 993 | "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", 994 | "dev": true 995 | }, 996 | "typescript": { 997 | "version": "5.5.2", 998 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.2.tgz", 999 | "integrity": "sha512-NcRtPEOsPFFWjobJEtfihkLCZCXZt/os3zf8nTxjVH3RvTSxjrCamJpbExGvYOF+tFHc3pA65qpdwPbzjohhew==", 1000 | "dev": true 1001 | }, 1002 | "universalify": { 1003 | "version": "2.0.0", 1004 | "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", 1005 | "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", 1006 | "dev": true 1007 | }, 1008 | "yallist": { 1009 | "version": "4.0.0", 1010 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", 1011 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", 1012 | "dev": true 1013 | } 1014 | } 1015 | } 1016 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@ionited/tooltip", 3 | "version": "0.1.8", 4 | "description": "A simple and lightweight tooltip library", 5 | "main": "./dist/tooltip.esm.js", 6 | "module": "./dist/tooltip.esm.js", 7 | "browser": "./dist/tooltip.js", 8 | "types": "./dist/tooltip.d.ts", 9 | "scripts": { 10 | "start": "rollup -c -w", 11 | "build": "rollup -c" 12 | }, 13 | "repository": { 14 | "type": "git", 15 | "url": "git+https://github.com/ionited/tooltip.git" 16 | }, 17 | "keywords": [ 18 | "Tooltip", 19 | "Informative", 20 | "Text" 21 | ], 22 | "author": "Ion", 23 | "license": "MIT", 24 | "bugs": { 25 | "url": "https://github.com/ionited/tooltip/issues" 26 | }, 27 | "homepage": "https://github.com/ionited/tooltip#readme", 28 | "files": [ 29 | "dist/**/*" 30 | ], 31 | "devDependencies": { 32 | "rollup-plugin-terser": "^7.0.2", 33 | "rollup-plugin-typescript2": "^0.36.0", 34 | "typescript": "^5.5.2" 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /rollup.config.js: -------------------------------------------------------------------------------- 1 | import typescript from 'rollup-plugin-typescript2'; 2 | import { terser } from 'rollup-plugin-terser'; 3 | 4 | export default { 5 | input: './src/tooltip.ts', 6 | output: [{ 7 | file:'./dist/tooltip.esm.js', 8 | format: 'esm', 9 | sourcemap: true 10 | }, { 11 | file: './dist/tooltip.js', 12 | format: 'umd', 13 | name: 'window', 14 | sourcemap: true, 15 | extend: true 16 | }], 17 | plugins: [ 18 | typescript(), 19 | terser() 20 | ] 21 | } 22 | -------------------------------------------------------------------------------- /src/core.ts: -------------------------------------------------------------------------------- 1 | export interface TooltipOptions { 2 | content?: string; 3 | contentAttr?: string; 4 | showOnClick: boolean; 5 | } 6 | 7 | export class TooltipCore { 8 | el: HTMLElement; 9 | options: TooltipOptions; 10 | tooltip: HTMLDivElement | null = null; 11 | 12 | private blurFunc = (e: Event) => { 13 | this.activeElement = null; 14 | 15 | this.hide(e); 16 | }; 17 | private focusFunc = this.focus.bind(this); 18 | private hideFunc = (e: Event) => this.hide(e); 19 | private mouseoutFunc = (e: Event) => { 20 | if (e.target !== document.activeElement) this.activeElement = null; 21 | 22 | this.hide(e); 23 | }; 24 | private showFunc = (e: Event) => this.show(e); 25 | private showFuncPrevent = (e: Event) => { 26 | e.preventDefault(); 27 | 28 | this.show(e); 29 | }; 30 | private updateFunc = this.update.bind(this); 31 | private activeElement: Element | null = null; 32 | 33 | constructor(el: HTMLElement, options?: TooltipOptions) { 34 | this.el = el; 35 | this.options = Object.assign({ 36 | contentAttr: 'data-title', 37 | showOnClick: false 38 | }, options); 39 | 40 | this.init(); 41 | 42 | if (!document.querySelector('#io-tooltip-styles')) this.addStyles(); 43 | } 44 | 45 | private addStyles() { 46 | const style = document.createElement('style'); 47 | 48 | style.id = 'io-tooltip-styles'; 49 | style.innerHTML = ` 50 | .io-tooltip { 51 | top: 0; 52 | left: 0; 53 | background-color: #6D6D6D; 54 | border-radius: 0.25em; 55 | color: rgba(255, 255, 255, 0.87); 56 | font-size: 0.8em; 57 | opacity: 0; 58 | padding: 0.5em; 59 | position: fixed; 60 | transition: opacity 0.125s ease-in-out; 61 | } 62 | 63 | .io-tooltip.active { 64 | opacity: 1; 65 | } 66 | `; 67 | 68 | document.head.appendChild(style); 69 | } 70 | 71 | destroy() { 72 | const title = this.el.getAttribute('data-title'); 73 | 74 | if (this.options.contentAttr === 'data-title' && title) { 75 | this.el.setAttribute('title', title); 76 | this.el.removeAttribute('data-title'); 77 | } 78 | 79 | this.el.removeEventListener('blur', this.blurFunc); 80 | document.removeEventListener('scroll', this.updateFunc, true); 81 | window.removeEventListener('orientationchange', this.updateFunc); 82 | 83 | if (this.isTouch()) { 84 | document.removeEventListener('click', this.hideFunc); 85 | 86 | this.el.removeEventListener('contextmenu', this.showFuncPrevent); 87 | } else { 88 | this.el.removeEventListener('focus', this.showFunc); 89 | this.el.removeEventListener('mouseover', this.showFunc); 90 | this.el.removeEventListener('mouseout', this.mouseoutFunc); 91 | 92 | document.removeEventListener('keydown', this.focusFunc); 93 | } 94 | 95 | if (this.options.showOnClick) this.el.removeEventListener('click', this.showFunc); 96 | } 97 | 98 | private focus(e: KeyboardEvent) { 99 | if (e.key === 'Tab') setTimeout(() => this.activeElement = document.activeElement); 100 | } 101 | 102 | private getContent() { 103 | let title = this.el.getAttribute('title'); 104 | 105 | if (this.options.contentAttr === 'data-title' && title) { 106 | this.el.setAttribute('data-title', title); 107 | this.el.removeAttribute('title'); 108 | } else title = this.el.getAttribute(this.options.contentAttr as string); 109 | 110 | return title; 111 | } 112 | 113 | private getPosition() { 114 | const 115 | elRect = this.el.getBoundingClientRect(), 116 | tooltipRect = (this.tooltip as HTMLDivElement).getBoundingClientRect(); 117 | 118 | let position = { 119 | x: elRect.left + elRect.width / 2 - tooltipRect.width / 2, 120 | y: elRect.top > window.innerHeight / 2 ? elRect.top - tooltipRect.height - 8 : elRect.top + elRect.height + 8 121 | } 122 | 123 | if (position.x < 0 && elRect.left <= window.innerWidth / 2) position.x = elRect.left; 124 | 125 | if (position.x + tooltipRect.width > window.innerWidth) position.x = elRect.right - tooltipRect.width; 126 | 127 | return position; 128 | } 129 | 130 | hide(e: Event) { 131 | if (!this.tooltip || this.activeElement === this.el || this.el.contains(this.activeElement) || ((e as MouseEvent).relatedTarget && this.el.contains((e as MouseEvent).relatedTarget as Node))) return; 132 | 133 | let tooltip: HTMLDivElement | null = this.tooltip; 134 | 135 | this.tooltip = null; 136 | 137 | tooltip.classList.remove('active'); 138 | tooltip.ontransitionend = () => { 139 | tooltip?.remove(); 140 | tooltip = null; 141 | } 142 | 143 | setTimeout(() => { 144 | if (tooltip) tooltip.remove(); 145 | }, 125); 146 | } 147 | 148 | private init() { 149 | this.el.addEventListener('blur', this.blurFunc, true); 150 | document.addEventListener('scroll', this.updateFunc, true); 151 | window.addEventListener('orientationchange', this.updateFunc); 152 | 153 | if (this.isTouch()) { 154 | document.addEventListener('click', this.hideFunc); 155 | 156 | this.el.addEventListener('contextmenu', this.showFuncPrevent); 157 | } else { 158 | this.el.addEventListener('focus', this.showFunc); 159 | this.el.addEventListener('mouseover', this.showFunc); 160 | this.el.addEventListener('mouseout', this.mouseoutFunc); 161 | 162 | document.addEventListener('keydown', this.focusFunc); 163 | } 164 | 165 | if (this.options.showOnClick) this.el.addEventListener('click', this.showFunc); 166 | } 167 | 168 | private isTouch = () => 'ontouchstart' in window || (navigator as any).msMaxTouchPoints; 169 | 170 | show(e: Event) { 171 | if (this.tooltip) return; 172 | 173 | const 174 | tooltip = document.createElement('div'), 175 | content = this.options.content ?? this.getContent() as string; 176 | 177 | tooltip.className = 'io-tooltip'; 178 | tooltip.innerHTML = content; 179 | 180 | document.body.appendChild(tooltip); 181 | 182 | this.activeElement = e.target as Element; 183 | this.tooltip = tooltip; 184 | 185 | this.update(); 186 | } 187 | 188 | update() { 189 | if (!this.tooltip) return; 190 | 191 | const position = this.getPosition(); 192 | 193 | this.tooltip.style.transform = `translate(${position.x}px, ${position.y}px)`; 194 | this.tooltip.classList.add('active'); 195 | } 196 | } 197 | -------------------------------------------------------------------------------- /src/tooltip.ts: -------------------------------------------------------------------------------- 1 | import { TooltipCore, TooltipOptions } from './core'; 2 | 3 | export function Tooltip(el: HTMLElement, options?: TooltipOptions) { 4 | return new TooltipCore(el, options); 5 | } 6 | -------------------------------------------------------------------------------- /tests/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |
4 | 5 | 6 | 7 |