diff --git a/.eslintrc.cjs b/.eslintrc.cjs index bdd1b7a..f321cc3 100644 --- a/.eslintrc.cjs +++ b/.eslintrc.cjs @@ -3,9 +3,10 @@ module.exports = { browser: true, es2021: true, }, + parser: '@typescript-eslint/parser', extends: [ 'standard-with-typescript', - 'plugin:react/recommended', + 'plugin:preact/recommended', 'prettier', 'plugin:perfectionist/recommended-alphabetical', 'plugin:tailwindcss/recommended', @@ -28,11 +29,13 @@ module.exports = { sourceType: 'module', project: './tsconfig.json', }, - plugins: ['react', 'prettier', 'jsx-a11y', 'boundaries'], + plugins: ['preact', 'prettier', 'jsx-a11y', 'boundaries'], rules: { + 'no-undef': 'off', + 'react/jsx-no-bind': 'off', 'import/no-default-export': 'error', 'func-style': ['error', 'expression'], - 'react/react-in-jsx-scope': 'off', + 'preact/preact-in-jsx-scope': 'off', 'boundaries/element-types': [ 2, { @@ -67,9 +70,6 @@ module.exports = { ['~test-utils', './src/test-utils'], ], }, - react: { - version: 'detect', - }, 'boundaries/elements': [ { type: 'api', diff --git a/package.json b/package.json index 94623db..5204da0 100644 --- a/package.json +++ b/package.json @@ -18,21 +18,18 @@ "lint:size": "size-limit" }, "dependencies": { - "@figma/plugin-typings": "^1.79.0", - "@floating-ui/react": "^0.25.2", - "@nanostores/react": "^0.7.1", - "@testing-library/react": "^14.0.0", + "@floating-ui/dom": "^1.7.3", + "@nanostores/preact": "^1.0.0", + "@preact/signals": "^2.2.1", "@types/apca-w3": "^0.1.0", "@types/culori": "^2.0.0", - "@types/react": "^18.2.14", - "@types/react-dom": "^18.2.6", - "@vitejs/plugin-react": "^4.0.1", "@vitest/coverage-v8": "^0.34.1", "apca-w3": "^0.1.9", "apcach": "^0.6.0", "autoprefixer": "^10.4.14", "bigint-conversion": "^2.4.2", "clsx": "^2.0.0", + "copy-to-clipboard": "^3.3.3", "culori": "^3.2.0", "eslint-plugin-boundaries": "^3.4.0", "nanoid": "^4.0.2", @@ -40,9 +37,7 @@ "postcss": "^8.4.24", "postcss-loader": "^7.3.3", "postcss-preset-env": "^9.0.0", - "react": "^18.2.0", - "react-dom": "^18.2.0", - "react-use-clipboard": "^1.0.9", + "preact": "^10.25.3", "tailwindcss": "^3.3.2", "typescript": "^5.0.2", "uint8-to-hex": "^2.0.0", @@ -52,10 +47,12 @@ "vitest": "^0.34.1" }, "devDependencies": { + "@figma/plugin-typings": "^1.116.0", + "@preact/preset-vite": "^2.10.2", "@size-limit/preset-small-lib": "^11.2.0", "@types/node": "^20.4.1", - "@typescript-eslint/eslint-plugin": "^5.61.0", - "@typescript-eslint/parser": "^5.61.0", + "@typescript-eslint/eslint-plugin": "5.61.0", + "@typescript-eslint/parser": "5.61.0", "eslint": "^8.44.0", "eslint-config-prettier": "^8.8.0", "eslint-config-standard-with-typescript": "^36.0.0", @@ -64,11 +61,9 @@ "eslint-plugin-jsx-a11y": "^6.7.1", "eslint-plugin-n": "^15.0.0", "eslint-plugin-perfectionist": "^1.4.0", + "eslint-plugin-preact": "^0.1.0", "eslint-plugin-prettier": "^4.2.1", "eslint-plugin-promise": "^6.0.0", - "eslint-plugin-react": "^7.32.2", - "eslint-plugin-react-hooks": "^4.6.0", - "eslint-plugin-react-refresh": "^0.4.1", "eslint-plugin-tailwindcss": "^3.13.0", "jsdom": "^22.1.0", "prettier": "^3.0.2", @@ -79,6 +74,5 @@ { "path": "dist/api.js" } - ], - "license": "MIT" + ] } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 13c49ea..e34a57c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,36 +8,24 @@ importers: .: dependencies: - '@figma/plugin-typings': - specifier: ^1.79.0 - version: 1.116.0 - '@floating-ui/react': - specifier: ^0.25.2 - version: 0.25.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@nanostores/react': - specifier: ^0.7.1 - version: 0.7.3(nanostores@0.9.5)(react@18.3.1) - '@testing-library/react': - specifier: ^14.0.0 - version: 14.3.1(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@floating-ui/dom': + specifier: ^1.7.3 + version: 1.7.3 + '@nanostores/preact': + specifier: ^1.0.0 + version: 1.0.0(nanostores@0.9.5)(preact@10.27.0) + '@preact/signals': + specifier: ^2.2.1 + version: 2.2.1(preact@10.27.0) '@types/apca-w3': specifier: ^0.1.0 version: 0.1.3 '@types/culori': specifier: ^2.0.0 version: 2.1.1 - '@types/react': - specifier: ^18.2.14 - version: 18.3.23 - '@types/react-dom': - specifier: ^18.2.6 - version: 18.3.7(@types/react@18.3.23) - '@vitejs/plugin-react': - specifier: ^4.0.1 - version: 4.7.0(vite@4.5.14(@types/node@20.19.9)(terser@5.43.1)) '@vitest/coverage-v8': specifier: ^0.34.1 - version: 0.34.6(vitest@0.34.6(jsdom@22.1.0)(terser@5.43.1)) + version: 0.34.6(vitest@0.34.6(jsdom@22.1.0)(lightningcss@1.30.1)(terser@5.43.1)) apca-w3: specifier: ^0.1.9 version: 0.1.9 @@ -53,12 +41,15 @@ importers: clsx: specifier: ^2.0.0 version: 2.1.1 + copy-to-clipboard: + specifier: ^3.3.3 + version: 3.3.3 culori: specifier: ^3.2.0 version: 3.3.0 eslint-plugin-boundaries: specifier: ^3.4.0 - version: 3.4.1(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1) + version: 3.4.1(@typescript-eslint/parser@5.61.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1) nanoid: specifier: ^4.0.2 version: 4.0.2 @@ -74,15 +65,9 @@ importers: postcss-preset-env: specifier: ^9.0.0 version: 9.6.0(postcss@8.5.6) - react: - specifier: ^18.2.0 - version: 18.3.1 - react-dom: - specifier: ^18.2.0 - version: 18.3.1(react@18.3.1) - react-use-clipboard: - specifier: ^1.0.9 - version: 1.0.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + preact: + specifier: ^10.25.3 + version: 10.27.0 tailwindcss: specifier: ^3.3.2 version: 3.4.17 @@ -94,17 +79,23 @@ importers: version: 2.0.1 vite: specifier: ^4.4.0 - version: 4.5.14(@types/node@20.19.9)(terser@5.43.1) + version: 4.5.14(@types/node@20.19.9)(lightningcss@1.30.1)(terser@5.43.1) vite-plugin-singlefile: specifier: ^0.13.5 - version: 0.13.5(rollup@3.29.5)(vite@4.5.14(@types/node@20.19.9)(terser@5.43.1)) + version: 0.13.5(rollup@3.29.5)(vite@4.5.14(@types/node@20.19.9)(lightningcss@1.30.1)(terser@5.43.1)) vite-plugin-svgr: specifier: ^3.2.0 - version: 3.3.0(rollup@3.29.5)(typescript@5.8.3)(vite@4.5.14(@types/node@20.19.9)(terser@5.43.1)) + version: 3.3.0(rollup@3.29.5)(typescript@5.8.3)(vite@4.5.14(@types/node@20.19.9)(lightningcss@1.30.1)(terser@5.43.1)) vitest: specifier: ^0.34.1 - version: 0.34.6(jsdom@22.1.0)(terser@5.43.1) + version: 0.34.6(jsdom@22.1.0)(lightningcss@1.30.1)(terser@5.43.1) devDependencies: + '@figma/plugin-typings': + specifier: ^1.116.0 + version: 1.116.0 + '@preact/preset-vite': + specifier: ^2.10.2 + version: 2.10.2(@babel/core@7.28.0)(preact@10.27.0)(vite@4.5.14(@types/node@20.19.9)(lightningcss@1.30.1)(terser@5.43.1)) '@size-limit/preset-small-lib': specifier: ^11.2.0 version: 11.2.0(size-limit@11.2.0) @@ -112,11 +103,11 @@ importers: specifier: ^20.4.1 version: 20.19.9 '@typescript-eslint/eslint-plugin': - specifier: ^5.61.0 - version: 5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3) + specifier: 5.61.0 + version: 5.61.0(@typescript-eslint/parser@5.61.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3) '@typescript-eslint/parser': - specifier: ^5.61.0 - version: 5.62.0(eslint@8.57.1)(typescript@5.8.3) + specifier: 5.61.0 + version: 5.61.0(eslint@8.57.1)(typescript@5.8.3) eslint: specifier: ^8.44.0 version: 8.57.1 @@ -125,13 +116,13 @@ importers: version: 8.10.2(eslint@8.57.1) eslint-config-standard-with-typescript: specifier: ^36.0.0 - version: 36.1.1(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3))(eslint-plugin-import@2.32.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1))(eslint-plugin-n@15.7.0(eslint@8.57.1))(eslint-plugin-promise@6.6.0(eslint@8.57.1))(eslint@8.57.1)(typescript@5.8.3) + version: 36.1.1(@typescript-eslint/eslint-plugin@5.61.0(@typescript-eslint/parser@5.61.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3))(eslint-plugin-import@2.32.0(@typescript-eslint/parser@5.61.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1))(eslint-plugin-n@15.7.0(eslint@8.57.1))(eslint-plugin-promise@6.6.0(eslint@8.57.1))(eslint@8.57.1)(typescript@5.8.3) eslint-import-resolver-alias: specifier: ^1.1.2 - version: 1.1.2(eslint-plugin-import@2.32.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)) + version: 1.1.2(eslint-plugin-import@2.32.0(@typescript-eslint/parser@5.61.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)) eslint-plugin-import: specifier: ^2.25.2 - version: 2.32.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1) + version: 2.32.0(@typescript-eslint/parser@5.61.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1) eslint-plugin-jsx-a11y: specifier: ^6.7.1 version: 6.10.2(eslint@8.57.1) @@ -141,21 +132,15 @@ importers: eslint-plugin-perfectionist: specifier: ^1.4.0 version: 1.5.1(eslint@8.57.1)(typescript@5.8.3) + eslint-plugin-preact: + specifier: ^0.1.0 + version: 0.1.0(eslint@8.57.1)(typescript@5.8.3) eslint-plugin-prettier: specifier: ^4.2.1 version: 4.2.5(eslint-config-prettier@8.10.2(eslint@8.57.1))(eslint@8.57.1)(prettier@3.6.2) eslint-plugin-promise: specifier: ^6.0.0 version: 6.6.0(eslint@8.57.1) - eslint-plugin-react: - specifier: ^7.32.2 - version: 7.37.5(eslint@8.57.1) - eslint-plugin-react-hooks: - specifier: ^4.6.0 - version: 4.6.2(eslint@8.57.1) - eslint-plugin-react-refresh: - specifier: ^0.4.1 - version: 0.4.20(eslint@8.57.1) eslint-plugin-tailwindcss: specifier: ^3.13.0 version: 3.18.2(tailwindcss@3.4.17) @@ -198,6 +183,10 @@ packages: resolution: {integrity: sha512-lJjzvrbEeWrhB4P3QBsH7tey117PjLZnDbLiQEKjQ/fNJTjuq4HSqgFA+UNSwZT8D7dxxbnuSBMsa1lrWzKlQg==} engines: {node: '>=6.9.0'} + '@babel/helper-annotate-as-pure@7.27.3': + resolution: {integrity: sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==} + engines: {node: '>=6.9.0'} + '@babel/helper-compilation-targets@7.27.2': resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==} engines: {node: '>=6.9.0'} @@ -241,21 +230,23 @@ packages: engines: {node: '>=6.0.0'} hasBin: true - '@babel/plugin-transform-react-jsx-self@7.27.1': - resolution: {integrity: sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==} + '@babel/plugin-syntax-jsx@7.27.1': + resolution: {integrity: sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-react-jsx-source@7.27.1': - resolution: {integrity: sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==} + '@babel/plugin-transform-react-jsx-development@7.27.1': + resolution: {integrity: sha512-ykDdF5yI4f1WrAolLqeF3hmYU12j9ntLQl/AOG1HAS21jxyg1Q0/J/tpREuYLfatGdGmXp/3yS0ZA76kOlVq9Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/runtime@7.27.6': - resolution: {integrity: sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q==} + '@babel/plugin-transform-react-jsx@7.27.1': + resolution: {integrity: sha512-2KH4LWGSrJIkVf5tSiBFYuXDAoWRq2MMwgivCf+93dd0GQi8RXLjKA/0EvRnVV5G0hrHczsquXuD01L8s6dmBw==} engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 '@babel/template@7.27.2': resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} @@ -821,26 +812,11 @@ packages: '@figma/plugin-typings@1.116.0': resolution: {integrity: sha512-jpn7Vq3uxgJF5oQ5PwkWGGIyCwIjB260UjtSzBck9LL1WzXJSaxBH1wo+vrU4XXbV//TURUGBYIQ2tU7cdyRYQ==} - '@floating-ui/core@1.7.2': - resolution: {integrity: sha512-wNB5ooIKHQc+Kui96jE/n69rHFWAVoxn5CAzL1Xdd8FG03cgY3MLO+GF9U3W737fYDSgPWA6MReKhBQBop6Pcw==} - - '@floating-ui/dom@1.7.2': - resolution: {integrity: sha512-7cfaOQuCS27HD7DX+6ib2OrnW+b4ZBwDNnCcT0uTyidcmyWb03FnQqJybDBoCnpdxwBSfA94UAYlRCt7mV+TbA==} + '@floating-ui/core@1.7.3': + resolution: {integrity: sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==} - '@floating-ui/react-dom@2.1.4': - resolution: {integrity: sha512-JbbpPhp38UmXDDAu60RJmbeme37Jbgsm7NrHGgzYYFKmblzRUh6Pa641dII6LsjwF4XlScDrde2UAzDo/b9KPw==} - peerDependencies: - react: '>=16.8.0' - react-dom: '>=16.8.0' - - '@floating-ui/react@0.25.4': - resolution: {integrity: sha512-lWRQ/UiTvSIBxohn0/2HFHEmnmOVRjl7j6XcRJuLH0ls6f/9AyHMWVzkAJFuwx0n9gaEeCmg9VccCSCJzbEJig==} - peerDependencies: - react: '>=16.8.0' - react-dom: '>=16.8.0' - - '@floating-ui/utils@0.1.6': - resolution: {integrity: sha512-OfX7E2oUDYxtBvsuS4e/jSn4Q9Qb6DzgeYtsAdkPZ47znpoNsMgZw0+tVijiv3uGNR6dgNlty6r9rzIzHjtd/A==} + '@floating-ui/dom@1.7.3': + resolution: {integrity: sha512-uZA413QEpNuhtb3/iIKoYMSK07keHPYeXF02Zhd6e213j+d1NamLix/mCLxBUDW/Gx52sPH2m+chlUsyaBs/Ag==} '@floating-ui/utils@0.2.10': resolution: {integrity: sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==} @@ -889,12 +865,15 @@ packages: '@juanelas/base64@1.1.5': resolution: {integrity: sha512-mjAF27LzwfYobdwqnxZgeucbKT5wRRNvILg3h5OvCWK+3F7mw/A1tnjHnNiTYtLmTvT/bM1jA5AX7eQawDGs1w==} - '@nanostores/react@0.7.3': - resolution: {integrity: sha512-/XuLAMENRu/Q71biW4AZ4qmU070vkZgiQ28gaTSNRPm2SZF5zGAR81zPE1MaMB4SeOp6ZTst92NBaG75XSspNg==} - engines: {node: ^18.0.0 || >=20.0.0} + '@mdn/browser-compat-data@3.3.14': + resolution: {integrity: sha512-n2RC9d6XatVbWFdHLimzzUJxJ1KY8LdjqrW6YvGPiRmsHkhOUx74/Ct10x5Yo7bC/Jvqx7cDEW8IMPv/+vwEzA==} + + '@nanostores/preact@1.0.0': + resolution: {integrity: sha512-woHYvSwau1YtO9AEnGsh/jRPU2u5DTfNSrDHtKMZOeDUWV6EJfvyv7dJ7AaMps2I9uJcY6OlqXKkA9qTctEjyw==} + engines: {node: ^20.0.0 || >=22.0.0} peerDependencies: - nanostores: ^0.9.0 || ^0.10.0 || ^0.11.0 - react: '>=18.0.0' + nanostores: ^0.9.0 || ^0.10.0 || ^0.11.0 || ^1.0.0 + preact: '>=10.0.0' '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} @@ -912,8 +891,40 @@ packages: resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} - '@rolldown/pluginutils@1.0.0-beta.27': - resolution: {integrity: sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==} + '@preact/preset-vite@2.10.2': + resolution: {integrity: sha512-K9wHlJOtkE+cGqlyQ5v9kL3Ge0Ql4LlIZjkUTL+1zf3nNdF88F9UZN6VTV8jdzBX9Fl7WSzeNMSDG7qECPmSmg==} + peerDependencies: + '@babel/core': 7.x + vite: 2.x || 3.x || 4.x || 5.x || 6.x || 7.x + + '@preact/signals-core@1.11.0': + resolution: {integrity: sha512-jglbibeWHuFRzEWVFY/TT7wB1PppJxmcSfUHcK+2J9vBRtiooMfw6tAPttojNYrrpdGViqAYCbPpmWYlMm+eMQ==} + + '@preact/signals@2.2.1': + resolution: {integrity: sha512-cX3mijdjHbbz3dBoJ6z687CGYEOp9ifj3uFnm4UKW+DxXKPMvE2y/VSdm0PXhXmHnr6F0iSnDJ+dLwmV7CYT5A==} + peerDependencies: + preact: '>= 10.25.0' + + '@prefresh/babel-plugin@0.5.2': + resolution: {integrity: sha512-AOl4HG6dAxWkJ5ndPHBgBa49oo/9bOiJuRDKHLSTyH+Fd9x00shTXpdiTj1W41l6oQIwUOAgJeHMn4QwIDpHkA==} + + '@prefresh/core@1.5.5': + resolution: {integrity: sha512-H6GTXUl4V4fe3ijz7yhSa/mZ+pGSOh7XaJb6uP/sQsagBx9yl0D1HKDaeoMQA8Ad2Xm27LqvbitMGSdY9UFSKQ==} + peerDependencies: + preact: ^10.0.0 + + '@prefresh/utils@1.2.1': + resolution: {integrity: sha512-vq/sIuN5nYfYzvyayXI4C2QkprfNaHUQ9ZX+3xLD8nL3rWyzpxOm1+K7RtMbhd+66QcaISViK7amjnheQ/4WZw==} + + '@prefresh/vite@2.4.8': + resolution: {integrity: sha512-H7vlo9UbJInuRbZhRQrdgVqLP7qKjDoX7TgYWWwIVhEHeHO0hZ4zyicvwBrV1wX5A3EPOmArgRkUaN7cPI2VXQ==} + peerDependencies: + preact: ^10.4.0 + vite: '>=2.0.0' + + '@rollup/pluginutils@4.2.1': + resolution: {integrity: sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==} + engines: {node: '>= 8.0.0'} '@rollup/pluginutils@5.2.0': resolution: {integrity: sha512-qWJ2ZTbmumwiLFomfzTyt5Kng4hwPi9rwCYN4SHb6eaRU1KNO4ccxINHr/VhH4GgPlt1XfSTLX2LBTme8ne4Zw==} @@ -1015,17 +1026,6 @@ packages: peerDependencies: '@svgr/core': '*' - '@testing-library/dom@9.3.4': - resolution: {integrity: sha512-FlS4ZWlp97iiNWig0Muq8p+3rVDjRiYE+YKGbAqXOu9nwJFFOdL00kFpz42M+4huzYi86vAK1sOOfyOG45muIQ==} - engines: {node: '>=14'} - - '@testing-library/react@14.3.1': - resolution: {integrity: sha512-H99XjUhWQw0lTgyMN05W3xQG1Nh4lq574D8keFf1dDoNTJgp66VbJozRaczoF+wsiaPJNt/TcnfpLGufGxSrZQ==} - engines: {node: '>=14'} - peerDependencies: - react: ^18.0.0 - react-dom: ^18.0.0 - '@tootallnate/once@2.0.0': resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} engines: {node: '>= 10'} @@ -1033,21 +1033,6 @@ packages: '@types/apca-w3@0.1.3': resolution: {integrity: sha512-1C7e66xWCy1UOXHk/VXs4tjrY9hW3q3sykjJJxSC5TIIFt0lt9mh0ysdQxY0rVejTv4SW92G19j98PjqjCSz7Q==} - '@types/aria-query@5.0.4': - resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} - - '@types/babel__core@7.20.5': - resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} - - '@types/babel__generator@7.27.0': - resolution: {integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==} - - '@types/babel__template@7.4.4': - resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} - - '@types/babel__traverse@7.20.7': - resolution: {integrity: sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==} - '@types/chai-subset@1.3.6': resolution: {integrity: sha512-m8lERkkQj+uek18hXOZuec3W/fCRTrU4hrnXjH3qhHy96ytuPaPiWGgu7sJb7tZxZonO75vYAjCvpe/e4VUwRw==} peerDependencies: @@ -1080,22 +1065,11 @@ packages: '@types/node@20.19.9': resolution: {integrity: sha512-cuVNgarYWZqxRJDQHEB58GEONhOK79QVR/qYx4S7kcUObQvUwvFnYxJuuHUKm2aieN9X3yZB4LZsuYNU1Qphsw==} - '@types/prop-types@15.7.15': - resolution: {integrity: sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==} - - '@types/react-dom@18.3.7': - resolution: {integrity: sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==} - peerDependencies: - '@types/react': ^18.0.0 - - '@types/react@18.3.23': - resolution: {integrity: sha512-/LDXMQh55EzZQ0uVAZmKKhfENivEvWz6E+EYzh+/MCjMhNsotd+ZHhBGIjFDTi6+fz0OhQQQLbTgdQIxxCsC0w==} - '@types/semver@7.7.0': resolution: {integrity: sha512-k107IF4+Xr7UHjwDc7Cfd6PRQfbdkiRabXGRjo07b4WyPahFBZCZ1sE+BNxYIJPPg73UkfOsVOLwqVc/6ETrIA==} - '@typescript-eslint/eslint-plugin@5.62.0': - resolution: {integrity: sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==} + '@typescript-eslint/eslint-plugin@5.61.0': + resolution: {integrity: sha512-A5l/eUAug103qtkwccSCxn8ZRwT+7RXWkFECdA4Cvl1dOlDUgTpAOfSEElZn2uSUxhdDpnCdetrf0jvU4qrL+g==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: '@typescript-eslint/parser': ^5.0.0 @@ -1105,8 +1079,14 @@ packages: typescript: optional: true - '@typescript-eslint/parser@5.62.0': - resolution: {integrity: sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==} + '@typescript-eslint/experimental-utils@2.34.0': + resolution: {integrity: sha512-eS6FTkq+wuMJ+sgtuNTtcqavWXqsflWcfBnlYhg/nS4aZ1leewkXGbvBhaapn1q6qf4M71bsR1tez5JTRMuqwA==} + engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1} + peerDependencies: + eslint: '*' + + '@typescript-eslint/parser@5.61.0': + resolution: {integrity: sha512-yGr4Sgyh8uO6fSi9hw3jAFXNBHbCtKKFMdX2IkT3ZqpKmtAq3lHS4ixB/COFuAIJpwl9/AqF7j72ZDWYKmIfvg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 @@ -1115,12 +1095,16 @@ packages: typescript: optional: true + '@typescript-eslint/scope-manager@5.61.0': + resolution: {integrity: sha512-W8VoMjoSg7f7nqAROEmTt6LoBpn81AegP7uKhhW5KzYlehs8VV0ZW0fIDVbcZRcaP3aPSW+JZFua+ysQN+m/Nw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@typescript-eslint/scope-manager@5.62.0': resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - '@typescript-eslint/type-utils@5.62.0': - resolution: {integrity: sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==} + '@typescript-eslint/type-utils@5.61.0': + resolution: {integrity: sha512-kk8u//r+oVK2Aj3ph/26XdH0pbAkC2RiSjUYhKD+PExemG4XSjpGFeyZ/QM8lBOa7O8aGOU+/yEbMJgQv/DnCg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: '*' @@ -1129,10 +1113,32 @@ packages: typescript: optional: true + '@typescript-eslint/types@5.61.0': + resolution: {integrity: sha512-ldyueo58KjngXpzloHUog/h9REmHl59G1b3a5Sng1GfBo14BkS3ZbMEb3693gnP1k//97lh7bKsp6/V/0v1veQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@typescript-eslint/types@5.62.0': resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@typescript-eslint/typescript-estree@2.34.0': + resolution: {integrity: sha512-OMAr+nJWKdlVM9LOqCqh3pQQPwxHAN7Du8DR6dmwCrAmxtiXQnhHJ6tBNtf+cggqfo51SG/FCwnKhXCIM7hnVg==} + engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/typescript-estree@5.61.0': + resolution: {integrity: sha512-Fud90PxONnnLZ36oR5ClJBLTLfU4pIWBmnvGwTbEa2cXIqj70AEDEmOmpkFComjBZ/037ueKrOdHuYmSFVD7Rw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + '@typescript-eslint/typescript-estree@5.62.0': resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -1142,12 +1148,22 @@ packages: typescript: optional: true + '@typescript-eslint/utils@5.61.0': + resolution: {integrity: sha512-mV6O+6VgQmVE6+xzlA91xifndPW9ElFW8vbSF0xCT/czPXVhwDewKila1jOyRwa9AE19zKnrr7Cg5S3pJVrTWQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + '@typescript-eslint/utils@5.62.0': resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + '@typescript-eslint/visitor-keys@5.61.0': + resolution: {integrity: sha512-50XQ5VdbWrX06mQXhy93WywSFZZGsv3EOjq+lqp6WC2t+j3mb6A9xYVdrRxafvK88vg9k9u+CT4l6D8PEatjKg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@typescript-eslint/visitor-keys@5.62.0': resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -1155,12 +1171,6 @@ packages: '@ungap/structured-clone@1.3.0': resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} - '@vitejs/plugin-react@4.7.0': - resolution: {integrity: sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==} - engines: {node: ^14.18.0 || >=16.0.0} - peerDependencies: - vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 - '@vitest/coverage-v8@0.34.6': resolution: {integrity: sha512-fivy/OK2d/EsJFoEoxHFEnNGTg+MmdZBAVK9Ka4qhXR2K3J0DS08vcGVwzDtXSuUMabLv4KtPcpSKkcMXFDViw==} peerDependencies: @@ -1318,9 +1328,6 @@ packages: argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - aria-query@5.1.3: - resolution: {integrity: sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==} - aria-query@5.3.2: resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} engines: {node: '>= 0.4'} @@ -1364,6 +1371,9 @@ packages: assertion-error@1.1.0: resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + ast-metadata-inferer@0.7.0: + resolution: {integrity: sha512-OkMLzd8xelb3gmnp6ToFvvsHLtS6CbagTkFQvQ+ZYFe3/AIl9iKikNR9G7pY3GfOR/2Xc222hwBjzI7HLkE76Q==} + ast-types-flow@0.0.8: resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==} @@ -1393,6 +1403,18 @@ packages: resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} engines: {node: '>= 0.4'} + babel-eslint@10.1.0: + resolution: {integrity: sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==} + engines: {node: '>=6'} + deprecated: babel-eslint is now @babel/eslint-parser. This package will no longer receive updates. + peerDependencies: + eslint: '>= 4.12.1' + + babel-plugin-transform-hook-names@1.0.2: + resolution: {integrity: sha512-5gafyjyyBTTdX/tQQ0hRgu4AhNHG/hqWi0ZZmg2xvs2FgRkJXzDNKBZCyoYqgFkovfDrgM8OoKg8karoUvWeCw==} + peerDependencies: + '@babel/core': ^7.12.10 + balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} @@ -1403,6 +1425,9 @@ packages: resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} engines: {node: '>=8'} + boolbase@1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + brace-expansion@1.1.12: resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} @@ -1519,6 +1544,9 @@ packages: copy-to-clipboard@3.3.3: resolution: {integrity: sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==} + core-js@3.45.0: + resolution: {integrity: sha512-c2KZL9lP4DjkN3hk/an4pWn5b5ZefhRJnAc42n6LJ19kSnbeRbdQZE5dSeE2LBol1OwJD3X1BQvFTAsa8ReeDA==} + cosmiconfig@8.3.6: resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==} engines: {node: '>=14'} @@ -1550,6 +1578,13 @@ packages: peerDependencies: postcss: ^8.4 + css-select@5.2.2: + resolution: {integrity: sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==} + + css-what@6.2.2: + resolution: {integrity: sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==} + engines: {node: '>= 6'} + cssdb@8.3.1: resolution: {integrity: sha512-XnDRQMXucLueX92yDe0LPKupXetWoFOgawr4O4X41l5TltgK2NVbJJVDnnOywDYfW1sTJ28AcXGKOqdRKwCcmQ==} @@ -1562,9 +1597,6 @@ packages: resolution: {integrity: sha512-N4u2ABATi3Qplzf0hWbVCdjenim8F3ojEXpBDF5hBpjzW182MjNGLqfmQ0SkSPeQ+V86ZXgeH8aXj6kayd4jgg==} engines: {node: '>=14'} - csstype@3.1.3: - resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} - culori@3.3.0: resolution: {integrity: sha512-pHJg+jbuFsCjz9iclQBqyL3B2HLCBF71BwVNujUYEvCeQMvV97R59MNK3R2+jgJ3a1fcZgI9B3vYgz8lzr/BFQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -1612,10 +1644,6 @@ packages: resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==} engines: {node: '>=6'} - deep-equal@2.2.3: - resolution: {integrity: sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==} - engines: {node: '>= 0.4'} - deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} @@ -1631,6 +1659,10 @@ packages: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} + detect-libc@2.0.4: + resolution: {integrity: sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==} + engines: {node: '>=8'} + didyoumean@1.2.2: resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} @@ -1653,14 +1685,24 @@ packages: resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} engines: {node: '>=6.0.0'} - dom-accessibility-api@0.5.16: - resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} + dom-serializer@2.0.0: + resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} + + domelementtype@2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} domexception@4.0.0: resolution: {integrity: sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==} engines: {node: '>=12'} deprecated: Use your platform's native DOMException instead + domhandler@5.0.3: + resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} + engines: {node: '>= 4'} + + domutils@3.2.2: + resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==} + dot-case@3.0.4: resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} @@ -1707,9 +1749,6 @@ packages: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} - es-get-iterator@1.1.3: - resolution: {integrity: sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==} - es-iterator-helpers@1.2.1: resolution: {integrity: sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==} engines: {node: '>= 0.4'} @@ -1751,6 +1790,11 @@ packages: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} + eslint-config-developit@1.2.0: + resolution: {integrity: sha512-uUXirRR5R06sqsPgOk8XlA65HRxXNSlg5vPmyLvFwksCibZZLI/RxszuAn6R2EZ6tJUIJupLrVw8fkDYX3TVsQ==} + peerDependencies: + eslint: '>=5' + eslint-config-prettier@8.10.2: resolution: {integrity: sha512-/IGJ6+Dka158JnP5n5YFMOszjDWrXggGz1LaK/guZq9vZTmniaKlHcsscvkAhn9y4U+BU3JuUdYvtAMcv30y4A==} hasBin: true @@ -1834,6 +1878,12 @@ packages: peerDependencies: eslint: '>=6.0.0' + eslint-plugin-compat@3.13.0: + resolution: {integrity: sha512-cv8IYMuTXm7PIjMVDN2y4k/KVnKZmoNGHNq27/9dLstOLydKblieIv+oe2BN2WthuXnFNhaNvv3N1Bvl4dbIGA==} + engines: {node: '>=9.x'} + peerDependencies: + eslint: ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 + eslint-plugin-es@4.1.0: resolution: {integrity: sha512-GILhQTnjYE2WorX5Jyi5i4dz5ALWxBIdQECVQavL6s7cI76IZTDWleTHkxz/QT3kvcs2QlGHvKLYsSlPOlPXnQ==} engines: {node: '>=8.10.0'} @@ -1850,12 +1900,24 @@ packages: '@typescript-eslint/parser': optional: true + eslint-plugin-jest@23.20.0: + resolution: {integrity: sha512-+6BGQt85OREevBDWCvhqj1yYA4+BFK4XnRZSGJionuEYmcglMZYLNNBBemwzbqUAckURaHdJSBcjHPyrtypZOw==} + engines: {node: '>=8'} + peerDependencies: + eslint: '>=5' + eslint-plugin-jsx-a11y@6.10.2: resolution: {integrity: sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==} engines: {node: '>=4.0'} peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9 + eslint-plugin-mocha@6.3.0: + resolution: {integrity: sha512-Cd2roo8caAyG21oKaaNTj7cqeYRWW1I2B5SfpKRp0Ip1gkfwoR1Ow0IGlPWnNjzywdF4n+kHL8/9vM6zCJUxdg==} + engines: {node: '>=8.0.0'} + peerDependencies: + eslint: '>= 4.0.0' + eslint-plugin-n@15.7.0: resolution: {integrity: sha512-jDex9s7D/Qial8AGVIHq4W7NswpUD5DPDL2RH8Lzd9EloWUuvUkHfv4FRLMipH5q2UtyurorBkPeNi1wVWNh3Q==} engines: {node: '>=12.22.0'} @@ -1867,6 +1929,9 @@ packages: peerDependencies: eslint: '>=8.0.0' + eslint-plugin-preact@0.1.0: + resolution: {integrity: sha512-/ZNTjrTLhDOkZmW8cY6W91lfrGEhyF5i0KFRhjlvCAPcWENxeXlx1TKbKgzjyvGtei8c2WlvWCgxO5PdyXe0EA==} + eslint-plugin-prettier@4.2.5: resolution: {integrity: sha512-9Ni+xgemM2IWLq6aXEpP2+V/V30GeA/46Ar629vcMqVPodFFWC9skHu/D1phvuqtS8bJCFnNf01/qcmqYEwNfg==} engines: {node: '>=12.0.0'} @@ -1884,17 +1949,6 @@ packages: peerDependencies: eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 - eslint-plugin-react-hooks@4.6.2: - resolution: {integrity: sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==} - engines: {node: '>=10'} - peerDependencies: - eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 - - eslint-plugin-react-refresh@0.4.20: - resolution: {integrity: sha512-XpbHQ2q5gUF8BGOX4dHe+71qoirYMhApEPZ7sfhF/dNnOF1UXnCMGZf79SFTBO7Bz5YEIT4TMieSlJBWhP9WBA==} - peerDependencies: - eslint: '>=8.40' - eslint-plugin-react@7.37.5: resolution: {integrity: sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==} engines: {node: '>=4'} @@ -2147,6 +2201,10 @@ packages: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} + he@1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + hasBin: true + hex-encoding@2.0.3: resolution: {integrity: sha512-sSmMo4ij2Vejht+5UkzuzNGiYgIWTSUw0GQqxHIQXsuuXB1ozYnjCZJZ/nwWNYRoU8+92Dp736wqxmiAN6/fcw==} @@ -2192,10 +2250,6 @@ packages: resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} engines: {node: '>= 0.4'} - is-arguments@1.2.0: - resolution: {integrity: sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==} - engines: {node: '>= 0.4'} - is-array-buffer@3.0.5: resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} engines: {node: '>= 0.4'} @@ -2410,6 +2464,9 @@ packages: keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + kolorist@1.8.0: + resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} + language-subtag-registry@0.3.23: resolution: {integrity: sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==} @@ -2421,6 +2478,70 @@ packages: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} + lightningcss-darwin-arm64@1.30.1: + resolution: {integrity: sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + + lightningcss-darwin-x64@1.30.1: + resolution: {integrity: sha512-k1EvjakfumAQoTfcXUcHQZhSpLlkAuEkdMBsI/ivWw9hL+7FtilQc0Cy3hrx0AAQrVtQAbMI7YjCgYgvn37PzA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + + lightningcss-freebsd-x64@1.30.1: + resolution: {integrity: sha512-kmW6UGCGg2PcyUE59K5r0kWfKPAVy4SltVeut+umLCFoJ53RdCUWxcRDzO1eTaxf/7Q2H7LTquFHPL5R+Gjyig==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + + lightningcss-linux-arm-gnueabihf@1.30.1: + resolution: {integrity: sha512-MjxUShl1v8pit+6D/zSPq9S9dQ2NPFSQwGvxBCYaBYLPlCWuPh9/t1MRS8iUaR8i+a6w7aps+B4N0S1TYP/R+Q==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + + lightningcss-linux-arm64-gnu@1.30.1: + resolution: {integrity: sha512-gB72maP8rmrKsnKYy8XUuXi/4OctJiuQjcuqWNlJQ6jZiWqtPvqFziskH3hnajfvKB27ynbVCucKSm2rkQp4Bw==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-arm64-musl@1.30.1: + resolution: {integrity: sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-x64-gnu@1.30.1: + resolution: {integrity: sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + lightningcss-linux-x64-musl@1.30.1: + resolution: {integrity: sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + lightningcss-win32-arm64-msvc@1.30.1: + resolution: {integrity: sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [win32] + + lightningcss-win32-x64-msvc@1.30.1: + resolution: {integrity: sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + + lightningcss@1.30.1: + resolution: {integrity: sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg==} + engines: {node: '>= 12.0.0'} + lilconfig@3.1.3: resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} engines: {node: '>=14'} @@ -2440,9 +2561,15 @@ packages: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} + lodash.memoize@4.1.2: + resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} + lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + loose-envify@1.4.0: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true @@ -2459,9 +2586,9 @@ packages: lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} - lz-string@1.5.0: - resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} - hasBin: true + lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} magic-string@0.30.17: resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} @@ -2557,6 +2684,9 @@ packages: node-buffer-encoding@1.0.3: resolution: {integrity: sha512-9hJZNChhQoCN1rCFScJiEwtzvWEJw2wSnu2nhDLD/YOYl1Ce8GbtnorsnjwwjpSk4sWE7zSp2etX6j7+bO7fVA==} + node-html-parser@6.1.13: + resolution: {integrity: sha512-qIsTMOY4C/dAa5Q5vsobRpOOvPfC4pB61UVW2uSwZNUp0QU/jCekTal1vMmbO0DgdHeLUJpv/ARmDqErVxA3Sg==} + node-releases@2.0.19: resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} @@ -2568,6 +2698,9 @@ packages: resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} engines: {node: '>=0.10.0'} + nth-check@2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + nwsapi@2.2.20: resolution: {integrity: sha512-/ieB+mDe4MrrKMT8z+mQL8klXydZWGR5Dowt4RAGKbJ3kIGEx3X4ljUo+6V73IXtUPWgfOlU5B9MlGxFO5T+cA==} @@ -2583,10 +2716,6 @@ packages: resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} engines: {node: '>= 0.4'} - object-is@1.1.6: - resolution: {integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==} - engines: {node: '>= 0.4'} - object-keys@1.1.1: resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} engines: {node: '>= 0.4'} @@ -2907,6 +3036,9 @@ packages: resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} engines: {node: ^10 || ^12 || >=14} + preact@10.27.0: + resolution: {integrity: sha512-/DTYoB6mwwgPytiqQTh/7SFRL98ZdiD8Sk8zIUVOxtwq4oWcwrcd1uno9fE/zZmUaUrFNYzbH14CPebOz9tZQw==} + prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} @@ -2920,10 +3052,6 @@ packages: engines: {node: '>=14'} hasBin: true - pretty-format@27.5.1: - resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - pretty-format@29.7.0: resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -2944,37 +3072,18 @@ packages: queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + ramda@0.27.2: + resolution: {integrity: sha512-SbiLPU40JuJniHexQSAgad32hfwd+DRUdwF2PlVuI5RZD0/vahUco7R8vD86J/tcEKKF9vZrUVwgtmGCqlCKyA==} + randombytes@2.1.0: resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} - react-dom@18.3.1: - resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} - peerDependencies: - react: ^18.3.1 - react-is@16.13.1: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} - react-is@17.0.2: - resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} - react-is@18.3.1: resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} - react-refresh@0.17.0: - resolution: {integrity: sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==} - engines: {node: '>=0.10.0'} - - react-use-clipboard@1.0.9: - resolution: {integrity: sha512-OcMzc14usXhqQnAkvzmhCXAbW5WBT2LSgscVh2vKHXZfg72jFsSOsEearqdeC/nUj8YxEfLnziqe7AE7YkWFwA==} - peerDependencies: - react: ^16.8.0 || ^17 || ^18 - react-dom: ^16.8.0 || ^17 || ^18 - - react@18.3.1: - resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} - engines: {node: '>=0.10.0'} - read-cache@1.0.0: resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} @@ -3063,9 +3172,6 @@ packages: resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} engines: {node: '>=v12.22.7'} - scheduler@0.23.2: - resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} - schema-utils@4.3.2: resolution: {integrity: sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==} engines: {node: '>= 10.13.0'} @@ -3074,6 +3180,11 @@ packages: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true + semver@7.3.5: + resolution: {integrity: sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==} + engines: {node: '>=10'} + hasBin: true + semver@7.7.2: resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} engines: {node: '>=10'} @@ -3125,6 +3236,9 @@ packages: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} + simple-code-frame@1.3.0: + resolution: {integrity: sha512-MB4pQmETUBlNs62BBeRjIFGeuy/x6gGKh7+eRUemn1rCFhqo7K+4slPqsyizCbcbYLnaYqaoZ2FWsZ/jN06D8w==} + size-limit@11.2.0: resolution: {integrity: sha512-2kpQq2DD/pRpx3Tal/qRW1SYwcIeQ0iq8li5CJHQgOC+FtPn2BVmuDtzUCgNnpCrbgtfEHqh+iWzxK+Tq6C+RQ==} engines: {node: ^18.0.0 || >=20.0.0} @@ -3148,6 +3262,14 @@ packages: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} + source-map@0.7.6: + resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==} + engines: {node: '>= 12'} + + stack-trace@1.0.0-pre2: + resolution: {integrity: sha512-2ztBJRek8IVofG9DBJqdy2N5kulaacX30Nz7xmkYF6ale9WBVmIy6mFBchvGX7Vx/MyjBhx+Rcxqrj+dbOnQ6A==} + engines: {node: '>=16'} + stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} @@ -3231,9 +3353,6 @@ packages: symbol-tree@3.2.4: resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} - tabbable@6.2.0: - resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==} - tailwindcss@3.4.17: resolution: {integrity: sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==} engines: {node: '>=14.0.0'} @@ -3415,6 +3534,11 @@ packages: peerDependencies: vite: ^2.6.0 || 3 || 4 + vite-prerender-plugin@0.5.11: + resolution: {integrity: sha512-xWOhb8Ef2zoJIiinYVunIf3omRfUbEXcPEvrkQcrDpJ2yjDokxhvQ26eSJbkthRhymntWx6816jpATrJphh+ug==} + peerDependencies: + vite: 5.x || 6.x || 7.x + vite@4.5.14: resolution: {integrity: sha512-+v57oAaoYNnO3hIu5Z/tJRZjq5aHM2zDve9YZ8HngVHbhk66RStobhb1sqPMIPEleV6cNKYK4eGrAbE9Ulbl2g==} engines: {node: ^14.18.0 || >=16.0.0} @@ -3578,6 +3702,9 @@ packages: yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + yaml@2.8.0: resolution: {integrity: sha512-4lLa/EcQCB0cJkyts+FpIRx5G/llPxfP6VQU5KByHEhLxY3IJCH0f0Hy1MHI8sClTvsIb8qwRJ6R/ZdlDJ/leQ==} engines: {node: '>= 14.6'} @@ -3636,6 +3763,10 @@ snapshots: '@jridgewell/trace-mapping': 0.3.29 jsesc: 3.1.0 + '@babel/helper-annotate-as-pure@7.27.3': + dependencies: + '@babel/types': 7.28.1 + '@babel/helper-compilation-targets@7.27.2': dependencies: '@babel/compat-data': 7.28.0 @@ -3679,17 +3810,28 @@ snapshots: dependencies: '@babel/types': 7.28.1 - '@babel/plugin-transform-react-jsx-self@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-react-jsx-source@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-transform-react-jsx-development@7.27.1(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.28.0) + transitivePeerDependencies: + - supports-color - '@babel/runtime@7.27.6': {} + '@babel/plugin-transform-react-jsx@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.0) + '@babel/types': 7.28.1 + transitivePeerDependencies: + - supports-color '@babel/template@7.27.2': dependencies: @@ -4123,31 +4265,15 @@ snapshots: '@figma/plugin-typings@1.116.0': {} - '@floating-ui/core@1.7.2': + '@floating-ui/core@1.7.3': dependencies: '@floating-ui/utils': 0.2.10 - '@floating-ui/dom@1.7.2': + '@floating-ui/dom@1.7.3': dependencies: - '@floating-ui/core': 1.7.2 + '@floating-ui/core': 1.7.3 '@floating-ui/utils': 0.2.10 - '@floating-ui/react-dom@2.1.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@floating-ui/dom': 1.7.2 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - - '@floating-ui/react@0.25.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@floating-ui/react-dom': 2.1.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@floating-ui/utils': 0.1.6 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - tabbable: 6.2.0 - - '@floating-ui/utils@0.1.6': {} - '@floating-ui/utils@0.2.10': {} '@humanwhocodes/config-array@0.13.0': @@ -4198,10 +4324,12 @@ snapshots: '@juanelas/base64@1.1.5': {} - '@nanostores/react@0.7.3(nanostores@0.9.5)(react@18.3.1)': + '@mdn/browser-compat-data@3.3.14': {} + + '@nanostores/preact@1.0.0(nanostores@0.9.5)(preact@10.27.0)': dependencies: nanostores: 0.9.5 - react: 18.3.1 + preact: 10.27.0 '@nodelib/fs.scandir@2.1.5': dependencies: @@ -4218,7 +4346,53 @@ snapshots: '@pkgjs/parseargs@0.11.0': optional: true - '@rolldown/pluginutils@1.0.0-beta.27': {} + '@preact/preset-vite@2.10.2(@babel/core@7.28.0)(preact@10.27.0)(vite@4.5.14(@types/node@20.19.9)(lightningcss@1.30.1)(terser@5.43.1))': + dependencies: + '@babel/core': 7.28.0 + '@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-transform-react-jsx-development': 7.27.1(@babel/core@7.28.0) + '@prefresh/vite': 2.4.8(preact@10.27.0)(vite@4.5.14(@types/node@20.19.9)(lightningcss@1.30.1)(terser@5.43.1)) + '@rollup/pluginutils': 4.2.1 + babel-plugin-transform-hook-names: 1.0.2(@babel/core@7.28.0) + debug: 4.4.1 + picocolors: 1.1.1 + vite: 4.5.14(@types/node@20.19.9)(lightningcss@1.30.1)(terser@5.43.1) + vite-prerender-plugin: 0.5.11(vite@4.5.14(@types/node@20.19.9)(lightningcss@1.30.1)(terser@5.43.1)) + transitivePeerDependencies: + - preact + - supports-color + + '@preact/signals-core@1.11.0': {} + + '@preact/signals@2.2.1(preact@10.27.0)': + dependencies: + '@preact/signals-core': 1.11.0 + preact: 10.27.0 + + '@prefresh/babel-plugin@0.5.2': {} + + '@prefresh/core@1.5.5(preact@10.27.0)': + dependencies: + preact: 10.27.0 + + '@prefresh/utils@1.2.1': {} + + '@prefresh/vite@2.4.8(preact@10.27.0)(vite@4.5.14(@types/node@20.19.9)(lightningcss@1.30.1)(terser@5.43.1))': + dependencies: + '@babel/core': 7.28.0 + '@prefresh/babel-plugin': 0.5.2 + '@prefresh/core': 1.5.5(preact@10.27.0) + '@prefresh/utils': 1.2.1 + '@rollup/pluginutils': 4.2.1 + preact: 10.27.0 + vite: 4.5.14(@types/node@20.19.9)(lightningcss@1.30.1)(terser@5.43.1) + transitivePeerDependencies: + - supports-color + + '@rollup/pluginutils@4.2.1': + dependencies: + estree-walker: 2.0.2 + picomatch: 2.3.1 '@rollup/pluginutils@5.2.0(rollup@3.29.5)': dependencies: @@ -4318,54 +4492,10 @@ snapshots: transitivePeerDependencies: - supports-color - '@testing-library/dom@9.3.4': - dependencies: - '@babel/code-frame': 7.27.1 - '@babel/runtime': 7.27.6 - '@types/aria-query': 5.0.4 - aria-query: 5.1.3 - chalk: 4.1.2 - dom-accessibility-api: 0.5.16 - lz-string: 1.5.0 - pretty-format: 27.5.1 - - '@testing-library/react@14.3.1(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@babel/runtime': 7.27.6 - '@testing-library/dom': 9.3.4 - '@types/react-dom': 18.3.7(@types/react@18.3.23) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - transitivePeerDependencies: - - '@types/react' - '@tootallnate/once@2.0.0': {} '@types/apca-w3@0.1.3': {} - '@types/aria-query@5.0.4': {} - - '@types/babel__core@7.20.5': - dependencies: - '@babel/parser': 7.28.0 - '@babel/types': 7.28.1 - '@types/babel__generator': 7.27.0 - '@types/babel__template': 7.4.4 - '@types/babel__traverse': 7.20.7 - - '@types/babel__generator@7.27.0': - dependencies: - '@babel/types': 7.28.1 - - '@types/babel__template@7.4.4': - dependencies: - '@babel/parser': 7.28.0 - '@babel/types': 7.28.1 - - '@types/babel__traverse@7.20.7': - dependencies: - '@babel/types': 7.28.1 - '@types/chai-subset@1.3.6(@types/chai@4.3.20)': dependencies: '@types/chai': 4.3.20 @@ -4396,26 +4526,15 @@ snapshots: dependencies: undici-types: 6.21.0 - '@types/prop-types@15.7.15': {} - - '@types/react-dom@18.3.7(@types/react@18.3.23)': - dependencies: - '@types/react': 18.3.23 - - '@types/react@18.3.23': - dependencies: - '@types/prop-types': 15.7.15 - csstype: 3.1.3 - '@types/semver@7.7.0': {} - '@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3)': + '@typescript-eslint/eslint-plugin@5.61.0(@typescript-eslint/parser@5.61.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 5.62.0(eslint@8.57.1)(typescript@5.8.3) - '@typescript-eslint/scope-manager': 5.62.0 - '@typescript-eslint/type-utils': 5.62.0(eslint@8.57.1)(typescript@5.8.3) - '@typescript-eslint/utils': 5.62.0(eslint@8.57.1)(typescript@5.8.3) + '@typescript-eslint/parser': 5.61.0(eslint@8.57.1)(typescript@5.8.3) + '@typescript-eslint/scope-manager': 5.61.0 + '@typescript-eslint/type-utils': 5.61.0(eslint@8.57.1)(typescript@5.8.3) + '@typescript-eslint/utils': 5.61.0(eslint@8.57.1)(typescript@5.8.3) debug: 4.4.1 eslint: 8.57.1 graphemer: 1.4.0 @@ -4428,11 +4547,22 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.8.3)': + '@typescript-eslint/experimental-utils@2.34.0(eslint@8.57.1)(typescript@5.8.3)': dependencies: - '@typescript-eslint/scope-manager': 5.62.0 - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.8.3) + '@types/json-schema': 7.0.15 + '@typescript-eslint/typescript-estree': 2.34.0(typescript@5.8.3) + eslint: 8.57.1 + eslint-scope: 5.1.1 + eslint-utils: 2.1.0 + transitivePeerDependencies: + - supports-color + - typescript + + '@typescript-eslint/parser@5.61.0(eslint@8.57.1)(typescript@5.8.3)': + dependencies: + '@typescript-eslint/scope-manager': 5.61.0 + '@typescript-eslint/types': 5.61.0 + '@typescript-eslint/typescript-estree': 5.61.0(typescript@5.8.3) debug: 4.4.1 eslint: 8.57.1 optionalDependencies: @@ -4440,15 +4570,20 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/scope-manager@5.61.0': + dependencies: + '@typescript-eslint/types': 5.61.0 + '@typescript-eslint/visitor-keys': 5.61.0 + '@typescript-eslint/scope-manager@5.62.0': dependencies: '@typescript-eslint/types': 5.62.0 '@typescript-eslint/visitor-keys': 5.62.0 - '@typescript-eslint/type-utils@5.62.0(eslint@8.57.1)(typescript@5.8.3)': + '@typescript-eslint/type-utils@5.61.0(eslint@8.57.1)(typescript@5.8.3)': dependencies: - '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.8.3) - '@typescript-eslint/utils': 5.62.0(eslint@8.57.1)(typescript@5.8.3) + '@typescript-eslint/typescript-estree': 5.61.0(typescript@5.8.3) + '@typescript-eslint/utils': 5.61.0(eslint@8.57.1)(typescript@5.8.3) debug: 4.4.1 eslint: 8.57.1 tsutils: 3.21.0(typescript@5.8.3) @@ -4457,8 +4592,38 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/types@5.61.0': {} + '@typescript-eslint/types@5.62.0': {} + '@typescript-eslint/typescript-estree@2.34.0(typescript@5.8.3)': + dependencies: + debug: 4.4.1 + eslint-visitor-keys: 1.3.0 + glob: 7.2.3 + is-glob: 4.0.3 + lodash: 4.17.21 + semver: 7.7.2 + tsutils: 3.21.0(typescript@5.8.3) + optionalDependencies: + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/typescript-estree@5.61.0(typescript@5.8.3)': + dependencies: + '@typescript-eslint/types': 5.61.0 + '@typescript-eslint/visitor-keys': 5.61.0 + debug: 4.4.1 + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.7.2 + tsutils: 3.21.0(typescript@5.8.3) + optionalDependencies: + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/typescript-estree@5.62.0(typescript@5.8.3)': dependencies: '@typescript-eslint/types': 5.62.0 @@ -4473,6 +4638,21 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/utils@5.61.0(eslint@8.57.1)(typescript@5.8.3)': + dependencies: + '@eslint-community/eslint-utils': 4.7.0(eslint@8.57.1) + '@types/json-schema': 7.0.15 + '@types/semver': 7.7.0 + '@typescript-eslint/scope-manager': 5.61.0 + '@typescript-eslint/types': 5.61.0 + '@typescript-eslint/typescript-estree': 5.61.0(typescript@5.8.3) + eslint: 8.57.1 + eslint-scope: 5.1.1 + semver: 7.7.2 + transitivePeerDependencies: + - supports-color + - typescript + '@typescript-eslint/utils@5.62.0(eslint@8.57.1)(typescript@5.8.3)': dependencies: '@eslint-community/eslint-utils': 4.7.0(eslint@8.57.1) @@ -4488,6 +4668,11 @@ snapshots: - supports-color - typescript + '@typescript-eslint/visitor-keys@5.61.0': + dependencies: + '@typescript-eslint/types': 5.61.0 + eslint-visitor-keys: 3.4.3 + '@typescript-eslint/visitor-keys@5.62.0': dependencies: '@typescript-eslint/types': 5.62.0 @@ -4495,19 +4680,7 @@ snapshots: '@ungap/structured-clone@1.3.0': {} - '@vitejs/plugin-react@4.7.0(vite@4.5.14(@types/node@20.19.9)(terser@5.43.1))': - dependencies: - '@babel/core': 7.28.0 - '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.28.0) - '@rolldown/pluginutils': 1.0.0-beta.27 - '@types/babel__core': 7.20.5 - react-refresh: 0.17.0 - vite: 4.5.14(@types/node@20.19.9)(terser@5.43.1) - transitivePeerDependencies: - - supports-color - - '@vitest/coverage-v8@0.34.6(vitest@0.34.6(jsdom@22.1.0)(terser@5.43.1))': + '@vitest/coverage-v8@0.34.6(vitest@0.34.6(jsdom@22.1.0)(lightningcss@1.30.1)(terser@5.43.1))': dependencies: '@ampproject/remapping': 2.3.0 '@bcoe/v8-coverage': 0.2.3 @@ -4520,7 +4693,7 @@ snapshots: std-env: 3.9.0 test-exclude: 6.0.0 v8-to-istanbul: 9.3.0 - vitest: 0.34.6(jsdom@22.1.0)(terser@5.43.1) + vitest: 0.34.6(jsdom@22.1.0)(lightningcss@1.30.1)(terser@5.43.1) transitivePeerDependencies: - supports-color @@ -4710,10 +4883,6 @@ snapshots: argparse@2.0.1: {} - aria-query@5.1.3: - dependencies: - deep-equal: 2.2.3 - aria-query@5.3.2: {} array-buffer-byte-length@1.0.2: @@ -4787,6 +4956,10 @@ snapshots: assertion-error@1.1.0: {} + ast-metadata-inferer@0.7.0: + dependencies: + '@mdn/browser-compat-data': 3.3.14 + ast-types-flow@0.0.8: {} async-function@1.0.0: {} @@ -4811,6 +4984,22 @@ snapshots: axobject-query@4.1.0: {} + babel-eslint@10.1.0(eslint@8.57.1): + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/parser': 7.28.0 + '@babel/traverse': 7.28.0 + '@babel/types': 7.28.1 + eslint: 8.57.1 + eslint-visitor-keys: 1.3.0 + resolve: 1.22.10 + transitivePeerDependencies: + - supports-color + + babel-plugin-transform-hook-names@1.0.2(@babel/core@7.28.0): + dependencies: + '@babel/core': 7.28.0 + balanced-match@1.0.2: {} bigint-conversion@2.4.3: @@ -4819,6 +5008,8 @@ snapshots: binary-extensions@2.3.0: {} + boolbase@1.0.0: {} + brace-expansion@1.1.12: dependencies: balanced-match: 1.0.2 @@ -4939,6 +5130,8 @@ snapshots: dependencies: toggle-selection: 1.0.6 + core-js@3.45.0: {} + cosmiconfig@8.3.6(typescript@5.8.3): dependencies: import-fresh: 3.3.1 @@ -4970,6 +5163,16 @@ snapshots: dependencies: postcss: 8.5.6 + css-select@5.2.2: + dependencies: + boolbase: 1.0.0 + css-what: 6.2.2 + domhandler: 5.0.3 + domutils: 3.2.2 + nth-check: 2.1.1 + + css-what@6.2.2: {} + cssdb@8.3.1: {} cssesc@3.0.0: {} @@ -4978,8 +5181,6 @@ snapshots: dependencies: rrweb-cssom: 0.6.0 - csstype@3.1.3: {} - culori@3.3.0: {} damerau-levenshtein@1.0.8: {} @@ -5022,27 +5223,6 @@ snapshots: dependencies: type-detect: 4.1.0 - deep-equal@2.2.3: - dependencies: - array-buffer-byte-length: 1.0.2 - call-bind: 1.0.8 - es-get-iterator: 1.1.3 - get-intrinsic: 1.3.0 - is-arguments: 1.2.0 - is-array-buffer: 3.0.5 - is-date-object: 1.1.0 - is-regex: 1.2.1 - is-shared-array-buffer: 1.0.4 - isarray: 2.0.5 - object-is: 1.1.6 - object-keys: 1.1.1 - object.assign: 4.1.7 - regexp.prototype.flags: 1.5.4 - side-channel: 1.1.0 - which-boxed-primitive: 1.1.1 - which-collection: 1.0.2 - which-typed-array: 1.1.19 - deep-is@0.1.4: {} define-data-property@1.1.4: @@ -5059,6 +5239,9 @@ snapshots: delayed-stream@1.0.0: {} + detect-libc@2.0.4: + optional: true + didyoumean@1.2.2: {} diff-sequences@29.6.3: {} @@ -5077,12 +5260,28 @@ snapshots: dependencies: esutils: 2.0.3 - dom-accessibility-api@0.5.16: {} + dom-serializer@2.0.0: + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + entities: 4.5.0 + + domelementtype@2.3.0: {} domexception@4.0.0: dependencies: webidl-conversions: 7.0.0 + domhandler@5.0.3: + dependencies: + domelementtype: 2.3.0 + + domutils@3.2.2: + dependencies: + dom-serializer: 2.0.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 + dot-case@3.0.4: dependencies: no-case: 3.0.4 @@ -5176,18 +5375,6 @@ snapshots: es-errors@1.3.0: {} - es-get-iterator@1.1.3: - dependencies: - call-bind: 1.0.8 - get-intrinsic: 1.3.0 - has-symbols: 1.1.0 - is-arguments: 1.2.0 - is-map: 2.0.3 - is-set: 2.0.3 - is-string: 1.1.1 - isarray: 2.0.5 - stop-iteration-iterator: 1.1.0 - es-iterator-helpers@1.2.1: dependencies: call-bind: 1.0.8 @@ -5288,33 +5475,45 @@ snapshots: escape-string-regexp@4.0.0: {} + eslint-config-developit@1.2.0(eslint@8.57.1)(typescript@5.8.3): + dependencies: + babel-eslint: 10.1.0(eslint@8.57.1) + eslint: 8.57.1 + eslint-plugin-compat: 3.13.0(eslint@8.57.1) + eslint-plugin-jest: 23.20.0(eslint@8.57.1)(typescript@5.8.3) + eslint-plugin-mocha: 6.3.0(eslint@8.57.1) + eslint-plugin-react: 7.37.5(eslint@8.57.1) + transitivePeerDependencies: + - supports-color + - typescript + eslint-config-prettier@8.10.2(eslint@8.57.1): dependencies: eslint: 8.57.1 - eslint-config-standard-with-typescript@36.1.1(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3))(eslint-plugin-import@2.32.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1))(eslint-plugin-n@15.7.0(eslint@8.57.1))(eslint-plugin-promise@6.6.0(eslint@8.57.1))(eslint@8.57.1)(typescript@5.8.3): + eslint-config-standard-with-typescript@36.1.1(@typescript-eslint/eslint-plugin@5.61.0(@typescript-eslint/parser@5.61.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3))(eslint-plugin-import@2.32.0(@typescript-eslint/parser@5.61.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1))(eslint-plugin-n@15.7.0(eslint@8.57.1))(eslint-plugin-promise@6.6.0(eslint@8.57.1))(eslint@8.57.1)(typescript@5.8.3): dependencies: - '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3) - '@typescript-eslint/parser': 5.62.0(eslint@8.57.1)(typescript@5.8.3) + '@typescript-eslint/eslint-plugin': 5.61.0(@typescript-eslint/parser@5.61.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3) + '@typescript-eslint/parser': 5.61.0(eslint@8.57.1)(typescript@5.8.3) eslint: 8.57.1 - eslint-config-standard: 17.1.0(eslint-plugin-import@2.32.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1))(eslint-plugin-n@15.7.0(eslint@8.57.1))(eslint-plugin-promise@6.6.0(eslint@8.57.1))(eslint@8.57.1) - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1) + eslint-config-standard: 17.1.0(eslint-plugin-import@2.32.0(@typescript-eslint/parser@5.61.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1))(eslint-plugin-n@15.7.0(eslint@8.57.1))(eslint-plugin-promise@6.6.0(eslint@8.57.1))(eslint@8.57.1) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@5.61.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1) eslint-plugin-n: 15.7.0(eslint@8.57.1) eslint-plugin-promise: 6.6.0(eslint@8.57.1) typescript: 5.8.3 transitivePeerDependencies: - supports-color - eslint-config-standard@17.1.0(eslint-plugin-import@2.32.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1))(eslint-plugin-n@15.7.0(eslint@8.57.1))(eslint-plugin-promise@6.6.0(eslint@8.57.1))(eslint@8.57.1): + eslint-config-standard@17.1.0(eslint-plugin-import@2.32.0(@typescript-eslint/parser@5.61.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1))(eslint-plugin-n@15.7.0(eslint@8.57.1))(eslint-plugin-promise@6.6.0(eslint@8.57.1))(eslint@8.57.1): dependencies: eslint: 8.57.1 - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@5.61.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1) eslint-plugin-n: 15.7.0(eslint@8.57.1) eslint-plugin-promise: 6.6.0(eslint@8.57.1) - eslint-import-resolver-alias@1.1.2(eslint-plugin-import@2.32.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)): + eslint-import-resolver-alias@1.1.2(eslint-plugin-import@2.32.0(@typescript-eslint/parser@5.61.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)): dependencies: - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@5.61.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1) eslint-import-resolver-node@0.3.9: dependencies: @@ -5324,32 +5523,32 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.1(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@8.57.1): + eslint-module-utils@2.12.1(@typescript-eslint/parser@5.61.0(eslint@8.57.1)(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@8.57.1): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 5.62.0(eslint@8.57.1)(typescript@5.8.3) + '@typescript-eslint/parser': 5.61.0(eslint@8.57.1)(typescript@5.8.3) eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 transitivePeerDependencies: - supports-color - eslint-module-utils@2.8.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@8.57.1): + eslint-module-utils@2.8.0(@typescript-eslint/parser@5.61.0(eslint@8.57.1)(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@8.57.1): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 5.62.0(eslint@8.57.1)(typescript@5.8.3) + '@typescript-eslint/parser': 5.61.0(eslint@8.57.1)(typescript@5.8.3) eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 transitivePeerDependencies: - supports-color - eslint-plugin-boundaries@3.4.1(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1): + eslint-plugin-boundaries@3.4.1(@typescript-eslint/parser@5.61.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1): dependencies: chalk: 4.1.2 eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@8.57.1) + eslint-module-utils: 2.8.0(@typescript-eslint/parser@5.61.0(eslint@8.57.1)(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@8.57.1) is-core-module: 2.13.1 micromatch: 4.0.5 transitivePeerDependencies: @@ -5358,13 +5557,25 @@ snapshots: - eslint-import-resolver-webpack - supports-color + eslint-plugin-compat@3.13.0(eslint@8.57.1): + dependencies: + '@mdn/browser-compat-data': 3.3.14 + ast-metadata-inferer: 0.7.0 + browserslist: 4.25.1 + caniuse-lite: 1.0.30001727 + core-js: 3.45.0 + eslint: 8.57.1 + find-up: 5.0.0 + lodash.memoize: 4.1.2 + semver: 7.3.5 + eslint-plugin-es@4.1.0(eslint@8.57.1): dependencies: eslint: 8.57.1 eslint-utils: 2.1.0 regexpp: 3.2.0 - eslint-plugin-import@2.32.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1): + eslint-plugin-import@2.32.0(@typescript-eslint/parser@5.61.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.9 @@ -5375,7 +5586,7 @@ snapshots: doctrine: 2.1.0 eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.1(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@8.57.1) + eslint-module-utils: 2.12.1(@typescript-eslint/parser@5.61.0(eslint@8.57.1)(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@8.57.1) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -5387,12 +5598,20 @@ snapshots: string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 5.62.0(eslint@8.57.1)(typescript@5.8.3) + '@typescript-eslint/parser': 5.61.0(eslint@8.57.1)(typescript@5.8.3) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color + eslint-plugin-jest@23.20.0(eslint@8.57.1)(typescript@5.8.3): + dependencies: + '@typescript-eslint/experimental-utils': 2.34.0(eslint@8.57.1)(typescript@5.8.3) + eslint: 8.57.1 + transitivePeerDependencies: + - supports-color + - typescript + eslint-plugin-jsx-a11y@6.10.2(eslint@8.57.1): dependencies: aria-query: 5.3.2 @@ -5412,6 +5631,12 @@ snapshots: safe-regex-test: 1.1.0 string.prototype.includes: 2.0.1 + eslint-plugin-mocha@6.3.0(eslint@8.57.1): + dependencies: + eslint: 8.57.1 + eslint-utils: 2.1.0 + ramda: 0.27.2 + eslint-plugin-n@15.7.0(eslint@8.57.1): dependencies: builtins: 5.1.0 @@ -5437,6 +5662,14 @@ snapshots: - supports-color - typescript + eslint-plugin-preact@0.1.0(eslint@8.57.1)(typescript@5.8.3): + dependencies: + eslint-config-developit: 1.2.0(eslint@8.57.1)(typescript@5.8.3) + transitivePeerDependencies: + - eslint + - supports-color + - typescript + eslint-plugin-prettier@4.2.5(eslint-config-prettier@8.10.2(eslint@8.57.1))(eslint@8.57.1)(prettier@3.6.2): dependencies: eslint: 8.57.1 @@ -5449,14 +5682,6 @@ snapshots: dependencies: eslint: 8.57.1 - eslint-plugin-react-hooks@4.6.2(eslint@8.57.1): - dependencies: - eslint: 8.57.1 - - eslint-plugin-react-refresh@0.4.20(eslint@8.57.1): - dependencies: - eslint: 8.57.1 - eslint-plugin-react@7.37.5(eslint@8.57.1): dependencies: array-includes: 3.1.9 @@ -5765,6 +5990,8 @@ snapshots: dependencies: function-bind: 1.1.2 + he@1.2.0: {} + hex-encoding@2.0.3: dependencies: node-buffer-encoding: 1.0.3 @@ -5817,11 +6044,6 @@ snapshots: hasown: 2.0.2 side-channel: 1.1.0 - is-arguments@1.2.0: - dependencies: - call-bound: 1.0.4 - has-tostringtag: 1.0.2 - is-array-buffer@3.0.5: dependencies: call-bind: 1.0.8 @@ -6060,6 +6282,8 @@ snapshots: dependencies: json-buffer: 3.0.1 + kolorist@1.8.0: {} + language-subtag-registry@0.3.23: {} language-tags@1.0.9: @@ -6071,6 +6295,52 @@ snapshots: prelude-ls: 1.2.1 type-check: 0.4.0 + lightningcss-darwin-arm64@1.30.1: + optional: true + + lightningcss-darwin-x64@1.30.1: + optional: true + + lightningcss-freebsd-x64@1.30.1: + optional: true + + lightningcss-linux-arm-gnueabihf@1.30.1: + optional: true + + lightningcss-linux-arm64-gnu@1.30.1: + optional: true + + lightningcss-linux-arm64-musl@1.30.1: + optional: true + + lightningcss-linux-x64-gnu@1.30.1: + optional: true + + lightningcss-linux-x64-musl@1.30.1: + optional: true + + lightningcss-win32-arm64-msvc@1.30.1: + optional: true + + lightningcss-win32-x64-msvc@1.30.1: + optional: true + + lightningcss@1.30.1: + dependencies: + detect-libc: 2.0.4 + optionalDependencies: + lightningcss-darwin-arm64: 1.30.1 + lightningcss-darwin-x64: 1.30.1 + lightningcss-freebsd-x64: 1.30.1 + lightningcss-linux-arm-gnueabihf: 1.30.1 + lightningcss-linux-arm64-gnu: 1.30.1 + lightningcss-linux-arm64-musl: 1.30.1 + lightningcss-linux-x64-gnu: 1.30.1 + lightningcss-linux-x64-musl: 1.30.1 + lightningcss-win32-arm64-msvc: 1.30.1 + lightningcss-win32-x64-msvc: 1.30.1 + optional: true + lilconfig@3.1.3: {} lines-and-columns@1.2.4: {} @@ -6083,8 +6353,12 @@ snapshots: dependencies: p-locate: 5.0.0 + lodash.memoize@4.1.2: {} + lodash.merge@4.6.2: {} + lodash@4.17.21: {} + loose-envify@1.4.0: dependencies: js-tokens: 4.0.0 @@ -6103,7 +6377,9 @@ snapshots: dependencies: yallist: 3.1.1 - lz-string@1.5.0: {} + lru-cache@6.0.0: + dependencies: + yallist: 4.0.0 magic-string@0.30.17: dependencies: @@ -6187,12 +6463,21 @@ snapshots: node-buffer-encoding@1.0.3: {} + node-html-parser@6.1.13: + dependencies: + css-select: 5.2.2 + he: 1.2.0 + node-releases@2.0.19: {} normalize-path@3.0.0: {} normalize-range@0.1.2: {} + nth-check@2.1.1: + dependencies: + boolbase: 1.0.0 + nwsapi@2.2.20: {} object-assign@4.1.1: {} @@ -6201,11 +6486,6 @@ snapshots: object-inspect@1.13.4: {} - object-is@1.1.6: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - object-keys@1.1.1: {} object.assign@4.1.7: @@ -6588,6 +6868,8 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 + preact@10.27.0: {} + prelude-ls@1.2.1: {} prettier-linter-helpers@1.0.0: @@ -6596,12 +6878,6 @@ snapshots: prettier@3.6.2: {} - pretty-format@27.5.1: - dependencies: - ansi-regex: 5.0.1 - ansi-styles: 5.2.0 - react-is: 17.0.2 - pretty-format@29.7.0: dependencies: '@jest/schemas': 29.6.3 @@ -6624,34 +6900,16 @@ snapshots: queue-microtask@1.2.3: {} + ramda@0.27.2: {} + randombytes@2.1.0: dependencies: safe-buffer: 5.2.1 - react-dom@18.3.1(react@18.3.1): - dependencies: - loose-envify: 1.4.0 - react: 18.3.1 - scheduler: 0.23.2 - react-is@16.13.1: {} - react-is@17.0.2: {} - react-is@18.3.1: {} - react-refresh@0.17.0: {} - - react-use-clipboard@1.0.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - copy-to-clipboard: 3.3.3 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - - react@18.3.1: - dependencies: - loose-envify: 1.4.0 - read-cache@1.0.0: dependencies: pify: 2.3.0 @@ -6749,10 +7007,6 @@ snapshots: dependencies: xmlchars: 2.2.0 - scheduler@0.23.2: - dependencies: - loose-envify: 1.4.0 - schema-utils@4.3.2: dependencies: '@types/json-schema': 7.0.15 @@ -6762,6 +7016,10 @@ snapshots: semver@6.3.1: {} + semver@7.3.5: + dependencies: + lru-cache: 6.0.0 + semver@7.7.2: {} serialize-javascript@6.0.2: @@ -6828,6 +7086,10 @@ snapshots: signal-exit@4.1.0: {} + simple-code-frame@1.3.0: + dependencies: + kolorist: 1.8.0 + size-limit@11.2.0: dependencies: bytes-iec: 3.1.1 @@ -6854,6 +7116,10 @@ snapshots: source-map@0.6.1: {} + source-map@0.7.6: {} + + stack-trace@1.0.0-pre2: {} + stackback@0.0.2: {} std-env@3.9.0: {} @@ -6965,8 +7231,6 @@ snapshots: symbol-tree@3.2.4: {} - tabbable@6.2.0: {} - tailwindcss@3.4.17: dependencies: '@alloc/quick-lru': 5.2.0 @@ -7159,14 +7423,14 @@ snapshots: '@types/istanbul-lib-coverage': 2.0.6 convert-source-map: 2.0.0 - vite-node@0.34.6(@types/node@20.19.9)(terser@5.43.1): + vite-node@0.34.6(@types/node@20.19.9)(lightningcss@1.30.1)(terser@5.43.1): dependencies: cac: 6.7.14 debug: 4.4.1 mlly: 1.7.4 pathe: 1.1.2 picocolors: 1.1.1 - vite: 4.5.14(@types/node@20.19.9)(terser@5.43.1) + vite: 4.5.14(@types/node@20.19.9)(lightningcss@1.30.1)(terser@5.43.1) transitivePeerDependencies: - '@types/node' - less @@ -7177,24 +7441,34 @@ snapshots: - supports-color - terser - vite-plugin-singlefile@0.13.5(rollup@3.29.5)(vite@4.5.14(@types/node@20.19.9)(terser@5.43.1)): + vite-plugin-singlefile@0.13.5(rollup@3.29.5)(vite@4.5.14(@types/node@20.19.9)(lightningcss@1.30.1)(terser@5.43.1)): dependencies: micromatch: 4.0.8 rollup: 3.29.5 - vite: 4.5.14(@types/node@20.19.9)(terser@5.43.1) + vite: 4.5.14(@types/node@20.19.9)(lightningcss@1.30.1)(terser@5.43.1) - vite-plugin-svgr@3.3.0(rollup@3.29.5)(typescript@5.8.3)(vite@4.5.14(@types/node@20.19.9)(terser@5.43.1)): + vite-plugin-svgr@3.3.0(rollup@3.29.5)(typescript@5.8.3)(vite@4.5.14(@types/node@20.19.9)(lightningcss@1.30.1)(terser@5.43.1)): dependencies: '@rollup/pluginutils': 5.2.0(rollup@3.29.5) '@svgr/core': 8.1.0(typescript@5.8.3) '@svgr/plugin-jsx': 8.1.0(@svgr/core@8.1.0(typescript@5.8.3)) - vite: 4.5.14(@types/node@20.19.9)(terser@5.43.1) + vite: 4.5.14(@types/node@20.19.9)(lightningcss@1.30.1)(terser@5.43.1) transitivePeerDependencies: - rollup - supports-color - typescript - vite@4.5.14(@types/node@20.19.9)(terser@5.43.1): + vite-prerender-plugin@0.5.11(vite@4.5.14(@types/node@20.19.9)(lightningcss@1.30.1)(terser@5.43.1)): + dependencies: + kolorist: 1.8.0 + magic-string: 0.30.17 + node-html-parser: 6.1.13 + simple-code-frame: 1.3.0 + source-map: 0.7.6 + stack-trace: 1.0.0-pre2 + vite: 4.5.14(@types/node@20.19.9)(lightningcss@1.30.1)(terser@5.43.1) + + vite@4.5.14(@types/node@20.19.9)(lightningcss@1.30.1)(terser@5.43.1): dependencies: esbuild: 0.18.20 postcss: 8.5.6 @@ -7202,9 +7476,10 @@ snapshots: optionalDependencies: '@types/node': 20.19.9 fsevents: 2.3.3 + lightningcss: 1.30.1 terser: 5.43.1 - vitest@0.34.6(jsdom@22.1.0)(terser@5.43.1): + vitest@0.34.6(jsdom@22.1.0)(lightningcss@1.30.1)(terser@5.43.1): dependencies: '@types/chai': 4.3.20 '@types/chai-subset': 1.3.6(@types/chai@4.3.20) @@ -7227,8 +7502,8 @@ snapshots: strip-literal: 1.3.0 tinybench: 2.9.0 tinypool: 0.7.0 - vite: 4.5.14(@types/node@20.19.9)(terser@5.43.1) - vite-node: 0.34.6(@types/node@20.19.9)(terser@5.43.1) + vite: 4.5.14(@types/node@20.19.9)(lightningcss@1.30.1)(terser@5.43.1) + vite-node: 0.34.6(@types/node@20.19.9)(lightningcss@1.30.1)(terser@5.43.1) why-is-node-running: 2.3.0 optionalDependencies: jsdom: 22.1.0 @@ -7375,6 +7650,8 @@ snapshots: yallist@3.1.1: {} + yallist@4.0.0: {} + yaml@2.8.0: {} yocto-queue@0.1.0: {} diff --git a/src/api/services/figma/intersections/traverse-and-check-intersections.ts b/src/api/services/figma/intersections/traverse-and-check-intersections.ts index b6e3636..b995cf4 100644 --- a/src/api/services/figma/intersections/traverse-and-check-intersections.ts +++ b/src/api/services/figma/intersections/traverse-and-check-intersections.ts @@ -7,17 +7,14 @@ import { getSiblingsThatAreBelowByZIndex } from './get-siblings-that-are-below-b const ifSelectedNodeIsChild = ( node: SceneNode, selectedNode: SceneNode -): boolean => { - return ( +): boolean => ( 'children' in node && node.children.some((n) => n.id === selectedNode.id) ); -}; export const traverseAndCheckIntersections = ( nodes: SceneNode[], selectedNode: SceneNode -): PolychromNode[] => { - return nodes.reduce((accumulator: PolychromNode[], node) => { +): PolychromNode[] => nodes.reduce((accumulator: PolychromNode[], node) => { if (areNodesIntersecting(node, selectedNode)) { const polychromNode = createPolychromNode(node, selectedNode.id); @@ -37,4 +34,3 @@ export const traverseAndCheckIntersections = ( return accumulator; }, []); -}; diff --git a/src/api/services/figma/nodes/create-polychrom-node.ts b/src/api/services/figma/nodes/create-polychrom-node.ts index f0e38ed..083f862 100644 --- a/src/api/services/figma/nodes/create-polychrom-node.ts +++ b/src/api/services/figma/nodes/create-polychrom-node.ts @@ -22,9 +22,9 @@ export const createPolychromNode = ( hex: formatHex({ ...fill.color, mode: 'rgb' }), oklch: convertToOklch({ ...fill.color, mode: 'rgb' }, 'oklch'), }; - } else { + } return fill; - } + }), id: node.id, isSelected: node.id === selectedNodeId, @@ -33,8 +33,6 @@ export const createPolychromNode = ( opacity: 'opacity' in node ? node.opacity : 1, parents, visible: 'visible' in node ? node.visible : true, - zIndex: node.parent?.children.findIndex((child) => { - return child.id === node.id; - }), + zIndex: node.parent?.children.findIndex((child) => child.id === node.id), }; }; diff --git a/src/api/services/figma/nodes/is-valid-for-selection.ts b/src/api/services/figma/nodes/is-valid-for-selection.ts index 32e4b62..8af5415 100644 --- a/src/api/services/figma/nodes/is-valid-for-selection.ts +++ b/src/api/services/figma/nodes/is-valid-for-selection.ts @@ -13,15 +13,15 @@ export const isValidForSelection = (node: SceneNode): boolean => { if ('fills' in node) { if (typeof node.fills === 'symbol') { return false; - } else { + } const actualFill = getActualFill(node.fills); if (notEmpty(actualFill)) { return actualFill.type === 'SOLID'; - } else { + } return false; - } - } + + } return false; diff --git a/src/api/services/payload/build-general-selection-payload.ts b/src/api/services/payload/build-general-selection-payload.ts index 65a2123..cefacec 100644 --- a/src/api/services/payload/build-general-selection-payload.ts +++ b/src/api/services/payload/build-general-selection-payload.ts @@ -16,13 +16,11 @@ enum PairState { const isValidSelection = ( pair: PairState | PolychromNode -): pair is PolychromNode => { - return ( +): pair is PolychromNode => ( notEmpty(pair) && pair !== PairState.InvalidBackground && pair !== PairState.InvalidBlendMode ); -}; export const buildGeneralSelectionPayload = ( selection: readonly SceneNode[] @@ -38,9 +36,9 @@ export const buildGeneralSelectionPayload = ( if (isValidForBackground(intersectingNodesTree)) { return intersectingNodesTree; - } else { + } return PairState.InvalidBackground; - } + }); const isSingleInvalidBackground = diff --git a/src/ui/components/App.tsx b/src/ui/components/App.tsx index efc2dda..f3e0492 100644 --- a/src/ui/components/App.tsx +++ b/src/ui/components/App.tsx @@ -1,22 +1,18 @@ -import { useStore } from '@nanostores/react'; +import { useStore } from '@nanostores/preact'; +import { effect } from '@preact/signals'; import { MessageTypes } from '~types/messages.ts'; import { AppContent } from '~ui/components/AppContent.tsx'; import { HelpLink } from '~ui/components/HelpLink.tsx'; import { LurkersLink } from '~ui/components/LurkersLink.tsx'; import { SettingsButton } from '~ui/components/SettingsButton.tsx'; -import { - Tooltip, - TooltipContent, - TooltipTrigger, -} from '~ui/components/Tooltip.tsx'; -import React, { useEffect } from 'react'; +import { Tooltip } from '~ui/components/Tooltip.tsx'; +import { $isP3 } from '~ui/stores/selected-nodes.ts'; +import { type VNode } from 'preact'; -import { $isP3 } from '../stores/selected-nodes'; - -export const App: React.FC = () => { +export const App = (): VNode => { const isP3 = useStore($isP3); - useEffect(() => { + effect(() => { parent.postMessage( { pluginMessage: { @@ -25,7 +21,7 @@ export const App: React.FC = () => { }, '*' ); - }, []); + }); return (
@@ -33,23 +29,19 @@ export const App: React.FC = () => {
-
{isP3 && ( - - -
-

- P3 -

-
-
- File color profile + +
+

+ P3 +

+
)} diff --git a/src/ui/components/AppContent.tsx b/src/ui/components/AppContent.tsx index 250bf3e..e8f2d0a 100644 --- a/src/ui/components/AppContent.tsx +++ b/src/ui/components/AppContent.tsx @@ -1,4 +1,4 @@ -import { useStore } from '@nanostores/react'; +import { useStore } from '@nanostores/preact'; import { EmptySelectionMessage } from '~ui/components/EmptySelectionMessage.tsx'; import { InvalidBackgroundSelectionMessage } from '~ui/components/InvalidBackgroundSelectionMessage.tsx'; import { Selection } from '~ui/components/Selection.tsx'; @@ -12,9 +12,9 @@ import { $isUnprocessedBlendModes, } from '~ui/stores/selected-nodes.ts'; import { isEmpty } from '~utils/not-empty.ts'; -import { type ReactElement } from 'react'; +import { type JSX } from 'preact'; -export const AppContent = (): ReactElement => { +export const AppContent = (): JSX.Element => { const isInvalidBackground = useStore($isInvalidBackground); const isEmptySelection = useStore($isEmptySelection); const isMultiSelection = useStore($isMultiSelection); @@ -39,13 +39,12 @@ export const AppContent = (): ReactElement => { if (isMultiSelection) { return ; - } else { - const pair = contrastConclusion[0]; - - if (isEmpty(pair)) { - return ; - } + } + const pair = contrastConclusion[0]; - return ; + if (isEmpty(pair)) { + return ; } + + return ; }; diff --git a/src/ui/components/BasicColorPreviewIcon.tsx b/src/ui/components/BasicColorPreviewIcon.tsx index 41df3be..652ff41 100644 --- a/src/ui/components/BasicColorPreviewIcon.tsx +++ b/src/ui/components/BasicColorPreviewIcon.tsx @@ -1,4 +1,4 @@ -import { type ReactElement } from 'react'; +import { type JSX } from 'preact'; interface Props { borderColor: string; @@ -8,19 +8,17 @@ interface Props { export const BasicColorPreviewIcon = ({ borderColor, indicatorColor, -}: Props): ReactElement => { - return ( - - - - - ); -}; +}: Props): JSX.Element => ( + + + + +); diff --git a/src/ui/components/ColorIndicator.tsx b/src/ui/components/ColorIndicator.tsx index cfa8bc9..c81d020 100644 --- a/src/ui/components/ColorIndicator.tsx +++ b/src/ui/components/ColorIndicator.tsx @@ -1,16 +1,16 @@ -import { useStore } from '@nanostores/react'; +import { useStore } from '@nanostores/preact'; import { ColorPreview } from '~ui/components/ColorPreview.tsx'; import { ThemeVariablesKeys } from '~ui/components/ThemeVariablesProvider.tsx'; +import { Tooltip } from '~ui/components/Tooltip.tsx'; import { getFormatterForCSS, getFormatterForDisplaying, } from '~utils/colors/formatters.ts'; +import { useClipboard } from '~utils/use-clickboard.ts'; import { type Oklch } from 'culori/fn'; -import { type ReactElement } from 'react'; -import useClipboard from 'react-use-clipboard'; +import { type JSX } from 'preact'; import { $colorSpaceDisplayMode } from '../stores/color-space-display-mode.ts'; -import { Tooltip, TooltipContent, TooltipTrigger } from './Tooltip.tsx'; interface ColorIndicatorProps { borderColor: string; @@ -26,7 +26,7 @@ export const ColorIndicator = ({ indicatorColor, isBlended, textColor, -}: ColorIndicatorProps): ReactElement => { +}: ColorIndicatorProps): JSX.Element => { const colorSpaceDisplayMode = useStore($colorSpaceDisplayMode); const formatColorForDisplay = getFormatterForDisplaying( @@ -42,33 +42,29 @@ export const ColorIndicator = ({ }); return ( - - - - - {isCopied ? 'Copied!' : 'Copy as CSS'} + {displayValue} +
+ ); }; diff --git a/src/ui/components/ColorPreview.tsx b/src/ui/components/ColorPreview.tsx index f424023..1f022eb 100644 --- a/src/ui/components/ColorPreview.tsx +++ b/src/ui/components/ColorPreview.tsx @@ -1,6 +1,6 @@ import { BasicColorPreviewIcon } from '~ui/components/BasicColorPreviewIcon.tsx'; import { LayeredColorPreviewIcon } from '~ui/components/LayeredColorPreviewIcon.tsx'; -import { type ReactElement } from 'react'; +import { type JSX } from 'preact'; interface Props { borderColor: string; @@ -12,7 +12,7 @@ export const ColorPreview = ({ borderColor, indicatorColor, isBlended, -}: Props): ReactElement => { +}: Props): JSX.Element => { if (isBlended) { return (
diff --git a/src/ui/components/ContrastSample.tsx b/src/ui/components/ContrastSample.tsx index 9232c7b..23fea07 100644 --- a/src/ui/components/ContrastSample.tsx +++ b/src/ui/components/ContrastSample.tsx @@ -1,6 +1,6 @@ import { ThemeVariablesKeys } from '~ui/components/ThemeVariablesProvider.tsx'; import clsx from 'clsx'; -import { type ReactElement } from 'react'; +import { type JSX } from 'preact'; interface Props { bgColor: string; @@ -16,26 +16,24 @@ export const ContrastSample = ({ color, opacity, size, -}: Props): ReactElement => { - return ( -

( +

+ - - {exampleText} - -

- ); -}; + {exampleText} + +

+); diff --git a/src/ui/components/EmptySelectionMessage.tsx b/src/ui/components/EmptySelectionMessage.tsx index 1ffa2ae..1db5be4 100644 --- a/src/ui/components/EmptySelectionMessage.tsx +++ b/src/ui/components/EmptySelectionMessage.tsx @@ -1,15 +1,13 @@ import ufoImage from '~ui/assets/ufo@2x.webp'; -import { type ReactElement } from 'react'; +import { type JSX } from 'preact'; -export const EmptySelectionMessage = (): ReactElement => { - return ( -

- Select a layer with a solid fill -

- ); -}; +export const EmptySelectionMessage = (): JSX.Element => ( +

+ Select a layer with a solid fill +

+); diff --git a/src/ui/components/HelpIcon.tsx b/src/ui/components/HelpIcon.tsx index 47c8d38..89410d3 100644 --- a/src/ui/components/HelpIcon.tsx +++ b/src/ui/components/HelpIcon.tsx @@ -1,12 +1,10 @@ -import { type ReactElement } from 'react'; +import { type JSX } from 'preact'; -export const HelpIcon = (): ReactElement => { - return ( - - - - ); -}; +export const HelpIcon = (): JSX.Element => ( + + + +); diff --git a/src/ui/components/HelpLink.tsx b/src/ui/components/HelpLink.tsx index 530ce72..5b2fb65 100644 --- a/src/ui/components/HelpLink.tsx +++ b/src/ui/components/HelpLink.tsx @@ -1,27 +1,18 @@ import { HelpIcon } from '~ui/components/HelpIcon.tsx'; -import { - Tooltip, - TooltipContent, - TooltipTrigger, -} from '~ui/components/Tooltip.tsx'; -import { type ReactElement } from 'react'; +import { Tooltip } from '~ui/components/Tooltip.tsx'; +import { type JSX } from 'preact'; import { APCADocumentationURL } from '../../constants.ts'; -export const HelpLink = (): ReactElement => { - return ( - - - - - - - APCA in a Nutshell - - ); -}; +export const HelpLink = (): JSX.Element => ( + + + + + +); diff --git a/src/ui/components/InvalidBackgroundSelectionMessage.tsx b/src/ui/components/InvalidBackgroundSelectionMessage.tsx index 776ff80..a066062 100644 --- a/src/ui/components/InvalidBackgroundSelectionMessage.tsx +++ b/src/ui/components/InvalidBackgroundSelectionMessage.tsx @@ -1,15 +1,13 @@ import layersImage from '~ui/assets/layers@2x.webp'; -import { type ReactElement } from 'react'; +import { type JSX } from 'preact'; -export const InvalidBackgroundSelectionMessage = (): ReactElement => { - return ( -

- The background layer should be a solid fill -

- ); -}; +export const InvalidBackgroundSelectionMessage = (): JSX.Element => ( +

+ The background layer should be a solid fill +

+); diff --git a/src/ui/components/LayeredColorPreviewIcon.tsx b/src/ui/components/LayeredColorPreviewIcon.tsx index 26fa5bf..fde948b 100644 --- a/src/ui/components/LayeredColorPreviewIcon.tsx +++ b/src/ui/components/LayeredColorPreviewIcon.tsx @@ -1,4 +1,4 @@ -import { type ReactElement } from 'react'; +import { type JSX } from 'preact'; interface Props { borderColor: string; @@ -8,34 +8,32 @@ interface Props { export const LayeredColorPreviewIcon = ({ borderColor, indicatorColor, -}: Props): ReactElement => { - return ( -
- - - - - - -
- ); -}; +}: Props): JSX.Element => ( +
+ + + + + + +
+); diff --git a/src/ui/components/LurkersIcon.tsx b/src/ui/components/LurkersIcon.tsx index 3da9021..c2ac875 100644 --- a/src/ui/components/LurkersIcon.tsx +++ b/src/ui/components/LurkersIcon.tsx @@ -1,35 +1,33 @@ -import { type ReactElement } from 'react'; +import { type JSX } from 'preact'; -export const LurkersIcon = (): ReactElement => { - return ( -
- - - - - - -
- ); -}; +export const LurkersIcon = (): JSX.Element => ( +
+ + + + + + +
+); diff --git a/src/ui/components/LurkersLink.tsx b/src/ui/components/LurkersLink.tsx index 953706e..55c1372 100644 --- a/src/ui/components/LurkersLink.tsx +++ b/src/ui/components/LurkersLink.tsx @@ -1,27 +1,18 @@ import { LurkersIcon } from '~ui/components/LurkersIcon.tsx'; -import { - Tooltip, - TooltipContent, - TooltipTrigger, -} from '~ui/components/Tooltip.tsx'; -import { type ReactElement } from 'react'; +import { Tooltip } from '~ui/components/Tooltip.tsx'; +import { type JSX } from 'preact'; import { evilMartiansSiteURL } from '../../constants.ts'; -export const LurkersLink = (): ReactElement => { - return ( - - - - - - - Evil Martians - - ); -}; +export const LurkersLink = (): JSX.Element => ( + + + + + +); diff --git a/src/ui/components/PictureIcon.tsx b/src/ui/components/PictureIcon.tsx index a86ccd8..7decf74 100644 --- a/src/ui/components/PictureIcon.tsx +++ b/src/ui/components/PictureIcon.tsx @@ -1,15 +1,13 @@ import { ThemeVariablesKeys } from '~ui/components/ThemeVariablesProvider.tsx'; -import { type ReactElement } from 'react'; +import { type JSX } from 'preact'; -export const PictureIcon = (): ReactElement => { - return ( - - - - ); -}; +export const PictureIcon = (): JSX.Element => ( + + + +); diff --git a/src/ui/components/ProgressBar.tsx b/src/ui/components/ProgressBar.tsx index 27d457b..f89f35b 100644 --- a/src/ui/components/ProgressBar.tsx +++ b/src/ui/components/ProgressBar.tsx @@ -1,4 +1,4 @@ -import { useStore } from '@nanostores/react'; +import { useStore } from '@nanostores/preact'; import { RewardingAnimationBodyText } from '~ui/components/RewardingAnimationBodyText.tsx'; import { RewardingAnimationContentText } from '~ui/components/RewardingAnimationContentText.tsx'; import { RewardingAnimationFluentText } from '~ui/components/RewardingAnimationFluentText.tsx'; @@ -7,7 +7,7 @@ import { conclusions } from '~ui/services/apca/conclusion.ts'; import { $rewardAnimationLaunch } from '~ui/stores/selected-nodes.ts'; import { isEmpty } from '~utils/not-empty.ts'; import clsx from 'clsx'; -import { type ReactElement } from 'react'; +import { type JSX } from 'preact'; interface Props { apca: number; @@ -19,7 +19,7 @@ const APCA_NEGATIVE_MAX_SCALE = 108; const APCA_POSITIVE_MAX_SCALE = 106; const SERIF_OFFSET = 2; -export const ProgressBar = ({ apca, height }: Props): ReactElement => { +export const ProgressBar = ({ apca, height }: Props): JSX.Element => { const rewardAnimationLaunch = useStore($rewardAnimationLaunch); const maxScale = apca > 0 ? APCA_POSITIVE_MAX_SCALE : APCA_NEGATIVE_MAX_SCALE; const barWidth = maxScale * SCALE; @@ -74,7 +74,6 @@ export const ProgressBar = ({ apca, height }: Props): ReactElement => { )} style={{ // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-expect-error '--color-sparkles': `var(${ThemeVariablesKeys.fg})`, backgroundColor: `var(${ThemeVariablesKeys.bg})`, left: position, diff --git a/src/ui/components/RewardingAnimationBodyText.tsx b/src/ui/components/RewardingAnimationBodyText.tsx index 36bb557..07c77fe 100644 --- a/src/ui/components/RewardingAnimationBodyText.tsx +++ b/src/ui/components/RewardingAnimationBodyText.tsx @@ -1,11 +1,9 @@ -import { type ReactElement } from 'react'; +import { type JSX } from 'preact'; -export const RewardingAnimationBodyText = (): ReactElement => { - return ( -
-
-
-
-
- ); -}; +export const RewardingAnimationBodyText = (): JSX.Element => ( +
+
+
+
+
+); diff --git a/src/ui/components/RewardingAnimationContentText.tsx b/src/ui/components/RewardingAnimationContentText.tsx index bae601f..2336355 100644 --- a/src/ui/components/RewardingAnimationContentText.tsx +++ b/src/ui/components/RewardingAnimationContentText.tsx @@ -1,9 +1,7 @@ -import { type ReactElement } from 'react'; +import { type JSX } from 'preact'; -export const RewardingAnimationContentText = (): ReactElement => { - return ( -
-
-
- ); -}; +export const RewardingAnimationContentText = (): JSX.Element => ( +
+
+
+); diff --git a/src/ui/components/RewardingAnimationFluentText.tsx b/src/ui/components/RewardingAnimationFluentText.tsx index 0643fd7..5fef39b 100644 --- a/src/ui/components/RewardingAnimationFluentText.tsx +++ b/src/ui/components/RewardingAnimationFluentText.tsx @@ -1,12 +1,10 @@ -import { type ReactElement } from 'react'; +import { type JSX } from 'preact'; -export const RewardingAnimationFluentText = (): ReactElement => { - return ( -
-
-
-
-
-
- ); -}; +export const RewardingAnimationFluentText = (): JSX.Element => ( +
+
+
+
+
+
+); diff --git a/src/ui/components/SegmentedFontStyleDefinition.tsx b/src/ui/components/SegmentedFontStyleDefinition.tsx index 152e4c5..8ab4fb7 100644 --- a/src/ui/components/SegmentedFontStyleDefinition.tsx +++ b/src/ui/components/SegmentedFontStyleDefinition.tsx @@ -1,6 +1,6 @@ import { type UIColor } from '~types/common.ts'; import { formatColorForTheme } from '~ui/components/ThemeVariablesProvider.tsx'; -import { type ReactElement } from 'react'; +import { type JSX } from 'preact'; interface Props { currentStyleNumber: number; @@ -14,7 +14,7 @@ export const SegmentedFontStyleDefinition = ({ id, primaryColor, secondaryColor, -}: Props): ReactElement => { +}: Props): JSX.Element => { const formattedCurrentStyleNumber = currentStyleNumber.toLocaleString( 'en-US', { diff --git a/src/ui/components/Selection.tsx b/src/ui/components/Selection.tsx index d393ba5..6cbbf1f 100644 --- a/src/ui/components/Selection.tsx +++ b/src/ui/components/Selection.tsx @@ -1,3 +1,4 @@ +import { signal } from '@preact/signals'; import { ThemeVariablesKeys, ThemeVariablesProvider, @@ -5,13 +6,13 @@ import { import { type ContrastConclusion } from '~ui/types'; import { isEmpty } from '~utils/not-empty.ts'; import clsx from 'clsx'; -import { type ReactElement, useState } from 'react'; +import { type JSX } from 'preact'; import { generateUIColors } from '../services/theme/generate-ui-colors.ts'; import { SegmentedFontStyleDefinition } from './SegmentedFontStyleDefinition.tsx'; import { SelectionContent } from './SelectionContent.tsx'; -const CantCalculateMessage = (): ReactElement => ( +const CantCalculateMessage = (): JSX.Element => (

Can't calc

@@ -34,17 +35,15 @@ export const Selection = ({ isLast, size, userSelection: { apca, bg, fg }, -}: Props): ReactElement => { - const [currentStyleNumber, setCurrentStyleNumber] = useState( - SEGMENTED_FONT_STYLES.INITIAL - ); +}: Props): JSX.Element => { + const currentStyleNumber = signal(SEGMENTED_FONT_STYLES.INITIAL); const handleCurrentStyleNumberChange = (): void => { - const newStyleNumber = currentStyleNumber + 1; + const newStyleNumber = currentStyleNumber.value + 1; if (newStyleNumber > SEGMENTED_FONT_STYLES.MAX) { - setCurrentStyleNumber(SEGMENTED_FONT_STYLES.INITIAL); + currentStyleNumber.value = SEGMENTED_FONT_STYLES.INITIAL; } else { - setCurrentStyleNumber(newStyleNumber); + currentStyleNumber.value = newStyleNumber; } }; @@ -75,7 +74,7 @@ export const Selection = ({ }} > { +}: Props): JSX.Element => { const bgColor = formatColorForTheme(bg); const fgColor = formatColorForTheme(fg); return ( -
+
-

+

{Math.abs(apca)}

diff --git a/src/ui/components/SelectionsList.tsx b/src/ui/components/SelectionsList.tsx index b47f67c..e34183e 100644 --- a/src/ui/components/SelectionsList.tsx +++ b/src/ui/components/SelectionsList.tsx @@ -1,31 +1,29 @@ import { Selection } from '~ui/components/Selection.tsx'; import { type ContrastConclusionList } from '~ui/services/blend/blend-colors.ts'; import clsx from 'clsx'; -import { type ReactElement } from 'react'; +import { type JSX } from 'preact'; interface Props { contrastConclusion: ContrastConclusionList; } -export const SelectionsList = ({ contrastConclusion }: Props): ReactElement => { - return ( -
    - {contrastConclusion?.map((pair, index) => ( -
  • - -
  • - ))} -
- ); -}; +export const SelectionsList = ({ contrastConclusion }: Props): JSX.Element => ( +
    + {contrastConclusion?.map((pair, index) => ( +
  • + +
  • + ))} +
+); diff --git a/src/ui/components/SettingsButton.tsx b/src/ui/components/SettingsButton.tsx index 2698bc9..b153596 100644 --- a/src/ui/components/SettingsButton.tsx +++ b/src/ui/components/SettingsButton.tsx @@ -1,38 +1,23 @@ -import { useStore } from '@nanostores/react'; +import { useStore } from '@nanostores/preact'; import { SettingsIcon } from '~ui/components/SettingsIcon.tsx'; -import { - Tooltip, - TooltipContent, - TooltipTrigger, -} from '~ui/components/Tooltip.tsx'; +import { Tooltip } from '~ui/components/Tooltip.tsx'; import { $colorSpaceDisplayMode, changeColorSpaceDisplayMode, colorSpaceDisplayModesList, } from '~ui/stores/color-space-display-mode.ts'; import clsx from 'clsx'; -import { type ReactElement } from 'react'; +import { type VNode } from 'preact'; -export const SettingsButton = (): ReactElement => { +export const SettingsButton = (): VNode => { const colorSpaceDisplayMode = useStore($colorSpaceDisplayMode); return ( - - - - - - -

+ {colorSpaceDisplayModesList.map((mode) => { const isActive = mode === colorSpaceDisplayMode; - return ( { ); })} -

-
+
+ } + > + ); }; diff --git a/src/ui/components/SettingsIcon.tsx b/src/ui/components/SettingsIcon.tsx index 7307a71..bf916f2 100644 --- a/src/ui/components/SettingsIcon.tsx +++ b/src/ui/components/SettingsIcon.tsx @@ -1,14 +1,12 @@ -import { type ReactElement } from 'react'; +import { type JSX } from 'preact'; -export const SettingsIcon = (): ReactElement => { - return ( - - - - ); -}; +export const SettingsIcon = (): JSX.Element => ( + + + +); diff --git a/src/ui/components/StopIcon.tsx b/src/ui/components/StopIcon.tsx index a236b88..bbdc1b6 100644 --- a/src/ui/components/StopIcon.tsx +++ b/src/ui/components/StopIcon.tsx @@ -1,16 +1,14 @@ import { ThemeVariablesKeys } from '~ui/components/ThemeVariablesProvider.tsx'; -import { type ReactElement } from 'react'; +import { type JSX } from 'preact'; -export const StopIcon = (): ReactElement => { - return ( - - - - - ); -}; +export const StopIcon = (): JSX.Element => ( + + + + +); diff --git a/src/ui/components/TextMetrics.tsx b/src/ui/components/TextMetrics.tsx index b54b857..41799af 100644 --- a/src/ui/components/TextMetrics.tsx +++ b/src/ui/components/TextMetrics.tsx @@ -1,7 +1,7 @@ import { ThemeVariablesKeys } from '~ui/components/ThemeVariablesProvider.tsx'; import { conclusions } from '~ui/services/apca/conclusion.ts'; import { fontLookupAPCA } from 'apca-w3'; -import { type ReactElement } from 'react'; +import { type JSX } from 'preact'; import { PictureIcon } from './PictureIcon.tsx'; import { StopIcon } from './StopIcon.tsx'; @@ -11,7 +11,7 @@ interface Props { apca: number; } -export const TextMetrics = ({ apca }: Props): ReactElement => { +export const TextMetrics = ({ apca }: Props): JSX.Element => { const [, , , , regular, , , bold] = fontLookupAPCA(apca); if (Math.abs(apca) < conclusions['Not Readable']) { diff --git a/src/ui/components/ThemeVariablesProvider.tsx b/src/ui/components/ThemeVariablesProvider.tsx index 3fac048..7a1fc69 100644 --- a/src/ui/components/ThemeVariablesProvider.tsx +++ b/src/ui/components/ThemeVariablesProvider.tsx @@ -4,10 +4,10 @@ import { type Theme } from '~ui/services/theme/generate-ui-colors.ts'; import { formatForOklchCSS } from '~utils/colors/formatters.ts'; import { isEmpty, notEmpty } from '~utils/not-empty.ts'; import { formatHex8 } from 'culori/fn'; -import { type ReactElement } from 'react'; +import { type JSX } from 'preact'; interface Props { - children: ReactElement; + children: JSX.Element; theme: Theme; } @@ -45,7 +45,7 @@ export const formatColorForTheme = ( export const ThemeVariablesProvider = ({ children, theme, -}: Props): ReactElement => { +}: Props): JSX.Element => { const styles = { [ThemeVariablesKeys.bg]: formatColorForTheme(theme.bg), [ThemeVariablesKeys.bgBorder]: formatColorForTheme(theme.bgBorder), @@ -73,7 +73,6 @@ export const ThemeVariablesProvider = ({ return ( // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-expect-error
{children}
diff --git a/src/ui/components/Tooltip.tsx b/src/ui/components/Tooltip.tsx index e45ce5b..7f2c9e3 100644 --- a/src/ui/components/Tooltip.tsx +++ b/src/ui/components/Tooltip.tsx @@ -1,188 +1,144 @@ import { autoUpdate, + computePosition, flip, - FloatingPortal, offset, type Placement, shift, - useDismiss, - useFloating, - useFocus, - useHover, - useInteractions, - useMergeRefs, - useRole, -} from '@floating-ui/react'; -import { isEmpty } from '~utils/not-empty.ts'; +} from '@floating-ui/dom'; import { - cloneElement, - createContext, - forwardRef, - type HTMLProps, - isValidElement, - type ReactElement, - type ReactNode, - useContext, - useMemo, - useState, -} from 'react'; - -interface TooltipOptions { - initialOpen?: boolean; - onOpenChange?: (open: boolean) => void; - open?: boolean; + Component, + type ComponentChildren, + Fragment, + type VNode, +} from 'preact'; +import { useEffect, useRef, useState } from 'preact/hooks'; + +interface TooltipProps { + children: ComponentChildren; + className?: string; + content: ComponentChildren; + delay?: number; placement?: Placement; + style?: 'dark' | 'light'; + trigger?: 'click' | 'hover' | 'none'; } -interface TooltipContextType { - floatingStyles: HTMLProps['style']; - getFloatingProps: ( - props?: HTMLProps - ) => HTMLProps; - getReferenceProps: ( - props?: HTMLProps - ) => HTMLProps; - open: boolean; - refs: { - setFloating: (node: HTMLElement | null) => void; - setReference: (node: HTMLElement | null) => void; - }; - setOpen: (open: boolean) => void; -} - -export const useTooltip = ({ - initialOpen = false, - onOpenChange: setControlledOpen, - open: controlledOpen, - placement = 'top', -}: TooltipOptions = {}): TooltipContextType => { - const [uncontrolledOpen, setUncontrolledOpen] = useState(initialOpen); - - const open = controlledOpen ?? uncontrolledOpen; - const setOpen = setControlledOpen ?? setUncontrolledOpen; - - const data = useFloating({ - middleware: [ - offset(5), - flip({ - crossAxis: placement.includes('-'), - fallbackAxisSideDirection: 'start', - padding: 5, - }), - shift({ padding: 5 }), - ], - onOpenChange: setOpen, - open, - placement, - whileElementsMounted: autoUpdate, - }); - - const context = data.context; - - const hover = useHover(context, { - delay: { - close: 0, - open: 150, - }, - enabled: isEmpty(controlledOpen), - move: false, - }); - const focus = useFocus(context, { - enabled: isEmpty(controlledOpen), - }); - const dismiss = useDismiss(context); - const role = useRole(context, { role: 'tooltip' }); +type PreactComponent = { base: HTMLElement } & Component; - const interactions = useInteractions([hover, focus, dismiss, role]); - - return useMemo( - () => ({ - open, - setOpen, - ...interactions, - ...data, - }), - [open, setOpen, interactions, data] - ); -}; - -type ContextType = null | ReturnType; - -const TooltipContext = createContext(null); - -export const useTooltipContext = (): ContextType => { - const context = useContext(TooltipContext); - - if (isEmpty(context)) { - throw new Error('Tooltip components must be wrapped in '); +class RefWrapper extends Component<{ children: ComponentChildren; ref: any }> { + render(): ComponentChildren { + return this.props.children; } - - return context; -}; +} export const Tooltip = ({ children, - ...options -}: { children: ReactNode } & TooltipOptions): ReactElement => { - const tooltip = useTooltip(options); - return ( - - {children} - - ); -}; - -export const TooltipTrigger = forwardRef< - HTMLButtonElement, - HTMLProps & { asChild?: boolean } ->(function TooltipTrigger({ asChild = false, children, ...props }, propRef) { - const context = useTooltipContext(); - const childrenRef = (children as any).ref; - const ref = useMergeRefs([context?.refs.setReference, propRef, childrenRef]); - - if (asChild && isValidElement(children)) { - return cloneElement( - children, - context?.getReferenceProps({ - ref, - ...props, - ...children.props, - 'data-state': context.open ? 'open' : 'closed', - }) - ); - } - - return ( - - {children} - - ); -}); - -export const TooltipContent = forwardRef< - HTMLDivElement, - HTMLProps ->(function TooltipContent({ style, ...props }, propRef) { - const context = useTooltipContext(); - const ref = useMergeRefs([context?.refs.setFloating, propRef]); - - if (context?.open === false) return null; - + className = '', + content, + delay = 150, + placement = 'top', + trigger = 'hover', +}: TooltipProps): VNode => { + const reference = useRef(null); + const floating = useRef(null); + const [visible, setVisible] = useState(false); + const st = useRef(null); + + const refCurrent = reference.current; + const floatingCurrent = floating.current; + /* ── position ─────────────────────────────────────────────────────── */ + useEffect(() => { + if ( + refCurrent === null || + floatingCurrent === null || + refCurrent.base === null + ) + return; + + return autoUpdate(refCurrent.base, floatingCurrent, () => { + void computePosition(refCurrent.base, floatingCurrent, { + middleware: [ + offset(5), + flip({ + crossAxis: placement.includes('-'), + fallbackAxisSideDirection: 'start', + padding: 5, + }), + shift({ padding: 5 }), + ], + placement, + }).then(({ x, y }) => { + Object.assign(floatingCurrent.style, { + left: `${x}px`, + top: `${y}px`, + }); + }); + }); + }, [placement, visible]); + + /* ── trigger wiring ───────────────────────────────────────────────── */ + useEffect(() => { + const refEl = reference.current?.base; + const floatEl = floating.current; + if (refEl == null || floatEl == null) return; + + /* helpers */ + const clear = (): void => { + if (st.current != null) clearTimeout(st.current); + }; + const show = (): void => { + clear(); + st.current = setTimeout(() => { + setVisible(true); + }, delay); + }; + const hide = (): void => { + clear(); + setVisible(false); + }; + + /* attach based on *current* trigger prop */ + if (trigger === 'hover') { + refEl.addEventListener('mouseenter', show); + refEl.addEventListener('mouseleave', hide); + floatEl.addEventListener('mouseenter', show); + floatEl.addEventListener('mouseleave', hide); + } + /* "none" ⇒ nothing attached */ + + if (trigger === 'none') { + /* cancel any pending timers */ + if (st.current != null) clearTimeout(st.current); + /* instantly hide bubble */ + setVisible(false); + } + + /* detach when `trigger` changes or component unmounts */ + return () => { + clear(); + if (trigger === 'hover') { + refEl.removeEventListener('mouseenter', show); + refEl.removeEventListener('mouseleave', hide); + floatEl.removeEventListener('mouseenter', show); + floatEl.removeEventListener('mouseleave', hide); + } + }; + }, [trigger, delay]); + + /* ── render ───────────────────────────────────────────────────────── */ return ( - +
- + className={`absolute z-50 w-max rounded-full bg-black px-3 py-1.5 font-martianMono text-xxs font-medium text-white + shadow-md transition-opacity dark:bg-white dark:text-black ${visible ? 'opacity-100' : 'opacity-0'} ${className} `} + ref={floating} + role="tooltip" + style={{ visibility: visible ? 'visible' : 'hidden' }} + > + {content} +
+ {children} +
); -}); +}; diff --git a/src/ui/components/UnprocessedBlendModesSelectionMessage.tsx b/src/ui/components/UnprocessedBlendModesSelectionMessage.tsx index ba3b09d..4173d63 100644 --- a/src/ui/components/UnprocessedBlendModesSelectionMessage.tsx +++ b/src/ui/components/UnprocessedBlendModesSelectionMessage.tsx @@ -1,15 +1,13 @@ import layersImage from '~ui/assets/layers@2x.webp'; -import { type ReactElement } from 'react'; +import { type JSX } from 'preact'; -export const UnprocessedBlendModesSelectionMessage = (): ReactElement => { - return ( -

- The blending mode Plus Darker is not supported -

- ); -}; +export const UnprocessedBlendModesSelectionMessage = (): JSX.Element => ( +

+ The blending mode Plus Darker is not supported +

+); diff --git a/src/ui/components/WarningIcon.tsx b/src/ui/components/WarningIcon.tsx index 73a0b61..69697aa 100644 --- a/src/ui/components/WarningIcon.tsx +++ b/src/ui/components/WarningIcon.tsx @@ -1,15 +1,13 @@ import { ThemeVariablesKeys } from '~ui/components/ThemeVariablesProvider.tsx'; -import { type ReactElement } from 'react'; +import { type JSX } from 'preact'; -export const WarningIcon = (): ReactElement => { - return ( - - - - ); -}; +export const WarningIcon = (): JSX.Element => ( + + + +); diff --git a/src/ui/index.tsx b/src/ui/index.tsx index e401bd8..b7f47fd 100644 --- a/src/ui/index.tsx +++ b/src/ui/index.tsx @@ -1,16 +1,15 @@ -import { createRoot } from 'react-dom/client'; +import { render } from 'preact'; import { notEmpty } from '../utils/not-empty.ts'; import { App } from './components/App'; import './style.css'; -document.addEventListener('DOMContentLoaded', function () { +document.addEventListener('DOMContentLoaded', () => { const container = document.getElementById('root'); if (notEmpty(container)) { - const root = createRoot(container); - root.render(); + render(, container); } else { - console.error('Failed to find container element for React root'); + console.error('Failed to find container element for root'); } }); diff --git a/src/ui/services/blend-modes/map-figma-blend-to-canvas.ts b/src/ui/services/blend-modes/map-figma-blend-to-canvas.ts index 8e96afc..3eef03d 100644 --- a/src/ui/services/blend-modes/map-figma-blend-to-canvas.ts +++ b/src/ui/services/blend-modes/map-figma-blend-to-canvas.ts @@ -1,5 +1,5 @@ import { notEmpty } from '~utils/not-empty.ts'; -import { type CSSProperties } from 'react'; +import { type CSSProperties } from 'preact/compat'; export const mapFigmaBlendToCanvas = ( figmaBlend?: BlendMode diff --git a/src/ui/services/blend/is-blended-fill.ts b/src/ui/services/blend/is-blended-fill.ts index 5bfa7d2..fab84c2 100644 --- a/src/ui/services/blend/is-blended-fill.ts +++ b/src/ui/services/blend/is-blended-fill.ts @@ -5,9 +5,7 @@ import { notEmpty } from '~utils/not-empty.ts'; export const isBlendedFill = ( node?: PolychromNode, fill?: FigmaPaint -): boolean => { - return ( +): boolean => ( (notEmpty(node) && node.opacity !== 1) || (notEmpty(fill) && fill.opacity !== 1) ); -}; diff --git a/src/ui/services/canvas/get-fill-from-ctx.ts b/src/ui/services/canvas/get-fill-from-ctx.ts index f30ac05..9af72a8 100644 --- a/src/ui/services/canvas/get-fill-from-ctx.ts +++ b/src/ui/services/canvas/get-fill-from-ctx.ts @@ -7,8 +7,6 @@ export const getFillFromCtx = ( x: number, y: number, colorSpace: FigmaColorSpace -): Uint8ClampedArray => { - return ctx.getImageData(x, y, 1, 1, { +): Uint8ClampedArray => ctx.getImageData(x, y, 1, 1, { colorSpace: isSupportsOKLCH ? CanvasColorSpace[colorSpace] : 'srgb', }).data; -}; diff --git a/src/ui/services/theme/generate-ui-colors.ts b/src/ui/services/theme/generate-ui-colors.ts index 21f51c0..4391331 100644 --- a/src/ui/services/theme/generate-ui-colors.ts +++ b/src/ui/services/theme/generate-ui-colors.ts @@ -40,15 +40,13 @@ const fixHue = (oklchColor: null | Oklch): null | Oklch => { return oklchColor; }; -const apcachToCulori = (apcachColor: ApcachColor): Oklch => { - return { +const apcachToCulori = (apcachColor: ApcachColor): Oklch => ({ alpha: apcachColor.alpha, c: apcachColor.chroma, h: apcachColor.hue, l: apcachColor.lightness, mode: 'oklch', - }; -}; + }); const transformFgColor = (colorFg: UIColor, colorBg: UIColor): UIColor => { const { oklch: oklchFg } = colorFg; @@ -195,9 +193,9 @@ const getSecondaryColor = (colorBg: UIColor): UIColor => { ) { if (apcachSecondaryA.chroma >= apcachSecondaryB.chroma) { return { hex: hexSecondaryA, oklch: apcachToCulori(apcachSecondaryA) }; - } else { + } return { hex: hexSecondaryB, oklch: apcachToCulori(apcachSecondaryB) }; - } + } // Else prefer the option with greater contrast @@ -209,9 +207,7 @@ const getSecondaryColor = (colorBg: UIColor): UIColor => { }; const getThemeWithMaxLc = (themes: Theme[]): null | Theme => { - const Lcs = themes.map((theme) => { - return theme.Lc; - }); + const Lcs = themes.map((theme) => theme.Lc); const max = Math.max(...Lcs); @@ -272,9 +268,9 @@ export const generateUIColors = ( oklchFg, theme, }; - } else { + } themes.push(theme); - } + // CASE 2: If the result contrast isn’t good enough, let’s change the BG theme = getThemeWithTransformedBg(colorFg, colorBg); @@ -287,9 +283,9 @@ export const generateUIColors = ( oklchFg, theme, }; - } else { + } themes.push(theme); - } + // If nothing worked, it’s time to change both and end there theme = getThemeWithBothColorsTransformed(colorFg, colorBg); @@ -306,7 +302,7 @@ export const generateUIColors = ( oklchFg, theme: themeWithMaxLc, }; - } else { + } return undefined; - } + }; diff --git a/src/ui/stores/color-space-display-mode.ts b/src/ui/stores/color-space-display-mode.ts index dd3255d..da6a61e 100644 --- a/src/ui/stores/color-space-display-mode.ts +++ b/src/ui/stores/color-space-display-mode.ts @@ -53,9 +53,12 @@ onMount($colorSpaceDisplayMode, () => { event.data?.pluginMessage.type === MessageTypes.ColorSpaceDisplayModeChange ) { - $colorSpaceDisplayMode.set( - event.data.pluginMessage.payload.colorSpaceDisplayMode - ); + const newValue = event.data.pluginMessage.payload.colorSpaceDisplayMode; + const currentValue = $colorSpaceDisplayMode.get(); + + if (newValue !== currentValue) { + $colorSpaceDisplayMode.set(newValue); + } } }; diff --git a/src/ui/stores/selected-nodes.ts b/src/ui/stores/selected-nodes.ts index f20cf37..cb8c76f 100644 --- a/src/ui/stores/selected-nodes.ts +++ b/src/ui/stores/selected-nodes.ts @@ -19,33 +19,25 @@ export const $userSelection = atom({ export const $contrastConclusion = atom([]); -export const $isP3 = computed($userSelection, (selection) => { - return 'colorSpace' in selection +export const $isP3 = computed($userSelection, (selection) => 'colorSpace' in selection ? selection.colorSpace === 'DISPLAY_P3' - : false; -}); + : false); -export const $isMultiSelection = computed($userSelection, (selection) => { - return 'selectedNodePairs' in selection +export const $isMultiSelection = computed($userSelection, (selection) => 'selectedNodePairs' in selection ? selection.selectedNodePairs.length > 1 - : false; -}); + : false); -export const $isInvalidBackground = computed($userSelection, (selection) => { - return ( +export const $isInvalidBackground = computed($userSelection, (selection) => ( 'text' in selection && selection.text === SelectionMessageTypes.invalidBackground - ); -}); + )); export const $isUnprocessedBlendModes = computed( $userSelection, - (selection) => { - return ( + (selection) => ( 'text' in selection && selection.text === SelectionMessageTypes.unprocessedBlendModes - ); - } + ) ); export const $isEmptySelection = computed( diff --git a/src/utils/apca/calculate-apca-score.ts b/src/utils/apca/calculate-apca-score.ts index 4da79a7..03a7991 100644 --- a/src/utils/apca/calculate-apca-score.ts +++ b/src/utils/apca/calculate-apca-score.ts @@ -13,7 +13,7 @@ export const calculateApcaScore = ( const contrast = APCAcontrast(fgY, bgY); return Math.round(Number(contrast)); - } else { + } const fgDecimal = convertDecimalRGBto255Scale(fg); const bgDecimal = convertDecimalRGBto255Scale(bg); @@ -25,5 +25,5 @@ export const calculateApcaScore = ( ) ) ); - } + }; diff --git a/src/utils/colors/formatters.ts b/src/utils/colors/formatters.ts index 19a02e0..f9cec42 100644 --- a/src/utils/colors/formatters.ts +++ b/src/utils/colors/formatters.ts @@ -29,12 +29,10 @@ export const convert255ScaleRGBtoDecimal = (color: { return { alpha: (alpha ?? 255) / 255, b: b / 255, g: g / 255, r: r / 255 }; }; -export const formatForOklchDisplay = (oklch: Oklch): string => { - return `${toPercent(oklch.l)} ${clearValue(oklch.c)} ${clearValue( +export const formatForOklchDisplay = (oklch: Oklch): string => `${toPercent(oklch.l)} ${clearValue(oklch.c)} ${clearValue( oklch.h ?? 0, 1 )}`; -}; export const formatForRgbDisplay = (oklch: Oklch): string => { const { b, g, r } = convertToRgb(oklch); @@ -90,12 +88,10 @@ export const formatForRGBCSS = (color: Oklch, opacity?: number): string => { return `rgb(${r255} ${g255} ${b255}${postfix})`; }; -export const formatForHexCSS = (color: Oklch): string => { - return formatHex({ +export const formatForHexCSS = (color: Oklch): string => formatHex({ ...color, mode: 'oklch', }); -}; export const getFormatterForCSS = ( colorSpaceDisplayMode: ColorSpaceDisplayModes diff --git a/src/utils/figma/get-actual-fill.ts b/src/utils/figma/get-actual-fill.ts index fa8aaab..0068faa 100644 --- a/src/utils/figma/get-actual-fill.ts +++ b/src/utils/figma/get-actual-fill.ts @@ -3,11 +3,9 @@ import { notEmpty } from '~utils/not-empty.ts'; export const getActualFill = ( fills: FigmaPaint[] | readonly Paint[] -): Paint | undefined => { - return Array.from(fills) +): Paint | undefined => Array.from(fills) .reverse() .find( (fill) => fill.visible === true && notEmpty(fill.opacity) && fill.opacity > 0 ); -}; diff --git a/src/utils/figma/get-actual-node.ts b/src/utils/figma/get-actual-node.ts index 2c029e1..a427fcd 100644 --- a/src/utils/figma/get-actual-node.ts +++ b/src/utils/figma/get-actual-node.ts @@ -3,8 +3,7 @@ import { notEmpty } from '~utils/not-empty.ts'; export const getActualNode = ( nodes: PolychromNode[] -): PolychromNode | undefined => { - return nodes.find( +): PolychromNode | undefined => nodes.find( (node) => node.visible === true && notEmpty(node.opacity) && @@ -15,4 +14,3 @@ export const getActualNode = ( fill.visible === true && notEmpty(fill.opacity) && fill.opacity > 0 ) ); -}; diff --git a/src/utils/figma/sort-by-depth-and-order.ts b/src/utils/figma/sort-by-depth-and-order.ts index 68a51ba..80d992f 100644 --- a/src/utils/figma/sort-by-depth-and-order.ts +++ b/src/utils/figma/sort-by-depth-and-order.ts @@ -5,11 +5,9 @@ import { type PolychromNode } from '~types/common.ts'; // In the Figma world the selected node is always on top of the other nodes export const sortByDepthAndOrder = ( flatNodesList: PolychromNode[] -): PolychromNode[] => { - return flatNodesList.sort((a, b) => { +): PolychromNode[] => flatNodesList.sort((a, b) => { const levelDifference = b.nestingLevel - a.nestingLevel; const zIndexDifference = Math.abs(b.zIndex ?? 0) - Math.abs(a.zIndex ?? 0); return levelDifference !== 0 ? levelDifference : zIndexDifference; }); -}; diff --git a/src/utils/use-clickboard.ts b/src/utils/use-clickboard.ts new file mode 100644 index 0000000..eaadda5 --- /dev/null +++ b/src/utils/use-clickboard.ts @@ -0,0 +1,36 @@ +import { useSignal } from '@preact/signals'; +import copy from 'copy-to-clipboard'; +import { useEffect, useRef } from 'preact/hooks'; + +export const useClipboard = ( + value: string, + options?: { + successDuration?: number; + } +): [boolean, () => void] => { + const isCopied = useSignal(false); + const timeoutRef = useRef>(null); + const successDuration = options?.successDuration ?? 2000; + + const setCopied = (): void => { + const copied = copy(value); + isCopied.value = copied; + + if (copied) { + if (timeoutRef.current !== null) clearTimeout(timeoutRef.current); + + timeoutRef.current = setTimeout(() => { + isCopied.value = false; + }, successDuration); + } + }; + + useEffect( + () => () => { + if (timeoutRef.current !== null) clearTimeout(timeoutRef.current); + }, + [] + ); + + return [isCopied.value, setCopied]; +}; diff --git a/tsconfig.json b/tsconfig.json index 5cc2254..ae2bd44 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -12,7 +12,8 @@ "resolveJsonModule": true, "isolatedModules": true, "noEmit": true, - "jsx": "react-jsx", + "jsx": "preserve", + "jsxImportSource": "preact", "noUncheckedIndexedAccess": true, @@ -28,7 +29,7 @@ "~test-utils/*": ["src/test-utils/*"], "~types/*": ["src/types/*"], "~utils/*": ["src/utils/*"], - "~ui/*": ["src/ui/*"] + "~ui/*": ["src/ui/*"], } }, "include": ["src"], diff --git a/vite.config.ui.ts b/vite.config.ui.ts index 2e1467e..1dd7e7b 100644 --- a/vite.config.ui.ts +++ b/vite.config.ui.ts @@ -1,9 +1,8 @@ /// import { defineConfig } from 'vite'; import { resolve } from 'path'; -import react from '@vitejs/plugin-react'; import { viteSingleFile } from 'vite-plugin-singlefile'; -import svgr from 'vite-plugin-svgr'; +import preact from '@preact/preset-vite'; export default defineConfig({ resolve: { @@ -14,7 +13,7 @@ export default defineConfig({ '~utils': resolve(__dirname, 'src', 'utils'), }, }, - plugins: [react(), svgr(), viteSingleFile()], + plugins: [preact(), viteSingleFile()], root: './src/ui', build: { emptyOutDir: false,