Home

tailwind-ctp-intellisense @master - refs - log -
-
https://git.jolheiser.com/tailwind-ctp-intellisense.git
Tailwind intellisense + Catppuccin
tree log patch
Add support for v3-alpha (#424) * wip * Update v3 support, color handling * Update diagnostics and completions * bump language service * update context api usage * bump language service
Signature
-----BEGIN PGP SIGNATURE----- wsBcBAABCAAQBQJhVwkRCRBK7hj4Ov3rIwAAAwsIAGPXkyw23+yssjdkEmAwfP0t RpGY4+cy5YgqnMdMMrKnP8+Iq383rkVTgZkE4GzrWB/M2hpwqKY+UhuxPSCRm7Bs Wo/AcP0y2a533onm7n5ExoVBB8w+iGw9k1+w8SgyexrfMZqREdvTZK7jcmYjFugz z+rPnB6AyszXOry63D58c26x2auKHCoSmosGeBe78IK+wIYRlYnTAPcyOD37YDcy tjftvtXXZU6SXX8bWHZphdi2vIReNZwAU8HVuRAraONne/go6nd0fjXs6piICLRm bCfvdn/UpXAvdV7h9+8rNyWwQXuvKqcqfaFu3Wisgu43P9ujIOYoMtMOsPa2d3Q= =HKjN -----END PGP SIGNATURE-----
Brad Cornes <bradlc41@gmail.com>
3 years ago
17 changed files, 667 additions(+), 749 deletions(-)
M package-lock.json -> package-lock.json
diff --git a/package-lock.json b/package-lock.json
index 20d8e49b6e0f3ad20b0a9323803de2e136bcafd0..15b6a302a23534857f5a3e813a01915f7c7eb83e 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -6,7 +6,6 @@ 	"packages": {
 		"": {
 			"name": "root",
 			"dependencies": {
-				"@ctrl/tinycolor": "3.1.4",
 				"@parcel/watcher": "2.0.0-alpha.10",
 				"@types/debounce": "1.2.0",
 				"@types/moo": "0.5.3",
@@ -15,7 +14,9 @@ 				"@types/vscode": "1.52.0",
 				"@vercel/ncc": "0.28.4",
 				"builtin-modules": "3.2.0",
 				"chokidar": "3.5.1",
+				"color-name": "1.1.4",
 				"css.escape": "1.5.1",
+				"culori": "0.20.1",
 				"debounce": "1.2.0",
 				"detect-indent": "6.0.0",
 				"detective": "5.2.0",
@@ -320,18 +321,18 @@ 				"node": ">=6.9.0"
 			}
 		},
 		"node_modules/@babel/helper-module-transforms": {
-			"version": "7.15.4",
-			"resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.15.4.tgz",
-			"integrity": "sha512-9fHHSGE9zTC++KuXLZcB5FKgvlV83Ox+NLUmQTawovwlJ85+QMhk1CnVk406CQVj97LaWod6KVjl2Sfgw9Aktw==",
+			"version": "7.15.7",
+			"resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.15.7.tgz",
+			"integrity": "sha512-ZNqjjQG/AuFfekFTY+7nY4RgBSklgTu970c7Rj3m/JOhIu5KPBUuTA9AY6zaKcUvk4g6EbDXdBnhi35FAssdSw==",
 			"dependencies": {
 				"@babel/helper-module-imports": "^7.15.4",
 				"@babel/helper-replace-supers": "^7.15.4",
 				"@babel/helper-simple-access": "^7.15.4",
 				"@babel/helper-split-export-declaration": "^7.15.4",
-				"@babel/helper-validator-identifier": "^7.14.9",
+				"@babel/helper-validator-identifier": "^7.15.7",
 				"@babel/template": "^7.15.4",
 				"@babel/traverse": "^7.15.4",
-				"@babel/types": "^7.15.4"
+				"@babel/types": "^7.15.6"
 			},
 			"engines": {
 				"node": ">=6.9.0"
@@ -417,9 +418,9 @@ 				"node": ">=6.9.0"
 			}
 		},
 		"node_modules/@babel/helper-validator-identifier": {
-			"version": "7.14.9",
-			"resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz",
-			"integrity": "sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g==",
+			"version": "7.15.7",
+			"resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz",
+			"integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==",
 			"engines": {
 				"node": ">=6.9.0"
 			}
@@ -529,9 +530,9 @@ 				"node": ">=4"
 			}
 		},
 		"node_modules/@babel/parser": {
-			"version": "7.15.6",
-			"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.6.tgz",
-			"integrity": "sha512-S/TSCcsRuCkmpUuoWijua0Snt+f3ewU/8spLo+4AXJCZfT0bVCzLD5MuOKdrx0mlAptbKzn5AdgEIIKXxXkz9Q==",
+			"version": "7.15.7",
+			"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.7.tgz",
+			"integrity": "sha512-rycZXvQ+xS9QyIcJ9HXeDWf1uxqlbVFAUq0Rq0dbc50Zb/+wUe/ehyfzGfm9KZZF0kBejYgxltBXocP+gKdL2g==",
 			"bin": {
 				"parser": "bin/babel-parser.js"
 			},
@@ -1650,14 +1651,6 @@ 				"watch": "cli.js"
 			},
 			"engines": {
 				"node": ">=0.1.95"
-			}
-		},
-		"node_modules/@ctrl/tinycolor": {
-			"version": "3.1.4",
-			"resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-3.1.4.tgz",
-			"integrity": "sha512-WHn6ClDzGS3oACt4F/k0B9QwhQCeXXRguYE6UFe6OD6wLdESU8RoMs7Y1+FEr4Tj2VZd9bfb1aEhnB9KoVrLEA==",
-			"engines": {
-				"node": ">=10.19.0"
 			}
 		},
 		"node_modules/@evocateur/libnpmaccess": {
@@ -4808,9 +4801,9 @@ 				"url": "https://github.com/sponsors/sindresorhus"
 			}
 		},
 		"node_modules/ansi-regex": {
-			"version": "5.0.0",
-			"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
-			"integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
+			"version": "5.0.1",
+			"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+			"integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
 			"engines": {
 				"node": ">=8"
 			}
@@ -5350,12 +5343,12 @@ 				"semver": "bin/semver.js"
 			}
 		},
 		"node_modules/babel-plugin-polyfill-corejs3": {
-			"version": "0.2.4",
-			"resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.4.tgz",
-			"integrity": "sha512-z3HnJE5TY/j4EFEa/qpQMSbcUJZ5JQi+3UFjXzn6pQCmIKc5Ug5j98SuYyH+m4xQnvKlMDIW4plLfgyVnd0IcQ==",
+			"version": "0.2.5",
+			"resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.5.tgz",
+			"integrity": "sha512-ninF5MQNwAX9Z7c9ED+H2pGt1mXdP4TqzlHKyPIYmJIYz0N+++uwdM7RnJukklhzJ54Q84vA4ZJkgs7lu5vqcw==",
 			"dependencies": {
 				"@babel/helper-define-polyfill-provider": "^0.2.2",
-				"core-js-compat": "^3.14.0"
+				"core-js-compat": "^3.16.2"
 			},
 			"peerDependencies": {
 				"@babel/core": "^7.0.0-0"
@@ -5549,19 +5542,18 @@ 		},
 		"node_modules/browser-resolve/node_modules/resolve": {
 			"version": "1.1.7",
 			"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz",
-			"integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=",
-			"license": "MIT"
+			"integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs="
 		},
 		"node_modules/browserslist": {
-			"version": "4.17.0",
-			"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.17.0.tgz",
-			"integrity": "sha512-g2BJ2a0nEYvEFQC208q8mVAhfNwpZ5Mu8BwgtCdZKO3qx98HChmeg448fPdUzld8aFmfLgVh7yymqV+q1lJZ5g==",
+			"version": "4.17.1",
+			"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.17.1.tgz",
+			"integrity": "sha512-aLD0ZMDSnF4lUt4ZDNgqi5BUn9BZ7YdQdI/cYlILrhdSSZJLU9aNZoD5/NBmM4SK34APB2e83MOsRt1EnkuyaQ==",
 			"dependencies": {
-				"caniuse-lite": "^1.0.30001254",
-				"colorette": "^1.3.0",
-				"electron-to-chromium": "^1.3.830",
+				"caniuse-lite": "^1.0.30001259",
+				"electron-to-chromium": "^1.3.846",
 				"escalade": "^3.1.1",
-				"node-releases": "^1.1.75"
+				"nanocolors": "^0.1.5",
+				"node-releases": "^1.1.76"
 			},
 			"bin": {
 				"browserslist": "cli.js"
@@ -5794,9 +5786,12 @@ 				"url": "https://github.com/sponsors/sindresorhus"
 			}
 		},
 		"node_modules/caniuse-lite": {
-			"version": "1.0.30001255",
-			"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001255.tgz",
-			"integrity": "sha512-F+A3N9jTZL882f/fg/WWVnKSu6IOo3ueLz4zwaOPbPYHNmM/ZaDUyzyJwS1mZhX7Ex5jqTyW599Gdelh5PDYLQ==",
+			"version": "1.0.30001260",
+			"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001260.tgz",
+			"integrity": "sha512-Fhjc/k8725ItmrvW5QomzxLeojewxvqiYCKeFcfFEhut28IVLdpHU19dneOmltZQIE5HNbawj1HYD+1f2bM1Dg==",
+			"dependencies": {
+				"nanocolors": "^0.1.0"
+			},
 			"funding": {
 				"type": "opencollective",
 				"url": "https://opencollective.com/browserslist"
@@ -6056,13 +6051,13 @@ 				"node": ">=8"
 			}
 		},
 		"node_modules/cliui/node_modules/string-width": {
-			"version": "4.2.2",
-			"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz",
-			"integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==",
+			"version": "4.2.3",
+			"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+			"integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
 			"dependencies": {
 				"emoji-regex": "^8.0.0",
 				"is-fullwidth-code-point": "^3.0.0",
-				"strip-ansi": "^6.0.0"
+				"strip-ansi": "^6.0.1"
 			},
 			"engines": {
 				"node": ">=8"
@@ -6785,9 +6780,9 @@ 				"node": ">=0.10.0"
 			}
 		},
 		"node_modules/core-js-compat": {
-			"version": "3.17.3",
-			"resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.17.3.tgz",
-			"integrity": "sha512-+in61CKYs4hQERiADCJsdgewpdl/X0GhEX77pjKgbeibXviIt2oxEjTc8O2fqHX8mDdBrDvX8MYD/RYsBv4OiA==",
+			"version": "3.18.0",
+			"resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.18.0.tgz",
+			"integrity": "sha512-tRVjOJu4PxdXjRMEgbP7lqWy1TWJu9a01oBkn8d+dNrhgmBwdTkzhHZpVJnEmhISLdoJI1lX08rcBcHi3TZIWg==",
 			"dependencies": {
 				"browserslist": "^4.17.0",
 				"semver": "7.0.0"
@@ -6806,9 +6801,9 @@ 				"semver": "bin/semver.js"
 			}
 		},
 		"node_modules/core-js-pure": {
-			"version": "3.17.3",
-			"resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.17.3.tgz",
-			"integrity": "sha512-YusrqwiOTTn8058JDa0cv9unbXdIiIgcgI9gXso0ey4WgkFLd3lYlV9rp9n7nDCsYxXsMDTjA4m1h3T348mdlQ==",
+			"version": "3.18.0",
+			"resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.18.0.tgz",
+			"integrity": "sha512-ZnK+9vyuMhKulIGqT/7RHGRok8RtkHMEX/BGPHkHx+ouDkq+MUvf9mfIgdqhpmPDu8+V5UtRn/CbCRc9I4lX4w==",
 			"hasInstallScript": true,
 			"funding": {
 				"type": "opencollective",
@@ -6911,6 +6906,11 @@ 			"version": "0.3.8",
 			"resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz",
 			"integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg=="
 		},
+		"node_modules/culori": {
+			"version": "0.20.1",
+			"resolved": "https://registry.npmjs.org/culori/-/culori-0.20.1.tgz",
+			"integrity": "sha512-jNZDmufWx4vCHW2fTb62sarHEeIF3WWrUYIv4ZpoQnN2vQU6IRPz1Ra9QnsHUKzdb5lppSuLsdB72rMmBMAd+A=="
+		},
 		"node_modules/currently-unhandled": {
 			"version": "0.4.1",
 			"resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz",
@@ -7151,7 +7151,6 @@ 		"node_modules/detective": {
 			"version": "5.2.0",
 			"resolved": "https://registry.npmjs.org/detective/-/detective-5.2.0.tgz",
 			"integrity": "sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg==",
-			"license": "MIT",
 			"dependencies": {
 				"acorn-node": "^1.6.1",
 				"defined": "^1.0.0",
@@ -7341,9 +7340,9 @@ 				"safer-buffer": "^2.1.0"
 			}
 		},
 		"node_modules/electron-to-chromium": {
-			"version": "1.3.835",
-			"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.835.tgz",
-			"integrity": "sha512-rHQszGg2KLMqOWPNTpwCnlp7Kb85haJa8j089DJCreZueykoSN/in+EMlay3SSDMNKR4VGPvfskxofHV18xVJg=="
+			"version": "1.3.849",
+			"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.849.tgz",
+			"integrity": "sha512-RweyW60HPOqIcxoKTGr38Yvtf2aliSUqX8dB3e9geJ0Bno0YLjcOX5F7/DPVloBkJWaPZ7xOM1A0Yme2T1A34w=="
 		},
 		"node_modules/emoji-regex": {
 			"version": "9.2.2",
@@ -7932,22 +7931,23 @@ 				}
 			}
 		},
 		"node_modules/eslint-plugin-react": {
-			"version": "7.25.1",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.25.1.tgz",
-			"integrity": "sha512-P4j9K1dHoFXxDNP05AtixcJEvIT6ht8FhYKsrkY0MPCPaUMYijhpWwNiRDZVtA8KFuZOkGSeft6QwH8KuVpJug==",
+			"version": "7.26.0",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.26.0.tgz",
+			"integrity": "sha512-dceliS5itjk4EZdQYtLMz6GulcsasguIs+VTXuiC7Q5IPIdGTkyfXVdmsQOqEhlD9MciofH4cMcT1bw1WWNxCQ==",
 			"dependencies": {
 				"array-includes": "^3.1.3",
 				"array.prototype.flatmap": "^1.2.4",
 				"doctrine": "^2.1.0",
 				"estraverse": "^5.2.0",
-				"has": "^1.0.3",
 				"jsx-ast-utils": "^2.4.1 || ^3.0.0",
 				"minimatch": "^3.0.4",
 				"object.entries": "^1.1.4",
 				"object.fromentries": "^2.0.4",
+				"object.hasown": "^1.0.0",
 				"object.values": "^1.1.4",
 				"prop-types": "^15.7.2",
 				"resolve": "^2.0.0-next.3",
+				"semver": "^6.3.0",
 				"string.prototype.matchall": "^4.0.5"
 			},
 			"engines": {
@@ -7991,13 +7991,20 @@ 		"node_modules/eslint-plugin-react/node_modules/resolve": {
 			"version": "2.0.0-next.3",
 			"resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.3.tgz",
 			"integrity": "sha512-W8LucSynKUIDu9ylraa7ueVZ7hc0uAgJBxVsQSKOXOyle8a93qXhcz+XAXZ8bIq2d6i4Ehddn6Evt+0/UwKk6Q==",
-			"license": "MIT",
 			"dependencies": {
 				"is-core-module": "^2.2.0",
 				"path-parse": "^1.0.6"
 			},
 			"funding": {
 				"url": "https://github.com/sponsors/ljharb"
+			}
+		},
+		"node_modules/eslint-plugin-react/node_modules/semver": {
+			"version": "6.3.0",
+			"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+			"integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+			"bin": {
+				"semver": "bin/semver.js"
 			}
 		},
 		"node_modules/eslint-scope": {
@@ -8257,11 +8264,11 @@ 				"node": ">=8"
 			}
 		},
 		"node_modules/eslint/node_modules/inquirer/node_modules/strip-ansi": {
-			"version": "6.0.0",
-			"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
-			"integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
+			"version": "6.0.1",
+			"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+			"integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
 			"dependencies": {
-				"ansi-regex": "^5.0.0"
+				"ansi-regex": "^5.0.1"
 			},
 			"engines": {
 				"node": ">=8"
@@ -8355,24 +8362,24 @@ 				"node": ">=0.10.0"
 			}
 		},
 		"node_modules/eslint/node_modules/string-width": {
-			"version": "4.2.2",
-			"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz",
-			"integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==",
+			"version": "4.2.3",
+			"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+			"integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
 			"dependencies": {
 				"emoji-regex": "^8.0.0",
 				"is-fullwidth-code-point": "^3.0.0",
-				"strip-ansi": "^6.0.0"
+				"strip-ansi": "^6.0.1"
 			},
 			"engines": {
 				"node": ">=8"
 			}
 		},
 		"node_modules/eslint/node_modules/string-width/node_modules/strip-ansi": {
-			"version": "6.0.0",
-			"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
-			"integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
+			"version": "6.0.1",
+			"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+			"integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
 			"dependencies": {
-				"ansi-regex": "^5.0.0"
+				"ansi-regex": "^5.0.1"
 			},
 			"engines": {
 				"node": ">=8"
@@ -8814,9 +8821,9 @@ 			"resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
 			"integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc="
 		},
 		"node_modules/fastq": {
-			"version": "1.12.0",
-			"resolved": "https://registry.npmjs.org/fastq/-/fastq-1.12.0.tgz",
-			"integrity": "sha512-VNX0QkHK3RsXVKr9KrlUv/FoTa0NdbYoHHl7uXHv2rzyHSlxjdNAKug2twd9luJxpcyNeAgf5iPPMutJO67Dfg==",
+			"version": "1.13.0",
+			"resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz",
+			"integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==",
 			"dependencies": {
 				"reusify": "^1.0.4"
 			}
@@ -11440,9 +11447,9 @@ 			"resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
 			"integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo="
 		},
 		"node_modules/istanbul-lib-coverage": {
-			"version": "3.0.0",
-			"resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz",
-			"integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==",
+			"version": "3.0.1",
+			"resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.1.tgz",
+			"integrity": "sha512-GvCYYTxaCPqwMjobtVcVKvSHtAGe48MNhGjpK8LtVF8K0ISX7hCKl85LgtuaSneWVyQmaGcW3iXVV3GaZSLpmQ==",
 			"engines": {
 				"node": ">=8"
 			}
@@ -12202,11 +12209,11 @@ 				"verror": "1.10.0"
 			}
 		},
 		"node_modules/jsx-ast-utils": {
-			"version": "3.2.0",
-			"resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.2.0.tgz",
-			"integrity": "sha512-EIsmt3O3ljsU6sot/J4E1zDRxfBNrhjyf/OKjlydwgEimQuznlM4Wv7U+ueONJMyEn1WRE0K8dhi3dVAXYT24Q==",
+			"version": "3.2.1",
+			"resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.2.1.tgz",
+			"integrity": "sha512-uP5vu8xfy2F9A6LGC22KO7e2/vGTS1MhP+18f++ZNlf0Ohaxbc9nIEwHAsejlJKyzfZzU5UIhe5ItYkitcZnZA==",
 			"dependencies": {
-				"array-includes": "^3.1.2",
+				"array-includes": "^3.1.3",
 				"object.assign": "^4.1.2"
 			},
 			"engines": {
@@ -13292,9 +13299,9 @@ 				"rimraf": "bin.js"
 			}
 		},
 		"node_modules/mri": {
-			"version": "1.1.6",
-			"resolved": "https://registry.npmjs.org/mri/-/mri-1.1.6.tgz",
-			"integrity": "sha512-oi1b3MfbyGa7FJMP9GmLTttni5JoICpYBRlq+x5V16fZbLsnL9N3wFqqIm/nIG43FjUFkFh9Epzp/kzUGUnJxQ==",
+			"version": "1.2.0",
+			"resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz",
+			"integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==",
 			"engines": {
 				"node": ">=4"
 			}
@@ -13340,6 +13347,11 @@ 				"object-assign": "^4.0.1",
 				"thenify-all": "^1.0.0"
 			}
 		},
+		"node_modules/nanocolors": {
+			"version": "0.1.12",
+			"resolved": "https://registry.npmjs.org/nanocolors/-/nanocolors-0.1.12.tgz",
+			"integrity": "sha512-2nMHqg1x5PU+unxX7PGY7AuYxl2qDx7PSrTRjizr8sxdd3l/3hBuWWaki62qmtYm2U5i4Z5E7GbjlyDFhs9/EQ=="
+		},
 		"node_modules/nanoid": {
 			"version": "3.1.25",
 			"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.25.tgz",
@@ -13451,9 +13463,9 @@ 				"node": ">= 6.0.0"
 			}
 		},
 		"node_modules/node-gyp-build": {
-			"version": "4.2.3",
-			"resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.2.3.tgz",
-			"integrity": "sha512-MN6ZpzmfNCRM+3t57PTJHgHyw/h4OWnZ6mR8P5j/uZtqQr46RRuDE/P+g3n0YR/AiYXeWixZZzaip77gdICfRg==",
+			"version": "4.3.0",
+			"resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.3.0.tgz",
+			"integrity": "sha512-iWjXZvmboq0ja1pUGULQBexmxq8CV4xBhX7VDOTbL7ZR4FOowwY/VOtRxBN/yKxmdGoIp4j5ysNT4u3S2pDQ3Q==",
 			"bin": {
 				"node-gyp-build": "bin.js",
 				"node-gyp-build-optional": "optional.js",
@@ -13541,9 +13553,9 @@ 				"which": "bin/which"
 			}
 		},
 		"node_modules/node-releases": {
-			"version": "1.1.75",
-			"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.75.tgz",
-			"integrity": "sha512-Qe5OUajvqrqDSy6wrWFmMwfJ0jVgwiw4T3KqmbTcZ62qW0gQkheXYhcFM1+lOVcGUoRxcEcfyvFMAnDgaF1VWw=="
+			"version": "1.1.76",
+			"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.76.tgz",
+			"integrity": "sha512-9/IECtNr8dXNmPWmFXepT0/7o5eolGesHUa3mtr0KlgnCvnZxwh2qensKL42JJY2vQKC3nIBXetFAqR+PW1CmA=="
 		},
 		"node_modules/nopt": {
 			"version": "4.0.3",
@@ -13720,9 +13732,9 @@ 				"set-blocking": "~2.0.0"
 			}
 		},
 		"node_modules/nth-check": {
-			"version": "2.0.0",
-			"resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.0.tgz",
-			"integrity": "sha512-i4sc/Kj8htBrAiH1viZ0TgU8Y5XqCaV/FziYK6TBczxmeKm3AEFWqqF3195yKudrarqy7Zu80Ra5dobFjn9X/Q==",
+			"version": "2.0.1",
+			"resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz",
+			"integrity": "sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==",
 			"dependencies": {
 				"boolbase": "^1.0.0"
 			},
@@ -13932,6 +13944,18 @@ 				"es-abstract": "^1.18.0-next.2"
 			},
 			"engines": {
 				"node": ">= 0.8"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/ljharb"
+			}
+		},
+		"node_modules/object.hasown": {
+			"version": "1.0.0",
+			"resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.0.0.tgz",
+			"integrity": "sha512-qYMF2CLIjxxLGleeM0jrcB4kiv3loGVAjKQKvH8pSU/i2VcRRvUNmxbD+nEMmrXRfORhuVJuH8OtSYCZoue3zA==",
+			"dependencies": {
+				"define-properties": "^1.1.3",
+				"es-abstract": "^1.18.1"
 			},
 			"funding": {
 				"url": "https://github.com/sponsors/ljharb"
@@ -15354,11 +15378,11 @@ 			"resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz",
 			"integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A=="
 		},
 		"node_modules/regenerate-unicode-properties": {
-			"version": "8.2.0",
-			"resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz",
-			"integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==",
+			"version": "9.0.0",
+			"resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-9.0.0.tgz",
+			"integrity": "sha512-3E12UeNSPfjrgwjkR81m5J7Aw/T55Tu7nUyZVQYCKEOs+2dkxEY+DpPtZzO4YruuiPb7NkYLVcyJC4+zCbk5pA==",
 			"dependencies": {
-				"regenerate": "^1.4.0"
+				"regenerate": "^1.4.2"
 			},
 			"engines": {
 				"node": ">=4"
@@ -15416,16 +15440,16 @@ 				"url": "https://github.com/sponsors/mysticatea"
 			}
 		},
 		"node_modules/regexpu-core": {
-			"version": "4.7.1",
-			"resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.1.tgz",
-			"integrity": "sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ==",
+			"version": "4.8.0",
+			"resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.8.0.tgz",
+			"integrity": "sha512-1F6bYsoYiz6is+oz70NWur2Vlh9KWtswuRuzJOfeYUrfPX2o8n74AnUVaOGDbUqVGO9fNHu48/pjJO4sNVwsOg==",
 			"dependencies": {
-				"regenerate": "^1.4.0",
-				"regenerate-unicode-properties": "^8.2.0",
-				"regjsgen": "^0.5.1",
-				"regjsparser": "^0.6.4",
-				"unicode-match-property-ecmascript": "^1.0.4",
-				"unicode-match-property-value-ecmascript": "^1.2.0"
+				"regenerate": "^1.4.2",
+				"regenerate-unicode-properties": "^9.0.0",
+				"regjsgen": "^0.5.2",
+				"regjsparser": "^0.7.0",
+				"unicode-match-property-ecmascript": "^2.0.0",
+				"unicode-match-property-value-ecmascript": "^2.0.0"
 			},
 			"engines": {
 				"node": ">=4"
@@ -15437,9 +15461,9 @@ 			"resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz",
 			"integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A=="
 		},
 		"node_modules/regjsparser": {
-			"version": "0.6.9",
-			"resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.9.tgz",
-			"integrity": "sha512-ZqbNRz1SNjLAiYuwY0zoXW8Ne675IX5q+YHioAGbCw4X96Mjl2+dcX9B2ciaeyYjViDAfvIjFpQjJgLttTEERQ==",
+			"version": "0.7.0",
+			"resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.7.0.tgz",
+			"integrity": "sha512-A4pcaORqmNMDVwUjWoTzuhwMGpP+NykpfqAsEgI1FSH/EzC7lrN5TMd+kN8YCovX+jMpu8eaqXgXPCa0g8FQNQ==",
 			"dependencies": {
 				"jsesc": "~0.5.0"
 			},
@@ -15803,7 +15827,6 @@ 		"node_modules/rollup-plugin-typescript2/node_modules/resolve": {
 			"version": "1.17.0",
 			"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz",
 			"integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==",
-			"license": "MIT",
 			"dependencies": {
 				"path-parse": "^1.0.6"
 			},
@@ -17160,11 +17183,11 @@ 				"node": ">=4"
 			}
 		},
 		"node_modules/strip-ansi": {
-			"version": "6.0.0",
-			"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
-			"integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
+			"version": "6.0.1",
+			"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+			"integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
 			"dependencies": {
-				"ansi-regex": "^5.0.0"
+				"ansi-regex": "^5.0.1"
 			},
 			"engines": {
 				"node": ">=8"
@@ -17322,9 +17345,9 @@ 				"node": ">=6"
 			}
 		},
 		"node_modules/tapable": {
-			"version": "2.2.0",
-			"resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.0.tgz",
-			"integrity": "sha512-FBk4IesMV1rBxX2tfiK8RAmogtWn53puLOQlvO8XuwlgxcYbP4mVPS9Ph4aeamSyyVjOl24aYWAuc8U5kCVwMw==",
+			"version": "2.2.1",
+			"resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz",
+			"integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==",
 			"engines": {
 				"node": ">=6"
 			}
@@ -18058,37 +18081,37 @@ 			"resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz",
 			"integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI="
 		},
 		"node_modules/unicode-canonical-property-names-ecmascript": {
-			"version": "1.0.4",
-			"resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz",
-			"integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==",
+			"version": "2.0.0",
+			"resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz",
+			"integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==",
 			"engines": {
 				"node": ">=4"
 			}
 		},
 		"node_modules/unicode-match-property-ecmascript": {
-			"version": "1.0.4",
-			"resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz",
-			"integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==",
+			"version": "2.0.0",
+			"resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz",
+			"integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==",
 			"dependencies": {
-				"unicode-canonical-property-names-ecmascript": "^1.0.4",
-				"unicode-property-aliases-ecmascript": "^1.0.4"
+				"unicode-canonical-property-names-ecmascript": "^2.0.0",
+				"unicode-property-aliases-ecmascript": "^2.0.0"
 			},
 			"engines": {
 				"node": ">=4"
 			}
 		},
 		"node_modules/unicode-match-property-value-ecmascript": {
-			"version": "1.2.0",
-			"resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz",
-			"integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==",
+			"version": "2.0.0",
+			"resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz",
+			"integrity": "sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==",
 			"engines": {
 				"node": ">=4"
 			}
 		},
 		"node_modules/unicode-property-aliases-ecmascript": {
-			"version": "1.1.0",
-			"resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz",
-			"integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==",
+			"version": "2.0.0",
+			"resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz",
+			"integrity": "sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==",
 			"engines": {
 				"node": ">=4"
 			}
@@ -19134,13 +19157,13 @@ 				"node": ">=8"
 			}
 		},
 		"node_modules/yargs/node_modules/string-width": {
-			"version": "4.2.2",
-			"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz",
-			"integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==",
+			"version": "4.2.3",
+			"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+			"integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
 			"dependencies": {
 				"emoji-regex": "^8.0.0",
 				"is-fullwidth-code-point": "^3.0.0",
-				"strip-ansi": "^6.0.0"
+				"strip-ansi": "^6.0.1"
 			},
 			"engines": {
 				"node": ">=8"
@@ -19382,18 +19405,18 @@ 				"@babel/types": "^7.15.4"
 			}
 		},
 		"@babel/helper-module-transforms": {
-			"version": "7.15.4",
-			"resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.15.4.tgz",
-			"integrity": "sha512-9fHHSGE9zTC++KuXLZcB5FKgvlV83Ox+NLUmQTawovwlJ85+QMhk1CnVk406CQVj97LaWod6KVjl2Sfgw9Aktw==",
+			"version": "7.15.7",
+			"resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.15.7.tgz",
+			"integrity": "sha512-ZNqjjQG/AuFfekFTY+7nY4RgBSklgTu970c7Rj3m/JOhIu5KPBUuTA9AY6zaKcUvk4g6EbDXdBnhi35FAssdSw==",
 			"requires": {
 				"@babel/helper-module-imports": "^7.15.4",
 				"@babel/helper-replace-supers": "^7.15.4",
 				"@babel/helper-simple-access": "^7.15.4",
 				"@babel/helper-split-export-declaration": "^7.15.4",
-				"@babel/helper-validator-identifier": "^7.14.9",
+				"@babel/helper-validator-identifier": "^7.15.7",
 				"@babel/template": "^7.15.4",
 				"@babel/traverse": "^7.15.4",
-				"@babel/types": "^7.15.4"
+				"@babel/types": "^7.15.6"
 			}
 		},
 		"@babel/helper-optimise-call-expression": {
@@ -19455,9 +19478,9 @@ 				"@babel/types": "^7.15.4"
 			}
 		},
 		"@babel/helper-validator-identifier": {
-			"version": "7.14.9",
-			"resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz",
-			"integrity": "sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g=="
+			"version": "7.15.7",
+			"resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz",
+			"integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w=="
 		},
 		"@babel/helper-validator-option": {
 			"version": "7.14.5",
@@ -19542,9 +19565,9 @@ 				}
 			}
 		},
 		"@babel/parser": {
-			"version": "7.15.6",
-			"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.6.tgz",
-			"integrity": "sha512-S/TSCcsRuCkmpUuoWijua0Snt+f3ewU/8spLo+4AXJCZfT0bVCzLD5MuOKdrx0mlAptbKzn5AdgEIIKXxXkz9Q=="
+			"version": "7.15.7",
+			"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.7.tgz",
+			"integrity": "sha512-rycZXvQ+xS9QyIcJ9HXeDWf1uxqlbVFAUq0Rq0dbc50Zb/+wUe/ehyfzGfm9KZZF0kBejYgxltBXocP+gKdL2g=="
 		},
 		"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": {
 			"version": "7.15.4",
@@ -20279,11 +20302,6 @@ 			"requires": {
 				"exec-sh": "^0.3.2",
 				"minimist": "^1.2.0"
 			}
-		},
-		"@ctrl/tinycolor": {
-			"version": "3.1.4",
-			"resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-3.1.4.tgz",
-			"integrity": "sha512-WHn6ClDzGS3oACt4F/k0B9QwhQCeXXRguYE6UFe6OD6wLdESU8RoMs7Y1+FEr4Tj2VZd9bfb1aEhnB9KoVrLEA=="
 		},
 		"@evocateur/libnpmaccess": {
 			"version": "3.1.2",
@@ -22871,9 +22889,9 @@ 				"type-fest": "^0.21.3"
 			}
 		},
 		"ansi-regex": {
-			"version": "5.0.0",
-			"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
-			"integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg=="
+			"version": "5.0.1",
+			"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+			"integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="
 		},
 		"ansi-styles": {
 			"version": "4.3.0",
@@ -23285,12 +23303,12 @@ 				}
 			}
 		},
 		"babel-plugin-polyfill-corejs3": {
-			"version": "0.2.4",
-			"resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.4.tgz",
-			"integrity": "sha512-z3HnJE5TY/j4EFEa/qpQMSbcUJZ5JQi+3UFjXzn6pQCmIKc5Ug5j98SuYyH+m4xQnvKlMDIW4plLfgyVnd0IcQ==",
+			"version": "0.2.5",
+			"resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.5.tgz",
+			"integrity": "sha512-ninF5MQNwAX9Z7c9ED+H2pGt1mXdP4TqzlHKyPIYmJIYz0N+++uwdM7RnJukklhzJ54Q84vA4ZJkgs7lu5vqcw==",
 			"requires": {
 				"@babel/helper-define-polyfill-provider": "^0.2.2",
-				"core-js-compat": "^3.14.0"
+				"core-js-compat": "^3.16.2"
 			}
 		},
 		"babel-plugin-polyfill-regenerator": {
@@ -23457,15 +23475,15 @@ 				}
 			}
 		},
 		"browserslist": {
-			"version": "4.17.0",
-			"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.17.0.tgz",
-			"integrity": "sha512-g2BJ2a0nEYvEFQC208q8mVAhfNwpZ5Mu8BwgtCdZKO3qx98HChmeg448fPdUzld8aFmfLgVh7yymqV+q1lJZ5g==",
+			"version": "4.17.1",
+			"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.17.1.tgz",
+			"integrity": "sha512-aLD0ZMDSnF4lUt4ZDNgqi5BUn9BZ7YdQdI/cYlILrhdSSZJLU9aNZoD5/NBmM4SK34APB2e83MOsRt1EnkuyaQ==",
 			"requires": {
-				"caniuse-lite": "^1.0.30001254",
-				"colorette": "^1.3.0",
-				"electron-to-chromium": "^1.3.830",
+				"caniuse-lite": "^1.0.30001259",
+				"electron-to-chromium": "^1.3.846",
 				"escalade": "^3.1.1",
-				"node-releases": "^1.1.75"
+				"nanocolors": "^0.1.5",
+				"node-releases": "^1.1.76"
 			}
 		},
 		"bs-logger": {
@@ -23643,9 +23661,12 @@ 				"quick-lru": "^4.0.1"
 			}
 		},
 		"caniuse-lite": {
-			"version": "1.0.30001255",
-			"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001255.tgz",
-			"integrity": "sha512-F+A3N9jTZL882f/fg/WWVnKSu6IOo3ueLz4zwaOPbPYHNmM/ZaDUyzyJwS1mZhX7Ex5jqTyW599Gdelh5PDYLQ=="
+			"version": "1.0.30001260",
+			"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001260.tgz",
+			"integrity": "sha512-Fhjc/k8725ItmrvW5QomzxLeojewxvqiYCKeFcfFEhut28IVLdpHU19dneOmltZQIE5HNbawj1HYD+1f2bM1Dg==",
+			"requires": {
+				"nanocolors": "^0.1.0"
+			}
 		},
 		"capture-exit": {
 			"version": "2.0.0",
@@ -23850,13 +23871,13 @@ 					"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
 					"integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="
 				},
 				"string-width": {
-					"version": "4.2.2",
-					"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz",
-					"integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==",
+					"version": "4.2.3",
+					"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+					"integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
 					"requires": {
 						"emoji-regex": "^8.0.0",
 						"is-fullwidth-code-point": "^3.0.0",
-						"strip-ansi": "^6.0.0"
+						"strip-ansi": "^6.0.1"
 					}
 				},
 				"wrap-ansi": {
@@ -24437,9 +24458,9 @@ 			"resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
 			"integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40="
 		},
 		"core-js-compat": {
-			"version": "3.17.3",
-			"resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.17.3.tgz",
-			"integrity": "sha512-+in61CKYs4hQERiADCJsdgewpdl/X0GhEX77pjKgbeibXviIt2oxEjTc8O2fqHX8mDdBrDvX8MYD/RYsBv4OiA==",
+			"version": "3.18.0",
+			"resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.18.0.tgz",
+			"integrity": "sha512-tRVjOJu4PxdXjRMEgbP7lqWy1TWJu9a01oBkn8d+dNrhgmBwdTkzhHZpVJnEmhISLdoJI1lX08rcBcHi3TZIWg==",
 			"requires": {
 				"browserslist": "^4.17.0",
 				"semver": "7.0.0"
@@ -24453,9 +24474,9 @@ 				}
 			}
 		},
 		"core-js-pure": {
-			"version": "3.17.3",
-			"resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.17.3.tgz",
-			"integrity": "sha512-YusrqwiOTTn8058JDa0cv9unbXdIiIgcgI9gXso0ey4WgkFLd3lYlV9rp9n7nDCsYxXsMDTjA4m1h3T348mdlQ=="
+			"version": "3.18.0",
+			"resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.18.0.tgz",
+			"integrity": "sha512-ZnK+9vyuMhKulIGqT/7RHGRok8RtkHMEX/BGPHkHx+ouDkq+MUvf9mfIgdqhpmPDu8+V5UtRn/CbCRc9I4lX4w=="
 		},
 		"core-util-is": {
 			"version": "1.0.2",
@@ -24530,6 +24551,11 @@ 					"resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz",
 					"integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg=="
 				}
 			}
+		},
+		"culori": {
+			"version": "0.20.1",
+			"resolved": "https://registry.npmjs.org/culori/-/culori-0.20.1.tgz",
+			"integrity": "sha512-jNZDmufWx4vCHW2fTb62sarHEeIF3WWrUYIv4ZpoQnN2vQU6IRPz1Ra9QnsHUKzdb5lppSuLsdB72rMmBMAd+A=="
 		},
 		"currently-unhandled": {
 			"version": "0.4.1",
@@ -24870,9 +24896,9 @@ 				"safer-buffer": "^2.1.0"
 			}
 		},
 		"electron-to-chromium": {
-			"version": "1.3.835",
-			"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.835.tgz",
-			"integrity": "sha512-rHQszGg2KLMqOWPNTpwCnlp7Kb85haJa8j089DJCreZueykoSN/in+EMlay3SSDMNKR4VGPvfskxofHV18xVJg=="
+			"version": "1.3.849",
+			"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.849.tgz",
+			"integrity": "sha512-RweyW60HPOqIcxoKTGr38Yvtf2aliSUqX8dB3e9geJ0Bno0YLjcOX5F7/DPVloBkJWaPZ7xOM1A0Yme2T1A34w=="
 		},
 		"emoji-regex": {
 			"version": "9.2.2",
@@ -25231,11 +25257,11 @@ 							"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
 							"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
 						},
 						"strip-ansi": {
-							"version": "6.0.0",
-							"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
-							"integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
+							"version": "6.0.1",
+							"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+							"integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
 							"requires": {
-								"ansi-regex": "^5.0.0"
+								"ansi-regex": "^5.0.1"
 							}
 						},
 						"supports-color": {
@@ -25301,21 +25327,21 @@ 					"resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
 					"integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM="
 				},
 				"string-width": {
-					"version": "4.2.2",
-					"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz",
-					"integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==",
+					"version": "4.2.3",
+					"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+					"integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
 					"requires": {
 						"emoji-regex": "^8.0.0",
 						"is-fullwidth-code-point": "^3.0.0",
-						"strip-ansi": "^6.0.0"
+						"strip-ansi": "^6.0.1"
 					},
 					"dependencies": {
 						"strip-ansi": {
-							"version": "6.0.0",
-							"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
-							"integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
+							"version": "6.0.1",
+							"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+							"integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
 							"requires": {
-								"ansi-regex": "^5.0.0"
+								"ansi-regex": "^5.0.1"
 							}
 						}
 					}
@@ -25603,22 +25629,23 @@ 				"prettier-linter-helpers": "^1.0.0"
 			}
 		},
 		"eslint-plugin-react": {
-			"version": "7.25.1",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.25.1.tgz",
-			"integrity": "sha512-P4j9K1dHoFXxDNP05AtixcJEvIT6ht8FhYKsrkY0MPCPaUMYijhpWwNiRDZVtA8KFuZOkGSeft6QwH8KuVpJug==",
+			"version": "7.26.0",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.26.0.tgz",
+			"integrity": "sha512-dceliS5itjk4EZdQYtLMz6GulcsasguIs+VTXuiC7Q5IPIdGTkyfXVdmsQOqEhlD9MciofH4cMcT1bw1WWNxCQ==",
 			"requires": {
 				"array-includes": "^3.1.3",
 				"array.prototype.flatmap": "^1.2.4",
 				"doctrine": "^2.1.0",
 				"estraverse": "^5.2.0",
-				"has": "^1.0.3",
 				"jsx-ast-utils": "^2.4.1 || ^3.0.0",
 				"minimatch": "^3.0.4",
 				"object.entries": "^1.1.4",
 				"object.fromentries": "^2.0.4",
+				"object.hasown": "^1.0.0",
 				"object.values": "^1.1.4",
 				"prop-types": "^15.7.2",
 				"resolve": "^2.0.0-next.3",
+				"semver": "^6.3.0",
 				"string.prototype.matchall": "^4.0.5"
 			},
 			"dependencies": {
@@ -25643,6 +25670,11 @@ 					"requires": {
 						"is-core-module": "^2.2.0",
 						"path-parse": "^1.0.6"
 					}
+				},
+				"semver": {
+					"version": "6.3.0",
+					"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+					"integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
 				}
 			}
 		},
@@ -25982,9 +26014,9 @@ 			"resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
 			"integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc="
 		},
 		"fastq": {
-			"version": "1.12.0",
-			"resolved": "https://registry.npmjs.org/fastq/-/fastq-1.12.0.tgz",
-			"integrity": "sha512-VNX0QkHK3RsXVKr9KrlUv/FoTa0NdbYoHHl7uXHv2rzyHSlxjdNAKug2twd9luJxpcyNeAgf5iPPMutJO67Dfg==",
+			"version": "1.13.0",
+			"resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz",
+			"integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==",
 			"requires": {
 				"reusify": "^1.0.4"
 			}
@@ -28039,9 +28071,9 @@ 			"resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
 			"integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo="
 		},
 		"istanbul-lib-coverage": {
-			"version": "3.0.0",
-			"resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz",
-			"integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg=="
+			"version": "3.0.1",
+			"resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.1.tgz",
+			"integrity": "sha512-GvCYYTxaCPqwMjobtVcVKvSHtAGe48MNhGjpK8LtVF8K0ISX7hCKl85LgtuaSneWVyQmaGcW3iXVV3GaZSLpmQ=="
 		},
 		"istanbul-lib-instrument": {
 			"version": "4.0.3",
@@ -28643,11 +28675,11 @@ 				"verror": "1.10.0"
 			}
 		},
 		"jsx-ast-utils": {
-			"version": "3.2.0",
-			"resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.2.0.tgz",
-			"integrity": "sha512-EIsmt3O3ljsU6sot/J4E1zDRxfBNrhjyf/OKjlydwgEimQuznlM4Wv7U+ueONJMyEn1WRE0K8dhi3dVAXYT24Q==",
+			"version": "3.2.1",
+			"resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.2.1.tgz",
+			"integrity": "sha512-uP5vu8xfy2F9A6LGC22KO7e2/vGTS1MhP+18f++ZNlf0Ohaxbc9nIEwHAsejlJKyzfZzU5UIhe5ItYkitcZnZA==",
 			"requires": {
-				"array-includes": "^3.1.2",
+				"array-includes": "^3.1.3",
 				"object.assign": "^4.1.2"
 			}
 		},
@@ -29527,9 +29559,9 @@ 				}
 			}
 		},
 		"mri": {
-			"version": "1.1.6",
-			"resolved": "https://registry.npmjs.org/mri/-/mri-1.1.6.tgz",
-			"integrity": "sha512-oi1b3MfbyGa7FJMP9GmLTttni5JoICpYBRlq+x5V16fZbLsnL9N3wFqqIm/nIG43FjUFkFh9Epzp/kzUGUnJxQ=="
+			"version": "1.2.0",
+			"resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz",
+			"integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA=="
 		},
 		"ms": {
 			"version": "2.1.2",
@@ -29568,6 +29600,11 @@ 				"any-promise": "^1.0.0",
 				"object-assign": "^4.0.1",
 				"thenify-all": "^1.0.0"
 			}
+		},
+		"nanocolors": {
+			"version": "0.1.12",
+			"resolved": "https://registry.npmjs.org/nanocolors/-/nanocolors-0.1.12.tgz",
+			"integrity": "sha512-2nMHqg1x5PU+unxX7PGY7AuYxl2qDx7PSrTRjizr8sxdd3l/3hBuWWaki62qmtYm2U5i4Z5E7GbjlyDFhs9/EQ=="
 		},
 		"nanoid": {
 			"version": "3.1.25",
@@ -29685,9 +29722,9 @@ 				}
 			}
 		},
 		"node-gyp-build": {
-			"version": "4.2.3",
-			"resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.2.3.tgz",
-			"integrity": "sha512-MN6ZpzmfNCRM+3t57PTJHgHyw/h4OWnZ6mR8P5j/uZtqQr46RRuDE/P+g3n0YR/AiYXeWixZZzaip77gdICfRg=="
+			"version": "4.3.0",
+			"resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.3.0.tgz",
+			"integrity": "sha512-iWjXZvmboq0ja1pUGULQBexmxq8CV4xBhX7VDOTbL7ZR4FOowwY/VOtRxBN/yKxmdGoIp4j5ysNT4u3S2pDQ3Q=="
 		},
 		"node-int64": {
 			"version": "0.4.0",
@@ -29730,9 +29767,9 @@ 				}
 			}
 		},
 		"node-releases": {
-			"version": "1.1.75",
-			"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.75.tgz",
-			"integrity": "sha512-Qe5OUajvqrqDSy6wrWFmMwfJ0jVgwiw4T3KqmbTcZ62qW0gQkheXYhcFM1+lOVcGUoRxcEcfyvFMAnDgaF1VWw=="
+			"version": "1.1.76",
+			"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.76.tgz",
+			"integrity": "sha512-9/IECtNr8dXNmPWmFXepT0/7o5eolGesHUa3mtr0KlgnCvnZxwh2qensKL42JJY2vQKC3nIBXetFAqR+PW1CmA=="
 		},
 		"nopt": {
 			"version": "4.0.3",
@@ -29890,9 +29927,9 @@ 				"set-blocking": "~2.0.0"
 			}
 		},
 		"nth-check": {
-			"version": "2.0.0",
-			"resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.0.tgz",
-			"integrity": "sha512-i4sc/Kj8htBrAiH1viZ0TgU8Y5XqCaV/FziYK6TBczxmeKm3AEFWqqF3195yKudrarqy7Zu80Ra5dobFjn9X/Q==",
+			"version": "2.0.1",
+			"resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz",
+			"integrity": "sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==",
 			"requires": {
 				"boolbase": "^1.0.0"
 			}
@@ -30045,6 +30082,15 @@ 			"requires": {
 				"call-bind": "^1.0.2",
 				"define-properties": "^1.1.3",
 				"es-abstract": "^1.18.0-next.2"
+			}
+		},
+		"object.hasown": {
+			"version": "1.0.0",
+			"resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.0.0.tgz",
+			"integrity": "sha512-qYMF2CLIjxxLGleeM0jrcB4kiv3loGVAjKQKvH8pSU/i2VcRRvUNmxbD+nEMmrXRfORhuVJuH8OtSYCZoue3zA==",
+			"requires": {
+				"define-properties": "^1.1.3",
+				"es-abstract": "^1.18.1"
 			}
 		},
 		"object.pick": {
@@ -31139,11 +31185,11 @@ 			"resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz",
 			"integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A=="
 		},
 		"regenerate-unicode-properties": {
-			"version": "8.2.0",
-			"resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz",
-			"integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==",
+			"version": "9.0.0",
+			"resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-9.0.0.tgz",
+			"integrity": "sha512-3E12UeNSPfjrgwjkR81m5J7Aw/T55Tu7nUyZVQYCKEOs+2dkxEY+DpPtZzO4YruuiPb7NkYLVcyJC4+zCbk5pA==",
 			"requires": {
-				"regenerate": "^1.4.0"
+				"regenerate": "^1.4.2"
 			}
 		},
 		"regenerator-runtime": {
@@ -31183,16 +31229,16 @@ 			"resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz",
 			"integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg=="
 		},
 		"regexpu-core": {
-			"version": "4.7.1",
-			"resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.1.tgz",
-			"integrity": "sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ==",
+			"version": "4.8.0",
+			"resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.8.0.tgz",
+			"integrity": "sha512-1F6bYsoYiz6is+oz70NWur2Vlh9KWtswuRuzJOfeYUrfPX2o8n74AnUVaOGDbUqVGO9fNHu48/pjJO4sNVwsOg==",
 			"requires": {
-				"regenerate": "^1.4.0",
-				"regenerate-unicode-properties": "^8.2.0",
-				"regjsgen": "^0.5.1",
-				"regjsparser": "^0.6.4",
-				"unicode-match-property-ecmascript": "^1.0.4",
-				"unicode-match-property-value-ecmascript": "^1.2.0"
+				"regenerate": "^1.4.2",
+				"regenerate-unicode-properties": "^9.0.0",
+				"regjsgen": "^0.5.2",
+				"regjsparser": "^0.7.0",
+				"unicode-match-property-ecmascript": "^2.0.0",
+				"unicode-match-property-value-ecmascript": "^2.0.0"
 			}
 		},
 		"regjsgen": {
@@ -31201,9 +31247,9 @@ 			"resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz",
 			"integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A=="
 		},
 		"regjsparser": {
-			"version": "0.6.9",
-			"resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.9.tgz",
-			"integrity": "sha512-ZqbNRz1SNjLAiYuwY0zoXW8Ne675IX5q+YHioAGbCw4X96Mjl2+dcX9B2ciaeyYjViDAfvIjFpQjJgLttTEERQ==",
+			"version": "0.7.0",
+			"resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.7.0.tgz",
+			"integrity": "sha512-A4pcaORqmNMDVwUjWoTzuhwMGpP+NykpfqAsEgI1FSH/EzC7lrN5TMd+kN8YCovX+jMpu8eaqXgXPCa0g8FQNQ==",
 			"requires": {
 				"jsesc": "~0.5.0"
 			},
@@ -32545,11 +32591,11 @@ 				"is-regexp": "^1.0.0"
 			}
 		},
 		"strip-ansi": {
-			"version": "6.0.0",
-			"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
-			"integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
+			"version": "6.0.1",
+			"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+			"integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
 			"requires": {
-				"ansi-regex": "^5.0.0"
+				"ansi-regex": "^5.0.1"
 			}
 		},
 		"strip-bom": {
@@ -32664,9 +32710,9 @@ 				}
 			}
 		},
 		"tapable": {
-			"version": "2.2.0",
-			"resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.0.tgz",
-			"integrity": "sha512-FBk4IesMV1rBxX2tfiK8RAmogtWn53puLOQlvO8XuwlgxcYbP4mVPS9Ph4aeamSyyVjOl24aYWAuc8U5kCVwMw=="
+			"version": "2.2.1",
+			"resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz",
+			"integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ=="
 		},
 		"tar": {
 			"version": "4.4.13",
@@ -33229,28 +33275,28 @@ 			"resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz",
 			"integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI="
 		},
 		"unicode-canonical-property-names-ecmascript": {
-			"version": "1.0.4",
-			"resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz",
-			"integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ=="
+			"version": "2.0.0",
+			"resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz",
+			"integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ=="
 		},
 		"unicode-match-property-ecmascript": {
-			"version": "1.0.4",
-			"resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz",
-			"integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==",
+			"version": "2.0.0",
+			"resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz",
+			"integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==",
 			"requires": {
-				"unicode-canonical-property-names-ecmascript": "^1.0.4",
-				"unicode-property-aliases-ecmascript": "^1.0.4"
+				"unicode-canonical-property-names-ecmascript": "^2.0.0",
+				"unicode-property-aliases-ecmascript": "^2.0.0"
 			}
 		},
 		"unicode-match-property-value-ecmascript": {
-			"version": "1.2.0",
-			"resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz",
-			"integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ=="
+			"version": "2.0.0",
+			"resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz",
+			"integrity": "sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw=="
 		},
 		"unicode-property-aliases-ecmascript": {
-			"version": "1.1.0",
-			"resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz",
-			"integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg=="
+			"version": "2.0.0",
+			"resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz",
+			"integrity": "sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ=="
 		},
 		"union-value": {
 			"version": "1.0.1",
@@ -34084,13 +34130,13 @@ 						"p-limit": "^2.2.0"
 					}
 				},
 				"string-width": {
-					"version": "4.2.2",
-					"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz",
-					"integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==",
+					"version": "4.2.3",
+					"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+					"integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
 					"requires": {
 						"emoji-regex": "^8.0.0",
 						"is-fullwidth-code-point": "^3.0.0",
-						"strip-ansi": "^6.0.0"
+						"strip-ansi": "^6.0.1"
 					}
 				},
 				"yargs-parser": {
M packages/tailwindcss-language-server/package.json -> packages/tailwindcss-language-server/package.json
diff --git a/packages/tailwindcss-language-server/package.json b/packages/tailwindcss-language-server/package.json
index 4ee6e4f26a83b25a2085a15b8299fff045ba2135..ebacb50d85cf06acd676fd606c466bfde713d9a8 100644
--- a/packages/tailwindcss-language-server/package.json
+++ b/packages/tailwindcss-language-server/package.json
@@ -21,7 +21,6 @@   "publishConfig": {
     "access": "public"
   },
   "devDependencies": {
-    "@ctrl/tinycolor": "3.1.4",
     "@parcel/watcher": "2.0.0-alpha.10",
     "@types/debounce": "1.2.0",
     "@types/node": "14.14.34",
@@ -29,6 +28,8 @@     "@types/vscode": "1.52.0",
     "@vercel/ncc": "0.28.4",
     "builtin-modules": "3.2.0",
     "chokidar": "3.5.1",
+    "color-name": "1.1.4",
+    "culori": "0.20.1",
     "debounce": "1.2.0",
     "detective": "5.2.0",
     "dlv": "1.1.3",
M packages/tailwindcss-language-server/src/server.ts -> packages/tailwindcss-language-server/src/server.ts
diff --git a/packages/tailwindcss-language-server/src/server.ts b/packages/tailwindcss-language-server/src/server.ts
index 1dea503890fb15e88605fe6ca67b7f9773d705a7..aa83b05c6390f786e0a81f4bd0fa0d08e1cad5ac 100644
--- a/packages/tailwindcss-language-server/src/server.ts
+++ b/packages/tailwindcss-language-server/src/server.ts
@@ -69,12 +69,15 @@   clearAllDiagnostics,
 } from './lsp/diagnosticsProvider'
 import { doCodeActions } from 'tailwindcss-language-service/src/codeActions/codeActionProvider'
 import { getDocumentColors } from 'tailwindcss-language-service/src/documentColorProvider'
-import { fromRatio, names as namedColors } from '@ctrl/tinycolor'
 import { debounce } from 'debounce'
 import { getModuleDependencies } from './util/getModuleDependencies'
 import assert from 'assert'
 // import postcssLoadConfig from 'postcss-load-config'
 import * as parcel from './watcher/index.js'
+import { generateRules } from 'tailwindcss-language-service/src/util/jit'
+import { getColor } from 'tailwindcss-language-service/src/util/color'
+import * as culori from 'culori'
+import namedColors from 'color-name'
 
 const CONFIG_FILE_GLOB = '{tailwind,tailwind.config}.{js,cjs}'
 const TRIGGER_CHARACTERS = [
@@ -101,7 +104,7 @@
 const connection =
   process.argv.length <= 2 ? createConnection(process.stdin, process.stdout) : createConnection()
 
-console.log = connection.console.log.bind(connection.console)
+// console.log = connection.console.log.bind(connection.console)
 console.error = connection.console.error.bind(connection.console)
 
 process.on('unhandledRejection', (e: any) => {
@@ -147,6 +150,15 @@       try {
         return option()
       } catch (_) {}
     }
+  }
+}
+
+function firstOptional<T>(...options: Array<() => T>): T | undefined {
+  for (let i = 0; i < options.length; i++) {
+    let option = options[i]
+    try {
+      return option()
+    } catch (_) {}
   }
 }
 
@@ -528,8 +540,8 @@         browserslist = __non_webpack_require__(browserslistPath)(undefined, { path: folder })
       }
 
       if (semver.gte(tailwindcssVersion, '1.99.0')) {
-        applyComplexClasses = __non_webpack_require__(
-          resolveFrom(tailwindDir, './lib/lib/substituteClassApplyAtRules')
+        applyComplexClasses = firstOptional(() =>
+          __non_webpack_require__(resolveFrom(tailwindDir, './lib/lib/substituteClassApplyAtRules'))
         )
       } else if (semver.gte(tailwindcssVersion, '1.7.0')) {
         applyComplexClasses = __non_webpack_require__(
@@ -551,6 +563,13 @@       let registerDependency = () => {}
 
       try {
         let createContext = first(
+          () => {
+            let createContextFn = __non_webpack_require__(
+              resolveFrom(configDir, 'tailwindcss/lib/lib/setupContextUtils')
+            ).createContext
+            assert.strictEqual(typeof createContextFn, 'function')
+            return (state) => createContextFn(state.config)
+          },
           () => {
             let createContextFn = __non_webpack_require__(
               resolveFrom(configDir, 'tailwindcss/lib/jit/lib/setupContextUtils')
@@ -582,17 +601,30 @@         )
 
         jitModules = {
           generateRules: {
-            module: __non_webpack_require__(
-              resolveFrom(configDir, 'tailwindcss/lib/jit/lib/generateRules')
-            ).generateRules,
+            module: first(
+              () =>
+                __non_webpack_require__(resolveFrom(configDir, 'tailwindcss/lib/lib/generateRules'))
+                  .generateRules,
+              () =>
+                __non_webpack_require__(
+                  resolveFrom(configDir, 'tailwindcss/lib/jit/lib/generateRules')
+                ).generateRules
+            ),
           },
           createContext: {
             module: createContext,
           },
           expandApplyAtRules: {
-            module: __non_webpack_require__(
-              resolveFrom(configDir, 'tailwindcss/lib/jit/lib/expandApplyAtRules')
-            ).default,
+            module: first(
+              () =>
+                __non_webpack_require__(
+                  resolveFrom(configDir, 'tailwindcss/lib/lib/expandApplyAtRules')
+                ).default,
+              () =>
+                __non_webpack_require__(
+                  resolveFrom(configDir, 'tailwindcss/lib/jit/lib/expandApplyAtRules')
+                ).default
+            ),
           },
         }
       } catch (_) {
@@ -728,6 +760,8 @@     let presetModes: any[] = []
     let presetVariants: any[] = []
     let originalConfig: any
 
+    let isV3 = semver.gte(tailwindcss.version, '2.99.0')
+
     let hook = new Hook(fs.realpathSync(state.configPath), (exports) => {
       originalConfig = klona(exports)
 
@@ -736,7 +770,7 @@       if (typeof separator !== 'string') {
         separator = ':'
       }
       dset(exports, sepLocation, `__TWSEP__${separator}__TWSEP__`)
-      exports.purge = []
+      exports[isV3 ? 'content' : 'purge'] = []
 
       let mode: any
       if (Array.isArray(exports.presets)) {
@@ -753,7 +787,9 @@         mode = exports.mode
       }
       delete exports.mode
 
-      if (state.modules.jit && mode === 'jit') {
+      let isJit = isV3 || (state.modules.jit && mode === 'jit')
+
+      if (isJit) {
         state.jit = true
         exports.variants = []
 
@@ -828,32 +864,42 @@
     if (state.jit) {
       state.jitContext = state.modules.jit.createContext.module(state)
       state.jitContext.tailwindConfig.separator = state.config.separator
+      if (state.jitContext.getClassList) {
+        state.classList = state.jitContext.getClassList().map((className) => {
+          return [className, { color: getColor(state, className) }]
+        })
+      }
     }
 
     let postcssResult: Result
-    try {
-      postcssResult = await postcss
-        .module([
-          // ...state.postcssPlugins.before.map((x) => x()),
-          tailwindcss.module(state.configPath),
-          // ...state.postcssPlugins.after.map((x) => x()),
-        ])
-        .process(
-          [
-            semver.gte(tailwindcss.version, '0.99.0') ? 'base' : 'preflight',
-            'components',
-            'utilities',
-          ]
-            .map((x) => `/*__tw_intellisense_layer_${x}__*/\n@tailwind ${x};`)
-            .join('\n'),
-          {
-            from: undefined,
-          }
-        )
-    } catch (error) {
-      throw error
-    } finally {
+
+    if (state.classList) {
       hook.unhook()
+    } else {
+      try {
+        postcssResult = await postcss
+          .module([
+            // ...state.postcssPlugins.before.map((x) => x()),
+            tailwindcss.module(state.configPath),
+            // ...state.postcssPlugins.after.map((x) => x()),
+          ])
+          .process(
+            [
+              semver.gte(tailwindcss.version, '0.99.0') ? 'base' : 'preflight',
+              'components',
+              'utilities',
+            ]
+              .map((x) => `/*__tw_intellisense_layer_${x}__*/\n@tailwind ${x};`)
+              .join('\n'),
+            {
+              from: undefined,
+            }
+          )
+      } catch (error) {
+        throw error
+      } finally {
+        hook.unhook()
+      }
     }
 
     if (state.dependencies) {
@@ -865,7 +911,9 @@
     state.configId = getConfigId(state.configPath, state.dependencies)
 
     state.plugins = await getPlugins(originalConfig)
-    state.classNames = (await extractClassNames(postcssResult.root)) as ClassNames
+    if (postcssResult) {
+      state.classNames = (await extractClassNames(postcssResult.root)) as ClassNames
+    }
     state.variants = getVariants(state)
 
     let screens = dlv(state.config, 'theme.screens', dlv(state.config, 'screens', {}))
@@ -939,16 +987,25 @@
       let currentColor = match[1]
 
       let isNamedColor = colorNames.includes(currentColor)
-      let color = fromRatio({
+
+      let color: culori.RgbColor = {
+        mode: 'rgb',
         r: params.color.red,
         g: params.color.green,
         b: params.color.blue,
-        a: params.color.alpha,
-      })
+        alpha: params.color.alpha,
+      }
+
+      let hexValue = culori.formatHex8(color)
+
+      if (!isNamedColor && (currentColor.length === 4 || currentColor.length === 5)) {
+        let [, ...chars] =
+          hexValue.match(/^#([a-f\d])\1([a-f\d])\2([a-f\d])\3(?:([a-f\d])\4)?$/i) ?? []
+        if (chars.length) {
+          hexValue = `#${chars.filter(Boolean).join('')}`
+        }
+      }
 
-      let hexValue = color.toHex8String(
-        !isNamedColor && (currentColor.length === 4 || currentColor.length === 5)
-      )
       if (hexValue.length === 5) {
         hexValue = hexValue.replace(/f$/, '')
       } else if (hexValue.length === 9) {
@@ -959,8 +1016,12 @@       let prefix = className.substr(0, match.index)
 
       return [
         hexValue,
-        color.toRgbString().replace(/ /g, ''),
-        color.toHslString().replace(/ /g, ''),
+        culori.formatRgb(color).replace(/ /g, ''),
+        culori
+          .formatHsl(color)
+          .replace(/ /g, '')
+          // round numbers
+          .replace(/\d+\.\d+(%?)/g, (value, suffix) => `${Math.round(parseFloat(value))}${suffix}`),
       ].map((value) => ({ label: `${prefix}-[${value}]` }))
     },
   }
M packages/tailwindcss-language-server/tsconfig.json -> packages/tailwindcss-language-server/tsconfig.json
diff --git a/packages/tailwindcss-language-server/tsconfig.json b/packages/tailwindcss-language-server/tsconfig.json
index 7f465cf0687492edb4bedaaff83fec69b7a0070b..96f05fe9f171f9283900a45d277026f57c18dff9 100755
--- a/packages/tailwindcss-language-server/tsconfig.json
+++ b/packages/tailwindcss-language-server/tsconfig.json
@@ -14,5 +14,5 @@     "paths": {
       "tailwindcss-language-service/*": ["../packages/tailwindcss-language-service/*"]
     }
   },
-  "include": ["src", "../packages/tailwindcss-language-service"]
+  "include": ["src", "../packages/tailwindcss-language-service", "../../types"]
 }
M packages/tailwindcss-language-service/package-lock.json -> packages/tailwindcss-language-service/package-lock.json
diff --git a/packages/tailwindcss-language-service/package-lock.json b/packages/tailwindcss-language-service/package-lock.json
index cad4480500a5eb513e1f606e460d01446f1ea6ed..ec29cda5ed139a06170edf12e2b7788ba8a5d208 100644
--- a/packages/tailwindcss-language-service/package-lock.json
+++ b/packages/tailwindcss-language-service/package-lock.json
@@ -1,15 +1,16 @@
 {
   "name": "tailwindcss-language-service",
-  "version": "0.0.17",
+  "version": "0.0.20",
   "lockfileVersion": 2,
   "requires": true,
   "packages": {
     "": {
-      "version": "0.0.17",
+      "version": "0.0.20",
       "dependencies": {
-        "@ctrl/tinycolor": "3.1.4",
         "@types/moo": "0.5.3",
+        "color-name": "1.1.4",
         "css.escape": "1.5.1",
+        "culori": "0.20.1",
         "detect-indent": "6.0.0",
         "dlv": "1.1.3",
         "dset": "2.0.1",
@@ -20,6 +21,7 @@         "postcss": "8.2.6",
         "postcss-selector-parser": "6.0.2",
         "semver": "7.3.2",
         "sift-string": "0.0.2",
+        "stringify-object": "3.3.0",
         "vscode-emmet-helper-bundled": "0.0.1",
         "vscode-languageclient": "7.0.0",
         "vscode-languageserver": "7.0.0",
@@ -1350,14 +1352,6 @@       "engines": {
         "node": ">=0.1.95"
       }
     },
-    "node_modules/@ctrl/tinycolor": {
-      "version": "3.1.4",
-      "resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-3.1.4.tgz",
-      "integrity": "sha512-WHn6ClDzGS3oACt4F/k0B9QwhQCeXXRguYE6UFe6OD6wLdESU8RoMs7Y1+FEr4Tj2VZd9bfb1aEhnB9KoVrLEA==",
-      "engines": {
-        "node": ">=10.19.0"
-      }
-    },
     "node_modules/@istanbuljs/load-nyc-config": {
       "version": "1.1.0",
       "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz",
@@ -1457,12 +1451,6 @@       "engines": {
         "node": ">=7.0.0"
       }
     },
-    "node_modules/@jest/console/node_modules/color-name": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-      "dev": true
-    },
     "node_modules/@jest/console/node_modules/has-flag": {
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
@@ -1571,12 +1559,6 @@       },
       "engines": {
         "node": ">=7.0.0"
       }
-    },
-    "node_modules/@jest/core/node_modules/color-name": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-      "dev": true
     },
     "node_modules/@jest/core/node_modules/has-flag": {
       "version": "4.0.0",
@@ -1748,12 +1730,6 @@       "engines": {
         "node": ">=7.0.0"
       }
     },
-    "node_modules/@jest/reporters/node_modules/color-name": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-      "dev": true
-    },
     "node_modules/@jest/reporters/node_modules/has-flag": {
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
@@ -1918,12 +1894,6 @@       "engines": {
         "node": ">=7.0.0"
       }
     },
-    "node_modules/@jest/transform/node_modules/color-name": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-      "dev": true
-    },
     "node_modules/@jest/transform/node_modules/has-flag": {
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
@@ -2009,12 +1979,6 @@       "engines": {
         "node": ">=7.0.0"
       }
     },
-    "node_modules/@jest/types/node_modules/color-name": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-      "dev": true
-    },
     "node_modules/@jest/types/node_modules/has-flag": {
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
@@ -2856,12 +2820,6 @@       "engines": {
         "node": ">=7.0.0"
       }
     },
-    "node_modules/babel-jest/node_modules/color-name": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-      "dev": true
-    },
     "node_modules/babel-jest/node_modules/has-flag": {
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
@@ -3463,12 +3421,6 @@       "engines": {
         "node": ">=7.0.0"
       }
     },
-    "node_modules/cliui/node_modules/color-name": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-      "dev": true
-    },
     "node_modules/cliui/node_modules/strip-ansi": {
       "version": "6.0.0",
       "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
@@ -3542,11 +3494,16 @@       "dependencies": {
         "color-name": "1.1.3"
       }
     },
-    "node_modules/color-name": {
+    "node_modules/color-convert/node_modules/color-name": {
       "version": "1.1.3",
       "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
       "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
       "dev": true
+    },
+    "node_modules/color-name": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
     },
     "node_modules/colorette": {
       "version": "1.2.2",
@@ -3742,6 +3699,11 @@       "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz",
       "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==",
       "dev": true
     },
+    "node_modules/culori": {
+      "version": "0.20.1",
+      "resolved": "https://registry.npmjs.org/culori/-/culori-0.20.1.tgz",
+      "integrity": "sha512-jNZDmufWx4vCHW2fTb62sarHEeIF3WWrUYIv4ZpoQnN2vQU6IRPz1Ra9QnsHUKzdb5lppSuLsdB72rMmBMAd+A=="
+    },
     "node_modules/damerau-levenshtein": {
       "version": "1.0.6",
       "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.6.tgz",
@@ -4843,12 +4805,6 @@       "engines": {
         "node": ">=7.0.0"
       }
     },
-    "node_modules/expect/node_modules/color-name": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-      "dev": true
-    },
     "node_modules/extend": {
       "version": "3.0.2",
       "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
@@ -5208,6 +5164,11 @@       },
       "funding": {
         "url": "https://github.com/sponsors/ljharb"
       }
+    },
+    "node_modules/get-own-enumerable-property-symbols": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz",
+      "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g=="
     },
     "node_modules/get-package-type": {
       "version": "0.1.0",
@@ -5673,12 +5634,6 @@       "engines": {
         "node": ">=7.0.0"
       }
     },
-    "node_modules/inquirer/node_modules/color-name": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-      "dev": true
-    },
     "node_modules/inquirer/node_modules/has-flag": {
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
@@ -5942,6 +5897,14 @@       "engines": {
         "node": ">=0.12.0"
       }
     },
+    "node_modules/is-obj": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz",
+      "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
     "node_modules/is-plain-object": {
       "version": "2.0.4",
       "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
@@ -5985,6 +5948,14 @@         "node": ">= 0.4"
       },
       "funding": {
         "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/is-regexp": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz",
+      "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=",
+      "engines": {
+        "node": ">=0.10.0"
       }
     },
     "node_modules/is-stream": {
@@ -6361,12 +6332,6 @@       },
       "engines": {
         "node": ">=7.0.0"
       }
-    },
-    "node_modules/jest-cli/node_modules/color-name": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-      "dev": true
     },
     "node_modules/jest-cli/node_modules/has-flag": {
       "version": "4.0.0",
@@ -6459,12 +6424,6 @@       "engines": {
         "node": ">=7.0.0"
       }
     },
-    "node_modules/jest-config/node_modules/color-name": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-      "dev": true
-    },
     "node_modules/jest-config/node_modules/has-flag": {
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
@@ -6540,12 +6499,6 @@       },
       "engines": {
         "node": ">=7.0.0"
       }
-    },
-    "node_modules/jest-diff/node_modules/color-name": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-      "dev": true
     },
     "node_modules/jest-diff/node_modules/has-flag": {
       "version": "4.0.0",
@@ -6636,12 +6589,6 @@       "engines": {
         "node": ">=7.0.0"
       }
     },
-    "node_modules/jest-each/node_modules/color-name": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-      "dev": true
-    },
     "node_modules/jest-each/node_modules/has-flag": {
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
@@ -6858,12 +6805,6 @@       "engines": {
         "node": ">=7.0.0"
       }
     },
-    "node_modules/jest-jasmine2/node_modules/color-name": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-      "dev": true
-    },
     "node_modules/jest-jasmine2/node_modules/has-flag": {
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
@@ -6953,12 +6894,6 @@       "engines": {
         "node": ">=7.0.0"
       }
     },
-    "node_modules/jest-matcher-utils/node_modules/color-name": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-      "dev": true
-    },
     "node_modules/jest-matcher-utils/node_modules/has-flag": {
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
@@ -7038,12 +6973,6 @@       },
       "engines": {
         "node": ">=7.0.0"
       }
-    },
-    "node_modules/jest-message-util/node_modules/color-name": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-      "dev": true
     },
     "node_modules/jest-message-util/node_modules/has-flag": {
       "version": "4.0.0",
@@ -7177,12 +7106,6 @@       },
       "engines": {
         "node": ">=7.0.0"
       }
-    },
-    "node_modules/jest-resolve/node_modules/color-name": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-      "dev": true
     },
     "node_modules/jest-resolve/node_modules/has-flag": {
       "version": "4.0.0",
@@ -7325,12 +7248,6 @@       "engines": {
         "node": ">=7.0.0"
       }
     },
-    "node_modules/jest-runner/node_modules/color-name": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-      "dev": true
-    },
     "node_modules/jest-runner/node_modules/has-flag": {
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
@@ -7445,12 +7362,6 @@       "engines": {
         "node": ">=7.0.0"
       }
     },
-    "node_modules/jest-runtime/node_modules/color-name": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-      "dev": true
-    },
     "node_modules/jest-runtime/node_modules/has-flag": {
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
@@ -7559,12 +7470,6 @@       "engines": {
         "node": ">=7.0.0"
       }
     },
-    "node_modules/jest-snapshot/node_modules/color-name": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-      "dev": true
-    },
     "node_modules/jest-snapshot/node_modules/has-flag": {
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
@@ -7651,12 +7556,6 @@       "engines": {
         "node": ">=7.0.0"
       }
     },
-    "node_modules/jest-util/node_modules/color-name": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-      "dev": true
-    },
     "node_modules/jest-util/node_modules/has-flag": {
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
@@ -7744,12 +7643,6 @@       "engines": {
         "node": ">=7.0.0"
       }
     },
-    "node_modules/jest-validate/node_modules/color-name": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-      "dev": true
-    },
     "node_modules/jest-validate/node_modules/has-flag": {
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
@@ -7835,12 +7728,6 @@       "engines": {
         "node": ">=7.0.0"
       }
     },
-    "node_modules/jest-watch-typeahead/node_modules/color-name": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-      "dev": true
-    },
     "node_modules/jest-watch-typeahead/node_modules/has-flag": {
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
@@ -7931,12 +7818,6 @@       "engines": {
         "node": ">=7.0.0"
       }
     },
-    "node_modules/jest-watcher/node_modules/color-name": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-      "dev": true
-    },
     "node_modules/jest-watcher/node_modules/has-flag": {
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
@@ -9117,12 +8998,6 @@       "engines": {
         "node": ">=7.0.0"
       }
     },
-    "node_modules/ora/node_modules/color-name": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-      "dev": true
-    },
     "node_modules/ora/node_modules/has-flag": {
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
@@ -9555,12 +9430,6 @@       },
       "engines": {
         "node": ">=7.0.0"
       }
-    },
-    "node_modules/pretty-format/node_modules/color-name": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-      "dev": true
     },
     "node_modules/progress": {
       "version": "2.0.3",
@@ -11386,6 +11255,19 @@         "node": ">= 0.4"
       },
       "funding": {
         "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/stringify-object": {
+      "version": "3.3.0",
+      "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz",
+      "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==",
+      "dependencies": {
+        "get-own-enumerable-property-symbols": "^3.0.0",
+        "is-obj": "^1.0.1",
+        "is-regexp": "^1.0.0"
+      },
+      "engines": {
+        "node": ">=4"
       }
     },
     "node_modules/strip-ansi": {
@@ -11858,12 +11740,6 @@       "engines": {
         "node": ">=7.0.0"
       }
     },
-    "node_modules/tsdx/node_modules/color-name": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-      "dev": true
-    },
     "node_modules/tsdx/node_modules/has-flag": {
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
@@ -13724,11 +13600,6 @@         "exec-sh": "^0.3.2",
         "minimist": "^1.2.0"
       }
     },
-    "@ctrl/tinycolor": {
-      "version": "3.1.4",
-      "resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-3.1.4.tgz",
-      "integrity": "sha512-WHn6ClDzGS3oACt4F/k0B9QwhQCeXXRguYE6UFe6OD6wLdESU8RoMs7Y1+FEr4Tj2VZd9bfb1aEhnB9KoVrLEA=="
-    },
     "@istanbuljs/load-nyc-config": {
       "version": "1.1.0",
       "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz",
@@ -13802,12 +13673,6 @@           "dev": true,
           "requires": {
             "color-name": "~1.1.4"
           }
-        },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-          "dev": true
         },
         "has-flag": {
           "version": "4.0.0",
@@ -13896,12 +13761,6 @@           "requires": {
             "color-name": "~1.1.4"
           }
         },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-          "dev": true
-        },
         "has-flag": {
           "version": "4.0.0",
           "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
@@ -14033,12 +13892,6 @@           "requires": {
             "color-name": "~1.1.4"
           }
         },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-          "dev": true
-        },
         "has-flag": {
           "version": "4.0.0",
           "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
@@ -14168,12 +14021,6 @@           "requires": {
             "color-name": "~1.1.4"
           }
         },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-          "dev": true
-        },
         "has-flag": {
           "version": "4.0.0",
           "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
@@ -14236,12 +14083,6 @@           "dev": true,
           "requires": {
             "color-name": "~1.1.4"
           }
-        },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-          "dev": true
         },
         "has-flag": {
           "version": "4.0.0",
@@ -14872,12 +14713,6 @@           "requires": {
             "color-name": "~1.1.4"
           }
         },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-          "dev": true
-        },
         "has-flag": {
           "version": "4.0.0",
           "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
@@ -15359,12 +15194,6 @@           "requires": {
             "color-name": "~1.1.4"
           }
         },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-          "dev": true
-        },
         "strip-ansi": {
           "version": "6.0.0",
           "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
@@ -15422,13 +15251,20 @@       "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
       "dev": true,
       "requires": {
         "color-name": "1.1.3"
+      },
+      "dependencies": {
+        "color-name": {
+          "version": "1.1.3",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+          "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
+          "dev": true
+        }
       }
     },
     "color-name": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
-      "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
-      "dev": true
+      "version": "1.1.4",
+      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
     },
     "colorette": {
       "version": "1.2.2",
@@ -15590,6 +15426,11 @@           "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==",
           "dev": true
         }
       }
+    },
+    "culori": {
+      "version": "0.20.1",
+      "resolved": "https://registry.npmjs.org/culori/-/culori-0.20.1.tgz",
+      "integrity": "sha512-jNZDmufWx4vCHW2fTb62sarHEeIF3WWrUYIv4ZpoQnN2vQU6IRPz1Ra9QnsHUKzdb5lppSuLsdB72rMmBMAd+A=="
     },
     "damerau-levenshtein": {
       "version": "1.0.6",
@@ -16437,12 +16278,6 @@           "dev": true,
           "requires": {
             "color-name": "~1.1.4"
           }
-        },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-          "dev": true
         }
       }
     },
@@ -16730,6 +16565,11 @@         "has": "^1.0.3",
         "has-symbols": "^1.0.1"
       }
     },
+    "get-own-enumerable-property-symbols": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz",
+      "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g=="
+    },
     "get-package-type": {
       "version": "0.1.0",
       "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz",
@@ -17089,12 +16929,6 @@           "requires": {
             "color-name": "~1.1.4"
           }
         },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-          "dev": true
-        },
         "has-flag": {
           "version": "4.0.0",
           "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
@@ -17282,6 +17116,11 @@       "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
       "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
       "dev": true
     },
+    "is-obj": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz",
+      "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8="
+    },
     "is-plain-object": {
       "version": "2.0.4",
       "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
@@ -17317,6 +17156,11 @@       "requires": {
         "has-symbols": "^1.0.1"
       }
     },
+    "is-regexp": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz",
+      "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk="
+    },
     "is-stream": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz",
@@ -17601,12 +17445,6 @@           "requires": {
             "color-name": "~1.1.4"
           }
         },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-          "dev": true
-        },
         "has-flag": {
           "version": "4.0.0",
           "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
@@ -17679,12 +17517,6 @@           "requires": {
             "color-name": "~1.1.4"
           }
         },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-          "dev": true
-        },
         "has-flag": {
           "version": "4.0.0",
           "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
@@ -17742,12 +17574,6 @@           "requires": {
             "color-name": "~1.1.4"
           }
         },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-          "dev": true
-        },
         "has-flag": {
           "version": "4.0.0",
           "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
@@ -17815,12 +17641,6 @@           "requires": {
             "color-name": "~1.1.4"
           }
         },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-          "dev": true
-        },
         "has-flag": {
           "version": "4.0.0",
           "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
@@ -17990,12 +17810,6 @@           "requires": {
             "color-name": "~1.1.4"
           }
         },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-          "dev": true
-        },
         "has-flag": {
           "version": "4.0.0",
           "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
@@ -18063,12 +17877,6 @@           "requires": {
             "color-name": "~1.1.4"
           }
         },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-          "dev": true
-        },
         "has-flag": {
           "version": "4.0.0",
           "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
@@ -18130,12 +17938,6 @@           "requires": {
             "color-name": "~1.1.4"
           }
         },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-          "dev": true
-        },
         "has-flag": {
           "version": "4.0.0",
           "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
@@ -18219,12 +18021,6 @@           "dev": true,
           "requires": {
             "color-name": "~1.1.4"
           }
-        },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-          "dev": true
         },
         "has-flag": {
           "version": "4.0.0",
@@ -18346,12 +18142,6 @@           "requires": {
             "color-name": "~1.1.4"
           }
         },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-          "dev": true
-        },
         "has-flag": {
           "version": "4.0.0",
           "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
@@ -18441,12 +18231,6 @@           "requires": {
             "color-name": "~1.1.4"
           }
         },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-          "dev": true
-        },
         "has-flag": {
           "version": "4.0.0",
           "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
@@ -18530,12 +18314,6 @@           "requires": {
             "color-name": "~1.1.4"
           }
         },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-          "dev": true
-        },
         "has-flag": {
           "version": "4.0.0",
           "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
@@ -18600,12 +18378,6 @@           "requires": {
             "color-name": "~1.1.4"
           }
         },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-          "dev": true
-        },
         "has-flag": {
           "version": "4.0.0",
           "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
@@ -18671,12 +18443,6 @@           "requires": {
             "color-name": "~1.1.4"
           }
         },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-          "dev": true
-        },
         "has-flag": {
           "version": "4.0.0",
           "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
@@ -18742,12 +18508,6 @@           "dev": true,
           "requires": {
             "color-name": "~1.1.4"
           }
-        },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-          "dev": true
         },
         "has-flag": {
           "version": "4.0.0",
@@ -18816,12 +18576,6 @@           "dev": true,
           "requires": {
             "color-name": "~1.1.4"
           }
-        },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-          "dev": true
         },
         "has-flag": {
           "version": "4.0.0",
@@ -19768,12 +19522,6 @@           "requires": {
             "color-name": "~1.1.4"
           }
         },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-          "dev": true
-        },
         "has-flag": {
           "version": "4.0.0",
           "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
@@ -20085,12 +19833,6 @@           "dev": true,
           "requires": {
             "color-name": "~1.1.4"
           }
-        },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-          "dev": true
         }
       }
     },
@@ -21578,6 +21320,16 @@           }
         }
       }
     },
+    "stringify-object": {
+      "version": "3.3.0",
+      "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz",
+      "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==",
+      "requires": {
+        "get-own-enumerable-property-symbols": "^3.0.0",
+        "is-obj": "^1.0.1",
+        "is-regexp": "^1.0.0"
+      }
+    },
     "strip-ansi": {
       "version": "5.2.0",
       "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
@@ -21954,12 +21706,6 @@           "dev": true,
           "requires": {
             "color-name": "~1.1.4"
           }
-        },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-          "dev": true
         },
         "has-flag": {
           "version": "4.0.0",
M packages/tailwindcss-language-service/package.json -> packages/tailwindcss-language-service/package.json
diff --git a/packages/tailwindcss-language-service/package.json b/packages/tailwindcss-language-service/package.json
index 60e397c02f28efedb53848e91cab7b0580d36872..2afb3c13b9a6b02815b1e54f3722416a9ec340d9 100644
--- a/packages/tailwindcss-language-service/package.json
+++ b/packages/tailwindcss-language-service/package.json
@@ -1,6 +1,6 @@
 {
   "name": "tailwindcss-language-service",
-  "version": "0.0.17",
+  "version": "0.0.20",
   "main": "dist/index.js",
   "typings": "dist/index.d.ts",
   "files": [
@@ -14,9 +14,10 @@     "lint": "tsdx lint",
     "prepublishOnly": "npm run build"
   },
   "dependencies": {
-    "@ctrl/tinycolor": "3.1.4",
     "@types/moo": "0.5.3",
+    "color-name": "1.1.4",
     "css.escape": "1.5.1",
+    "culori": "0.20.1",
     "detect-indent": "6.0.0",
     "dlv": "1.1.3",
     "dset": "2.0.1",
M packages/tailwindcss-language-service/src/completionProvider.ts -> packages/tailwindcss-language-service/src/completionProvider.ts
diff --git a/packages/tailwindcss-language-service/src/completionProvider.ts b/packages/tailwindcss-language-service/src/completionProvider.ts
index f873c6fc6c151c9ae388250b4c2a51482125036e..e8a3140a508c159de5b61551a4c05c15d0a9a170 100644
--- a/packages/tailwindcss-language-service/src/completionProvider.ts
+++ b/packages/tailwindcss-language-service/src/completionProvider.ts
@@ -31,8 +31,8 @@ import { flagEnabled } from './util/flagEnabled'
 import { remToPx } from './util/remToPx'
 import { createMultiRegexp } from './util/createMultiRegexp'
 import * as jit from './util/jit'
-import { TinyColor } from '@ctrl/tinycolor'
 import { getVariantsFromClassName } from './util/getVariantsFromClassName'
+import * as culori from 'culori'
 
 let isUtil = (className) =>
   Array.isArray(className.__info)
@@ -89,8 +89,8 @@
             const color = getColor(state, className)
             if (color !== null) {
               kind = 16
-              if (typeof color !== 'string') {
-                documentation = color.toRgbString().replace(/(^rgba\([^)]+) 0\)$/, '$1 0.001)')
+              if (typeof color !== 'string' && (color.alpha ?? 1) !== 0) {
+                documentation = culori.formatRgb(color)
               }
             }
 
@@ -169,6 +169,34 @@           })
       )
     }
 
+    if (state.classList) {
+      return {
+        isIncomplete: false,
+        items: items.concat(
+          state.classList.map(([className, { color }], index) => {
+            let kind: CompletionItemKind = color ? 16 : 21
+            let documentation = null
+
+            if (color && typeof color !== 'string') {
+              documentation = culori.formatRgb(color)
+            }
+
+            return {
+              label: className,
+              kind,
+              documentation,
+              sortText: naturalExpand(index),
+              data: [...existingVariants, important ? `!${className}` : className],
+              textEdit: {
+                newText: className,
+                range: replacementRange,
+              },
+            } as CompletionItem
+          })
+        ),
+      }
+    }
+
     return {
       isIncomplete: false,
       items: items
@@ -188,8 +216,8 @@
               const color = getColor(state, className)
               if (color !== null) {
                 kind = 16
-                if (typeof color !== 'string' && color.a !== 0) {
-                  documentation = color.toRgbString()
+                if (typeof color !== 'string' && (color.alpha ?? 1) !== 0) {
+                  documentation = culori.formatRgb(color)
                 }
               }
 
@@ -269,8 +297,8 @@
             const color = getColor(state, className)
             if (color !== null) {
               kind = 16
-              if (typeof color !== 'string' && color.a !== 0) {
-                documentation = color.toRgbString()
+              if (typeof color !== 'string' && (color.alpha ?? 1) !== 0) {
+                documentation = culori.formatRgb(color)
               }
             }
 
@@ -552,7 +580,10 @@         sortText: naturalExpand(index),
         kind: color ? 16 : isObject(obj[item]) ? 9 : 10,
         // VS Code bug causes some values to not display in some cases
         detail: detail === '0' || detail === 'transparent' ? `${detail} ` : detail,
-        documentation: color instanceof TinyColor && color.a !== 0 ? color.toRgbString() : null,
+        documentation:
+          color && typeof color !== 'string' && (color.alpha ?? 1) !== 0
+            ? culori.formatRgb(color)
+            : null,
         textEdit: {
           newText: `${replaceDot ? '[' : ''}${item}${insertClosingBrace ? ']' : ''}`,
           range: {
@@ -680,6 +711,10 @@   if (!isCssContext(state, document, position)) {
     return null
   }
 
+  if (semver.gte(state.version, '2.99.0')) {
+    return null
+  }
+
   let text = document.getText({
     start: { line: position.line, character: 0 },
     end: position,
@@ -831,29 +866,11 @@     {
       label: '@tailwind',
       documentation: {
         kind: 'markdown' as typeof MarkupKind.Markdown,
-        value: `Use the \`@tailwind\` directive to insert Tailwind’s \`base\`, \`components\`, \`utilities\` and \`screens\` styles into your CSS.\n\n[Tailwind CSS Documentation](${docsUrl(
+        value: `Use the \`@tailwind\` directive to insert Tailwind’s \`base\`, \`components\`, \`utilities\` and \`${
+          state.jit && semver.gte(state.version, '2.1.99') ? 'variants' : 'screens'
+        }\` styles into your CSS.\n\n[Tailwind CSS Documentation](${docsUrl(
           state.version,
           'functions-and-directives/#tailwind'
-        )})`,
-      },
-    },
-    {
-      label: '@variants',
-      documentation: {
-        kind: 'markdown' as typeof MarkupKind.Markdown,
-        value: `You can generate \`responsive\`, \`hover\`, \`focus\`, \`active\`, and \`group-hover\` versions of your own utilities by wrapping their definitions in the \`@variants\` directive.\n\n[Tailwind CSS Documentation](${docsUrl(
-          state.version,
-          'functions-and-directives/#variants'
-        )})`,
-      },
-    },
-    {
-      label: '@responsive',
-      documentation: {
-        kind: 'markdown' as typeof MarkupKind.Markdown,
-        value: `You can generate responsive variants of your own classes by wrapping their definitions in the \`@responsive\` directive.\n\n[Tailwind CSS Documentation](${docsUrl(
-          state.version,
-          'functions-and-directives/#responsive'
         )})`,
       },
     },
@@ -891,6 +908,30 @@             },
           },
         ]
       : []),
+    ...(semver.gte(state.version, '2.99.0')
+      ? []
+      : [
+          {
+            label: '@variants',
+            documentation: {
+              kind: 'markdown' as typeof MarkupKind.Markdown,
+              value: `You can generate \`responsive\`, \`hover\`, \`focus\`, \`active\`, and other variants of your own utilities by wrapping their definitions in the \`@variants\` directive.\n\n[Tailwind CSS Documentation](${docsUrl(
+                state.version,
+                'functions-and-directives/#variants'
+              )})`,
+            },
+          },
+          {
+            label: '@responsive',
+            documentation: {
+              kind: 'markdown' as typeof MarkupKind.Markdown,
+              value: `You can generate responsive variants of your own classes by wrapping their definitions in the \`@responsive\` directive.\n\n[Tailwind CSS Documentation](${docsUrl(
+                state.version,
+                'functions-and-directives/#responsive'
+              )})`,
+            },
+          },
+        ]),
   ]
 
   return {
M packages/tailwindcss-language-service/src/diagnostics/getInvalidTailwindDirectiveDiagnostics.ts -> packages/tailwindcss-language-service/src/diagnostics/getInvalidTailwindDirectiveDiagnostics.ts
diff --git a/packages/tailwindcss-language-service/src/diagnostics/getInvalidTailwindDirectiveDiagnostics.ts b/packages/tailwindcss-language-service/src/diagnostics/getInvalidTailwindDirectiveDiagnostics.ts
index 9081210914110c3ab3380d87b73ca734ccd836ed..05526ff9d9ad246c8cec793c09dc8c6c991ad52e 100644
--- a/packages/tailwindcss-language-service/src/diagnostics/getInvalidTailwindDirectiveDiagnostics.ts
+++ b/packages/tailwindcss-language-service/src/diagnostics/getInvalidTailwindDirectiveDiagnostics.ts
@@ -27,6 +27,8 @@     if (!boundaries) return []
     ranges.push(...boundaries.css)
   }
 
+  let hasVariantsDirective = state.jit && semver.gte(state.version, '2.1.99')
+
   ranges.forEach((range) => {
     let text = document.getText(range)
     let matches = findAll(/(?:\s|^)@tailwind\s+(?<value>[^;]+)/g, text)
@@ -34,9 +36,17 @@
     let valid = [
       'utilities',
       'components',
-      state.jit && semver.gte(state.version, '2.1.99') ? 'variants' : 'screens',
+      'screens',
       semver.gte(state.version, '1.0.0-beta.1') ? 'base' : 'preflight',
-    ]
+      hasVariantsDirective && 'variants',
+    ].filter(Boolean)
+
+    let suggestable = valid
+
+    if (hasVariantsDirective) {
+      // Don't suggest `screens`, because it's deprecated
+      suggestable = suggestable.filter((value) => value !== 'screens')
+    }
 
     matches.forEach((match) => {
       if (valid.includes(match.groups.value)) {
@@ -49,11 +59,8 @@
       if (match.groups.value === 'preflight') {
         suggestions.push('base')
         message += ` Did you mean 'base'?`
-      } else if (match.groups.value === 'screens') {
-        suggestions.push('variants')
-        message += ` Did you mean 'variants'?`
       } else {
-        let suggestion = closest(match.groups.value, valid)
+        let suggestion = closest(match.groups.value, suggestable)
         if (suggestion) {
           suggestions.push(suggestion)
           message += ` Did you mean '${suggestion}'?`
M packages/tailwindcss-language-service/src/diagnostics/getInvalidVariantDiagnostics.ts -> packages/tailwindcss-language-service/src/diagnostics/getInvalidVariantDiagnostics.ts
diff --git a/packages/tailwindcss-language-service/src/diagnostics/getInvalidVariantDiagnostics.ts b/packages/tailwindcss-language-service/src/diagnostics/getInvalidVariantDiagnostics.ts
index 55cbce1903003ece7f8e54aae939e7fdd3856a8f..40ef10227a65820e1955e55e3ccfe36eac97638d 100644
--- a/packages/tailwindcss-language-service/src/diagnostics/getInvalidVariantDiagnostics.ts
+++ b/packages/tailwindcss-language-service/src/diagnostics/getInvalidVariantDiagnostics.ts
@@ -6,7 +6,7 @@ import { getLanguageBoundaries } from '../util/getLanguageBoundaries'
 import { findAll, indexToPosition } from '../util/find'
 import { closest } from '../util/closest'
 import { absoluteRange } from '../util/absoluteRange'
-import dlv from 'dlv'
+import semver from 'semver'
 
 export function getInvalidVariantDiagnostics(
   state: State,
@@ -15,6 +15,10 @@   settings: Settings
 ): InvalidVariantDiagnostic[] {
   let severity = settings.tailwindCSS.lint.invalidVariant
   if (severity === 'ignore') return []
+
+  if (semver.gte(state.version, '2.99.0')) {
+    return []
+  }
 
   let diagnostics: InvalidVariantDiagnostic[] = []
   let ranges: Range[] = []
M packages/tailwindcss-language-service/src/documentColorProvider.ts -> packages/tailwindcss-language-service/src/documentColorProvider.ts
diff --git a/packages/tailwindcss-language-service/src/documentColorProvider.ts b/packages/tailwindcss-language-service/src/documentColorProvider.ts
index 21faea6b44265540f88502e212179b0d35e21287..081d1c0c8086a553d36727711fb0aae744d38ca9 100644
--- a/packages/tailwindcss-language-service/src/documentColorProvider.ts
+++ b/packages/tailwindcss-language-service/src/documentColorProvider.ts
@@ -4,10 +4,9 @@   findClassListsInDocument,
   getClassNamesInClassList,
   findHelperFunctionsInDocument,
 } from './util/find'
-import { getColor, getColorFromValue, tinyColorToVscodeColor } from './util/color'
+import { getColor, getColorFromValue, culoriColorToVscodeColor } from './util/color'
 import { stringToPath } from './util/stringToPath'
 import type { TextDocument, ColorInformation } from 'vscode-languageserver'
-import { TinyColor } from '@ctrl/tinycolor'
 import dlv from 'dlv'
 
 export async function getDocumentColors(
@@ -25,12 +24,12 @@   classLists.forEach((classList) => {
     let classNames = getClassNamesInClassList(classList)
     classNames.forEach((className) => {
       let color = getColor(state, className.className)
-      if (color === null || typeof color === 'string' || color.a === 0) {
+      if (color === null || typeof color === 'string' || (color.alpha ?? 1) === 0) {
         return
       }
       colors.push({
         range: className.range,
-        color: tinyColorToVscodeColor(color),
+        color: culoriColorToVscodeColor(color),
       })
     })
   })
@@ -41,8 +40,8 @@     let keys = stringToPath(fn.value)
     let base = fn.helper === 'theme' ? ['theme'] : []
     let value = dlv(state.config, [...base, ...keys])
     let color = getColorFromValue(value)
-    if (color instanceof TinyColor && color.a !== 0) {
-      colors.push({ range: fn.valueRange, color: tinyColorToVscodeColor(color) })
+    if (color && typeof color !== 'string' && (color.alpha ?? 1) !== 0) {
+      colors.push({ range: fn.valueRange, color: culoriColorToVscodeColor(color) })
     }
   })
 
M packages/tailwindcss-language-service/src/index.ts -> packages/tailwindcss-language-service/src/index.ts
diff --git a/packages/tailwindcss-language-service/src/index.ts b/packages/tailwindcss-language-service/src/index.ts
index 9c888f298eb622544d85570ccb4e3aeb91570a7e..32383a3416fbe068e488f718aaef7a476917e40b 100644
--- a/packages/tailwindcss-language-service/src/index.ts
+++ b/packages/tailwindcss-language-service/src/index.ts
@@ -1,11 +1,8 @@
-export {
-  doComplete,
-  resolveCompletionItem,
-  completionsFromClassList,
-} from './completionProvider'
+export { doComplete, resolveCompletionItem, completionsFromClassList } from './completionProvider'
 export { doValidate } from './diagnostics/diagnosticsProvider'
 export { doHover } from './hoverProvider'
 export { doCodeActions } from './codeActions/codeActionProvider'
 export { getDocumentColors } from './documentColorProvider'
 export * from './util/state'
 export * from './diagnostics/types'
+export * from './util/color'
M packages/tailwindcss-language-service/src/util/color.ts -> packages/tailwindcss-language-service/src/util/color.ts
diff --git a/packages/tailwindcss-language-service/src/util/color.ts b/packages/tailwindcss-language-service/src/util/color.ts
index 2001b05aabfcbb15d58fe2035515f5060ef3740e..840b17d8a45143703b8994cab652905380debc54 100644
--- a/packages/tailwindcss-language-service/src/util/color.ts
+++ b/packages/tailwindcss-language-service/src/util/color.ts
@@ -1,11 +1,12 @@
 const dlv = require('dlv')
 import { State } from './state'
 import removeMeta from './removeMeta'
-import { TinyColor, names as colorNames } from '@ctrl/tinycolor'
 import { ensureArray, dedupe, flatten } from './array'
 import type { Color } from 'vscode-languageserver'
 import { getClassNameParts } from './getClassNameAtPosition'
 import * as jit from './jit'
+import * as culori from 'culori'
+import namedColors from 'color-name'
 
 const COLOR_PROPS = [
   'caret-color',
@@ -24,7 +25,7 @@   'stroke',
   'text-decoration-color',
 ]
 
-type KeywordColor = 'transparent' | 'currentColor'
+export type KeywordColor = 'transparent' | 'currentColor'
 
 function getKeywordColor(value: unknown): KeywordColor | null {
   if (typeof value !== 'string') return null
@@ -40,13 +41,13 @@ }
 
 // https://github.com/khalilgharbaoui/coloregex
 const colorRegex = new RegExp(
-  `(?:^|\\s|,)(#(?:[0-9a-f]{2}){2,4}|(#[0-9a-f]{3})|(rgb|hsl)a?\\((-?[\\d.]+%?[,\\s]+){2,3}\\s*([\\d.]+%?|var\\([^)]+\\))?\\)|transparent|currentColor|${Object.keys(
-    colorNames
+  `(?:^|\\s|,)(#(?:[0-9a-f]{2}){2,4}|(#[0-9a-f]{3})|(rgb|hsl)a?\\((-?[\\d.]+%?(\\s*[,/]\\s*|\\s+)+){2,3}\\s*([\\d.]+%?|var\\([^)]+\\))?\\)|transparent|currentColor|${Object.keys(
+    namedColors
   ).join('|')})(?:$|\\s|,)`,
   'gi'
 )
 
-function getColorsInString(str: string): (TinyColor | KeywordColor)[] {
+function getColorsInString(str: string): (culori.Color | KeywordColor)[] {
   if (/(?:box|drop)-shadow/.test(str)) return []
 
   return (
@@ -58,14 +59,14 @@           .trim()
           .replace(/^,|,$/g, '')
           .replace(/var\([^)]+\)/, '1')
       )
-      .map((color) => getKeywordColor(color) ?? new TinyColor(color))
-      .filter((color) => (color instanceof TinyColor ? color.isValid : true)) ?? []
+      .map((color) => getKeywordColor(color) ?? culori.parse(color))
+      .filter(Boolean) ?? []
   )
 }
 
 function getColorFromDecls(
   decls: Record<string, string | string[]>
-): TinyColor | KeywordColor | null {
+): culori.Color | KeywordColor | null {
   let props = Object.keys(decls).filter((prop) => {
     // ignore content: "";
     if (prop === 'content' && (decls[prop] === '""' || decls[prop] === "''")) {
@@ -96,7 +97,9 @@   // }
 
   // check that all of the values are the same color, ignoring alpha
   const colorStrings = dedupe(
-    colors.map((color) => (color instanceof TinyColor ? `${color.r}-${color.g}-${color.b}` : color))
+    colors.map((color) =>
+      typeof color === 'string' ? color : culori.formatRgb({ ...color, alpha: undefined })
+    )
   )
   if (colorStrings.length !== 1) {
     return null
@@ -107,30 +110,35 @@   if (keyword) {
     return keyword
   }
 
-  const nonKeywordColors = colors.filter((color): color is TinyColor => typeof color !== 'string')
+  const nonKeywordColors = colors.filter(
+    (color): color is culori.Color => typeof color !== 'string'
+  )
 
-  const alphas = dedupe(nonKeywordColors.map((color) => color.a))
+  const alphas = dedupe(nonKeywordColors.map((color) => color.alpha ?? 1))
 
   if (alphas.length === 1) {
     return nonKeywordColors[0]
   }
 
   if (alphas.length === 2 && alphas.includes(0)) {
-    return nonKeywordColors.find((color) => color.a !== 0)
+    return nonKeywordColors.find((color) => (color.alpha ?? 1) !== 0)
   }
 
   return null
 }
 
-export function getColor(state: State, className: string): TinyColor | KeywordColor | null {
+export function getColor(state: State, className: string): culori.Color | KeywordColor | null {
   if (state.jit) {
-    const item = dlv(state.classNames.classNames, [className, '__info'])
-    if (item && item.__rule) {
-      return getColorFromDecls(removeMeta(item))
+    if (state.classNames) {
+      const item = dlv(state.classNames.classNames, [className, '__info'])
+      if (item && item.__rule) {
+        return getColorFromDecls(removeMeta(item))
+      }
     }
 
     let { root, rules } = jit.generateRules(state, [className])
     if (rules.length === 0) return null
+
     let decls: Record<string, string | string[]> = {}
     root.walkDecls((decl) => {
       let value = decls[decl.prop]
@@ -156,7 +164,7 @@
   return getColorFromDecls(removeMeta(item))
 }
 
-export function getColorFromValue(value: unknown): TinyColor | KeywordColor | null {
+export function getColorFromValue(value: unknown): culori.Color | KeywordColor | null {
   if (typeof value !== 'string') return null
   const trimmedValue = value.trim()
   if (trimmedValue.toLowerCase() === 'transparent') {
@@ -168,41 +176,17 @@   }
   if (
     !/^\s*(?:rgba?|hsla?)\s*\([^)]+\)\s*$/.test(trimmedValue) &&
     !/^\s*#[0-9a-f]+\s*$/i.test(trimmedValue) &&
-    !Object.keys(colorNames).includes(trimmedValue)
+    !Object.keys(namedColors).includes(trimmedValue)
   ) {
     return null
   }
-  const color = new TinyColor(trimmedValue)
-  if (color.isValid) {
-    return color
-    // return { red: color.r / 255, green: color.g / 255, blue: color.b / 255, alpha: color.a }
-  }
-  return null
+  const color = culori.parse(trimmedValue)
+  return color ?? null
 }
 
-function createColor(str: string): TinyColor | KeywordColor {
-  let keyword = getKeywordColor(str)
-  if (keyword) {
-    return keyword
-  }
-
-  // matches: rgba(<r>, <g>, <b>, var(--bg-opacity))
-  // TODO: support other formats? e.g. hsla, css level 4
-  const match = str.match(
-    /^\s*rgba\(\s*(?<r>[0-9.]+)\s*,\s*(?<g>[0-9.]+)\s*,\s*(?<b>[0-9.]+)\s*,\s*var/
-  )
-
-  if (match) {
-    return new TinyColor({
-      r: match.groups.r,
-      g: match.groups.g,
-      b: match.groups.b,
-    })
-  }
-
-  return new TinyColor(str)
-}
+let toRgb = culori.converter('rgb')
 
-export function tinyColorToVscodeColor(color: TinyColor): Color {
-  return { red: color.r / 255, green: color.g / 255, blue: color.b / 255, alpha: color.a }
+export function culoriColorToVscodeColor(color: culori.Color): Color {
+  let rgb = toRgb(color)
+  return { red: rgb.r, green: rgb.g, blue: rgb.b, alpha: rgb.alpha ?? 1 }
 }
M packages/tailwindcss-language-service/src/util/state.ts -> packages/tailwindcss-language-service/src/util/state.ts
diff --git a/packages/tailwindcss-language-service/src/util/state.ts b/packages/tailwindcss-language-service/src/util/state.ts
index 322b0c50c74e684c4cd9ec2022b69228759ec25e..2cb86caa4507b659f2ff36f44995d2c0173e9a95 100644
--- a/packages/tailwindcss-language-service/src/util/state.ts
+++ b/packages/tailwindcss-language-service/src/util/state.ts
@@ -1,6 +1,8 @@
 import type { TextDocuments, Connection, Range, SymbolInformation } from 'vscode-languageserver'
 import type { TextDocument } from 'vscode-languageserver-textdocument'
 import type { Postcss } from 'postcss'
+import { KeywordColor } from './color'
+import * as culori from 'culori'
 
 export type ClassNamesTree = {
   [key: string]: ClassNamesTree
@@ -90,6 +92,7 @@   classNames?: ClassNames
   editor?: EditorState
   jit?: boolean
   jitContext?: any
+  classList?: Array<[string, { color: culori.Color | KeywordColor | null }]>
   // postcssPlugins?: { before: any[]; after: any[] }
 }
 
M packages/tailwindcss-language-service/tsconfig.json -> packages/tailwindcss-language-service/tsconfig.json
diff --git a/packages/tailwindcss-language-service/tsconfig.json b/packages/tailwindcss-language-service/tsconfig.json
index 38372f4564e6189a6eff53b6ba54bc9e99f865dc..0e325cbed2a8872a7bc7816dfb001304d908b5fb 100644
--- a/packages/tailwindcss-language-service/tsconfig.json
+++ b/packages/tailwindcss-language-service/tsconfig.json
@@ -1,5 +1,5 @@
 {
-  "include": ["src", "types"],
+  "include": ["src", "../../types"],
   "compilerOptions": {
     "module": "esnext",
     "lib": ["dom", "esnext"],
M packages/vscode-tailwindcss/package.json -> packages/vscode-tailwindcss/package.json
diff --git a/packages/vscode-tailwindcss/package.json b/packages/vscode-tailwindcss/package.json
index f4bb616e866e1c6585bdecb929fae4038626a681..d921809ec51de9630b3a79c2ef4514bc035d9076 100755
--- a/packages/vscode-tailwindcss/package.json
+++ b/packages/vscode-tailwindcss/package.json
@@ -207,9 +207,9 @@     "clean": "rimraf dist",
     "test": "jest"
   },
   "devDependencies": {
-    "@ctrl/tinycolor": "3.1.4",
     "@types/vscode": "1.52.0",
     "@vercel/ncc": "0.28.4",
+    "color-name": "1.1.4",
     "glob-exec": "0.1.1",
     "rimraf": "3.0.2",
     "terser": "4.6.12",
M packages/vscode-tailwindcss/src/extension.ts -> packages/vscode-tailwindcss/src/extension.ts
diff --git a/packages/vscode-tailwindcss/src/extension.ts b/packages/vscode-tailwindcss/src/extension.ts
index a8f1bd0f22b2f50302c5bfa77813792512ba5594..b6c51c0c0f7ade2710eb85b59134849755bc0473 100755
--- a/packages/vscode-tailwindcss/src/extension.ts
+++ b/packages/vscode-tailwindcss/src/extension.ts
@@ -30,7 +30,7 @@ } from 'vscode-languageclient/node'
 import { languages as defaultLanguages } from 'tailwindcss-language-service/src/util/languages'
 import isObject from 'tailwindcss-language-service/src/util/isObject'
 import { dedupe, equal } from 'tailwindcss-language-service/src/util/array'
-import { names as namedColors } from '@ctrl/tinycolor'
+import namedColors from 'color-name'
 
 const colorNames = Object.keys(namedColors)
 
I types/culori.d.ts
diff --git a/types/culori.d.ts b/types/culori.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..a24c2cd76305a165986a33c284504cc6bb3fc0c3
--- /dev/null
+++ b/types/culori.d.ts
@@ -0,0 +1,28 @@
+declare module 'culori' {
+  export interface RgbColor {
+    mode: 'rgb'
+    r: number
+    g: number
+    b: number
+    alpha?: number
+  }
+  export interface HslColor {
+    mode: 'hsl'
+    h: number
+    s: number
+    b: number
+    alpha?: number
+  }
+  export type Color = RgbColor | HslColor
+  export function parse(color: string): Color | undefined
+  export function formatRgb(color: Color | string): string
+  export function formatHsl(color: Color | string): string
+  export function formatHex(color: Color | string): string
+  export function formatHex8(color: Color | string): string
+
+  type Mode = 'rgb' | 'hsl'
+
+  export function converter<T extends Mode>(
+    mode: T
+  ): (color: Color | string) => T extends 'rgb' ? RgbColor : T extends 'hsl' ? HslColor : never
+}