├── .gitignore ├── README.md ├── package-lock.json ├── package.json ├── pnpm-lock.yaml ├── prettier.config.js ├── src ├── app.tsx ├── helpers │ ├── check-and-change-fills.ts │ ├── check-and-change-radius.ts │ ├── check-and-change-strokes.ts │ ├── get-deepest-node-variable.ts │ ├── get-mode-mapping.ts │ ├── get-primitives-mapping.ts │ ├── get-tokens-mapping.ts │ ├── is-corner-radius-settable.ts │ ├── is-fillable.ts │ ├── is-solid-paints.ts │ └── is-strokeable.ts ├── main.ts ├── themes │ ├── colors │ │ ├── blue.ts │ │ ├── gray.ts │ │ ├── green.ts │ │ ├── neutral.ts │ │ ├── orange.ts │ │ ├── red.ts │ │ ├── rose.ts │ │ ├── slate.ts │ │ ├── stone.ts │ │ ├── violet.ts │ │ ├── yellow.ts │ │ └── zinc.ts │ ├── index.ts │ └── radii │ │ ├── radius-0.3.ts │ │ ├── radius-0.5.ts │ │ ├── radius-0.75.ts │ │ ├── radius-0.ts │ │ └── radius-1.0.ts ├── types.ts └── ui.tsx └── tsconfig.json /.gitignore: -------------------------------------------------------------------------------- 1 | .vscode 2 | .DS_Store 3 | *.log 4 | *.css.d.ts 5 | build/ 6 | node_modules/ 7 | manifest.json 8 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Design with shadcn/ui Plugin 2 | 3 | !["Design with shadcn/ui Plugin cover"](https://github.com/hawkup/design-with-shadcn-ui-plugin/assets/2748846/e2cdaeda-6d07-4304-8a5c-a1bc23348692) 4 | 5 | Plugin for changing the theme of ["Design with shadcn/ui"](https://www.figma.com/community/file/1256349428272495041) 6 | 7 | ## Development guide 8 | 9 | _This plugin is built with [Create Figma Plugin](https://yuanqing.github.io/create-figma-plugin/)._ 10 | 11 | ### Pre-requisites 12 | 13 | - [Node.js](https://nodejs.org) – v18 14 | - [Figma desktop app](https://figma.com/downloads/) 15 | 16 | ### Build the plugin 17 | 18 | To build the plugin: 19 | 20 | ``` 21 | $ npm run build 22 | ``` 23 | 24 | This will generate a [`manifest.json`](https://figma.com/plugin-docs/manifest/) file and a `build/` directory containing the JavaScript bundle(s) for the plugin. 25 | 26 | To watch for code changes and rebuild the plugin automatically: 27 | 28 | ``` 29 | $ npm run watch 30 | ``` 31 | 32 | ### Install the plugin 33 | 34 | 1. In the Figma desktop app, open a Figma document. 35 | 2. Search for and run `Import plugin from manifest…` via the Quick Actions search bar. 36 | 3. Select the `manifest.json` file that was generated by the `build` script. 37 | 38 | ### Debugging 39 | 40 | Use `console.log` statements to inspect values in your code. 41 | 42 | To open the developer console, search for and run `Open Console` via the Quick Actions search bar. 43 | 44 | ## See also 45 | 46 | - [Create Figma Plugin docs](https://yuanqing.github.io/create-figma-plugin/) 47 | - [`yuanqing/figma-plugins`](https://github.com/yuanqing/figma-plugins#readme) 48 | 49 | Official docs and code samples from Figma: 50 | 51 | - [Plugin API docs](https://figma.com/plugin-docs/) 52 | - [`figma/plugin-samples`](https://github.com/figma/plugin-samples#readme) 53 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.0.1", 3 | "dependencies": { 4 | "@create-figma-plugin/ui": "^2.6.1", 5 | "@create-figma-plugin/utilities": "^2.6.1", 6 | "preact": ">=10" 7 | }, 8 | "devDependencies": { 9 | "@create-figma-plugin/build": "^2.6.1", 10 | "@create-figma-plugin/tsconfig": "^2.6.1", 11 | "@figma/plugin-typings": "1.74.0", 12 | "prettier": "^3.0.3", 13 | "typescript": ">=4" 14 | }, 15 | "scripts": { 16 | "build": "build-figma-plugin --typecheck --minify", 17 | "watch": "build-figma-plugin --typecheck --watch" 18 | }, 19 | "figma-plugin": { 20 | "editorType": [ 21 | "figma" 22 | ], 23 | "id": "1280731237276040017", 24 | "name": "Design with shadcn/ui Plugin", 25 | "main": "src/main.ts", 26 | "ui": "src/ui.tsx" 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: "6.0" 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | dependencies: 8 | "@create-figma-plugin/ui": 9 | specifier: ^2.6.1 10 | version: 2.6.1(preact@10.17.1) 11 | "@create-figma-plugin/utilities": 12 | specifier: ^2.6.1 13 | version: 2.6.1 14 | preact: 15 | specifier: ">=10" 16 | version: 10.17.1 17 | 18 | devDependencies: 19 | "@create-figma-plugin/build": 20 | specifier: ^2.6.1 21 | version: 2.6.1(@figma/plugin-typings@1.74.0)(typescript@5.2.2) 22 | "@create-figma-plugin/tsconfig": 23 | specifier: ^2.6.1 24 | version: 2.6.1 25 | "@figma/plugin-typings": 26 | specifier: 1.74.0 27 | version: 1.74.0 28 | prettier: 29 | specifier: ^3.0.3 30 | version: 3.0.3 31 | typescript: 32 | specifier: ">=4" 33 | version: 5.2.2 34 | 35 | packages: 36 | /@create-figma-plugin/build@2.6.1(@figma/plugin-typings@1.74.0)(typescript@5.2.2): 37 | resolution: 38 | { 39 | integrity: sha512-oLN3hNXS1I0iEo7gYnhDsDNEwjHps+W37rHBUJU1CqZ99NGy8VsGll1EAVffaQfT1p6HlYV9eoK+PSl58WMZLQ==, 40 | } 41 | engines: { node: ">=18" } 42 | hasBin: true 43 | peerDependencies: 44 | "@figma/plugin-typings": ">=1" 45 | typescript: ">=4" 46 | dependencies: 47 | "@create-figma-plugin/common": 2.6.1 48 | "@figma/plugin-typings": 1.74.0 49 | chokidar: 3.5.3 50 | cssnano: 6.0.1(postcss@8.4.29) 51 | esbuild: 0.19.2 52 | find-up: 6.3.0 53 | globby: 13.2.2 54 | import-fresh: 3.3.0 55 | indent-string: 5.0.0 56 | kleur: 4.1.5 57 | path-exists: 5.0.0 58 | postcss: 8.4.29 59 | postcss-modules: 6.0.0(postcss@8.4.29) 60 | rev-hash: 4.0.0 61 | sade: 1.8.1 62 | temp-write: 5.0.0 63 | tempy: 3.1.0 64 | typed-css-modules: 0.7.2 65 | typescript: 5.2.2 66 | dev: true 67 | 68 | /@create-figma-plugin/common@2.6.1: 69 | resolution: 70 | { 71 | integrity: sha512-pBwEZzkOMImMMNX3vhAach5bENoUaDR+sTUk0wDIITQM3vDDdEnUwPDWROlsmyFrmsOfSG15vNN1Qcgi0zAl6g==, 72 | } 73 | engines: { node: ">=18" } 74 | dependencies: 75 | "@sindresorhus/slugify": 2.2.1 76 | kleur: 4.1.5 77 | path-exists: 5.0.0 78 | dev: true 79 | 80 | /@create-figma-plugin/tsconfig@2.6.1: 81 | resolution: 82 | { 83 | integrity: sha512-VWYzdW0VGM0EW6Y83F9ApImbo/N2VUVjWWYh1hILILal9W1C3LuWLJNl1o2M4sSjnrYo5JJeBKZ8EKfpXD+zyA==, 84 | } 85 | dev: true 86 | 87 | /@create-figma-plugin/ui@2.6.1(preact@10.17.1): 88 | resolution: 89 | { 90 | integrity: sha512-22BlXYqh5gnCc2Z4W077dNQuMfvIZzPtzr+4hCzanTG4b+8QUNM5X1u/gOQfvG7LqIJNDk5ZzqJuwfLGTfSxVw==, 91 | } 92 | engines: { node: ">=18" } 93 | peerDependencies: 94 | preact: ">=10" 95 | dependencies: 96 | "@create-figma-plugin/utilities": 2.6.1 97 | preact: 10.17.1 98 | dev: false 99 | 100 | /@create-figma-plugin/utilities@2.6.1: 101 | resolution: 102 | { 103 | integrity: sha512-Zd4sxIogl2IVLmOIWdcyAav3SwzTzAAMNkWY9DuSkder6kq5M79+AdSJ9q1ETCsCiBysakJ5BPaiVOBRAjfuFQ==, 104 | } 105 | engines: { node: ">=18" } 106 | dependencies: 107 | hex-rgb: 5.0.0 108 | natural-compare-lite: 1.4.0 109 | rgb-hex: 4.0.1 110 | dev: false 111 | 112 | /@esbuild/android-arm64@0.19.2: 113 | resolution: 114 | { 115 | integrity: sha512-lsB65vAbe90I/Qe10OjkmrdxSX4UJDjosDgb8sZUKcg3oefEuW2OT2Vozz8ef7wrJbMcmhvCC+hciF8jY/uAkw==, 116 | } 117 | engines: { node: ">=12" } 118 | cpu: [arm64] 119 | os: [android] 120 | requiresBuild: true 121 | dev: true 122 | optional: true 123 | 124 | /@esbuild/android-arm@0.19.2: 125 | resolution: 126 | { 127 | integrity: sha512-tM8yLeYVe7pRyAu9VMi/Q7aunpLwD139EY1S99xbQkT4/q2qa6eA4ige/WJQYdJ8GBL1K33pPFhPfPdJ/WzT8Q==, 128 | } 129 | engines: { node: ">=12" } 130 | cpu: [arm] 131 | os: [android] 132 | requiresBuild: true 133 | dev: true 134 | optional: true 135 | 136 | /@esbuild/android-x64@0.19.2: 137 | resolution: 138 | { 139 | integrity: sha512-qK/TpmHt2M/Hg82WXHRc/W/2SGo/l1thtDHZWqFq7oi24AjZ4O/CpPSu6ZuYKFkEgmZlFoa7CooAyYmuvnaG8w==, 140 | } 141 | engines: { node: ">=12" } 142 | cpu: [x64] 143 | os: [android] 144 | requiresBuild: true 145 | dev: true 146 | optional: true 147 | 148 | /@esbuild/darwin-arm64@0.19.2: 149 | resolution: 150 | { 151 | integrity: sha512-Ora8JokrvrzEPEpZO18ZYXkH4asCdc1DLdcVy8TGf5eWtPO1Ie4WroEJzwI52ZGtpODy3+m0a2yEX9l+KUn0tA==, 152 | } 153 | engines: { node: ">=12" } 154 | cpu: [arm64] 155 | os: [darwin] 156 | requiresBuild: true 157 | dev: true 158 | optional: true 159 | 160 | /@esbuild/darwin-x64@0.19.2: 161 | resolution: 162 | { 163 | integrity: sha512-tP+B5UuIbbFMj2hQaUr6EALlHOIOmlLM2FK7jeFBobPy2ERdohI4Ka6ZFjZ1ZYsrHE/hZimGuU90jusRE0pwDw==, 164 | } 165 | engines: { node: ">=12" } 166 | cpu: [x64] 167 | os: [darwin] 168 | requiresBuild: true 169 | dev: true 170 | optional: true 171 | 172 | /@esbuild/freebsd-arm64@0.19.2: 173 | resolution: 174 | { 175 | integrity: sha512-YbPY2kc0acfzL1VPVK6EnAlig4f+l8xmq36OZkU0jzBVHcOTyQDhnKQaLzZudNJQyymd9OqQezeaBgkTGdTGeQ==, 176 | } 177 | engines: { node: ">=12" } 178 | cpu: [arm64] 179 | os: [freebsd] 180 | requiresBuild: true 181 | dev: true 182 | optional: true 183 | 184 | /@esbuild/freebsd-x64@0.19.2: 185 | resolution: 186 | { 187 | integrity: sha512-nSO5uZT2clM6hosjWHAsS15hLrwCvIWx+b2e3lZ3MwbYSaXwvfO528OF+dLjas1g3bZonciivI8qKR/Hm7IWGw==, 188 | } 189 | engines: { node: ">=12" } 190 | cpu: [x64] 191 | os: [freebsd] 192 | requiresBuild: true 193 | dev: true 194 | optional: true 195 | 196 | /@esbuild/linux-arm64@0.19.2: 197 | resolution: 198 | { 199 | integrity: sha512-ig2P7GeG//zWlU0AggA3pV1h5gdix0MA3wgB+NsnBXViwiGgY77fuN9Wr5uoCrs2YzaYfogXgsWZbm+HGr09xg==, 200 | } 201 | engines: { node: ">=12" } 202 | cpu: [arm64] 203 | os: [linux] 204 | requiresBuild: true 205 | dev: true 206 | optional: true 207 | 208 | /@esbuild/linux-arm@0.19.2: 209 | resolution: 210 | { 211 | integrity: sha512-Odalh8hICg7SOD7XCj0YLpYCEc+6mkoq63UnExDCiRA2wXEmGlK5JVrW50vZR9Qz4qkvqnHcpH+OFEggO3PgTg==, 212 | } 213 | engines: { node: ">=12" } 214 | cpu: [arm] 215 | os: [linux] 216 | requiresBuild: true 217 | dev: true 218 | optional: true 219 | 220 | /@esbuild/linux-ia32@0.19.2: 221 | resolution: 222 | { 223 | integrity: sha512-mLfp0ziRPOLSTek0Gd9T5B8AtzKAkoZE70fneiiyPlSnUKKI4lp+mGEnQXcQEHLJAcIYDPSyBvsUbKUG2ri/XQ==, 224 | } 225 | engines: { node: ">=12" } 226 | cpu: [ia32] 227 | os: [linux] 228 | requiresBuild: true 229 | dev: true 230 | optional: true 231 | 232 | /@esbuild/linux-loong64@0.19.2: 233 | resolution: 234 | { 235 | integrity: sha512-hn28+JNDTxxCpnYjdDYVMNTR3SKavyLlCHHkufHV91fkewpIyQchS1d8wSbmXhs1fiYDpNww8KTFlJ1dHsxeSw==, 236 | } 237 | engines: { node: ">=12" } 238 | cpu: [loong64] 239 | os: [linux] 240 | requiresBuild: true 241 | dev: true 242 | optional: true 243 | 244 | /@esbuild/linux-mips64el@0.19.2: 245 | resolution: 246 | { 247 | integrity: sha512-KbXaC0Sejt7vD2fEgPoIKb6nxkfYW9OmFUK9XQE4//PvGIxNIfPk1NmlHmMg6f25x57rpmEFrn1OotASYIAaTg==, 248 | } 249 | engines: { node: ">=12" } 250 | cpu: [mips64el] 251 | os: [linux] 252 | requiresBuild: true 253 | dev: true 254 | optional: true 255 | 256 | /@esbuild/linux-ppc64@0.19.2: 257 | resolution: 258 | { 259 | integrity: sha512-dJ0kE8KTqbiHtA3Fc/zn7lCd7pqVr4JcT0JqOnbj4LLzYnp+7h8Qi4yjfq42ZlHfhOCM42rBh0EwHYLL6LEzcw==, 260 | } 261 | engines: { node: ">=12" } 262 | cpu: [ppc64] 263 | os: [linux] 264 | requiresBuild: true 265 | dev: true 266 | optional: true 267 | 268 | /@esbuild/linux-riscv64@0.19.2: 269 | resolution: 270 | { 271 | integrity: sha512-7Z/jKNFufZ/bbu4INqqCN6DDlrmOTmdw6D0gH+6Y7auok2r02Ur661qPuXidPOJ+FSgbEeQnnAGgsVynfLuOEw==, 272 | } 273 | engines: { node: ">=12" } 274 | cpu: [riscv64] 275 | os: [linux] 276 | requiresBuild: true 277 | dev: true 278 | optional: true 279 | 280 | /@esbuild/linux-s390x@0.19.2: 281 | resolution: 282 | { 283 | integrity: sha512-U+RinR6aXXABFCcAY4gSlv4CL1oOVvSSCdseQmGO66H+XyuQGZIUdhG56SZaDJQcLmrSfRmx5XZOWyCJPRqS7g==, 284 | } 285 | engines: { node: ">=12" } 286 | cpu: [s390x] 287 | os: [linux] 288 | requiresBuild: true 289 | dev: true 290 | optional: true 291 | 292 | /@esbuild/linux-x64@0.19.2: 293 | resolution: 294 | { 295 | integrity: sha512-oxzHTEv6VPm3XXNaHPyUTTte+3wGv7qVQtqaZCrgstI16gCuhNOtBXLEBkBREP57YTd68P0VgDgG73jSD8bwXQ==, 296 | } 297 | engines: { node: ">=12" } 298 | cpu: [x64] 299 | os: [linux] 300 | requiresBuild: true 301 | dev: true 302 | optional: true 303 | 304 | /@esbuild/netbsd-x64@0.19.2: 305 | resolution: 306 | { 307 | integrity: sha512-WNa5zZk1XpTTwMDompZmvQLHszDDDN7lYjEHCUmAGB83Bgs20EMs7ICD+oKeT6xt4phV4NDdSi/8OfjPbSbZfQ==, 308 | } 309 | engines: { node: ">=12" } 310 | cpu: [x64] 311 | os: [netbsd] 312 | requiresBuild: true 313 | dev: true 314 | optional: true 315 | 316 | /@esbuild/openbsd-x64@0.19.2: 317 | resolution: 318 | { 319 | integrity: sha512-S6kI1aT3S++Dedb7vxIuUOb3oAxqxk2Rh5rOXOTYnzN8JzW1VzBd+IqPiSpgitu45042SYD3HCoEyhLKQcDFDw==, 320 | } 321 | engines: { node: ">=12" } 322 | cpu: [x64] 323 | os: [openbsd] 324 | requiresBuild: true 325 | dev: true 326 | optional: true 327 | 328 | /@esbuild/sunos-x64@0.19.2: 329 | resolution: 330 | { 331 | integrity: sha512-VXSSMsmb+Z8LbsQGcBMiM+fYObDNRm8p7tkUDMPG/g4fhFX5DEFmjxIEa3N8Zr96SjsJ1woAhF0DUnS3MF3ARw==, 332 | } 333 | engines: { node: ">=12" } 334 | cpu: [x64] 335 | os: [sunos] 336 | requiresBuild: true 337 | dev: true 338 | optional: true 339 | 340 | /@esbuild/win32-arm64@0.19.2: 341 | resolution: 342 | { 343 | integrity: sha512-5NayUlSAyb5PQYFAU9x3bHdsqB88RC3aM9lKDAz4X1mo/EchMIT1Q+pSeBXNgkfNmRecLXA0O8xP+x8V+g/LKg==, 344 | } 345 | engines: { node: ">=12" } 346 | cpu: [arm64] 347 | os: [win32] 348 | requiresBuild: true 349 | dev: true 350 | optional: true 351 | 352 | /@esbuild/win32-ia32@0.19.2: 353 | resolution: 354 | { 355 | integrity: sha512-47gL/ek1v36iN0wL9L4Q2MFdujR0poLZMJwhO2/N3gA89jgHp4MR8DKCmwYtGNksbfJb9JoTtbkoe6sDhg2QTA==, 356 | } 357 | engines: { node: ">=12" } 358 | cpu: [ia32] 359 | os: [win32] 360 | requiresBuild: true 361 | dev: true 362 | optional: true 363 | 364 | /@esbuild/win32-x64@0.19.2: 365 | resolution: 366 | { 367 | integrity: sha512-tcuhV7ncXBqbt/Ybf0IyrMcwVOAPDckMK9rXNHtF17UTK18OKLpg08glminN06pt2WCoALhXdLfSPbVvK/6fxw==, 368 | } 369 | engines: { node: ">=12" } 370 | cpu: [x64] 371 | os: [win32] 372 | requiresBuild: true 373 | dev: true 374 | optional: true 375 | 376 | /@figma/plugin-typings@1.74.0: 377 | resolution: 378 | { 379 | integrity: sha512-NZTBgFSzwH9AqNASKqmipblhPOHHqPE0yD1yp87v8qJnqYz1IODlHmXyW1J6T/24L/4IWq6/5OBPgu1fdfzkog==, 380 | } 381 | dev: true 382 | 383 | /@nodelib/fs.scandir@2.1.5: 384 | resolution: 385 | { 386 | integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==, 387 | } 388 | engines: { node: ">= 8" } 389 | dependencies: 390 | "@nodelib/fs.stat": 2.0.5 391 | run-parallel: 1.2.0 392 | dev: true 393 | 394 | /@nodelib/fs.stat@2.0.5: 395 | resolution: 396 | { 397 | integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==, 398 | } 399 | engines: { node: ">= 8" } 400 | dev: true 401 | 402 | /@nodelib/fs.walk@1.2.8: 403 | resolution: 404 | { 405 | integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==, 406 | } 407 | engines: { node: ">= 8" } 408 | dependencies: 409 | "@nodelib/fs.scandir": 2.1.5 410 | fastq: 1.15.0 411 | dev: true 412 | 413 | /@sindresorhus/slugify@2.2.1: 414 | resolution: 415 | { 416 | integrity: sha512-MkngSCRZ8JdSOCHRaYd+D01XhvU3Hjy6MGl06zhOk614hp9EOAp5gIkBeQg7wtmxpitU6eAL4kdiRMcJa2dlrw==, 417 | } 418 | engines: { node: ">=12" } 419 | dependencies: 420 | "@sindresorhus/transliterate": 1.6.0 421 | escape-string-regexp: 5.0.0 422 | dev: true 423 | 424 | /@sindresorhus/transliterate@1.6.0: 425 | resolution: 426 | { 427 | integrity: sha512-doH1gimEu3A46VX6aVxpHTeHrytJAG6HgdxntYnCFiIFHEM/ZGpG8KiZGBChchjQmG0XFIBL552kBTjVcMZXwQ==, 428 | } 429 | engines: { node: ">=12" } 430 | dependencies: 431 | escape-string-regexp: 5.0.0 432 | dev: true 433 | 434 | /@trysound/sax@0.2.0: 435 | resolution: 436 | { 437 | integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==, 438 | } 439 | engines: { node: ">=10.13.0" } 440 | dev: true 441 | 442 | /@types/css-modules-loader-core@1.1.0: 443 | resolution: 444 | { 445 | integrity: sha512-LMbyf7THPqLCPHIXAj79v9Pa193MeOHgp1fBFRR6s6VvEVHUFIcM5bc/WttslOf+lao4TURNN1X1zfW5wr2CHQ==, 446 | } 447 | dependencies: 448 | postcss: 7.0.39 449 | dev: true 450 | 451 | /ansi-regex@2.1.1: 452 | resolution: 453 | { 454 | integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==, 455 | } 456 | engines: { node: ">=0.10.0" } 457 | dev: true 458 | 459 | /ansi-regex@5.0.1: 460 | resolution: 461 | { 462 | integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==, 463 | } 464 | engines: { node: ">=8" } 465 | dev: true 466 | 467 | /ansi-styles@2.2.1: 468 | resolution: 469 | { 470 | integrity: sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==, 471 | } 472 | engines: { node: ">=0.10.0" } 473 | dev: true 474 | 475 | /ansi-styles@4.3.0: 476 | resolution: 477 | { 478 | integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==, 479 | } 480 | engines: { node: ">=8" } 481 | dependencies: 482 | color-convert: 2.0.1 483 | dev: true 484 | 485 | /anymatch@3.1.3: 486 | resolution: 487 | { 488 | integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==, 489 | } 490 | engines: { node: ">= 8" } 491 | dependencies: 492 | normalize-path: 3.0.0 493 | picomatch: 2.3.1 494 | dev: true 495 | 496 | /balanced-match@1.0.2: 497 | resolution: 498 | { 499 | integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==, 500 | } 501 | dev: true 502 | 503 | /binary-extensions@2.2.0: 504 | resolution: 505 | { 506 | integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==, 507 | } 508 | engines: { node: ">=8" } 509 | dev: true 510 | 511 | /boolbase@1.0.0: 512 | resolution: 513 | { 514 | integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==, 515 | } 516 | dev: true 517 | 518 | /brace-expansion@1.1.11: 519 | resolution: 520 | { 521 | integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==, 522 | } 523 | dependencies: 524 | balanced-match: 1.0.2 525 | concat-map: 0.0.1 526 | dev: true 527 | 528 | /braces@3.0.2: 529 | resolution: 530 | { 531 | integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==, 532 | } 533 | engines: { node: ">=8" } 534 | dependencies: 535 | fill-range: 7.0.1 536 | dev: true 537 | 538 | /browserslist@4.21.10: 539 | resolution: 540 | { 541 | integrity: sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==, 542 | } 543 | engines: { node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7 } 544 | hasBin: true 545 | dependencies: 546 | caniuse-lite: 1.0.30001525 547 | electron-to-chromium: 1.4.506 548 | node-releases: 2.0.13 549 | update-browserslist-db: 1.0.11(browserslist@4.21.10) 550 | dev: true 551 | 552 | /callsites@3.1.0: 553 | resolution: 554 | { 555 | integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==, 556 | } 557 | engines: { node: ">=6" } 558 | dev: true 559 | 560 | /camelcase@5.3.1: 561 | resolution: 562 | { 563 | integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==, 564 | } 565 | engines: { node: ">=6" } 566 | dev: true 567 | 568 | /camelcase@6.3.0: 569 | resolution: 570 | { 571 | integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==, 572 | } 573 | engines: { node: ">=10" } 574 | dev: true 575 | 576 | /caniuse-api@3.0.0: 577 | resolution: 578 | { 579 | integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==, 580 | } 581 | dependencies: 582 | browserslist: 4.21.10 583 | caniuse-lite: 1.0.30001525 584 | lodash.memoize: 4.1.2 585 | lodash.uniq: 4.5.0 586 | dev: true 587 | 588 | /caniuse-lite@1.0.30001525: 589 | resolution: 590 | { 591 | integrity: sha512-/3z+wB4icFt3r0USMwxujAqRvaD/B7rvGTsKhbhSQErVrJvkZCLhgNLJxU8MevahQVH6hCU9FsHdNUFbiwmE7Q==, 592 | } 593 | dev: true 594 | 595 | /chalk@1.1.3: 596 | resolution: 597 | { 598 | integrity: sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==, 599 | } 600 | engines: { node: ">=0.10.0" } 601 | dependencies: 602 | ansi-styles: 2.2.1 603 | escape-string-regexp: 1.0.5 604 | has-ansi: 2.0.0 605 | strip-ansi: 3.0.1 606 | supports-color: 2.0.0 607 | dev: true 608 | 609 | /chalk@4.1.2: 610 | resolution: 611 | { 612 | integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==, 613 | } 614 | engines: { node: ">=10" } 615 | dependencies: 616 | ansi-styles: 4.3.0 617 | supports-color: 7.2.0 618 | dev: true 619 | 620 | /chokidar@3.5.3: 621 | resolution: 622 | { 623 | integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==, 624 | } 625 | engines: { node: ">= 8.10.0" } 626 | dependencies: 627 | anymatch: 3.1.3 628 | braces: 3.0.2 629 | glob-parent: 5.1.2 630 | is-binary-path: 2.1.0 631 | is-glob: 4.0.3 632 | normalize-path: 3.0.0 633 | readdirp: 3.6.0 634 | optionalDependencies: 635 | fsevents: 2.3.3 636 | dev: true 637 | 638 | /cliui@6.0.0: 639 | resolution: 640 | { 641 | integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==, 642 | } 643 | dependencies: 644 | string-width: 4.2.3 645 | strip-ansi: 6.0.1 646 | wrap-ansi: 6.2.0 647 | dev: true 648 | 649 | /color-convert@2.0.1: 650 | resolution: 651 | { 652 | integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==, 653 | } 654 | engines: { node: ">=7.0.0" } 655 | dependencies: 656 | color-name: 1.1.4 657 | dev: true 658 | 659 | /color-name@1.1.4: 660 | resolution: 661 | { 662 | integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==, 663 | } 664 | dev: true 665 | 666 | /colord@2.9.3: 667 | resolution: 668 | { 669 | integrity: sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==, 670 | } 671 | dev: true 672 | 673 | /commander@7.2.0: 674 | resolution: 675 | { 676 | integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==, 677 | } 678 | engines: { node: ">= 10" } 679 | dev: true 680 | 681 | /concat-map@0.0.1: 682 | resolution: 683 | { 684 | integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==, 685 | } 686 | dev: true 687 | 688 | /crypto-random-string@4.0.0: 689 | resolution: 690 | { 691 | integrity: sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==, 692 | } 693 | engines: { node: ">=12" } 694 | dependencies: 695 | type-fest: 1.4.0 696 | dev: true 697 | 698 | /css-declaration-sorter@6.4.1(postcss@8.4.29): 699 | resolution: 700 | { 701 | integrity: sha512-rtdthzxKuyq6IzqX6jEcIzQF/YqccluefyCYheovBOLhFT/drQA9zj/UbRAa9J7C0o6EG6u3E6g+vKkay7/k3g==, 702 | } 703 | engines: { node: ^10 || ^12 || >=14 } 704 | peerDependencies: 705 | postcss: ^8.0.9 706 | dependencies: 707 | postcss: 8.4.29 708 | dev: true 709 | 710 | /css-modules-loader-core@1.1.0: 711 | resolution: 712 | { 713 | integrity: sha512-XWOBwgy5nwBn76aA+6ybUGL/3JBnCtBX9Ay9/OWIpzKYWlVHMazvJ+WtHumfi+xxdPF440cWK7JCYtt8xDifew==, 714 | } 715 | dependencies: 716 | icss-replace-symbols: 1.1.0 717 | postcss: 6.0.1 718 | postcss-modules-extract-imports: 1.1.0 719 | postcss-modules-local-by-default: 1.2.0 720 | postcss-modules-scope: 1.1.0 721 | postcss-modules-values: 1.3.0 722 | dev: true 723 | 724 | /css-select@5.1.0: 725 | resolution: 726 | { 727 | integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==, 728 | } 729 | dependencies: 730 | boolbase: 1.0.0 731 | css-what: 6.1.0 732 | domhandler: 5.0.3 733 | domutils: 3.1.0 734 | nth-check: 2.1.1 735 | dev: true 736 | 737 | /css-selector-tokenizer@0.7.3: 738 | resolution: 739 | { 740 | integrity: sha512-jWQv3oCEL5kMErj4wRnK/OPoBi0D+P1FR2cDCKYPaMeD2eW3/mttav8HT4hT1CKopiJI/psEULjkClhvJo4Lvg==, 741 | } 742 | dependencies: 743 | cssesc: 3.0.0 744 | fastparse: 1.1.2 745 | dev: true 746 | 747 | /css-tree@2.2.1: 748 | resolution: 749 | { 750 | integrity: sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==, 751 | } 752 | engines: { node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: ">=7.0.0" } 753 | dependencies: 754 | mdn-data: 2.0.28 755 | source-map-js: 1.0.2 756 | dev: true 757 | 758 | /css-tree@2.3.1: 759 | resolution: 760 | { 761 | integrity: sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==, 762 | } 763 | engines: { node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0 } 764 | dependencies: 765 | mdn-data: 2.0.30 766 | source-map-js: 1.0.2 767 | dev: true 768 | 769 | /css-what@6.1.0: 770 | resolution: 771 | { 772 | integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==, 773 | } 774 | engines: { node: ">= 6" } 775 | dev: true 776 | 777 | /cssesc@3.0.0: 778 | resolution: 779 | { 780 | integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==, 781 | } 782 | engines: { node: ">=4" } 783 | hasBin: true 784 | dev: true 785 | 786 | /cssnano-preset-default@6.0.1(postcss@8.4.29): 787 | resolution: 788 | { 789 | integrity: sha512-7VzyFZ5zEB1+l1nToKyrRkuaJIx0zi/1npjvZfbBwbtNTzhLtlvYraK/7/uqmX2Wb2aQtd983uuGw79jAjLSuQ==, 790 | } 791 | engines: { node: ^14 || ^16 || >=18.0 } 792 | peerDependencies: 793 | postcss: ^8.2.15 794 | dependencies: 795 | css-declaration-sorter: 6.4.1(postcss@8.4.29) 796 | cssnano-utils: 4.0.0(postcss@8.4.29) 797 | postcss: 8.4.29 798 | postcss-calc: 9.0.1(postcss@8.4.29) 799 | postcss-colormin: 6.0.0(postcss@8.4.29) 800 | postcss-convert-values: 6.0.0(postcss@8.4.29) 801 | postcss-discard-comments: 6.0.0(postcss@8.4.29) 802 | postcss-discard-duplicates: 6.0.0(postcss@8.4.29) 803 | postcss-discard-empty: 6.0.0(postcss@8.4.29) 804 | postcss-discard-overridden: 6.0.0(postcss@8.4.29) 805 | postcss-merge-longhand: 6.0.0(postcss@8.4.29) 806 | postcss-merge-rules: 6.0.1(postcss@8.4.29) 807 | postcss-minify-font-values: 6.0.0(postcss@8.4.29) 808 | postcss-minify-gradients: 6.0.0(postcss@8.4.29) 809 | postcss-minify-params: 6.0.0(postcss@8.4.29) 810 | postcss-minify-selectors: 6.0.0(postcss@8.4.29) 811 | postcss-normalize-charset: 6.0.0(postcss@8.4.29) 812 | postcss-normalize-display-values: 6.0.0(postcss@8.4.29) 813 | postcss-normalize-positions: 6.0.0(postcss@8.4.29) 814 | postcss-normalize-repeat-style: 6.0.0(postcss@8.4.29) 815 | postcss-normalize-string: 6.0.0(postcss@8.4.29) 816 | postcss-normalize-timing-functions: 6.0.0(postcss@8.4.29) 817 | postcss-normalize-unicode: 6.0.0(postcss@8.4.29) 818 | postcss-normalize-url: 6.0.0(postcss@8.4.29) 819 | postcss-normalize-whitespace: 6.0.0(postcss@8.4.29) 820 | postcss-ordered-values: 6.0.0(postcss@8.4.29) 821 | postcss-reduce-initial: 6.0.0(postcss@8.4.29) 822 | postcss-reduce-transforms: 6.0.0(postcss@8.4.29) 823 | postcss-svgo: 6.0.0(postcss@8.4.29) 824 | postcss-unique-selectors: 6.0.0(postcss@8.4.29) 825 | dev: true 826 | 827 | /cssnano-utils@4.0.0(postcss@8.4.29): 828 | resolution: 829 | { 830 | integrity: sha512-Z39TLP+1E0KUcd7LGyF4qMfu8ZufI0rDzhdyAMsa/8UyNUU8wpS0fhdBxbQbv32r64ea00h4878gommRVg2BHw==, 831 | } 832 | engines: { node: ^14 || ^16 || >=18.0 } 833 | peerDependencies: 834 | postcss: ^8.2.15 835 | dependencies: 836 | postcss: 8.4.29 837 | dev: true 838 | 839 | /cssnano@6.0.1(postcss@8.4.29): 840 | resolution: 841 | { 842 | integrity: sha512-fVO1JdJ0LSdIGJq68eIxOqFpIJrZqXUsBt8fkrBcztCQqAjQD51OhZp7tc0ImcbwXD4k7ny84QTV90nZhmqbkg==, 843 | } 844 | engines: { node: ^14 || ^16 || >=18.0 } 845 | peerDependencies: 846 | postcss: ^8.2.15 847 | dependencies: 848 | cssnano-preset-default: 6.0.1(postcss@8.4.29) 849 | lilconfig: 2.1.0 850 | postcss: 8.4.29 851 | dev: true 852 | 853 | /csso@5.0.5: 854 | resolution: 855 | { 856 | integrity: sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==, 857 | } 858 | engines: { node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: ">=7.0.0" } 859 | dependencies: 860 | css-tree: 2.2.1 861 | dev: true 862 | 863 | /decamelize@1.2.0: 864 | resolution: 865 | { 866 | integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==, 867 | } 868 | engines: { node: ">=0.10.0" } 869 | dev: true 870 | 871 | /dir-glob@3.0.1: 872 | resolution: 873 | { 874 | integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==, 875 | } 876 | engines: { node: ">=8" } 877 | dependencies: 878 | path-type: 4.0.0 879 | dev: true 880 | 881 | /dom-serializer@2.0.0: 882 | resolution: 883 | { 884 | integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==, 885 | } 886 | dependencies: 887 | domelementtype: 2.3.0 888 | domhandler: 5.0.3 889 | entities: 4.5.0 890 | dev: true 891 | 892 | /domelementtype@2.3.0: 893 | resolution: 894 | { 895 | integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==, 896 | } 897 | dev: true 898 | 899 | /domhandler@5.0.3: 900 | resolution: 901 | { 902 | integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==, 903 | } 904 | engines: { node: ">= 4" } 905 | dependencies: 906 | domelementtype: 2.3.0 907 | dev: true 908 | 909 | /domutils@3.1.0: 910 | resolution: 911 | { 912 | integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==, 913 | } 914 | dependencies: 915 | dom-serializer: 2.0.0 916 | domelementtype: 2.3.0 917 | domhandler: 5.0.3 918 | dev: true 919 | 920 | /electron-to-chromium@1.4.506: 921 | resolution: 922 | { 923 | integrity: sha512-xxGct4GPAKSRlrLBtJxJFYy74W11zX6PO9GyHgl/U+2s3Dp0ZEwAklDfNHXOWcvH7zWMpsmgbR0ggEuaYAVvHA==, 924 | } 925 | dev: true 926 | 927 | /emoji-regex@8.0.0: 928 | resolution: 929 | { 930 | integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==, 931 | } 932 | dev: true 933 | 934 | /entities@4.5.0: 935 | resolution: 936 | { 937 | integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==, 938 | } 939 | engines: { node: ">=0.12" } 940 | dev: true 941 | 942 | /esbuild@0.19.2: 943 | resolution: 944 | { 945 | integrity: sha512-G6hPax8UbFakEj3hWO0Vs52LQ8k3lnBhxZWomUJDxfz3rZTLqF5k/FCzuNdLx2RbpBiQQF9H9onlDDH1lZsnjg==, 946 | } 947 | engines: { node: ">=12" } 948 | hasBin: true 949 | requiresBuild: true 950 | optionalDependencies: 951 | "@esbuild/android-arm": 0.19.2 952 | "@esbuild/android-arm64": 0.19.2 953 | "@esbuild/android-x64": 0.19.2 954 | "@esbuild/darwin-arm64": 0.19.2 955 | "@esbuild/darwin-x64": 0.19.2 956 | "@esbuild/freebsd-arm64": 0.19.2 957 | "@esbuild/freebsd-x64": 0.19.2 958 | "@esbuild/linux-arm": 0.19.2 959 | "@esbuild/linux-arm64": 0.19.2 960 | "@esbuild/linux-ia32": 0.19.2 961 | "@esbuild/linux-loong64": 0.19.2 962 | "@esbuild/linux-mips64el": 0.19.2 963 | "@esbuild/linux-ppc64": 0.19.2 964 | "@esbuild/linux-riscv64": 0.19.2 965 | "@esbuild/linux-s390x": 0.19.2 966 | "@esbuild/linux-x64": 0.19.2 967 | "@esbuild/netbsd-x64": 0.19.2 968 | "@esbuild/openbsd-x64": 0.19.2 969 | "@esbuild/sunos-x64": 0.19.2 970 | "@esbuild/win32-arm64": 0.19.2 971 | "@esbuild/win32-ia32": 0.19.2 972 | "@esbuild/win32-x64": 0.19.2 973 | dev: true 974 | 975 | /escalade@3.1.1: 976 | resolution: 977 | { 978 | integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==, 979 | } 980 | engines: { node: ">=6" } 981 | dev: true 982 | 983 | /escape-string-regexp@1.0.5: 984 | resolution: 985 | { 986 | integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==, 987 | } 988 | engines: { node: ">=0.8.0" } 989 | dev: true 990 | 991 | /escape-string-regexp@5.0.0: 992 | resolution: 993 | { 994 | integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==, 995 | } 996 | engines: { node: ">=12" } 997 | dev: true 998 | 999 | /fast-glob@3.3.1: 1000 | resolution: 1001 | { 1002 | integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==, 1003 | } 1004 | engines: { node: ">=8.6.0" } 1005 | dependencies: 1006 | "@nodelib/fs.stat": 2.0.5 1007 | "@nodelib/fs.walk": 1.2.8 1008 | glob-parent: 5.1.2 1009 | merge2: 1.4.1 1010 | micromatch: 4.0.5 1011 | dev: true 1012 | 1013 | /fastparse@1.1.2: 1014 | resolution: 1015 | { 1016 | integrity: sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==, 1017 | } 1018 | dev: true 1019 | 1020 | /fastq@1.15.0: 1021 | resolution: 1022 | { 1023 | integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==, 1024 | } 1025 | dependencies: 1026 | reusify: 1.0.4 1027 | dev: true 1028 | 1029 | /fill-range@7.0.1: 1030 | resolution: 1031 | { 1032 | integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==, 1033 | } 1034 | engines: { node: ">=8" } 1035 | dependencies: 1036 | to-regex-range: 5.0.1 1037 | dev: true 1038 | 1039 | /find-up@4.1.0: 1040 | resolution: 1041 | { 1042 | integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==, 1043 | } 1044 | engines: { node: ">=8" } 1045 | dependencies: 1046 | locate-path: 5.0.0 1047 | path-exists: 4.0.0 1048 | dev: true 1049 | 1050 | /find-up@6.3.0: 1051 | resolution: 1052 | { 1053 | integrity: sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==, 1054 | } 1055 | engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } 1056 | dependencies: 1057 | locate-path: 7.2.0 1058 | path-exists: 5.0.0 1059 | dev: true 1060 | 1061 | /fs.realpath@1.0.0: 1062 | resolution: 1063 | { 1064 | integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==, 1065 | } 1066 | dev: true 1067 | 1068 | /fsevents@2.3.3: 1069 | resolution: 1070 | { 1071 | integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==, 1072 | } 1073 | engines: { node: ^8.16.0 || ^10.6.0 || >=11.0.0 } 1074 | os: [darwin] 1075 | requiresBuild: true 1076 | dev: true 1077 | optional: true 1078 | 1079 | /generic-names@4.0.0: 1080 | resolution: 1081 | { 1082 | integrity: sha512-ySFolZQfw9FoDb3ed9d80Cm9f0+r7qj+HJkWjeD9RBfpxEVTlVhol+gvaQB/78WbwYfbnNh8nWHHBSlg072y6A==, 1083 | } 1084 | dependencies: 1085 | loader-utils: 3.2.1 1086 | dev: true 1087 | 1088 | /get-caller-file@2.0.5: 1089 | resolution: 1090 | { 1091 | integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==, 1092 | } 1093 | engines: { node: 6.* || 8.* || >= 10.* } 1094 | dev: true 1095 | 1096 | /glob-parent@5.1.2: 1097 | resolution: 1098 | { 1099 | integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==, 1100 | } 1101 | engines: { node: ">= 6" } 1102 | dependencies: 1103 | is-glob: 4.0.3 1104 | dev: true 1105 | 1106 | /glob@7.2.3: 1107 | resolution: 1108 | { 1109 | integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==, 1110 | } 1111 | dependencies: 1112 | fs.realpath: 1.0.0 1113 | inflight: 1.0.6 1114 | inherits: 2.0.4 1115 | minimatch: 3.1.2 1116 | once: 1.4.0 1117 | path-is-absolute: 1.0.1 1118 | dev: true 1119 | 1120 | /globby@13.2.2: 1121 | resolution: 1122 | { 1123 | integrity: sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==, 1124 | } 1125 | engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } 1126 | dependencies: 1127 | dir-glob: 3.0.1 1128 | fast-glob: 3.3.1 1129 | ignore: 5.2.4 1130 | merge2: 1.4.1 1131 | slash: 4.0.0 1132 | dev: true 1133 | 1134 | /graceful-fs@4.2.11: 1135 | resolution: 1136 | { 1137 | integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==, 1138 | } 1139 | dev: true 1140 | 1141 | /has-ansi@2.0.0: 1142 | resolution: 1143 | { 1144 | integrity: sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==, 1145 | } 1146 | engines: { node: ">=0.10.0" } 1147 | dependencies: 1148 | ansi-regex: 2.1.1 1149 | dev: true 1150 | 1151 | /has-flag@1.0.0: 1152 | resolution: 1153 | { 1154 | integrity: sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==, 1155 | } 1156 | engines: { node: ">=0.10.0" } 1157 | dev: true 1158 | 1159 | /has-flag@4.0.0: 1160 | resolution: 1161 | { 1162 | integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==, 1163 | } 1164 | engines: { node: ">=8" } 1165 | dev: true 1166 | 1167 | /hex-rgb@5.0.0: 1168 | resolution: 1169 | { 1170 | integrity: sha512-NQO+lgVUCtHxZ792FodgW0zflK+ozS9X9dwGp9XvvmPlH7pyxd588cn24TD3rmPm/N0AIRXF10Otah8yKqGw4w==, 1171 | } 1172 | engines: { node: ">=12" } 1173 | dev: false 1174 | 1175 | /icss-replace-symbols@1.1.0: 1176 | resolution: 1177 | { 1178 | integrity: sha512-chIaY3Vh2mh2Q3RGXttaDIzeiPvaVXJ+C4DAh/w3c37SKZ/U6PGMmuicR2EQQp9bKG8zLMCl7I+PtIoOOPp8Gg==, 1179 | } 1180 | dev: true 1181 | 1182 | /icss-utils@5.1.0(postcss@8.4.29): 1183 | resolution: 1184 | { 1185 | integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==, 1186 | } 1187 | engines: { node: ^10 || ^12 || >= 14 } 1188 | peerDependencies: 1189 | postcss: ^8.1.0 1190 | dependencies: 1191 | postcss: 8.4.29 1192 | dev: true 1193 | 1194 | /ignore@5.2.4: 1195 | resolution: 1196 | { 1197 | integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==, 1198 | } 1199 | engines: { node: ">= 4" } 1200 | dev: true 1201 | 1202 | /import-fresh@3.3.0: 1203 | resolution: 1204 | { 1205 | integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==, 1206 | } 1207 | engines: { node: ">=6" } 1208 | dependencies: 1209 | parent-module: 1.0.1 1210 | resolve-from: 4.0.0 1211 | dev: true 1212 | 1213 | /indent-string@5.0.0: 1214 | resolution: 1215 | { 1216 | integrity: sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==, 1217 | } 1218 | engines: { node: ">=12" } 1219 | dev: true 1220 | 1221 | /inflight@1.0.6: 1222 | resolution: 1223 | { 1224 | integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==, 1225 | } 1226 | dependencies: 1227 | once: 1.4.0 1228 | wrappy: 1.0.2 1229 | dev: true 1230 | 1231 | /inherits@2.0.4: 1232 | resolution: 1233 | { 1234 | integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==, 1235 | } 1236 | dev: true 1237 | 1238 | /is-binary-path@2.1.0: 1239 | resolution: 1240 | { 1241 | integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==, 1242 | } 1243 | engines: { node: ">=8" } 1244 | dependencies: 1245 | binary-extensions: 2.2.0 1246 | dev: true 1247 | 1248 | /is-extglob@2.1.1: 1249 | resolution: 1250 | { 1251 | integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==, 1252 | } 1253 | engines: { node: ">=0.10.0" } 1254 | dev: true 1255 | 1256 | /is-fullwidth-code-point@3.0.0: 1257 | resolution: 1258 | { 1259 | integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==, 1260 | } 1261 | engines: { node: ">=8" } 1262 | dev: true 1263 | 1264 | /is-glob@4.0.3: 1265 | resolution: 1266 | { 1267 | integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==, 1268 | } 1269 | engines: { node: ">=0.10.0" } 1270 | dependencies: 1271 | is-extglob: 2.1.1 1272 | dev: true 1273 | 1274 | /is-number@7.0.0: 1275 | resolution: 1276 | { 1277 | integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==, 1278 | } 1279 | engines: { node: ">=0.12.0" } 1280 | dev: true 1281 | 1282 | /is-stream@2.0.1: 1283 | resolution: 1284 | { 1285 | integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==, 1286 | } 1287 | engines: { node: ">=8" } 1288 | dev: true 1289 | 1290 | /is-stream@3.0.0: 1291 | resolution: 1292 | { 1293 | integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==, 1294 | } 1295 | engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } 1296 | dev: true 1297 | 1298 | /is-there@4.5.1: 1299 | resolution: 1300 | { 1301 | integrity: sha512-vIZ7HTXAoRoIwYSsTnxb0sg9L6rth+JOulNcavsbskQkCIWoSM2cjFOWZs4wGziGZER+Xgs/HXiCQZgiL8ppxQ==, 1302 | } 1303 | dev: true 1304 | 1305 | /kleur@4.1.5: 1306 | resolution: 1307 | { 1308 | integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==, 1309 | } 1310 | engines: { node: ">=6" } 1311 | dev: true 1312 | 1313 | /lilconfig@2.1.0: 1314 | resolution: 1315 | { 1316 | integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==, 1317 | } 1318 | engines: { node: ">=10" } 1319 | dev: true 1320 | 1321 | /loader-utils@3.2.1: 1322 | resolution: 1323 | { 1324 | integrity: sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==, 1325 | } 1326 | engines: { node: ">= 12.13.0" } 1327 | dev: true 1328 | 1329 | /locate-path@5.0.0: 1330 | resolution: 1331 | { 1332 | integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==, 1333 | } 1334 | engines: { node: ">=8" } 1335 | dependencies: 1336 | p-locate: 4.1.0 1337 | dev: true 1338 | 1339 | /locate-path@7.2.0: 1340 | resolution: 1341 | { 1342 | integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==, 1343 | } 1344 | engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } 1345 | dependencies: 1346 | p-locate: 6.0.0 1347 | dev: true 1348 | 1349 | /lodash.camelcase@4.3.0: 1350 | resolution: 1351 | { 1352 | integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==, 1353 | } 1354 | dev: true 1355 | 1356 | /lodash.memoize@4.1.2: 1357 | resolution: 1358 | { 1359 | integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==, 1360 | } 1361 | dev: true 1362 | 1363 | /lodash.uniq@4.5.0: 1364 | resolution: 1365 | { 1366 | integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==, 1367 | } 1368 | dev: true 1369 | 1370 | /mdn-data@2.0.28: 1371 | resolution: 1372 | { 1373 | integrity: sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==, 1374 | } 1375 | dev: true 1376 | 1377 | /mdn-data@2.0.30: 1378 | resolution: 1379 | { 1380 | integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==, 1381 | } 1382 | dev: true 1383 | 1384 | /merge2@1.4.1: 1385 | resolution: 1386 | { 1387 | integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==, 1388 | } 1389 | engines: { node: ">= 8" } 1390 | dev: true 1391 | 1392 | /micromatch@4.0.5: 1393 | resolution: 1394 | { 1395 | integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==, 1396 | } 1397 | engines: { node: ">=8.6" } 1398 | dependencies: 1399 | braces: 3.0.2 1400 | picomatch: 2.3.1 1401 | dev: true 1402 | 1403 | /minimatch@3.1.2: 1404 | resolution: 1405 | { 1406 | integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==, 1407 | } 1408 | dependencies: 1409 | brace-expansion: 1.1.11 1410 | dev: true 1411 | 1412 | /mkdirp@1.0.4: 1413 | resolution: 1414 | { 1415 | integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==, 1416 | } 1417 | engines: { node: ">=10" } 1418 | hasBin: true 1419 | dev: true 1420 | 1421 | /mri@1.2.0: 1422 | resolution: 1423 | { 1424 | integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==, 1425 | } 1426 | engines: { node: ">=4" } 1427 | dev: true 1428 | 1429 | /nanoid@3.3.6: 1430 | resolution: 1431 | { 1432 | integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==, 1433 | } 1434 | engines: { node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1 } 1435 | hasBin: true 1436 | dev: true 1437 | 1438 | /natural-compare-lite@1.4.0: 1439 | resolution: 1440 | { 1441 | integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==, 1442 | } 1443 | dev: false 1444 | 1445 | /node-releases@2.0.13: 1446 | resolution: 1447 | { 1448 | integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==, 1449 | } 1450 | dev: true 1451 | 1452 | /normalize-path@3.0.0: 1453 | resolution: 1454 | { 1455 | integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==, 1456 | } 1457 | engines: { node: ">=0.10.0" } 1458 | dev: true 1459 | 1460 | /nth-check@2.1.1: 1461 | resolution: 1462 | { 1463 | integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==, 1464 | } 1465 | dependencies: 1466 | boolbase: 1.0.0 1467 | dev: true 1468 | 1469 | /once@1.4.0: 1470 | resolution: 1471 | { 1472 | integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==, 1473 | } 1474 | dependencies: 1475 | wrappy: 1.0.2 1476 | dev: true 1477 | 1478 | /p-limit@2.3.0: 1479 | resolution: 1480 | { 1481 | integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==, 1482 | } 1483 | engines: { node: ">=6" } 1484 | dependencies: 1485 | p-try: 2.2.0 1486 | dev: true 1487 | 1488 | /p-limit@4.0.0: 1489 | resolution: 1490 | { 1491 | integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==, 1492 | } 1493 | engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } 1494 | dependencies: 1495 | yocto-queue: 1.0.0 1496 | dev: true 1497 | 1498 | /p-locate@4.1.0: 1499 | resolution: 1500 | { 1501 | integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==, 1502 | } 1503 | engines: { node: ">=8" } 1504 | dependencies: 1505 | p-limit: 2.3.0 1506 | dev: true 1507 | 1508 | /p-locate@6.0.0: 1509 | resolution: 1510 | { 1511 | integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==, 1512 | } 1513 | engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } 1514 | dependencies: 1515 | p-limit: 4.0.0 1516 | dev: true 1517 | 1518 | /p-try@2.2.0: 1519 | resolution: 1520 | { 1521 | integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==, 1522 | } 1523 | engines: { node: ">=6" } 1524 | dev: true 1525 | 1526 | /parent-module@1.0.1: 1527 | resolution: 1528 | { 1529 | integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==, 1530 | } 1531 | engines: { node: ">=6" } 1532 | dependencies: 1533 | callsites: 3.1.0 1534 | dev: true 1535 | 1536 | /path-exists@4.0.0: 1537 | resolution: 1538 | { 1539 | integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==, 1540 | } 1541 | engines: { node: ">=8" } 1542 | dev: true 1543 | 1544 | /path-exists@5.0.0: 1545 | resolution: 1546 | { 1547 | integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==, 1548 | } 1549 | engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } 1550 | dev: true 1551 | 1552 | /path-is-absolute@1.0.1: 1553 | resolution: 1554 | { 1555 | integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==, 1556 | } 1557 | engines: { node: ">=0.10.0" } 1558 | dev: true 1559 | 1560 | /path-type@4.0.0: 1561 | resolution: 1562 | { 1563 | integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==, 1564 | } 1565 | engines: { node: ">=8" } 1566 | dev: true 1567 | 1568 | /picocolors@0.2.1: 1569 | resolution: 1570 | { 1571 | integrity: sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==, 1572 | } 1573 | dev: true 1574 | 1575 | /picocolors@1.0.0: 1576 | resolution: 1577 | { 1578 | integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==, 1579 | } 1580 | dev: true 1581 | 1582 | /picomatch@2.3.1: 1583 | resolution: 1584 | { 1585 | integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==, 1586 | } 1587 | engines: { node: ">=8.6" } 1588 | dev: true 1589 | 1590 | /postcss-calc@9.0.1(postcss@8.4.29): 1591 | resolution: 1592 | { 1593 | integrity: sha512-TipgjGyzP5QzEhsOZUaIkeO5mKeMFpebWzRogWG/ysonUlnHcq5aJe0jOjpfzUU8PeSaBQnrE8ehR0QA5vs8PQ==, 1594 | } 1595 | engines: { node: ^14 || ^16 || >=18.0 } 1596 | peerDependencies: 1597 | postcss: ^8.2.2 1598 | dependencies: 1599 | postcss: 8.4.29 1600 | postcss-selector-parser: 6.0.13 1601 | postcss-value-parser: 4.2.0 1602 | dev: true 1603 | 1604 | /postcss-colormin@6.0.0(postcss@8.4.29): 1605 | resolution: 1606 | { 1607 | integrity: sha512-EuO+bAUmutWoZYgHn2T1dG1pPqHU6L4TjzPlu4t1wZGXQ/fxV16xg2EJmYi0z+6r+MGV1yvpx1BHkUaRrPa2bw==, 1608 | } 1609 | engines: { node: ^14 || ^16 || >=18.0 } 1610 | peerDependencies: 1611 | postcss: ^8.2.15 1612 | dependencies: 1613 | browserslist: 4.21.10 1614 | caniuse-api: 3.0.0 1615 | colord: 2.9.3 1616 | postcss: 8.4.29 1617 | postcss-value-parser: 4.2.0 1618 | dev: true 1619 | 1620 | /postcss-convert-values@6.0.0(postcss@8.4.29): 1621 | resolution: 1622 | { 1623 | integrity: sha512-U5D8QhVwqT++ecmy8rnTb+RL9n/B806UVaS3m60lqle4YDFcpbS3ae5bTQIh3wOGUSDHSEtMYLs/38dNG7EYFw==, 1624 | } 1625 | engines: { node: ^14 || ^16 || >=18.0 } 1626 | peerDependencies: 1627 | postcss: ^8.2.15 1628 | dependencies: 1629 | browserslist: 4.21.10 1630 | postcss: 8.4.29 1631 | postcss-value-parser: 4.2.0 1632 | dev: true 1633 | 1634 | /postcss-discard-comments@6.0.0(postcss@8.4.29): 1635 | resolution: 1636 | { 1637 | integrity: sha512-p2skSGqzPMZkEQvJsgnkBhCn8gI7NzRH2683EEjrIkoMiwRELx68yoUJ3q3DGSGuQ8Ug9Gsn+OuDr46yfO+eFw==, 1638 | } 1639 | engines: { node: ^14 || ^16 || >=18.0 } 1640 | peerDependencies: 1641 | postcss: ^8.2.15 1642 | dependencies: 1643 | postcss: 8.4.29 1644 | dev: true 1645 | 1646 | /postcss-discard-duplicates@6.0.0(postcss@8.4.29): 1647 | resolution: 1648 | { 1649 | integrity: sha512-bU1SXIizMLtDW4oSsi5C/xHKbhLlhek/0/yCnoMQany9k3nPBq+Ctsv/9oMmyqbR96HYHxZcHyK2HR5P/mqoGA==, 1650 | } 1651 | engines: { node: ^14 || ^16 || >=18.0 } 1652 | peerDependencies: 1653 | postcss: ^8.2.15 1654 | dependencies: 1655 | postcss: 8.4.29 1656 | dev: true 1657 | 1658 | /postcss-discard-empty@6.0.0(postcss@8.4.29): 1659 | resolution: 1660 | { 1661 | integrity: sha512-b+h1S1VT6dNhpcg+LpyiUrdnEZfICF0my7HAKgJixJLW7BnNmpRH34+uw/etf5AhOlIhIAuXApSzzDzMI9K/gQ==, 1662 | } 1663 | engines: { node: ^14 || ^16 || >=18.0 } 1664 | peerDependencies: 1665 | postcss: ^8.2.15 1666 | dependencies: 1667 | postcss: 8.4.29 1668 | dev: true 1669 | 1670 | /postcss-discard-overridden@6.0.0(postcss@8.4.29): 1671 | resolution: 1672 | { 1673 | integrity: sha512-4VELwssYXDFigPYAZ8vL4yX4mUepF/oCBeeIT4OXsJPYOtvJumyz9WflmJWTfDwCUcpDR+z0zvCWBXgTx35SVw==, 1674 | } 1675 | engines: { node: ^14 || ^16 || >=18.0 } 1676 | peerDependencies: 1677 | postcss: ^8.2.15 1678 | dependencies: 1679 | postcss: 8.4.29 1680 | dev: true 1681 | 1682 | /postcss-merge-longhand@6.0.0(postcss@8.4.29): 1683 | resolution: 1684 | { 1685 | integrity: sha512-4VSfd1lvGkLTLYcxFuISDtWUfFS4zXe0FpF149AyziftPFQIWxjvFSKhA4MIxMe4XM3yTDgQMbSNgzIVxChbIg==, 1686 | } 1687 | engines: { node: ^14 || ^16 || >=18.0 } 1688 | peerDependencies: 1689 | postcss: ^8.2.15 1690 | dependencies: 1691 | postcss: 8.4.29 1692 | postcss-value-parser: 4.2.0 1693 | stylehacks: 6.0.0(postcss@8.4.29) 1694 | dev: true 1695 | 1696 | /postcss-merge-rules@6.0.1(postcss@8.4.29): 1697 | resolution: 1698 | { 1699 | integrity: sha512-a4tlmJIQo9SCjcfiCcCMg/ZCEe0XTkl/xK0XHBs955GWg9xDX3NwP9pwZ78QUOWB8/0XCjZeJn98Dae0zg6AAw==, 1700 | } 1701 | engines: { node: ^14 || ^16 || >=18.0 } 1702 | peerDependencies: 1703 | postcss: ^8.2.15 1704 | dependencies: 1705 | browserslist: 4.21.10 1706 | caniuse-api: 3.0.0 1707 | cssnano-utils: 4.0.0(postcss@8.4.29) 1708 | postcss: 8.4.29 1709 | postcss-selector-parser: 6.0.13 1710 | dev: true 1711 | 1712 | /postcss-minify-font-values@6.0.0(postcss@8.4.29): 1713 | resolution: 1714 | { 1715 | integrity: sha512-zNRAVtyh5E8ndZEYXA4WS8ZYsAp798HiIQ1V2UF/C/munLp2r1UGHwf1+6JFu7hdEhJFN+W1WJQKBrtjhFgEnA==, 1716 | } 1717 | engines: { node: ^14 || ^16 || >=18.0 } 1718 | peerDependencies: 1719 | postcss: ^8.2.15 1720 | dependencies: 1721 | postcss: 8.4.29 1722 | postcss-value-parser: 4.2.0 1723 | dev: true 1724 | 1725 | /postcss-minify-gradients@6.0.0(postcss@8.4.29): 1726 | resolution: 1727 | { 1728 | integrity: sha512-wO0F6YfVAR+K1xVxF53ueZJza3L+R3E6cp0VwuXJQejnNUH0DjcAFe3JEBeTY1dLwGa0NlDWueCA1VlEfiKgAA==, 1729 | } 1730 | engines: { node: ^14 || ^16 || >=18.0 } 1731 | peerDependencies: 1732 | postcss: ^8.2.15 1733 | dependencies: 1734 | colord: 2.9.3 1735 | cssnano-utils: 4.0.0(postcss@8.4.29) 1736 | postcss: 8.4.29 1737 | postcss-value-parser: 4.2.0 1738 | dev: true 1739 | 1740 | /postcss-minify-params@6.0.0(postcss@8.4.29): 1741 | resolution: 1742 | { 1743 | integrity: sha512-Fz/wMQDveiS0n5JPcvsMeyNXOIMrwF88n7196puSuQSWSa+/Ofc1gDOSY2xi8+A4PqB5dlYCKk/WfqKqsI+ReQ==, 1744 | } 1745 | engines: { node: ^14 || ^16 || >=18.0 } 1746 | peerDependencies: 1747 | postcss: ^8.2.15 1748 | dependencies: 1749 | browserslist: 4.21.10 1750 | cssnano-utils: 4.0.0(postcss@8.4.29) 1751 | postcss: 8.4.29 1752 | postcss-value-parser: 4.2.0 1753 | dev: true 1754 | 1755 | /postcss-minify-selectors@6.0.0(postcss@8.4.29): 1756 | resolution: 1757 | { 1758 | integrity: sha512-ec/q9JNCOC2CRDNnypipGfOhbYPuUkewGwLnbv6omue/PSASbHSU7s6uSQ0tcFRVv731oMIx8k0SP4ZX6be/0g==, 1759 | } 1760 | engines: { node: ^14 || ^16 || >=18.0 } 1761 | peerDependencies: 1762 | postcss: ^8.2.15 1763 | dependencies: 1764 | postcss: 8.4.29 1765 | postcss-selector-parser: 6.0.13 1766 | dev: true 1767 | 1768 | /postcss-modules-extract-imports@1.1.0: 1769 | resolution: 1770 | { 1771 | integrity: sha512-zF9+UIEvtpeqMGxhpeT9XaIevQSrBBCz9fi7SwfkmjVacsSj8DY5eFVgn+wY8I9vvdDDwK5xC8Myq4UkoLFIkA==, 1772 | } 1773 | dependencies: 1774 | postcss: 6.0.1 1775 | dev: true 1776 | 1777 | /postcss-modules-extract-imports@3.0.0(postcss@8.4.29): 1778 | resolution: 1779 | { 1780 | integrity: sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==, 1781 | } 1782 | engines: { node: ^10 || ^12 || >= 14 } 1783 | peerDependencies: 1784 | postcss: ^8.1.0 1785 | dependencies: 1786 | postcss: 8.4.29 1787 | dev: true 1788 | 1789 | /postcss-modules-local-by-default@1.2.0: 1790 | resolution: 1791 | { 1792 | integrity: sha512-X4cquUPIaAd86raVrBwO8fwRfkIdbwFu7CTfEOjiZQHVQwlHRSkTgH5NLDmMm5+1hQO8u6dZ+TOOJDbay1hYpA==, 1793 | } 1794 | dependencies: 1795 | css-selector-tokenizer: 0.7.3 1796 | postcss: 6.0.1 1797 | dev: true 1798 | 1799 | /postcss-modules-local-by-default@4.0.3(postcss@8.4.29): 1800 | resolution: 1801 | { 1802 | integrity: sha512-2/u2zraspoACtrbFRnTijMiQtb4GW4BvatjaG/bCjYQo8kLTdevCUlwuBHx2sCnSyrI3x3qj4ZK1j5LQBgzmwA==, 1803 | } 1804 | engines: { node: ^10 || ^12 || >= 14 } 1805 | peerDependencies: 1806 | postcss: ^8.1.0 1807 | dependencies: 1808 | icss-utils: 5.1.0(postcss@8.4.29) 1809 | postcss: 8.4.29 1810 | postcss-selector-parser: 6.0.13 1811 | postcss-value-parser: 4.2.0 1812 | dev: true 1813 | 1814 | /postcss-modules-scope@1.1.0: 1815 | resolution: 1816 | { 1817 | integrity: sha512-LTYwnA4C1He1BKZXIx1CYiHixdSe9LWYVKadq9lK5aCCMkoOkFyZ7aigt+srfjlRplJY3gIol6KUNefdMQJdlw==, 1818 | } 1819 | dependencies: 1820 | css-selector-tokenizer: 0.7.3 1821 | postcss: 6.0.1 1822 | dev: true 1823 | 1824 | /postcss-modules-scope@3.0.0(postcss@8.4.29): 1825 | resolution: 1826 | { 1827 | integrity: sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==, 1828 | } 1829 | engines: { node: ^10 || ^12 || >= 14 } 1830 | peerDependencies: 1831 | postcss: ^8.1.0 1832 | dependencies: 1833 | postcss: 8.4.29 1834 | postcss-selector-parser: 6.0.13 1835 | dev: true 1836 | 1837 | /postcss-modules-values@1.3.0: 1838 | resolution: 1839 | { 1840 | integrity: sha512-i7IFaR9hlQ6/0UgFuqM6YWaCfA1Ej8WMg8A5DggnH1UGKJvTV/ugqq/KaULixzzOi3T/tF6ClBXcHGCzdd5unA==, 1841 | } 1842 | dependencies: 1843 | icss-replace-symbols: 1.1.0 1844 | postcss: 6.0.1 1845 | dev: true 1846 | 1847 | /postcss-modules-values@4.0.0(postcss@8.4.29): 1848 | resolution: 1849 | { 1850 | integrity: sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==, 1851 | } 1852 | engines: { node: ^10 || ^12 || >= 14 } 1853 | peerDependencies: 1854 | postcss: ^8.1.0 1855 | dependencies: 1856 | icss-utils: 5.1.0(postcss@8.4.29) 1857 | postcss: 8.4.29 1858 | dev: true 1859 | 1860 | /postcss-modules@6.0.0(postcss@8.4.29): 1861 | resolution: 1862 | { 1863 | integrity: sha512-7DGfnlyi/ju82BRzTIjWS5C4Tafmzl3R79YP/PASiocj+aa6yYphHhhKUOEoXQToId5rgyFgJ88+ccOUydjBXQ==, 1864 | } 1865 | peerDependencies: 1866 | postcss: ^8.0.0 1867 | dependencies: 1868 | generic-names: 4.0.0 1869 | icss-utils: 5.1.0(postcss@8.4.29) 1870 | lodash.camelcase: 4.3.0 1871 | postcss: 8.4.29 1872 | postcss-modules-extract-imports: 3.0.0(postcss@8.4.29) 1873 | postcss-modules-local-by-default: 4.0.3(postcss@8.4.29) 1874 | postcss-modules-scope: 3.0.0(postcss@8.4.29) 1875 | postcss-modules-values: 4.0.0(postcss@8.4.29) 1876 | string-hash: 1.1.3 1877 | dev: true 1878 | 1879 | /postcss-normalize-charset@6.0.0(postcss@8.4.29): 1880 | resolution: 1881 | { 1882 | integrity: sha512-cqundwChbu8yO/gSWkuFDmKrCZ2vJzDAocheT2JTd0sFNA4HMGoKMfbk2B+J0OmO0t5GUkiAkSM5yF2rSLUjgQ==, 1883 | } 1884 | engines: { node: ^14 || ^16 || >=18.0 } 1885 | peerDependencies: 1886 | postcss: ^8.2.15 1887 | dependencies: 1888 | postcss: 8.4.29 1889 | dev: true 1890 | 1891 | /postcss-normalize-display-values@6.0.0(postcss@8.4.29): 1892 | resolution: 1893 | { 1894 | integrity: sha512-Qyt5kMrvy7dJRO3OjF7zkotGfuYALETZE+4lk66sziWSPzlBEt7FrUshV6VLECkI4EN8Z863O6Nci4NXQGNzYw==, 1895 | } 1896 | engines: { node: ^14 || ^16 || >=18.0 } 1897 | peerDependencies: 1898 | postcss: ^8.2.15 1899 | dependencies: 1900 | postcss: 8.4.29 1901 | postcss-value-parser: 4.2.0 1902 | dev: true 1903 | 1904 | /postcss-normalize-positions@6.0.0(postcss@8.4.29): 1905 | resolution: 1906 | { 1907 | integrity: sha512-mPCzhSV8+30FZyWhxi6UoVRYd3ZBJgTRly4hOkaSifo0H+pjDYcii/aVT4YE6QpOil15a5uiv6ftnY3rm0igPg==, 1908 | } 1909 | engines: { node: ^14 || ^16 || >=18.0 } 1910 | peerDependencies: 1911 | postcss: ^8.2.15 1912 | dependencies: 1913 | postcss: 8.4.29 1914 | postcss-value-parser: 4.2.0 1915 | dev: true 1916 | 1917 | /postcss-normalize-repeat-style@6.0.0(postcss@8.4.29): 1918 | resolution: 1919 | { 1920 | integrity: sha512-50W5JWEBiOOAez2AKBh4kRFm2uhrT3O1Uwdxz7k24aKtbD83vqmcVG7zoIwo6xI2FZ/HDlbrCopXhLeTpQib1A==, 1921 | } 1922 | engines: { node: ^14 || ^16 || >=18.0 } 1923 | peerDependencies: 1924 | postcss: ^8.2.15 1925 | dependencies: 1926 | postcss: 8.4.29 1927 | postcss-value-parser: 4.2.0 1928 | dev: true 1929 | 1930 | /postcss-normalize-string@6.0.0(postcss@8.4.29): 1931 | resolution: 1932 | { 1933 | integrity: sha512-KWkIB7TrPOiqb8ZZz6homet2KWKJwIlysF5ICPZrXAylGe2hzX/HSf4NTX2rRPJMAtlRsj/yfkrWGavFuB+c0w==, 1934 | } 1935 | engines: { node: ^14 || ^16 || >=18.0 } 1936 | peerDependencies: 1937 | postcss: ^8.2.15 1938 | dependencies: 1939 | postcss: 8.4.29 1940 | postcss-value-parser: 4.2.0 1941 | dev: true 1942 | 1943 | /postcss-normalize-timing-functions@6.0.0(postcss@8.4.29): 1944 | resolution: 1945 | { 1946 | integrity: sha512-tpIXWciXBp5CiFs8sem90IWlw76FV4oi6QEWfQwyeREVwUy39VSeSqjAT7X0Qw650yAimYW5gkl2Gd871N5SQg==, 1947 | } 1948 | engines: { node: ^14 || ^16 || >=18.0 } 1949 | peerDependencies: 1950 | postcss: ^8.2.15 1951 | dependencies: 1952 | postcss: 8.4.29 1953 | postcss-value-parser: 4.2.0 1954 | dev: true 1955 | 1956 | /postcss-normalize-unicode@6.0.0(postcss@8.4.29): 1957 | resolution: 1958 | { 1959 | integrity: sha512-ui5crYkb5ubEUDugDc786L/Me+DXp2dLg3fVJbqyAl0VPkAeALyAijF2zOsnZyaS1HyfPuMH0DwyY18VMFVNkg==, 1960 | } 1961 | engines: { node: ^14 || ^16 || >=18.0 } 1962 | peerDependencies: 1963 | postcss: ^8.2.15 1964 | dependencies: 1965 | browserslist: 4.21.10 1966 | postcss: 8.4.29 1967 | postcss-value-parser: 4.2.0 1968 | dev: true 1969 | 1970 | /postcss-normalize-url@6.0.0(postcss@8.4.29): 1971 | resolution: 1972 | { 1973 | integrity: sha512-98mvh2QzIPbb02YDIrYvAg4OUzGH7s1ZgHlD3fIdTHLgPLRpv1ZTKJDnSAKr4Rt21ZQFzwhGMXxpXlfrUBKFHw==, 1974 | } 1975 | engines: { node: ^14 || ^16 || >=18.0 } 1976 | peerDependencies: 1977 | postcss: ^8.2.15 1978 | dependencies: 1979 | postcss: 8.4.29 1980 | postcss-value-parser: 4.2.0 1981 | dev: true 1982 | 1983 | /postcss-normalize-whitespace@6.0.0(postcss@8.4.29): 1984 | resolution: 1985 | { 1986 | integrity: sha512-7cfE1AyLiK0+ZBG6FmLziJzqQCpTQY+8XjMhMAz8WSBSCsCNNUKujgIgjCAmDT3cJ+3zjTXFkoD15ZPsckArVw==, 1987 | } 1988 | engines: { node: ^14 || ^16 || >=18.0 } 1989 | peerDependencies: 1990 | postcss: ^8.2.15 1991 | dependencies: 1992 | postcss: 8.4.29 1993 | postcss-value-parser: 4.2.0 1994 | dev: true 1995 | 1996 | /postcss-ordered-values@6.0.0(postcss@8.4.29): 1997 | resolution: 1998 | { 1999 | integrity: sha512-K36XzUDpvfG/nWkjs6d1hRBydeIxGpKS2+n+ywlKPzx1nMYDYpoGbcjhj5AwVYJK1qV2/SDoDEnHzlPD6s3nMg==, 2000 | } 2001 | engines: { node: ^14 || ^16 || >=18.0 } 2002 | peerDependencies: 2003 | postcss: ^8.2.15 2004 | dependencies: 2005 | cssnano-utils: 4.0.0(postcss@8.4.29) 2006 | postcss: 8.4.29 2007 | postcss-value-parser: 4.2.0 2008 | dev: true 2009 | 2010 | /postcss-reduce-initial@6.0.0(postcss@8.4.29): 2011 | resolution: 2012 | { 2013 | integrity: sha512-s2UOnidpVuXu6JiiI5U+fV2jamAw5YNA9Fdi/GRK0zLDLCfXmSGqQtzpUPtfN66RtCbb9fFHoyZdQaxOB3WxVA==, 2014 | } 2015 | engines: { node: ^14 || ^16 || >=18.0 } 2016 | peerDependencies: 2017 | postcss: ^8.2.15 2018 | dependencies: 2019 | browserslist: 4.21.10 2020 | caniuse-api: 3.0.0 2021 | postcss: 8.4.29 2022 | dev: true 2023 | 2024 | /postcss-reduce-transforms@6.0.0(postcss@8.4.29): 2025 | resolution: 2026 | { 2027 | integrity: sha512-FQ9f6xM1homnuy1wLe9lP1wujzxnwt1EwiigtWwuyf8FsqqXUDUp2Ulxf9A5yjlUOTdCJO6lonYjg1mgqIIi2w==, 2028 | } 2029 | engines: { node: ^14 || ^16 || >=18.0 } 2030 | peerDependencies: 2031 | postcss: ^8.2.15 2032 | dependencies: 2033 | postcss: 8.4.29 2034 | postcss-value-parser: 4.2.0 2035 | dev: true 2036 | 2037 | /postcss-selector-parser@6.0.13: 2038 | resolution: 2039 | { 2040 | integrity: sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==, 2041 | } 2042 | engines: { node: ">=4" } 2043 | dependencies: 2044 | cssesc: 3.0.0 2045 | util-deprecate: 1.0.2 2046 | dev: true 2047 | 2048 | /postcss-svgo@6.0.0(postcss@8.4.29): 2049 | resolution: 2050 | { 2051 | integrity: sha512-r9zvj/wGAoAIodn84dR/kFqwhINp5YsJkLoujybWG59grR/IHx+uQ2Zo+IcOwM0jskfYX3R0mo+1Kip1VSNcvw==, 2052 | } 2053 | engines: { node: ^14 || ^16 || >= 18 } 2054 | peerDependencies: 2055 | postcss: ^8.2.15 2056 | dependencies: 2057 | postcss: 8.4.29 2058 | postcss-value-parser: 4.2.0 2059 | svgo: 3.0.2 2060 | dev: true 2061 | 2062 | /postcss-unique-selectors@6.0.0(postcss@8.4.29): 2063 | resolution: 2064 | { 2065 | integrity: sha512-EPQzpZNxOxP7777t73RQpZE5e9TrnCrkvp7AH7a0l89JmZiPnS82y216JowHXwpBCQitfyxrof9TK3rYbi7/Yw==, 2066 | } 2067 | engines: { node: ^14 || ^16 || >=18.0 } 2068 | peerDependencies: 2069 | postcss: ^8.2.15 2070 | dependencies: 2071 | postcss: 8.4.29 2072 | postcss-selector-parser: 6.0.13 2073 | dev: true 2074 | 2075 | /postcss-value-parser@4.2.0: 2076 | resolution: 2077 | { 2078 | integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==, 2079 | } 2080 | dev: true 2081 | 2082 | /postcss@6.0.1: 2083 | resolution: 2084 | { 2085 | integrity: sha512-VbGX1LQgQbf9l3cZ3qbUuC3hGqIEOGQFHAEHQ/Diaeo0yLgpgK5Rb8J+OcamIfQ9PbAU/fzBjVtQX3AhJHUvZw==, 2086 | } 2087 | engines: { node: ">=4.0.0" } 2088 | dependencies: 2089 | chalk: 1.1.3 2090 | source-map: 0.5.7 2091 | supports-color: 3.2.3 2092 | dev: true 2093 | 2094 | /postcss@7.0.39: 2095 | resolution: 2096 | { 2097 | integrity: sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==, 2098 | } 2099 | engines: { node: ">=6.0.0" } 2100 | dependencies: 2101 | picocolors: 0.2.1 2102 | source-map: 0.6.1 2103 | dev: true 2104 | 2105 | /postcss@8.4.29: 2106 | resolution: 2107 | { 2108 | integrity: sha512-cbI+jaqIeu/VGqXEarWkRCCffhjgXc0qjBtXpqJhTBohMUjUQnbBr0xqX3vEKudc4iviTewcJo5ajcec5+wdJw==, 2109 | } 2110 | engines: { node: ^10 || ^12 || >=14 } 2111 | dependencies: 2112 | nanoid: 3.3.6 2113 | picocolors: 1.0.0 2114 | source-map-js: 1.0.2 2115 | dev: true 2116 | 2117 | /preact@10.17.1: 2118 | resolution: 2119 | { 2120 | integrity: sha512-X9BODrvQ4Ekwv9GURm9AKAGaomqXmip7NQTZgY7gcNmr7XE83adOMJvd3N42id1tMFU7ojiynRsYnY6/BRFxLA==, 2121 | } 2122 | dev: false 2123 | 2124 | /prettier@3.0.3: 2125 | resolution: 2126 | { 2127 | integrity: sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg==, 2128 | } 2129 | engines: { node: ">=14" } 2130 | hasBin: true 2131 | dev: true 2132 | 2133 | /queue-microtask@1.2.3: 2134 | resolution: 2135 | { 2136 | integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==, 2137 | } 2138 | dev: true 2139 | 2140 | /readdirp@3.6.0: 2141 | resolution: 2142 | { 2143 | integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==, 2144 | } 2145 | engines: { node: ">=8.10.0" } 2146 | dependencies: 2147 | picomatch: 2.3.1 2148 | dev: true 2149 | 2150 | /require-directory@2.1.1: 2151 | resolution: 2152 | { 2153 | integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==, 2154 | } 2155 | engines: { node: ">=0.10.0" } 2156 | dev: true 2157 | 2158 | /require-main-filename@2.0.0: 2159 | resolution: 2160 | { 2161 | integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==, 2162 | } 2163 | dev: true 2164 | 2165 | /resolve-from@4.0.0: 2166 | resolution: 2167 | { 2168 | integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==, 2169 | } 2170 | engines: { node: ">=4" } 2171 | dev: true 2172 | 2173 | /reusify@1.0.4: 2174 | resolution: 2175 | { 2176 | integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==, 2177 | } 2178 | engines: { iojs: ">=1.0.0", node: ">=0.10.0" } 2179 | dev: true 2180 | 2181 | /rev-hash@4.0.0: 2182 | resolution: 2183 | { 2184 | integrity: sha512-5w/auZRs65pf1AkZIbfICeorQfOCb6XVWaHmDEbkMyjmyRMxck+W0Erdj9zffuBRXxn5cbKfgmWQ9GpgR8dFZQ==, 2185 | } 2186 | engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } 2187 | dev: true 2188 | 2189 | /rgb-hex@4.0.1: 2190 | resolution: 2191 | { 2192 | integrity: sha512-HcNmN4252k7YgL1tlMatonEAJQlDrc1lt6UPjMO6xFD/DO6gX+NJz4EKRRZ9/I9nYUzVel6zhTJ5y3wdfSgJEQ==, 2193 | } 2194 | engines: { node: ">=12" } 2195 | dev: false 2196 | 2197 | /run-parallel@1.2.0: 2198 | resolution: 2199 | { 2200 | integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==, 2201 | } 2202 | dependencies: 2203 | queue-microtask: 1.2.3 2204 | dev: true 2205 | 2206 | /sade@1.8.1: 2207 | resolution: 2208 | { 2209 | integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==, 2210 | } 2211 | engines: { node: ">=6" } 2212 | dependencies: 2213 | mri: 1.2.0 2214 | dev: true 2215 | 2216 | /set-blocking@2.0.0: 2217 | resolution: 2218 | { 2219 | integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==, 2220 | } 2221 | dev: true 2222 | 2223 | /slash@4.0.0: 2224 | resolution: 2225 | { 2226 | integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==, 2227 | } 2228 | engines: { node: ">=12" } 2229 | dev: true 2230 | 2231 | /source-map-js@1.0.2: 2232 | resolution: 2233 | { 2234 | integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==, 2235 | } 2236 | engines: { node: ">=0.10.0" } 2237 | dev: true 2238 | 2239 | /source-map@0.5.7: 2240 | resolution: 2241 | { 2242 | integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==, 2243 | } 2244 | engines: { node: ">=0.10.0" } 2245 | dev: true 2246 | 2247 | /source-map@0.6.1: 2248 | resolution: 2249 | { 2250 | integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==, 2251 | } 2252 | engines: { node: ">=0.10.0" } 2253 | dev: true 2254 | 2255 | /string-hash@1.1.3: 2256 | resolution: 2257 | { 2258 | integrity: sha512-kJUvRUFK49aub+a7T1nNE66EJbZBMnBgoC1UbCZ5n6bsZKBRga4KgBRTMn/pFkeCZSYtNeSyMxPDM0AXWELk2A==, 2259 | } 2260 | dev: true 2261 | 2262 | /string-width@4.2.3: 2263 | resolution: 2264 | { 2265 | integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==, 2266 | } 2267 | engines: { node: ">=8" } 2268 | dependencies: 2269 | emoji-regex: 8.0.0 2270 | is-fullwidth-code-point: 3.0.0 2271 | strip-ansi: 6.0.1 2272 | dev: true 2273 | 2274 | /strip-ansi@3.0.1: 2275 | resolution: 2276 | { 2277 | integrity: sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==, 2278 | } 2279 | engines: { node: ">=0.10.0" } 2280 | dependencies: 2281 | ansi-regex: 2.1.1 2282 | dev: true 2283 | 2284 | /strip-ansi@6.0.1: 2285 | resolution: 2286 | { 2287 | integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==, 2288 | } 2289 | engines: { node: ">=8" } 2290 | dependencies: 2291 | ansi-regex: 5.0.1 2292 | dev: true 2293 | 2294 | /stylehacks@6.0.0(postcss@8.4.29): 2295 | resolution: 2296 | { 2297 | integrity: sha512-+UT589qhHPwz6mTlCLSt/vMNTJx8dopeJlZAlBMJPWA3ORqu6wmQY7FBXf+qD+FsqoBJODyqNxOUP3jdntFRdw==, 2298 | } 2299 | engines: { node: ^14 || ^16 || >=18.0 } 2300 | peerDependencies: 2301 | postcss: ^8.2.15 2302 | dependencies: 2303 | browserslist: 4.21.10 2304 | postcss: 8.4.29 2305 | postcss-selector-parser: 6.0.13 2306 | dev: true 2307 | 2308 | /supports-color@2.0.0: 2309 | resolution: 2310 | { 2311 | integrity: sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==, 2312 | } 2313 | engines: { node: ">=0.8.0" } 2314 | dev: true 2315 | 2316 | /supports-color@3.2.3: 2317 | resolution: 2318 | { 2319 | integrity: sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==, 2320 | } 2321 | engines: { node: ">=0.8.0" } 2322 | dependencies: 2323 | has-flag: 1.0.0 2324 | dev: true 2325 | 2326 | /supports-color@7.2.0: 2327 | resolution: 2328 | { 2329 | integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==, 2330 | } 2331 | engines: { node: ">=8" } 2332 | dependencies: 2333 | has-flag: 4.0.0 2334 | dev: true 2335 | 2336 | /svgo@3.0.2: 2337 | resolution: 2338 | { 2339 | integrity: sha512-Z706C1U2pb1+JGP48fbazf3KxHrWOsLme6Rv7imFBn5EnuanDW1GPaA/P1/dvObE670JDePC3mnj0k0B7P0jjQ==, 2340 | } 2341 | engines: { node: ">=14.0.0" } 2342 | hasBin: true 2343 | dependencies: 2344 | "@trysound/sax": 0.2.0 2345 | commander: 7.2.0 2346 | css-select: 5.1.0 2347 | css-tree: 2.3.1 2348 | csso: 5.0.5 2349 | picocolors: 1.0.0 2350 | dev: true 2351 | 2352 | /temp-dir@2.0.0: 2353 | resolution: 2354 | { 2355 | integrity: sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==, 2356 | } 2357 | engines: { node: ">=8" } 2358 | dev: true 2359 | 2360 | /temp-dir@3.0.0: 2361 | resolution: 2362 | { 2363 | integrity: sha512-nHc6S/bwIilKHNRgK/3jlhDoIHcp45YgyiwcAk46Tr0LfEqGBVpmiAyuiuxeVE44m3mXnEeVhaipLOEWmH+Njw==, 2364 | } 2365 | engines: { node: ">=14.16" } 2366 | dev: true 2367 | 2368 | /temp-write@5.0.0: 2369 | resolution: 2370 | { 2371 | integrity: sha512-cJhnzBW7DjNox7VcZDXeNlQSkIh3mX/h+M0n0Fh+zgT7YAHwI9c+OngKx4MCiQCVx9iXxV104xYlJgDBCCtawA==, 2372 | } 2373 | engines: { node: ">=12" } 2374 | dependencies: 2375 | graceful-fs: 4.2.11 2376 | is-stream: 2.0.1 2377 | temp-dir: 2.0.0 2378 | uuid: 8.3.2 2379 | dev: true 2380 | 2381 | /tempy@3.1.0: 2382 | resolution: 2383 | { 2384 | integrity: sha512-7jDLIdD2Zp0bDe5r3D2qtkd1QOCacylBuL7oa4udvN6v2pqr4+LcCr67C8DR1zkpaZ8XosF5m1yQSabKAW6f2g==, 2385 | } 2386 | engines: { node: ">=14.16" } 2387 | dependencies: 2388 | is-stream: 3.0.0 2389 | temp-dir: 3.0.0 2390 | type-fest: 2.19.0 2391 | unique-string: 3.0.0 2392 | dev: true 2393 | 2394 | /to-regex-range@5.0.1: 2395 | resolution: 2396 | { 2397 | integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==, 2398 | } 2399 | engines: { node: ">=8.0" } 2400 | dependencies: 2401 | is-number: 7.0.0 2402 | dev: true 2403 | 2404 | /type-fest@1.4.0: 2405 | resolution: 2406 | { 2407 | integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==, 2408 | } 2409 | engines: { node: ">=10" } 2410 | dev: true 2411 | 2412 | /type-fest@2.19.0: 2413 | resolution: 2414 | { 2415 | integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==, 2416 | } 2417 | engines: { node: ">=12.20" } 2418 | dev: true 2419 | 2420 | /typed-css-modules@0.7.2: 2421 | resolution: 2422 | { 2423 | integrity: sha512-R3guXrQ8ry/yhlfvNmkVY4J3+FtKaEdwqrvgSvFpVY0ieYQHqhhBW0RwfE4hnG4m29Ef/4IE0tBsk/UKplmJkA==, 2424 | } 2425 | engines: { node: ">=12.0.0" } 2426 | hasBin: true 2427 | dependencies: 2428 | "@types/css-modules-loader-core": 1.1.0 2429 | camelcase: 6.3.0 2430 | chalk: 4.1.2 2431 | chokidar: 3.5.3 2432 | css-modules-loader-core: 1.1.0 2433 | glob: 7.2.3 2434 | is-there: 4.5.1 2435 | mkdirp: 1.0.4 2436 | yargs: 15.4.1 2437 | dev: true 2438 | 2439 | /typescript@5.2.2: 2440 | resolution: 2441 | { 2442 | integrity: sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==, 2443 | } 2444 | engines: { node: ">=14.17" } 2445 | hasBin: true 2446 | dev: true 2447 | 2448 | /unique-string@3.0.0: 2449 | resolution: 2450 | { 2451 | integrity: sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==, 2452 | } 2453 | engines: { node: ">=12" } 2454 | dependencies: 2455 | crypto-random-string: 4.0.0 2456 | dev: true 2457 | 2458 | /update-browserslist-db@1.0.11(browserslist@4.21.10): 2459 | resolution: 2460 | { 2461 | integrity: sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==, 2462 | } 2463 | hasBin: true 2464 | peerDependencies: 2465 | browserslist: ">= 4.21.0" 2466 | dependencies: 2467 | browserslist: 4.21.10 2468 | escalade: 3.1.1 2469 | picocolors: 1.0.0 2470 | dev: true 2471 | 2472 | /util-deprecate@1.0.2: 2473 | resolution: 2474 | { 2475 | integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==, 2476 | } 2477 | dev: true 2478 | 2479 | /uuid@8.3.2: 2480 | resolution: 2481 | { 2482 | integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==, 2483 | } 2484 | hasBin: true 2485 | dev: true 2486 | 2487 | /which-module@2.0.1: 2488 | resolution: 2489 | { 2490 | integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==, 2491 | } 2492 | dev: true 2493 | 2494 | /wrap-ansi@6.2.0: 2495 | resolution: 2496 | { 2497 | integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==, 2498 | } 2499 | engines: { node: ">=8" } 2500 | dependencies: 2501 | ansi-styles: 4.3.0 2502 | string-width: 4.2.3 2503 | strip-ansi: 6.0.1 2504 | dev: true 2505 | 2506 | /wrappy@1.0.2: 2507 | resolution: 2508 | { 2509 | integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==, 2510 | } 2511 | dev: true 2512 | 2513 | /y18n@4.0.3: 2514 | resolution: 2515 | { 2516 | integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==, 2517 | } 2518 | dev: true 2519 | 2520 | /yargs-parser@18.1.3: 2521 | resolution: 2522 | { 2523 | integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==, 2524 | } 2525 | engines: { node: ">=6" } 2526 | dependencies: 2527 | camelcase: 5.3.1 2528 | decamelize: 1.2.0 2529 | dev: true 2530 | 2531 | /yargs@15.4.1: 2532 | resolution: 2533 | { 2534 | integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==, 2535 | } 2536 | engines: { node: ">=8" } 2537 | dependencies: 2538 | cliui: 6.0.0 2539 | decamelize: 1.2.0 2540 | find-up: 4.1.0 2541 | get-caller-file: 2.0.5 2542 | require-directory: 2.1.1 2543 | require-main-filename: 2.0.0 2544 | set-blocking: 2.0.0 2545 | string-width: 4.2.3 2546 | which-module: 2.0.1 2547 | y18n: 4.0.3 2548 | yargs-parser: 18.1.3 2549 | dev: true 2550 | 2551 | /yocto-queue@1.0.0: 2552 | resolution: 2553 | { 2554 | integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==, 2555 | } 2556 | engines: { node: ">=12.20" } 2557 | dev: true 2558 | -------------------------------------------------------------------------------- /prettier.config.js: -------------------------------------------------------------------------------- 1 | /** @type {import('prettier').Config} */ 2 | module.exports = { 3 | endOfLine: "lf", 4 | semi: false, 5 | singleQuote: false, 6 | tabWidth: 2, 7 | trailingComma: "es5", 8 | } 9 | -------------------------------------------------------------------------------- /src/app.tsx: -------------------------------------------------------------------------------- 1 | import { 2 | Banner, 3 | Button, 4 | IconInfo32, 5 | IconWarning32, 6 | render, 7 | } from "@create-figma-plugin/ui" 8 | import { emit } from "@create-figma-plugin/utilities" 9 | import { h } from "preact" 10 | import { useState } from "preact/hooks" 11 | import { Color, Radius, Mode, colors, radii, modes } from "./themes" 12 | import { 13 | ChangeSelectionThemeHandler, 14 | ChangeVariablesThemeHandler, 15 | } from "./types" 16 | import { version } from "../package.json" 17 | 18 | const colorKeys = Object.keys(colors) as Color[] 19 | const radiusKeys = Object.keys(radii) as Radius[] 20 | 21 | export interface AppProps { 22 | target: "VARIABLES" | "SELECTION" 23 | } 24 | 25 | export function App({ target }: AppProps) { 26 | const [color, setColor] = useState(null) 27 | const [radius, setRadius] = useState(null) 28 | const [mode, setMode] = useState(null) 29 | 30 | function handleClickColor(color: Color) { 31 | setColor(color) 32 | } 33 | 34 | function handleClickRadius(radius: Radius) { 35 | setRadius(radius) 36 | } 37 | 38 | function handleClickMode(mode: Mode) { 39 | setMode(mode) 40 | } 41 | 42 | function handleClickApply() { 43 | if (target === "VARIABLES") { 44 | emit("CHANGE_VARIABLES_THEME", color, radius) 45 | } else if (target === "SELECTION") { 46 | emit( 47 | "CHANGE_SELECTION_THEME", 48 | color, 49 | radius, 50 | mode 51 | ) 52 | } 53 | } 54 | 55 | return ( 56 |
57 | {target === "SELECTION" ? ( 58 | } variant="warning"> 59 | Theme changes won't be possible after applying. It will detach 60 | variables, apply values to selected nodes 61 | 62 | ) : ( 63 | }> 64 | Apply to variables and affect all nodes. Only works with `Design with 65 | shadcn/ui` file version {">="} 0.0.9 66 | 67 | )} 68 | 69 |
78 |
86 |
87 | 88 |
96 | {colorKeys.map((colorKey) => ( 97 | 126 | ))} 127 |
128 |
129 | 130 |
131 | 132 |
140 | {radiusKeys.map((radiusKey) => ( 141 | 163 | ))} 164 |
165 |
166 | 167 | {target === "SELECTION" ? ( 168 |
169 | 170 |
178 | {modes.map((m) => ( 179 | 201 | ))} 202 |
203 |
204 | ) : ( 205 |
206 | 207 |
212 | 213 | This action will apply to both Light and Dark modes. 214 | 215 |
216 |
217 | )} 218 | 219 |
227 | 230 |
231 |
232 |
233 | version {version} 234 |
235 |
236 |
237 | ) 238 | } 239 | -------------------------------------------------------------------------------- /src/helpers/check-and-change-fills.ts: -------------------------------------------------------------------------------- 1 | import { convertHexColorToRgbColor } from "@create-figma-plugin/utilities" 2 | import { Color, Mode, Primitive, colors, primitiveKeys } from "../themes" 3 | import { getDeepestNodeVariable } from "./get-deepest-node-variable" 4 | import { isFillable } from "./is-fillable" 5 | import { isSolidPaints } from "./is-solid-paints" 6 | 7 | export function checkAndChangeFills(node: SceneNode, color: Color, mode: Mode) { 8 | if (isFillable(node) && isSolidPaints(node.fills)) { 9 | const boundVariables = node.fills[0].boundVariables 10 | const variableId = boundVariables?.color?.id ?? "" 11 | 12 | // No id 13 | if (!variableId) return 14 | 15 | const variable = figma.variables.getVariableById(variableId) 16 | 17 | if (!variable) { 18 | throw new Error("Can`t find the variable") 19 | } 20 | 21 | const [deepestVariable, modeId] = getDeepestNodeVariable(node, variable) 22 | 23 | const variableNames = /color\/([a-z|-]+)\/([0-9]+)/.exec( 24 | deepestVariable.name ?? "" 25 | ) 26 | 27 | if (variableNames) { 28 | const name = variableNames[1] as Primitive 29 | 30 | if (primitiveKeys.color.includes(name)) { 31 | const collection = figma.variables.getVariableCollectionById( 32 | deepestVariable.variableCollectionId 33 | ) 34 | 35 | if (!collection) { 36 | throw new Error("Can`t find the collection") 37 | } 38 | 39 | const colorHex = colors[color][mode][name] 40 | const rgba = { 41 | ...convertHexColorToRgbColor(colorHex), 42 | a: (deepestVariable.valuesByMode[modeId] as RGBA).a, 43 | } as RGBA 44 | 45 | node.fills = [figma.util.solidPaint(rgba)] 46 | } 47 | } 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /src/helpers/check-and-change-radius.ts: -------------------------------------------------------------------------------- 1 | import { Radius, TokenRadius, radii } from "../themes" 2 | import { isCornerRadiusSettable } from "./is-corner-radius-settable" 3 | 4 | export function checkAndChangeRadius(node: SceneNode, radius: Radius) { 5 | if ( 6 | isCornerRadiusSettable(node) && 7 | node.boundVariables && 8 | node.boundVariables.topRightRadius 9 | ) { 10 | if ("id" in node.boundVariables.topRightRadius) { 11 | const variable = figma.variables.getVariableById( 12 | node.boundVariables.topRightRadius.id 13 | ) 14 | 15 | if (!variable) { 16 | throw new Error("Can`t find the variable") 17 | } 18 | 19 | const variableNames = /radius\/([a-z|-]+)/.exec(variable.name ?? "") 20 | 21 | if (variableNames) { 22 | const name = variableNames[1] as TokenRadius 23 | 24 | node.cornerRadius = radii[radius][name] 25 | } 26 | } 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/helpers/check-and-change-strokes.ts: -------------------------------------------------------------------------------- 1 | import { convertHexColorToRgbColor } from "@create-figma-plugin/utilities" 2 | import { Color, Mode, Primitive, colors, primitiveKeys } from "../themes" 3 | import { getDeepestNodeVariable } from "./get-deepest-node-variable" 4 | import { isSolidPaints } from "./is-solid-paints" 5 | import { isStrokeable } from "./is-strokeable" 6 | 7 | export function checkAndChangeStrokes( 8 | node: SceneNode, 9 | color: Color, 10 | mode: Mode 11 | ) { 12 | if (isStrokeable(node) && isSolidPaints(node.strokes)) { 13 | const boundVariables = node.strokes[0].boundVariables 14 | const variableId = boundVariables?.color?.id ?? "" 15 | 16 | // No id 17 | if (!variableId) return 18 | 19 | const variable = figma.variables.getVariableById(variableId) 20 | 21 | if (!variable) { 22 | throw new Error("Can`t find the variable") 23 | } 24 | 25 | const [deepestVariable, modeId] = getDeepestNodeVariable(node, variable) 26 | 27 | const variableNames = /color\/([a-z|-]+)\/([0-9]+)/.exec( 28 | deepestVariable.name ?? "" 29 | ) 30 | 31 | if (variableNames) { 32 | const name = variableNames[1] as Primitive 33 | 34 | if (primitiveKeys.color.includes(name)) { 35 | const collection = figma.variables.getVariableCollectionById( 36 | deepestVariable.variableCollectionId 37 | ) 38 | 39 | if (!collection) { 40 | throw new Error("Can`t find the collection") 41 | } 42 | 43 | const colorHex = colors[color][mode][name] 44 | const rgba = { 45 | ...convertHexColorToRgbColor(colorHex), 46 | a: (deepestVariable.valuesByMode[modeId] as RGBA).a, 47 | } as RGBA 48 | 49 | node.strokes = [figma.util.solidPaint(rgba)] 50 | } 51 | } 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /src/helpers/get-deepest-node-variable.ts: -------------------------------------------------------------------------------- 1 | export function getDeepestNodeVariable( 2 | node: SceneNode, 3 | variable: Variable 4 | ): [Variable, string] { 5 | const modeId = node.resolvedVariableModes[variable.variableCollectionId] 6 | const variableValue = variable.valuesByMode[modeId] 7 | 8 | if (typeof variableValue === "object" && "id" in variableValue) { 9 | const variable = figma.variables.getVariableById(variableValue.id) 10 | 11 | if (!variable) { 12 | throw new Error("Can`t find the variable") 13 | } 14 | 15 | return getDeepestNodeVariable(node, variable) 16 | } 17 | 18 | return [variable, modeId] 19 | } 20 | -------------------------------------------------------------------------------- /src/helpers/get-mode-mapping.ts: -------------------------------------------------------------------------------- 1 | import { primitiveKeys } from "../themes" 2 | 3 | type Mode = (typeof primitiveKeys.modes)[number] 4 | 5 | export function getModeMapping( 6 | modes: { 7 | modeId: string 8 | name: string 9 | }[] 10 | ) { 11 | const mappings = new Map() 12 | 13 | modes.forEach((mode) => { 14 | const modeName = mode.name.toLowerCase() as Mode 15 | if (primitiveKeys.modes.includes(modeName)) { 16 | mappings.set(mode.modeId, modeName) 17 | } 18 | }) 19 | 20 | return mappings 21 | } 22 | -------------------------------------------------------------------------------- /src/helpers/get-primitives-mapping.ts: -------------------------------------------------------------------------------- 1 | import { Primitive, primitiveKeys } from "../themes" 2 | 3 | export function getPrimitivesMapping(variableIds: string[]) { 4 | const primitivesMapping = new Map>() 5 | 6 | variableIds.forEach((id) => { 7 | const variable = figma.variables.getVariableById(id) 8 | 9 | if (!variable) { 10 | throw new Error("Can`t find the variable") 11 | } 12 | 13 | const variableNames = /color\/([a-z|-]+)\/([0-9]+)/.exec( 14 | variable.name ?? "" 15 | ) 16 | 17 | if (variableNames) { 18 | const name = variableNames[1] as Primitive 19 | 20 | if (primitiveKeys.color.includes(name)) { 21 | const variables = primitivesMapping.get(name) ?? new Set() 22 | 23 | variables.add(variable) 24 | 25 | primitivesMapping.set(name, variables) 26 | } 27 | } 28 | }) 29 | 30 | return primitivesMapping 31 | } 32 | -------------------------------------------------------------------------------- /src/helpers/get-tokens-mapping.ts: -------------------------------------------------------------------------------- 1 | import { TokenRadius, primitiveKeys } from "../themes" 2 | 3 | export function getTokensMapping(variableIds: string[]) { 4 | const tokensMapping = new Map>() 5 | 6 | variableIds.forEach((id) => { 7 | const variable = figma.variables.getVariableById(id) 8 | 9 | if (!variable) { 10 | throw new Error("Can`t find the variable") 11 | } 12 | 13 | const variableNames = /radius\/([a-z|-]+)/.exec(variable.name ?? "") 14 | 15 | if (variableNames) { 16 | const name = variableNames[1] as TokenRadius 17 | 18 | if (primitiveKeys.radius.includes(name)) { 19 | const variables = tokensMapping.get(name) ?? new Set() 20 | 21 | variables.add(variable) 22 | 23 | tokensMapping.set(name, variables) 24 | } 25 | } 26 | }) 27 | 28 | return tokensMapping 29 | } 30 | -------------------------------------------------------------------------------- /src/helpers/is-corner-radius-settable.ts: -------------------------------------------------------------------------------- 1 | type CornerRadiusSettableNode = 2 | | BooleanOperationNode 3 | | ComponentNode 4 | | ComponentSetNode 5 | | EllipseNode 6 | | FrameNode 7 | | HighlightNode 8 | | InstanceNode 9 | | PolygonNode 10 | | RectangleNode 11 | | StarNode 12 | | VectorNode 13 | 14 | export function isCornerRadiusSettable( 15 | node: SceneNode 16 | ): node is CornerRadiusSettableNode { 17 | if ( 18 | node.type === "BOOLEAN_OPERATION" || 19 | node.type === "COMPONENT" || 20 | node.type === "COMPONENT_SET" || 21 | node.type === "ELLIPSE" || 22 | node.type === "FRAME" || 23 | node.type === "HIGHLIGHT" || 24 | node.type === "INSTANCE" || 25 | node.type === "POLYGON" || 26 | node.type === "RECTANGLE" || 27 | node.type === "STAR" || 28 | node.type === "VECTOR" 29 | ) { 30 | return true 31 | } 32 | 33 | return false 34 | } 35 | -------------------------------------------------------------------------------- /src/helpers/is-fillable.ts: -------------------------------------------------------------------------------- 1 | type FillableNode = 2 | | BooleanOperationNode 3 | | ComponentNode 4 | | ComponentSetNode 5 | | EllipseNode 6 | | FrameNode 7 | | HighlightNode 8 | | InstanceNode 9 | | LineNode 10 | | PolygonNode 11 | | RectangleNode 12 | | SectionNode 13 | | ShapeWithTextNode 14 | | StampNode 15 | | StarNode 16 | | StickyNode 17 | | TableNode 18 | | TextNode 19 | | VectorNode 20 | | WashiTapeNode 21 | 22 | export function isFillable(node: SceneNode): node is FillableNode { 23 | if ( 24 | node.type === "BOOLEAN_OPERATION" || 25 | node.type === "COMPONENT" || 26 | node.type === "COMPONENT_SET" || 27 | node.type === "ELLIPSE" || 28 | node.type === "FRAME" || 29 | node.type === "HIGHLIGHT" || 30 | node.type === "INSTANCE" || 31 | node.type === "LINE" || 32 | node.type === "POLYGON" || 33 | node.type === "RECTANGLE" || 34 | node.type === "SECTION" || 35 | node.type === "SHAPE_WITH_TEXT" || 36 | node.type === "STAMP" || 37 | node.type === "STAR" || 38 | node.type === "STICKY" || 39 | node.type === "TABLE" || 40 | node.type === "TEXT" || 41 | node.type === "VECTOR" || 42 | node.type === "WASHI_TAPE" 43 | ) { 44 | return true 45 | } 46 | 47 | return false 48 | } 49 | -------------------------------------------------------------------------------- /src/helpers/is-solid-paints.ts: -------------------------------------------------------------------------------- 1 | export function isSolidPaints( 2 | paints: readonly Paint[] | PluginAPI["mixed"] 3 | ): paints is SolidPaint[] { 4 | if (paints !== figma.mixed && paints.length && paints[0].type === "SOLID") { 5 | return true 6 | } 7 | 8 | return false 9 | } 10 | -------------------------------------------------------------------------------- /src/helpers/is-strokeable.ts: -------------------------------------------------------------------------------- 1 | type StrokeableNode = 2 | | BooleanOperationNode 3 | | ComponentNode 4 | | ComponentSetNode 5 | | ConnectorNode 6 | | EllipseNode 7 | | FrameNode 8 | | HighlightNode 9 | | InstanceNode 10 | | LineNode 11 | | PolygonNode 12 | | RectangleNode 13 | | ShapeWithTextNode 14 | | StampNode 15 | | StarNode 16 | | TextNode 17 | | VectorNode 18 | | WashiTapeNode 19 | 20 | export function isStrokeable(node: SceneNode): node is StrokeableNode { 21 | if ( 22 | node.type === "BOOLEAN_OPERATION" || 23 | node.type === "COMPONENT" || 24 | node.type === "COMPONENT_SET" || 25 | node.type === "CONNECTOR" || 26 | node.type === "ELLIPSE" || 27 | node.type === "FRAME" || 28 | node.type === "HIGHLIGHT" || 29 | node.type === "INSTANCE" || 30 | node.type === "LINE" || 31 | node.type === "POLYGON" || 32 | node.type === "RECTANGLE" || 33 | node.type === "SHAPE_WITH_TEXT" || 34 | node.type === "STAMP" || 35 | node.type === "STAR" || 36 | node.type === "TEXT" || 37 | node.type === "VECTOR" || 38 | node.type === "WASHI_TAPE" 39 | ) { 40 | return true 41 | } 42 | 43 | return false 44 | } 45 | -------------------------------------------------------------------------------- /src/main.ts: -------------------------------------------------------------------------------- 1 | import { 2 | convertHexColorToRgbColor, 3 | on, 4 | showUI, 5 | } from "@create-figma-plugin/utilities" 6 | 7 | import { 8 | ChangeVariablesThemeHandler, 9 | ChangeSelectionThemeHandler, 10 | } from "./types" 11 | 12 | import { primitiveKeys, colors, radii, Color, Radius, Mode } from "./themes" 13 | import { getPrimitivesMapping } from "./helpers/get-primitives-mapping" 14 | import { getModeMapping } from "./helpers/get-mode-mapping" 15 | import { getTokensMapping } from "./helpers/get-tokens-mapping" 16 | import { checkAndChangeFills } from "./helpers/check-and-change-fills" 17 | import { checkAndChangeStrokes } from "./helpers/check-and-change-strokes" 18 | import { checkAndChangeRadius } from "./helpers/check-and-change-radius" 19 | 20 | const PRIMITIVES_COLLECTION_NAME = "Primitives" 21 | const TOKEN_COLLECTION_NAME = "Tokens" 22 | 23 | export default function () { 24 | on( 25 | "CHANGE_VARIABLES_THEME", 26 | changeVariablesTheme 27 | ), 28 | on( 29 | "CHANGE_SELECTION_THEME", 30 | changeSelectionTheme 31 | ), 32 | showUI({ 33 | height: 540, 34 | width: 340, 35 | }) 36 | } 37 | 38 | function changeVariablesTheme( 39 | color: Color | null, 40 | radius: Radius | null, 41 | numberOfSupportedModes?: number 42 | ) { 43 | try { 44 | if (!color) { 45 | figma.notify("Please choose a color.") 46 | return 47 | } 48 | 49 | if (!radius) { 50 | figma.notify("Please choose a radius.") 51 | return 52 | } 53 | 54 | const collections = figma.variables.getLocalVariableCollections() 55 | 56 | const primitivesCollection = collections.find( 57 | (collection) => collection.name === PRIMITIVES_COLLECTION_NAME 58 | ) 59 | const tokensCollection = collections.find( 60 | (collection) => collection.name === TOKEN_COLLECTION_NAME 61 | ) 62 | 63 | if (!primitivesCollection && !tokensCollection) { 64 | figma.notify( 65 | 'This action does not support outside of Design with shadcn/ui. Please try "Apply to selection"', 66 | { 67 | error: true, 68 | } 69 | ) 70 | return 71 | } 72 | 73 | if (!primitivesCollection) { 74 | figma.notify("No `Primitives` collection found. Please check.", { 75 | error: true, 76 | }) 77 | return 78 | } 79 | 80 | if (!tokensCollection) { 81 | figma.notify("No `Tokens` collection found. Please check.", { 82 | error: true, 83 | }) 84 | return 85 | } 86 | 87 | const modes = primitivesCollection.modes 88 | 89 | const primitivesMapping = getPrimitivesMapping( 90 | primitivesCollection.variableIds 91 | ) 92 | 93 | const differencePrimitives = primitiveKeys.color.filter( 94 | (key) => !primitivesMapping.has(key) 95 | ) 96 | 97 | if (differencePrimitives.length) { 98 | figma.notify( 99 | "Please check the variables in the Primitives collection. They may be missing.", 100 | { 101 | error: true, 102 | } 103 | ) 104 | return 105 | } 106 | 107 | const differenceModes = primitiveKeys.modes.filter( 108 | (key) => !modes.find((m) => m.name.toLowerCase() === key.toLowerCase()) 109 | ) 110 | 111 | if (differenceModes.length) { 112 | figma.notify( 113 | "Please check the modes in the Primitives collection. They may be missing.", 114 | { 115 | error: true, 116 | } 117 | ) 118 | return 119 | } 120 | 121 | const tokensRadiusMapping = getTokensMapping(tokensCollection.variableIds) 122 | 123 | const differenceTokens = primitiveKeys.radius.filter( 124 | (key) => !tokensRadiusMapping.has(key) 125 | ) 126 | 127 | if (differenceTokens.length) { 128 | figma.notify( 129 | "Please check the variables in the Tokens collection. They may be missing.", 130 | { 131 | error: true, 132 | } 133 | ) 134 | return 135 | } 136 | 137 | // Radius 138 | for (const [name, variables] of tokensRadiusMapping) { 139 | variables.forEach((variable) => { 140 | let valuesByMode: [string, VariableValue][] = [] 141 | 142 | if (numberOfSupportedModes === undefined) { 143 | // Reverse the order of items and perform actions from the end 144 | valuesByMode = Object.entries(variable?.valuesByMode).reverse() 145 | } else if (numberOfSupportedModes > 0) { 146 | valuesByMode = Object.entries(variable?.valuesByMode).slice( 147 | 0, 148 | numberOfSupportedModes 149 | ) 150 | } 151 | 152 | valuesByMode.forEach(([modeId, variableValue]) => { 153 | if (radii[radius] && name in radii[radius]) { 154 | const radiusValue = radii[radius][name] 155 | variable.setValueForMode(modeId, radiusValue) 156 | } 157 | }) 158 | }) 159 | } 160 | 161 | // Color 162 | for (const [primitiveName, variables] of primitivesMapping) { 163 | variables.forEach((variable) => { 164 | let valuesByMode: [string, VariableValue][] = [] 165 | 166 | if (numberOfSupportedModes === undefined) { 167 | // Reverse the order of items and perform actions from the end 168 | valuesByMode = Object.entries(variable?.valuesByMode).reverse() 169 | } else if (numberOfSupportedModes > 0) { 170 | valuesByMode = Object.entries(variable?.valuesByMode).slice( 171 | 0, 172 | numberOfSupportedModes 173 | ) 174 | } 175 | 176 | valuesByMode.forEach(([modeId, variableValue]) => { 177 | const modeName = getModeMapping(modes).get(modeId) 178 | 179 | if ( 180 | modeName && 181 | colors[color] && 182 | colors[color][modeName] && 183 | colors[color][modeName][primitiveName] 184 | ) { 185 | const colorHex = colors[color][modeName][primitiveName] 186 | const rgba = { 187 | ...convertHexColorToRgbColor(colorHex), 188 | a: (variableValue as RGBA).a, 189 | } as RGBA 190 | variable.setValueForMode(modeId, rgba) 191 | } 192 | }) 193 | }) 194 | } 195 | 196 | figma.notify( 197 | "Applied theme to variables. Please wait a moment for the components to take effect." 198 | ) 199 | } catch (e) { 200 | if (e instanceof Error) { 201 | const match = 202 | /in setValueForMode: cannot modify modes beyond limit of (\d+)/.exec( 203 | e.message 204 | ) 205 | 206 | if (match?.[1]) { 207 | const numberOfSupportedModes = Number(match[1]) 208 | 209 | const notifyHandler = figma.notify( 210 | `Your current plan only supports ${numberOfSupportedModes} mode(s).`, 211 | { 212 | button: { 213 | text: `Click to proceed with ${numberOfSupportedModes} mode(s)`, 214 | action: () => { 215 | changeVariablesTheme(color, radius, numberOfSupportedModes) 216 | 217 | notifyHandler.cancel() 218 | 219 | return false 220 | }, 221 | }, 222 | } 223 | ) 224 | } else { 225 | figma.notify(e.message, { error: true }) 226 | } 227 | } 228 | } 229 | } 230 | 231 | function changeSelectionTheme( 232 | color: Color | null, 233 | radius: Radius | null, 234 | mode: Mode | null 235 | ) { 236 | const selection = figma.currentPage.selection 237 | 238 | if (!selection.length) { 239 | figma.notify("Please select a node.") 240 | return 241 | } 242 | 243 | if (!color) { 244 | figma.notify("Please choose a color.") 245 | return 246 | } 247 | 248 | if (!radius) { 249 | figma.notify("Please choose a radius.") 250 | return 251 | } 252 | 253 | if (!mode) { 254 | figma.notify("Please choose a mode.") 255 | return 256 | } 257 | 258 | selection.forEach((node) => { 259 | changeThemeNodeRecursion(node, color, radius, mode) 260 | }) 261 | 262 | figma.notify("Applied theme to the selection.") 263 | } 264 | 265 | function changeThemeNodeRecursion( 266 | node: SceneNode, 267 | color: Color, 268 | radius: Radius, 269 | mode: Mode 270 | ) { 271 | changeThemeNode(node, color, radius, mode) 272 | if ("children" in node && node.children.length) { 273 | node.children.forEach((n) => { 274 | changeThemeNodeRecursion(n, color, radius, mode) 275 | }) 276 | } 277 | } 278 | 279 | function changeThemeNode( 280 | node: SceneNode, 281 | color: Color, 282 | radius: Radius, 283 | mode: Mode 284 | ) { 285 | if (node.boundVariables) { 286 | Object.entries(node.boundVariables).forEach(([type, boundVariable]) => { 287 | if (Array.isArray(boundVariable)) { 288 | checkAndChangeFills(node, color, mode) 289 | 290 | checkAndChangeStrokes(node, color, mode) 291 | } else if ( 292 | typeof boundVariable === "object" && 293 | typeof boundVariable.id === "string" 294 | ) { 295 | checkAndChangeRadius(node, radius) 296 | } 297 | }) 298 | } 299 | } 300 | -------------------------------------------------------------------------------- /src/themes/colors/blue.ts: -------------------------------------------------------------------------------- 1 | export const blue = { 2 | activeColor: { 3 | light: "2563EB", 4 | dark: "3B82F6", 5 | }, 6 | light: { 7 | background: "FFFFFF", 8 | foreground: "020817", 9 | card: "FFFFFF", 10 | "card-foreground": "020817", 11 | popover: "FFFFFF", 12 | "popover-foreground": "020817", 13 | primary: "2563EB", 14 | "primary-foreground": "F8FAFC", 15 | secondary: "F1F5F9", 16 | "secondary-foreground": "0F172A", 17 | muted: "F1F5F9", 18 | "muted-foreground": "64748B", 19 | accent: "F1F5F9", 20 | "accent-foreground": "0F172A", 21 | destructive: "EF4444", 22 | "destructive-foreground": "F8FAFC", 23 | border: "E2E8F0", 24 | input: "E2E8F0", 25 | ring: "2563EB", 26 | }, 27 | dark: { 28 | background: "020817", 29 | foreground: "F8FAFC", 30 | card: "020817", 31 | "card-foreground": "F8FAFC", 32 | popover: "020817", 33 | "popover-foreground": "F8FAFC", 34 | primary: "3B82F6", 35 | "primary-foreground": "0F172A", 36 | secondary: "1E293B", 37 | "secondary-foreground": "F8FAFC", 38 | muted: "1E293B", 39 | "muted-foreground": "94A3B8", 40 | accent: "1E293B", 41 | "accent-foreground": "F8FAFC", 42 | destructive: "7F1D1D", 43 | "destructive-foreground": "F8FAFC", 44 | border: "1E293B", 45 | input: "1E293B", 46 | ring: "1D4ED8", 47 | }, 48 | } 49 | -------------------------------------------------------------------------------- /src/themes/colors/gray.ts: -------------------------------------------------------------------------------- 1 | export const gray = { 2 | activeColor: { 3 | light: "6B7280", 4 | dark: "4B5563", 5 | }, 6 | light: { 7 | background: "FFFFFF", 8 | foreground: "030712", 9 | card: "FFFFFF", 10 | "card-foreground": "030712", 11 | popover: "FFFFFF", 12 | "popover-foreground": "030712", 13 | primary: "111827", 14 | "primary-foreground": "F9FAFB", 15 | secondary: "F3F4F6", 16 | "secondary-foreground": "111827", 17 | muted: "F3F4F6", 18 | "muted-foreground": "6B7280", 19 | accent: "F3F4F6", 20 | "accent-foreground": "111827", 21 | destructive: "EF4444", 22 | "destructive-foreground": "F9FAFB", 23 | border: "E5E7EB", 24 | input: "E5E7EB", 25 | ring: "030712", 26 | }, 27 | dark: { 28 | background: "030712", 29 | foreground: "F9FAFB", 30 | card: "030712", 31 | "card-foreground": "F9FAFB", 32 | popover: "030712", 33 | "popover-foreground": "F9FAFB", 34 | primary: "F9FAFB", 35 | "primary-foreground": "111827", 36 | secondary: "1F2937", 37 | "secondary-foreground": "F9FAFB", 38 | muted: "1F2937", 39 | "muted-foreground": "9CA3AF", 40 | accent: "1F2937", 41 | "accent-foreground": "F9FAFB", 42 | destructive: "7F1D1D", 43 | "destructive-foreground": "F9FAFB", 44 | border: "1F2937", 45 | input: "1F2937", 46 | ring: "D1D5DB", 47 | }, 48 | } 49 | -------------------------------------------------------------------------------- /src/themes/colors/green.ts: -------------------------------------------------------------------------------- 1 | export const green = { 2 | activeColor: { 3 | light: "16A34A", 4 | dark: "22C55E", 5 | }, 6 | light: { 7 | background: "FFFFFF", 8 | foreground: "09090B", 9 | card: "FFFFFF", 10 | "card-foreground": "09090B", 11 | popover: "FFFFFF", 12 | "popover-foreground": "09090B", 13 | primary: "16A34A", 14 | "primary-foreground": "FFF1F2", 15 | secondary: "F4F4F5", 16 | "secondary-foreground": "18181B", 17 | muted: "F4F4F5", 18 | "muted-foreground": "71717A", 19 | accent: "F4F4F5", 20 | "accent-foreground": "18181B", 21 | destructive: "EF4444", 22 | "destructive-foreground": "FAFAFA", 23 | border: "E4E4E7", 24 | input: "E4E4E7", 25 | ring: "16A34A", 26 | }, 27 | dark: { 28 | background: "0C0A09", 29 | foreground: "F2F2F2", 30 | card: "1C1917", 31 | "card-foreground": "F2F2F2", 32 | popover: "171717", 33 | "popover-foreground": "F2F2F2", 34 | primary: "22C55E", 35 | "primary-foreground": "052E16", 36 | secondary: "27272A", 37 | "secondary-foreground": "FAFAFA", 38 | muted: "262626", 39 | "muted-foreground": "A1A1AA", 40 | accent: "292524", 41 | "accent-foreground": "FAFAFA", 42 | destructive: "7F1D1D", 43 | "destructive-foreground": "FEF2F2", 44 | border: "27272A", 45 | input: "27272A", 46 | ring: "15803D", 47 | }, 48 | } 49 | -------------------------------------------------------------------------------- /src/themes/colors/neutral.ts: -------------------------------------------------------------------------------- 1 | export const neutral = { 2 | activeColor: { 3 | light: "737373", 4 | dark: "525252", 5 | }, 6 | light: { 7 | background: "FFFFFF", 8 | foreground: "0A0A0A", 9 | card: "FFFFFF", 10 | "card-foreground": "0A0A0A", 11 | popover: "FFFFFF", 12 | "popover-foreground": "0A0A0A", 13 | primary: "171717", 14 | "primary-foreground": "FAFAFA", 15 | secondary: "F5F5F5", 16 | "secondary-foreground": "171717", 17 | muted: "F5F5F5", 18 | "muted-foreground": "737373", 19 | accent: "F5F5F5", 20 | "accent-foreground": "171717", 21 | destructive: "EF4444", 22 | "destructive-foreground": "FAFAFA", 23 | border: "E5E5E5", 24 | input: "E5E5E5", 25 | ring: "0A0A0A", 26 | }, 27 | dark: { 28 | background: "0A0A0A", 29 | foreground: "FAFAFA", 30 | card: "0A0A0A", 31 | "card-foreground": "FAFAFA", 32 | popover: "0A0A0A", 33 | "popover-foreground": "FAFAFA", 34 | primary: "FAFAFA", 35 | "primary-foreground": "171717", 36 | secondary: "262626", 37 | "secondary-foreground": "FAFAFA", 38 | muted: "262626", 39 | "muted-foreground": "A3A3A3", 40 | accent: "262626", 41 | "accent-foreground": "FAFAFA", 42 | destructive: "7F1D1D", 43 | "destructive-foreground": "FAFAFA", 44 | border: "262626", 45 | input: "262626", 46 | ring: "D4D4D4", 47 | }, 48 | } 49 | -------------------------------------------------------------------------------- /src/themes/colors/orange.ts: -------------------------------------------------------------------------------- 1 | export const orange = { 2 | activeColor: { 3 | light: "F97316", 4 | dark: "EA580C", 5 | }, 6 | light: { 7 | background: "FFFFFF", 8 | foreground: "0C0A09", 9 | card: "FFFFFF", 10 | "card-foreground": "0C0A09", 11 | popover: "FFFFFF", 12 | "popover-foreground": "0C0A09", 13 | primary: "F97316", 14 | "primary-foreground": "FAFAF9", 15 | secondary: "F5F5F4", 16 | "secondary-foreground": "1C1917", 17 | muted: "F5F5F4", 18 | "muted-foreground": "78716C", 19 | accent: "F5F5F4", 20 | "accent-foreground": "1C1917", 21 | destructive: "EF4444", 22 | "destructive-foreground": "FAFAF9", 23 | border: "E7E5E4", 24 | input: "E7E5E4", 25 | ring: "F97316", 26 | }, 27 | dark: { 28 | background: "0C0A09", 29 | foreground: "FAFAF9", 30 | card: "0C0A09", 31 | "card-foreground": "FAFAF9", 32 | popover: "0C0A09", 33 | "popover-foreground": "FAFAF9", 34 | primary: "EA580C", 35 | "primary-foreground": "FAFAF9", 36 | secondary: "292524", 37 | "secondary-foreground": "FAFAF9", 38 | muted: "292524", 39 | "muted-foreground": "A8A29E", 40 | accent: "292524", 41 | "accent-foreground": "FAFAF9", 42 | destructive: "DC2626", 43 | "destructive-foreground": "FAFAF9", 44 | border: "292524", 45 | input: "292524", 46 | ring: "EA580C", 47 | }, 48 | } 49 | -------------------------------------------------------------------------------- /src/themes/colors/red.ts: -------------------------------------------------------------------------------- 1 | export const red = { 2 | activeColor: { 3 | light: "DC2626", 4 | dark: "DC2626", 5 | }, 6 | light: { 7 | background: "FFFFFF", 8 | foreground: "0A0A0A", 9 | card: "FFFFFF", 10 | "card-foreground": "0A0A0A", 11 | popover: "FFFFFF", 12 | "popover-foreground": "0A0A0A", 13 | primary: "DC2626", 14 | "primary-foreground": "FEF2F2", 15 | secondary: "F5F5F5", 16 | "secondary-foreground": "171717", 17 | muted: "F5F5F5", 18 | "muted-foreground": "737373", 19 | accent: "F5F5F5", 20 | "accent-foreground": "171717", 21 | destructive: "EF4444", 22 | "destructive-foreground": "FAFAFA", 23 | border: "E5E5E5", 24 | input: "E5E5E5", 25 | ring: "DC2626", 26 | }, 27 | dark: { 28 | background: "0A0A0A", 29 | foreground: "FAFAFA", 30 | card: "0A0A0A", 31 | "card-foreground": "FAFAFA", 32 | popover: "0A0A0A", 33 | "popover-foreground": "FAFAFA", 34 | primary: "DC2626", 35 | "primary-foreground": "FEF2F2", 36 | secondary: "262626", 37 | "secondary-foreground": "FAFAFA", 38 | muted: "262626", 39 | "muted-foreground": "A3A3A3", 40 | accent: "262626", 41 | "accent-foreground": "FAFAFA", 42 | destructive: "7F1D1D", 43 | "destructive-foreground": "FAFAFA", 44 | border: "262626", 45 | input: "262626", 46 | ring: "DC2626", 47 | }, 48 | } 49 | -------------------------------------------------------------------------------- /src/themes/colors/rose.ts: -------------------------------------------------------------------------------- 1 | export const rose = { 2 | activeColor: { 3 | light: "E11D48", 4 | dark: "E11D48", 5 | }, 6 | light: { 7 | background: "FFFFFF", 8 | foreground: "09090B", 9 | card: "FFFFFF", 10 | "card-foreground": "09090B", 11 | popover: "FFFFFF", 12 | "popover-foreground": "09090B", 13 | primary: "E11D48", 14 | "primary-foreground": "FFF1F2", 15 | secondary: "F4F4F5", 16 | "secondary-foreground": "18181B", 17 | muted: "F4F4F5", 18 | "muted-foreground": "71717A", 19 | accent: "F4F4F5", 20 | "accent-foreground": "18181B", 21 | destructive: "EF4444", 22 | "destructive-foreground": "FAFAFA", 23 | border: "E4E4E7", 24 | input: "E4E4E7", 25 | ring: "E11D48", 26 | }, 27 | dark: { 28 | background: "0C0A09", 29 | foreground: "F2F2F2", 30 | card: "1C1917", 31 | "card-foreground": "F2F2F2", 32 | popover: "171717", 33 | "popover-foreground": "F2F2F2", 34 | primary: "E11D48", 35 | "primary-foreground": "FFF1F2", 36 | secondary: "27272A", 37 | "secondary-foreground": "FAFAFA", 38 | muted: "262626", 39 | "muted-foreground": "A1A1AA", 40 | accent: "292524", 41 | "accent-foreground": "FAFAFA", 42 | destructive: "7F1D1D", 43 | "destructive-foreground": "FEF2F2", 44 | border: "27272A", 45 | input: "27272A", 46 | ring: "E11D48", 47 | }, 48 | } 49 | -------------------------------------------------------------------------------- /src/themes/colors/slate.ts: -------------------------------------------------------------------------------- 1 | export const slate = { 2 | activeColor: { 3 | light: "64748B", 4 | dark: "52525B", 5 | }, 6 | light: { 7 | background: "FFFFFF", 8 | foreground: "020817", 9 | card: "FFFFFF", 10 | "card-foreground": "020817", 11 | popover: "FFFFFF", 12 | "popover-foreground": "020817", 13 | primary: "0F172A", 14 | "primary-foreground": "F8FAFC", 15 | secondary: "F1F5F9", 16 | "secondary-foreground": "0F172A", 17 | muted: "F1F5F9", 18 | "muted-foreground": "64748B", 19 | accent: "F1F5F9", 20 | "accent-foreground": "0F172A", 21 | destructive: "EF4444", 22 | "destructive-foreground": "F8FAFC", 23 | border: "E2E8F0", 24 | input: "E2E8F0", 25 | ring: "020817", 26 | }, 27 | dark: { 28 | background: "020817", 29 | foreground: "F8FAFC", 30 | card: "020817", 31 | "card-foreground": "F8FAFC", 32 | popover: "020817", 33 | "popover-foreground": "F8FAFC", 34 | primary: "F8FAFC", 35 | "primary-foreground": "0F172A", 36 | secondary: "1E293B", 37 | "secondary-foreground": "F8FAFC", 38 | muted: "1E293B", 39 | "muted-foreground": "94A3B8", 40 | accent: "1E293B", 41 | "accent-foreground": "F8FAFC", 42 | destructive: "7F1D1D", 43 | "destructive-foreground": "F8FAFC", 44 | border: "1E293B", 45 | input: "1E293B", 46 | ring: "CBD5E1", 47 | }, 48 | } 49 | -------------------------------------------------------------------------------- /src/themes/colors/stone.ts: -------------------------------------------------------------------------------- 1 | export const stone = { 2 | activeColor: { 3 | light: "78716C", 4 | dark: "57534E", 5 | }, 6 | light: { 7 | background: "FFFFFF", 8 | foreground: "0C0A09", 9 | card: "FFFFFF", 10 | "card-foreground": "0C0A09", 11 | popover: "FFFFFF", 12 | "popover-foreground": "0C0A09", 13 | primary: "1C1917", 14 | "primary-foreground": "FAFAF9", 15 | secondary: "F5F5F4", 16 | "secondary-foreground": "1C1917", 17 | muted: "F5F5F4", 18 | "muted-foreground": "78716C", 19 | accent: "F5F5F4", 20 | "accent-foreground": "1C1917", 21 | destructive: "EF4444", 22 | "destructive-foreground": "FAFAF9", 23 | border: "E7E5E4", 24 | input: "E7E5E4", 25 | ring: "0C0A09", 26 | }, 27 | dark: { 28 | background: "0C0A09", 29 | foreground: "FAFAF9", 30 | card: "0C0A09", 31 | "card-foreground": "FAFAF9", 32 | popover: "0C0A09", 33 | "popover-foreground": "FAFAF9", 34 | primary: "FAFAF9", 35 | "primary-foreground": "1C1917", 36 | secondary: "292524", 37 | "secondary-foreground": "FAFAF9", 38 | muted: "292524", 39 | "muted-foreground": "A8A29E", 40 | accent: "292524", 41 | "accent-foreground": "FAFAF9", 42 | destructive: "7F1D1D", 43 | "destructive-foreground": "FAFAF9", 44 | border: "292524", 45 | input: "292524", 46 | ring: "D6D3D1", 47 | }, 48 | } 49 | -------------------------------------------------------------------------------- /src/themes/colors/violet.ts: -------------------------------------------------------------------------------- 1 | export const violet = { 2 | activeColor: { 3 | light: "7C3AED", 4 | dark: "6D28D9", 5 | }, 6 | light: { 7 | background: "FFFFFF", 8 | foreground: "030712", 9 | card: "FFFFFF", 10 | "card-foreground": "030712", 11 | popover: "FFFFFF", 12 | "popover-foreground": "030712", 13 | primary: "7C3AED", 14 | "primary-foreground": "F9FAFB", 15 | secondary: "F3F4F6", 16 | "secondary-foreground": "111827", 17 | muted: "F3F4F6", 18 | "muted-foreground": "6B7280", 19 | accent: "F3F4F6", 20 | "accent-foreground": "111827", 21 | destructive: "EF4444", 22 | "destructive-foreground": "F9FAFB", 23 | border: "E5E7EB", 24 | input: "E5E7EB", 25 | ring: "7C3AED", 26 | }, 27 | dark: { 28 | background: "030712", 29 | foreground: "F9FAFB", 30 | card: "030712", 31 | "card-foreground": "F9FAFB", 32 | popover: "030712", 33 | "popover-foreground": "F9FAFB", 34 | primary: "6D28D9", 35 | "primary-foreground": "F9FAFB", 36 | secondary: "1F2937", 37 | "secondary-foreground": "F9FAFB", 38 | muted: "1F2937", 39 | "muted-foreground": "9CA3AF", 40 | accent: "1F2937", 41 | "accent-foreground": "F9FAFB", 42 | destructive: "7F1D1D", 43 | "destructive-foreground": "F9FAFB", 44 | border: "1F2937", 45 | input: "1F2937", 46 | ring: "6D28D9", 47 | }, 48 | } 49 | -------------------------------------------------------------------------------- /src/themes/colors/yellow.ts: -------------------------------------------------------------------------------- 1 | export const yellow = { 2 | activeColor: { 3 | light: "FACC15", 4 | dark: "FACC15", 5 | }, 6 | light: { 7 | background: "FFFFFF", 8 | foreground: "0C0A09", 9 | card: "FFFFFF", 10 | "card-foreground": "0C0A09", 11 | popover: "FFFFFF", 12 | "popover-foreground": "0C0A09", 13 | primary: "FACC15", 14 | "primary-foreground": "422006", 15 | secondary: "F5F5F4", 16 | "secondary-foreground": "1C1917", 17 | muted: "F5F5F4", 18 | "muted-foreground": "78716C", 19 | accent: "F5F5F4", 20 | "accent-foreground": "1C1917", 21 | destructive: "EF4444", 22 | "destructive-foreground": "FAFAF9", 23 | border: "E7E5E4", 24 | input: "E7E5E4", 25 | ring: "0C0A09", 26 | }, 27 | dark: { 28 | background: "0C0A09", 29 | foreground: "FAFAF9", 30 | card: "0C0A09", 31 | "card-foreground": "FAFAF9", 32 | popover: "0C0A09", 33 | "popover-foreground": "FAFAF9", 34 | primary: "FACC15", 35 | "primary-foreground": "422006", 36 | secondary: "292524", 37 | "secondary-foreground": "FAFAF9", 38 | muted: "292524", 39 | "muted-foreground": "A8A29E", 40 | accent: "292524", 41 | "accent-foreground": "FAFAF9", 42 | destructive: "7F1D1D", 43 | "destructive-foreground": "FAFAF9", 44 | border: "292524", 45 | input: "292524", 46 | ring: "A16207", 47 | }, 48 | } 49 | -------------------------------------------------------------------------------- /src/themes/colors/zinc.ts: -------------------------------------------------------------------------------- 1 | export const zinc = { 2 | activeColor: { 3 | light: "18181B", 4 | dark: "52525B", 5 | }, 6 | light: { 7 | background: "FFFFFF", 8 | foreground: "09090B", 9 | card: "FFFFFF", 10 | "card-foreground": "09090B", 11 | popover: "FFFFFF", 12 | "popover-foreground": "09090B", 13 | primary: "18181B", 14 | "primary-foreground": "FAFAFA", 15 | secondary: "F4F4F5", 16 | "secondary-foreground": "18181B", 17 | muted: "F4F4F5", 18 | "muted-foreground": "71717A", 19 | accent: "F4F4F5", 20 | "accent-foreground": "18181B", 21 | destructive: "EF4444", 22 | "destructive-foreground": "FAFAFA", 23 | border: "E4E4E7", 24 | input: "E4E4E7", 25 | ring: "18181B", 26 | }, 27 | dark: { 28 | background: "09090B", 29 | foreground: "FAFAFA", 30 | card: "09090B", 31 | "card-foreground": "FAFAFA", 32 | popover: "09090B", 33 | "popover-foreground": "FAFAFA", 34 | primary: "FAFAFA", 35 | "primary-foreground": "18181B", 36 | secondary: "27272A", 37 | "secondary-foreground": "FAFAFA", 38 | muted: "27272A", 39 | "muted-foreground": "A1A1AA", 40 | accent: "27272A", 41 | "accent-foreground": "FAFAFA", 42 | destructive: "7F1D1D", 43 | "destructive-foreground": "FAFAFA", 44 | border: "27272A", 45 | input: "27272A", 46 | ring: "D4D4D8", 47 | }, 48 | } 49 | -------------------------------------------------------------------------------- /src/themes/index.ts: -------------------------------------------------------------------------------- 1 | import { blue } from "./colors/blue" 2 | import { gray } from "./colors/gray" 3 | import { green } from "./colors/green" 4 | import { neutral } from "./colors/neutral" 5 | import { orange } from "./colors/orange" 6 | import { red } from "./colors/red" 7 | import { rose } from "./colors/rose" 8 | import { slate } from "./colors/slate" 9 | import { stone } from "./colors/stone" 10 | import { violet } from "./colors/violet" 11 | import { yellow } from "./colors/yellow" 12 | import { zinc } from "./colors/zinc" 13 | 14 | import { radius0 } from "./radii/radius-0" 15 | import { radius03 } from "./radii/radius-0.3" 16 | import { radius05 } from "./radii/radius-0.5" 17 | import { radius075 } from "./radii/radius-0.75" 18 | import { radius1 } from "./radii/radius-1.0" 19 | 20 | export type Color = keyof typeof colors 21 | export type Radius = keyof typeof radii 22 | export type Primitive = (typeof primitiveKeys.color)[number] 23 | export type TokenRadius = (typeof primitiveKeys.radius)[number] 24 | export type Mode = (typeof modes)[number] 25 | 26 | export const primitiveKeys = { 27 | modes: ["light", "dark"], 28 | color: [ 29 | "background", 30 | "foreground", 31 | "card", 32 | "card-foreground", 33 | "popover", 34 | "popover-foreground", 35 | "primary", 36 | "primary-foreground", 37 | "secondary", 38 | "secondary-foreground", 39 | "muted", 40 | "muted-foreground", 41 | "accent", 42 | "accent-foreground", 43 | "destructive", 44 | "destructive-foreground", 45 | "border", 46 | "input", 47 | "ring", 48 | ], 49 | radius: [ 50 | "rounded-sm", 51 | "rounded-md", 52 | "rounded-lg", 53 | "rounded-xl", 54 | "rounded-full", 55 | ], 56 | } as const 57 | 58 | export const colors = { 59 | zinc, 60 | slate, 61 | stone, 62 | gray, 63 | neutral, 64 | red, 65 | rose, 66 | orange, 67 | green, 68 | blue, 69 | yellow, 70 | violet, 71 | } 72 | 73 | export const radii = { 74 | "0": radius0, 75 | "0.3": radius03, 76 | "0.5": radius05, 77 | "0.75": radius075, 78 | "1.0": radius1, 79 | } 80 | 81 | export const modes = ["light", "dark"] as const 82 | -------------------------------------------------------------------------------- /src/themes/radii/radius-0.3.ts: -------------------------------------------------------------------------------- 1 | export const radius03 = { 2 | "rounded-sm": 0.8, 3 | "rounded-md": 2.8, 4 | "rounded-lg": 4.8, 5 | "rounded-xl": 8.8, 6 | "rounded-full": 9999, 7 | } 8 | -------------------------------------------------------------------------------- /src/themes/radii/radius-0.5.ts: -------------------------------------------------------------------------------- 1 | export const radius05 = { 2 | "rounded-sm": 4, 3 | "rounded-md": 6, 4 | "rounded-lg": 8, 5 | "rounded-xl": 12, 6 | "rounded-full": 9999, 7 | } 8 | -------------------------------------------------------------------------------- /src/themes/radii/radius-0.75.ts: -------------------------------------------------------------------------------- 1 | export const radius075 = { 2 | "rounded-sm": 8, 3 | "rounded-md": 10, 4 | "rounded-lg": 12, 5 | "rounded-xl": 16, 6 | "rounded-full": 9999, 7 | } 8 | -------------------------------------------------------------------------------- /src/themes/radii/radius-0.ts: -------------------------------------------------------------------------------- 1 | export const radius0 = { 2 | "rounded-sm": 0, 3 | "rounded-md": 0, 4 | "rounded-lg": 0, 5 | "rounded-xl": 0, 6 | "rounded-full": 9999, 7 | } 8 | -------------------------------------------------------------------------------- /src/themes/radii/radius-1.0.ts: -------------------------------------------------------------------------------- 1 | export const radius1 = { 2 | "rounded-sm": 12, 3 | "rounded-md": 14, 4 | "rounded-lg": 16, 5 | "rounded-xl": 20, 6 | "rounded-full": 9999, 7 | } 8 | -------------------------------------------------------------------------------- /src/types.ts: -------------------------------------------------------------------------------- 1 | import { EventHandler } from "@create-figma-plugin/utilities" 2 | import { Color, Mode, Radius } from "./themes" 3 | 4 | export interface ResizeWindowHandler extends EventHandler { 5 | name: "RESIZE_WINDOW" 6 | handler: (windowSize: { width: number; height: number }) => void 7 | } 8 | 9 | export interface ChangeSelectionThemeHandler extends EventHandler { 10 | name: "CHANGE_SELECTION_THEME" 11 | handler: ( 12 | color: Color | null, 13 | radius: Radius | null, 14 | mode: Mode | null 15 | ) => void 16 | } 17 | 18 | export interface ChangeVariablesThemeHandler extends EventHandler { 19 | name: "CHANGE_VARIABLES_THEME" 20 | handler: (color: Color | null, radius: Radius | null) => void 21 | } 22 | -------------------------------------------------------------------------------- /src/ui.tsx: -------------------------------------------------------------------------------- 1 | import { Tabs, TabsOption, render } from "@create-figma-plugin/ui" 2 | import { JSX, h } from "preact" 3 | import { App } from "./app" 4 | import { useState } from "preact/hooks" 5 | 6 | function Plugin() { 7 | const [tab, setTab] = useState("Apply to variables") 8 | 9 | const options: TabsOption[] = [ 10 | { 11 | children: , 12 | value: "Apply to variables", 13 | }, 14 | { 15 | children: , 16 | value: "Apply to selection", 17 | }, 18 | ] 19 | 20 | function handleChange(event: JSX.TargetedEvent) { 21 | setTab(event.currentTarget.value) 22 | } 23 | 24 | return 25 | } 26 | 27 | export default render(Plugin) 28 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "@create-figma-plugin/tsconfig", 3 | "compilerOptions": { 4 | "target": "ESNext", 5 | "resolveJsonModule": true, 6 | "typeRoots": ["node_modules/@figma", "node_modules/@types"] 7 | }, 8 | "include": ["src/**/*.ts", "src/**/*.tsx"] 9 | } 10 | --------------------------------------------------------------------------------