├── .gitignore ├── LICENSE ├── README.md ├── eslint.config.js ├── package.json ├── pnpm-lock.yaml ├── src ├── baseAnimations.ts ├── defaults.ts ├── index.d.ts ├── index.ts ├── keyframes.ts ├── modifiers.ts ├── presets.ts └── types │ └── tailwind-internals.d.ts ├── tsconfig.json ├── tsup.config.ts └── web ├── .gitignore ├── .vscode ├── extensions.json └── launch.json ├── README.md ├── astro.config.mjs ├── package.json ├── pnpm-lock.yaml ├── public └── favicon.svg ├── src ├── env.d.ts └── pages │ └── index.astro ├── tailwind.config.mjs └── tsconfig.json /.gitignore: -------------------------------------------------------------------------------- 1 | /node_modules 2 | .vscode 3 | /dist 4 | *.tsbuildinfo 5 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2024 Rombo Limited 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 | # ✨ [tailwindcss-motion](https://rombo.co/tailwind/) ✨ 2 | 3 | [![NPM Version](https://img.shields.io/npm/v/tailwindcss-motion?color=F3FC6F)](https://www.npmjs.com/package/tailwindcss-motion) 4 | [![NPM Downloads](https://img.shields.io/npm/dw/tailwindcss-motion?color=F3FC6F)](https://www.npmjs.com/package/tailwindcss-motion) 5 | 6 | tailwindcss-motion is a Tailwind CSS Plugin made at [RomboHQ](https://rombo.co/). 7 | It’s a simple, yet powerful, animation library with a simple syntax. 8 | 9 | _Motion, without commotion._ 10 | 11 | ## ⚒️ Installation 12 | 13 | **1. Install npm package** 14 | 15 | ```bash 16 | npm i -D tailwindcss-motion 17 | ``` 18 | 19 | **2. Add into your tailwind.config.js** 20 | 21 | ```js 22 | // tailwind.config.js 23 | 24 | export default { 25 | content: [...], 26 | theme: { 27 | extend: {...}, 28 | }, 29 | plugins: [require('tailwindcss-motion')], 30 | }; 31 | ``` 32 | 33 | **or,** to use ESM: 34 | 35 | ```js 36 | import tailwindcssMotion from "tailwindcss-motion"; 37 | 38 | /** @type {import('tailwindcss').Config} */ 39 | export default { 40 | content: [...], 41 | theme: { 42 | extend: {}, 43 | }, 44 | plugins: [tailwindcssMotion], 45 | }; 46 | ``` 47 | 48 | ## 📝 TypeScript Support 49 | 50 | The plugin includes TypeScript definitions out of the box. Theme customizations and plugin configuration are fully typed: 51 | 52 | ```ts 53 | import type { Config } from "tailwindcss"; 54 | import motion from "tailwindcss-motion"; 55 | 56 | const config: Config = { 57 | theme: { 58 | extend: { 59 | motionScale: { 60 | "200": "200%", 61 | }, 62 | motionTimingFunction: { 63 | custom: "cubic-bezier(0.4, 0, 0.2, 1)", 64 | }, 65 | }, 66 | }, 67 | plugins: [motion], 68 | }; 69 | ``` 70 | 71 | ## How does it work? 72 | 73 | We provide a simple syntax to animate any element in your Tailwind project. Instead of defining custom keyframes, we provide utility classes to animate every dimension, inline. 74 | 75 | For example, for a slide and fade effect — you simply need `motion-translate-x-in-25 motion-opacity-in-0` or, you can use one of our presets with `motion-preset-fade` 76 | 77 | ## Documentation 78 | 79 | For full documentation, visit [docs.rombo.co/tailwind](https://docs.rombo.co/tailwind) 80 | 81 | ## 🧩 Introducing the Chrome Extension 82 | 83 | Take your animations to the next level with the [Rombo Chrome Extension](https://rombo.co/extension/)! 84 | 85 | Create animations visually: 86 | 87 | - Use our intuitive animator directly in your browser. 88 | - Loop animations 89 | - Save presets: Keep your animations organized and reusable. 90 | - Export options: Output animations as Tailwind classes, pure CSS, or Framer Motion code. 91 | 92 | ![extension](https://github.com/user-attachments/assets/68a751f7-00a5-449e-a92d-f5499d3b9152) 93 | 94 | ## Examples 95 | 96 | Landing page - https://play.tailwindcss.com/uAuVF8F1vC 97 | 98 | ![example-1](https://github.com/user-attachments/assets/c847e7ee-f5b6-4620-afdc-2f8b037c36fd) 99 | 100 | Chat dialog - https://play.tailwindcss.com/gjGqEKswjQ 101 | 102 | ![example-2](https://github.com/user-attachments/assets/f11fbe59-7902-4d73-ab13-0e20ca7cc21b) 103 | 104 | Low Battery Dynamic Island - https://play.tailwindcss.com/tvYFbHtNNQ 105 | 106 | ![example-3](https://github.com/user-attachments/assets/5f1e67d7-5f93-46d5-badb-ab1d3d526efc) 107 | 108 | Apple Color Swatches - https://play.tailwindcss.com/cvQ3Nk3v8j 109 | 110 | ![example-4](https://github.com/user-attachments/assets/887fba04-9642-4a4f-8ace-7375a4aa65b6) 111 | 112 | Rombo Loop - https://play.tailwindcss.com/MLdegkb9Wq 113 | 114 | ![example-5](https://github.com/user-attachments/assets/7138fb7a-d622-4590-92b5-6682806797e0) 115 | 116 | Emoji Animations - https://play.tailwindcss.com/86s55I4wmC 117 | 118 | ![example-6](https://github.com/user-attachments/assets/3143dc8c-99c1-4df7-8709-a52b67d2824a) 119 | 120 | ## What's Rombo? 121 | 122 | Rombo is an early-stage company, building tools to help companies build beautiful interactive interfaces. We're starting out with a toolkit for engineers, designers and creative marketers to animate natively inside common Workflows — like Tailwind, Figma, Webflow, Shopify & more to come! 123 | 124 | ## More Resources 125 | 126 | - [Bringing Motion to Tailwind CSS: Building an animation plugin at Rombo](https://www.kvin.me/posts/tailwind-motion) - Blog post about the creation of this library 127 | - [Animator Builder](https://rombo.co/tailwind/#animator) - Create animations intuitively and export them to Tailwind classes 128 | - [UnoCSS port](https://github.com/whatnickcodes/unocss-preset-tailwindcss-motion) - Port created by [@whatnickcodes](https://github.com/whatnickcodes) 129 | -------------------------------------------------------------------------------- /eslint.config.js: -------------------------------------------------------------------------------- 1 | import pluginJs from "@eslint/js"; 2 | import globals from "globals"; 3 | import tseslint from "typescript-eslint"; 4 | 5 | /** @type {import('eslint').Linter.Config[]} */ 6 | export default [ 7 | { files: ["**/*.{js,mjs,cjs,ts}"] }, 8 | { languageOptions: { globals: { ...globals.browser, ...globals.node } } }, 9 | pluginJs.configs.recommended, 10 | ...tseslint.configs.recommended, 11 | ]; 12 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "tailwindcss-motion", 3 | "version": "1.1.0", 4 | "description": "Tailwind Motion is a Tailwind CSS Plugin made by Rombo. It’s a simple, yet powerful, animation library for Tailwind CSS.", 5 | "keywords": [ 6 | "tailwindcss", 7 | "tailwind", 8 | "plugin", 9 | "animation", 10 | "preset", 11 | "motion", 12 | "animate", 13 | "css", 14 | "design" 15 | ], 16 | "author": "Rombo (https://rombo.co/)", 17 | "homepage": "https://rombo.co/tailwind/", 18 | "main": "dist/index.cjs", 19 | "types": "dist/index.d.ts", 20 | "exports": { 21 | ".": { 22 | "types": "./dist/index.d.ts", 23 | "import": "./dist/index.js", 24 | "require": "./dist/index.cjs" 25 | } 26 | }, 27 | "bugs": { 28 | "url": "https://github.com/romboHQ/tailwindcss-motion/issues" 29 | }, 30 | "scripts": { 31 | "typecheck": "tsc", 32 | "build": "tsup", 33 | "prepublishOnly": "pnpm run build", 34 | "prepare": "pnpm run build" 35 | }, 36 | "repository": { 37 | "type": "git", 38 | "url": "git+https://github.com/romboHQ/tailwindcss-motion.git" 39 | }, 40 | "license": "MIT", 41 | "files": [ 42 | "dist/", 43 | "src/" 44 | ], 45 | "type": "module", 46 | "devDependencies": { 47 | "@eslint/js": "^9.18.0", 48 | "@types/node": "^22.10.7", 49 | "@types/react": "^19.0.7", 50 | "@types/react-dom": "^19.0.3", 51 | "eslint": "^9.18.0", 52 | "globals": "^15.14.0", 53 | "tailwindcss": "^3.4.17", 54 | "tsup": "^8.3.5", 55 | "typescript": "^5.7.3", 56 | "typescript-eslint": "^8.20.0" 57 | }, 58 | "peerDependencies": { 59 | "tailwindcss": ">=3.0.0 || insiders" 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '9.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | importers: 8 | 9 | .: 10 | devDependencies: 11 | '@eslint/js': 12 | specifier: ^9.18.0 13 | version: 9.18.0 14 | '@types/node': 15 | specifier: ^22.10.7 16 | version: 22.10.7 17 | '@types/react': 18 | specifier: ^19.0.7 19 | version: 19.0.7 20 | '@types/react-dom': 21 | specifier: ^19.0.3 22 | version: 19.0.3(@types/react@19.0.7) 23 | eslint: 24 | specifier: ^9.18.0 25 | version: 9.18.0(jiti@1.21.7) 26 | globals: 27 | specifier: ^15.14.0 28 | version: 15.14.0 29 | tailwindcss: 30 | specifier: ^3.4.17 31 | version: 3.4.17 32 | tsup: 33 | specifier: ^8.3.5 34 | version: 8.3.5(jiti@1.21.7)(postcss@8.5.1)(typescript@5.7.3)(yaml@2.7.0) 35 | typescript: 36 | specifier: ^5.7.3 37 | version: 5.7.3 38 | typescript-eslint: 39 | specifier: ^8.20.0 40 | version: 8.20.0(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3) 41 | 42 | packages: 43 | 44 | '@alloc/quick-lru@5.2.0': 45 | resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} 46 | engines: {node: '>=10'} 47 | 48 | '@esbuild/aix-ppc64@0.24.2': 49 | resolution: {integrity: sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==} 50 | engines: {node: '>=18'} 51 | cpu: [ppc64] 52 | os: [aix] 53 | 54 | '@esbuild/android-arm64@0.24.2': 55 | resolution: {integrity: sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==} 56 | engines: {node: '>=18'} 57 | cpu: [arm64] 58 | os: [android] 59 | 60 | '@esbuild/android-arm@0.24.2': 61 | resolution: {integrity: sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==} 62 | engines: {node: '>=18'} 63 | cpu: [arm] 64 | os: [android] 65 | 66 | '@esbuild/android-x64@0.24.2': 67 | resolution: {integrity: sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==} 68 | engines: {node: '>=18'} 69 | cpu: [x64] 70 | os: [android] 71 | 72 | '@esbuild/darwin-arm64@0.24.2': 73 | resolution: {integrity: sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==} 74 | engines: {node: '>=18'} 75 | cpu: [arm64] 76 | os: [darwin] 77 | 78 | '@esbuild/darwin-x64@0.24.2': 79 | resolution: {integrity: sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==} 80 | engines: {node: '>=18'} 81 | cpu: [x64] 82 | os: [darwin] 83 | 84 | '@esbuild/freebsd-arm64@0.24.2': 85 | resolution: {integrity: sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==} 86 | engines: {node: '>=18'} 87 | cpu: [arm64] 88 | os: [freebsd] 89 | 90 | '@esbuild/freebsd-x64@0.24.2': 91 | resolution: {integrity: sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==} 92 | engines: {node: '>=18'} 93 | cpu: [x64] 94 | os: [freebsd] 95 | 96 | '@esbuild/linux-arm64@0.24.2': 97 | resolution: {integrity: sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==} 98 | engines: {node: '>=18'} 99 | cpu: [arm64] 100 | os: [linux] 101 | 102 | '@esbuild/linux-arm@0.24.2': 103 | resolution: {integrity: sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==} 104 | engines: {node: '>=18'} 105 | cpu: [arm] 106 | os: [linux] 107 | 108 | '@esbuild/linux-ia32@0.24.2': 109 | resolution: {integrity: sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==} 110 | engines: {node: '>=18'} 111 | cpu: [ia32] 112 | os: [linux] 113 | 114 | '@esbuild/linux-loong64@0.24.2': 115 | resolution: {integrity: sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==} 116 | engines: {node: '>=18'} 117 | cpu: [loong64] 118 | os: [linux] 119 | 120 | '@esbuild/linux-mips64el@0.24.2': 121 | resolution: {integrity: sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==} 122 | engines: {node: '>=18'} 123 | cpu: [mips64el] 124 | os: [linux] 125 | 126 | '@esbuild/linux-ppc64@0.24.2': 127 | resolution: {integrity: sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==} 128 | engines: {node: '>=18'} 129 | cpu: [ppc64] 130 | os: [linux] 131 | 132 | '@esbuild/linux-riscv64@0.24.2': 133 | resolution: {integrity: sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==} 134 | engines: {node: '>=18'} 135 | cpu: [riscv64] 136 | os: [linux] 137 | 138 | '@esbuild/linux-s390x@0.24.2': 139 | resolution: {integrity: sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==} 140 | engines: {node: '>=18'} 141 | cpu: [s390x] 142 | os: [linux] 143 | 144 | '@esbuild/linux-x64@0.24.2': 145 | resolution: {integrity: sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==} 146 | engines: {node: '>=18'} 147 | cpu: [x64] 148 | os: [linux] 149 | 150 | '@esbuild/netbsd-arm64@0.24.2': 151 | resolution: {integrity: sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==} 152 | engines: {node: '>=18'} 153 | cpu: [arm64] 154 | os: [netbsd] 155 | 156 | '@esbuild/netbsd-x64@0.24.2': 157 | resolution: {integrity: sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==} 158 | engines: {node: '>=18'} 159 | cpu: [x64] 160 | os: [netbsd] 161 | 162 | '@esbuild/openbsd-arm64@0.24.2': 163 | resolution: {integrity: sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==} 164 | engines: {node: '>=18'} 165 | cpu: [arm64] 166 | os: [openbsd] 167 | 168 | '@esbuild/openbsd-x64@0.24.2': 169 | resolution: {integrity: sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==} 170 | engines: {node: '>=18'} 171 | cpu: [x64] 172 | os: [openbsd] 173 | 174 | '@esbuild/sunos-x64@0.24.2': 175 | resolution: {integrity: sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==} 176 | engines: {node: '>=18'} 177 | cpu: [x64] 178 | os: [sunos] 179 | 180 | '@esbuild/win32-arm64@0.24.2': 181 | resolution: {integrity: sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==} 182 | engines: {node: '>=18'} 183 | cpu: [arm64] 184 | os: [win32] 185 | 186 | '@esbuild/win32-ia32@0.24.2': 187 | resolution: {integrity: sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==} 188 | engines: {node: '>=18'} 189 | cpu: [ia32] 190 | os: [win32] 191 | 192 | '@esbuild/win32-x64@0.24.2': 193 | resolution: {integrity: sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==} 194 | engines: {node: '>=18'} 195 | cpu: [x64] 196 | os: [win32] 197 | 198 | '@eslint-community/eslint-utils@4.4.1': 199 | resolution: {integrity: sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==} 200 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 201 | peerDependencies: 202 | eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 203 | 204 | '@eslint-community/regexpp@4.12.1': 205 | resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} 206 | engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} 207 | 208 | '@eslint/config-array@0.19.1': 209 | resolution: {integrity: sha512-fo6Mtm5mWyKjA/Chy1BYTdn5mGJoDNjC7C64ug20ADsRDGrA85bN3uK3MaKbeRkRuuIEAR5N33Jr1pbm411/PA==} 210 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 211 | 212 | '@eslint/core@0.10.0': 213 | resolution: {integrity: sha512-gFHJ+xBOo4G3WRlR1e/3G8A6/KZAH6zcE/hkLRCZTi/B9avAG365QhFA8uOGzTMqgTghpn7/fSnscW++dpMSAw==} 214 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 215 | 216 | '@eslint/eslintrc@3.2.0': 217 | resolution: {integrity: sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==} 218 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 219 | 220 | '@eslint/js@9.18.0': 221 | resolution: {integrity: sha512-fK6L7rxcq6/z+AaQMtiFTkvbHkBLNlwyRxHpKawP0x3u9+NC6MQTnFW+AdpwC6gfHTW0051cokQgtTN2FqlxQA==} 222 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 223 | 224 | '@eslint/object-schema@2.1.5': 225 | resolution: {integrity: sha512-o0bhxnL89h5Bae5T318nFoFzGy+YE5i/gGkoPAgkmTVdRKTiv3p8JHevPiPaMwoloKfEiiaHlawCqaZMqRm+XQ==} 226 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 227 | 228 | '@eslint/plugin-kit@0.2.5': 229 | resolution: {integrity: sha512-lB05FkqEdUg2AA0xEbUz0SnkXT1LcCTa438W4IWTUh4hdOnVbQyOJ81OrDXsJk/LSiJHubgGEFoR5EHq1NsH1A==} 230 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 231 | 232 | '@humanfs/core@0.19.1': 233 | resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} 234 | engines: {node: '>=18.18.0'} 235 | 236 | '@humanfs/node@0.16.6': 237 | resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==} 238 | engines: {node: '>=18.18.0'} 239 | 240 | '@humanwhocodes/module-importer@1.0.1': 241 | resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} 242 | engines: {node: '>=12.22'} 243 | 244 | '@humanwhocodes/retry@0.3.1': 245 | resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} 246 | engines: {node: '>=18.18'} 247 | 248 | '@humanwhocodes/retry@0.4.1': 249 | resolution: {integrity: sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==} 250 | engines: {node: '>=18.18'} 251 | 252 | '@isaacs/cliui@8.0.2': 253 | resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} 254 | engines: {node: '>=12'} 255 | 256 | '@jridgewell/gen-mapping@0.3.8': 257 | resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} 258 | engines: {node: '>=6.0.0'} 259 | 260 | '@jridgewell/resolve-uri@3.1.2': 261 | resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} 262 | engines: {node: '>=6.0.0'} 263 | 264 | '@jridgewell/set-array@1.2.1': 265 | resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} 266 | engines: {node: '>=6.0.0'} 267 | 268 | '@jridgewell/sourcemap-codec@1.5.0': 269 | resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} 270 | 271 | '@jridgewell/trace-mapping@0.3.25': 272 | resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} 273 | 274 | '@nodelib/fs.scandir@2.1.5': 275 | resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} 276 | engines: {node: '>= 8'} 277 | 278 | '@nodelib/fs.stat@2.0.5': 279 | resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} 280 | engines: {node: '>= 8'} 281 | 282 | '@nodelib/fs.walk@1.2.8': 283 | resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} 284 | engines: {node: '>= 8'} 285 | 286 | '@pkgjs/parseargs@0.11.0': 287 | resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} 288 | engines: {node: '>=14'} 289 | 290 | '@rollup/rollup-android-arm-eabi@4.30.1': 291 | resolution: {integrity: sha512-pSWY+EVt3rJ9fQ3IqlrEUtXh3cGqGtPDH1FQlNZehO2yYxCHEX1SPsz1M//NXwYfbTlcKr9WObLnJX9FsS9K1Q==} 292 | cpu: [arm] 293 | os: [android] 294 | 295 | '@rollup/rollup-android-arm64@4.30.1': 296 | resolution: {integrity: sha512-/NA2qXxE3D/BRjOJM8wQblmArQq1YoBVJjrjoTSBS09jgUisq7bqxNHJ8kjCHeV21W/9WDGwJEWSN0KQ2mtD/w==} 297 | cpu: [arm64] 298 | os: [android] 299 | 300 | '@rollup/rollup-darwin-arm64@4.30.1': 301 | resolution: {integrity: sha512-r7FQIXD7gB0WJ5mokTUgUWPl0eYIH0wnxqeSAhuIwvnnpjdVB8cRRClyKLQr7lgzjctkbp5KmswWszlwYln03Q==} 302 | cpu: [arm64] 303 | os: [darwin] 304 | 305 | '@rollup/rollup-darwin-x64@4.30.1': 306 | resolution: {integrity: sha512-x78BavIwSH6sqfP2xeI1hd1GpHL8J4W2BXcVM/5KYKoAD3nNsfitQhvWSw+TFtQTLZ9OmlF+FEInEHyubut2OA==} 307 | cpu: [x64] 308 | os: [darwin] 309 | 310 | '@rollup/rollup-freebsd-arm64@4.30.1': 311 | resolution: {integrity: sha512-HYTlUAjbO1z8ywxsDFWADfTRfTIIy/oUlfIDmlHYmjUP2QRDTzBuWXc9O4CXM+bo9qfiCclmHk1x4ogBjOUpUQ==} 312 | cpu: [arm64] 313 | os: [freebsd] 314 | 315 | '@rollup/rollup-freebsd-x64@4.30.1': 316 | resolution: {integrity: sha512-1MEdGqogQLccphhX5myCJqeGNYTNcmTyaic9S7CG3JhwuIByJ7J05vGbZxsizQthP1xpVx7kd3o31eOogfEirw==} 317 | cpu: [x64] 318 | os: [freebsd] 319 | 320 | '@rollup/rollup-linux-arm-gnueabihf@4.30.1': 321 | resolution: {integrity: sha512-PaMRNBSqCx7K3Wc9QZkFx5+CX27WFpAMxJNiYGAXfmMIKC7jstlr32UhTgK6T07OtqR+wYlWm9IxzennjnvdJg==} 322 | cpu: [arm] 323 | os: [linux] 324 | 325 | '@rollup/rollup-linux-arm-musleabihf@4.30.1': 326 | resolution: {integrity: sha512-B8Rcyj9AV7ZlEFqvB5BubG5iO6ANDsRKlhIxySXcF1axXYUyqwBok+XZPgIYGBgs7LDXfWfifxhw0Ik57T0Yug==} 327 | cpu: [arm] 328 | os: [linux] 329 | 330 | '@rollup/rollup-linux-arm64-gnu@4.30.1': 331 | resolution: {integrity: sha512-hqVyueGxAj3cBKrAI4aFHLV+h0Lv5VgWZs9CUGqr1z0fZtlADVV1YPOij6AhcK5An33EXaxnDLmJdQikcn5NEw==} 332 | cpu: [arm64] 333 | os: [linux] 334 | 335 | '@rollup/rollup-linux-arm64-musl@4.30.1': 336 | resolution: {integrity: sha512-i4Ab2vnvS1AE1PyOIGp2kXni69gU2DAUVt6FSXeIqUCPIR3ZlheMW3oP2JkukDfu3PsexYRbOiJrY+yVNSk9oA==} 337 | cpu: [arm64] 338 | os: [linux] 339 | 340 | '@rollup/rollup-linux-loongarch64-gnu@4.30.1': 341 | resolution: {integrity: sha512-fARcF5g296snX0oLGkVxPmysetwUk2zmHcca+e9ObOovBR++9ZPOhqFUM61UUZ2EYpXVPN1redgqVoBB34nTpQ==} 342 | cpu: [loong64] 343 | os: [linux] 344 | 345 | '@rollup/rollup-linux-powerpc64le-gnu@4.30.1': 346 | resolution: {integrity: sha512-GLrZraoO3wVT4uFXh67ElpwQY0DIygxdv0BNW9Hkm3X34wu+BkqrDrkcsIapAY+N2ATEbvak0XQ9gxZtCIA5Rw==} 347 | cpu: [ppc64] 348 | os: [linux] 349 | 350 | '@rollup/rollup-linux-riscv64-gnu@4.30.1': 351 | resolution: {integrity: sha512-0WKLaAUUHKBtll0wvOmh6yh3S0wSU9+yas923JIChfxOaaBarmb/lBKPF0w/+jTVozFnOXJeRGZ8NvOxvk/jcw==} 352 | cpu: [riscv64] 353 | os: [linux] 354 | 355 | '@rollup/rollup-linux-s390x-gnu@4.30.1': 356 | resolution: {integrity: sha512-GWFs97Ruxo5Bt+cvVTQkOJ6TIx0xJDD/bMAOXWJg8TCSTEK8RnFeOeiFTxKniTc4vMIaWvCplMAFBt9miGxgkA==} 357 | cpu: [s390x] 358 | os: [linux] 359 | 360 | '@rollup/rollup-linux-x64-gnu@4.30.1': 361 | resolution: {integrity: sha512-UtgGb7QGgXDIO+tqqJ5oZRGHsDLO8SlpE4MhqpY9Llpzi5rJMvrK6ZGhsRCST2abZdBqIBeXW6WPD5fGK5SDwg==} 362 | cpu: [x64] 363 | os: [linux] 364 | 365 | '@rollup/rollup-linux-x64-musl@4.30.1': 366 | resolution: {integrity: sha512-V9U8Ey2UqmQsBT+xTOeMzPzwDzyXmnAoO4edZhL7INkwQcaW1Ckv3WJX3qrrp/VHaDkEWIBWhRwP47r8cdrOow==} 367 | cpu: [x64] 368 | os: [linux] 369 | 370 | '@rollup/rollup-win32-arm64-msvc@4.30.1': 371 | resolution: {integrity: sha512-WabtHWiPaFF47W3PkHnjbmWawnX/aE57K47ZDT1BXTS5GgrBUEpvOzq0FI0V/UYzQJgdb8XlhVNH8/fwV8xDjw==} 372 | cpu: [arm64] 373 | os: [win32] 374 | 375 | '@rollup/rollup-win32-ia32-msvc@4.30.1': 376 | resolution: {integrity: sha512-pxHAU+Zv39hLUTdQQHUVHf4P+0C47y/ZloorHpzs2SXMRqeAWmGghzAhfOlzFHHwjvgokdFAhC4V+6kC1lRRfw==} 377 | cpu: [ia32] 378 | os: [win32] 379 | 380 | '@rollup/rollup-win32-x64-msvc@4.30.1': 381 | resolution: {integrity: sha512-D6qjsXGcvhTjv0kI4fU8tUuBDF/Ueee4SVX79VfNDXZa64TfCW1Slkb6Z7O1p7vflqZjcmOVdZlqf8gvJxc6og==} 382 | cpu: [x64] 383 | os: [win32] 384 | 385 | '@types/estree@1.0.6': 386 | resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} 387 | 388 | '@types/json-schema@7.0.15': 389 | resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} 390 | 391 | '@types/node@22.10.7': 392 | resolution: {integrity: sha512-V09KvXxFiutGp6B7XkpaDXlNadZxrzajcY50EuoLIpQ6WWYCSvf19lVIazzfIzQvhUN2HjX12spLojTnhuKlGg==} 393 | 394 | '@types/react-dom@19.0.3': 395 | resolution: {integrity: sha512-0Knk+HJiMP/qOZgMyNFamlIjw9OFCsyC2ZbigmEEyXXixgre6IQpm/4V+r3qH4GC1JPvRJKInw+on2rV6YZLeA==} 396 | peerDependencies: 397 | '@types/react': ^19.0.0 398 | 399 | '@types/react@19.0.7': 400 | resolution: {integrity: sha512-MoFsEJKkAtZCrC1r6CM8U22GzhG7u2Wir8ons/aCKH6MBdD1ibV24zOSSkdZVUKqN5i396zG5VKLYZ3yaUZdLA==} 401 | 402 | '@typescript-eslint/eslint-plugin@8.20.0': 403 | resolution: {integrity: sha512-naduuphVw5StFfqp4Gq4WhIBE2gN1GEmMUExpJYknZJdRnc+2gDzB8Z3+5+/Kv33hPQRDGzQO/0opHE72lZZ6A==} 404 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 405 | peerDependencies: 406 | '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 407 | eslint: ^8.57.0 || ^9.0.0 408 | typescript: '>=4.8.4 <5.8.0' 409 | 410 | '@typescript-eslint/parser@8.20.0': 411 | resolution: {integrity: sha512-gKXG7A5HMyjDIedBi6bUrDcun8GIjnI8qOwVLiY3rx6T/sHP/19XLJOnIq/FgQvWLHja5JN/LSE7eklNBr612g==} 412 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 413 | peerDependencies: 414 | eslint: ^8.57.0 || ^9.0.0 415 | typescript: '>=4.8.4 <5.8.0' 416 | 417 | '@typescript-eslint/scope-manager@8.20.0': 418 | resolution: {integrity: sha512-J7+VkpeGzhOt3FeG1+SzhiMj9NzGD/M6KoGn9f4dbz3YzK9hvbhVTmLj/HiTp9DazIzJ8B4XcM80LrR9Dm1rJw==} 419 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 420 | 421 | '@typescript-eslint/type-utils@8.20.0': 422 | resolution: {integrity: sha512-bPC+j71GGvA7rVNAHAtOjbVXbLN5PkwqMvy1cwGeaxUoRQXVuKCebRoLzm+IPW/NtFFpstn1ummSIasD5t60GA==} 423 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 424 | peerDependencies: 425 | eslint: ^8.57.0 || ^9.0.0 426 | typescript: '>=4.8.4 <5.8.0' 427 | 428 | '@typescript-eslint/types@8.20.0': 429 | resolution: {integrity: sha512-cqaMiY72CkP+2xZRrFt3ExRBu0WmVitN/rYPZErA80mHjHx/Svgp8yfbzkJmDoQ/whcytOPO9/IZXnOc+wigRA==} 430 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 431 | 432 | '@typescript-eslint/typescript-estree@8.20.0': 433 | resolution: {integrity: sha512-Y7ncuy78bJqHI35NwzWol8E0X7XkRVS4K4P4TCyzWkOJih5NDvtoRDW4Ba9YJJoB2igm9yXDdYI/+fkiiAxPzA==} 434 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 435 | peerDependencies: 436 | typescript: '>=4.8.4 <5.8.0' 437 | 438 | '@typescript-eslint/utils@8.20.0': 439 | resolution: {integrity: sha512-dq70RUw6UK9ei7vxc4KQtBRk7qkHZv447OUZ6RPQMQl71I3NZxQJX/f32Smr+iqWrB02pHKn2yAdHBb0KNrRMA==} 440 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 441 | peerDependencies: 442 | eslint: ^8.57.0 || ^9.0.0 443 | typescript: '>=4.8.4 <5.8.0' 444 | 445 | '@typescript-eslint/visitor-keys@8.20.0': 446 | resolution: {integrity: sha512-v/BpkeeYAsPkKCkR8BDwcno0llhzWVqPOamQrAEMdpZav2Y9OVjd9dwJyBLJWwf335B5DmlifECIkZRJCaGaHA==} 447 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 448 | 449 | acorn-jsx@5.3.2: 450 | resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} 451 | peerDependencies: 452 | acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 453 | 454 | acorn@8.14.0: 455 | resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} 456 | engines: {node: '>=0.4.0'} 457 | hasBin: true 458 | 459 | ajv@6.12.6: 460 | resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} 461 | 462 | ansi-regex@5.0.1: 463 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 464 | engines: {node: '>=8'} 465 | 466 | ansi-regex@6.1.0: 467 | resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} 468 | engines: {node: '>=12'} 469 | 470 | ansi-styles@4.3.0: 471 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 472 | engines: {node: '>=8'} 473 | 474 | ansi-styles@6.2.1: 475 | resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} 476 | engines: {node: '>=12'} 477 | 478 | any-promise@1.3.0: 479 | resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} 480 | 481 | anymatch@3.1.3: 482 | resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} 483 | engines: {node: '>= 8'} 484 | 485 | arg@5.0.2: 486 | resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} 487 | 488 | argparse@2.0.1: 489 | resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} 490 | 491 | balanced-match@1.0.2: 492 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 493 | 494 | binary-extensions@2.3.0: 495 | resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} 496 | engines: {node: '>=8'} 497 | 498 | brace-expansion@1.1.11: 499 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 500 | 501 | brace-expansion@2.0.1: 502 | resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} 503 | 504 | braces@3.0.3: 505 | resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} 506 | engines: {node: '>=8'} 507 | 508 | bundle-require@5.1.0: 509 | resolution: {integrity: sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==} 510 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 511 | peerDependencies: 512 | esbuild: '>=0.18' 513 | 514 | cac@6.7.14: 515 | resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} 516 | engines: {node: '>=8'} 517 | 518 | callsites@3.1.0: 519 | resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} 520 | engines: {node: '>=6'} 521 | 522 | camelcase-css@2.0.1: 523 | resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} 524 | engines: {node: '>= 6'} 525 | 526 | chalk@4.1.2: 527 | resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} 528 | engines: {node: '>=10'} 529 | 530 | chokidar@3.6.0: 531 | resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} 532 | engines: {node: '>= 8.10.0'} 533 | 534 | chokidar@4.0.3: 535 | resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} 536 | engines: {node: '>= 14.16.0'} 537 | 538 | color-convert@2.0.1: 539 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 540 | engines: {node: '>=7.0.0'} 541 | 542 | color-name@1.1.4: 543 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 544 | 545 | commander@4.1.1: 546 | resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} 547 | engines: {node: '>= 6'} 548 | 549 | concat-map@0.0.1: 550 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} 551 | 552 | consola@3.4.0: 553 | resolution: {integrity: sha512-EiPU8G6dQG0GFHNR8ljnZFki/8a+cQwEQ+7wpxdChl02Q8HXlwEZWD5lqAF8vC2sEC3Tehr8hy7vErz88LHyUA==} 554 | engines: {node: ^14.18.0 || >=16.10.0} 555 | 556 | cross-spawn@7.0.6: 557 | resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} 558 | engines: {node: '>= 8'} 559 | 560 | cssesc@3.0.0: 561 | resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} 562 | engines: {node: '>=4'} 563 | hasBin: true 564 | 565 | csstype@3.1.3: 566 | resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} 567 | 568 | debug@4.4.0: 569 | resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} 570 | engines: {node: '>=6.0'} 571 | peerDependencies: 572 | supports-color: '*' 573 | peerDependenciesMeta: 574 | supports-color: 575 | optional: true 576 | 577 | deep-is@0.1.4: 578 | resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} 579 | 580 | didyoumean@1.2.2: 581 | resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} 582 | 583 | dlv@1.1.3: 584 | resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} 585 | 586 | eastasianwidth@0.2.0: 587 | resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} 588 | 589 | emoji-regex@8.0.0: 590 | resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} 591 | 592 | emoji-regex@9.2.2: 593 | resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} 594 | 595 | esbuild@0.24.2: 596 | resolution: {integrity: sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==} 597 | engines: {node: '>=18'} 598 | hasBin: true 599 | 600 | escape-string-regexp@4.0.0: 601 | resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} 602 | engines: {node: '>=10'} 603 | 604 | eslint-scope@8.2.0: 605 | resolution: {integrity: sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==} 606 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 607 | 608 | eslint-visitor-keys@3.4.3: 609 | resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} 610 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 611 | 612 | eslint-visitor-keys@4.2.0: 613 | resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} 614 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 615 | 616 | eslint@9.18.0: 617 | resolution: {integrity: sha512-+waTfRWQlSbpt3KWE+CjrPPYnbq9kfZIYUqapc0uBXyjTp8aYXZDsUH16m39Ryq3NjAVP4tjuF7KaukeqoCoaA==} 618 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 619 | hasBin: true 620 | peerDependencies: 621 | jiti: '*' 622 | peerDependenciesMeta: 623 | jiti: 624 | optional: true 625 | 626 | espree@10.3.0: 627 | resolution: {integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==} 628 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 629 | 630 | esquery@1.6.0: 631 | resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} 632 | engines: {node: '>=0.10'} 633 | 634 | esrecurse@4.3.0: 635 | resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} 636 | engines: {node: '>=4.0'} 637 | 638 | estraverse@5.3.0: 639 | resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} 640 | engines: {node: '>=4.0'} 641 | 642 | esutils@2.0.3: 643 | resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} 644 | engines: {node: '>=0.10.0'} 645 | 646 | fast-deep-equal@3.1.3: 647 | resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} 648 | 649 | fast-glob@3.3.3: 650 | resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} 651 | engines: {node: '>=8.6.0'} 652 | 653 | fast-json-stable-stringify@2.1.0: 654 | resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} 655 | 656 | fast-levenshtein@2.0.6: 657 | resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} 658 | 659 | fastq@1.18.0: 660 | resolution: {integrity: sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==} 661 | 662 | fdir@6.4.3: 663 | resolution: {integrity: sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==} 664 | peerDependencies: 665 | picomatch: ^3 || ^4 666 | peerDependenciesMeta: 667 | picomatch: 668 | optional: true 669 | 670 | file-entry-cache@8.0.0: 671 | resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} 672 | engines: {node: '>=16.0.0'} 673 | 674 | fill-range@7.1.1: 675 | resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} 676 | engines: {node: '>=8'} 677 | 678 | find-up@5.0.0: 679 | resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} 680 | engines: {node: '>=10'} 681 | 682 | flat-cache@4.0.1: 683 | resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} 684 | engines: {node: '>=16'} 685 | 686 | flatted@3.3.2: 687 | resolution: {integrity: sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==} 688 | 689 | foreground-child@3.3.0: 690 | resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} 691 | engines: {node: '>=14'} 692 | 693 | fsevents@2.3.3: 694 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 695 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 696 | os: [darwin] 697 | 698 | function-bind@1.1.2: 699 | resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} 700 | 701 | glob-parent@5.1.2: 702 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 703 | engines: {node: '>= 6'} 704 | 705 | glob-parent@6.0.2: 706 | resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} 707 | engines: {node: '>=10.13.0'} 708 | 709 | glob@10.4.5: 710 | resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} 711 | hasBin: true 712 | 713 | globals@14.0.0: 714 | resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} 715 | engines: {node: '>=18'} 716 | 717 | globals@15.14.0: 718 | resolution: {integrity: sha512-OkToC372DtlQeje9/zHIo5CT8lRP/FUgEOKBEhU4e0abL7J7CD24fD9ohiLN5hagG/kWCYj4K5oaxxtj2Z0Dig==} 719 | engines: {node: '>=18'} 720 | 721 | graphemer@1.4.0: 722 | resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} 723 | 724 | has-flag@4.0.0: 725 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} 726 | engines: {node: '>=8'} 727 | 728 | hasown@2.0.2: 729 | resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} 730 | engines: {node: '>= 0.4'} 731 | 732 | ignore@5.3.2: 733 | resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} 734 | engines: {node: '>= 4'} 735 | 736 | import-fresh@3.3.0: 737 | resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} 738 | engines: {node: '>=6'} 739 | 740 | imurmurhash@0.1.4: 741 | resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} 742 | engines: {node: '>=0.8.19'} 743 | 744 | is-binary-path@2.1.0: 745 | resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} 746 | engines: {node: '>=8'} 747 | 748 | is-core-module@2.16.1: 749 | resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} 750 | engines: {node: '>= 0.4'} 751 | 752 | is-extglob@2.1.1: 753 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 754 | engines: {node: '>=0.10.0'} 755 | 756 | is-fullwidth-code-point@3.0.0: 757 | resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} 758 | engines: {node: '>=8'} 759 | 760 | is-glob@4.0.3: 761 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 762 | engines: {node: '>=0.10.0'} 763 | 764 | is-number@7.0.0: 765 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 766 | engines: {node: '>=0.12.0'} 767 | 768 | isexe@2.0.0: 769 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 770 | 771 | jackspeak@3.4.3: 772 | resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} 773 | 774 | jiti@1.21.7: 775 | resolution: {integrity: sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==} 776 | hasBin: true 777 | 778 | joycon@3.1.1: 779 | resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} 780 | engines: {node: '>=10'} 781 | 782 | js-yaml@4.1.0: 783 | resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} 784 | hasBin: true 785 | 786 | json-buffer@3.0.1: 787 | resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} 788 | 789 | json-schema-traverse@0.4.1: 790 | resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} 791 | 792 | json-stable-stringify-without-jsonify@1.0.1: 793 | resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} 794 | 795 | keyv@4.5.4: 796 | resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} 797 | 798 | levn@0.4.1: 799 | resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} 800 | engines: {node: '>= 0.8.0'} 801 | 802 | lilconfig@3.1.3: 803 | resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} 804 | engines: {node: '>=14'} 805 | 806 | lines-and-columns@1.2.4: 807 | resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} 808 | 809 | load-tsconfig@0.2.5: 810 | resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} 811 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 812 | 813 | locate-path@6.0.0: 814 | resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} 815 | engines: {node: '>=10'} 816 | 817 | lodash.merge@4.6.2: 818 | resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} 819 | 820 | lodash.sortby@4.7.0: 821 | resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} 822 | 823 | lru-cache@10.4.3: 824 | resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} 825 | 826 | merge2@1.4.1: 827 | resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} 828 | engines: {node: '>= 8'} 829 | 830 | micromatch@4.0.8: 831 | resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} 832 | engines: {node: '>=8.6'} 833 | 834 | minimatch@3.1.2: 835 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 836 | 837 | minimatch@9.0.5: 838 | resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} 839 | engines: {node: '>=16 || 14 >=14.17'} 840 | 841 | minipass@7.1.2: 842 | resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} 843 | engines: {node: '>=16 || 14 >=14.17'} 844 | 845 | ms@2.1.3: 846 | resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} 847 | 848 | mz@2.7.0: 849 | resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} 850 | 851 | nanoid@3.3.8: 852 | resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==} 853 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 854 | hasBin: true 855 | 856 | natural-compare@1.4.0: 857 | resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} 858 | 859 | normalize-path@3.0.0: 860 | resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} 861 | engines: {node: '>=0.10.0'} 862 | 863 | object-assign@4.1.1: 864 | resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} 865 | engines: {node: '>=0.10.0'} 866 | 867 | object-hash@3.0.0: 868 | resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} 869 | engines: {node: '>= 6'} 870 | 871 | optionator@0.9.4: 872 | resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} 873 | engines: {node: '>= 0.8.0'} 874 | 875 | p-limit@3.1.0: 876 | resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} 877 | engines: {node: '>=10'} 878 | 879 | p-locate@5.0.0: 880 | resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} 881 | engines: {node: '>=10'} 882 | 883 | package-json-from-dist@1.0.1: 884 | resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} 885 | 886 | parent-module@1.0.1: 887 | resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} 888 | engines: {node: '>=6'} 889 | 890 | path-exists@4.0.0: 891 | resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} 892 | engines: {node: '>=8'} 893 | 894 | path-key@3.1.1: 895 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 896 | engines: {node: '>=8'} 897 | 898 | path-parse@1.0.7: 899 | resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} 900 | 901 | path-scurry@1.11.1: 902 | resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} 903 | engines: {node: '>=16 || 14 >=14.18'} 904 | 905 | picocolors@1.1.1: 906 | resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} 907 | 908 | picomatch@2.3.1: 909 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 910 | engines: {node: '>=8.6'} 911 | 912 | picomatch@4.0.2: 913 | resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} 914 | engines: {node: '>=12'} 915 | 916 | pify@2.3.0: 917 | resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} 918 | engines: {node: '>=0.10.0'} 919 | 920 | pirates@4.0.6: 921 | resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} 922 | engines: {node: '>= 6'} 923 | 924 | postcss-import@15.1.0: 925 | resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} 926 | engines: {node: '>=14.0.0'} 927 | peerDependencies: 928 | postcss: ^8.0.0 929 | 930 | postcss-js@4.0.1: 931 | resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} 932 | engines: {node: ^12 || ^14 || >= 16} 933 | peerDependencies: 934 | postcss: ^8.4.21 935 | 936 | postcss-load-config@4.0.2: 937 | resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} 938 | engines: {node: '>= 14'} 939 | peerDependencies: 940 | postcss: '>=8.0.9' 941 | ts-node: '>=9.0.0' 942 | peerDependenciesMeta: 943 | postcss: 944 | optional: true 945 | ts-node: 946 | optional: true 947 | 948 | postcss-load-config@6.0.1: 949 | resolution: {integrity: sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==} 950 | engines: {node: '>= 18'} 951 | peerDependencies: 952 | jiti: '>=1.21.0' 953 | postcss: '>=8.0.9' 954 | tsx: ^4.8.1 955 | yaml: ^2.4.2 956 | peerDependenciesMeta: 957 | jiti: 958 | optional: true 959 | postcss: 960 | optional: true 961 | tsx: 962 | optional: true 963 | yaml: 964 | optional: true 965 | 966 | postcss-nested@6.2.0: 967 | resolution: {integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==} 968 | engines: {node: '>=12.0'} 969 | peerDependencies: 970 | postcss: ^8.2.14 971 | 972 | postcss-selector-parser@6.1.2: 973 | resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} 974 | engines: {node: '>=4'} 975 | 976 | postcss-value-parser@4.2.0: 977 | resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} 978 | 979 | postcss@8.5.1: 980 | resolution: {integrity: sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ==} 981 | engines: {node: ^10 || ^12 || >=14} 982 | 983 | prelude-ls@1.2.1: 984 | resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} 985 | engines: {node: '>= 0.8.0'} 986 | 987 | punycode@2.3.1: 988 | resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} 989 | engines: {node: '>=6'} 990 | 991 | queue-microtask@1.2.3: 992 | resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} 993 | 994 | read-cache@1.0.0: 995 | resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} 996 | 997 | readdirp@3.6.0: 998 | resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} 999 | engines: {node: '>=8.10.0'} 1000 | 1001 | readdirp@4.1.1: 1002 | resolution: {integrity: sha512-h80JrZu/MHUZCyHu5ciuoI0+WxsCxzxJTILn6Fs8rxSnFPh+UVHYfeIxK1nVGugMqkfC4vJcBOYbkfkwYK0+gw==} 1003 | engines: {node: '>= 14.18.0'} 1004 | 1005 | resolve-from@4.0.0: 1006 | resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} 1007 | engines: {node: '>=4'} 1008 | 1009 | resolve-from@5.0.0: 1010 | resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} 1011 | engines: {node: '>=8'} 1012 | 1013 | resolve@1.22.10: 1014 | resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} 1015 | engines: {node: '>= 0.4'} 1016 | hasBin: true 1017 | 1018 | reusify@1.0.4: 1019 | resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} 1020 | engines: {iojs: '>=1.0.0', node: '>=0.10.0'} 1021 | 1022 | rollup@4.30.1: 1023 | resolution: {integrity: sha512-mlJ4glW020fPuLi7DkM/lN97mYEZGWeqBnrljzN0gs7GLctqX3lNWxKQ7Gl712UAX+6fog/L3jh4gb7R6aVi3w==} 1024 | engines: {node: '>=18.0.0', npm: '>=8.0.0'} 1025 | hasBin: true 1026 | 1027 | run-parallel@1.2.0: 1028 | resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} 1029 | 1030 | semver@7.6.3: 1031 | resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} 1032 | engines: {node: '>=10'} 1033 | hasBin: true 1034 | 1035 | shebang-command@2.0.0: 1036 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 1037 | engines: {node: '>=8'} 1038 | 1039 | shebang-regex@3.0.0: 1040 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 1041 | engines: {node: '>=8'} 1042 | 1043 | signal-exit@4.1.0: 1044 | resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} 1045 | engines: {node: '>=14'} 1046 | 1047 | source-map-js@1.2.1: 1048 | resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} 1049 | engines: {node: '>=0.10.0'} 1050 | 1051 | source-map@0.8.0-beta.0: 1052 | resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} 1053 | engines: {node: '>= 8'} 1054 | 1055 | string-width@4.2.3: 1056 | resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} 1057 | engines: {node: '>=8'} 1058 | 1059 | string-width@5.1.2: 1060 | resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} 1061 | engines: {node: '>=12'} 1062 | 1063 | strip-ansi@6.0.1: 1064 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 1065 | engines: {node: '>=8'} 1066 | 1067 | strip-ansi@7.1.0: 1068 | resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} 1069 | engines: {node: '>=12'} 1070 | 1071 | strip-json-comments@3.1.1: 1072 | resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} 1073 | engines: {node: '>=8'} 1074 | 1075 | sucrase@3.35.0: 1076 | resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} 1077 | engines: {node: '>=16 || 14 >=14.17'} 1078 | hasBin: true 1079 | 1080 | supports-color@7.2.0: 1081 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 1082 | engines: {node: '>=8'} 1083 | 1084 | supports-preserve-symlinks-flag@1.0.0: 1085 | resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} 1086 | engines: {node: '>= 0.4'} 1087 | 1088 | tailwindcss@3.4.17: 1089 | resolution: {integrity: sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==} 1090 | engines: {node: '>=14.0.0'} 1091 | hasBin: true 1092 | 1093 | thenify-all@1.6.0: 1094 | resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} 1095 | engines: {node: '>=0.8'} 1096 | 1097 | thenify@3.3.1: 1098 | resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} 1099 | 1100 | tinyexec@0.3.2: 1101 | resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} 1102 | 1103 | tinyglobby@0.2.10: 1104 | resolution: {integrity: sha512-Zc+8eJlFMvgatPZTl6A9L/yht8QqdmUNtURHaKZLmKBE12hNPSrqNkUp2cs3M/UKmNVVAMFQYSjYIVHDjW5zew==} 1105 | engines: {node: '>=12.0.0'} 1106 | 1107 | to-regex-range@5.0.1: 1108 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 1109 | engines: {node: '>=8.0'} 1110 | 1111 | tr46@1.0.1: 1112 | resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} 1113 | 1114 | tree-kill@1.2.2: 1115 | resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} 1116 | hasBin: true 1117 | 1118 | ts-api-utils@2.0.0: 1119 | resolution: {integrity: sha512-xCt/TOAc+EOHS1XPnijD3/yzpH6qg2xppZO1YDqGoVsNXfQfzHpOdNuXwrwOU8u4ITXJyDCTyt8w5g1sZv9ynQ==} 1120 | engines: {node: '>=18.12'} 1121 | peerDependencies: 1122 | typescript: '>=4.8.4' 1123 | 1124 | ts-interface-checker@0.1.13: 1125 | resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} 1126 | 1127 | tsup@8.3.5: 1128 | resolution: {integrity: sha512-Tunf6r6m6tnZsG9GYWndg0z8dEV7fD733VBFzFJ5Vcm1FtlXB8xBD/rtrBi2a3YKEV7hHtxiZtW5EAVADoe1pA==} 1129 | engines: {node: '>=18'} 1130 | hasBin: true 1131 | peerDependencies: 1132 | '@microsoft/api-extractor': ^7.36.0 1133 | '@swc/core': ^1 1134 | postcss: ^8.4.12 1135 | typescript: '>=4.5.0' 1136 | peerDependenciesMeta: 1137 | '@microsoft/api-extractor': 1138 | optional: true 1139 | '@swc/core': 1140 | optional: true 1141 | postcss: 1142 | optional: true 1143 | typescript: 1144 | optional: true 1145 | 1146 | type-check@0.4.0: 1147 | resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} 1148 | engines: {node: '>= 0.8.0'} 1149 | 1150 | typescript-eslint@8.20.0: 1151 | resolution: {integrity: sha512-Kxz2QRFsgbWj6Xcftlw3Dd154b3cEPFqQC+qMZrMypSijPd4UanKKvoKDrJ4o8AIfZFKAF+7sMaEIR8mTElozA==} 1152 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 1153 | peerDependencies: 1154 | eslint: ^8.57.0 || ^9.0.0 1155 | typescript: '>=4.8.4 <5.8.0' 1156 | 1157 | typescript@5.7.3: 1158 | resolution: {integrity: sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==} 1159 | engines: {node: '>=14.17'} 1160 | hasBin: true 1161 | 1162 | undici-types@6.20.0: 1163 | resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==} 1164 | 1165 | uri-js@4.4.1: 1166 | resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} 1167 | 1168 | util-deprecate@1.0.2: 1169 | resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} 1170 | 1171 | webidl-conversions@4.0.2: 1172 | resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} 1173 | 1174 | whatwg-url@7.1.0: 1175 | resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} 1176 | 1177 | which@2.0.2: 1178 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 1179 | engines: {node: '>= 8'} 1180 | hasBin: true 1181 | 1182 | word-wrap@1.2.5: 1183 | resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} 1184 | engines: {node: '>=0.10.0'} 1185 | 1186 | wrap-ansi@7.0.0: 1187 | resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} 1188 | engines: {node: '>=10'} 1189 | 1190 | wrap-ansi@8.1.0: 1191 | resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} 1192 | engines: {node: '>=12'} 1193 | 1194 | yaml@2.7.0: 1195 | resolution: {integrity: sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==} 1196 | engines: {node: '>= 14'} 1197 | hasBin: true 1198 | 1199 | yocto-queue@0.1.0: 1200 | resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} 1201 | engines: {node: '>=10'} 1202 | 1203 | snapshots: 1204 | 1205 | '@alloc/quick-lru@5.2.0': {} 1206 | 1207 | '@esbuild/aix-ppc64@0.24.2': 1208 | optional: true 1209 | 1210 | '@esbuild/android-arm64@0.24.2': 1211 | optional: true 1212 | 1213 | '@esbuild/android-arm@0.24.2': 1214 | optional: true 1215 | 1216 | '@esbuild/android-x64@0.24.2': 1217 | optional: true 1218 | 1219 | '@esbuild/darwin-arm64@0.24.2': 1220 | optional: true 1221 | 1222 | '@esbuild/darwin-x64@0.24.2': 1223 | optional: true 1224 | 1225 | '@esbuild/freebsd-arm64@0.24.2': 1226 | optional: true 1227 | 1228 | '@esbuild/freebsd-x64@0.24.2': 1229 | optional: true 1230 | 1231 | '@esbuild/linux-arm64@0.24.2': 1232 | optional: true 1233 | 1234 | '@esbuild/linux-arm@0.24.2': 1235 | optional: true 1236 | 1237 | '@esbuild/linux-ia32@0.24.2': 1238 | optional: true 1239 | 1240 | '@esbuild/linux-loong64@0.24.2': 1241 | optional: true 1242 | 1243 | '@esbuild/linux-mips64el@0.24.2': 1244 | optional: true 1245 | 1246 | '@esbuild/linux-ppc64@0.24.2': 1247 | optional: true 1248 | 1249 | '@esbuild/linux-riscv64@0.24.2': 1250 | optional: true 1251 | 1252 | '@esbuild/linux-s390x@0.24.2': 1253 | optional: true 1254 | 1255 | '@esbuild/linux-x64@0.24.2': 1256 | optional: true 1257 | 1258 | '@esbuild/netbsd-arm64@0.24.2': 1259 | optional: true 1260 | 1261 | '@esbuild/netbsd-x64@0.24.2': 1262 | optional: true 1263 | 1264 | '@esbuild/openbsd-arm64@0.24.2': 1265 | optional: true 1266 | 1267 | '@esbuild/openbsd-x64@0.24.2': 1268 | optional: true 1269 | 1270 | '@esbuild/sunos-x64@0.24.2': 1271 | optional: true 1272 | 1273 | '@esbuild/win32-arm64@0.24.2': 1274 | optional: true 1275 | 1276 | '@esbuild/win32-ia32@0.24.2': 1277 | optional: true 1278 | 1279 | '@esbuild/win32-x64@0.24.2': 1280 | optional: true 1281 | 1282 | '@eslint-community/eslint-utils@4.4.1(eslint@9.18.0(jiti@1.21.7))': 1283 | dependencies: 1284 | eslint: 9.18.0(jiti@1.21.7) 1285 | eslint-visitor-keys: 3.4.3 1286 | 1287 | '@eslint-community/regexpp@4.12.1': {} 1288 | 1289 | '@eslint/config-array@0.19.1': 1290 | dependencies: 1291 | '@eslint/object-schema': 2.1.5 1292 | debug: 4.4.0 1293 | minimatch: 3.1.2 1294 | transitivePeerDependencies: 1295 | - supports-color 1296 | 1297 | '@eslint/core@0.10.0': 1298 | dependencies: 1299 | '@types/json-schema': 7.0.15 1300 | 1301 | '@eslint/eslintrc@3.2.0': 1302 | dependencies: 1303 | ajv: 6.12.6 1304 | debug: 4.4.0 1305 | espree: 10.3.0 1306 | globals: 14.0.0 1307 | ignore: 5.3.2 1308 | import-fresh: 3.3.0 1309 | js-yaml: 4.1.0 1310 | minimatch: 3.1.2 1311 | strip-json-comments: 3.1.1 1312 | transitivePeerDependencies: 1313 | - supports-color 1314 | 1315 | '@eslint/js@9.18.0': {} 1316 | 1317 | '@eslint/object-schema@2.1.5': {} 1318 | 1319 | '@eslint/plugin-kit@0.2.5': 1320 | dependencies: 1321 | '@eslint/core': 0.10.0 1322 | levn: 0.4.1 1323 | 1324 | '@humanfs/core@0.19.1': {} 1325 | 1326 | '@humanfs/node@0.16.6': 1327 | dependencies: 1328 | '@humanfs/core': 0.19.1 1329 | '@humanwhocodes/retry': 0.3.1 1330 | 1331 | '@humanwhocodes/module-importer@1.0.1': {} 1332 | 1333 | '@humanwhocodes/retry@0.3.1': {} 1334 | 1335 | '@humanwhocodes/retry@0.4.1': {} 1336 | 1337 | '@isaacs/cliui@8.0.2': 1338 | dependencies: 1339 | string-width: 5.1.2 1340 | string-width-cjs: string-width@4.2.3 1341 | strip-ansi: 7.1.0 1342 | strip-ansi-cjs: strip-ansi@6.0.1 1343 | wrap-ansi: 8.1.0 1344 | wrap-ansi-cjs: wrap-ansi@7.0.0 1345 | 1346 | '@jridgewell/gen-mapping@0.3.8': 1347 | dependencies: 1348 | '@jridgewell/set-array': 1.2.1 1349 | '@jridgewell/sourcemap-codec': 1.5.0 1350 | '@jridgewell/trace-mapping': 0.3.25 1351 | 1352 | '@jridgewell/resolve-uri@3.1.2': {} 1353 | 1354 | '@jridgewell/set-array@1.2.1': {} 1355 | 1356 | '@jridgewell/sourcemap-codec@1.5.0': {} 1357 | 1358 | '@jridgewell/trace-mapping@0.3.25': 1359 | dependencies: 1360 | '@jridgewell/resolve-uri': 3.1.2 1361 | '@jridgewell/sourcemap-codec': 1.5.0 1362 | 1363 | '@nodelib/fs.scandir@2.1.5': 1364 | dependencies: 1365 | '@nodelib/fs.stat': 2.0.5 1366 | run-parallel: 1.2.0 1367 | 1368 | '@nodelib/fs.stat@2.0.5': {} 1369 | 1370 | '@nodelib/fs.walk@1.2.8': 1371 | dependencies: 1372 | '@nodelib/fs.scandir': 2.1.5 1373 | fastq: 1.18.0 1374 | 1375 | '@pkgjs/parseargs@0.11.0': 1376 | optional: true 1377 | 1378 | '@rollup/rollup-android-arm-eabi@4.30.1': 1379 | optional: true 1380 | 1381 | '@rollup/rollup-android-arm64@4.30.1': 1382 | optional: true 1383 | 1384 | '@rollup/rollup-darwin-arm64@4.30.1': 1385 | optional: true 1386 | 1387 | '@rollup/rollup-darwin-x64@4.30.1': 1388 | optional: true 1389 | 1390 | '@rollup/rollup-freebsd-arm64@4.30.1': 1391 | optional: true 1392 | 1393 | '@rollup/rollup-freebsd-x64@4.30.1': 1394 | optional: true 1395 | 1396 | '@rollup/rollup-linux-arm-gnueabihf@4.30.1': 1397 | optional: true 1398 | 1399 | '@rollup/rollup-linux-arm-musleabihf@4.30.1': 1400 | optional: true 1401 | 1402 | '@rollup/rollup-linux-arm64-gnu@4.30.1': 1403 | optional: true 1404 | 1405 | '@rollup/rollup-linux-arm64-musl@4.30.1': 1406 | optional: true 1407 | 1408 | '@rollup/rollup-linux-loongarch64-gnu@4.30.1': 1409 | optional: true 1410 | 1411 | '@rollup/rollup-linux-powerpc64le-gnu@4.30.1': 1412 | optional: true 1413 | 1414 | '@rollup/rollup-linux-riscv64-gnu@4.30.1': 1415 | optional: true 1416 | 1417 | '@rollup/rollup-linux-s390x-gnu@4.30.1': 1418 | optional: true 1419 | 1420 | '@rollup/rollup-linux-x64-gnu@4.30.1': 1421 | optional: true 1422 | 1423 | '@rollup/rollup-linux-x64-musl@4.30.1': 1424 | optional: true 1425 | 1426 | '@rollup/rollup-win32-arm64-msvc@4.30.1': 1427 | optional: true 1428 | 1429 | '@rollup/rollup-win32-ia32-msvc@4.30.1': 1430 | optional: true 1431 | 1432 | '@rollup/rollup-win32-x64-msvc@4.30.1': 1433 | optional: true 1434 | 1435 | '@types/estree@1.0.6': {} 1436 | 1437 | '@types/json-schema@7.0.15': {} 1438 | 1439 | '@types/node@22.10.7': 1440 | dependencies: 1441 | undici-types: 6.20.0 1442 | 1443 | '@types/react-dom@19.0.3(@types/react@19.0.7)': 1444 | dependencies: 1445 | '@types/react': 19.0.7 1446 | 1447 | '@types/react@19.0.7': 1448 | dependencies: 1449 | csstype: 3.1.3 1450 | 1451 | '@typescript-eslint/eslint-plugin@8.20.0(@typescript-eslint/parser@8.20.0(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3))(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3)': 1452 | dependencies: 1453 | '@eslint-community/regexpp': 4.12.1 1454 | '@typescript-eslint/parser': 8.20.0(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3) 1455 | '@typescript-eslint/scope-manager': 8.20.0 1456 | '@typescript-eslint/type-utils': 8.20.0(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3) 1457 | '@typescript-eslint/utils': 8.20.0(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3) 1458 | '@typescript-eslint/visitor-keys': 8.20.0 1459 | eslint: 9.18.0(jiti@1.21.7) 1460 | graphemer: 1.4.0 1461 | ignore: 5.3.2 1462 | natural-compare: 1.4.0 1463 | ts-api-utils: 2.0.0(typescript@5.7.3) 1464 | typescript: 5.7.3 1465 | transitivePeerDependencies: 1466 | - supports-color 1467 | 1468 | '@typescript-eslint/parser@8.20.0(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3)': 1469 | dependencies: 1470 | '@typescript-eslint/scope-manager': 8.20.0 1471 | '@typescript-eslint/types': 8.20.0 1472 | '@typescript-eslint/typescript-estree': 8.20.0(typescript@5.7.3) 1473 | '@typescript-eslint/visitor-keys': 8.20.0 1474 | debug: 4.4.0 1475 | eslint: 9.18.0(jiti@1.21.7) 1476 | typescript: 5.7.3 1477 | transitivePeerDependencies: 1478 | - supports-color 1479 | 1480 | '@typescript-eslint/scope-manager@8.20.0': 1481 | dependencies: 1482 | '@typescript-eslint/types': 8.20.0 1483 | '@typescript-eslint/visitor-keys': 8.20.0 1484 | 1485 | '@typescript-eslint/type-utils@8.20.0(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3)': 1486 | dependencies: 1487 | '@typescript-eslint/typescript-estree': 8.20.0(typescript@5.7.3) 1488 | '@typescript-eslint/utils': 8.20.0(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3) 1489 | debug: 4.4.0 1490 | eslint: 9.18.0(jiti@1.21.7) 1491 | ts-api-utils: 2.0.0(typescript@5.7.3) 1492 | typescript: 5.7.3 1493 | transitivePeerDependencies: 1494 | - supports-color 1495 | 1496 | '@typescript-eslint/types@8.20.0': {} 1497 | 1498 | '@typescript-eslint/typescript-estree@8.20.0(typescript@5.7.3)': 1499 | dependencies: 1500 | '@typescript-eslint/types': 8.20.0 1501 | '@typescript-eslint/visitor-keys': 8.20.0 1502 | debug: 4.4.0 1503 | fast-glob: 3.3.3 1504 | is-glob: 4.0.3 1505 | minimatch: 9.0.5 1506 | semver: 7.6.3 1507 | ts-api-utils: 2.0.0(typescript@5.7.3) 1508 | typescript: 5.7.3 1509 | transitivePeerDependencies: 1510 | - supports-color 1511 | 1512 | '@typescript-eslint/utils@8.20.0(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3)': 1513 | dependencies: 1514 | '@eslint-community/eslint-utils': 4.4.1(eslint@9.18.0(jiti@1.21.7)) 1515 | '@typescript-eslint/scope-manager': 8.20.0 1516 | '@typescript-eslint/types': 8.20.0 1517 | '@typescript-eslint/typescript-estree': 8.20.0(typescript@5.7.3) 1518 | eslint: 9.18.0(jiti@1.21.7) 1519 | typescript: 5.7.3 1520 | transitivePeerDependencies: 1521 | - supports-color 1522 | 1523 | '@typescript-eslint/visitor-keys@8.20.0': 1524 | dependencies: 1525 | '@typescript-eslint/types': 8.20.0 1526 | eslint-visitor-keys: 4.2.0 1527 | 1528 | acorn-jsx@5.3.2(acorn@8.14.0): 1529 | dependencies: 1530 | acorn: 8.14.0 1531 | 1532 | acorn@8.14.0: {} 1533 | 1534 | ajv@6.12.6: 1535 | dependencies: 1536 | fast-deep-equal: 3.1.3 1537 | fast-json-stable-stringify: 2.1.0 1538 | json-schema-traverse: 0.4.1 1539 | uri-js: 4.4.1 1540 | 1541 | ansi-regex@5.0.1: {} 1542 | 1543 | ansi-regex@6.1.0: {} 1544 | 1545 | ansi-styles@4.3.0: 1546 | dependencies: 1547 | color-convert: 2.0.1 1548 | 1549 | ansi-styles@6.2.1: {} 1550 | 1551 | any-promise@1.3.0: {} 1552 | 1553 | anymatch@3.1.3: 1554 | dependencies: 1555 | normalize-path: 3.0.0 1556 | picomatch: 2.3.1 1557 | 1558 | arg@5.0.2: {} 1559 | 1560 | argparse@2.0.1: {} 1561 | 1562 | balanced-match@1.0.2: {} 1563 | 1564 | binary-extensions@2.3.0: {} 1565 | 1566 | brace-expansion@1.1.11: 1567 | dependencies: 1568 | balanced-match: 1.0.2 1569 | concat-map: 0.0.1 1570 | 1571 | brace-expansion@2.0.1: 1572 | dependencies: 1573 | balanced-match: 1.0.2 1574 | 1575 | braces@3.0.3: 1576 | dependencies: 1577 | fill-range: 7.1.1 1578 | 1579 | bundle-require@5.1.0(esbuild@0.24.2): 1580 | dependencies: 1581 | esbuild: 0.24.2 1582 | load-tsconfig: 0.2.5 1583 | 1584 | cac@6.7.14: {} 1585 | 1586 | callsites@3.1.0: {} 1587 | 1588 | camelcase-css@2.0.1: {} 1589 | 1590 | chalk@4.1.2: 1591 | dependencies: 1592 | ansi-styles: 4.3.0 1593 | supports-color: 7.2.0 1594 | 1595 | chokidar@3.6.0: 1596 | dependencies: 1597 | anymatch: 3.1.3 1598 | braces: 3.0.3 1599 | glob-parent: 5.1.2 1600 | is-binary-path: 2.1.0 1601 | is-glob: 4.0.3 1602 | normalize-path: 3.0.0 1603 | readdirp: 3.6.0 1604 | optionalDependencies: 1605 | fsevents: 2.3.3 1606 | 1607 | chokidar@4.0.3: 1608 | dependencies: 1609 | readdirp: 4.1.1 1610 | 1611 | color-convert@2.0.1: 1612 | dependencies: 1613 | color-name: 1.1.4 1614 | 1615 | color-name@1.1.4: {} 1616 | 1617 | commander@4.1.1: {} 1618 | 1619 | concat-map@0.0.1: {} 1620 | 1621 | consola@3.4.0: {} 1622 | 1623 | cross-spawn@7.0.6: 1624 | dependencies: 1625 | path-key: 3.1.1 1626 | shebang-command: 2.0.0 1627 | which: 2.0.2 1628 | 1629 | cssesc@3.0.0: {} 1630 | 1631 | csstype@3.1.3: {} 1632 | 1633 | debug@4.4.0: 1634 | dependencies: 1635 | ms: 2.1.3 1636 | 1637 | deep-is@0.1.4: {} 1638 | 1639 | didyoumean@1.2.2: {} 1640 | 1641 | dlv@1.1.3: {} 1642 | 1643 | eastasianwidth@0.2.0: {} 1644 | 1645 | emoji-regex@8.0.0: {} 1646 | 1647 | emoji-regex@9.2.2: {} 1648 | 1649 | esbuild@0.24.2: 1650 | optionalDependencies: 1651 | '@esbuild/aix-ppc64': 0.24.2 1652 | '@esbuild/android-arm': 0.24.2 1653 | '@esbuild/android-arm64': 0.24.2 1654 | '@esbuild/android-x64': 0.24.2 1655 | '@esbuild/darwin-arm64': 0.24.2 1656 | '@esbuild/darwin-x64': 0.24.2 1657 | '@esbuild/freebsd-arm64': 0.24.2 1658 | '@esbuild/freebsd-x64': 0.24.2 1659 | '@esbuild/linux-arm': 0.24.2 1660 | '@esbuild/linux-arm64': 0.24.2 1661 | '@esbuild/linux-ia32': 0.24.2 1662 | '@esbuild/linux-loong64': 0.24.2 1663 | '@esbuild/linux-mips64el': 0.24.2 1664 | '@esbuild/linux-ppc64': 0.24.2 1665 | '@esbuild/linux-riscv64': 0.24.2 1666 | '@esbuild/linux-s390x': 0.24.2 1667 | '@esbuild/linux-x64': 0.24.2 1668 | '@esbuild/netbsd-arm64': 0.24.2 1669 | '@esbuild/netbsd-x64': 0.24.2 1670 | '@esbuild/openbsd-arm64': 0.24.2 1671 | '@esbuild/openbsd-x64': 0.24.2 1672 | '@esbuild/sunos-x64': 0.24.2 1673 | '@esbuild/win32-arm64': 0.24.2 1674 | '@esbuild/win32-ia32': 0.24.2 1675 | '@esbuild/win32-x64': 0.24.2 1676 | 1677 | escape-string-regexp@4.0.0: {} 1678 | 1679 | eslint-scope@8.2.0: 1680 | dependencies: 1681 | esrecurse: 4.3.0 1682 | estraverse: 5.3.0 1683 | 1684 | eslint-visitor-keys@3.4.3: {} 1685 | 1686 | eslint-visitor-keys@4.2.0: {} 1687 | 1688 | eslint@9.18.0(jiti@1.21.7): 1689 | dependencies: 1690 | '@eslint-community/eslint-utils': 4.4.1(eslint@9.18.0(jiti@1.21.7)) 1691 | '@eslint-community/regexpp': 4.12.1 1692 | '@eslint/config-array': 0.19.1 1693 | '@eslint/core': 0.10.0 1694 | '@eslint/eslintrc': 3.2.0 1695 | '@eslint/js': 9.18.0 1696 | '@eslint/plugin-kit': 0.2.5 1697 | '@humanfs/node': 0.16.6 1698 | '@humanwhocodes/module-importer': 1.0.1 1699 | '@humanwhocodes/retry': 0.4.1 1700 | '@types/estree': 1.0.6 1701 | '@types/json-schema': 7.0.15 1702 | ajv: 6.12.6 1703 | chalk: 4.1.2 1704 | cross-spawn: 7.0.6 1705 | debug: 4.4.0 1706 | escape-string-regexp: 4.0.0 1707 | eslint-scope: 8.2.0 1708 | eslint-visitor-keys: 4.2.0 1709 | espree: 10.3.0 1710 | esquery: 1.6.0 1711 | esutils: 2.0.3 1712 | fast-deep-equal: 3.1.3 1713 | file-entry-cache: 8.0.0 1714 | find-up: 5.0.0 1715 | glob-parent: 6.0.2 1716 | ignore: 5.3.2 1717 | imurmurhash: 0.1.4 1718 | is-glob: 4.0.3 1719 | json-stable-stringify-without-jsonify: 1.0.1 1720 | lodash.merge: 4.6.2 1721 | minimatch: 3.1.2 1722 | natural-compare: 1.4.0 1723 | optionator: 0.9.4 1724 | optionalDependencies: 1725 | jiti: 1.21.7 1726 | transitivePeerDependencies: 1727 | - supports-color 1728 | 1729 | espree@10.3.0: 1730 | dependencies: 1731 | acorn: 8.14.0 1732 | acorn-jsx: 5.3.2(acorn@8.14.0) 1733 | eslint-visitor-keys: 4.2.0 1734 | 1735 | esquery@1.6.0: 1736 | dependencies: 1737 | estraverse: 5.3.0 1738 | 1739 | esrecurse@4.3.0: 1740 | dependencies: 1741 | estraverse: 5.3.0 1742 | 1743 | estraverse@5.3.0: {} 1744 | 1745 | esutils@2.0.3: {} 1746 | 1747 | fast-deep-equal@3.1.3: {} 1748 | 1749 | fast-glob@3.3.3: 1750 | dependencies: 1751 | '@nodelib/fs.stat': 2.0.5 1752 | '@nodelib/fs.walk': 1.2.8 1753 | glob-parent: 5.1.2 1754 | merge2: 1.4.1 1755 | micromatch: 4.0.8 1756 | 1757 | fast-json-stable-stringify@2.1.0: {} 1758 | 1759 | fast-levenshtein@2.0.6: {} 1760 | 1761 | fastq@1.18.0: 1762 | dependencies: 1763 | reusify: 1.0.4 1764 | 1765 | fdir@6.4.3(picomatch@4.0.2): 1766 | optionalDependencies: 1767 | picomatch: 4.0.2 1768 | 1769 | file-entry-cache@8.0.0: 1770 | dependencies: 1771 | flat-cache: 4.0.1 1772 | 1773 | fill-range@7.1.1: 1774 | dependencies: 1775 | to-regex-range: 5.0.1 1776 | 1777 | find-up@5.0.0: 1778 | dependencies: 1779 | locate-path: 6.0.0 1780 | path-exists: 4.0.0 1781 | 1782 | flat-cache@4.0.1: 1783 | dependencies: 1784 | flatted: 3.3.2 1785 | keyv: 4.5.4 1786 | 1787 | flatted@3.3.2: {} 1788 | 1789 | foreground-child@3.3.0: 1790 | dependencies: 1791 | cross-spawn: 7.0.6 1792 | signal-exit: 4.1.0 1793 | 1794 | fsevents@2.3.3: 1795 | optional: true 1796 | 1797 | function-bind@1.1.2: {} 1798 | 1799 | glob-parent@5.1.2: 1800 | dependencies: 1801 | is-glob: 4.0.3 1802 | 1803 | glob-parent@6.0.2: 1804 | dependencies: 1805 | is-glob: 4.0.3 1806 | 1807 | glob@10.4.5: 1808 | dependencies: 1809 | foreground-child: 3.3.0 1810 | jackspeak: 3.4.3 1811 | minimatch: 9.0.5 1812 | minipass: 7.1.2 1813 | package-json-from-dist: 1.0.1 1814 | path-scurry: 1.11.1 1815 | 1816 | globals@14.0.0: {} 1817 | 1818 | globals@15.14.0: {} 1819 | 1820 | graphemer@1.4.0: {} 1821 | 1822 | has-flag@4.0.0: {} 1823 | 1824 | hasown@2.0.2: 1825 | dependencies: 1826 | function-bind: 1.1.2 1827 | 1828 | ignore@5.3.2: {} 1829 | 1830 | import-fresh@3.3.0: 1831 | dependencies: 1832 | parent-module: 1.0.1 1833 | resolve-from: 4.0.0 1834 | 1835 | imurmurhash@0.1.4: {} 1836 | 1837 | is-binary-path@2.1.0: 1838 | dependencies: 1839 | binary-extensions: 2.3.0 1840 | 1841 | is-core-module@2.16.1: 1842 | dependencies: 1843 | hasown: 2.0.2 1844 | 1845 | is-extglob@2.1.1: {} 1846 | 1847 | is-fullwidth-code-point@3.0.0: {} 1848 | 1849 | is-glob@4.0.3: 1850 | dependencies: 1851 | is-extglob: 2.1.1 1852 | 1853 | is-number@7.0.0: {} 1854 | 1855 | isexe@2.0.0: {} 1856 | 1857 | jackspeak@3.4.3: 1858 | dependencies: 1859 | '@isaacs/cliui': 8.0.2 1860 | optionalDependencies: 1861 | '@pkgjs/parseargs': 0.11.0 1862 | 1863 | jiti@1.21.7: {} 1864 | 1865 | joycon@3.1.1: {} 1866 | 1867 | js-yaml@4.1.0: 1868 | dependencies: 1869 | argparse: 2.0.1 1870 | 1871 | json-buffer@3.0.1: {} 1872 | 1873 | json-schema-traverse@0.4.1: {} 1874 | 1875 | json-stable-stringify-without-jsonify@1.0.1: {} 1876 | 1877 | keyv@4.5.4: 1878 | dependencies: 1879 | json-buffer: 3.0.1 1880 | 1881 | levn@0.4.1: 1882 | dependencies: 1883 | prelude-ls: 1.2.1 1884 | type-check: 0.4.0 1885 | 1886 | lilconfig@3.1.3: {} 1887 | 1888 | lines-and-columns@1.2.4: {} 1889 | 1890 | load-tsconfig@0.2.5: {} 1891 | 1892 | locate-path@6.0.0: 1893 | dependencies: 1894 | p-locate: 5.0.0 1895 | 1896 | lodash.merge@4.6.2: {} 1897 | 1898 | lodash.sortby@4.7.0: {} 1899 | 1900 | lru-cache@10.4.3: {} 1901 | 1902 | merge2@1.4.1: {} 1903 | 1904 | micromatch@4.0.8: 1905 | dependencies: 1906 | braces: 3.0.3 1907 | picomatch: 2.3.1 1908 | 1909 | minimatch@3.1.2: 1910 | dependencies: 1911 | brace-expansion: 1.1.11 1912 | 1913 | minimatch@9.0.5: 1914 | dependencies: 1915 | brace-expansion: 2.0.1 1916 | 1917 | minipass@7.1.2: {} 1918 | 1919 | ms@2.1.3: {} 1920 | 1921 | mz@2.7.0: 1922 | dependencies: 1923 | any-promise: 1.3.0 1924 | object-assign: 4.1.1 1925 | thenify-all: 1.6.0 1926 | 1927 | nanoid@3.3.8: {} 1928 | 1929 | natural-compare@1.4.0: {} 1930 | 1931 | normalize-path@3.0.0: {} 1932 | 1933 | object-assign@4.1.1: {} 1934 | 1935 | object-hash@3.0.0: {} 1936 | 1937 | optionator@0.9.4: 1938 | dependencies: 1939 | deep-is: 0.1.4 1940 | fast-levenshtein: 2.0.6 1941 | levn: 0.4.1 1942 | prelude-ls: 1.2.1 1943 | type-check: 0.4.0 1944 | word-wrap: 1.2.5 1945 | 1946 | p-limit@3.1.0: 1947 | dependencies: 1948 | yocto-queue: 0.1.0 1949 | 1950 | p-locate@5.0.0: 1951 | dependencies: 1952 | p-limit: 3.1.0 1953 | 1954 | package-json-from-dist@1.0.1: {} 1955 | 1956 | parent-module@1.0.1: 1957 | dependencies: 1958 | callsites: 3.1.0 1959 | 1960 | path-exists@4.0.0: {} 1961 | 1962 | path-key@3.1.1: {} 1963 | 1964 | path-parse@1.0.7: {} 1965 | 1966 | path-scurry@1.11.1: 1967 | dependencies: 1968 | lru-cache: 10.4.3 1969 | minipass: 7.1.2 1970 | 1971 | picocolors@1.1.1: {} 1972 | 1973 | picomatch@2.3.1: {} 1974 | 1975 | picomatch@4.0.2: {} 1976 | 1977 | pify@2.3.0: {} 1978 | 1979 | pirates@4.0.6: {} 1980 | 1981 | postcss-import@15.1.0(postcss@8.5.1): 1982 | dependencies: 1983 | postcss: 8.5.1 1984 | postcss-value-parser: 4.2.0 1985 | read-cache: 1.0.0 1986 | resolve: 1.22.10 1987 | 1988 | postcss-js@4.0.1(postcss@8.5.1): 1989 | dependencies: 1990 | camelcase-css: 2.0.1 1991 | postcss: 8.5.1 1992 | 1993 | postcss-load-config@4.0.2(postcss@8.5.1): 1994 | dependencies: 1995 | lilconfig: 3.1.3 1996 | yaml: 2.7.0 1997 | optionalDependencies: 1998 | postcss: 8.5.1 1999 | 2000 | postcss-load-config@6.0.1(jiti@1.21.7)(postcss@8.5.1)(yaml@2.7.0): 2001 | dependencies: 2002 | lilconfig: 3.1.3 2003 | optionalDependencies: 2004 | jiti: 1.21.7 2005 | postcss: 8.5.1 2006 | yaml: 2.7.0 2007 | 2008 | postcss-nested@6.2.0(postcss@8.5.1): 2009 | dependencies: 2010 | postcss: 8.5.1 2011 | postcss-selector-parser: 6.1.2 2012 | 2013 | postcss-selector-parser@6.1.2: 2014 | dependencies: 2015 | cssesc: 3.0.0 2016 | util-deprecate: 1.0.2 2017 | 2018 | postcss-value-parser@4.2.0: {} 2019 | 2020 | postcss@8.5.1: 2021 | dependencies: 2022 | nanoid: 3.3.8 2023 | picocolors: 1.1.1 2024 | source-map-js: 1.2.1 2025 | 2026 | prelude-ls@1.2.1: {} 2027 | 2028 | punycode@2.3.1: {} 2029 | 2030 | queue-microtask@1.2.3: {} 2031 | 2032 | read-cache@1.0.0: 2033 | dependencies: 2034 | pify: 2.3.0 2035 | 2036 | readdirp@3.6.0: 2037 | dependencies: 2038 | picomatch: 2.3.1 2039 | 2040 | readdirp@4.1.1: {} 2041 | 2042 | resolve-from@4.0.0: {} 2043 | 2044 | resolve-from@5.0.0: {} 2045 | 2046 | resolve@1.22.10: 2047 | dependencies: 2048 | is-core-module: 2.16.1 2049 | path-parse: 1.0.7 2050 | supports-preserve-symlinks-flag: 1.0.0 2051 | 2052 | reusify@1.0.4: {} 2053 | 2054 | rollup@4.30.1: 2055 | dependencies: 2056 | '@types/estree': 1.0.6 2057 | optionalDependencies: 2058 | '@rollup/rollup-android-arm-eabi': 4.30.1 2059 | '@rollup/rollup-android-arm64': 4.30.1 2060 | '@rollup/rollup-darwin-arm64': 4.30.1 2061 | '@rollup/rollup-darwin-x64': 4.30.1 2062 | '@rollup/rollup-freebsd-arm64': 4.30.1 2063 | '@rollup/rollup-freebsd-x64': 4.30.1 2064 | '@rollup/rollup-linux-arm-gnueabihf': 4.30.1 2065 | '@rollup/rollup-linux-arm-musleabihf': 4.30.1 2066 | '@rollup/rollup-linux-arm64-gnu': 4.30.1 2067 | '@rollup/rollup-linux-arm64-musl': 4.30.1 2068 | '@rollup/rollup-linux-loongarch64-gnu': 4.30.1 2069 | '@rollup/rollup-linux-powerpc64le-gnu': 4.30.1 2070 | '@rollup/rollup-linux-riscv64-gnu': 4.30.1 2071 | '@rollup/rollup-linux-s390x-gnu': 4.30.1 2072 | '@rollup/rollup-linux-x64-gnu': 4.30.1 2073 | '@rollup/rollup-linux-x64-musl': 4.30.1 2074 | '@rollup/rollup-win32-arm64-msvc': 4.30.1 2075 | '@rollup/rollup-win32-ia32-msvc': 4.30.1 2076 | '@rollup/rollup-win32-x64-msvc': 4.30.1 2077 | fsevents: 2.3.3 2078 | 2079 | run-parallel@1.2.0: 2080 | dependencies: 2081 | queue-microtask: 1.2.3 2082 | 2083 | semver@7.6.3: {} 2084 | 2085 | shebang-command@2.0.0: 2086 | dependencies: 2087 | shebang-regex: 3.0.0 2088 | 2089 | shebang-regex@3.0.0: {} 2090 | 2091 | signal-exit@4.1.0: {} 2092 | 2093 | source-map-js@1.2.1: {} 2094 | 2095 | source-map@0.8.0-beta.0: 2096 | dependencies: 2097 | whatwg-url: 7.1.0 2098 | 2099 | string-width@4.2.3: 2100 | dependencies: 2101 | emoji-regex: 8.0.0 2102 | is-fullwidth-code-point: 3.0.0 2103 | strip-ansi: 6.0.1 2104 | 2105 | string-width@5.1.2: 2106 | dependencies: 2107 | eastasianwidth: 0.2.0 2108 | emoji-regex: 9.2.2 2109 | strip-ansi: 7.1.0 2110 | 2111 | strip-ansi@6.0.1: 2112 | dependencies: 2113 | ansi-regex: 5.0.1 2114 | 2115 | strip-ansi@7.1.0: 2116 | dependencies: 2117 | ansi-regex: 6.1.0 2118 | 2119 | strip-json-comments@3.1.1: {} 2120 | 2121 | sucrase@3.35.0: 2122 | dependencies: 2123 | '@jridgewell/gen-mapping': 0.3.8 2124 | commander: 4.1.1 2125 | glob: 10.4.5 2126 | lines-and-columns: 1.2.4 2127 | mz: 2.7.0 2128 | pirates: 4.0.6 2129 | ts-interface-checker: 0.1.13 2130 | 2131 | supports-color@7.2.0: 2132 | dependencies: 2133 | has-flag: 4.0.0 2134 | 2135 | supports-preserve-symlinks-flag@1.0.0: {} 2136 | 2137 | tailwindcss@3.4.17: 2138 | dependencies: 2139 | '@alloc/quick-lru': 5.2.0 2140 | arg: 5.0.2 2141 | chokidar: 3.6.0 2142 | didyoumean: 1.2.2 2143 | dlv: 1.1.3 2144 | fast-glob: 3.3.3 2145 | glob-parent: 6.0.2 2146 | is-glob: 4.0.3 2147 | jiti: 1.21.7 2148 | lilconfig: 3.1.3 2149 | micromatch: 4.0.8 2150 | normalize-path: 3.0.0 2151 | object-hash: 3.0.0 2152 | picocolors: 1.1.1 2153 | postcss: 8.5.1 2154 | postcss-import: 15.1.0(postcss@8.5.1) 2155 | postcss-js: 4.0.1(postcss@8.5.1) 2156 | postcss-load-config: 4.0.2(postcss@8.5.1) 2157 | postcss-nested: 6.2.0(postcss@8.5.1) 2158 | postcss-selector-parser: 6.1.2 2159 | resolve: 1.22.10 2160 | sucrase: 3.35.0 2161 | transitivePeerDependencies: 2162 | - ts-node 2163 | 2164 | thenify-all@1.6.0: 2165 | dependencies: 2166 | thenify: 3.3.1 2167 | 2168 | thenify@3.3.1: 2169 | dependencies: 2170 | any-promise: 1.3.0 2171 | 2172 | tinyexec@0.3.2: {} 2173 | 2174 | tinyglobby@0.2.10: 2175 | dependencies: 2176 | fdir: 6.4.3(picomatch@4.0.2) 2177 | picomatch: 4.0.2 2178 | 2179 | to-regex-range@5.0.1: 2180 | dependencies: 2181 | is-number: 7.0.0 2182 | 2183 | tr46@1.0.1: 2184 | dependencies: 2185 | punycode: 2.3.1 2186 | 2187 | tree-kill@1.2.2: {} 2188 | 2189 | ts-api-utils@2.0.0(typescript@5.7.3): 2190 | dependencies: 2191 | typescript: 5.7.3 2192 | 2193 | ts-interface-checker@0.1.13: {} 2194 | 2195 | tsup@8.3.5(jiti@1.21.7)(postcss@8.5.1)(typescript@5.7.3)(yaml@2.7.0): 2196 | dependencies: 2197 | bundle-require: 5.1.0(esbuild@0.24.2) 2198 | cac: 6.7.14 2199 | chokidar: 4.0.3 2200 | consola: 3.4.0 2201 | debug: 4.4.0 2202 | esbuild: 0.24.2 2203 | joycon: 3.1.1 2204 | picocolors: 1.1.1 2205 | postcss-load-config: 6.0.1(jiti@1.21.7)(postcss@8.5.1)(yaml@2.7.0) 2206 | resolve-from: 5.0.0 2207 | rollup: 4.30.1 2208 | source-map: 0.8.0-beta.0 2209 | sucrase: 3.35.0 2210 | tinyexec: 0.3.2 2211 | tinyglobby: 0.2.10 2212 | tree-kill: 1.2.2 2213 | optionalDependencies: 2214 | postcss: 8.5.1 2215 | typescript: 5.7.3 2216 | transitivePeerDependencies: 2217 | - jiti 2218 | - supports-color 2219 | - tsx 2220 | - yaml 2221 | 2222 | type-check@0.4.0: 2223 | dependencies: 2224 | prelude-ls: 1.2.1 2225 | 2226 | typescript-eslint@8.20.0(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3): 2227 | dependencies: 2228 | '@typescript-eslint/eslint-plugin': 8.20.0(@typescript-eslint/parser@8.20.0(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3))(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3) 2229 | '@typescript-eslint/parser': 8.20.0(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3) 2230 | '@typescript-eslint/utils': 8.20.0(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3) 2231 | eslint: 9.18.0(jiti@1.21.7) 2232 | typescript: 5.7.3 2233 | transitivePeerDependencies: 2234 | - supports-color 2235 | 2236 | typescript@5.7.3: {} 2237 | 2238 | undici-types@6.20.0: {} 2239 | 2240 | uri-js@4.4.1: 2241 | dependencies: 2242 | punycode: 2.3.1 2243 | 2244 | util-deprecate@1.0.2: {} 2245 | 2246 | webidl-conversions@4.0.2: {} 2247 | 2248 | whatwg-url@7.1.0: 2249 | dependencies: 2250 | lodash.sortby: 4.7.0 2251 | tr46: 1.0.1 2252 | webidl-conversions: 4.0.2 2253 | 2254 | which@2.0.2: 2255 | dependencies: 2256 | isexe: 2.0.0 2257 | 2258 | word-wrap@1.2.5: {} 2259 | 2260 | wrap-ansi@7.0.0: 2261 | dependencies: 2262 | ansi-styles: 4.3.0 2263 | string-width: 4.2.3 2264 | strip-ansi: 6.0.1 2265 | 2266 | wrap-ansi@8.1.0: 2267 | dependencies: 2268 | ansi-styles: 6.2.1 2269 | string-width: 5.1.2 2270 | strip-ansi: 7.1.0 2271 | 2272 | yaml@2.7.0: {} 2273 | 2274 | yocto-queue@0.1.0: {} 2275 | -------------------------------------------------------------------------------- /src/baseAnimations.ts: -------------------------------------------------------------------------------- 1 | import flattenColorPalette from "tailwindcss/lib/util/flattenColorPalette.js"; 2 | import type { Config, PluginAPI } from "tailwindcss/types/config.js"; 3 | 4 | type ThemeConfig = { 5 | blur: Record; 6 | colors: Record; 7 | grayscale: Record; 8 | motionBackgroundColor: Record; 9 | motionBlur: Record; 10 | motionGrayscale: Record; 11 | motionOpacity: Record; 12 | motionRotate: Record; 13 | motionScale: Record; 14 | motionTextColor: Record; 15 | motionTranslate: Record; 16 | opacity: Record; 17 | rotate: Record; 18 | scale: Record; 19 | }; 20 | 21 | // animation strings 22 | export const scaleInAnimation = 23 | "motion-scale-in calc(var(--motion-scale-duration) * var(--motion-scale-perceptual-duration-multiplier)) var(--motion-scale-timing) var(--motion-scale-delay) both"; 24 | 25 | export const scaleOutAnimation = 26 | "motion-scale-out calc(var(--motion-scale-duration) * var(--motion-scale-perceptual-duration-multiplier)) var(--motion-scale-timing) var(--motion-scale-delay) both"; 27 | 28 | export const scaleLoopAnimation = (type: string) => 29 | `motion-scale-loop-${type} calc(var(--motion-scale-duration) * var(--motion-scale-perceptual-duration-multiplier)) var(--motion-scale-timing) var(--motion-scale-delay) both var(--motion-scale-loop-count)`; 30 | 31 | export const translateInAnimation = 32 | "motion-translate-in calc(var(--motion-translate-duration) * var(--motion-translate-perceptual-duration-multiplier)) var(--motion-translate-timing) var(--motion-translate-delay) both"; 33 | 34 | export const translateOutAnimation = 35 | "motion-translate-out calc(var(--motion-translate-duration) * var(--motion-translate-perceptual-duration-multiplier)) var(--motion-translate-timing) var(--motion-translate-delay) both"; 36 | 37 | export const translateLoopAnimation = (type: string) => 38 | `motion-translate-loop-${type} calc(var(--motion-translate-duration) * var(--motion-translate-perceptual-duration-multiplier)) var(--motion-translate-timing) var(--motion-translate-delay) both var(--motion-translate-loop-count)`; 39 | 40 | export const rotateInAnimation = 41 | "motion-rotate-in calc(var(--motion-rotate-duration) * var(--motion-rotate-perceptual-duration-multiplier)) var(--motion-rotate-timing) var(--motion-rotate-delay) both"; 42 | 43 | export const rotateOutAnimation = 44 | "motion-rotate-out calc(var(--motion-rotate-duration) * var(--motion-rotate-perceptual-duration-multiplier)) var(--motion-rotate-timing) var(--motion-rotate-delay) both"; 45 | 46 | export const rotateLoopAnimation = (type: string) => 47 | `motion-rotate-loop-${type} calc(var(--motion-rotate-duration) * var(--motion-rotate-perceptual-duration-multiplier)) var(--motion-rotate-timing) var(--motion-rotate-delay) both var(--motion-rotate-loop-count)`; 48 | 49 | export const filterInAnimation = 50 | "motion-filter-in calc(var(--motion-filter-duration) * var(--motion-filter-perceptual-duration-multiplier)) var(--motion-filter-timing) var(--motion-filter-delay) both"; 51 | export const filterOutAnimation = 52 | "motion-filter-out calc(var(--motion-filter-duration) * var(--motion-filter-perceptual-duration-multiplier)) var(--motion-filter-timing) var(--motion-filter-delay) both"; 53 | 54 | export const filterLoopAnimation = (type: string) => 55 | `motion-filter-loop-${type} calc(var(--motion-filter-duration) * var(--motion-filter-perceptual-duration-multiplier)) var(--motion-filter-timing) var(--motion-filter-delay) both var(--motion-filter-loop-count)`; 56 | 57 | export const opacityInAnimation = 58 | "motion-opacity-in calc(var(--motion-opacity-duration) * var(--motion-opacity-perceptual-duration-multiplier)) var(--motion-opacity-timing) var(--motion-opacity-delay) both"; 59 | 60 | export const opacityOutAnimation = 61 | "motion-opacity-out calc(var(--motion-opacity-duration) * var(--motion-opacity-perceptual-duration-multiplier)) var(--motion-opacity-timing) var(--motion-opacity-delay) both"; 62 | 63 | export const opacityLoopAnimation = (type: string) => 64 | `motion-opacity-loop-${type} calc(var(--motion-opacity-duration) * var(--motion-opacity-perceptual-duration-multiplier)) var(--motion-opacity-timing) var(--motion-opacity-delay) both var(--motion-opacity-loop-count)`; 65 | 66 | export const backgroundColorInAnimation = 67 | "motion-background-color-in calc(var(--motion-background-color-duration) * var(--motion-background-color-perceptual-duration-multiplier)) var(--motion-background-color-timing) var(--motion-background-color-delay) both"; 68 | 69 | export const backgroundColorOutAnimation = 70 | "motion-background-color-out calc(var(--motion-background-color-duration) * var(--motion-background-color-perceptual-duration-multiplier)) var(--motion-background-color-timing) var(--motion-background-color-delay) both"; 71 | 72 | export const backgroundColorLoopAnimation = (type: string) => 73 | `motion-background-color-loop-${type} calc(var(--motion-background-color-duration) * var(--motion-background-color-perceptual-duration-multiplier)) var(--motion-background-color-timing) var(--motion-background-color-delay) both var(--motion-background-color-loop-count)`; 74 | 75 | export const textColorInAnimation = 76 | "motion-text-color-in calc(var(--motion-text-color-duration) * var(--motion-text-color-perceptual-duration-multiplier)) var(--motion-text-color-timing) var(--motion-text-color-delay) both"; 77 | 78 | export const textColorOutAnimation = 79 | "motion-text-color-out calc(var(--motion-text-color-duration) * var(--motion-text-color-perceptual-duration-multiplier)) var(--motion-text-color-timing) var(--motion-text-color-delay) both"; 80 | 81 | export const textColorLoopAnimation = (type: string) => 82 | `motion-text-color-loop-${type} calc(var(--motion-text-color-duration) * var(--motion-text-color-perceptual-duration-multiplier)) var(--motion-text-color-timing) var(--motion-text-color-delay) both var(--motion-text-color-loop-count)`; 83 | 84 | export function addBaseAnimations( 85 | matchUtilities: PluginAPI["matchUtilities"], 86 | theme: (path: keyof ThemeConfig) => Record 87 | ) { 88 | // scale 89 | matchUtilities( 90 | { 91 | "motion-scale-in": (value) => ({ 92 | "--motion-origin-scale-x": value, 93 | "--motion-origin-scale-y": value, 94 | "--motion-scale-in-animation": scaleInAnimation, 95 | animation: "var(--motion-all-loop-and-enter-animations)", 96 | }), 97 | "motion-scale-x-in": (value) => ({ 98 | "--motion-origin-scale-x": value, 99 | "--motion-scale-in-animation": scaleInAnimation, 100 | animation: "var(--motion-all-loop-and-enter-animations)", 101 | }), 102 | "motion-scale-y-in": (value) => ({ 103 | "--motion-origin-scale-y": value, 104 | "--motion-scale-in-animation": scaleInAnimation, 105 | animation: "var(--motion-all-loop-and-enter-animations)", 106 | }), 107 | 108 | "motion-scale-out": (value) => ({ 109 | "--motion-end-scale-x": value, 110 | "--motion-end-scale-y": value, 111 | "--motion-scale-out-animation": scaleOutAnimation, 112 | animation: "var(--motion-all-exit-animations)", 113 | }), 114 | "motion-scale-x-out": (value) => ({ 115 | "--motion-end-scale-x": value, 116 | "--motion-scale-out-animation": scaleOutAnimation, 117 | animation: "var(--motion-all-exit-animations)", 118 | }), 119 | "motion-scale-y-out": (value) => ({ 120 | "--motion-end-scale-y": value, 121 | "--motion-scale-out-animation": scaleOutAnimation, 122 | animation: "var(--motion-all-exit-animations)", 123 | }), 124 | }, 125 | { 126 | values: theme("motionScale"), 127 | } 128 | ); 129 | 130 | // scale loop 131 | matchUtilities( 132 | { 133 | "motion-scale-x-loop": (value, { modifier }) => ({ 134 | "--motion-loop-scale-x": value, 135 | "--motion-scale-loop-animation": scaleLoopAnimation( 136 | modifier || "mirror" 137 | ), 138 | animationComposition: "accumulate", 139 | animation: "var(--motion-all-loop-and-enter-animations)", 140 | }), 141 | "motion-scale-y-loop": (value, { modifier }) => ({ 142 | "--motion-loop-scale-y": value, 143 | "--motion-scale-loop-animation": scaleLoopAnimation( 144 | modifier || "mirror" 145 | ), 146 | animationComposition: "accumulate", 147 | animation: "var(--motion-all-loop-and-enter-animations)", 148 | }), 149 | "motion-scale-loop": (value, { modifier }) => ({ 150 | "--motion-loop-scale-x": value, 151 | "--motion-loop-scale-y": value, 152 | "--motion-scale-loop-animation": scaleLoopAnimation( 153 | modifier || "mirror" 154 | ), 155 | animationComposition: "accumulate", 156 | animation: "var(--motion-all-loop-and-enter-animations)", 157 | }), 158 | }, 159 | { 160 | values: theme("motionScale"), 161 | modifiers: { 162 | mirror: "mirror", 163 | reset: "reset", 164 | }, 165 | } 166 | ); 167 | 168 | // translate 169 | matchUtilities( 170 | { 171 | "motion-translate-x-in": (value) => ({ 172 | "--motion-origin-translate-x": value, 173 | "--motion-translate-in-animation": translateInAnimation, 174 | animation: "var(--motion-all-loop-and-enter-animations)", 175 | }), 176 | "motion-translate-y-in": (value) => ({ 177 | "--motion-origin-translate-y": value, 178 | "--motion-translate-in-animation": translateInAnimation, 179 | animation: "var(--motion-all-loop-and-enter-animations)", 180 | }), 181 | 182 | "motion-translate-x-out": (value) => ({ 183 | "--motion-end-translate-x": value, 184 | "--motion-translate-out-animation": translateOutAnimation, 185 | animation: "var(--motion-all-exit-animations)", 186 | }), 187 | "motion-translate-y-out": (value) => ({ 188 | "--motion-end-translate-y": value, 189 | "--motion-translate-out-animation": translateOutAnimation, 190 | animation: "var(--motion-all-exit-animations)", 191 | }), 192 | }, 193 | { 194 | values: theme("motionTranslate"), 195 | supportsNegativeValues: true, 196 | } 197 | ); 198 | 199 | // translate loop 200 | matchUtilities( 201 | { 202 | "motion-translate-x-loop": (value, { modifier }) => { 203 | return { 204 | "--motion-loop-translate-x": value, 205 | "--motion-translate-loop-animation": translateLoopAnimation( 206 | modifier || "mirror" 207 | ), 208 | animationComposition: "accumulate", 209 | animation: "var(--motion-all-loop-and-enter-animations)", 210 | }; 211 | }, 212 | "motion-translate-y-loop": (value, { modifier }) => { 213 | return { 214 | "--motion-loop-translate-y": value, 215 | "--motion-translate-loop-animation": translateLoopAnimation( 216 | modifier || "mirror" 217 | ), 218 | animationComposition: "accumulate", 219 | animation: "var(--motion-all-loop-and-enter-animations)", 220 | }; 221 | }, 222 | }, 223 | { 224 | values: theme("motionTranslate"), 225 | supportsNegativeValues: true, 226 | modifiers: { 227 | mirror: "mirror", 228 | reset: "reset", 229 | }, 230 | } 231 | ); 232 | 233 | // rotate 234 | matchUtilities( 235 | { 236 | "motion-rotate-in": (value) => ({ 237 | "--motion-origin-rotate": value, 238 | "--motion-rotate-in-animation": rotateInAnimation, 239 | animation: "var(--motion-all-loop-and-enter-animations)", 240 | }), 241 | 242 | "motion-rotate-out": (value) => ({ 243 | "--motion-end-rotate": value, 244 | "--motion-rotate-out-animation": rotateOutAnimation, 245 | animation: "var(--motion-all-exit-animations)", 246 | }), 247 | }, 248 | { 249 | values: theme("motionRotate"), 250 | supportsNegativeValues: true, 251 | } 252 | ); 253 | 254 | // rotate loop 255 | matchUtilities( 256 | { 257 | "motion-rotate-loop": (value, { modifier }) => ({ 258 | "--motion-loop-rotate": value, 259 | "--motion-rotate-loop-animation": rotateLoopAnimation( 260 | modifier || "mirror" 261 | ), 262 | animationComposition: "accumulate", 263 | animation: "var(--motion-all-loop-and-enter-animations)", 264 | }), 265 | }, 266 | { 267 | values: theme("motionRotate"), 268 | supportsNegativeValues: true, 269 | modifiers: { 270 | mirror: "mirror", 271 | reset: "reset", 272 | }, 273 | } 274 | ); 275 | 276 | // blur 277 | matchUtilities( 278 | { 279 | "motion-blur-in": (value) => ({ 280 | "--motion-origin-blur": value, 281 | "--motion-filter-in-animation": filterInAnimation, 282 | animation: "var(--motion-all-loop-and-enter-animations)", 283 | }), 284 | 285 | "motion-blur-out": (value) => ({ 286 | "--motion-end-blur": value, 287 | "--motion-filter-out-animation": filterOutAnimation, 288 | animation: "var(--motion-all-exit-animations)", 289 | }), 290 | }, 291 | { 292 | values: theme("motionBlur"), 293 | } 294 | ); 295 | 296 | // blur loop 297 | matchUtilities( 298 | { 299 | "motion-blur-loop": (value, { modifier }) => ({ 300 | "--motion-loop-blur": value, 301 | "--motion-filter-loop-animation": filterLoopAnimation( 302 | modifier || "mirror" 303 | ), 304 | animationComposition: "accumulate", 305 | animation: "var(--motion-all-loop-and-enter-animations)", 306 | }), 307 | }, 308 | { 309 | values: theme("motionBlur"), 310 | modifiers: { 311 | mirror: "mirror", 312 | reset: "reset", 313 | }, 314 | } 315 | ); 316 | 317 | // grayscale 318 | matchUtilities( 319 | { 320 | "motion-grayscale-in": (value) => ({ 321 | "--motion-origin-grayscale": value, 322 | "--motion-filter-in-animation": filterInAnimation, 323 | animation: "var(--motion-all-loop-and-enter-animations)", 324 | }), 325 | 326 | "motion-grayscale-out": (value) => ({ 327 | "--motion-end-grayscale": value, 328 | "--motion-filter-out-animation": filterOutAnimation, 329 | animation: "var(--motion-all-exit-animations)", 330 | }), 331 | }, 332 | { 333 | values: theme("motionGrayscale"), 334 | } 335 | ); 336 | 337 | // grayscale loop 338 | matchUtilities( 339 | { 340 | "motion-grayscale-loop": (value, { modifier }) => ({ 341 | "--motion-loop-grayscale": value, 342 | "--motion-filter-loop-animation": filterLoopAnimation( 343 | modifier || "mirror" 344 | ), 345 | animationComposition: "accumulate", 346 | animation: "var(--motion-all-loop-and-enter-animations)", 347 | }), 348 | }, 349 | { 350 | values: theme("motionGrayscale"), 351 | modifiers: { 352 | mirror: "mirror", 353 | reset: "reset", 354 | }, 355 | } 356 | ); 357 | 358 | // opacity 359 | matchUtilities( 360 | { 361 | "motion-opacity-in": (value) => ({ 362 | "--motion-origin-opacity": value, 363 | "--motion-opacity-in-animation": opacityInAnimation, 364 | animation: "var(--motion-all-loop-and-enter-animations)", 365 | }), 366 | 367 | "motion-opacity-out": (value) => ({ 368 | "--motion-end-opacity": value, 369 | "--motion-opacity-out-animation": opacityOutAnimation, 370 | animation: "var(--motion-all-exit-animations)", 371 | }), 372 | }, 373 | { 374 | values: theme("motionOpacity"), 375 | } 376 | ); 377 | 378 | // opacity loop 379 | matchUtilities( 380 | { 381 | "motion-opacity-loop": (value, { modifier }) => ({ 382 | // we need to subtract 1 because of animation composition 383 | "--motion-loop-opacity": `calc(${value} - 1)`, 384 | "--motion-opacity-loop-animation": opacityLoopAnimation( 385 | modifier || "mirror" 386 | ), 387 | animationComposition: "accumulate", 388 | animation: "var(--motion-all-loop-and-enter-animations)", 389 | }), 390 | }, 391 | { 392 | values: theme("motionOpacity"), 393 | modifiers: { 394 | mirror: "mirror", 395 | reset: "reset", 396 | }, 397 | } 398 | ); 399 | 400 | // background-color 401 | matchUtilities( 402 | { 403 | "motion-bg-in": (value) => ({ 404 | "--motion-origin-background-color": value, 405 | "--motion-background-color-in-animation": backgroundColorInAnimation, 406 | animation: "var(--motion-all-loop-and-enter-animations)", 407 | }), 408 | 409 | "motion-bg-out": (value) => ({ 410 | "--motion-end-background-color": value, 411 | "--motion-background-color-out-animation": backgroundColorOutAnimation, 412 | animation: "var(--motion-all-exit-animations)", 413 | }), 414 | }, 415 | { 416 | values: theme("motionBackgroundColor"), 417 | type: "color", 418 | } 419 | ); 420 | 421 | // background-color loop 422 | matchUtilities( 423 | { 424 | "motion-bg-loop": (value, { modifier }) => ({ 425 | "--motion-loop-background-color": value, 426 | "--motion-background-color-loop-animation": 427 | backgroundColorLoopAnimation(modifier || "mirror"), 428 | // no animation composition because it makes colors add 429 | animation: "var(--motion-all-loop-and-enter-animations)", 430 | }), 431 | }, 432 | { 433 | values: theme("motionBackgroundColor"), 434 | type: "color", 435 | modifiers: { 436 | mirror: "mirror", 437 | reset: "reset", 438 | }, 439 | } 440 | ); 441 | 442 | // text-color 443 | matchUtilities( 444 | { 445 | "motion-text-in": (value) => ({ 446 | "--motion-origin-text-color": value, 447 | "--motion-text-color-in-animation": textColorInAnimation, 448 | animation: "var(--motion-all-loop-and-enter-animations)", 449 | }), 450 | 451 | "motion-text-out": (value) => ({ 452 | "--motion-end-text-color": value, 453 | "--motion-text-color-out-animation": textColorOutAnimation, 454 | animation: "var(--motion-all-exit-animations)", 455 | }), 456 | }, 457 | { 458 | values: theme("motionTextColor"), 459 | type: "color", 460 | } 461 | ); 462 | 463 | // text-color loop 464 | matchUtilities( 465 | { 466 | "motion-text-loop": (value, { modifier }) => ({ 467 | "--motion-loop-text-color": value, 468 | "--motion-text-color-loop-animation": textColorLoopAnimation( 469 | modifier || "mirror" 470 | ), 471 | animationComposition: "accumulate", 472 | animation: "var(--motion-all-loop-and-enter-animations)", 473 | }), 474 | }, 475 | { 476 | values: theme("motionTextColor"), 477 | type: "color", 478 | modifiers: { 479 | mirror: "mirror", 480 | reset: "reset", 481 | }, 482 | } 483 | ); 484 | } 485 | 486 | export const baseAnimationsTheme: Config["theme"] = { 487 | motionScale: ( 488 | theme: (path: keyof ThemeConfig) => Record 489 | ) => ({ 490 | ...theme("scale"), 491 | DEFAULT: "50%", 492 | }), 493 | motionTranslate: { 494 | "0": "0%", 495 | "25": "25%", 496 | "50": "50%", 497 | "75": "75%", 498 | "100": "100%", 499 | "150": "150%", 500 | DEFAULT: "25%", 501 | }, 502 | motionRotate: ( 503 | theme: (path: keyof ThemeConfig) => Record 504 | ) => ({ 505 | ...theme("rotate"), 506 | DEFAULT: "12deg", 507 | }), 508 | motionBlur: (theme: (path: keyof ThemeConfig) => Record) => 509 | theme("blur"), 510 | motionGrayscale: ( 511 | theme: (path: keyof ThemeConfig) => Record 512 | ) => theme("grayscale"), 513 | motionOpacity: ( 514 | theme: (path: keyof ThemeConfig) => Record 515 | ) => ({ 516 | ...theme("opacity"), 517 | DEFAULT: "0", 518 | "0": "0.001", 519 | }), 520 | motionBackgroundColor: ( 521 | theme: (path: keyof ThemeConfig) => Record 522 | ) => flattenColorPalette(theme("colors")), 523 | motionTextColor: ( 524 | theme: (path: keyof ThemeConfig) => Record 525 | ) => flattenColorPalette(theme("colors")), 526 | } as const; 527 | -------------------------------------------------------------------------------- /src/defaults.ts: -------------------------------------------------------------------------------- 1 | import type { PluginAPI } from "tailwindcss/types/config.js"; 2 | 3 | export default function addDefaults(addBase: PluginAPI["addBase"]) { 4 | // default values for the motion variables 5 | addBase({ 6 | ":root": { 7 | "--motion-default-timing": "cubic-bezier(.165, .84, .44, 1)", 8 | 9 | "--motion-bounce": 10 | "linear(0, 0.004, 0.016, 0.035, 0.063, 0.098, 0.141 13.6%, 0.25, 0.391, 0.563, 0.765,1, 0.891 40.9%, 0.848, 0.813, 0.785, 0.766, 0.754, 0.75, 0.754, 0.766, 0.785,0.813, 0.848, 0.891 68.2%, 1 72.7%, 0.973, 0.953, 0.941, 0.938, 0.941, 0.953,0.973, 1, 0.988, 0.984, 0.988, 1)", 11 | 12 | // from https://www.kvin.me/css-springs 13 | // Bounce: 0% 14 | "--motion-spring-smooth": 15 | "linear(0, 0.001 0.44%, 0.0045 0.94%, 0.0195 2.03%, 0.0446 3.19%, 0.0811 4.5%, 0.1598 6.82%, 0.3685 12.34%, 0.4693 15.17%, 0.5663, 0.6498 21.27%, 0.7215 24.39%, 0.7532 25.98%, 0.7829 27.65%, 0.8105, 0.8349 31.14%, 0.8573 32.95%, 0.8776 34.84%, 0.8964 36.87%, 0.9136 39.05%, 0.929 41.37%, 0.9421 43.77%, 0.9537 46.38%, 0.9636 49.14%, 0.9789 55.31%, 0.9888 62.35%, 0.9949 71.06%, 0.9982 82.52%, 0.9997 99.94%)", 16 | 17 | // Bounce: 15% 18 | "--motion-spring-snappy": 19 | "linear(0, 0.0014, 0.0053 1.02%, 0.0126, 0.0227 2.18%, 0.0517 3.41%, 0.094 4.79%, 0.1865 7.26%, 0.4182 12.77%, 0.5246 15.46%, 0.6249, 0.7112, 0.7831 23.95%, 0.8146 25.4%, 0.844, 0.8699 28.45%, 0.8935, 0.9139 31.64%, 0.932, 0.9473, 0.9601 36.65%, 0.9714 38.47%, 0.9808 40.35%, 0.9948 44.49%, 1.0031 49.43%, 1.0057 53.35%, 1.0063 58.14%, 1.0014 80.78%, 1.0001 99.94%)", 20 | 21 | // Bounce: 30% 22 | "--motion-spring-bouncy": 23 | "linear(0, 0.0018, 0.0069, 0.0151 1.74%, 0.0277 2.4%, 0.062 3.7%, 0.1115 5.15%, 0.2211 7.77%, 0.4778 13.21%, 0.5912 15.75%, 0.6987 18.44%, 0.7862 20.98%, 0.861 23.59%, 0.8926, 0.9205, 0.945 27.51%, 0.9671 28.89%, 0.9868, 1.003 31.79%, 1.0224 34.11%, 1.0358 36.58%, 1.0436 39.27%, 1.046 42.31%, 1.0446 44.71%, 1.0406 47.47%, 1.0118 61.84%, 1.0027 69.53%, 0.9981 80.49%, 0.9991 99.94%)", 24 | 25 | // Bounce: 50% 26 | "--motion-spring-bouncier": 27 | "linear(0, 0.0023, 0.0088, 0.0194 1.59%, 0.035 2.17%, 0.078 3.33%, 0.1415 4.64%, 0.2054 5.75%, 0.2821 6.95%, 0.5912 11.45%, 0.7205 13.43%, 0.8393 15.45%, 0.936 17.39%, 0.9778, 1.015, 1.0477, 1.0759, 1.0998 22.22%, 1.1203, 1.1364, 1.1484 25.26%, 1.1586 26.61%, 1.1629 28.06%, 1.1613 29.56%, 1.1537 31.2%, 1.1434 32.6%, 1.1288 34.19%, 1.0508 41.29%, 1.0174 44.87%, 1.0025 46.89%, 0.9911 48.87%, 0.9826 50.9%, 0.9769 53.03%, 0.9735 56.02%, 0.9748 59.45%, 0.9964 72.64%, 1.0031 79.69%, 1.0042 86.83%, 1.0008 99.97%)", 28 | 29 | // Bounce: 80% 30 | "--motion-spring-bounciest": 31 | "linear(0, 0.0032, 0.0131, 0.0294, 0.0524, 0.0824, 0.1192 1.54%, 0.2134 2.11%, 0.3102 2.59%, 0.4297 3.13%, 0.8732 4.95%, 1.0373, 1.1827 6.36%, 1.2972 7.01%, 1.3444, 1.3859, 1.4215, 1.4504, 1.4735, 1.4908, 1.5024, 1.5084 9.5%, 1.5091, 1.5061, 1.4993, 1.4886, 1.4745, 1.4565 11.11%, 1.4082 11.7%, 1.3585 12.2%, 1.295 12.77%, 1.0623 14.64%, 0.9773, 0.9031 16.08%, 0.8449 16.73%, 0.8014, 0.7701 17.95%, 0.7587, 0.7501, 0.7443, 0.7412 19.16%, 0.7421 19.68%, 0.7508 20.21%, 0.7672 20.77%, 0.7917 21.37%, 0.8169 21.87%, 0.8492 22.43%, 0.9681 24.32%, 1.0114, 1.0492 25.75%, 1.0789 26.41%, 1.1008, 1.1167, 1.1271, 1.1317 28.81%, 1.1314, 1.1271 29.87%, 1.1189 30.43%, 1.1063 31.03%, 1.0769 32.11%, 0.9941 34.72%, 0.9748 35.43%, 0.9597 36.09%, 0.9487, 0.9407, 0.9355, 0.933 38.46%, 0.9344 39.38%, 0.9421 40.38%, 0.9566 41.5%, 0.9989 44.12%, 1.0161 45.37%, 1.029 46.75%, 1.0341 48.1%, 1.0335 49.04%, 1.0295 50.05%, 1.0221 51.18%, 0.992 55.02%, 0.9854 56.38%, 0.9827 57.72%, 0.985 59.73%, 1.004 64.67%, 1.0088 67.34%, 1.0076 69.42%, 0.9981 74.28%, 0.9956 76.85%, 0.9961 79.06%, 1.0023 86.46%, 0.999 95.22%, 0.9994 100%)", 32 | }, 33 | 34 | // i didn't find a documented way to set these default variables 35 | // an issue and a discussion about this: 36 | // https://github.com/tailwindlabs/tailwindcss/issues/10514#issuecomment-1420879057 37 | // https://github.com/tailwindlabs/tailwindcss/discussions/8747 38 | "*": { 39 | // enter animations origin values 40 | "--motion-origin-scale-x": "100%", 41 | "--motion-origin-scale-y": "100%", 42 | "--motion-origin-translate-x": "0%", 43 | "--motion-origin-translate-y": "0%", 44 | "--motion-origin-rotate": "0deg", 45 | "--motion-origin-blur": "0px", 46 | "--motion-origin-grayscale": "0%", 47 | "--motion-origin-opacity": "100%", 48 | "--motion-origin-background-color": "", 49 | "--motion-origin-text-color": "", 50 | 51 | // exit animations end values 52 | "--motion-end-scale-x": "100%", 53 | "--motion-end-scale-y": "100%", 54 | "--motion-end-translate-x": "0%", 55 | "--motion-end-translate-y": "0%", 56 | "--motion-end-rotate": "0deg", 57 | "--motion-end-blur": "0px", 58 | "--motion-end-grayscale": "0%", 59 | "--motion-end-opacity": "100%", 60 | "--motion-end-background-color": "", 61 | "--motion-end-text-color": "", 62 | 63 | // loop animations values 64 | "--motion-loop-scale-x": "100%", 65 | "--motion-loop-scale-y": "100%", 66 | "--motion-loop-translate-x": "0%", 67 | "--motion-loop-translate-y": "0%", 68 | "--motion-loop-rotate": "0deg", 69 | "--motion-loop-blur": "0px", 70 | "--motion-loop-grayscale": "0%", 71 | "--motion-loop-opacity": "100%", 72 | "--motion-loop-background-color": "", 73 | "--motion-loop-text-color": "", 74 | 75 | // animation modifiers 76 | "--motion-duration": "700ms", 77 | "--motion-timing": "var(--motion-default-timing)", 78 | "--motion-perceptual-duration-multiplier": "1", 79 | "--motion-delay": "0ms", 80 | "--motion-loop-count": "infinite", 81 | 82 | //animation modifiers for each animation 83 | "--motion-scale-duration": "var(--motion-duration)", 84 | "--motion-scale-timing": "var(--motion-timing)", 85 | "--motion-scale-perceptual-duration-multiplier": 86 | "var(--motion-perceptual-duration-multiplier)", 87 | "--motion-scale-delay": "var(--motion-delay)", 88 | "--motion-scale-loop-count": "var(--motion-loop-count)", 89 | 90 | "--motion-translate-duration": "var(--motion-duration)", 91 | "--motion-translate-timing": "var(--motion-timing)", 92 | "--motion-translate-perceptual-duration-multiplier": 93 | "var(--motion-perceptual-duration-multiplier)", 94 | "--motion-translate-delay": "var(--motion-delay)", 95 | "--motion-translate-loop-count": "var(--motion-loop-count)", 96 | 97 | "--motion-rotate-duration": "var(--motion-duration)", 98 | "--motion-rotate-timing": "var(--motion-timing)", 99 | "--motion-rotate-perceptual-duration-multiplier": 100 | "var(--motion-perceptual-duration-multiplier)", 101 | "--motion-rotate-delay": "var(--motion-delay)", 102 | "--motion-rotate-loop-count": "var(--motion-loop-count)", 103 | 104 | // filter groups blur and grayscale 105 | "--motion-filter-duration": "var(--motion-duration)", 106 | "--motion-filter-timing": "var(--motion-timing)", 107 | "--motion-filter-perceptual-duration-multiplier": 108 | "var(--motion-perceptual-duration-multiplier)", 109 | "--motion-filter-delay": "var(--motion-delay)", 110 | "--motion-filter-loop-count": "var(--motion-loop-count)", 111 | 112 | "--motion-opacity-duration": "var(--motion-duration)", 113 | "--motion-opacity-timing": "var(--motion-timing)", 114 | "--motion-opacity-perceptual-duration-multiplier": 115 | "var(--motion-perceptual-duration-multiplier)", 116 | "--motion-opacity-delay": "var(--motion-delay)", 117 | "--motion-opacity-loop-count": "var(--motion-loop-count)", 118 | 119 | "--motion-background-color-duration": "var(--motion-duration)", 120 | "--motion-background-color-timing": "var(--motion-timing)", 121 | "--motion-background-color-perceptual-duration-multiplier": 122 | "var(--motion-perceptual-duration-multiplier)", 123 | "--motion-background-color-delay": "var(--motion-delay)", 124 | "--motion-background-color-loop-count": "var(--motion-loop-count)", 125 | 126 | "--motion-text-color-duration": "var(--motion-duration)", 127 | "--motion-text-color-timing": "var(--motion-timing)", 128 | "--motion-text-color-perceptual-duration-multiplier": 129 | "var(--motion-perceptual-duration-multiplier)", 130 | "--motion-text-color-delay": "var(--motion-delay)", 131 | "--motion-text-color-loop-count": "var(--motion-loop-count)", 132 | 133 | // default animations to none 134 | "--motion-scale-in-animation": "none", 135 | "--motion-translate-in-animation": "none", 136 | "--motion-rotate-in-animation": "none", 137 | "--motion-filter-in-animation": "none", 138 | "--motion-opacity-in-animation": "none", 139 | "--motion-background-color-in-animation": "none", 140 | "--motion-text-color-in-animation": "none", 141 | 142 | "--motion-scale-out-animation": "none", 143 | "--motion-translate-out-animation": "none", 144 | "--motion-rotate-out-animation": "none", 145 | "--motion-filter-out-animation": "none", 146 | "--motion-opacity-out-animation": "none", 147 | "--motion-background-color-out-animation": "none", 148 | "--motion-text-color-out-animation": "none", 149 | 150 | "--motion-scale-loop-animation": "none", 151 | "--motion-translate-loop-animation": "none", 152 | "--motion-rotate-loop-animation": "none", 153 | "--motion-filter-loop-animation": "none", 154 | "--motion-opacity-loop-animation": "none", 155 | "--motion-background-color-loop-animation": "none", 156 | "--motion-text-color-loop-animation": "none", 157 | 158 | // all animations 159 | "--motion-all-enter-animations": 160 | "var(--motion-scale-in-animation), var(--motion-translate-in-animation), var(--motion-rotate-in-animation), var(--motion-filter-in-animation), var(--motion-opacity-in-animation), var(--motion-background-color-in-animation), var(--motion-text-color-in-animation)", 161 | "--motion-all-exit-animations": 162 | "var(--motion-scale-out-animation), var(--motion-translate-out-animation), var(--motion-rotate-out-animation), var(--motion-filter-out-animation), var(--motion-opacity-out-animation), var(--motion-background-color-out-animation), var(--motion-text-color-out-animation)", 163 | "--motion-all-loop-animations": 164 | "var(--motion-scale-loop-animation), var(--motion-translate-loop-animation), var(--motion-rotate-loop-animation), var(--motion-filter-loop-animation), var(--motion-opacity-loop-animation), var(--motion-background-color-loop-animation), var(--motion-text-color-loop-animation)", 165 | "--motion-all-loop-and-enter-animations": 166 | "var(--motion-all-loop-animations), var(--motion-all-enter-animations)", 167 | }, 168 | }); 169 | } 170 | -------------------------------------------------------------------------------- /src/index.d.ts: -------------------------------------------------------------------------------- 1 | import type { PluginCreator } from "tailwindcss/types/config"; 2 | 3 | declare const plugin: { 4 | handler: PluginCreator; 5 | config?: { theme?: { extend?: Record } }; 6 | }; 7 | 8 | export = plugin; 9 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | import createPlugin from "tailwindcss/plugin.js"; 2 | import type { 3 | Config, 4 | PluginAPI, 5 | PluginCreator, 6 | } from "tailwindcss/types/config.js"; 7 | import { addBaseAnimations, baseAnimationsTheme } from "./baseAnimations.js"; 8 | import addDefaults from "./defaults.js"; 9 | import addKeyframes from "./keyframes.js"; 10 | import { addModifiers, modifiersTheme } from "./modifiers.js"; 11 | import { addPresets } from "./presets.js"; 12 | 13 | const pluginCreator: PluginCreator = ({ 14 | matchUtilities, 15 | theme, 16 | addBase, 17 | addUtilities, 18 | addComponents, 19 | matchComponents, 20 | }: PluginAPI) => { 21 | addDefaults(addBase); 22 | addKeyframes(addBase); 23 | addPresets(addComponents, matchComponents); 24 | addBaseAnimations(matchUtilities, theme); 25 | addModifiers(matchUtilities, addUtilities, theme); 26 | }; 27 | 28 | const pluginConfig: Partial = { 29 | theme: { 30 | ...modifiersTheme, 31 | ...baseAnimationsTheme, 32 | }, 33 | }; 34 | 35 | export default createPlugin(pluginCreator, pluginConfig); 36 | -------------------------------------------------------------------------------- /src/keyframes.ts: -------------------------------------------------------------------------------- 1 | import type { PluginAPI } from "tailwindcss/types/config.js"; 2 | 3 | export default function addKeyframes(addBase: PluginAPI["addBase"]) { 4 | // keyframes for the animations 5 | addBase({ 6 | // if the user prefers reduced motion, don't apply the transform animations 7 | "@media screen and (prefers-reduced-motion: no-preference)": { 8 | "@keyframes motion-scale-in": { 9 | "0%": { 10 | scale: "var(--motion-origin-scale-x) var(--motion-origin-scale-y)", 11 | }, 12 | "100%": { 13 | scale: "1 1", 14 | }, 15 | }, 16 | "@keyframes motion-scale-out": { 17 | "0%": { 18 | scale: "1 1", 19 | }, 20 | "100%": { 21 | scale: "var(--motion-end-scale-x) var(--motion-end-scale-y)", 22 | }, 23 | }, 24 | "@keyframes motion-scale-loop-mirror": { 25 | "0%, 100%": { 26 | scale: "1 1", 27 | }, 28 | "50%": { 29 | scale: "var(--motion-loop-scale-x) var(--motion-loop-scale-y)", 30 | }, 31 | }, 32 | "@keyframes motion-scale-loop-reset": { 33 | "0%": { 34 | scale: "1 1", 35 | }, 36 | "100%": { 37 | scale: "var(--motion-loop-scale-x) var(--motion-loop-scale-y)", 38 | }, 39 | }, 40 | "@keyframes motion-translate-in": { 41 | "0%": { 42 | translate: 43 | "var(--motion-origin-translate-x) var(--motion-origin-translate-y)", 44 | }, 45 | "100%": { 46 | translate: "0 0", 47 | }, 48 | }, 49 | "@keyframes motion-translate-out": { 50 | "0%": { 51 | translate: "0 0", 52 | }, 53 | "100%": { 54 | translate: 55 | "var(--motion-end-translate-x) var(--motion-end-translate-y)", 56 | }, 57 | }, 58 | "@keyframes motion-translate-loop-mirror": { 59 | "0%, 100%": { 60 | translate: "0 0", 61 | }, 62 | "50%": { 63 | translate: 64 | "var(--motion-loop-translate-x) var(--motion-loop-translate-y)", 65 | }, 66 | }, 67 | "@keyframes motion-translate-loop-reset": { 68 | "0%": { 69 | translate: "0 0", 70 | }, 71 | "100%": { 72 | translate: 73 | "var(--motion-loop-translate-x) var(--motion-loop-translate-y)", 74 | }, 75 | }, 76 | "@keyframes motion-rotate-in": { 77 | "0%": { 78 | rotate: "var(--motion-origin-rotate)", 79 | }, 80 | "100%": { 81 | rotate: "0", 82 | }, 83 | }, 84 | "@keyframes motion-rotate-out": { 85 | "0%": { 86 | rotate: "0", 87 | }, 88 | "100%": { 89 | rotate: "var(--motion-end-rotate)", 90 | }, 91 | }, 92 | "@keyframes motion-rotate-loop-mirror": { 93 | "0%, 100%": { 94 | rotate: "0deg", 95 | }, 96 | "50%": { 97 | rotate: "var(--motion-loop-rotate)", 98 | }, 99 | }, 100 | "@keyframes motion-rotate-loop-reset": { 101 | "0%": {}, 102 | "100%": { 103 | rotate: "var(--motion-loop-rotate)", 104 | }, 105 | }, 106 | }, 107 | "@keyframes motion-filter-in": { 108 | "0%": { 109 | filter: 110 | "blur(var(--motion-origin-blur)) grayscale(var(--motion-origin-grayscale))", 111 | }, 112 | "100%": { 113 | filter: "blur(0) grayscale(0)", 114 | }, 115 | }, 116 | "@keyframes motion-filter-out": { 117 | "0%": { 118 | filter: "blur(0) grayscale(0)", 119 | }, 120 | "100%": { 121 | filter: 122 | "blur(var(--motion-end-blur)) grayscale(var(--motion-end-grayscale))", 123 | }, 124 | }, 125 | "@keyframes motion-filter-loop-mirror": { 126 | "0%, 100%": { 127 | filter: "blur(0) grayscale(0)", 128 | }, 129 | "50%": { 130 | filter: 131 | "blur(var(--motion-loop-blur)) grayscale(var(--motion-loop-grayscale))", 132 | }, 133 | }, 134 | "@keyframes motion-filter-loop-reset": { 135 | "0%": { 136 | filter: "blur(0) grayscale(0)", 137 | }, 138 | "100%": { 139 | filter: 140 | "blur(var(--motion-loop-blur)) grayscale(var(--motion-loop-grayscale))", 141 | }, 142 | }, 143 | "@keyframes motion-opacity-in": { 144 | "0%": { 145 | opacity: "var(--motion-origin-opacity)", 146 | }, 147 | }, 148 | "@keyframes motion-opacity-out": { 149 | "100%": { 150 | opacity: "var(--motion-end-opacity)", 151 | }, 152 | }, 153 | "@keyframes motion-opacity-loop-mirror": { 154 | "0%, 100%": {}, 155 | "50%": { 156 | opacity: "var(--motion-loop-opacity)", 157 | }, 158 | }, 159 | "@keyframes motion-opacity-loop-reset": { 160 | "0%": {}, 161 | "100%": { 162 | opacity: "var(--motion-loop-opacity)", 163 | }, 164 | }, 165 | "@keyframes motion-background-color-in": { 166 | "0%": { 167 | backgroundColor: "var(--motion-origin-background-color)", 168 | }, 169 | }, 170 | "@keyframes motion-background-color-out": { 171 | "100%": { 172 | backgroundColor: "var(--motion-end-background-color)", 173 | }, 174 | }, 175 | "@keyframes motion-background-color-loop-mirror": { 176 | "0%, 100%": {}, 177 | "50%": { 178 | backgroundColor: "var(--motion-loop-background-color)", 179 | }, 180 | }, 181 | "@keyframes motion-background-color-loop-reset": { 182 | "0%": {}, 183 | "100%": { 184 | backgroundColor: "var(--motion-loop-background-color)", 185 | }, 186 | }, 187 | "@keyframes motion-text-color-in": { 188 | "0%": { 189 | color: "var(--motion-origin-text-color)", 190 | }, 191 | }, 192 | "@keyframes motion-text-color-out": { 193 | "100%": { 194 | color: "var(--motion-end-text-color)", 195 | }, 196 | }, 197 | "@keyframes motion-text-color-loop-mirror": { 198 | "0%, 100%": {}, 199 | "50%": { 200 | color: "var(--motion-loop-text-color)", 201 | }, 202 | }, 203 | "@keyframes motion-text-color-loop-reset": { 204 | "0%": {}, 205 | "100%": { 206 | color: "var(--motion-loop-text-color)", 207 | }, 208 | }, 209 | }); 210 | } 211 | -------------------------------------------------------------------------------- /src/modifiers.ts: -------------------------------------------------------------------------------- 1 | import type { CSSRuleObject, PluginAPI } from "tailwindcss/types/config.js"; 2 | 3 | type SpringMultipliers = { 4 | [key: string]: string; 5 | }; 6 | 7 | type ThemeConfig = { 8 | motionDelay: Record; 9 | motionDuration: Record; 10 | motionLoopCount: Record; 11 | motionTimingFunction: Record; 12 | transitionDuration: Record; 13 | transitionTimingFunction: Record; 14 | }; 15 | 16 | type UtilityOptions = { 17 | modifier: string | null; 18 | }; 19 | 20 | // Define spring types and their corresponding perceptual duration multipliers 21 | export const springPerceptualMultipliers: SpringMultipliers = { 22 | "var(--motion-spring-smooth)": "1.66", 23 | "var(--motion-spring-snappy)": "1.66", 24 | "var(--motion-spring-bouncy)": "1.66", 25 | "var(--motion-spring-bouncier)": "2.035", 26 | "var(--motion-spring-bounciest)": "5.285", 27 | "var(--motion-bounce)": "2", 28 | }; 29 | 30 | export function addModifiers( 31 | matchUtilities: PluginAPI["matchUtilities"], 32 | addUtilities: PluginAPI["addUtilities"], 33 | theme: (path: keyof ThemeConfig) => Record 34 | ) { 35 | // duration 36 | matchUtilities( 37 | { 38 | "motion-duration": (value: string, { modifier }: UtilityOptions) => { 39 | switch (modifier) { 40 | case "scale": 41 | return { "--motion-scale-duration": value } as CSSRuleObject; 42 | case "translate": 43 | return { "--motion-translate-duration": value }; 44 | case "rotate": 45 | return { "--motion-rotate-duration": value }; 46 | case "blur": 47 | case "grayscale": 48 | return { "--motion-filter-duration": value }; 49 | case "opacity": 50 | return { "--motion-opacity-duration": value }; 51 | case "background": 52 | return { "--motion-background-color-duration": value }; 53 | case "text": 54 | return { "--motion-text-color-duration": value }; 55 | default: 56 | return { 57 | "--motion-duration": value, 58 | }; 59 | } 60 | }, 61 | }, 62 | { 63 | values: theme("motionDuration"), 64 | modifiers: { 65 | scale: "scale", 66 | translate: "translate", 67 | rotate: "rotate", 68 | blur: "blur", 69 | grayscale: "grayscale", 70 | opacity: "opacity", 71 | background: "background", 72 | text: "text", 73 | }, 74 | } 75 | ); 76 | 77 | // delay 78 | matchUtilities( 79 | { 80 | "motion-delay": (value: string, { modifier }: UtilityOptions) => { 81 | switch (modifier) { 82 | case "scale": 83 | return { "--motion-scale-delay": value } as CSSRuleObject; 84 | case "translate": 85 | return { "--motion-translate-delay": value }; 86 | case "rotate": 87 | return { "--motion-rotate-delay": value }; 88 | case "blur": 89 | case "grayscale": 90 | return { "--motion-filter-delay": value }; 91 | case "opacity": 92 | return { "--motion-opacity-delay": value }; 93 | case "background": 94 | return { "--motion-background-color-delay": value }; 95 | case "text": 96 | return { "--motion-text-color-delay": value }; 97 | default: 98 | return { 99 | "--motion-delay": value, 100 | }; 101 | } 102 | }, 103 | }, 104 | { 105 | values: theme("motionDelay"), 106 | modifiers: { 107 | scale: "scale", 108 | translate: "translate", 109 | rotate: "rotate", 110 | blur: "blur", 111 | grayscale: "grayscale", 112 | opacity: "opacity", 113 | background: "background", 114 | text: "text", 115 | }, 116 | } 117 | ); 118 | 119 | // ease 120 | matchUtilities( 121 | { 122 | "motion-ease": (value: string, { modifier }: UtilityOptions) => { 123 | // if the ease isn't a spring, the multiplier doesn't change anything 124 | const perceptualDurationMultiplier = 125 | springPerceptualMultipliers[value] || 1; 126 | 127 | const isSpringWithBounce = [ 128 | "var(--motion-spring-bouncy)", 129 | "var(--motion-spring-bouncier)", 130 | "var(--motion-spring-bounciest)", 131 | "var(--motion-bounce)", 132 | ].includes(value); 133 | 134 | switch (modifier) { 135 | case "scale": 136 | return { 137 | "--motion-scale-timing": value, 138 | "--motion-scale-perceptual-duration-multiplier": `${perceptualDurationMultiplier}`, 139 | } as CSSRuleObject; 140 | case "translate": 141 | return { 142 | "--motion-translate-timing": value, 143 | "--motion-translate-perceptual-duration-multiplier": `${perceptualDurationMultiplier}`, 144 | }; 145 | case "rotate": 146 | return { 147 | "--motion-rotate-timing": value, 148 | "--motion-rotate-perceptual-duration-multiplier": `${perceptualDurationMultiplier}`, 149 | }; 150 | case "blur": 151 | case "grayscale": 152 | return { 153 | "--motion-filter-timing": value, 154 | "--motion-filter-perceptual-duration-multiplier": `${perceptualDurationMultiplier}`, 155 | }; 156 | case "opacity": 157 | return { 158 | "--motion-opacity-timing": value, 159 | "--motion-opacity-perceptual-duration-multiplier": `${perceptualDurationMultiplier}`, 160 | }; 161 | case "background": 162 | return { 163 | "--motion-background-color-timing": value, 164 | "--motion-background-color-perceptual-duration-multiplier": `${perceptualDurationMultiplier}`, 165 | }; 166 | case "text": 167 | return { 168 | "--motion-text-color-timing": value, 169 | "--motion-text-color-perceptual-duration-multiplier": `${perceptualDurationMultiplier}`, 170 | }; 171 | default: 172 | if (isSpringWithBounce) { 173 | return { 174 | "--motion-timing": value, 175 | "--motion-perceptual-duration-multiplier": `${perceptualDurationMultiplier}`, 176 | 177 | // filter, opacity, and color animations don't look good with bouncy springs 178 | // so we use a smooth spring for them 179 | "--motion-filter-timing": "var(--motion-spring-smooth)", 180 | "--motion-opacity-timing": "var(--motion-spring-smooth)", 181 | "--motion-background-color-timing": 182 | "var(--motion-spring-smooth)", 183 | "--motion-text-color-timing": "var(--motion-spring-smooth)", 184 | 185 | "--motion-filter-perceptual-duration-multiplier": "1.66", 186 | "--motion-opacity-perceptual-duration-multiplier": "1.66", 187 | "--motion-background-color-perceptual-duration-multiplier": 188 | "1.66", 189 | "--motion-text-color-perceptual-duration-multiplier": "1.66", 190 | }; 191 | } else { 192 | return { 193 | "--motion-timing": value, 194 | "--motion-perceptual-duration-multiplier": `${perceptualDurationMultiplier}`, 195 | }; 196 | } 197 | } 198 | }, 199 | }, 200 | { 201 | values: theme("motionTimingFunction"), 202 | modifiers: { 203 | scale: "scale", 204 | translate: "translate", 205 | rotate: "rotate", 206 | blur: "blur", 207 | grayscale: "grayscale", 208 | opacity: "opacity", 209 | background: "background", 210 | text: "text", 211 | }, 212 | } 213 | ); 214 | 215 | // animation play state 216 | addUtilities({ 217 | ".motion-paused": { 218 | animationPlayState: "paused", 219 | "&::before": { 220 | animationPlayState: "paused", 221 | }, 222 | "&::after": { 223 | animationPlayState: "paused", 224 | }, 225 | }, 226 | ".motion-running": { 227 | animationPlayState: "running", 228 | "&::before": { 229 | animationPlayState: "running", 230 | }, 231 | "&::after": { 232 | animationPlayState: "running", 233 | }, 234 | }, 235 | }); 236 | 237 | // loop 238 | matchUtilities( 239 | { 240 | "motion-loop": (value: string, { modifier }: UtilityOptions) => { 241 | switch (modifier) { 242 | case "scale": 243 | return { "--motion-scale-loop-count": value } as CSSRuleObject; 244 | case "translate": 245 | return { "--motion-translate-loop-count": value }; 246 | case "rotate": 247 | return { "--motion-rotate-loop-count": value }; 248 | case "blur": 249 | case "grayscale": 250 | return { "--motion-filter-loop-count": value }; 251 | case "opacity": 252 | return { "--motion-opacity-loop-count": value }; 253 | case "background": 254 | return { "--motion-background-color-loop-count": value }; 255 | case "text": 256 | return { "--motion-text-color-loop-count": value }; 257 | default: 258 | return { 259 | "--motion-loop-count": value, 260 | }; 261 | } 262 | }, 263 | }, 264 | { 265 | values: theme("motionLoopCount"), 266 | modifiers: { 267 | scale: "scale", 268 | translate: "translate", 269 | rotate: "rotate", 270 | blur: "blur", 271 | grayscale: "grayscale", 272 | opacity: "opacity", 273 | background: "background", 274 | text: "text", 275 | }, 276 | } 277 | ); 278 | } 279 | 280 | export const modifiersTheme = { 281 | motionTimingFunction: ( 282 | theme: (path: keyof ThemeConfig) => Record 283 | ) => ({ 284 | ...theme("transitionTimingFunction"), 285 | "spring-smooth": "var(--motion-spring-smooth)", 286 | "spring-snappy": "var(--motion-spring-snappy)", 287 | "spring-bouncy": "var(--motion-spring-bouncy)", 288 | "spring-bouncier": "var(--motion-spring-bouncier)", 289 | "spring-bounciest": "var(--motion-spring-bounciest)", 290 | 291 | bounce: "var(--motion-bounce)", 292 | 293 | "in-quad": "cubic-bezier(.55, .085, .68, .53)", 294 | "in-cubic": "cubic-bezier(.550, .055, .675, .19)", 295 | "in-quart": "cubic-bezier(.895, .03, .685, .22)", 296 | "in-back": "cubic-bezier(0.6,-0.28,0.74,0.05)", 297 | 298 | "out-quad": "cubic-bezier(.25, .46, .45, .94)", 299 | "out-cubic": "cubic-bezier(.215, .61, .355, 1)", 300 | "out-quart": "cubic-bezier(.165, .84, .44, 1)", 301 | "out-back": "cubic-bezier(0.18,0.89,0.32,1.27)", 302 | 303 | "in-out-quad": "cubic-bezier(.455, .03, .515, .955)", 304 | "in-out-cubic": "cubic-bezier(.645, .045, .355, 1)", 305 | "in-out-quart": "cubic-bezier(.77, 0, .175, 1)", 306 | "in-out-back": "cubic-bezier(0.68,-0.55,0.27,1.55)", 307 | }), 308 | motionDuration: ( 309 | theme: (path: keyof ThemeConfig) => Record 310 | ) => ({ 311 | ...theme("transitionDuration"), 312 | 1500: "1500ms", 313 | 2000: "2000ms", 314 | DEFAULT: "750ms", 315 | }), 316 | motionDelay: ( 317 | theme: (path: keyof ThemeConfig) => Record 318 | ) => ({ 319 | ...theme("motionDuration"), 320 | DEFAULT: "0ms", 321 | }), 322 | motionLoopCount: { 323 | infinite: "infinite", 324 | once: "1", 325 | twice: "2", 326 | }, 327 | }; 328 | -------------------------------------------------------------------------------- /src/presets.ts: -------------------------------------------------------------------------------- 1 | import type { PluginAPI } from "tailwindcss/types/config.js"; 2 | import { 3 | filterInAnimation, 4 | opacityInAnimation, 5 | opacityLoopAnimation, 6 | rotateInAnimation, 7 | rotateLoopAnimation, 8 | scaleInAnimation, 9 | scaleLoopAnimation, 10 | translateInAnimation, 11 | translateLoopAnimation, 12 | } from "./baseAnimations.js"; 13 | import { springPerceptualMultipliers } from "./modifiers.js"; 14 | 15 | type Direction = "right" | "left" | "up" | "down"; 16 | 17 | type PresetThemeConfig = { 18 | addComponents: PluginAPI["addComponents"]; 19 | matchComponents: PluginAPI["matchComponents"]; 20 | }; 21 | 22 | type Size = "sm" | "md" | "lg"; 23 | 24 | const DEFAULT_MULTIPLIER = "1"; 25 | 26 | export function addPresets( 27 | addComponents: PresetThemeConfig["addComponents"], 28 | matchComponents: PresetThemeConfig["matchComponents"] 29 | ) { 30 | matchComponents( 31 | { 32 | "motion-preset-fade": (size: string) => { 33 | const durations = { 34 | sm: "300ms", 35 | md: "500ms", 36 | lg: "800ms", 37 | }; 38 | return { 39 | "--motion-origin-opacity": "0", 40 | "--motion-duration": durations[size as Size], 41 | "--motion-opacity-in-animation": opacityInAnimation, 42 | animation: "var(--motion-all-loop-and-enter-animations)", 43 | }; 44 | }, 45 | "motion-preset-slide-right": (size: string) => { 46 | const distance = { 47 | sm: "5%", 48 | md: "25%", 49 | lg: "100%", 50 | }; 51 | return { 52 | "--motion-origin-translate-x": `-${distance[size as Size]}`, 53 | "--motion-origin-opacity": "0", 54 | "--motion-opacity-in-animation": opacityInAnimation, 55 | "--motion-translate-in-animation": translateInAnimation, 56 | animation: "var(--motion-all-loop-and-enter-animations)", 57 | }; 58 | }, 59 | "motion-preset-slide-left": (size: string) => { 60 | const distance = { 61 | sm: "5%", 62 | md: "25%", 63 | lg: "100%", 64 | }; 65 | return { 66 | "--motion-origin-translate-x": distance[size as Size], 67 | "--motion-origin-opacity": "0", 68 | "--motion-opacity-in-animation": opacityInAnimation, 69 | "--motion-translate-in-animation": translateInAnimation, 70 | animation: "var(--motion-all-loop-and-enter-animations)", 71 | }; 72 | }, 73 | "motion-preset-slide-up": (size: string) => { 74 | const distance = { 75 | sm: "5%", 76 | md: "25%", 77 | lg: "100%", 78 | }; 79 | return { 80 | "--motion-origin-translate-y": distance[size as Size], 81 | "--motion-origin-opacity": "0", 82 | "--motion-opacity-in-animation": opacityInAnimation, 83 | "--motion-translate-in-animation": translateInAnimation, 84 | animation: "var(--motion-all-loop-and-enter-animations)", 85 | }; 86 | }, 87 | "motion-preset-slide-down": (size: string) => { 88 | const distance = { 89 | sm: "5%", 90 | md: "25%", 91 | lg: "100%", 92 | }; 93 | return { 94 | "--motion-origin-translate-y": `-${distance[size as Size]}`, 95 | "--motion-origin-opacity": "0", 96 | "--motion-opacity-in-animation": opacityInAnimation, 97 | "--motion-translate-in-animation": translateInAnimation, 98 | animation: "var(--motion-all-loop-and-enter-animations)", 99 | }; 100 | }, 101 | "motion-preset-slide-up-right": (size: string) => { 102 | const distance = { 103 | sm: "5%", 104 | md: "25%", 105 | lg: "100%", 106 | }; 107 | return { 108 | "--motion-origin-translate-x": `-${distance[size as Size]}`, 109 | "--motion-origin-translate-y": distance[size as Size], 110 | "--motion-origin-opacity": "0", 111 | "--motion-opacity-in-animation": opacityInAnimation, 112 | "--motion-translate-in-animation": translateInAnimation, 113 | animation: "var(--motion-all-loop-and-enter-animations)", 114 | }; 115 | }, 116 | "motion-preset-slide-up-left": (size: string) => { 117 | const distance = { 118 | sm: "5%", 119 | md: "25%", 120 | lg: "100%", 121 | }; 122 | return { 123 | "--motion-origin-translate-x": distance[size as Size], 124 | "--motion-origin-translate-y": distance[size as Size], 125 | "--motion-origin-opacity": "0", 126 | "--motion-opacity-in-animation": opacityInAnimation, 127 | "--motion-translate-in-animation": translateInAnimation, 128 | animation: "var(--motion-all-loop-and-enter-animations)", 129 | }; 130 | }, 131 | "motion-preset-slide-down-left": (size: string) => { 132 | const distance = { 133 | sm: "5%", 134 | md: "25%", 135 | lg: "100%", 136 | }; 137 | return { 138 | "--motion-origin-translate-x": distance[size as Size], 139 | "--motion-origin-translate-y": `-${distance[size as Size]}`, 140 | "--motion-origin-opacity": "0", 141 | "--motion-opacity-in-animation": opacityInAnimation, 142 | "--motion-translate-in-animation": translateInAnimation, 143 | animation: "var(--motion-all-loop-and-enter-animations)", 144 | }; 145 | }, 146 | "motion-preset-slide-down-right": (size: string) => { 147 | const distance = { 148 | sm: "5%", 149 | md: "25%", 150 | lg: "100%", 151 | }; 152 | return { 153 | "--motion-origin-translate-x": `-${distance[size as Size]}`, 154 | "--motion-origin-translate-y": `-${distance[size as Size]}`, 155 | "--motion-origin-opacity": "0", 156 | "--motion-opacity-in-animation": opacityInAnimation, 157 | "--motion-translate-in-animation": translateInAnimation, 158 | animation: "var(--motion-all-loop-and-enter-animations)", 159 | }; 160 | }, 161 | 162 | "motion-preset-focus": (size: string) => { 163 | const blurSizes = { 164 | sm: "1.25px", 165 | md: "5px", 166 | lg: "10px", 167 | }; 168 | return { 169 | "--motion-origin-blur": blurSizes[size as Size], 170 | "--motion-origin-opacity": "0", 171 | "--motion-opacity-in-animation": opacityInAnimation, 172 | "--motion-filter-in-animation": filterInAnimation, 173 | animation: "var(--motion-all-loop-and-enter-animations)", 174 | }; 175 | }, 176 | 177 | "motion-preset-blur-right": (size: string) => { 178 | const blurSizes = { 179 | sm: "1.25px", 180 | md: "5px", 181 | lg: "10px", 182 | }; 183 | const distance = { 184 | sm: "1%", 185 | md: "5%", 186 | lg: "25%", 187 | }; 188 | return { 189 | "--motion-origin-blur": blurSizes[size as Size], 190 | "--motion-origin-translate-x": `-${distance[size as Size]}`, 191 | "--motion-origin-opacity": "0", 192 | "--motion-opacity-in-animation": opacityInAnimation, 193 | "--motion-filter-in-animation": filterInAnimation, 194 | "--motion-translate-in-animation": translateInAnimation, 195 | animation: "var(--motion-all-loop-and-enter-animations)", 196 | }; 197 | }, 198 | "motion-preset-blur-left": (size: string) => { 199 | const blurSizes = { 200 | sm: "1.25px", 201 | md: "5px", 202 | lg: "10px", 203 | }; 204 | const distance = { 205 | sm: "1%", 206 | md: "5%", 207 | lg: "25%", 208 | }; 209 | return { 210 | "--motion-origin-blur": blurSizes[size as Size], 211 | "--motion-origin-translate-x": distance[size as Size], 212 | "--motion-origin-opacity": "0", 213 | "--motion-opacity-in-animation": opacityInAnimation, 214 | "--motion-filter-in-animation": filterInAnimation, 215 | "--motion-translate-in-animation": translateInAnimation, 216 | animation: "var(--motion-all-loop-and-enter-animations)", 217 | }; 218 | }, 219 | "motion-preset-blur-up": (size: string) => { 220 | const blurSizes = { 221 | sm: "1.25px", 222 | md: "5px", 223 | lg: "10px", 224 | }; 225 | const distance = { 226 | sm: "1%", 227 | md: "5%", 228 | lg: "25%", 229 | }; 230 | return { 231 | "--motion-origin-blur": blurSizes[size as Size], 232 | "--motion-origin-translate-y": distance[size as Size], 233 | "--motion-origin-opacity": "0", 234 | "--motion-opacity-in-animation": opacityInAnimation, 235 | "--motion-filter-in-animation": filterInAnimation, 236 | "--motion-translate-in-animation": translateInAnimation, 237 | animation: "var(--motion-all-loop-and-enter-animations)", 238 | }; 239 | }, 240 | "motion-preset-blur-down": (size: string) => { 241 | const blurSizes = { 242 | sm: "1.25px", 243 | md: "5px", 244 | lg: "10px", 245 | }; 246 | const distance = { 247 | sm: "1%", 248 | md: "5%", 249 | lg: "25%", 250 | }; 251 | return { 252 | "--motion-origin-blur": blurSizes[size as Size], 253 | "--motion-origin-translate-y": `-${distance[size as Size]}`, 254 | "--motion-origin-opacity": "0", 255 | "--motion-opacity-in-animation": opacityInAnimation, 256 | "--motion-filter-in-animation": filterInAnimation, 257 | "--motion-translate-in-animation": translateInAnimation, 258 | animation: "var(--motion-all-loop-and-enter-animations)", 259 | }; 260 | }, 261 | }, 262 | { 263 | values: { 264 | sm: "sm", 265 | md: "md", 266 | lg: "lg", 267 | DEFAULT: "md", 268 | }, 269 | } 270 | ); 271 | 272 | matchComponents( 273 | { 274 | "motion-preset-rebound": (direction: string) => { 275 | const directions = { 276 | right: { 277 | "--motion-origin-translate-x": "-25%", 278 | }, 279 | left: { 280 | "--motion-origin-translate-x": "25%", 281 | }, 282 | up: { 283 | "--motion-origin-translate-y": "25%", 284 | }, 285 | down: { 286 | "--motion-origin-translate-y": "-25%", 287 | }, 288 | }; 289 | return { 290 | ...directions[direction as Direction], 291 | "--motion-translate-timing": "var(--motion-spring-bouncier)", 292 | "--motion-translate-perceptual-duration-multiplier": 293 | springPerceptualMultipliers["var(--motion-spring-bouncier)"] ?? 294 | DEFAULT_MULTIPLIER, 295 | "--motion-origin-opacity": "0", 296 | "--motion-opacity-in-animation": opacityInAnimation, 297 | "--motion-translate-in-animation": translateInAnimation, 298 | animation: "var(--motion-all-loop-and-enter-animations)", 299 | }; 300 | }, 301 | }, 302 | { 303 | values: { 304 | right: "right", 305 | left: "left", 306 | up: "up", 307 | down: "down", 308 | DEFAULT: "left", 309 | }, 310 | } 311 | ); 312 | 313 | addComponents({ 314 | ".motion-preset-bounce": { 315 | "--motion-duration": "300ms", 316 | "--motion-translate-timing": "var(--motion-bounce)", 317 | "--motion-translate-perceptual-duration-multiplier": 318 | springPerceptualMultipliers["var(--motion-bounce)"] ?? 319 | DEFAULT_MULTIPLIER, 320 | "--motion-origin-opacity": "0", 321 | "--motion-origin-translate-y": "-25%", 322 | "--motion-opacity-in-animation": opacityInAnimation, 323 | "--motion-translate-in-animation": translateInAnimation, 324 | animation: "var(--motion-all-loop-and-enter-animations)", 325 | }, 326 | }); 327 | 328 | addComponents({ 329 | ".motion-preset-expand": { 330 | "--motion-origin-scale-x": "50%", 331 | "--motion-origin-scale-y": "50%", 332 | "--motion-origin-opacity": "0", 333 | "--motion-opacity-in-animation": opacityInAnimation, 334 | "--motion-scale-in-animation": scaleInAnimation, 335 | animation: "var(--motion-all-loop-and-enter-animations)", 336 | }, 337 | }); 338 | 339 | addComponents({ 340 | ".motion-preset-shrink": { 341 | "--motion-origin-scale-x": "150%", 342 | "--motion-origin-scale-y": "150%", 343 | "--motion-origin-opacity": "0", 344 | "--motion-opacity-in-animation": opacityInAnimation, 345 | "--motion-scale-in-animation": scaleInAnimation, 346 | animation: "var(--motion-all-loop-and-enter-animations)", 347 | }, 348 | }); 349 | 350 | addComponents({ 351 | ".motion-preset-pop": { 352 | "--motion-origin-scale-x": "50%", 353 | "--motion-origin-scale-y": "50%", 354 | "--motion-origin-opacity": "0", 355 | "--motion-scale-timing": "var(--motion-spring-bouncier)", 356 | "--motion-scale-perceptual-duration-multiplier": 357 | springPerceptualMultipliers["var(--motion-spring-bouncier)"] ?? 358 | DEFAULT_MULTIPLIER, 359 | "--motion-opacity-in-animation": opacityInAnimation, 360 | "--motion-scale-in-animation": scaleInAnimation, 361 | animation: "var(--motion-all-loop-and-enter-animations)", 362 | }, 363 | }); 364 | 365 | addComponents({ 366 | ".motion-preset-compress": { 367 | "--motion-origin-scale-x": "150%", 368 | "--motion-origin-scale-y": "150%", 369 | "--motion-origin-opacity": "0", 370 | "--motion-scale-timing": "var(--motion-spring-bouncier)", 371 | "--motion-scale-perceptual-duration-multiplier": 372 | springPerceptualMultipliers["var(--motion-spring-bouncier)"] ?? 373 | DEFAULT_MULTIPLIER, 374 | "--motion-opacity-in-animation": opacityInAnimation, 375 | "--motion-scale-in-animation": scaleInAnimation, 376 | animation: "var(--motion-all-loop-and-enter-animations)", 377 | }, 378 | }); 379 | 380 | addComponents({ 381 | ".motion-preset-shake": { 382 | "--motion-duration": "300ms", 383 | "--motion-origin-rotate": "15deg", 384 | "--motion-origin-opacity": "0", 385 | "--motion-rotate-timing": "var(--motion-spring-bounciest)", 386 | "--motion-rotate-perceptual-duration-multiplier": 387 | springPerceptualMultipliers["var(--motion-spring-bouncier)"] ?? 388 | DEFAULT_MULTIPLIER, 389 | "--motion-opacity-in-animation": opacityInAnimation, 390 | "--motion-rotate-in-animation": rotateInAnimation, 391 | animation: "var(--motion-all-loop-and-enter-animations)", 392 | }, 393 | }); 394 | 395 | addComponents({ 396 | ".motion-preset-wiggle": { 397 | "--motion-duration": "300ms", 398 | "--motion-origin-rotate": "15deg", 399 | "--motion-origin-translate-x": "-25%", 400 | "--motion-origin-translate-y": "-10%", 401 | "--motion-origin-opacity": "0", 402 | "--motion-timing": "var(--motion-spring-bounciest)", 403 | "--motion-perceptual-duration-multiplier": "5.285", 404 | "--motion-opacity-timing": "var(--motion-spring-smooth)", 405 | "--motion-opacity-perceptual-duration-multiplier": 406 | springPerceptualMultipliers["var(--motion-spring-bouncier)"] ?? 407 | DEFAULT_MULTIPLIER, 408 | "--motion-opacity-in-animation": opacityInAnimation, 409 | "--motion-rotate-in-animation": rotateInAnimation, 410 | "--motion-translate-in-animation": translateInAnimation, 411 | animation: "var(--motion-all-loop-and-enter-animations)", 412 | }, 413 | }); 414 | 415 | addComponents({ 416 | ".motion-preset-confetti": { 417 | display: "block", 418 | "-webkit-appearance": "none", 419 | appearance: "none", 420 | position: "relative", 421 | outline: "0", 422 | zIndex: "1", 423 | margin: "0", 424 | animation: 425 | "RomboConfettiPop var(--motion-duration) var(--motion-timing) both", 426 | 427 | "@keyframes RomboConfettiPop": { 428 | "0%": { 429 | opacity: "0", 430 | transform: "scale(1)", 431 | }, 432 | "33%": { 433 | opacity: "1", 434 | transform: "scale(1.15)", 435 | }, 436 | "50%": { 437 | transform: "scale(0.975)", 438 | }, 439 | "65%": { 440 | transform: "scale(1.025)", 441 | }, 442 | "80%": { 443 | transform: "scale(0.99)", 444 | }, 445 | "87%": { 446 | transform: "scale(1.01)", 447 | }, 448 | "100%": { 449 | opacity: "1", 450 | transform: "scale(1)", 451 | }, 452 | }, 453 | "&:after": { 454 | display: "block", 455 | animationDuration: "var(--motion-duration)", 456 | animationTimingFunction: "var(--motion-timing)", 457 | animationIterationCount: "1", 458 | animationDirection: "normal", 459 | animationFillMode: "forwards", 460 | animationName: "bottomfetti", 461 | position: "absolute", 462 | content: '" "', 463 | zIndex: "-1", 464 | width: "100%", 465 | height: "100%", 466 | left: "-20%", 467 | top: "100%", 468 | transition: "all var(--motion-timing) var(--motion-duration)", 469 | backgroundRepeat: "no-repeat", 470 | backgroundImage: 471 | "radial-gradient(circle, #a2dd60 20%, transparent 20%),radial-gradient(circle, transparent 20%, #ee65a9 20%, transparent 30%),radial-gradient(circle, #6092dd 20%, transparent 20%),radial-gradient(circle, #f3c548 20%, transparent 20%),radial-gradient(circle, transparent 10%, #46ec99 15%, transparent 20%),radial-gradient(circle, #f03e47 20%, transparent 20%),radial-gradient(circle, #7b4df7 20%, transparent 20%),radial-gradient(circle, #3ff1bc 20%, transparent 20%)", 472 | backgroundSize: 473 | "15% 15%, 20% 20%, 18% 18%, 20% 20%, 15% 15%, 10% 10%, 20% 20%", 474 | }, 475 | "&:before": { 476 | display: "block", 477 | animationDuration: "var(--motion-duration)", 478 | animationTimingFunction: "var(--motion-timing)", 479 | animationIterationCount: "1", 480 | animationDirection: "normal", 481 | animationFillMode: "forwards", 482 | animationName: "topfetti", 483 | position: "absolute", 484 | content: '" "', 485 | width: "100%", 486 | height: "100%", 487 | left: "-5%", 488 | backgroundRepeat: "no-repeat", 489 | transition: "all var(--motion-timing) var(--motion-duration)", 490 | zIndex: "-1", 491 | top: "-90%", 492 | backgroundImage: 493 | "radial-gradient(circle, #a2dd60 30%, transparent 20%),radial-gradient(circle, transparent 20%, #ee65a9 40%, transparent 20%),radial-gradient(circle, #6092dd 30%, transparent 20%),radial-gradient(circle, #f3c548 30%, transparent 20%),radial-gradient(circle, transparent 10%, #46ec99 15%, transparent 20%),radial-gradient(circle, #f03e47 30%, transparent 20%),radial-gradient(circle, #7b4df7 30%, transparent 30%),radial-gradient(circle, #3ff1bc 30%, transparent 20%),radial-gradient(circle, #48f088 30%, transparent 30%)", 494 | backgroundSize: 495 | "10% 10%, 20% 20%, 15% 15%, 20% 20%, 18% 18%, 10% 10%, 15% 15%, 10% 10%, 25% 25%", 496 | }, 497 | "@keyframes topfetti": { 498 | "0%": { 499 | backgroundPosition: 500 | "5% 90%, 10% 90%, 10% 90%, 15% 90%, 25% 90%, 25% 90%, 40% 90%, 55% 90%, 70% 90%", 501 | }, 502 | "50%": { 503 | backgroundPosition: 504 | "0% 80%, 0% 20%, 10% 40%, 20% 0%, 30% 30%, 22% 50%, 50% 50%, 65% 20%, 90% 30%", 505 | }, 506 | "100%": { 507 | backgroundPosition: 508 | "0% 70%, 0% 10%, 10% 30%, 20% -10%, 30% 20%, 22% 40%, 50% 40%, 65% 10%, 90% 20%", 509 | backgroundSize: "0% 0%, 0% 0%, 0% 0%, 0% 0%, 0% 0%, 0% 0%", 510 | }, 511 | }, 512 | "@keyframes bottomfetti": { 513 | "0%": { 514 | backgroundPosition: 515 | "10% -10%, 30% 10%, 55% -10%, 70% -10%, 85% -10%,70% -10%, 70% 0%", 516 | }, 517 | "50%": { 518 | backgroundPosition: 519 | "0% 80%, 20% 80%, 45% 60%, 60% 100%, 75% 70%, 95% 60%, 105% 0%", 520 | }, 521 | "100%": { 522 | backgroundPosition: 523 | "0% 90%, 20% 90%, 45% 70%, 60% 110%, 75% 80%, 95% 70%, 110% 10%", 524 | backgroundSize: "0% 0%, 0% 0%, 0% 0%, 0% 0%, 0% 0%, 0% 0%", 525 | }, 526 | }, 527 | }, 528 | }); 529 | 530 | matchComponents( 531 | { 532 | "motion-preset-pulse": (size: string) => { 533 | const sizes = { 534 | sm: "1.1", 535 | md: "1.25", 536 | lg: "1.5", 537 | }; 538 | return { 539 | "--motion-loop-scale-x": sizes[size as Size], 540 | "--motion-loop-scale-y": sizes[size as Size], 541 | "--motion-timing": "cubic-bezier(0.4, 0, 0.2, 1)", 542 | "--motion-scale-loop-animation": scaleLoopAnimation("mirror"), 543 | animation: "var(--motion-all-loop-and-enter-animations)", 544 | }; 545 | }, 546 | "motion-preset-wobble": (size: string) => { 547 | const sizes = { 548 | sm: "5%", 549 | md: "15%", 550 | lg: "25%", 551 | }; 552 | return { 553 | "--motion-loop-translate-x": sizes[size as Size], 554 | "--motion-timing": "cubic-bezier(0.4, 0, 0.2, 1)", 555 | "--motion-translate-loop-animation": translateLoopAnimation("mirror"), 556 | animation: "var(--motion-all-loop-and-enter-animations)", 557 | }; 558 | }, 559 | "motion-preset-seesaw": (size: string) => { 560 | const sizes = { 561 | sm: "3deg", 562 | md: "6deg", 563 | lg: "12deg", 564 | }; 565 | return { 566 | "--motion-loop-rotate": sizes[size as Size], 567 | "--motion-rotate-loop-animation": rotateLoopAnimation("mirror"), 568 | "--motion-rotate-timing": "var(--motion-spring-bounciest)", 569 | "--motion-rotate-perceptual-duration-multiplier": 570 | springPerceptualMultipliers["var(--motion-spring-bounciest)"] ?? 571 | DEFAULT_MULTIPLIER, 572 | animation: "var(--motion-all-loop-and-enter-animations)", 573 | }; 574 | }, 575 | "motion-preset-oscillate": (size: string) => { 576 | const sizes = { 577 | sm: "5%", 578 | md: "15%", 579 | lg: "25%", 580 | }; 581 | return { 582 | "--motion-loop-translate-y": sizes[size as Size], 583 | "--motion-timing": "cubic-bezier(0.4, 0, 0.2, 1)", 584 | "--motion-translate-loop-animation": translateLoopAnimation("mirror"), 585 | animation: "var(--motion-all-loop-and-enter-animations)", 586 | }; 587 | }, 588 | "motion-preset-stretch": (size: string) => { 589 | const xSizes = { 590 | sm: "95%", 591 | md: "85%", 592 | lg: "75%", 593 | }; 594 | const ySizes = { 595 | sm: "105%", 596 | md: "115%", 597 | lg: "125%", 598 | }; 599 | return { 600 | "--motion-loop-scale-x": xSizes[size as Size], 601 | "--motion-loop-scale-y": ySizes[size as Size], 602 | "--motion-scale-timing": "var(--motion-spring-bouncier)", 603 | "--motion-scale-perceptual-duration-multiplier": 604 | springPerceptualMultipliers["var(--motion-spring-bouncier)"] ?? 605 | DEFAULT_MULTIPLIER, 606 | "--motion-scale-loop-animation": scaleLoopAnimation("mirror"), 607 | animation: "var(--motion-all-loop-and-enter-animations)", 608 | }; 609 | }, 610 | "motion-preset-float": (size: string) => { 611 | const sizes = { 612 | sm: "50%", 613 | md: "100%", 614 | lg: "150%", 615 | }; 616 | return { 617 | "--motion-loop-translate-y": sizes[size as Size], 618 | "--motion-translate-timing": "var(--motion-spring-bouncier)", 619 | "--motion-translate-perceptual-duration-multiplier": 620 | springPerceptualMultipliers["var(--motion-spring-bouncier)"] ?? 621 | DEFAULT_MULTIPLIER, 622 | "--motion-duration": "2000ms", 623 | "--motion-translate-loop-animation": translateLoopAnimation("mirror"), 624 | animation: "var(--motion-all-loop-and-enter-animations)", 625 | }; 626 | }, 627 | }, 628 | { 629 | values: { 630 | sm: "sm", 631 | md: "md", 632 | lg: "lg", 633 | DEFAULT: "md", 634 | }, 635 | } 636 | ); 637 | 638 | addComponents({ 639 | ".motion-preset-spin": { 640 | "--motion-loop-rotate": "360deg", 641 | "--motion-timing": "linear", 642 | "--motion-rotate-loop-animation": rotateLoopAnimation("reset"), 643 | animation: "var(--motion-all-loop-and-enter-animations)", 644 | }, 645 | }); 646 | 647 | addComponents({ 648 | ".motion-preset-blink": { 649 | "--motion-loop-opacity": "0", 650 | "--motion-opacity-loop-animation": opacityLoopAnimation("mirror"), 651 | animation: "var(--motion-all-loop-and-enter-animations)", 652 | }, 653 | }); 654 | 655 | matchComponents({ 656 | "motion-preset-typewriter": (value) => ({ 657 | "--motion-duration": "2000ms", 658 | "--motion-typewriter-value": `${value}ch`, 659 | animation: `typing var(--motion-duration) steps(${value}) var(--motion-loop-count), blink 0.4s step-end infinite alternate`, 660 | whiteSpace: "nowrap", 661 | borderRight: "2px solid", 662 | fontFamily: "monospace", 663 | overflow: "hidden", 664 | 665 | "@media screen and (prefers-reduced-motion: no-preference)": { 666 | "@keyframes typing": { 667 | "10%, 90%": { 668 | width: "0", 669 | }, 670 | "40%, 60%": { 671 | width: `calc(var(--motion-typewriter-value) + 1px)`, 672 | }, 673 | }, 674 | }, 675 | 676 | "@keyframes blink": { 677 | "50%": { 678 | borderColor: "transparent", 679 | }, 680 | }, 681 | }), 682 | }); 683 | 684 | matchComponents( 685 | { 686 | "motion-preset-flomoji": (value: string) => ({ 687 | position: "relative", 688 | "&:before": { 689 | content: `"${value}"`, 690 | animation: 691 | "emojiAnim 3000ms infinite cubic-bezier(0, 0.2, 0.2, 1) both", 692 | top: "0px", 693 | left: "0px", 694 | position: "absolute", 695 | zIndex: "1000", 696 | background: "rgba(255,255,255,0.3)", 697 | width: "2rem", 698 | height: "2rem", 699 | display: "flex", 700 | alignItems: "center", 701 | justifyContent: "center", 702 | borderRadius: "100%", 703 | padding: "2px", 704 | paddingBottom: "6px", 705 | }, 706 | 707 | "@media screen and (prefers-reduced-motion: no-preference)": { 708 | "@keyframes emojiAnim": { 709 | "0%": { 710 | transform: "translateY(-200%) rotate(60deg)", 711 | }, 712 | "30%": { 713 | transform: "rotate(50deg)", 714 | }, 715 | "40%": { 716 | transform: "rotate(55deg)", 717 | }, 718 | "50%": { 719 | transform: "rotate(45deg)", 720 | }, 721 | "60%": { 722 | transform: "rotate(40deg)", 723 | }, 724 | "100%": { 725 | transform: "translateY(-200%) rotate(25deg)", 726 | }, 727 | }, 728 | }, 729 | }), 730 | }, 731 | { 732 | values: { 733 | "👉": "👉", 734 | "🚀": "🚀", 735 | "👀": "👀", 736 | "👍": "👍", 737 | }, 738 | } 739 | ); 740 | } 741 | -------------------------------------------------------------------------------- /src/types/tailwind-internals.d.ts: -------------------------------------------------------------------------------- 1 | // src/types/tailwind-internals.d.ts 2 | declare module "tailwindcss/lib/util/flattenColorPalette.js" { 3 | type ColorValue = string | { [key: string]: string }; 4 | type NestedColors = { 5 | [key: string]: ColorValue | NestedColors; 6 | }; 7 | 8 | function flattenColorPalette(colors: NestedColors): Record; 9 | export default flattenColorPalette; 10 | } 11 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | /* Base Options */ 4 | "esModuleInterop": true, 5 | "skipLibCheck": true, 6 | "target": "es2022", 7 | "allowJs": true, 8 | "resolveJsonModule": true, 9 | "moduleDetection": "force", 10 | "isolatedModules": true, 11 | "verbatimModuleSyntax": true, 12 | 13 | /* Strictness */ 14 | "strict": true, 15 | "noUncheckedIndexedAccess": true, 16 | "noImplicitOverride": true, 17 | 18 | /* For bundler usage */ 19 | "module": "ESNext", 20 | "moduleResolution": "Bundler", 21 | 22 | /* We're using tsup for building */ 23 | "noEmit": true, 24 | 25 | /* DOM since we're a Tailwind plugin */ 26 | "lib": ["es2022", "dom", "dom.iterable"] 27 | }, 28 | "exclude": ["web", "dist"], 29 | "include": ["src/**/*.ts", "src/types/*.d.ts"] 30 | } 31 | -------------------------------------------------------------------------------- /tsup.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from "tsup"; 2 | 3 | export default defineConfig({ 4 | entry: ["src/index.ts"], 5 | format: ["esm", "cjs"], 6 | dts: true, 7 | clean: true, 8 | outDir: "dist", 9 | splitting: false, 10 | sourcemap: true, 11 | treeshake: true, 12 | outExtension({ format }) { 13 | return { 14 | js: format === "cjs" ? ".cjs" : ".js", 15 | }; 16 | }, 17 | }); 18 | -------------------------------------------------------------------------------- /web/.gitignore: -------------------------------------------------------------------------------- 1 | # build output 2 | dist/ 3 | 4 | # generated types 5 | .astro/ 6 | 7 | # dependencies 8 | node_modules/ 9 | 10 | # logs 11 | npm-debug.log* 12 | yarn-debug.log* 13 | yarn-error.log* 14 | pnpm-debug.log* 15 | 16 | # environment variables 17 | .env 18 | .env.production 19 | 20 | # macOS-specific files 21 | .DS_Store 22 | 23 | # jetbrains setting folder 24 | .idea/ 25 | -------------------------------------------------------------------------------- /web/.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | "recommendations": ["astro-build.astro-vscode"], 3 | "unwantedRecommendations": [] 4 | } 5 | -------------------------------------------------------------------------------- /web/.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.2.0", 3 | "configurations": [ 4 | { 5 | "command": "./node_modules/.bin/astro dev", 6 | "name": "Development server", 7 | "request": "launch", 8 | "type": "node-terminal" 9 | } 10 | ] 11 | } 12 | -------------------------------------------------------------------------------- /web/README.md: -------------------------------------------------------------------------------- 1 | # Astro Starter Kit: Basics 2 | 3 | ```sh 4 | npm create astro@latest -- --template basics 5 | ``` 6 | 7 | [![Open in StackBlitz](https://developer.stackblitz.com/img/open_in_stackblitz.svg)](https://stackblitz.com/github/withastro/astro/tree/latest/examples/basics) 8 | [![Open with CodeSandbox](https://assets.codesandbox.io/github/button-edit-lime.svg)](https://codesandbox.io/p/sandbox/github/withastro/astro/tree/latest/examples/basics) 9 | [![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/withastro/astro?devcontainer_path=.devcontainer/basics/devcontainer.json) 10 | 11 | > 🧑‍🚀 **Seasoned astronaut?** Delete this file. Have fun! 12 | 13 | ![just-the-basics](https://github.com/withastro/astro/assets/2244813/a0a5533c-a856-4198-8470-2d67b1d7c554) 14 | 15 | ## 🚀 Project Structure 16 | 17 | Inside of your Astro project, you'll see the following folders and files: 18 | 19 | ```text 20 | / 21 | ├── public/ 22 | │ └── favicon.svg 23 | ├── src/ 24 | │ ├── components/ 25 | │ │ └── Card.astro 26 | │ ├── layouts/ 27 | │ │ └── Layout.astro 28 | │ └── pages/ 29 | │ └── index.astro 30 | └── package.json 31 | ``` 32 | 33 | Astro looks for `.astro` or `.md` files in the `src/pages/` directory. Each page is exposed as a route based on its file name. 34 | 35 | There's nothing special about `src/components/`, but that's where we like to put any Astro/React/Vue/Svelte/Preact components. 36 | 37 | Any static assets, like images, can be placed in the `public/` directory. 38 | 39 | ## 🧞 Commands 40 | 41 | All commands are run from the root of the project, from a terminal: 42 | 43 | | Command | Action | 44 | | :------------------------ | :----------------------------------------------- | 45 | | `npm install` | Installs dependencies | 46 | | `npm run dev` | Starts local dev server at `localhost:4321` | 47 | | `npm run build` | Build your production site to `./dist/` | 48 | | `npm run preview` | Preview your build locally, before deploying | 49 | | `npm run astro ...` | Run CLI commands like `astro add`, `astro check` | 50 | | `npm run astro -- --help` | Get help using the Astro CLI | 51 | 52 | ## 👀 Want to learn more? 53 | 54 | Feel free to check [our documentation](https://docs.astro.build) or jump into our [Discord server](https://astro.build/chat). 55 | -------------------------------------------------------------------------------- /web/astro.config.mjs: -------------------------------------------------------------------------------- 1 | // @ts-check 2 | import { defineConfig } from 'astro/config'; 3 | 4 | import tailwind from '@astrojs/tailwind'; 5 | 6 | import react from '@astrojs/react'; 7 | 8 | // https://astro.build/config 9 | export default defineConfig({ 10 | integrations: [tailwind(), react()] 11 | }); -------------------------------------------------------------------------------- /web/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "web", 3 | "type": "module", 4 | "version": "0.0.1", 5 | "scripts": { 6 | "dev": "astro dev", 7 | "start": "astro dev", 8 | "build": "astro check && astro build", 9 | "preview": "astro preview", 10 | "astro": "astro" 11 | }, 12 | "dependencies": { 13 | "@astrojs/check": "^0.9.3", 14 | "@astrojs/react": "^3.6.2", 15 | "@astrojs/tailwind": "^5.1.1", 16 | "@types/react": "^18.3.8", 17 | "@types/react-dom": "^18.3.0", 18 | "astro": "^4.15.8", 19 | "react": "^18.3.1", 20 | "react-dom": "^18.3.1", 21 | "tailwindcss": "^3.4.12", 22 | "typescript": "^5.6.2" 23 | } 24 | } -------------------------------------------------------------------------------- /web/public/favicon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 9 | 10 | -------------------------------------------------------------------------------- /web/src/env.d.ts: -------------------------------------------------------------------------------- 1 | /// -------------------------------------------------------------------------------- /web/src/pages/index.astro: -------------------------------------------------------------------------------- 1 | 2 | 3 | Tailwind motion 4 | 5 | 6 | 9 |

13 | Rombo 14 |

15 | 16 | 17 | -------------------------------------------------------------------------------- /web/tailwind.config.mjs: -------------------------------------------------------------------------------- 1 | import tailwindMotion from "../dist/index"; 2 | 3 | /** @type {import('tailwindcss').Config} */ 4 | export default { 5 | content: ["./src/**/*.{astro,html,js,jsx,md,mdx,svelte,ts,tsx,vue}"], 6 | theme: { 7 | extend: {}, 8 | }, 9 | plugins: [tailwindMotion], 10 | }; 11 | -------------------------------------------------------------------------------- /web/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "astro/tsconfigs/strict", 3 | "compilerOptions": { 4 | "jsx": "react-jsx", 5 | "jsxImportSource": "react" 6 | } 7 | } --------------------------------------------------------------------------------