diff --git a/next.config.js b/next.config.js index e13d2ee..c78aee5 100644 --- a/next.config.js +++ b/next.config.js @@ -5,6 +5,11 @@ const CircularDependencyPlugin = require('circular-dependency-plugin'); const nextConfig = { reactStrictMode: false, transpilePackages: ['react-monaco-editor'], + eslint: { + // Warning: This allows production builds to successfully complete even if + // your project has ESLint errors. + ignoreDuringBuilds: true, + }, webpack: (config, { isServer }) => { // Monaco Editor and CircularDependency plugins only for client-side if (!isServer) { diff --git a/package-lock.json b/package-lock.json index 11c2624..0160b3c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -42,6 +42,7 @@ "@types/node": "^17.0.45", "@types/react": "^19.2.7", "@types/react-dom": "^19.2.3", + "autoprefixer": "^10.4.23", "eslint": "^8.8.0", "eslint-config-next": "^14.2.35", "eslint-config-react-app": "^7.0.0", @@ -54,6 +55,8 @@ "eslint-plugin-testing-library": "^5.0.1", "http-proxy-middleware": "^2.0.6", "jest": "^30.2.0", + "postcss": "^8.5.6", + "tailwindcss": "^3.4.19", "ts-jest": "^29.4.6", "typescript": "^5.9.3" } @@ -64,6 +67,18 @@ "integrity": "sha512-nhCBV3quEgesuf7c7KYfperqSS14T8bYuvJ8PcLJp6znkZpFc0AuW4qBtr8eKVyPPe/8RSr7sglCWPU5eaxwKQ==", "license": "MIT" }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@babel/code-frame": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", @@ -5179,6 +5194,12 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "dev": true + }, "node_modules/anymatch": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", @@ -5201,6 +5222,12 @@ "node": ">=14" } }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "dev": true + }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -5425,6 +5452,42 @@ "node": ">=8.0.0" } }, + "node_modules/autoprefixer": { + "version": "10.4.23", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.23.tgz", + "integrity": "sha512-YYTXSFulfwytnjAPlw8QHncHJmlvFKtczb8InXaAx9Q0LbfDnfEYDE55omerIJKihhmU61Ft+cAOSzQVaBUmeA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "browserslist": "^4.28.1", + "caniuse-lite": "^1.0.30001760", + "fraction.js": "^5.3.4", + "picocolors": "^1.1.1", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, "node_modules/available-typed-arrays": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", @@ -5728,6 +5791,18 @@ "node": "*" } }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/blakejs": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/blakejs/-/blakejs-1.2.1.tgz", @@ -5948,6 +6023,15 @@ "node": ">=6" } }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, "node_modules/camelize": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.1.tgz", @@ -6181,6 +6265,15 @@ "node": ">= 0.8" } }, + "node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, "node_modules/comment-parser": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.4.1.tgz", @@ -6319,6 +6412,18 @@ "postcss-value-parser": "^4.0.2" } }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/csstype": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", @@ -6513,6 +6618,12 @@ "node": ">=8" } }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "dev": true + }, "node_modules/diff-sequences": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz", @@ -6541,6 +6652,12 @@ "node": ">=8" } }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true + }, "node_modules/doctrine": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", @@ -7804,6 +7921,19 @@ "node": ">= 6" } }, + "node_modules/fraction.js": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-5.3.4.tgz", + "integrity": "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==", + "dev": true, + "engines": { + "node": "*" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/rawify" + } + }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -8523,6 +8653,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/is-boolean-object": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", @@ -10009,6 +10151,15 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, + "node_modules/jiti": { + "version": "1.21.7", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", + "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", + "dev": true, + "bin": { + "jiti": "bin/jiti.js" + } + }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -10160,6 +10311,18 @@ "node": ">= 0.8.0" } }, + "node_modules/lilconfig": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, "node_modules/lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", @@ -10506,6 +10669,17 @@ "integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==", "license": "(Apache-2.0 AND MIT)" }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, "node_modules/nanoid": { "version": "3.3.11", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", @@ -10620,6 +10794,33 @@ "tslib": "^2.4.0" } }, + "node_modules/next/node_modules/postcss": { + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, "node_modules/node-fetch": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", @@ -10697,6 +10898,15 @@ "node": ">=0.10.0" } }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, "node_modules/object-inspect": { "version": "1.13.4", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", @@ -11115,6 +11325,15 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/pino": { "version": "10.0.0", "resolved": "https://registry.npmjs.org/pino/-/pino-10.0.0.tgz", @@ -11297,9 +11516,10 @@ } }, "node_modules/postcss": { - "version": "8.4.31", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", - "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "dev": true, "funding": [ { "type": "opencollective", @@ -11314,16 +11534,137 @@ "url": "https://github.com/sponsors/ai" } ], - "license": "MIT", "dependencies": { - "nanoid": "^3.3.6", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" }, "engines": { "node": "^10 || ^12 || >=14" } }, + "node_modules/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-js": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.1.0.tgz", + "integrity": "sha512-oIAOTqgIo7q2EOwbhb8UalYePMvYoIeRY2YKntdpFQXNosSu3vLrniGgmH9OKs/qAkfoj5oB3le/7mINW1LCfw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-load-config": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-6.0.1.tgz", + "integrity": "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "lilconfig": "^3.1.1" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "jiti": ">=1.21.0", + "postcss": ">=8.0.9", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + }, + "postcss": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/postcss-nested": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", + "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "postcss-selector-parser": "^6.1.1" + }, + "engines": { + "node": ">=12.0" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/postcss-value-parser": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", @@ -11778,6 +12119,15 @@ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dev": true, + "dependencies": { + "pify": "^2.3.0" + } + }, "node_modules/readdirp": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", @@ -12846,6 +13196,28 @@ "integrity": "sha512-bhtUjWd/z6ltJiQwg0dUfxEJ+W+jdqQd8TbWLWyeIJHlnsqmGLRFFd8e5mA0AZi/zx90smXRlN66YMTcaSFifg==", "license": "MIT" }, + "node_modules/sucrase": { + "version": "3.35.1", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.1.tgz", + "integrity": "sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "tinyglobby": "^0.2.11", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -12887,6 +13259,91 @@ "url": "https://opencollective.com/synckit" } }, + "node_modules/tailwindcss": { + "version": "3.4.19", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.19.tgz", + "integrity": "sha512-3ofp+LL8E+pK/JuPLPggVAIaEuhvIz4qNcf3nA1Xn2o/7fb7s/TYpHhwGDv1ZU3PkBluUVaF8PyCHcm48cKLWQ==", + "dev": true, + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.6.0", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.3.2", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.21.7", + "lilconfig": "^3.1.3", + "micromatch": "^4.0.8", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.1.1", + "postcss": "^8.4.47", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.2 || ^5.0 || ^6.0", + "postcss-nested": "^6.2.0", + "postcss-selector-parser": "^6.1.2", + "resolve": "^1.22.8", + "sucrase": "^3.35.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tailwindcss/node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/tailwindcss/node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/tailwindcss/node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, "node_modules/test-exclude": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", @@ -12930,6 +13387,27 @@ "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", "license": "MIT" }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dev": true, + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, "node_modules/thread-stream": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-3.1.0.tgz", @@ -13001,6 +13479,12 @@ "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", "license": "MIT" }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "dev": true + }, "node_modules/ts-jest": { "version": "29.4.6", "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.4.6.tgz", @@ -13651,6 +14135,12 @@ "which-typed-array": "^1.1.2" } }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, "node_modules/uuid": { "version": "10.0.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", diff --git a/package.json b/package.json index 355619e..1263e64 100644 --- a/package.json +++ b/package.json @@ -64,6 +64,7 @@ "@types/node": "^17.0.45", "@types/react": "^19.2.7", "@types/react-dom": "^19.2.3", + "autoprefixer": "^10.4.23", "eslint": "^8.8.0", "eslint-config-next": "^14.2.35", "eslint-config-react-app": "^7.0.0", @@ -76,6 +77,8 @@ "eslint-plugin-testing-library": "^5.0.1", "http-proxy-middleware": "^2.0.6", "jest": "^30.2.0", + "postcss": "^8.5.6", + "tailwindcss": "^3.4.19", "ts-jest": "^29.4.6", "typescript": "^5.9.3" } diff --git a/pages/_app.tsx b/pages/_app.tsx index b8dfa21..014a15d 100644 --- a/pages/_app.tsx +++ b/pages/_app.tsx @@ -5,19 +5,6 @@ import { loadConfig } from '~/state'; // Global CSS imports import '~/index.css'; -import '~/App.css'; -import '~/components/core/Header.css'; -import '~/components/core/StatusBar/StatusBar.css'; -import '~/components/core/StatusBar/StatusBarItem.css'; -import '~/components/core/Panel/PanelAction.css'; -import '~/components/core/Panel/PanelHeader.css'; -import '~/components/pages/Playground.css'; -import '~/components/pages/NotFoundPage.css'; -import '~/components/preview/Preview.css'; -import '~/components/preview/ResizablePreview.css'; -import '~/components/preview/EvalEventView.css'; -import '~/components/utils/EllipsisText.css'; -import '~/components/modals/EnvironmentSelectModal/EnvironmentSelectModal.css'; // Polyfills import 'core-js/actual/promise/all-settled'; diff --git a/postcss.config.js b/postcss.config.js new file mode 100644 index 0000000..33ad091 --- /dev/null +++ b/postcss.config.js @@ -0,0 +1,6 @@ +module.exports = { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +} diff --git a/src/App.css b/src/App.css deleted file mode 100644 index 3159369..0000000 --- a/src/App.css +++ /dev/null @@ -1,4 +0,0 @@ -.App { - display: flex; - flex-direction: column; -} diff --git a/src/components/Arguments/ArgumentsList.tsx b/src/components/Arguments/ArgumentsList.tsx deleted file mode 100644 index 082ba43..0000000 --- a/src/components/Arguments/ArgumentsList.tsx +++ /dev/null @@ -1,29 +0,0 @@ -import React from 'react'; -import {ArgumentsListProps} from './types'; -import SingleArgument from './SingleArgument'; -import {getContentStyles} from "~/styles/modal"; -import {useTheme} from "@fluentui/react"; - -export const ArgumentsList: React.FC = ({list,errors, onChange}) => { - const theme = useTheme(); - const contentStyles = getContentStyles(theme); - - return ( -
- {(list.length > 0) && - list.map((argument) => - - ) - } -
- ); -}; - - - - diff --git a/src/components/Arguments/SingleArgument.tsx b/src/components/Arguments/SingleArgument.tsx new file mode 100644 index 0000000..1878550 --- /dev/null +++ b/src/components/Arguments/SingleArgument.tsx @@ -0,0 +1,29 @@ +import React from "react"; +import {Argument} from "./types"; +import {TextField} from "@fluentui/react"; + +type SingleArgumentProps = { + argument: Argument; + error?: string; + onChange: (name: string, value: string) => void; +} + +const SingleArgument: React.FC = ({argument, error, onChange}) => { + const {name, type} = argument; + + return ( +
+ { + const {value} = event.target as HTMLInputElement; + onChange(name, value); + }} + /> + {error &&

{error}

} +
+ ); +} + +export default SingleArgument; diff --git a/src/components/Arguments/SingleArgument/index.tsx b/src/components/Arguments/SingleArgument/index.tsx deleted file mode 100644 index 8afae42..0000000 --- a/src/components/Arguments/SingleArgument/index.tsx +++ /dev/null @@ -1,28 +0,0 @@ -import React from "react"; -import {Argument} from "components/Arguments/types"; -import {InputBlock, Error} from "./styles"; -import {TextField} from "@fluentui/react"; - -type SingleArgumentProps = { - argument: Argument, - error: String, - onChange: (name: String, value: any) => void -} - -const SingleArgument: React.FC = ({argument, error, onChange}) => { - const {name, type} = argument - return ( - - { - const {value} = event.target as HTMLInputElement - onChange(name, value) - }}/> - {error && {error}} - - ) -} - -export default SingleArgument diff --git a/src/components/Arguments/SingleArgument/styles.tsx b/src/components/Arguments/SingleArgument/styles.tsx deleted file mode 100644 index cadcf40..0000000 --- a/src/components/Arguments/SingleArgument/styles.tsx +++ /dev/null @@ -1,49 +0,0 @@ -import styled from "styled-components" - -interface InputBlockProps { - mb?: string -} - -export const InputBlock = styled.div` - display: flex; - flex-direction: column; - margin-bottom: ${({mb = "0"}) => mb}; - position: relative; -` - - -export const Type = styled.span` - font-weight: normal; - margin-left: 4px; - &:before{ - content: "("; - } - &:after{ - content: ")"; - } -` - -export const Input = styled.input` - border: 1px solid #C4C4C4; - border-radius: 5px; - font-size: 12px; - color: #000; - padding: 8px; - width: 100%; - - margin-bottom: 5px; - &:last-child{ - margin-bottom: 0; - } - box-sizing: border-box; - - ::placeholder { - color: #999; - } -`; - -export const Error = styled.p` - display: inline; - font-size: 12px; - color: red; -`; diff --git a/src/components/Arguments/index.tsx b/src/components/Arguments/index.tsx index aed92b2..064e2ea 100644 --- a/src/components/Arguments/index.tsx +++ b/src/components/Arguments/index.tsx @@ -1,6 +1,6 @@ import React, {useContext, useEffect, useMemo, useRef, useState} from 'react'; -import {ArgumentsProps} from 'components/Arguments/types'; -import {ArgumentsList} from './ArgumentsList'; +import {ArgumentsProps} from './types'; +import SingleArgument from './SingleArgument'; import {CadenceCheckerContext} from "@components/editor/Cadence/CadenceChecker"; import {ExecuteCommandRequest} from 'monaco-languageclient'; import {CadenceCheckCompleted} from "@components/editor/Cadence/language-server"; @@ -8,144 +8,116 @@ import {useTheme} from "@fluentui/react"; import {getContentStyles} from "~/styles/modal"; import PanelHeader from "@components/core/Panel/PanelHeader"; import {VscChevronDown, VscChevronUp} from "react-icons/vsc"; -import {DragBox, DragMe} from "@components/Arguments/styles"; -import {use} from "use-minimal-state"; +import {use, update} from "use-minimal-state"; import {appState} from "~/state"; -const isDictionary = (type: string) => type.includes("{") -const isArray = (type: string) => type.includes("[") -const isImportedType = (type: string) => type.includes(".") -const isComplexType = (type: string) => isDictionary(type) - || isArray(type) - || isImportedType(type) +const isDictionary = (type: string) => type.includes("{"); +const isArray = (type: string) => type.includes("["); +const isImportedType = (type: string) => type.includes("."); +const isComplexType = (type: string) => isDictionary(type) || isArray(type) || isImportedType(type); const startsWith = (value: string, prefix: string) => { - return value.startsWith(prefix) || value.startsWith("U" + prefix) + return value.startsWith(prefix) || value.startsWith("U" + prefix); } -const checkJSON = (value: any, type: string) => { +const checkJSON = (value: string, type: string) => { try { - JSON.parse(value) - return null + JSON.parse(value); + return null; } catch (e) { - return `Not a valid argument of type ${type}` + return `Not a valid argument of type ${type}`; } } -const validateByType = ( - value: any, - type: string, -) => { +const validateByType = (value: string, type: string): string | null => { if (value.length === 0) { return "Value can't be empty"; } switch (true) { - // Strings - case type === 'String': { - return null; // no need to validate String for now - } - - // Integers - case startsWith(type, 'Int'): { - if (isNaN(value) || value === '') { - return 'Should be a valid Integer number'; - } - return null; - } - - // Words - case startsWith(type, 'Word'): { - if (isNaN(value) || value === '') { - return 'Should be a valid Word number'; - } + case type === 'String': return null; - } - // Fixed Point - case startsWith(type, 'Fix'): { - if (isNaN(value) || value === '') { - return 'Should be a valid fixed point number'; + case startsWith(type, 'Int'): + case startsWith(type, 'Word'): + case startsWith(type, 'Fix'): + if (isNaN(Number(value)) || value === '') { + return `Should be a valid ${type} number`; } return null; - } - case isComplexType(type): { - // This case it to catch complex arguments like Dictionaries + case isComplexType(type): return checkJSON(value, type); - } - // Address - case type === 'Address': { + case type === 'Address': if (!value.match(/(^0x[\w\d]{16})|(^0x[\w\d]{1,4})/)) { return 'Not a valid Address'; } return null; - } - // Booleans - case type === 'Bool': { + case type === 'Bool': if (value !== 'true' && value !== 'false') { return 'Boolean values can be either true or false'; } return null; - } - default: { + default: return null; - } } }; - interface IValue { [key: string]: string; } +interface IErrors { + [key: string]: string; +} + const Arguments: React.FC = (props) => { const {editor} = props; - const clientOnNotification = useRef(null); + const clientOnNotification = useRef(null); const {languageClient} = useContext(CadenceCheckerContext); const [executionArguments, setExecutionArguments] = useState({}); - const theme = useTheme(); - const contentStyles = getContentStyles(theme); - const [errors, setErrors] = useState({}) + const [errors, setErrors] = useState({}); const [values, setValue] = useState({}); + const [collapsed, setCollapsed] = useState(false); + const constraintsRef = useRef(null); - const editorState= use(appState, "editor") + const theme = useTheme(); + const contentStyles = getContentStyles(theme); + const editorState = use(appState, "editor"); - const parseParameters = async (): Promise<[any?]> => { + const parseParameters = async (): Promise => { if (!languageClient) { - return [] + return []; } + const fixed = list.map((arg: any) => { const {name, type} = arg; let value = values[name]; - if (type === `String`) { + if (type === 'String') { if (value == null) { - value = "" + value = ""; } value = `${value}`; } - // We probably better fix this on server side... if (type === 'UFix64') { if (value && value.indexOf('.') < 0) { value = `${value}.0`; } } - // Language server throws "input is not literal" without quotes - if (type === `String`) { + if (type === 'String') { value = `"${value.replace(/"/g, '\\"')}"`; } return value; }); - let formatted: any; try { formatted = await languageClient.sendRequest(ExecuteCommandRequest.type, { @@ -153,16 +125,12 @@ const Arguments: React.FC = (props) => { arguments: [editor?.getModel()?.uri.toString(), fixed], }); } catch (e) { - return [] + return []; } - // Map values to strings that will be passed to backend - return list.map((_: any, index: number) => - JSON.stringify(formatted[index]), - ); - + return list.map((_: any, index: number) => JSON.stringify(formatted[index])); } - const getParameters = async (): Promise<[any?]> => { + const getParameters = async (): Promise => { if (!languageClient) { return []; } @@ -181,105 +149,97 @@ const Arguments: React.FC = (props) => { return []; } }; - const setupLanguageClientListener = () => { - if (clientOnNotification.current) { - //dispose - } + const setupLanguageClientListener = () => { clientOnNotification.current = languageClient.onNotification( CadenceCheckCompleted.methodName, async (result: CadenceCheckCompleted.Params) => { - if (result.valid) { - const params = await getParameters(); - // Update state - console.log("update params", params) - setExecutionArguments({ - ...executionArguments, - params: params, - }); - } - else{ - setExecutionArguments({ - ...executionArguments, - params: [], - }); + const params = result.valid ? await getParameters() : []; + setExecutionArguments({ + ...executionArguments, + params, + }); + + // Update language server status back to ready after checking + if (appState.status.languageServerStatus === "checking") { + appState.status.languageServerStatus = "ready"; + update(appState, "status"); } }, ); }; - const getArguments = (): any => { - return executionArguments.params || []; - }; - - const list = useMemo(getArguments, [executionArguments]); - const [collapsed, setCollapsed] = useState(false) + const list = useMemo(() => executionArguments.params || [], [executionArguments]); useEffect(() => { if (languageClient) { - console.log("set listener") setupLanguageClientListener(); } }, [languageClient]); - useEffect(() => { - //onArgsChange(executionArguments) - }, [executionArguments]) - const constraintsRef = useRef(null) - - const validate = (list: any, values: any) => { - const errors = list.reduce((acc: any, item: any) => { + const validate = (list: any[], values: IValue) => { + const newErrors = list.reduce((acc: IErrors, item: any) => { const {name, type} = item; const value = values[name]; + if (value) { const error = validateByType(value, type); if (error) { acc[name] = error; } - } else { - if (type !== 'String') { - acc[name] = "Value can't be empty"; - } + } else if (type !== 'String') { + acc[name] = "Value can't be empty"; } + return acc; }, {}); - setErrors(errors); + setErrors(newErrors); }; useEffect(() => { if (list.length) { - validate(list, values) + validate(list, values); + } else { + // No arguments, no errors + editorState.hasArgumentErrors = false; + update(appState, "editor"); } }, [list, values]); useEffect(() => { - if (Object.keys(errors).length === 0) return - parseParameters().then((result) => { - editorState.jsonArgs = result - - }) - }, [errors, values, editorState]) + const hasErrors = Object.keys(errors).length > 0; + editorState.hasArgumentErrors = hasErrors; + if (!hasErrors) { + parseParameters().then((result) => { + editorState.jsonArgs = result; + }); + } - if (!list) return null - if (list.length === 0) return null + update(appState, "editor"); + }, [errors, values, editorState]); + if (!list || list.length === 0) { + return null; + } return ( <> - - - +
+
= (props) => { commands={{ 'collapse': { hidden: false, - icon: !collapsed ? : , + icon: !collapsed ? : , label: collapsed ? 'Expand' : 'Collapse', onClick: () => setCollapsed(!collapsed) }, }} /> - {!collapsed && - { - let key = name.toString(); - let newValue = {...values, [key]: value}; - setValue(newValue); - }} - /> - } - + {!collapsed && ( +
+ {list.map((argument: any) => ( + { + setValue({...values, [name]: value}); + }} + /> + ))} +
+ )}
- - - - ) - +
+ + ); } export default Arguments; diff --git a/src/components/Arguments/styles.tsx b/src/components/Arguments/styles.tsx deleted file mode 100644 index c693f85..0000000 --- a/src/components/Arguments/styles.tsx +++ /dev/null @@ -1,19 +0,0 @@ -import styled from "styled-components"; - -export const DragBox = styled.div` - position: absolute; - width: 100%; - height: 100%; - top: 0; - right: 0; - z-index: -1; -` - -export const DragMe = styled.div` - position: absolute; - right:20px; - top:50px; - width: fit-content; - height: fit-content; - z-index: 1000; -` diff --git a/src/components/Arguments/types.tsx b/src/components/Arguments/types.tsx index ec836b4..24944af 100644 --- a/src/components/Arguments/types.tsx +++ b/src/components/Arguments/types.tsx @@ -1,22 +1,15 @@ import {editor as monacoEditor} from 'monaco-editor/esm/vs/editor/editor.api'; - export type Argument = { name: string; type: string; }; export type ArgumentsProps = { - collapsed?: boolean + collapsed?: boolean; editor: monacoEditor.ICodeEditor; }; -export type ArgumentsListProps = { - list: Argument[]; - onChange: (name: String, value: any) => void; - errors: any; -}; - diff --git a/src/components/core/Header.css b/src/components/core/Header.css deleted file mode 100644 index 6c16eed..0000000 --- a/src/components/core/Header.css +++ /dev/null @@ -1,48 +0,0 @@ -.header { - position: relative; - display: flex; - flex-direction: row; - justify-content: space-between; - align-items: center; - min-height: 44px; -} - -.app__update { - display: none; - position: absolute; - top: 50%; - left: 50%; - transform: translate(-50%, -50%); - width: 100%; - max-width: 500px; - z-index: 9999; -} - -.app__update.app__update--visible { - display: block; -} - -.header__preloader { - margin-right: 15px; -} - -.header__logo { - height: 1.5em; - margin-left: 10px; -} - -.header__commandBar { - flex: 1 1 auto; -} - -@media only screen and (max-width: 600px) { - .header__commandBar .ms-CommandBar { - padding: 0 10px; - } - - .header__logo { - height: 1em; - margin: 0 10px; - display: none; - } -} diff --git a/src/components/core/Header.tsx b/src/components/core/Header.tsx index 395600e..88f01ce 100644 --- a/src/components/core/Header.tsx +++ b/src/components/core/Header.tsx @@ -93,19 +93,32 @@ export const Header: React.FC = ({embed}) => { } const menuItems = (): ICommandBarItemProps[] => { + const isRunDisabled = status.loading || editor.hasArgumentErrors; + if (embed!=="") return [ { key: 'run', text: 'Run', ariaLabel: 'Run program (Ctrl+Enter)', - title: 'Run program (Ctrl+Enter)', + title: editor.hasArgumentErrors + ? 'Fix argument errors before running' + : 'Run program (Ctrl+Enter)', iconProps: {iconName: 'Play'}, - disabled: status.loading, + disabled: isRunDisabled, onClick: () => { runFileAction() } }, + { + key: 'debug', + text: 'Debug', + ariaLabel: 'Debug program', + title: 'Coming soon', + iconProps: {iconName: 'BugSolid'}, + disabled: true, + onClick: () => {} + }, { key: 'download', @@ -133,13 +146,24 @@ export const Header: React.FC = ({embed}) => { key: 'run', text: 'Run', ariaLabel: 'Run program (Ctrl+Enter)', - title: 'Run program (Ctrl+Enter)', + title: editor.hasArgumentErrors + ? 'Fix argument errors before running' + : 'Run program (Ctrl+Enter)', iconProps: {iconName: 'Play'}, - disabled: status.loading, + disabled: isRunDisabled, onClick: () => { runFileAction() } }, + { + key: 'debug', + text: 'Debug', + ariaLabel: 'Debug program', + title: 'Coming soon', + iconProps: {iconName: 'BugSolid'}, + disabled: true, + onClick: () => {} + }, { key: 'share', text: 'Share', @@ -223,18 +247,17 @@ export const Header: React.FC = ({embed}) => { } return (
Flow Logo !hidden)} ariaLabel='CodeEditor menu' diff --git a/src/components/core/Panel/PanelAction.css b/src/components/core/Panel/PanelAction.css deleted file mode 100644 index ba52939..0000000 --- a/src/components/core/Panel/PanelAction.css +++ /dev/null @@ -1,23 +0,0 @@ -.PanelAction { - background: none; - font: inherit; - color: inherit; - border: none; - cursor: pointer; - display: flex; - align-items: center; - padding: 3px; - border-radius: 5px; - margin-right: 4px; -} - -.PanelAction:hover { - background: var(--pg-panel-action-hover-bg); -} - -@media (max-width: 480px) { - .PanelAction--desktopOnly { - display: none; - } -} - diff --git a/src/components/core/Panel/PanelAction.tsx b/src/components/core/Panel/PanelAction.tsx index 9979cc9..e1b0baf 100644 --- a/src/components/core/Panel/PanelAction.tsx +++ b/src/components/core/Panel/PanelAction.tsx @@ -16,7 +16,12 @@ const PanelAction: React.FC = ({hidden, icon, desktopOnly, lab return ( ) } @@ -87,11 +82,11 @@ const StatusBarItem: React.FC = ({ href={href} target="_blank" rel="noreferrer" - className={clsx(`${classValue} StatusBarItem--action`, className)} + className={clsx(baseClasses, actionClasses, hideTextOnMobile && 'max-sm:hidden', className)} title={title} {...props} > - { content } + {content} ) } @@ -99,11 +94,11 @@ const StatusBarItem: React.FC = ({ const { style } = props; return (
- { content } + {content}
); }; diff --git a/src/components/editor/Cadence/useLanguageServer.js b/src/components/editor/Cadence/useLanguageServer.js index f85baac..47c55fc 100644 --- a/src/components/editor/Cadence/useLanguageServer.js +++ b/src/components/editor/Cadence/useLanguageServer.js @@ -12,6 +12,9 @@ let monacoServicesInstalled = false; async function startLanguageServer(newCadence, callbacks, getCode, options) { console.log('[useLanguageServer] Starting language server...'); + appState.status.languageServerStatus = "initializing"; + update(appState, "status"); + const { setLanguageServer, setCallbacks } = options; const server = await CadenceLanguageServer.create(newCadence, callbacks); console.log('[useLanguageServer] Language server created, waiting for it to be ready...'); @@ -25,6 +28,8 @@ async function startLanguageServer(newCadence, callbacks, getCode, options) { callbacks.getAddressCode = getCode; setCallbacks(callbacks); setLanguageServer(server); + appState.status.languageServerStatus = "ready"; + update(appState, "status"); console.log("%c LS: Is Up!", "color: #00FF00"); } }, 100); diff --git a/src/components/editor/CodeEditor.tsx b/src/components/editor/CodeEditor.tsx index 8b8f761..4aec8d4 100644 --- a/src/components/editor/CodeEditor.tsx +++ b/src/components/editor/CodeEditor.tsx @@ -81,6 +81,11 @@ export const CodeEditor: React.FC = ()=>{ const onChange = (newValue: string, _: editor.IModelContentChangedEvent)=>{ editorState.code=newValue update(appState, "editor") + + // Set language server status to checking + status.languageServerStatus = "checking" + update(appState, "status") + doAnalyze() } diff --git a/src/components/editor/FlexContainer.tsx b/src/components/editor/FlexContainer.tsx index 3d8ef00..1dae1e5 100644 --- a/src/components/editor/FlexContainer.tsx +++ b/src/components/editor/FlexContainer.tsx @@ -4,7 +4,8 @@ const FlexContainer: FC> = ({ children }) => (
{children}
diff --git a/src/components/modals/EnvironmentSelectModal/EnvironmentSelectModal.css b/src/components/modals/EnvironmentSelectModal/EnvironmentSelectModal.css deleted file mode 100644 index 4831f7c..0000000 --- a/src/components/modals/EnvironmentSelectModal/EnvironmentSelectModal.css +++ /dev/null @@ -1,5 +0,0 @@ -.EnvironmentSelectButton__icon { - color: var(--color-idle); - margin-right: 12px; - font-size: 2em; -} diff --git a/src/components/modals/EnvironmentSelectModal/EnvironmentSelectModal.tsx b/src/components/modals/EnvironmentSelectModal/EnvironmentSelectModal.tsx index dace7b8..08d77f9 100644 --- a/src/components/modals/EnvironmentSelectModal/EnvironmentSelectModal.tsx +++ b/src/components/modals/EnvironmentSelectModal/EnvironmentSelectModal.tsx @@ -22,12 +22,6 @@ const options = [ type: RuntimeType.FlowTestnet, icon: }, - { - label: 'Flow Previewnet', - description: 'Run scripts and transactions on Flow Previewnet.', - type: RuntimeType.FlowPreviewnet, - icon: - }, { label: 'Local Emulator', description: 'Run scripts and transactions on the local Flow Emulator.', @@ -78,15 +72,11 @@ const EnvironmentSelectModal: React.FC = ({ options.map(({label, description, type, icon}) => ( {icon}} secondaryText={description} checked={type === value} className={buttonStyles.button} onClick={() => onClose?.(type)} - onRenderIcon={() => ( -
- {icon} -
- )} > {label}
diff --git a/src/components/pages/NotFoundPage.css b/src/components/pages/NotFoundPage.css deleted file mode 100644 index 705edc8..0000000 --- a/src/components/pages/NotFoundPage.css +++ /dev/null @@ -1,85 +0,0 @@ -.errorPage { - background: #1f1f1f; - color: #f4f4f4; - margin: 0; - padding: 0; - font: 11pt system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", "Liberation Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; -} -.errorPage__inner { - display: flex; - justify-content: center; - justify-items: center; - position: fixed; - inset: 0; - flex-direction: row-reverse; - background: #1f1f1f; - color: #f4f4f4; - font-family: inherit; -} -.errorPage__container { - align-self: center; - width: 100%; - max-width: 480px; - font-family: inherit; -} -.errorPage__statusCode { - font: bold 6rem SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; - margin: 0 0 2rem 0; - padding: 0; - display: block; - -webkit-filter: url(#chromatic-aberration); - filter: url(#chromatic-aberration); -} -.errorPage__statusText { - margin: 0; - padding: 0; - display: block; - font-size: 2rem; - font-family: inherit; -} -.errorPage__message { - margin: 1rem 0; - color: #999; -} -.errorPage__message p { - margin: 0 0 .3rem 0; - padding: 0; -} -.errorPage__actions { - margin-top: 4rem; - display: flex; - justify-content: flex-end; -} -.errorPage__actions>* { - margin-left: 1rem; -} -.btn--primary, .btn--transparent { - border: none; - text-decoration: none; - padding: .5rem 1rem; - font-family: inherit; -} -.btn--transparent { - color: #777; - background: transparent; - cursor: pointer; -} -.btn--transparent:hover, .btn--transparent:focus { - color: inherit; -} -.btn--primary { - color: #f4f4f4; - background: #005A9C; - border-radius: 2px; -} -.btn--primary:hover, .btn--primary:focus { - background: #00498B; -} -.gopher { - height: 320px; - align-self: center; - margin-right: 2.5rem; -} -.gopher__image { - height: 100%; -} diff --git a/src/components/pages/NotFoundPage.tsx b/src/components/pages/NotFoundPage.tsx index 03544c9..2684857 100644 --- a/src/components/pages/NotFoundPage.tsx +++ b/src/components/pages/NotFoundPage.tsx @@ -3,25 +3,27 @@ import Link from 'next/link'; const NotFoundPage: React.FC = () => { return ( -
-
-
-

404!

-

Page Not Found

-
-

+

+
+
+

+ 404! +

+

Page Not Found

+
+

Requested page does not exist or was deleted.

-

+

That's all we know 🤷

-
- - Go To Home +
+ + Go To Home +
-
diff --git a/src/components/pages/Playground.css b/src/components/pages/Playground.css deleted file mode 100644 index 29d0a83..0000000 --- a/src/components/pages/Playground.css +++ /dev/null @@ -1,25 +0,0 @@ -.Playground { - position: absolute; - top: 0; - left: 0; - bottom: 0; - right: 0; - height: 100%; - width: 100%; - display: flex; - flex-direction: column; -} - -.Layout { - display: flex; - flex: 1 1 auto; - overflow: hidden; -} - -.Layout.Layout--vertical { - flex-direction: column; -} - -.Layout.Layout--horizontal { - flex-direction: row; -} \ No newline at end of file diff --git a/src/components/pages/Playground.tsx b/src/components/pages/Playground.tsx index 6b76c78..7f4a8a2 100644 --- a/src/components/pages/Playground.tsx +++ b/src/components/pages/Playground.tsx @@ -83,11 +83,6 @@ export const Playground : React.FC = () => { console.log('[Playground] Network: testnet'); } - if (params.get("network")==="previewnet"){ - settings.runtime = RuntimeType.FlowPreviewnet - console.log('[Playground] Network: previewnet'); - } - if (params.get("network")==="emulator"){ settings.runtime = RuntimeType.FlowEmulator console.log('[Playground] Network: emulator'); @@ -164,14 +159,14 @@ export const Playground : React.FC = () => { }, [settings.darkMode, settings.useSystemTheme]) return ( - + -
+
-
+
- + diff --git a/src/components/preview/EvalEventView.css b/src/components/preview/EvalEventView.css deleted file mode 100644 index 17ea4b8..0000000 --- a/src/components/preview/EvalEventView.css +++ /dev/null @@ -1,32 +0,0 @@ -.evalEvent__delay { - color: #666; - margin-right: 5px; -} - -.evalEvent__kind { - color: #999; - margin-right: 10px; -} - -.evalEvent__msg { - color: currentColor; -} -.evalEvent { - display: table; - width: 100%; -} - -.evalEvent__msg { - font: inherit; - border: none; - margin: 0; - float: left; -} - -.evalEvent__msg--stderr { - color: #e22; -} - -.evalEvent__delay { - float: right; -} diff --git a/src/components/preview/Preview.css b/src/components/preview/Preview.css deleted file mode 100644 index 8b5d180..0000000 --- a/src/components/preview/Preview.css +++ /dev/null @@ -1,47 +0,0 @@ -.app-preview { - box-sizing: border-box; - overflow: auto; -} - -.app-preview__content { - padding: 0 15px 15px 15px; - font-size: 10pt; -} - -.app-preview__error { - color: white; - background: #cc0000; -} - -.app-preview__epilogue { - color: #999; - margin-top: 15px; -} - -.app-preview__build-error { - margin: 0 0 5px; -} - -.app-preview__label { - display: block; - margin-bottom: 2px; -} - -.app-preview__errors { - margin: 0; - padding: 0; - font: inherit; - font-weight: bold; - word-wrap: break-word; - white-space: break-spaces; -} - -.app-preview__progress { - position: relative; - bottom: 8px; - margin-bottom: -18px; -} - -.app-preview__progress--hidden { - display: none; -} diff --git a/src/components/preview/Preview.tsx b/src/components/preview/Preview.tsx index c5d4f75..85a7144 100644 --- a/src/components/preview/Preview.tsx +++ b/src/components/preview/Preview.tsx @@ -29,7 +29,7 @@ const Preview: React.FC = ()=>{ if (status.lastError) { content = ( - Error + Error
             {status.lastError}
           
@@ -46,11 +46,11 @@ const Preview: React.FC = ()=>{ )); } else { - content = Press "Run" to execute script.; + content = Press "Run" to execute script.; } - return
-
+ return
+
{content}
; diff --git a/src/components/preview/ResizablePreview.css b/src/components/preview/ResizablePreview.css deleted file mode 100644 index 33b80c0..0000000 --- a/src/components/preview/ResizablePreview.css +++ /dev/null @@ -1,138 +0,0 @@ -.ResizablePreview { - display: flex; - flex-direction: column; -} - -.ResizablePreview .app-preview { - flex: 1 1 auto; -} - -.ResizablePreview__controls { - padding: 10px 15px 0 15px; -} - -/** Collapsed state **/ -.ResizablePreview.ResizablePreview--collapsed { - height: auto !important; -} - -.ResizablePreview.ResizablePreview--collapsed:before { - content: ""; - position: absolute; - background: var(--pg-handle-default-color); -} - -.ResizablePreview.ResizablePreview--collapsed.ResizablePreview--vertical:before { - top: 0; - left: 0; - right: 0; - height: 1px; -} - -/** Handles - vertical **/ -.ResizablePreview__handle--left:before { - content: ""; - position: absolute; - background: var(--pg-handle-default-color); - transition: background-color 0.1s ease-in 0s; - width: 1px; - height: 100%; - top: 0; - left: 50%; -} - -.ResizablePreview__handle--left { - transition: background-color 0.1s ease-in 0s; -} - -.ResizablePreview__handle--left:hover:before, -.ResizablePreview__handle--left:active:before { - background: var(--pg-handle-active-color); - width: 3px; -} - -@media (hover: none), (pointer: coarse) { - .ResizablePreview__handle--left { - background: black; - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - color: #999; - } - - .ResizablePreview__handle--left:hover, - .ResizablePreview__handle--left:active { - background: black; - color: white; - } - - .ResizablePreview__handle--left:before { - display: none; - } - - .ResizablePreview__handle--left:after { - content: ""; - background: currentColor; - height: 20%; - max-height: 80px; - width: 4px; - border-radius: 4px; - align-self: center; - transition: color 0.15s ease 0s; - } -} - -/** Handles - Horizontal **/ -.ResizablePreview__handle--top:before { - content: ""; - position: absolute; - background: var(--pg-handle-default-color); - transition: background-color 0.1s ease-in 0s; - top: 5px; - left: 0; - right: 0; - height: 1px; -} - -.ResizablePreview__handle--top { - transition: background-color 0.1s ease-in 0s; -} - -.ResizablePreview__handle--top:hover:before, -.ResizablePreview__handle--top:active:before { - background: var(--pg-handle-active-color); - height: 3px; -} - -@media (hover: none), (pointer: coarse) { - .ResizablePreview__handle--top { - background: black; - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - color: #999; - } - - .ResizablePreview__handle--top:hover, - .ResizablePreview__handle--top:active { - background: black; - color: #fff; - } - - .ResizablePreview__handle--top:before { - display: none; - } - - .ResizablePreview__handle--top:after { - content: ""; - background: currentColor; - width: 20%; - max-width: 80px; - height: 4px; - border-radius: 4px; - align-self: center; - transition: 0.15s ease 0s; - } -} diff --git a/src/components/preview/ResizablePreview.tsx b/src/components/preview/ResizablePreview.tsx index b9a1354..933567e 100644 --- a/src/components/preview/ResizablePreview.tsx +++ b/src/components/preview/ResizablePreview.tsx @@ -75,13 +75,11 @@ const ResizablePreview: React.FC = () => { console.log(size) return ( = ({children, ...props}) => ( - + {children} ); diff --git a/src/components/utils/SharePopup.tsx b/src/components/utils/SharePopup.tsx index c69c6d6..77eff04 100644 --- a/src/components/utils/SharePopup.tsx +++ b/src/components/utils/SharePopup.tsx @@ -18,7 +18,7 @@ interface Props { } const SharePopup: FC = ({ visible, snippetId, originUrl = typeof window !== 'undefined' ? window?.location?.origin : '', onDismiss, target }) => { - const { semanticColors: { bodyBackground } } = useTheme(); + const { palette } = useTheme(); const primaryButtonProps: IButtonProps = useMemo( () => ({ children: 'Copy link', @@ -50,15 +50,12 @@ const SharePopup: FC = ({ visible, snippetId, originUrl = typeof window ! href={`${originUrl}/snippet/${snippetId}`} target="_blank" underline - styles={{ - root: [ - { - color: bodyBackground - } - ] - }} > + {`${originUrl}/snippet/${snippetId}`} + ); diff --git a/src/index.css b/src/index.css index 5315e73..3710aa7 100644 --- a/src/index.css +++ b/src/index.css @@ -1,3 +1,146 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +@layer components { + .ellipsis-text::after { + @apply inline-block animate-ellipsis content-['']; + } + + /* ResizablePreview Handle Styles */ + .ResizablePreview--collapsed { + height: auto !important; + } + + .ResizablePreview--collapsed:before { + content: ""; + position: absolute; + background: var(--pg-handle-default-color); + } + + .ResizablePreview--collapsed.ResizablePreview--vertical:before { + top: 0; + left: 0; + right: 0; + height: 1px; + } + + /* Vertical handle (left) */ + .ResizablePreview__handle--left:before { + content: ""; + position: absolute; + background: var(--pg-handle-default-color); + transition: background-color 0.1s ease-in 0s; + width: 1px; + height: 100%; + top: 0; + left: 50%; + } + + .ResizablePreview__handle--left { + transition: background-color 0.1s ease-in 0s; + } + + .ResizablePreview__handle--left:hover:before, + .ResizablePreview__handle--left:active:before { + background: var(--pg-handle-active-color); + width: 3px; + } + + /* Horizontal handle (top) */ + .ResizablePreview__handle--top:before { + content: ""; + position: absolute; + background: var(--pg-handle-default-color); + transition: background-color 0.1s ease-in 0s; + top: 5px; + left: 0; + right: 0; + height: 1px; + } + + .ResizablePreview__handle--top { + transition: background-color 0.1s ease-in 0s; + } + + .ResizablePreview__handle--top:hover:before, + .ResizablePreview__handle--top:active:before { + background: var(--pg-handle-active-color); + height: 3px; + } + + /* Touch device styles */ + @media (hover: none), (pointer: coarse) { + .ResizablePreview__handle--left { + background: black; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + color: #999; + } + + .ResizablePreview__handle--left:hover, + .ResizablePreview__handle--left:active { + background: black; + color: white; + } + + .ResizablePreview__handle--left:before { + display: none; + } + + .ResizablePreview__handle--left:after { + content: ""; + background: currentColor; + height: 20%; + max-height: 80px; + width: 4px; + border-radius: 4px; + align-self: center; + transition: color 0.15s ease 0s; + } + + .ResizablePreview__handle--top { + background: black; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + color: #999; + } + + .ResizablePreview__handle--top:hover, + .ResizablePreview__handle--top:active { + background: black; + color: #fff; + } + + .ResizablePreview__handle--top:before { + display: none; + } + + .ResizablePreview__handle--top:after { + content: ""; + background: currentColor; + width: 20%; + max-width: 80px; + height: 4px; + border-radius: 4px; + align-self: center; + transition: 0.15s ease 0s; + } + } +} + +@keyframes ellipsis { + 0% { content: ''; } + 25% { content: '.'; } + 50% { content: '..'; } + 75% { content: '...'; } + 100% { content: ''; } +} + body { margin: 0; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", diff --git a/src/state/index.ts b/src/state/index.ts index add065f..7e553ab 100644 --- a/src/state/index.ts +++ b/src/state/index.ts @@ -123,14 +123,16 @@ export const appState = { editor: { fileName: "script.cdc", code: "", - args: [] as [any?], - jsonArgs: [] as [any?], + args: [] as any[], + jsonArgs: [] as string[], + hasArgumentErrors: false, }, status: { loading: false, lastError: "", events: [] as EvalEvent[], markers: [] as editor.IMarker[], + languageServerStatus: "initializing" as "initializing" | "ready" | "checking" | "error", }, monaco: defaultMonacoSettings, settings: { diff --git a/tailwind.config.js b/tailwind.config.js new file mode 100644 index 0000000..c2b666b --- /dev/null +++ b/tailwind.config.js @@ -0,0 +1,20 @@ +/** @type {import('tailwindcss').Config} */ +module.exports = { + content: [ + './src/pages/**/*.{js,ts,jsx,tsx,mdx}', + './src/components/**/*.{js,ts,jsx,tsx,mdx}', + './src/app/**/*.{js,ts,jsx,tsx,mdx}', + ], + theme: { + extend: { + animation: { + ellipsis: 'ellipsis 2s steps(1, end) infinite', + }, + }, + }, + plugins: [], + // Prevent Tailwind from conflicting with Fluent UI + corePlugins: { + preflight: false, + }, +} diff --git a/yarn.lock b/yarn.lock index a3d0191..22d3c7f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7,6 +7,11 @@ resolved "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.11.1.tgz" integrity sha512-nhCBV3quEgesuf7c7KYfperqSS14T8bYuvJ8PcLJp6znkZpFc0AuW4qBtr8eKVyPPe/8RSr7sglCWPU5eaxwKQ== +"@alloc/quick-lru@^5.2.0": + version "5.2.0" + resolved "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz" + integrity sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw== + "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.27.1": version "7.27.1" resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz" @@ -1535,7 +1540,7 @@ "@types/yargs" "^17.0.33" chalk "^4.1.2" -"@jridgewell/gen-mapping@^0.3.12", "@jridgewell/gen-mapping@^0.3.5": +"@jridgewell/gen-mapping@^0.3.12", "@jridgewell/gen-mapping@^0.3.2", "@jridgewell/gen-mapping@^0.3.5": version "0.3.13" resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz" integrity sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA== @@ -2560,7 +2565,12 @@ ansi-styles@^6.1.0: resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz" integrity sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg== -anymatch@^3.1.3: +any-promise@^1.0.0: + version "1.3.0" + resolved "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz" + integrity sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A== + +anymatch@^3.1.3, anymatch@~3.1.2: version "3.1.3" resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz" integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== @@ -2573,6 +2583,11 @@ are-docs-informative@^0.0.2: resolved "https://registry.npmjs.org/are-docs-informative/-/are-docs-informative-0.0.2.tgz" integrity sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig== +arg@^5.0.2: + version "5.0.2" + resolved "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz" + integrity sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg== + argparse@^1.0.7: version "1.0.10" resolved "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz" @@ -2711,6 +2726,17 @@ atomic-sleep@^1.0.0: resolved "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz" integrity sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ== +autoprefixer@^10.4.23: + version "10.4.23" + resolved "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.23.tgz" + integrity sha512-YYTXSFulfwytnjAPlw8QHncHJmlvFKtczb8InXaAx9Q0LbfDnfEYDE55omerIJKihhmU61Ft+cAOSzQVaBUmeA== + dependencies: + browserslist "^4.28.1" + caniuse-lite "^1.0.30001760" + fraction.js "^5.3.4" + picocolors "^1.1.1" + postcss-value-parser "^4.2.0" + available-typed-arrays@^1.0.7: version "1.0.7" resolved "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz" @@ -2895,6 +2921,11 @@ big.js@^5.2.2: resolved "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz" integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== +binary-extensions@^2.0.0: + version "2.3.0" + resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz" + integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== + blakejs@1.2.1: version "1.2.1" resolved "https://registry.npmjs.org/blakejs/-/blakejs-1.2.1.tgz" @@ -2915,7 +2946,7 @@ brace-expansion@^2.0.1: dependencies: balanced-match "^1.0.0" -braces@^3.0.3: +braces@^3.0.3, braces@~3.0.2: version "3.0.3" resolved "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz" integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== @@ -2927,7 +2958,7 @@ browser-headers@^0.4.1: resolved "https://registry.npmjs.org/browser-headers/-/browser-headers-0.4.1.tgz" integrity sha512-CA9hsySZVo9371qEHjHZtYxV2cFtVj5Wj/ZHi8ooEsrtm4vOnl9Y9HmyYWk9q+05d7K3rdoAE0j3MVEFVvtQtg== -browserslist@^4.24.0, browserslist@^4.28.0: +browserslist@^4.24.0, browserslist@^4.28.0, browserslist@^4.28.1: version "4.28.1" resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz" integrity sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA== @@ -3015,6 +3046,11 @@ callsites@^3.0.0, callsites@^3.1.0: resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== +camelcase-css@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz" + integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== + camelcase@^5.0.0, camelcase@^5.3.1: version "5.3.1" resolved "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz" @@ -3030,7 +3066,7 @@ camelize@^1.0.0: resolved "https://registry.npmjs.org/camelize/-/camelize-1.0.1.tgz" integrity sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ== -caniuse-lite@^1.0.30001579, caniuse-lite@^1.0.30001759: +caniuse-lite@^1.0.30001579, caniuse-lite@^1.0.30001759, caniuse-lite@^1.0.30001760: version "1.0.30001760" resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001760.tgz" integrity sha512-7AAMPcueWELt1p3mi13HR/LHH0TJLT11cnwDJEs3xA4+CK/PLKeO9Kl1oru24htkyUKtkGCvAx4ohB0Ttry8Dw== @@ -3053,6 +3089,21 @@ charcodes@^0.2.0: resolved "https://registry.npmjs.org/charcodes/-/charcodes-0.2.1.tgz" integrity sha512-od9I/QHdRWIk4bDVLlrSI2FMR7+Cdn6/b8lKN3My/305L9Zm43fV+81msV779/wMgPA8agAIMZErv83Vk4/7vg== +chokidar@^3.6.0: + version "3.6.0" + resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz" + integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + chokidar@^4.0.3: version "4.0.3" resolved "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz" @@ -3132,6 +3183,11 @@ combined-stream@^1.0.8: dependencies: delayed-stream "~1.0.0" +commander@^4.0.0: + version "4.1.1" + resolved "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz" + integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== + comment-parser@1.4.1: version "1.4.1" resolved "https://registry.npmjs.org/comment-parser/-/comment-parser-1.4.1.tgz" @@ -3224,6 +3280,11 @@ css-to-react-native@3.2.0: css-color-keywords "^1.0.0" postcss-value-parser "^4.0.2" +cssesc@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz" + integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== + csstype@^3.2.2: version "3.2.3" resolved "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz" @@ -3343,6 +3404,11 @@ detect-newline@^3.1.0: resolved "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz" integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== +didyoumean@^1.2.2: + version "1.2.2" + resolved "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz" + integrity sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw== + diff-sequences@^27.5.1: version "27.5.1" resolved "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz" @@ -3360,6 +3426,11 @@ dir-glob@^3.0.1: dependencies: path-type "^4.0.0" +dlv@^1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz" + integrity sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA== + doctrine@^2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz" @@ -3917,7 +3988,7 @@ fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== -fast-glob@^3.2.9: +fast-glob@^3.2.9, fast-glob@^3.3.2: version "3.3.3" resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz" integrity sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg== @@ -4078,6 +4149,11 @@ form-data@^4.0.4: hasown "^2.0.2" mime-types "^2.1.12" +fraction.js@^5.3.4: + version "5.3.4" + resolved "https://registry.npmjs.org/fraction.js/-/fraction.js-5.3.4.tgz" + integrity sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ== + fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" @@ -4184,6 +4260,13 @@ glob-parent@^6.0.2: dependencies: is-glob "^4.0.3" +glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + glob-to-regexp@^0.4.1: version "0.4.1" resolved "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz" @@ -4498,6 +4581,13 @@ is-bigint@^1.1.0: dependencies: has-bigints "^1.0.2" +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + is-boolean-object@^1.2.1: version "1.2.2" resolved "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz" @@ -4582,7 +4672,7 @@ is-generator-function@^1.0.10, is-generator-function@^1.0.7: has-tostringtag "^1.0.2" safe-regex-test "^1.1.0" -is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3: +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: version "4.0.3" resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== @@ -5161,6 +5251,11 @@ jest@^30.2.0: import-local "^3.2.0" jest-cli "30.2.0" +jiti@^1.21.7: + version "1.21.7" + resolved "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz" + integrity sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A== + "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" @@ -5275,6 +5370,11 @@ levn@^0.4.1: prelude-ls "^1.2.1" type-check "~0.4.0" +lilconfig@^3.1.1, lilconfig@^3.1.3: + version "3.1.3" + resolved "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz" + integrity sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw== + lines-and-columns@^1.1.6: version "1.2.4" resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz" @@ -5522,7 +5622,16 @@ multiformats@^9.4.2: resolved "https://registry.npmjs.org/multiformats/-/multiformats-9.9.0.tgz" integrity sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg== -nanoid@^3.3.6, nanoid@^3.3.7: +mz@^2.7.0: + version "2.7.0" + resolved "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz" + integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q== + dependencies: + any-promise "^1.0.0" + object-assign "^4.0.1" + thenify-all "^1.0.0" + +nanoid@^3.3.11, nanoid@^3.3.6, nanoid@^3.3.7: version "3.3.11" resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz" integrity sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w== @@ -5597,7 +5706,7 @@ node-releases@^2.0.27: resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz" integrity sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA== -normalize-path@^3.0.0: +normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== @@ -5609,11 +5718,16 @@ npm-run-path@^4.0.1: dependencies: path-key "^3.0.0" -object-assign@^4.1.0, object-assign@^4.1.1: +object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== +object-hash@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz" + integrity sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw== + object-inspect@^1.13.3, object-inspect@^1.13.4: version "1.13.4" resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz" @@ -5831,7 +5945,7 @@ picocolors@^1.0.0, picocolors@^1.1.1: resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz" integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== -picomatch@^2.0.4, picomatch@^2.3.1: +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: version "2.3.1" resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== @@ -5846,6 +5960,11 @@ picomatch@^4.0.3: resolved "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz" integrity sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q== +pify@^2.3.0: + version "2.3.0" + resolved "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz" + integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== + pino-abstract-transport@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-2.0.0.tgz" @@ -5875,7 +5994,7 @@ pino@10.0.0: sonic-boom "^4.0.1" thread-stream "^3.0.0" -pirates@^4.0.7: +pirates@^4.0.1, pirates@^4.0.7: version "4.0.7" resolved "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz" integrity sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA== @@ -5911,11 +6030,58 @@ possible-typed-array-names@^1.0.0: resolved "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz" integrity sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg== -postcss-value-parser@^4.0.2: +postcss-import@^15.1.0: + version "15.1.0" + resolved "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz" + integrity sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew== + dependencies: + postcss-value-parser "^4.0.0" + read-cache "^1.0.0" + resolve "^1.1.7" + +postcss-js@^4.0.1: + version "4.1.0" + resolved "https://registry.npmjs.org/postcss-js/-/postcss-js-4.1.0.tgz" + integrity sha512-oIAOTqgIo7q2EOwbhb8UalYePMvYoIeRY2YKntdpFQXNosSu3vLrniGgmH9OKs/qAkfoj5oB3le/7mINW1LCfw== + dependencies: + camelcase-css "^2.0.1" + +"postcss-load-config@^4.0.2 || ^5.0 || ^6.0": + version "6.0.1" + resolved "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-6.0.1.tgz" + integrity sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g== + dependencies: + lilconfig "^3.1.1" + +postcss-nested@^6.2.0: + version "6.2.0" + resolved "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz" + integrity sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ== + dependencies: + postcss-selector-parser "^6.1.1" + +postcss-selector-parser@^6.1.1, postcss-selector-parser@^6.1.2: + version "6.1.2" + resolved "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz" + integrity sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg== + dependencies: + cssesc "^3.0.0" + util-deprecate "^1.0.2" + +postcss-value-parser@^4.0.0, postcss-value-parser@^4.0.2, postcss-value-parser@^4.2.0: version "4.2.0" resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz" integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== +postcss@^8.4.47, postcss@^8.5.6: + version "8.5.6" + resolved "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz" + integrity sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg== + dependencies: + nanoid "^3.3.11" + picocolors "^1.1.1" + source-map-js "^1.2.1" + postcss@8.4.31: version "8.4.31" resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz" @@ -6125,11 +6291,25 @@ react@^18.3.1: dependencies: loose-envify "^1.1.0" +read-cache@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz" + integrity sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA== + dependencies: + pify "^2.3.0" + readdirp@^4.0.1: version "4.1.2" resolved "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz" integrity sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg== +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + real-require@^0.2.0: version "0.2.0" resolved "https://registry.npmjs.org/real-require/-/real-require-0.2.0.tgz" @@ -6241,7 +6421,7 @@ resolve-pkg-maps@^1.0.0: resolved "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz" integrity sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw== -resolve@^1.14.2, resolve@^1.19.0, resolve@^1.22.4: +resolve@^1.1.7, resolve@^1.14.2, resolve@^1.19.0, resolve@^1.22.4, resolve@^1.22.8: version "1.22.11" resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz" integrity sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ== @@ -6746,6 +6926,19 @@ stylis@4.3.2: resolved "https://registry.npmjs.org/stylis/-/stylis-4.3.2.tgz" integrity sha512-bhtUjWd/z6ltJiQwg0dUfxEJ+W+jdqQd8TbWLWyeIJHlnsqmGLRFFd8e5mA0AZi/zx90smXRlN66YMTcaSFifg== +sucrase@^3.35.0: + version "3.35.1" + resolved "https://registry.npmjs.org/sucrase/-/sucrase-3.35.1.tgz" + integrity sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw== + dependencies: + "@jridgewell/gen-mapping" "^0.3.2" + commander "^4.0.0" + lines-and-columns "^1.1.6" + mz "^2.7.0" + pirates "^4.0.1" + tinyglobby "^0.2.11" + ts-interface-checker "^0.1.9" + supports-color@^7.1.0: version "7.2.0" resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" @@ -6772,6 +6965,34 @@ synckit@^0.11.8: dependencies: "@pkgr/core" "^0.2.9" +tailwindcss@^3.4.19: + version "3.4.19" + resolved "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.19.tgz" + integrity sha512-3ofp+LL8E+pK/JuPLPggVAIaEuhvIz4qNcf3nA1Xn2o/7fb7s/TYpHhwGDv1ZU3PkBluUVaF8PyCHcm48cKLWQ== + dependencies: + "@alloc/quick-lru" "^5.2.0" + arg "^5.0.2" + chokidar "^3.6.0" + didyoumean "^1.2.2" + dlv "^1.1.3" + fast-glob "^3.3.2" + glob-parent "^6.0.2" + is-glob "^4.0.3" + jiti "^1.21.7" + lilconfig "^3.1.3" + micromatch "^4.0.8" + normalize-path "^3.0.0" + object-hash "^3.0.0" + picocolors "^1.1.1" + postcss "^8.4.47" + postcss-import "^15.1.0" + postcss-js "^4.0.1" + postcss-load-config "^4.0.2 || ^5.0 || ^6.0" + postcss-nested "^6.2.0" + postcss-selector-parser "^6.1.2" + resolve "^1.22.8" + sucrase "^3.35.0" + test-exclude@^6.0.0: version "6.0.0" resolved "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz" @@ -6786,6 +7007,20 @@ text-table@^0.2.0: resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== +thenify-all@^1.0.0: + version "1.6.0" + resolved "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz" + integrity sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA== + dependencies: + thenify ">= 3.1.0 < 4" + +"thenify@>= 3.1.0 < 4": + version "3.3.1" + resolved "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz" + integrity sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw== + dependencies: + any-promise "^1.0.0" + thread-stream@^3.0.0: version "3.1.0" resolved "https://registry.npmjs.org/thread-stream/-/thread-stream-3.1.0.tgz" @@ -6793,7 +7028,7 @@ thread-stream@^3.0.0: dependencies: real-require "^0.2.0" -tinyglobby@^0.2.13: +tinyglobby@^0.2.11, tinyglobby@^0.2.13: version "0.2.15" resolved "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz" integrity sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ== @@ -6823,6 +7058,11 @@ tr46@~0.0.3: resolved "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz" integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== +ts-interface-checker@^0.1.9: + version "0.1.13" + resolved "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz" + integrity sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA== + ts-jest@^29.4.6: version "29.4.6" resolved "https://registry.npmjs.org/ts-jest/-/ts-jest-29.4.6.tgz" @@ -7097,6 +7337,11 @@ use-sync-external-store@1.2.0: resolved "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz" integrity sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA== +util-deprecate@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== + util@^0.12.5: version "0.12.5" resolved "https://registry.npmjs.org/util/-/util-0.12.5.tgz"