From ac846dbd881345f1787b8c015c640e49e2e4fff9 Mon Sep 17 00:00:00 2001 From: sheridanchris Date: Mon, 10 Aug 2026 09:48:20 -0500 Subject: [PATCH 1/4] Update to .NET 10 and Fable 5 --- .config/dotnet-tools.json | 16 +- flake.lock | 12 +- flake.nix | 6 +- package-lock.json | 2185 +++++++++++++------------------------ package.json | 23 +- src/App/App.fs | 34 +- src/App/App.fsproj | 17 +- 7 files changed, 837 insertions(+), 1456 deletions(-) diff --git a/.config/dotnet-tools.json b/.config/dotnet-tools.json index 2f1cdf9..d041efe 100644 --- a/.config/dotnet-tools.json +++ b/.config/dotnet-tools.json @@ -3,22 +3,18 @@ "isRoot": true, "tools": { "fable": { - "version": "4.13.0", + "version": "5.13.0", "commands": [ "fable" - ] + ], + "rollForward": false }, "fantomas": { - "version": "6.2.3", + "version": "7.0.5", "commands": [ "fantomas" - ] - }, - "femto": { - "version": "0.19.0", - "commands": [ - "femto" - ] + ], + "rollForward": false } } } \ No newline at end of file diff --git a/flake.lock b/flake.lock index d230545..713de0c 100644 --- a/flake.lock +++ b/flake.lock @@ -5,11 +5,11 @@ "systems": "systems" }, "locked": { - "lastModified": 1705309234, - "narHash": "sha256-uNRRNRKmJyCRC/8y1RqBkqWBLM034y4qN7EprSdmgyA=", + "lastModified": 1731533236, + "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=", "owner": "numtide", "repo": "flake-utils", - "rev": "1ef2e671c3b0c19053962c07dbda38332dcebf26", + "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b", "type": "github" }, "original": { @@ -20,11 +20,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1706205041, - "narHash": "sha256-WXvr++aH3Q7IGqGLcaDhsrVj8zmjVGZoHRpqG9GgJ2o=", + "lastModified": 1786371105, + "narHash": "sha256-bcLMIvC34iaUga+QepMGCRha4eEFVUwAWgRVi9OKhCo=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "3401c58f049fc9c72b578f99c0440092c2c49736", + "rev": "e79d651f729c8cd14492a4a7ff60843e6f319029", "type": "github" }, "original": { diff --git a/flake.nix b/flake.nix index e729c12..55e9b4a 100644 --- a/flake.nix +++ b/flake.nix @@ -15,10 +15,10 @@ with pkgs; { devShells.default = mkShell { packages = [ - nodejs_20 - dotnet-sdk_8 + nodejs_24 + dotnetCorePackages.sdk_10_0-bin ]; - DOTNET_ROOT = "${dotnet-sdk_8}"; + DOTNET_ROOT = "${dotnetCorePackages.sdk_10_0-bin}"; }; }); } diff --git a/package-lock.json b/package-lock.json index caba1e2..fc83735 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,1032 +5,340 @@ "packages": { "": { "dependencies": { - "@fable-org/fable-metadata": "^1.0.0", - "@fable-org/fable-standalone": "^1.1.0", - "@monaco-editor/react": "^4.6.0", + "@fable-org/fable-metadata": "^2.1.0", + "@fable-org/fable-standalone": "^2.11.0", + "@monaco-editor/react": "^4.7.0", "monaco-editor": "^0.46.0", - "react": "^18.2.0", - "react-dom": "^18.2.0", - "react-markdown": "^8.0.4", - "react-syntax-highlighter": "^15.5.0", - "react-toastify": "^9.1.3", - "use-sync-external-store": "^1.2.0" + "react": "^18.3.1", + "react-dom": "^18.3.1", + "react-markdown": "^8.0.7", + "react-syntax-highlighter": "^16.1.1", + "react-toastify": "^11.1.0" }, "devDependencies": { - "@vitejs/plugin-react": "^4.2.1", - "vite": "^5.0.12" + "@vitejs/plugin-react": "^6.0.5", + "vite": "^8.2.1" } }, - "node_modules/@ampproject/remapping": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", - "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", - "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", - "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.23.4", - "chalk": "^2.4.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz", - "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.9.tgz", - "integrity": "sha512-5q0175NOjddqpvvzU+kDiSOAk4PfdO6FvwCWoQ6RO7rTzEe8vlo+4HVfcnAREhD4npMs0e9uZypjTwzZPCf/cw==", - "dev": true, - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.23.5", - "@babel/generator": "^7.23.6", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.23.9", - "@babel/parser": "^7.23.9", - "@babel/template": "^7.23.9", - "@babel/traverse": "^7.23.9", - "@babel/types": "^7.23.9", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/generator": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", - "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.23.6", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", - "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.23.5", - "@babel/helper-validator-option": "^7.23.5", - "browserslist": "^4.22.2", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", - "dev": true, - "dependencies": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", - "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", - "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", - "dev": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.20" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-simple-access": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", - "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", - "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", - "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.9.tgz", - "integrity": "sha512-87ICKgU5t5SzOT7sBMfCOZQ2rHjRU+Pcb9BoILMYz600W6DkVRLFBPwQ18gwUVvggqXivaUakpnxWQGbpywbBQ==", - "dev": true, - "dependencies": { - "@babel/template": "^7.23.9", - "@babel/traverse": "^7.23.9", - "@babel/types": "^7.23.9" - }, + "node_modules/@babel/runtime": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.7.tgz", + "integrity": "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==", + "license": "MIT", "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/highlight": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", - "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", - "dev": true, + "node_modules/@fable-org/fable-metadata": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@fable-org/fable-metadata/-/fable-metadata-2.1.0.tgz", + "integrity": "sha512-RqQU286G6QucQ6361BkgYLZpslSUZgviSCgioj3uWQQ5SclTCbuZ41Tq+kVAhg+zqHGAs8EB6bbOkQtRQqqMkg==", + "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" + "dirname-filename-esm": "^1.1.1" } }, - "node_modules/@babel/parser": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.9.tgz", - "integrity": "sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA==", - "dev": true, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } + "node_modules/@fable-org/fable-standalone": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@fable-org/fable-standalone/-/fable-standalone-2.11.0.tgz", + "integrity": "sha512-apBitUhRYaEPsg5Mgcy8N6nsuxMXxllOKPlOOP13NdXAVXOyRNqoKvQ8zSbYvAMyInDdMrBJTlmpq7pr5NVhtQ==", + "license": "MIT" }, - "node_modules/@babel/plugin-transform-react-jsx-self": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.23.3.tgz", - "integrity": "sha512-qXRvbeKDSfwnlJnanVRp0SfuWE5DQhwQr5xtLBzp56Wabyo+4CMosF6Kfp+eOD/4FYpql64XVJ2W0pVLlJZxOQ==", - "dev": true, + "node_modules/@monaco-editor/loader": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@monaco-editor/loader/-/loader-1.7.0.tgz", + "integrity": "sha512-gIwR1HrJrrx+vfyOhYmCZ0/JcWqG5kbfG7+d3f/C1LXk2EvzAbHSg3MQ5lO2sMlo9izoAZ04shohfKLVT6crVA==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "state-local": "^1.0.6" } }, - "node_modules/@babel/plugin-transform-react-jsx-source": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.23.3.tgz", - "integrity": "sha512-91RS0MDnAWDNvGC6Wio5XYkyWI39FMFO+JK9+4AlgaTH+yWwVTsw7/sn6LK0lH7c5F+TFkpv/3LfCJ1Ydwof/g==", - "dev": true, + "node_modules/@monaco-editor/react": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@monaco-editor/react/-/react-4.7.0.tgz", + "integrity": "sha512-cyzXQCtO47ydzxpQtCGSQGOC8Gk3ZUeBXFAxD+CWXYFo5OqZyZUonFl0DwUlTyAfRHntBfw2p3w4s9R6oe1eCA==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" + "@monaco-editor/loader": "^1.5.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/runtime": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.9.tgz", - "integrity": "sha512-0CX6F+BI2s9dkUqr08KFrAIZgNFj75rdBU/DjCyYLIaV/quFjkk6T+EJ2LkZHyZTbEV4L5p97mNkUsHl2wLFAw==", - "dependencies": { - "regenerator-runtime": "^0.14.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/template": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.23.9.tgz", - "integrity": "sha512-+xrD2BWLpvHKNmX2QbpdpsBaWnRxahMwJjO+KZk2JOElj5nSmKezyS1B4u+QbHMTX69t4ukm6hh9lsYQ7GHCKA==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.23.5", - "@babel/parser": "^7.23.9", - "@babel/types": "^7.23.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.9.tgz", - "integrity": "sha512-I/4UJ9vs90OkBtY6iiiTORVMyIhJ4kAVmsKo9KFc8UOxMeUfi2hvtIBsET5u9GizXE6/GFSuKCTNfgCswuEjRg==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.23.5", - "@babel/generator": "^7.23.6", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.9", - "@babel/types": "^7.23.9", - "debug": "^4.3.1", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.9.tgz", - "integrity": "sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q==", - "dev": true, - "dependencies": { - "@babel/helper-string-parser": "^7.23.4", - "@babel/helper-validator-identifier": "^7.22.20", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz", - "integrity": "sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=12" + "monaco-editor": ">= 0.25.0 < 1", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, - "node_modules/@esbuild/android-arm": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.12.tgz", - "integrity": "sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==", - "cpu": [ - "arm" - ], + "node_modules/@oxc-project/types": { + "version": "0.143.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.143.0.tgz", + "integrity": "sha512-u6JZdLBTLotrNC9Vd6vPssINdzcCzleKAH6EJKImQb7GtYvX5keN2dxkoK44stCc4tffE6QQRtZTXVSzsLUlWA==", "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Boshen" } }, - "node_modules/@esbuild/android-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz", - "integrity": "sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==", + "node_modules/@rolldown/binding-android-arm64": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.2.3.tgz", + "integrity": "sha512-zrJtHDcaZJ1Fp7xf4hNl+7seH9Cn/N5TwLYkhgXREtBwAd/jaqW3uqeHxpDugJLVICWg4eW44kOQEGJ1r6jCGw==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" ], "engines": { - "node": ">=12" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@esbuild/android-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.12.tgz", - "integrity": "sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz", - "integrity": "sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==", + "node_modules/@rolldown/binding-darwin-arm64": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.2.3.tgz", + "integrity": "sha512-ieIiibVCp0tX7TLu2cafoNPv8wJyYi01ekXpbf8q2j7F4rGAhhXb/eQh7ge9DRBY78GwmRQtvjZDux7EDbA8kA==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" ], "engines": { - "node": ">=12" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz", - "integrity": "sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==", + "node_modules/@rolldown/binding-darwin-x64": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.2.3.tgz", + "integrity": "sha512-Zh9tCon19eDXJoihx0rqKhMUlMYqzwj3aPsSuHmI4RWZh62dWUL+DJN4C5YQya5TcQBJU/Fe8+rY0jhXTQITqA==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" ], "engines": { - "node": ">=12" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz", - "integrity": "sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz", - "integrity": "sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==", + "node_modules/@rolldown/binding-freebsd-x64": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.2.3.tgz", + "integrity": "sha512-nGbJWewA1wrXXZiQhjAT5rhibGfns5ZNkDVqxsO6zJ3f3YvpoDNNmGMSbbhLuXKjNScaBJVOAboztAWVespQMg==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "freebsd" ], "engines": { - "node": ">=12" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@esbuild/linux-arm": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz", - "integrity": "sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==", + "node_modules/@rolldown/binding-linux-arm-gnueabihf": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.2.3.tgz", + "integrity": "sha512-QNniJr5Kml0kDEB98jiDOJjXNroxIIi0IXIbdYzY26Xt1pVbeP62+KnoIZLwirOymX/0jDk/2gI/bNUv7A7OIw==", "cpu": [ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=12" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz", - "integrity": "sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==", + "node_modules/@rolldown/binding-linux-arm64-gnu": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.3.tgz", + "integrity": "sha512-TkqEAcmmvH3I/q4114NB4RVt6241Dao48pF45uLcFGrwAaIn0iITgTAKP/dLjbN0R4buJjGb91+UHSoFmpgIWw==", "cpu": [ "arm64" ], "dev": true, - "optional": true, - "os": [ - "linux" + "libc": [ + "glibc" ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz", - "integrity": "sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==", - "cpu": [ - "ia32" - ], - "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=12" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz", - "integrity": "sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==", + "node_modules/@rolldown/binding-linux-arm64-musl": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.3.tgz", + "integrity": "sha512-NHqjnxpsndf4MPymxteFAWHHfkTL8HjWh1KB7z23ofZ6QO2euONuxDXjat69dKZRALnGypg8k8SsK8vZJoXv1Q==", "cpu": [ - "loong64" + "arm64" ], "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz", - "integrity": "sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==", - "cpu": [ - "mips64el" + "libc": [ + "musl" ], - "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=12" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz", - "integrity": "sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==", + "node_modules/@rolldown/binding-linux-ppc64-gnu": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.2.3.tgz", + "integrity": "sha512-6tbrbwfz5GB9DQ4Jwo6hy9v+vR31xZlvzZ6n5Xut6Hhx5PvrA9q/HsK8KMaYQp063iqZGXwNvZtYNLD7EM/x0w==", "cpu": [ "ppc64" ], "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz", - "integrity": "sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==", - "cpu": [ - "riscv64" + "libc": [ + "glibc" ], - "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=12" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz", - "integrity": "sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==", + "node_modules/@rolldown/binding-linux-s390x-gnu": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.2.3.tgz", + "integrity": "sha512-oyuXxXmoZHjXC917IAPFAAv4wWAa0cM9afk8nx1+9/jNNOX1uPf8yDA6p7G0RypOfw/X0PQt5IfoquY1um+zSg==", "cpu": [ "s390x" ], "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz", - "integrity": "sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==", - "cpu": [ - "x64" + "libc": [ + "glibc" ], - "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=12" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz", - "integrity": "sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==", + "node_modules/@rolldown/binding-linux-x64-gnu": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.3.tgz", + "integrity": "sha512-TytMwF2KVGqP2tgd0I1OY0PAv78dZRAYcF5ssDzjM34SUXCED3uXvSd5+lHoC0bTD6eEdFz7LdQNCO1y0oVk9w==", "cpu": [ "x64" ], "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz", - "integrity": "sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==", - "cpu": [ - "x64" + "libc": [ + "glibc" ], - "dev": true, + "license": "MIT", "optional": true, "os": [ - "openbsd" + "linux" ], "engines": { - "node": ">=12" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz", - "integrity": "sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==", + "node_modules/@rolldown/binding-linux-x64-musl": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.3.tgz", + "integrity": "sha512-/E9m3qstrJFVPoULV25mVQblSNExY2+kBsYe4sy0Tn0yOOgJ8wZbZt3KnRbF/XeU2Gl1STKUQnDNTqhIE5MD4A==", "cpu": [ "x64" ], "dev": true, - "optional": true, - "os": [ - "sunos" + "libc": [ + "musl" ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz", - "integrity": "sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz", - "integrity": "sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==", - "cpu": [ - "ia32" - ], - "dev": true, + "license": "MIT", "optional": true, "os": [ - "win32" + "linux" ], "engines": { - "node": ">=12" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@esbuild/win32-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz", - "integrity": "sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@fable-org/fable-metadata": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@fable-org/fable-metadata/-/fable-metadata-1.0.0.tgz", - "integrity": "sha512-O6xT43XenR1SjtaHtEFDL3DLPn8/JjVWyOYG1BFNBM30sF/mknIuIer1oy+iwNG2MJQiu8BtLrB0OMkGnt/2JQ==" - }, - "node_modules/@fable-org/fable-standalone": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@fable-org/fable-standalone/-/fable-standalone-1.1.0.tgz", - "integrity": "sha512-/vasnCXt5DOKFhEa1DIhzwdLCpwXsz/VzTH8EudbBK9QbV5+bXVBc2LzWy9GV7k2eHbyHitB/xzx0OVdoKYYPg==" - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", - "dev": true, - "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.22", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.22.tgz", - "integrity": "sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@monaco-editor/loader": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@monaco-editor/loader/-/loader-1.4.0.tgz", - "integrity": "sha512-00ioBig0x642hytVspPl7DbQyaSWRaolYie/UFNjoTdvoKPzo6xrXLhTk9ixgIKcLH5b5vDOjVNiGyY+uDCUlg==", - "dependencies": { - "state-local": "^1.0.6" - }, - "peerDependencies": { - "monaco-editor": ">= 0.21.0 < 1" - } - }, - "node_modules/@monaco-editor/react": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@monaco-editor/react/-/react-4.6.0.tgz", - "integrity": "sha512-RFkU9/i7cN2bsq/iTkurMWOEErmYcY6JiQI3Jn+WeR/FGISH8JbHERjpS9oRuSOPvDMJI0Z8nJeKkbOs9sBYQw==", - "dependencies": { - "@monaco-editor/loader": "^1.4.0" - }, - "peerDependencies": { - "monaco-editor": ">= 0.25.0 < 1", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.9.6.tgz", - "integrity": "sha512-MVNXSSYN6QXOulbHpLMKYi60ppyO13W9my1qogeiAqtjb2yR4LSmfU2+POvDkLzhjYLXz9Rf9+9a3zFHW1Lecg==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.9.6.tgz", - "integrity": "sha512-T14aNLpqJ5wzKNf5jEDpv5zgyIqcpn1MlwCrUXLrwoADr2RkWA0vOWP4XxbO9aiO3dvMCQICZdKeDrFl7UMClw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.9.6.tgz", - "integrity": "sha512-CqNNAyhRkTbo8VVZ5R85X73H3R5NX9ONnKbXuHisGWC0qRbTTxnF1U4V9NafzJbgGM0sHZpdO83pLPzq8uOZFw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.9.6.tgz", - "integrity": "sha512-zRDtdJuRvA1dc9Mp6BWYqAsU5oeLixdfUvkTHuiYOHwqYuQ4YgSmi6+/lPvSsqc/I0Omw3DdICx4Tfacdzmhog==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.9.6.tgz", - "integrity": "sha512-oNk8YXDDnNyG4qlNb6is1ojTOGL/tRhbbKeE/YuccItzerEZT68Z9gHrY3ROh7axDc974+zYAPxK5SH0j/G+QQ==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.9.6.tgz", - "integrity": "sha512-Z3O60yxPtuCYobrtzjo0wlmvDdx2qZfeAWTyfOjEDqd08kthDKexLpV97KfAeUXPosENKd8uyJMRDfFMxcYkDQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.9.6.tgz", - "integrity": "sha512-gpiG0qQJNdYEVad+1iAsGAbgAnZ8j07FapmnIAQgODKcOTjLEWM9sRb+MbQyVsYCnA0Im6M6QIq6ax7liws6eQ==", + "node_modules/@rolldown/binding-openharmony-arm64": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.2.3.tgz", + "integrity": "sha512-Kr0OcsoQI816i6HOl3vFHpd1K0eZyh76zgfj4c1nTyaTsd5r2Mj1lwM4R90y/qaCfmTn9eHy0SKwi98eitRxug==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.9.6.tgz", - "integrity": "sha512-+uCOcvVmFUYvVDr27aiyun9WgZk0tXe7ThuzoUTAukZJOwS5MrGbmSlNOhx1j80GdpqbOty05XqSl5w4dQvcOA==", - "cpu": [ - "riscv64" + "openharmony" ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.9.6.tgz", - "integrity": "sha512-HUNqM32dGzfBKuaDUBqFB7tP6VMN74eLZ33Q9Y1TBqRDn+qDonkAUyKWwF9BR9unV7QUzffLnz9GrnKvMqC/fw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.9.6.tgz", - "integrity": "sha512-ch7M+9Tr5R4FK40FHQk8VnML0Szi2KRujUgHXd/HjuH9ifH72GUmw6lStZBo3c3GB82vHa0ZoUfjfcM7JiiMrQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.9.6.tgz", - "integrity": "sha512-VD6qnR99dhmTQ1mJhIzXsRcTBvTjbfbGGwKAHcu+52cVl15AC/kplkhxzW/uT0Xl62Y/meBKDZvoJSJN+vTeGA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ] + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.9.6.tgz", - "integrity": "sha512-J9AFDq/xiRI58eR2NIDfyVmTYGyIZmRcvcAoJ48oDld/NTR8wyiPUu2X/v1navJ+N/FGg68LEbX3Ejd6l8B7MQ==", + "node_modules/@rolldown/binding-win32-arm64-msvc": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.3.tgz", + "integrity": "sha512-hOtMwTqnME+/gJcH/PCZ0wn0zPUjiWOgkHpxbSJpfGKMezHltx1S7/k1SitzVa7Ww2cqrDDaFbZEhcJZO8o+Jw==", "cpu": [ - "ia32" + "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" - ] + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.9.6.tgz", - "integrity": "sha512-jqzNLhNDvIZOrt69Ce4UjGRpXJBzhUBzawMwnaDAwyHriki3XollsewxWzOzz+4yOFDkuJHtTsZFwMxhYJWmLQ==", + "node_modules/@rolldown/binding-win32-x64-msvc": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.3.tgz", + "integrity": "sha512-ekcqMMkI2PlhYnfzQnB/cEdYUVVJViWvoUyLrbzgDoi3Snfc1mVBwdnc306ufA5ejy8JSPjT2RlW1nQSjW7efg==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" - ] - }, - "node_modules/@types/babel__core": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", - "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", - "dev": true, - "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "node_modules/@types/babel__generator": { - "version": "7.6.8", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", - "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", - "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", - "dev": true, - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@types/babel__traverse": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.5.tgz", - "integrity": "sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==", + "node_modules/@rolldown/pluginutils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", + "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", "dev": true, - "dependencies": { - "@babel/types": "^7.20.7" - } + "license": "MIT" }, "node_modules/@types/debug": { "version": "4.1.12", @@ -1040,12 +348,6 @@ "@types/ms": "*" } }, - "node_modules/@types/estree": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", - "dev": true - }, "node_modules/@types/hast": { "version": "2.3.10", "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.10.tgz", @@ -1067,6 +369,12 @@ "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==" }, + "node_modules/@types/prismjs": { + "version": "1.26.6", + "resolved": "https://registry.npmjs.org/@types/prismjs/-/prismjs-1.26.6.tgz", + "integrity": "sha512-vqlvI7qlMvcCBbVe0AKAb4f97//Hy0EBTaiW8AalRnG/xAN5zOiWWyrNqNXeq8+KAuvRewjCVY1+IPxk4RdNYw==", + "license": "MIT" + }, "node_modules/@types/prop-types": { "version": "15.7.11", "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.11.tgz", @@ -1095,34 +403,29 @@ "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==" }, "node_modules/@vitejs/plugin-react": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.2.1.tgz", - "integrity": "sha512-oojO9IDc4nCUUi8qIR11KoQm0XFFLIwsRBwHRR4d/88IWghn1y6ckz/bJ8GHDCsYEJee8mDzqtJxh15/cisJNQ==", + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-6.0.5.tgz", + "integrity": "sha512-BOVzne/NL162sMdResB25mUv+vWMF5NoAjNf09TeGlE7ZpszZWSD3winycicLJw72yeVsoCn/2kOhEuCvEShMA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/core": "^7.23.5", - "@babel/plugin-transform-react-jsx-self": "^7.23.3", - "@babel/plugin-transform-react-jsx-source": "^7.23.3", - "@types/babel__core": "^7.20.5", - "react-refresh": "^0.14.0" + "@rolldown/pluginutils": "^1.0.1" }, "engines": { - "node": "^14.18.0 || >=16.0.0" + "node": "^20.19.0 || >=22.12.0" }, "peerDependencies": { - "vite": "^4.2.0 || ^5.0.0" - } - }, - "node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" + "@rolldown/plugin-babel": "^0.1.7 || ^0.2.0", + "babel-plugin-react-compiler": "^1.0.0", + "vite": "^8.0.0" }, - "engines": { - "node": ">=4" + "peerDependenciesMeta": { + "@rolldown/plugin-babel": { + "optional": true + }, + "babel-plugin-react-compiler": { + "optional": true + } } }, "node_modules/bail": { @@ -1134,72 +437,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/browserslist": { - "version": "4.23.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", - "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "caniuse-lite": "^1.0.30001587", - "electron-to-chromium": "^1.4.668", - "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.13" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001588", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001588.tgz", - "integrity": "sha512-+hVY9jE44uKLkH0SrUTqxjxqNTOWHsbnQDIKjwkZ3lNTzUUVdBLBGXtj/q5Mp5u98r3droaZAewQuEDzjQdZlQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ] - }, - "node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/character-entities": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", @@ -1210,46 +447,34 @@ } }, "node_modules/character-entities-legacy": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz", - "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, "node_modules/character-reference-invalid": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz", - "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", + "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, "node_modules/clsx": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", - "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", "engines": { "node": ">=6" } }, - "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, "node_modules/comma-separated-tokens": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", @@ -1259,12 +484,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true - }, "node_modules/csstype": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", @@ -1307,76 +526,31 @@ "node": ">=6" } }, - "node_modules/diff": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", - "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/electron-to-chromium": { - "version": "1.4.678", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.678.tgz", - "integrity": "sha512-NbdGC2p0O5Q5iVhLEsNBSfytaw7wbEFJlIvaF71wi6QDtLAph5/rVogjyOpf/QggJIt8hNK3KdwNJnc2bzckbw==", - "dev": true - }, - "node_modules/esbuild": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.12.tgz", - "integrity": "sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==", - "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.19.12", - "@esbuild/android-arm": "0.19.12", - "@esbuild/android-arm64": "0.19.12", - "@esbuild/android-x64": "0.19.12", - "@esbuild/darwin-arm64": "0.19.12", - "@esbuild/darwin-x64": "0.19.12", - "@esbuild/freebsd-arm64": "0.19.12", - "@esbuild/freebsd-x64": "0.19.12", - "@esbuild/linux-arm": "0.19.12", - "@esbuild/linux-arm64": "0.19.12", - "@esbuild/linux-ia32": "0.19.12", - "@esbuild/linux-loong64": "0.19.12", - "@esbuild/linux-mips64el": "0.19.12", - "@esbuild/linux-ppc64": "0.19.12", - "@esbuild/linux-riscv64": "0.19.12", - "@esbuild/linux-s390x": "0.19.12", - "@esbuild/linux-x64": "0.19.12", - "@esbuild/netbsd-x64": "0.19.12", - "@esbuild/openbsd-x64": "0.19.12", - "@esbuild/sunos-x64": "0.19.12", - "@esbuild/win32-arm64": "0.19.12", - "@esbuild/win32-ia32": "0.19.12", - "@esbuild/win32-x64": "0.19.12" - } - }, - "node_modules/escalade": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", - "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", "dev": true, + "license": "Apache-2.0", "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, + "node_modules/diff": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.2.tgz", + "integrity": "sha512-vtcDfH3TOjP8UekytvnHH1o1P4FcUdt4eQ1Y+Abap1tk/OB2MWQvcwS2ClCd1zuIhc3JKOx6p3kod8Vfys3E+A==", + "license": "BSD-3-Clause", "engines": { - "node": ">=0.8.0" + "node": ">=0.3.1" } }, + "node_modules/dirname-filename-esm": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/dirname-filename-esm/-/dirname-filename-esm-1.1.2.tgz", + "integrity": "sha512-mMhH2imzJN95KnX/iDAhC0QDG0VU833c88U3SXCaQzATu7YlO9YTFD/CF9Nn2xhSwFlV9iWEKb/YyGJ4TwCcPg==", + "license": "MIT" + }, "node_modules/extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", @@ -1394,6 +568,24 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, "node_modules/format": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz", @@ -1408,6 +600,7 @@ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, "hasInstallScript": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -1416,42 +609,28 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/hast-util-parse-selector": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz", - "integrity": "sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz", + "integrity": "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, + "node_modules/hast-util-parse-selector/node_modules/@types/hast": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.5.tgz", + "integrity": "sha512-rp/ezSWaD1m44dPKICGhiskI13nVr7qTloFwDa/IYkhhf5nzwP+zIQcIJh3WIFSBOy/H1PzB40jPjMDksN4F+g==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, "node_modules/hast-util-whitespace": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-2.0.1.tgz", @@ -1462,164 +641,414 @@ } }, "node_modules/hastscript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-6.0.0.tgz", - "integrity": "sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-9.0.1.tgz", + "integrity": "sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==", + "license": "MIT", "dependencies": { - "@types/hast": "^2.0.0", - "comma-separated-tokens": "^1.0.0", - "hast-util-parse-selector": "^2.0.0", - "property-information": "^5.0.0", - "space-separated-tokens": "^1.0.0" + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-parse-selector": "^4.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, - "node_modules/hastscript/node_modules/comma-separated-tokens": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz", - "integrity": "sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==", + "node_modules/hastscript/node_modules/@types/hast": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.5.tgz", + "integrity": "sha512-rp/ezSWaD1m44dPKICGhiskI13nVr7qTloFwDa/IYkhhf5nzwP+zIQcIJh3WIFSBOy/H1PzB40jPjMDksN4F+g==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/hastscript/node_modules/property-information": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.2.0.tgz", + "integrity": "sha512-IAtzIB6sUiWaJYrX9smp3V46pBGbBeLFRGdh25kg1334VcBlD8HzhPeNIWQH9zhGmo2itIe25EHt9dQP7G5hmg==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/hastscript/node_modules/property-information": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/property-information/-/property-information-5.6.0.tgz", - "integrity": "sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==", + "node_modules/highlightjs-vue": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/highlightjs-vue/-/highlightjs-vue-1.0.0.tgz", + "integrity": "sha512-PDEfEF102G23vHmPhLyPboFCD+BkMGu+GuJe2d9/eH4FsCwvgBpnc9n0pGE+ffKdph38s6foEZiEjdgHdzp+IA==", + "license": "CC0-1.0" + }, + "node_modules/inline-style-parser": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz", + "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==", + "license": "MIT" + }, + "node_modules/is-alphabetical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", + "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-alphanumerical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", + "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", + "license": "MIT", + "dependencies": { + "is-alphabetical": "^2.0.0", + "is-decimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "engines": { + "node": ">=4" + } + }, + "node_modules/is-decimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", + "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-hexadecimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", + "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/lightningcss": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.33.0.tgz", + "integrity": "sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==", + "dev": true, + "license": "MPL-2.0", "dependencies": { - "xtend": "^4.0.0" + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.33.0", + "lightningcss-darwin-arm64": "1.33.0", + "lightningcss-darwin-x64": "1.33.0", + "lightningcss-freebsd-x64": "1.33.0", + "lightningcss-linux-arm-gnueabihf": "1.33.0", + "lightningcss-linux-arm64-gnu": "1.33.0", + "lightningcss-linux-arm64-musl": "1.33.0", + "lightningcss-linux-x64-gnu": "1.33.0", + "lightningcss-linux-x64-musl": "1.33.0", + "lightningcss-win32-arm64-msvc": "1.33.0", + "lightningcss-win32-x64-msvc": "1.33.0" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.33.0.tgz", + "integrity": "sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.33.0.tgz", + "integrity": "sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/hastscript/node_modules/space-separated-tokens": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz", - "integrity": "sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==", + "node_modules/lightningcss-darwin-x64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.33.0.tgz", + "integrity": "sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/inline-style-parser": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz", - "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==" - }, - "node_modules/is-alphabetical": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz", - "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==", + "node_modules/lightningcss-freebsd-x64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.33.0.tgz", + "integrity": "sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/is-alphanumerical": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz", - "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==", - "dependencies": { - "is-alphabetical": "^1.0.0", - "is-decimal": "^1.0.0" + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.33.0.tgz", + "integrity": "sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/is-buffer": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", - "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.33.0.tgz", + "integrity": "sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" ], "engines": { - "node": ">=4" - } - }, - "node_modules/is-decimal": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz", - "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==", + "node": ">= 12.0.0" + }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/is-hexadecimal": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz", - "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==", + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.33.0.tgz", + "integrity": "sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/is-plain-obj": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", - "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.33.0.tgz", + "integrity": "sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=12" + "node": ">= 12.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.33.0.tgz", + "integrity": "sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==", + "cpu": [ + "x64" + ], "dev": true, - "bin": { - "jsesc": "bin/jsesc" - }, + "libc": [ + "musl" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=4" + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.33.0.tgz", + "integrity": "sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==", + "cpu": [ + "arm64" + ], "dev": true, - "bin": { - "json5": "lib/cli.js" - }, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=6" + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/kleur": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", - "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.33.0.tgz", + "integrity": "sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=6" + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, "node_modules/loose-envify": { @@ -1654,15 +1083,6 @@ "node": "*" } }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "dependencies": { - "yallist": "^3.0.2" - } - }, "node_modules/mdast-util-definitions": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-5.1.2.tgz", @@ -2171,9 +1591,9 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "version": "3.3.18", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.18.tgz", + "integrity": "sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==", "dev": true, "funding": [ { @@ -2181,6 +1601,7 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -2188,12 +1609,6 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "node_modules/node-releases": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", - "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", - "dev": true - }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -2203,41 +1618,48 @@ } }, "node_modules/parse-entities": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz", - "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz", + "integrity": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==", + "license": "MIT", "dependencies": { - "character-entities": "^1.0.0", - "character-entities-legacy": "^1.0.0", - "character-reference-invalid": "^1.0.0", - "is-alphanumerical": "^1.0.0", - "is-decimal": "^1.0.0", - "is-hexadecimal": "^1.0.0" + "@types/unist": "^2.0.0", + "character-entities-legacy": "^3.0.0", + "character-reference-invalid": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "is-alphanumerical": "^2.0.0", + "is-decimal": "^2.0.0", + "is-hexadecimal": "^2.0.0" }, "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/parse-entities/node_modules/character-entities": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz", - "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==", + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", + "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, "node_modules/postcss": { - "version": "8.4.33", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.33.tgz", - "integrity": "sha512-Kkpbhhdjw2qQs2O2DGX+8m5OVqEcbB9HRBvuYM9pgrjEFUg30A9LmXNlTAUj4S9kgtGyrMbTzVjH7E+s5Re2yg==", + "version": "8.5.26", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.26.tgz", + "integrity": "sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==", "dev": true, "funding": [ { @@ -2253,19 +1675,21 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { - "nanoid": "^3.3.7", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" + "nanoid": "^3.3.17", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" }, "engines": { "node": "^10 || ^12 || >=14" } }, "node_modules/prismjs": { - "version": "1.29.0", - "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz", - "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==", + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz", + "integrity": "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==", + "license": "MIT", "engines": { "node": ">=6" } @@ -2295,9 +1719,10 @@ } }, "node_modules/react": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", - "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "license": "MIT", "dependencies": { "loose-envify": "^1.1.0" }, @@ -2306,15 +1731,16 @@ } }, "node_modules/react-dom": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", - "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "license": "MIT", "dependencies": { "loose-envify": "^1.1.0", - "scheduler": "^0.23.0" + "scheduler": "^0.23.2" }, "peerDependencies": { - "react": "^18.2.0" + "react": "^18.3.1" } }, "node_modules/react-is": { @@ -2323,9 +1749,10 @@ "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" }, "node_modules/react-markdown": { - "version": "8.0.4", - "resolved": "https://registry.npmjs.org/react-markdown/-/react-markdown-8.0.4.tgz", - "integrity": "sha512-2oxHa6oDxc1apg/Gnc1Goh06t3B617xeywqI/92wmDV9FELI6ayRkwge7w7DoEqM0gRpZGTNU6xQG+YpJISnVg==", + "version": "8.0.7", + "resolved": "https://registry.npmjs.org/react-markdown/-/react-markdown-8.0.7.tgz", + "integrity": "sha512-bvWbzG4MtOU62XqBx3Xx+zB2raaFFsq4mYiAzfjXJMEz2sixgeAfraA3tvzULF02ZdOMUOKTBFFaZJDDrq+BJQ==", + "license": "MIT", "dependencies": { "@types/hast": "^2.0.0", "@types/prop-types": "^15.0.0", @@ -2338,7 +1765,7 @@ "remark-parse": "^10.0.0", "remark-rehype": "^10.0.0", "space-separated-tokens": "^2.0.0", - "style-to-object": "^0.3.0", + "style-to-object": "^0.4.0", "unified": "^10.0.0", "unist-util-visit": "^4.0.0", "vfile": "^5.0.0" @@ -2352,25 +1779,21 @@ "react": ">=16" } }, - "node_modules/react-refresh": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz", - "integrity": "sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/react-syntax-highlighter": { - "version": "15.5.0", - "resolved": "https://registry.npmjs.org/react-syntax-highlighter/-/react-syntax-highlighter-15.5.0.tgz", - "integrity": "sha512-+zq2myprEnQmH5yw6Gqc8lD55QHnpKaU8TOcFeC/Lg/MQSs8UknEA0JC4nTZGFAXC2J2Hyj/ijJ7NlabyPi2gg==", + "version": "16.1.1", + "resolved": "https://registry.npmjs.org/react-syntax-highlighter/-/react-syntax-highlighter-16.1.1.tgz", + "integrity": "sha512-PjVawBGy80C6YbC5DDZJeUjBmC7skaoEUdvfFQediQHgCL7aKyVHe57SaJGfQsloGDac+gCpTfRdtxzWWKmCXA==", + "license": "MIT", "dependencies": { - "@babel/runtime": "^7.3.1", + "@babel/runtime": "^7.28.4", "highlight.js": "^10.4.1", + "highlightjs-vue": "^1.0.0", "lowlight": "^1.17.0", - "prismjs": "^1.27.0", - "refractor": "^3.6.0" + "prismjs": "^1.30.0", + "refractor": "^5.0.0" + }, + "engines": { + "node": ">= 16.20.2" }, "peerDependencies": { "react": ">= 0.14.0" @@ -2385,44 +1808,43 @@ } }, "node_modules/react-toastify": { - "version": "9.1.3", - "resolved": "https://registry.npmjs.org/react-toastify/-/react-toastify-9.1.3.tgz", - "integrity": "sha512-fPfb8ghtn/XMxw3LkxQBk3IyagNpF/LIKjOBflbexr2AWxAH1MJgvnESwEwBn9liLFXgTKWgBSdZpw9m4OTHTg==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/react-toastify/-/react-toastify-11.1.0.tgz", + "integrity": "sha512-e9h23x3phN0wbFeB6yovmWp7lobzV4CaCH0LO8nVP6H7Y+3GbcLpIzMm9dJhcp1RXbpyfvjgpfXqO80QAmn7sg==", + "license": "MIT", "dependencies": { - "clsx": "^1.1.1" + "clsx": "^2.1.1" }, "peerDependencies": { - "react": ">=16", - "react-dom": ">=16" + "react": "^18 || ^19", + "react-dom": "^18 || ^19" } }, "node_modules/refractor": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/refractor/-/refractor-3.6.0.tgz", - "integrity": "sha512-MY9W41IOWxxk31o+YvFCNyNzdkc9M20NoZK5vq6jkv4I/uh2zkWcfudj0Q1fovjUQJrNewS9NMzeTtqPf+n5EA==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/refractor/-/refractor-5.0.0.tgz", + "integrity": "sha512-QXOrHQF5jOpjjLfiNk5GFnWhRXvxjUVnlFxkeDmewR5sXkr3iM46Zo+CnRR8B+MDVqkULW4EcLVcRBNOPXHosw==", + "license": "MIT", "dependencies": { - "hastscript": "^6.0.0", - "parse-entities": "^2.0.0", - "prismjs": "~1.27.0" + "@types/hast": "^3.0.0", + "@types/prismjs": "^1.0.0", + "hastscript": "^9.0.0", + "parse-entities": "^4.0.0" }, "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/refractor/node_modules/prismjs": { - "version": "1.27.0", - "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.27.0.tgz", - "integrity": "sha512-t13BGPUlFDR7wRB5kQDG4jjl7XeuH6jbJGt11JHPL96qwsEHNX2+68tFXqc1/k+/jALsbSWJKUOT/hcYAZ5LkA==", - "engines": { - "node": ">=6" + "node_modules/refractor/node_modules/@types/hast": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.5.tgz", + "integrity": "sha512-rp/ezSWaD1m44dPKICGhiskI13nVr7qTloFwDa/IYkhhf5nzwP+zIQcIJh3WIFSBOy/H1PzB40jPjMDksN4F+g==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" } }, - "node_modules/regenerator-runtime": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", - "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" - }, "node_modules/remark-parse": { "version": "10.0.2", "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-10.0.2.tgz", @@ -2452,36 +1874,37 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/rollup": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.9.6.tgz", - "integrity": "sha512-05lzkCS2uASX0CiLFybYfVkwNbKZG5NFQ6Go0VWyogFTXXbR039UVsegViTntkk4OglHBdF54ccApXRRuXRbsg==", + "node_modules/rolldown": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.2.3.tgz", + "integrity": "sha512-rn9wpmxplLf7NLNyCk9FyWh3FM43DbY8jOzCdEPzH7uflhTftRbCEpqi6Ly2osgoU8OwObtmavMbWLaWy4LX7A==", "dev": true, + "license": "MIT", "dependencies": { - "@types/estree": "1.0.5" + "@oxc-project/types": "=0.143.0", + "@rolldown/pluginutils": "^1.0.0" }, "bin": { - "rollup": "dist/bin/rollup" + "rolldown": "bin/cli.mjs" }, "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" + "node": "^20.19.0 || >=22.12.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.9.6", - "@rollup/rollup-android-arm64": "4.9.6", - "@rollup/rollup-darwin-arm64": "4.9.6", - "@rollup/rollup-darwin-x64": "4.9.6", - "@rollup/rollup-linux-arm-gnueabihf": "4.9.6", - "@rollup/rollup-linux-arm64-gnu": "4.9.6", - "@rollup/rollup-linux-arm64-musl": "4.9.6", - "@rollup/rollup-linux-riscv64-gnu": "4.9.6", - "@rollup/rollup-linux-x64-gnu": "4.9.6", - "@rollup/rollup-linux-x64-musl": "4.9.6", - "@rollup/rollup-win32-arm64-msvc": "4.9.6", - "@rollup/rollup-win32-ia32-msvc": "4.9.6", - "@rollup/rollup-win32-x64-msvc": "4.9.6", - "fsevents": "~2.3.2" + "@rolldown/binding-android-arm64": "1.2.3", + "@rolldown/binding-darwin-arm64": "1.2.3", + "@rolldown/binding-darwin-x64": "1.2.3", + "@rolldown/binding-freebsd-x64": "1.2.3", + "@rolldown/binding-linux-arm-gnueabihf": "1.2.3", + "@rolldown/binding-linux-arm64-gnu": "1.2.3", + "@rolldown/binding-linux-arm64-musl": "1.2.3", + "@rolldown/binding-linux-ppc64-gnu": "1.2.3", + "@rolldown/binding-linux-s390x-gnu": "1.2.3", + "@rolldown/binding-linux-x64-gnu": "1.2.3", + "@rolldown/binding-linux-x64-musl": "1.2.3", + "@rolldown/binding-openharmony-arm64": "1.2.3", + "@rolldown/binding-win32-arm64-msvc": "1.2.3", + "@rolldown/binding-win32-x64-msvc": "1.2.3" } }, "node_modules/sade": { @@ -2496,27 +1919,20 @@ } }, "node_modules/scheduler": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", - "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "license": "MIT", "dependencies": { "loose-envify": "^1.1.0" } }, - "node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -2533,35 +1949,33 @@ "node_modules/state-local": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/state-local/-/state-local-1.0.7.tgz", - "integrity": "sha512-HTEHMNieakEnoe33shBYcZ7NX83ACUjCu8c40iOGEZsngj9zRnkqS9j1pqQPXwobB0ZcVTk27REb7COQ0UR59w==" + "integrity": "sha512-HTEHMNieakEnoe33shBYcZ7NX83ACUjCu8c40iOGEZsngj9zRnkqS9j1pqQPXwobB0ZcVTk27REb7COQ0UR59w==", + "license": "MIT" }, "node_modules/style-to-object": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.3.0.tgz", - "integrity": "sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA==", + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.4.4.tgz", + "integrity": "sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg==", + "license": "MIT", "dependencies": { "inline-style-parser": "0.1.1" } }, - "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "node_modules/tinyglobby": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", "dev": true, + "license": "MIT", "dependencies": { - "has-flag": "^3.0.0" + "fdir": "^6.5.0", + "picomatch": "^4.0.4" }, "engines": { - "node": ">=4" - } - }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true, - "engines": { - "node": ">=4" + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" } }, "node_modules/trim-lines": { @@ -2672,44 +2086,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/update-browserslist-db": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/use-sync-external-store": { - "version": "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==", - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, "node_modules/uvu": { "version": "0.5.6", "resolved": "https://registry.npmjs.org/uvu/-/uvu-0.5.6.tgz", @@ -2756,20 +2132,23 @@ } }, "node_modules/vite": { - "version": "5.0.12", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.0.12.tgz", - "integrity": "sha512-4hsnEkG3q0N4Tzf1+t6NdN9dg/L3BM+q8SWgbSPnJvrgH2kgdyzfVJwbR1ic69/4uMJJ/3dqDZZE5/WwqW8U1w==", + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.2.1.tgz", + "integrity": "sha512-EU/eS7BH3XROHh2YnBefjM6DBKA6ZeMZEYQbj7NLWg5wHYlhB8B/Mayd5XsgWq+NFYccDOTemRpdETWR6Ka/lw==", "dev": true, + "license": "MIT", "dependencies": { - "esbuild": "^0.19.3", - "postcss": "^8.4.32", - "rollup": "^4.2.0" + "lightningcss": "^1.33.0", + "picomatch": "^4.0.5", + "postcss": "^8.5.25", + "rolldown": "~1.2.1", + "tinyglobby": "^0.2.17" }, "bin": { "vite": "bin/vite.js" }, "engines": { - "node": "^18.0.0 || >=20.0.0" + "node": "^20.19.0 || >=22.12.0" }, "funding": { "url": "https://github.com/vitejs/vite?sponsor=1" @@ -2778,27 +2157,41 @@ "fsevents": "~2.3.3" }, "peerDependencies": { - "@types/node": "^18.0.0 || >=20.0.0", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.4.0" + "@types/node": "^20.19.0 || >=22.12.0", + "@vitejs/devtools": "^0.4.0", + "esbuild": "^0.27.0 || ^0.28.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" }, "peerDependenciesMeta": { "@types/node": { "optional": true }, - "less": { + "@vitejs/devtools": { "optional": true }, - "lightningcss": { + "esbuild": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { "optional": true }, "sass": { "optional": true }, + "sass-embedded": { + "optional": true + }, "stylus": { "optional": true }, @@ -2807,22 +2200,14 @@ }, "terser": { "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true } } - }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "engines": { - "node": ">=0.4" - } - }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true } } } diff --git a/package.json b/package.json index ef7c383..40810a2 100644 --- a/package.json +++ b/package.json @@ -5,19 +5,18 @@ "bundle": "dotnet fable src/App --outDir dist/ --run vite build" }, "dependencies": { - "@fable-org/fable-metadata": "^1.0.0", - "@fable-org/fable-standalone": "^1.1.0", - "@monaco-editor/react": "^4.6.0", + "@fable-org/fable-metadata": "^2.1.0", + "@fable-org/fable-standalone": "^2.11.0", + "@monaco-editor/react": "^4.7.0", "monaco-editor": "^0.46.0", - "react": "^18.2.0", - "react-dom": "^18.2.0", - "react-markdown": "^8.0.4", - "react-syntax-highlighter": "^15.5.0", - "react-toastify": "^9.1.3", - "use-sync-external-store": "^1.2.0" + "react": "^18.3.1", + "react-dom": "^18.3.1", + "react-markdown": "^8.0.7", + "react-syntax-highlighter": "^16.1.1", + "react-toastify": "^11.1.0" }, "devDependencies": { - "@vitejs/plugin-react": "^4.2.1", - "vite": "^5.0.12" + "@vitejs/plugin-react": "^6.0.5", + "vite": "^8.2.1" } -} \ No newline at end of file +} diff --git a/src/App/App.fs b/src/App/App.fs index 11f9333..5d51c8e 100644 --- a/src/App/App.fs +++ b/src/App/App.fs @@ -18,6 +18,9 @@ open Feliz.UseMediaQuery importSideEffects "react-toastify/dist/ReactToastify.css" importSideEffects "./monaco-vite.js" +module Helper = + let inline mkProperty<'t> (key: string) (value: obj) : 't = (key, box value) |> unbox<'t> + [] type LogLevel = | Log @@ -66,30 +69,27 @@ type Msg = [] type SyntaxHighlighter = - static member inline language(value: string) = Interop.mkAttr "language" value - static member inline style(value: string) = Interop.mkAttr "style" value - static member inline children(value: ReactElement seq) = Interop.mkAttr "children" value + static member inline language(value: string) = Helper.mkProperty "language" value + static member inline style(value: string) = Helper.mkProperty "style" value + static member inline children(value: ReactElement seq) = Helper.mkProperty "children" value - static member inline highlighter(properties: IReactProperty list) = - Interop.reactApi.createElement ( - import "Prism as ReactSyntaxHighlighter" "react-syntax-highlighter", - createObj !!properties - ) + static member inline highlighter(properties: seq) = + ReactLegacy.createElement(unbox(import "Prism as ReactSyntaxHighlighter" "react-syntax-highlighter"), createObj !!properties) [] type MonacoEditor = - static member inline onChange(f: string -> unit) = Interop.mkAttr "onChange" f - static member inline theme(value: string) = Interop.mkAttr "theme" value - static member inline defaultLanguage(value: string) = Interop.mkAttr "defaultLanguage" value - static member inline value(value: string) = Interop.mkAttr "value" value - static member inline width(value: string) = Interop.mkAttr "width" value - static member inline height(value: string) = Interop.mkAttr "height" value + static member inline onChange(f: string -> unit) = Helper.mkProperty "onChange" f + static member inline theme(value: string) = Helper.mkProperty "theme" value + static member inline defaultLanguage(value: string) = Helper.mkProperty "defaultLanguage" value + static member inline value(value: string) = Helper.mkProperty "value" value + static member inline width(value: string) = Helper.mkProperty "width" value + static member inline height(value: string) = Helper.mkProperty "height" value static member inline onMount(f: System.Func) = - Interop.mkAttr "onMount" f + Helper.mkProperty "onMount" f static member inline editor(properties: IReactProperty list) = - Interop.reactApi.createElement (import "Editor" "@monaco-editor/react", createObj !!properties) + ReactLegacy.createElement(unbox(import "Editor" "@monaco-editor/react"), createObj !!properties) module WebWorker = let create () = Worker.Create(Constants.worker) @@ -203,7 +203,7 @@ let update msg model = | SetFSharpCode code -> let (debouncerModel, debouncerCmd) = model.Debouncer - |> Debouncer.bounce (TimeSpan.FromSeconds 1) "user_input" ParseCode + |> Debouncer.bounce (TimeSpan.FromSeconds 1L) "user_input" ParseCode { model with diff --git a/src/App/App.fsproj b/src/App/App.fsproj index a748900..147a831 100644 --- a/src/App/App.fsproj +++ b/src/App/App.fsproj @@ -2,7 +2,7 @@ Exe - net8.0 + net10.0 @@ -18,16 +18,17 @@ - - + + + - - + + - - + + - + From b0fe83e46d6ba5a182f9d757d550985df294768d Mon Sep 17 00:00:00 2001 From: sheridanchris Date: Mon, 10 Aug 2026 09:54:28 -0500 Subject: [PATCH 2/4] Update workflows --- .github/workflows/publish.yml | 4 ++-- .github/workflows/verify.yml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 362e61a..b7ac94c 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -22,12 +22,12 @@ jobs: - name: Setup .NET uses: actions/setup-dotnet@v1 with: - dotnet-version: '8.0.x' + dotnet-version: '10.0.x' - name: Setup Node.js environment uses: actions/setup-node@v3 with: - node-version: 20 + node-version: 24 - name: Install dependencies run: dotnet tool restore diff --git a/.github/workflows/verify.yml b/.github/workflows/verify.yml index eb83a9e..9739911 100644 --- a/.github/workflows/verify.yml +++ b/.github/workflows/verify.yml @@ -12,7 +12,7 @@ jobs: - name: Setup .NET uses: actions/setup-dotnet@v1 with: - dotnet-version: '8.0.x' + dotnet-version: '10.0.x' - name: Setup Node.js environment uses: actions/setup-node@v3 From d7fc90079eb427ded18555e0c835543c321b30d3 Mon Sep 17 00:00:00 2001 From: sheridanchris Date: Mon, 10 Aug 2026 12:35:02 -0500 Subject: [PATCH 3/4] UI redesign --- index.html | 20 +- package-lock.json | 25 +-- package.json | 3 +- src/App/App.fs | 461 +++++++++++++++++++++++++---------------- src/App/App.fsproj | 2 - src/App/styles.css | 504 +++++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 790 insertions(+), 225 deletions(-) create mode 100644 src/App/styles.css diff --git a/index.html b/index.html index 0c3da25..ba7a9a7 100644 --- a/index.html +++ b/index.html @@ -6,24 +6,16 @@ F# Tour - - + + + + -
+
- \ No newline at end of file + diff --git a/package-lock.json b/package-lock.json index fc83735..8d2cc7f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,8 +12,7 @@ "react": "^18.3.1", "react-dom": "^18.3.1", "react-markdown": "^8.0.7", - "react-syntax-highlighter": "^16.1.1", - "react-toastify": "^11.1.0" + "react-syntax-highlighter": "^16.1.1" }, "devDependencies": { "@vitejs/plugin-react": "^6.0.5", @@ -466,15 +465,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/clsx": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", - "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/comma-separated-tokens": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", @@ -1807,19 +1797,6 @@ "node": "*" } }, - "node_modules/react-toastify": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/react-toastify/-/react-toastify-11.1.0.tgz", - "integrity": "sha512-e9h23x3phN0wbFeB6yovmWp7lobzV4CaCH0LO8nVP6H7Y+3GbcLpIzMm9dJhcp1RXbpyfvjgpfXqO80QAmn7sg==", - "license": "MIT", - "dependencies": { - "clsx": "^2.1.1" - }, - "peerDependencies": { - "react": "^18 || ^19", - "react-dom": "^18 || ^19" - } - }, "node_modules/refractor": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/refractor/-/refractor-5.0.0.tgz", diff --git a/package.json b/package.json index 40810a2..8bdc2b2 100644 --- a/package.json +++ b/package.json @@ -12,8 +12,7 @@ "react": "^18.3.1", "react-dom": "^18.3.1", "react-markdown": "^8.0.7", - "react-syntax-highlighter": "^16.1.1", - "react-toastify": "^11.1.0" + "react-syntax-highlighter": "^16.1.1" }, "devDependencies": { "@vitejs/plugin-react": "^6.0.5", diff --git a/src/App/App.fs b/src/App/App.fs index 5d51c8e..47960f9 100644 --- a/src/App/App.fs +++ b/src/App/App.fs @@ -8,15 +8,13 @@ open Fable.Core open Fable.Core.JsInterop open Fable.WebWorker open Fable.Standalone -open Fable.ReactToastify open Feliz.Markdown open Navigation open MonacoEditor open System -open Feliz.UseMediaQuery -importSideEffects "react-toastify/dist/ReactToastify.css" importSideEffects "./monaco-vite.js" +importSideEffects "./styles.css" module Helper = let inline mkProperty<'t> (key: string) (value: obj) : 't = (key, box value) |> unbox<'t> @@ -29,25 +27,51 @@ type LogLevel = [] module LogLevel = - let toCssColor logLevel = - match logLevel with - | LogLevel.Log -> "inherit" - | LogLevel.Warn -> "darkorange" - | LogLevel.Error -> "red" + let cssClass = function + | LogLevel.Log -> "log" + | LogLevel.Warn -> "warn" + | LogLevel.Error -> "error" +type Theme = + | Light + | Dark + +type CompileState = + | Ready + | Compiling + +[] +module Theme = + let fromStorage () = + match localStorage.getItem "theme" with + | "light" -> Light + | "dark" + | _ -> Dark + + let saveToStorage theme = + let value = + match theme with + | Light -> "light" + | Dark -> "dark" + + localStorage.setItem ("theme", value) type Model = { Logs: (string * LogLevel) list FSharpCode: string - CompiledJavaScript: string Markdown: string IFrameUrl: string Worker: ObservableWorker TableOfContents: Documentation.TableOfContents CurrentPage: Navigation.Page DocEntryNavigation: DocEntryNavigation - Editor: Monaco.Editor.IStandaloneCodeEditor + Editor: Monaco.Editor.IStandaloneCodeEditor option Markers: Monaco.Editor.IMarkerData array Debouncer: Debouncer.State + Theme: Theme + CodeRevision: int + CompilingRevision: int option + CompileState: CompileState + IsLoadingDocumentation: bool } type Msg = @@ -66,11 +90,14 @@ type Msg = | SetEditor of Monaco.Editor.IStandaloneCodeEditor | DebouncerSelfMsg of Debouncer.SelfMessage | ParseCode + | ToggleTheme [] type SyntaxHighlighter = static member inline language(value: string) = Helper.mkProperty "language" value static member inline style(value: string) = Helper.mkProperty "style" value + static member inline customStyle(value: obj) = Helper.mkProperty "customStyle" value + static member inline className(value: string) = Helper.mkProperty "className" value static member inline children(value: ReactElement seq) = Helper.mkProperty "children" value static member inline highlighter(properties: seq) = @@ -82,8 +109,7 @@ type MonacoEditor = static member inline theme(value: string) = Helper.mkProperty "theme" value static member inline defaultLanguage(value: string) = Helper.mkProperty "defaultLanguage" value static member inline value(value: string) = Helper.mkProperty "value" value - static member inline width(value: string) = Helper.mkProperty "width" value - static member inline height(value: string) = Helper.mkProperty "height" value + static member inline options(value: obj) = Helper.mkProperty "options" value static member inline onMount(f: System.Func) = Helper.mkProperty "onMount" f @@ -98,12 +124,12 @@ module WebWorker = let handler dispatch = worker |> Observable.add (function - | Loaded version -> () - | LoadFailed -> () + | Loaded _ -> () + | LoadFailed -> dispatch (AddConsoleLog(LogLevel.Error, "The F# compiler could not load.")) | ParsedCode errors -> errors |> Editor.mapErrorToMarker |> SetMarkers |> dispatch | CompilationFinished(code, lang, errors, stats) -> dispatch (Compiled(code, lang, errors, stats)) | CompilationsFinished(code, lang, errors, stats) -> () - | CompilerCrashed msg -> () + | CompilerCrashed msg -> dispatch (AddConsoleLog(LogLevel.Error, "Compiler failed: " + msg)) | FoundTooltip _ -> () | FoundCompletions _ -> () | FoundDeclarationLocation _ -> ()) @@ -139,7 +165,6 @@ let init () = { Logs = [] FSharpCode = "" - CompiledJavaScript = "" Markdown = "" IFrameUrl = "" Worker = worker @@ -149,9 +174,14 @@ let init () = PreviousEntry = None NextEntry = None } - Editor = Unchecked.defaultof + Editor = None Markers = [||] Debouncer = Debouncer.create () + Theme = Theme.fromStorage () + CodeRevision = 0 + CompilingRevision = None + CompileState = Ready + IsLoadingDocumentation = true }, cmd @@ -176,32 +206,40 @@ let calculateFSharpCodeValue currentPage = | Page.Homepage | Page.TableOfContents -> helloWorldCode -let setModelMarkers (editor: Monaco.Editor.IStandaloneCodeEditor) (markers: Monaco.Editor.IMarkerData array) = - match editor.getModel () with +let setModelMarkers (editor: Monaco.Editor.IStandaloneCodeEditor option) (markers: Monaco.Editor.IMarkerData array) = + match editor with | None -> () - | Some textModel -> Monaco.editor.setModelMarkers (textModel, "FSharpErrors", ResizeArray markers) + | Some editor -> + match editor.getModel () with + | None -> () + | Some textModel -> Monaco.editor.setModelMarkers (textModel, "FSharpErrors", ResizeArray markers) let errorToLogLevel (error: Error) = if error.IsWarning then LogLevel.Warn else LogLevel.Error -let toastNotificationFromErrors (errors: Error array) = - match errors with - | [||] -> Toastify.success "Compiled Successfully." - | _ -> Toastify.error "Failed to Compile." - let scrollToTopOfMarkdown () = let markdownElement = document.getElementById "markdown-content" markdownElement.scrollTo (0, 0) let update msg model = match msg with - | Compile -> { model with Logs = [] }, Cmd.ofEffect (fun _ -> compile model) + | Compile when model.CompileState = Compiling -> model, Cmd.none + | Compile -> + { + model with + Logs = [] + CompilingRevision = Some model.CodeRevision + CompileState = Compiling + }, + Cmd.ofEffect (fun _ -> compile model) | SetIFrameUrl url -> { model with IFrameUrl = url }, Cmd.none | SetMarkdown doc -> { model with Markdown = doc }, Cmd.none - | SetEditor editor -> { model with Editor = editor }, Cmd.none + | SetEditor editor -> + let model = { model with Editor = Some editor } + model, Cmd.ofEffect (fun _ -> setModelMarkers model.Editor model.Markers) | ParseCode -> model, Cmd.ofEffect (fun _ -> WorkerRequest.ParseCode(model.FSharpCode, [||]) |> model.Worker.Post) | SetFSharpCode code -> - let (debouncerModel, debouncerCmd) = + let debouncerModel, debouncerCmd = model.Debouncer |> Debouncer.bounce (TimeSpan.FromSeconds 1L) "user_input" ParseCode @@ -209,6 +247,8 @@ let update msg model = model with FSharpCode = code Debouncer = debouncerModel + CodeRevision = model.CodeRevision + 1 + CompileState = Ready }, Cmd.map DebouncerSelfMsg debouncerCmd | SetMarkers markers -> @@ -216,8 +256,9 @@ let update msg model = let cmd = Cmd.ofEffect (fun _ -> setModelMarkers model.Editor model.Markers) model, cmd | AddConsoleLog(level, output) -> - let logs = model.Logs @ [ (output, level) ] + let logs = model.Logs @ [(output, level)] { model with Logs = logs }, Cmd.none + | Compiled(_, _, _, _) when model.CompilingRevision <> Some model.CodeRevision -> model, Cmd.none | Compiled(code, _, errors, _) -> let logs = if errors.Length = 0 then @@ -228,19 +269,19 @@ let update msg model = |> Array.map (fun error -> error.Message, errorToLogLevel error) |> Array.toList - model.Logs @ errorLogs + errorLogs @ model.Logs let model = { model with - CompiledJavaScript = code Logs = logs + CompilingRevision = None + CompileState = Ready } model, Cmd.batch [ - Cmd.ofEffect (fun _ -> toastNotificationFromErrors errors |> ignore) errors |> Editor.mapErrorToMarker |> SetMarkers |> Cmd.ofMsg - Cmd.OfFunc.perform Iframe.generateHtmlBlobUrl model.CompiledJavaScript SetIFrameUrl + if errors.Length = 0 then Cmd.OfFunc.perform Iframe.generateHtmlBlobUrl code SetIFrameUrl else Cmd.none ] | FetchedTableOfContents tableOfContents -> let url = Router.currentUrl () @@ -250,12 +291,13 @@ let update msg model = model with CurrentPage = currentPage TableOfContents = tableOfContents + IsLoadingDocumentation = false }, Cmd.batch [ Cmd.ofMsg CalculateMarkdownAndCodeValues Cmd.ofMsg CalculateDocEntryNavigation ] - | FetchTableOfContentsExn exn -> model, Cmd.none // TODO: this. + | FetchTableOfContentsExn _ -> { model with IsLoadingDocumentation = false }, Cmd.none | SetUrl url -> let currentPage = getCurrentPage model.TableOfContents url @@ -289,197 +331,250 @@ let update msg model = }, Cmd.none | DebouncerSelfMsg debouncerMsg -> - let (debouncerModel, debouncerCmd) = Debouncer.update debouncerMsg model.Debouncer + let debouncerModel, debouncerCmd = Debouncer.update debouncerMsg model.Debouncer { model with Debouncer = debouncerModel }, debouncerCmd + | ToggleTheme -> + let theme = + match model.Theme with + | Light -> Dark + | Dark -> Light -let (|DesktopSize|MobileSize|) (screenSize: ScreenSize) = - match screenSize with - | ScreenSize.Desktop - | ScreenSize.WideScreen -> DesktopSize - | ScreenSize.Tablet - | ScreenSize.Mobile - | ScreenSize.MobileLandscape -> MobileSize - -let mobileNavbar = - Html.ul [ Html.li [ Html.a [ prop.href (Router.format []); prop.text "F# For You" ] ] ] - -let imageLink href src text = - Html.a [ - prop.href href - prop.target "_blank" - prop.children [ - Html.img [ - prop.src src - prop.width 40 - prop.height 40 - prop.style [ style.marginRight (length.px 5) ] - ] - Html.small (text: string) - ] - ] - -let desktopNavbar = [ - Html.ul [ Html.li [ imageLink (Router.format []) "img/fsharp.png" "F# For You!" ] ] + { model with Theme = theme }, Cmd.ofEffect (fun _ -> Theme.saveToStorage theme) - Html.ul [ - Html.li [ imageLink "https://fable.io" "img/fable.png" "Powered by Fable" ] - Html.li [ - imageLink "https://github.com/fsharpforyou/tour" "img/github.png" "View Source Code" - ] - ] -] - -module View = +module TourView = [] let AppView () = let model, dispatch = React.useElmish (init, update) - let screenSize = React.useResponsive Breakpoints.defaults React.router [ router.onUrlChanged (SetUrl >> dispatch) router.children [ - Html.main [ - prop.style [ - style.display.grid - - match screenSize with - | MobileSize -> - style.gridTemplateAreas [| [| "header" |]; [| "markdown" |]; [| "editor" |] |] - style.gridTemplateRows [| length.percent 10; length.auto; length.px 750 |] - style.gridTemplateColumns [| length.percent 100 |] - | DesktopSize -> - style.height (length.percent 100) - style.gridTemplateAreas [| [| "header"; "header" |]; [| "markdown"; "editor" |] |] - style.gridTemplateRows [| length.percent 10; length.percent 90 |] - style.gridTemplateColumns [| length.percent 50; length.percent 50 |] - ] + Html.div [ + let themeClassName = + match model.Theme with + | Light -> "light" + | Dark -> "dark" + + prop.className $"tour-app {themeClassName}" prop.children [ - Html.header [ - prop.style [ style.gridArea "header" ] - prop.children [ - Html.nav [ - match screenSize with - | MobileSize -> mobileNavbar - | DesktopSize -> yield! desktopNavbar - - Html.ul [ - Html.button [ prop.text "Run"; prop.onClick (fun _ -> dispatch Compile) ] - ] - ] - ] + Html.a [ + prop.href "#main-content" + prop.className "skip-link" + prop.text "Skip to lesson" ] - Html.section [ - prop.id "markdown-content" - prop.style [ - style.gridArea "markdown" - style.custom ("text-wrap", "balance") - style.overflowX.hidden - ] + Html.header [ + prop.className "tour-header" prop.children [ - Markdown.markdown [ - markdown.children model.Markdown - markdown.components [ - markdown.components.code (fun props -> - if props.isInline then - Html.code props.children - else - let style = - import "vs" "react-syntax-highlighter/dist/esm/styles/prism" - - let language = props.className.Replace("language-", "") - - SyntaxHighlighter.highlighter [ - SyntaxHighlighter.language language - SyntaxHighlighter.style style - SyntaxHighlighter.children props.children - ]) + Html.a [ + prop.href (Router.format []) + prop.className "tour-brand" + prop.children [ + Html.img [ + prop.src "img/fsharp.png" + prop.alt "F#" + prop.className "tour-logo" + ] + Html.text "Language Tour" ] ] - Html.nav [ - Html.ul [ - match model.DocEntryNavigation.PreviousEntry with - | None -> Html.none - | Some entry -> - Html.li [ - Html.a [ - prop.href (Router.format entry.Route) - prop.text $"< {entry.Title}" + prop.ariaLabel "Primary navigation" + prop.children [ + Html.button [ + prop.className "run-button header-run-button" + prop.text "Run" + prop.disabled (model.CompileState = Compiling) + prop.onClick (fun _ -> dispatch Compile) + ] + Html.a [ + prop.href "https://github.com/fsharpforyou/tour" + prop.target "_blank" + prop.rel "noreferrer" + prop.ariaLabel "View source on GitHub" + prop.title "View source on GitHub" + prop.children [ + Html.i [ + prop.className "fa-brands fa-github" + prop.ariaHidden true ] ] - Html.li [ - Html.a [ - prop.href (Router.format [ "table-of-contents" ]) - prop.text "Table of Contents" - ] ] - match model.DocEntryNavigation.NextEntry with - | None -> Html.none - | Some entry -> - Html.li [ - Html.a [ - prop.href (Router.format entry.Route) - prop.text $"{entry.Title} >" + Html.button [ + let label = + match model.Theme with + | Light -> "Switch to dark mode" + | Dark -> "Switch to light mode" + + prop.className "icon-button" + prop.onClick (fun _ -> dispatch ToggleTheme) + prop.ariaPressed (model.Theme = Dark) + prop.ariaLabel label + prop.title label + prop.children [ + Html.i [ + prop.className ( + match model.Theme with + | Light -> "fa-solid fa-moon" + | Dark -> "fa-solid fa-sun" + ) + prop.ariaHidden true ] ] + ] ] ] ] ] - Html.section [ - prop.style [ style.gridArea "editor" ] + Html.main [ + prop.id "main-content" + prop.className "tour-main" prop.children [ - Html.section [ - prop.style [ style.height (length.percent 70) ] + Html.article [ + prop.id "markdown-content" + prop.className "reading-pane" prop.children [ - MonacoEditor.editor [ - MonacoEditor.defaultLanguage "fsharp" - MonacoEditor.value model.FSharpCode - MonacoEditor.theme "vs" - MonacoEditor.onChange (SetFSharpCode >> dispatch) - MonacoEditor.onMount ( - Editor.onFSharpEditorDidMount model.Worker (SetEditor >> dispatch) - ) - ] + if model.IsLoadingDocumentation then + Html.div [ + prop.className "documentation-loading" + prop.role "status" + prop.children [ + Html.span [ prop.className "loading-spinner"; prop.ariaHidden true ] + Html.p "Loading lesson…" + ] + ] + else + Markdown.markdown [ + markdown.children model.Markdown + markdown.components [ + markdown.components.code (fun props -> + if props.isInline then + Html.code props.children + else + let syntaxStyle = + match model.Theme with + | Light -> + import "vs" "react-syntax-highlighter/dist/esm/styles/prism" + | Dark -> + import "vscDarkPlus" "react-syntax-highlighter/dist/esm/styles/prism" + + let language = props.className.Replace("language-", "") + + SyntaxHighlighter.highlighter [ + SyntaxHighlighter.className "markdown-code-block" + SyntaxHighlighter.language language + SyntaxHighlighter.style syntaxStyle + SyntaxHighlighter.customStyle ( + createObj [ + "border" ==> + match model.Theme with + | Light -> "1px solid #b9d8e9" + | Dark -> "1px solid #41647d" + "background" ==> + match model.Theme with + | Light -> "#f5f9fc" + | Dark -> "#111827" + "borderRadius" ==> "0" + ] + ) + SyntaxHighlighter.children props.children + ]) + ] + ] ] ] - Html.article [ - prop.style [ style.height (length.percent 30); style.overflow.scroll ] + Html.section [ + prop.className "coding-pane" prop.children [ - Html.h4 "Output" - for (log, level) in model.Logs do - Html.p [ - prop.style [ style.color (LogLevel.toCssColor level) ] - prop.text log + Html.div [ + prop.className "code-editor" + prop.children [ + MonacoEditor.editor [ + MonacoEditor.defaultLanguage "fsharp" + MonacoEditor.value model.FSharpCode + MonacoEditor.theme ( + match model.Theme with + | Light -> "vs" + | Dark -> "vs-dark" + ) + MonacoEditor.options ( + createObj [ + "fontSize" ==> 16 + "lineHeight" ==> 27 + "fontFamily" ==> "ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace" + "fontLigatures" ==> false + "automaticLayout" ==> true + "minimap" ==> createObj [ "enabled" ==> false ] + "padding" ==> createObj [ "top" ==> 18; "bottom" ==> 18 ] + "scrollBeyondLastLine" ==> false + "renderLineHighlight" ==> "gutter" + ] + ) + MonacoEditor.onChange (SetFSharpCode >> dispatch) + MonacoEditor.onMount ( + Editor.onFSharpEditorDidMount model.Worker (SetEditor >> dispatch) + ) + ] ] - - Html.hr [] + ] + Html.section [ + prop.className "program-output" + prop.ariaLive.polite + prop.ariaLabel "Program output" + prop.children [ + Html.header [ + prop.className "output-header" + prop.children [ Html.h2 "OUTPUT" ] + ] + Html.div [ + prop.className "output-body" + prop.role "log" + prop.ariaLabel "Program output" + prop.children [ + if not (List.isEmpty model.Logs) then + for log, level in model.Logs do + Html.p [ + prop.className ("line " + LogLevel.cssClass level) + prop.text ( + match level with + | LogLevel.Log -> log + | LogLevel.Warn -> "WARNING: " + log + | LogLevel.Error -> "ERROR: " + log + ) + ] + ] + ] + ] + ] ] ] ] ] + Html.footer [ + prop.className "tour-footer" + prop.children [ + match model.DocEntryNavigation.PreviousEntry with + | None -> Html.span "" + | Some entry -> + Html.a [ prop.href (Router.format entry.Route); prop.text $"← {entry.Title}" ] + Html.a [ + prop.href (Router.format [ "table-of-contents" ]) + prop.text "TABLE OF CONTENTS" + ] + match model.DocEntryNavigation.NextEntry with + | None -> Html.span "" + | Some entry -> + Html.a [ prop.href (Router.format entry.Route); prop.text $"{entry.Title} →" ] + ] + ] ] ] - Html.iframe [ - prop.src model.IFrameUrl - prop.style [ - style.position.absolute - style.width 0 - style.height 0 - style.border (0, borderStyle.hidden, "") - ] - ] - Toastify.container [ - ContainerOption.autoClose 2000 - ContainerOption.position Position.BottomRight - ContainerOption.theme Theme.Light - ] + Html.iframe [ prop.src model.IFrameUrl; prop.className "execution-frame" ] ] ] -ReactDOM.createRoot(document.getElementById "app").render (View.AppView()) +ReactDOM.createRoot(document.getElementById "app").render (TourView.AppView()) diff --git a/src/App/App.fsproj b/src/App/App.fsproj index 147a831..4792efe 100644 --- a/src/App/App.fsproj +++ b/src/App/App.fsproj @@ -21,12 +21,10 @@ - - diff --git a/src/App/styles.css b/src/App/styles.css new file mode 100644 index 0000000..9bc8c7b --- /dev/null +++ b/src/App/styles.css @@ -0,0 +1,504 @@ +:root { + --page: #f7f9fc; + --surface: #ffffff; + --surface-muted: #f8fafc; + --reading-surface: #fdfdfc; + --text: #18212d; + --text-muted: #66798b; + --text-reading: #344252; + --border: #d7e1ec; + --border-strong: #c7d6e4; + --accent: #2784b7; + --accent-strong: #126996; + --accent-soft: #e8f3fa; + --focus: #f4b942; + --danger: #aa2634; + --warning: #825a00; + --brand-stripe: #378bba; + --inverse-surface: #172033; + --inverse-text: #ffffff; + --nav-text: #53687b; + --border-subtle: #b7c8d9; + --heading: #172033; + --link: #126996; + --link-decoration: #8fc5e1; + --code-text: #07557e; + --output-text: #243242; + --focus-editor: #378bba; + font-family: "DM Mono", ui-monospace, SFMono-Regular, Menlo, monospace; + color: var(--text); + background: var(--page); +} + +* { + box-sizing: border-box; +} +html, +body, +#app { + width: 100%; + max-width: none; + height: 100%; +} +body { + margin: 0; + min-width: 0; + overflow: hidden; + background: var(--page); +} +a { + color: inherit; +} +button { + font: inherit; +} +:focus-visible { + outline: 3px solid var(--focus); + outline-offset: 3px; +} + +.tour-app { + display: grid; + grid-template-rows: 64px minmax(0, 1fr) 58px; + width: 100%; + height: 100dvh; + overflow: hidden; + background: var(--page); + border-top: 4px solid var(--brand-stripe); +} + +.skip-link { + position: fixed; + top: 10px; + left: 10px; + z-index: 10; + padding: 9px 12px; + background: var(--inverse-surface); + color: var(--inverse-text); + font-size: 0.78rem; + font-weight: 500; + transform: translateY(-160%); +} +.skip-link:focus { + transform: translateY(0); +} + +.tour-header { + display: flex; + align-items: center; + justify-content: space-between; + padding: 0 28px; + border-bottom: 1px solid var(--border); + background: var(--surface); +} +.tour-brand { + display: inline-flex; + align-items: center; + gap: 8px; + color: var(--text); + font-family: "DM Mono", ui-monospace, monospace; + font-size: 0.88rem; + font-weight: 500; + letter-spacing: -0.03em; + text-decoration: none; +} +.tour-logo { + width: 30px; + height: 30px; + object-fit: contain; +} +.tour-header nav { + display: flex; + align-items: center; + gap: 6px; +} +.tour-header nav > a, +.icon-button { + display: grid; + width: 34px; + height: 34px; + place-items: center; + border: 1px solid transparent; + background: transparent; + color: var(--nav-text); + cursor: pointer; + font-size: 1rem; + text-decoration: none; +} +.tour-header nav > a:hover, +.icon-button:hover { + border-color: var(--border-subtle); + color: var(--link); +} + +.tour-main { + display: grid; + grid-template-columns: minmax(0, 1.08fr) minmax(420px, 0.92fr); + min-width: 0; + min-height: 0; +} +.reading-pane { + min-width: 0; + min-height: 0; + padding: clamp(28px, 4vw, 56px) clamp(28px, 6vw, 88px); + overflow-y: auto; + background: var(--reading-surface); +} +.reading-pane > * { + max-width: 720px; +} +.documentation-loading { + display: flex; + align-items: center; + gap: 12px; + color: var(--text-muted); + font-family: "DM Mono", ui-monospace, monospace; + font-size: 0.82rem; +} +.documentation-loading p { + margin: 0; + color: inherit; + font-family: inherit; + font-size: inherit; +} +.loading-spinner { + width: 16px; + height: 16px; + border: 2px solid var(--border-strong); + border-top-color: var(--accent); + border-radius: 50%; + animation: spin 0.8s linear infinite; +} +@keyframes spin { + to { transform: rotate(360deg); } +} +.reading-pane :is(h1, h2, h3, h4) { + color: var(--heading); + font-family: "Source Serif 4", Georgia, serif; + font-weight: 600; + letter-spacing: -0.027em; +} +.reading-pane h1 { + margin: 0 0 1.8rem; + font-size: clamp(2.2rem, 3.6vw, 3.5rem); + line-height: 1.02; +} +.reading-pane h2 { + margin: 2.25rem 0 0.75rem; + font-size: 1.55rem; + line-height: 1.15; +} +.reading-pane h3 { + margin: 1.65rem 0 0.6rem; + font-size: 1.2rem; +} +.reading-pane p, +.reading-pane li { + color: var(--text-reading); + font-family: "Source Serif 4", Georgia, serif; + font-size: 1.1rem; + line-height: 1.62; +} +.reading-pane p { + margin: 0 0 1rem; +} +.reading-pane ul, +.reading-pane ol { + padding-left: 1.3rem; +} +.reading-pane li { + margin: 0.2rem 0; +} +.reading-pane a { + color: var(--link); + text-decoration-color: var(--link-decoration); + text-decoration-thickness: 1px; + text-underline-offset: 3px; +} +.reading-pane :not(pre) > code { + padding: 0.13em 0.3em; + border-radius: 3px; + background: var(--accent-soft); + color: var(--code-text); + font-family: "DM Mono", ui-monospace, monospace; + font-size: 0.78em; +} +.markdown-code-block { + display: block !important; + height: auto !important; + min-height: 0 !important; + max-height: none !important; + box-sizing: border-box !important; + max-width: 100%; + overflow-x: auto; + font-family: "DM Mono", ui-monospace, monospace; + margin-block: 1.25rem !important; + padding: 0.85rem 1rem !important; + font-family: "DM Mono", ui-monospace, monospace !important; + font-size: 15px !important; + line-height: 24px !important; +} +.markdown-code-block code { + font-size: inherit; + line-height: inherit; +} +.reading-pane table { + display: block; + width: max-content; + max-width: 100%; + overflow-x: auto; + border-collapse: collapse; + font-family: "DM Mono", ui-monospace, monospace; + font-size: 0.82rem; +} +.reading-pane th, +.reading-pane td { + padding: 8px 10px; + border: 1px solid var(--border-subtle); + text-align: left; +} + +.coding-pane { + display: grid; + grid-template-rows: minmax(0, 1fr) 172px; + min-width: 0; + min-height: 0; + border-left: 1px solid var(--border-strong); + background: var(--surface); +} +.run-button { + flex: 0 0 auto; + min-width: 70px; + padding: 8px 14px; + border: 0; + border-radius: 4px; + background: var(--accent); + color: var(--inverse-text); + cursor: pointer; + font-size: 0.78rem; + font-weight: 500; +} +.run-button:hover { + background: var(--accent-strong); +} +.run-button:disabled { + cursor: wait; + opacity: 0.65; +} +.header-run-button { + margin-right: 6px; +} +.code-editor { + min-height: 0; + border-bottom: 1px solid var(--border-strong); +} +.code-editor:focus-within { + box-shadow: inset 3px 0 var(--focus-editor); +} +.code-editor > div { + height: 100% !important; +} +.program-output { + display: grid; + grid-template-rows: auto minmax(0, 1fr); + min-width: 0; + min-height: 0; + overflow: hidden; + background: var(--surface-muted); +} +.output-header { + display: flex; + align-items: center; + justify-content: space-between; + min-height: 52px; + min-width: 0; + padding: 0 20px; + border-bottom: 1px solid var(--border); + background: var(--surface-muted); +} +.output-body { + min-width: 0; + min-height: 0; + padding: 5px 20px 17px; + overflow: auto; +} +.program-output h2 { + margin: 0; + color: var(--text-muted); + font-size: 0.68rem; + font-weight: 500; + letter-spacing: 0.08em; +} +.program-output .line { + margin: 12px 0; + color: var(--output-text); + font-size: 0.82rem; + line-height: 1.55; + white-space: pre-wrap; +} +.program-output .warn { + color: var(--warning); +} +.program-output .error { + color: var(--danger); +} + +.tour-footer { + display: grid; + grid-template-columns: minmax(0, 1fr) auto minmax(0, 1fr); + gap: 20px; + align-items: center; + padding: 0 28px; + border-top: 1px solid var(--border); + background: var(--surface); +} +.tour-footer > * { + min-width: 0; +} +.tour-footer a { + color: var(--nav-text); + font-size: 0.72rem; + font-weight: 500; + text-decoration: none; +} +.tour-footer a:hover { + color: var(--link); + text-decoration: underline; +} +.tour-footer a:last-child { + text-align: right; +} +.tour-footer a:first-child, +.tour-footer a:last-child { + min-width: 0; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} +.execution-frame { + position: absolute; + width: 0; + height: 0; + border: 0; +} + +.tour-app.dark { + --page: #101722; + --surface: #111b28; + --surface-muted: #0d141e; + --reading-surface: #101722; + --text: #dce8f2; + --text-muted: #a9bdce; + --text-reading: #cbd8e4; + --border: #2c4053; + --border-strong: #2c4053; + --accent: #38bdf8; + --accent-strong: #b6e8ff; + --accent-soft: #193249; + --danger: #f5a3aa; + --warning: #f5c761; + --brand-stripe: #38bdf8; + --inverse-surface: #eaf2f8; + --inverse-text: #072b42; + --nav-text: #a9bdce; + --border-subtle: #42637f; + --heading: #f3f8fc; + --link: #7dd3fc; + --link-decoration: #3b6e8c; + --code-text: #b6e8ff; + --output-text: #dce8f2; + --focus-editor: #38bdf8; +} + +@media (min-width: 1600px) { + .reading-pane { + padding-right: clamp(72px, 9vw, 168px); + padding-left: clamp(56px, 7vw, 132px); + } + .coding-pane { + grid-template-rows: minmax(0, 1fr) 192px; + } +} + +@media (max-width: 1350px) and (min-width: 1101px) { + .tour-main { + grid-template-columns: minmax(0, 1fr) minmax(390px, 0.9fr); + } + .reading-pane { + padding: clamp(36px, 4vw, 58px) clamp(32px, 5vw, 72px); + } +} + +@media (max-height: 720px) and (min-width: 1101px) { + .tour-app { + grid-template-rows: 56px minmax(0, 1fr) 50px; + } + .reading-pane { + padding-top: 30px; + padding-bottom: 30px; + } + .coding-pane { + grid-template-rows: minmax(0, 1fr) 148px; + } + .output-header { + min-height: 44px; + } +} + +@media (max-width: 1100px) { + html, + body, + #app { + height: auto; + } + body { + overflow: auto; + } + .tour-app { + display: block; + height: auto; + min-height: 100vh; + overflow: visible; + } + .tour-header { + min-height: 60px; + padding: 0 18px; + } + .tour-main { + grid-template-columns: 1fr; + } + .reading-pane { + padding: 46px clamp(22px, 8vw, 72px) 54px; + overflow: visible; + } + .coding-pane { + min-height: 600px; + grid-template-rows: minmax(390px, 1fr) minmax(160px, 0.42fr); + border-top: 1px solid #c7d6e4; + border-left: 0; + } + .tour-footer { + min-height: 58px; + padding: 0 18px; + } +} +@media (max-width: 520px) { + .reading-pane h1 { + font-size: 2.5rem; + } + .reading-pane p, + .reading-pane li { + font-size: 1.1rem; + } + .tour-footer { + gap: 8px; + } + .tour-footer a { + font-size: 0.64rem; + } +} +@media (prefers-reduced-motion: reduce) { + .loading-spinner { + animation: none; + } +} From bc5b3e2b048578575575af61e093f4b92d8e50ec Mon Sep 17 00:00:00 2001 From: sheridanchris Date: Mon, 10 Aug 2026 12:37:23 -0500 Subject: [PATCH 4/4] Format code --- build.fsx | 2 +- .../functions/pipelines-and-composition.fsx | 2 +- src/App/App.fs | 122 +++++++++++------- src/App/Editor.fs | 16 +-- src/App/Libs/Monaco.fs | 85 ++++++------ 5 files changed, 119 insertions(+), 108 deletions(-) diff --git a/build.fsx b/build.fsx index 5c6389e..58ee4b6 100644 --- a/build.fsx +++ b/build.fsx @@ -22,7 +22,7 @@ module Directories = module Stages = let clean = - stage "Clean" { run (fun _ -> !! "public/js" ++ "dist/" |> Shell.cleanDirs) } + stage "Clean" { run (fun _ -> !!"public/js" ++ "dist/" |> Shell.cleanDirs) } let dotnetRestore = stage "Restore .NET dependencies" { diff --git a/public/documentation/functions/pipelines-and-composition.fsx b/public/documentation/functions/pipelines-and-composition.fsx index 8790c07..8c82f66 100644 --- a/public/documentation/functions/pipelines-and-composition.fsx +++ b/public/documentation/functions/pipelines-and-composition.fsx @@ -1,4 +1,4 @@ -let negative x = x * - 1 +let negative x = x * -1 let double x = x * 2 3 |> negative |> double |> printfn "double(negative(3)) = %d" diff --git a/src/App/App.fs b/src/App/App.fs index 47960f9..9d92548 100644 --- a/src/App/App.fs +++ b/src/App/App.fs @@ -27,7 +27,8 @@ type LogLevel = [] module LogLevel = - let cssClass = function + let cssClass = + function | LogLevel.Log -> "log" | LogLevel.Warn -> "warn" | LogLevel.Error -> "error" @@ -54,7 +55,8 @@ module Theme = | Light -> "light" | Dark -> "dark" - localStorage.setItem ("theme", value) + localStorage.setItem ("theme", value) + type Model = { Logs: (string * LogLevel) list FSharpCode: string @@ -101,13 +103,19 @@ type SyntaxHighlighter = static member inline children(value: ReactElement seq) = Helper.mkProperty "children" value static member inline highlighter(properties: seq) = - ReactLegacy.createElement(unbox(import "Prism as ReactSyntaxHighlighter" "react-syntax-highlighter"), createObj !!properties) + ReactLegacy.createElement ( + unbox (import "Prism as ReactSyntaxHighlighter" "react-syntax-highlighter"), + createObj !!properties + ) [] type MonacoEditor = static member inline onChange(f: string -> unit) = Helper.mkProperty "onChange" f static member inline theme(value: string) = Helper.mkProperty "theme" value - static member inline defaultLanguage(value: string) = Helper.mkProperty "defaultLanguage" value + + static member inline defaultLanguage(value: string) = + Helper.mkProperty "defaultLanguage" value + static member inline value(value: string) = Helper.mkProperty "value" value static member inline options(value: obj) = Helper.mkProperty "options" value @@ -115,7 +123,7 @@ type MonacoEditor = Helper.mkProperty "onMount" f static member inline editor(properties: IReactProperty list) = - ReactLegacy.createElement(unbox(import "Editor" "@monaco-editor/react"), createObj !!properties) + ReactLegacy.createElement (unbox (import "Editor" "@monaco-editor/react"), createObj !!properties) module WebWorker = let create () = Worker.Create(Constants.worker) @@ -241,7 +249,7 @@ let update msg model = | SetFSharpCode code -> let debouncerModel, debouncerCmd = model.Debouncer - |> Debouncer.bounce (TimeSpan.FromSeconds 1L) "user_input" ParseCode + |> Debouncer.bounce (TimeSpan.FromSeconds 1L) "user_input" ParseCode { model with @@ -256,7 +264,7 @@ let update msg model = let cmd = Cmd.ofEffect (fun _ -> setModelMarkers model.Editor model.Markers) model, cmd | AddConsoleLog(level, output) -> - let logs = model.Logs @ [(output, level)] + let logs = model.Logs @ [ (output, level) ] { model with Logs = logs }, Cmd.none | Compiled(_, _, _, _) when model.CompilingRevision <> Some model.CodeRevision -> model, Cmd.none | Compiled(code, _, errors, _) -> @@ -281,7 +289,10 @@ let update msg model = model, Cmd.batch [ errors |> Editor.mapErrorToMarker |> SetMarkers |> Cmd.ofMsg - if errors.Length = 0 then Cmd.OfFunc.perform Iframe.generateHtmlBlobUrl code SetIFrameUrl else Cmd.none + if errors.Length = 0 then + Cmd.OfFunc.perform Iframe.generateHtmlBlobUrl code SetIFrameUrl + else + Cmd.none ] | FetchedTableOfContents tableOfContents -> let url = Router.currentUrl () @@ -297,7 +308,12 @@ let update msg model = Cmd.ofMsg CalculateMarkdownAndCodeValues Cmd.ofMsg CalculateDocEntryNavigation ] - | FetchTableOfContentsExn _ -> { model with IsLoadingDocumentation = false }, Cmd.none + | FetchTableOfContentsExn _ -> + { + model with + IsLoadingDocumentation = false + }, + Cmd.none | SetUrl url -> let currentPage = getCurrentPage model.TableOfContents url @@ -359,8 +375,9 @@ module TourView = match model.Theme with | Light -> "light" | Dark -> "dark" - - prop.className $"tour-app {themeClassName}" + + prop.className $"tour-app {themeClassName}" + prop.children [ Html.a [ prop.href "#main-content" @@ -398,15 +415,12 @@ module TourView = prop.ariaLabel "View source on GitHub" prop.title "View source on GitHub" prop.children [ - Html.i [ - prop.className "fa-brands fa-github" - prop.ariaHidden true - ] + Html.i [ prop.className "fa-brands fa-github"; prop.ariaHidden true ] ] ] Html.button [ let label = - match model.Theme with + match model.Theme with | Light -> "Switch to dark mode" | Dark -> "Switch to light mode" @@ -415,6 +429,7 @@ module TourView = prop.ariaPressed (model.Theme = Dark) prop.ariaLabel label prop.title label + prop.children [ Html.i [ prop.className ( @@ -451,38 +466,42 @@ module TourView = Markdown.markdown [ markdown.children model.Markdown markdown.components [ - markdown.components.code (fun props -> - if props.isInline then - Html.code props.children - else - let syntaxStyle = - match model.Theme with - | Light -> - import "vs" "react-syntax-highlighter/dist/esm/styles/prism" - | Dark -> - import "vscDarkPlus" "react-syntax-highlighter/dist/esm/styles/prism" - - let language = props.className.Replace("language-", "") - - SyntaxHighlighter.highlighter [ - SyntaxHighlighter.className "markdown-code-block" - SyntaxHighlighter.language language - SyntaxHighlighter.style syntaxStyle - SyntaxHighlighter.customStyle ( - createObj [ - "border" ==> - match model.Theme with - | Light -> "1px solid #b9d8e9" - | Dark -> "1px solid #41647d" - "background" ==> - match model.Theme with - | Light -> "#f5f9fc" - | Dark -> "#111827" - "borderRadius" ==> "0" - ] - ) - SyntaxHighlighter.children props.children - ]) + markdown.components.code (fun props -> + if props.isInline then + Html.code props.children + else + let syntaxStyle = + match model.Theme with + | Light -> + import + "vs" + "react-syntax-highlighter/dist/esm/styles/prism" + | Dark -> + import + "vscDarkPlus" + "react-syntax-highlighter/dist/esm/styles/prism" + + let language = props.className.Replace("language-", "") + + SyntaxHighlighter.highlighter [ + SyntaxHighlighter.className "markdown-code-block" + SyntaxHighlighter.language language + SyntaxHighlighter.style syntaxStyle + SyntaxHighlighter.customStyle ( + createObj [ + "border" + ==> match model.Theme with + | Light -> "1px solid #b9d8e9" + | Dark -> "1px solid #41647d" + "background" + ==> match model.Theme with + | Light -> "#f5f9fc" + | Dark -> "#111827" + "borderRadius" ==> "0" + ] + ) + SyntaxHighlighter.children props.children + ]) ] ] ] @@ -505,7 +524,8 @@ module TourView = createObj [ "fontSize" ==> 16 "lineHeight" ==> 27 - "fontFamily" ==> "ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace" + "fontFamily" + ==> "ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace" "fontLigatures" ==> false "automaticLayout" ==> true "minimap" ==> createObj [ "enabled" ==> false ] @@ -516,7 +536,9 @@ module TourView = ) MonacoEditor.onChange (SetFSharpCode >> dispatch) MonacoEditor.onMount ( - Editor.onFSharpEditorDidMount model.Worker (SetEditor >> dispatch) + Editor.onFSharpEditorDidMount + model.Worker + (SetEditor >> dispatch) ) ] ] diff --git a/src/App/Editor.fs b/src/App/Editor.fs index 6d0e59d..07fb899 100644 --- a/src/App/Editor.fs +++ b/src/App/Editor.fs @@ -174,10 +174,8 @@ let createCompletionProvider getCompletions = |> Some member this.resolveCompletionItem - ( - item: Monaco.Languages.CompletionItem, - token: Monaco.CancellationToken - ) : Monaco.Languages.ProviderResult = + (item: Monaco.Languages.CompletionItem, token: Monaco.CancellationToken) + : Monaco.Languages.ProviderResult = item |> U2.Case1 |> Some member this.triggerCharacters @@ -188,11 +186,11 @@ let createCompletionProvider getCompletions = let createDefinitionProvider getDeclarationLocation = { new Monaco.Languages.DefinitionProvider with member this.provideDefinition - ( - model: Monaco.Editor.ITextModel, - position: Monaco.Position, - token: Monaco.CancellationToken - ) : Monaco.Languages.ProviderResult>> = + (model: Monaco.Editor.ITextModel, position: Monaco.Position, token: Monaco.CancellationToken) + : Monaco.Languages.ProviderResult< + U2> + > + = async { let lineText = model.getLineContent (position.lineNumber) let! loc = getDeclarationLocation position.lineNumber position.column lineText diff --git a/src/App/Libs/Monaco.fs b/src/App/Libs/Monaco.fs index d179f99..74962aa 100644 --- a/src/App/Libs/Monaco.fs +++ b/src/App/Libs/Monaco.fs @@ -15,9 +15,7 @@ type ReadonlyArray<'T> = System.Collections.Generic.IReadOnlyList<'T> type RegExp = System.Text.RegularExpressions.Regex [] -type Record<'k, 't> = - interface - end +type Record<'k, 't> = interface end [] let MonacoEnvironment: Monaco.Environment option = jsNative @@ -499,9 +497,7 @@ module Monaco = | MAX_VALUE = 132 [] - type KeyMod = - interface - end + type KeyMod = interface end [] type KeyModStatic = @@ -1248,9 +1244,7 @@ module Monaco = abstract reset: unit -> unit abstract get: unit -> 'T option - type ContextKeyValue = - interface - end + type ContextKeyValue = interface end [] type IEditorOverrideServices = @@ -2275,9 +2269,7 @@ module Monaco = /// An event describing that the language configuration associated with a model has changed. [] - type IModelLanguageConfigurationChangedEvent = - interface - end + type IModelLanguageConfigurationChangedEvent = interface end [] type IModelContentChange = @@ -3656,17 +3648,11 @@ module Monaco = type EditorOptionsType = obj - type FindEditorOptionsKeyById<'T> = - interface - end + type FindEditorOptionsKeyById<'T> = interface end - type ComputedEditorOptionValue<'T when 'T :> IEditorOption> = - interface - end + type ComputedEditorOptionValue<'T when 'T :> IEditorOption> = interface end - type FindComputedEditorOptionValueById<'T> = - interface - end + type FindComputedEditorOptionValueById<'T> = interface end [] type IEditorConstructionOptions = @@ -4505,9 +4491,7 @@ module Monaco = | Trailing [] - type IExportsEditorOptionsRulersIEditorOption = - interface - end + type IExportsEditorOptionsRulersIEditorOption = interface end [] [] @@ -6219,9 +6203,7 @@ module Monaco = ProviderResult>> [] - type FoldingContext = - interface - end + type FoldingContext = interface end /// A provider of folding ranges for editor models. [] @@ -6546,7 +6528,11 @@ module Monaco = abstract log: string option with get, set type IMonarchLanguageAction = - U3>> + U3< + IShortMonarchLanguageAction, + IExpandedMonarchLanguageAction, + ResizeArray> + > /// This interface can be shortened as an array, ie. ['{','}','delimiter.curly'] [] @@ -6764,9 +6750,7 @@ module Monaco = abstract Item: providerId: string -> CSSDataV1 with get, set [] - type CSSDataV1Version = - interface - end + type CSSDataV1Version = interface end module Html = @@ -6932,9 +6916,7 @@ module Monaco = abstract Item: providerId: string -> HTMLDataV1 with get, set [] - type HTMLDataV1Version = - interface - end + type HTMLDataV1Version = interface end module Json = @@ -6957,11 +6939,13 @@ module Monaco = /// A list of known schemas and/or associations of schemas to file names. abstract schemas: - ResizeArray<{| - uri: string - fileMatch: ResizeArray option - schema: obj option - |}> option + ResizeArray< + {| + uri: string + fileMatch: ResizeArray option + schema: obj option + |} + > option /// If set, the schema service would load schema content on-demand with 'fetch' if available abstract enableSchemaRequest: bool option @@ -7072,7 +7056,14 @@ module Monaco = abstract Item: index: string -> 'T with get, set type CompilerOptionsValue = - U6>, ResizeArray, MapLike>> option + U6< + string, + float, + bool, + ResizeArray>, + ResizeArray, + MapLike> + > option [] type CompilerOptions = @@ -7298,10 +7289,12 @@ module Monaco = /// An array of entries to register. abstract setExtraLibs: libs: - ResizeArray<{| - content: string - filePath: string option - |}> -> + ResizeArray< + {| + content: string + filePath: string option + |} + > -> unit /// Get current TypeScript compiler options for the language service. @@ -7445,9 +7438,7 @@ module Monaco = | N3 = 3 [] - type DiagnosticReportsUnnecessary = - interface - end + type DiagnosticReportsUnnecessary = interface end [] type IMonarchLanguageTokenizer =