From fb12ca8902509914910e8a39c4e525bee5e3fd46 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Wed, 13 Apr 2022 17:07:15 +0300 Subject: [PATCH 01/41] Delete kotlin-js-store directory --- kotlin-js-store/yarn.lock | 9201 ------------------------------------- 1 file changed, 9201 deletions(-) delete mode 100644 kotlin-js-store/yarn.lock diff --git a/kotlin-js-store/yarn.lock b/kotlin-js-store/yarn.lock deleted file mode 100644 index df058368..00000000 --- a/kotlin-js-store/yarn.lock +++ /dev/null @@ -1,9201 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"3d-view@^2.0.0": - version "2.0.1" - resolved "https://registry.yarnpkg.com/3d-view/-/3d-view-2.0.1.tgz#2e174571c48215736b376bb66938a3513dad2179" - integrity sha512-YSLRHXNpSziaaiK2R0pI5+JKguoJVbtWmIv9YyBFtl0+q42kQwJB/JUulbFR/1zYFm58ifjKQ6kVdgZ6tyKtCA== - dependencies: - matrix-camera-controller "^2.1.1" - orbit-camera-controller "^4.0.0" - turntable-camera-controller "^3.0.0" - -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.16.0.tgz#0dfc80309beec8411e65e706461c408b0bb9b431" - integrity sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA== - dependencies: - "@babel/highlight" "^7.16.0" - -"@babel/compat-data@^7.13.11", "@babel/compat-data@^7.16.0", "@babel/compat-data@^7.16.4": - version "7.16.4" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.16.4.tgz#081d6bbc336ec5c2435c6346b2ae1fb98b5ac68e" - integrity sha512-1o/jo7D+kC9ZjHX5v+EHrdjl3PhxMrLSOTGsOdHJ+KL8HCaEK6ehrVL2RS6oHDZp+L7xLirLrPmQtEng769J/Q== - -"@babel/core@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.16.0.tgz#c4ff44046f5fe310525cc9eb4ef5147f0c5374d4" - integrity sha512-mYZEvshBRHGsIAiyH5PzCFTCfbWfoYbO/jcSdXQSUQu1/pW0xDZAUP7KEc32heqWTAfAHhV9j1vH8Sav7l+JNQ== - dependencies: - "@babel/code-frame" "^7.16.0" - "@babel/generator" "^7.16.0" - "@babel/helper-compilation-targets" "^7.16.0" - "@babel/helper-module-transforms" "^7.16.0" - "@babel/helpers" "^7.16.0" - "@babel/parser" "^7.16.0" - "@babel/template" "^7.16.0" - "@babel/traverse" "^7.16.0" - "@babel/types" "^7.16.0" - convert-source-map "^1.7.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.1.2" - semver "^6.3.0" - source-map "^0.5.0" - -"@babel/generator@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.16.0.tgz#d40f3d1d5075e62d3500bccb67f3daa8a95265b2" - integrity sha512-RR8hUCfRQn9j9RPKEVXo9LiwoxLPYn6hNZlvUOR8tSnaxlD0p0+la00ZP9/SnRt6HchKr+X0fO2r8vrETiJGew== - dependencies: - "@babel/types" "^7.16.0" - jsesc "^2.5.1" - source-map "^0.5.0" - -"@babel/helper-annotate-as-pure@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.0.tgz#9a1f0ebcda53d9a2d00108c4ceace6a5d5f1f08d" - integrity sha512-ItmYF9vR4zA8cByDocY05o0LGUkp1zhbTQOH1NFyl5xXEqlTJQCEJjieriw+aFpxo16swMxUnUiKS7a/r4vtHg== - dependencies: - "@babel/types" "^7.16.0" - -"@babel/helper-builder-binary-assignment-operator-visitor@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.0.tgz#f1a686b92da794020c26582eb852e9accd0d7882" - integrity sha512-9KuleLT0e77wFUku6TUkqZzCEymBdtuQQ27MhEKzf9UOOJu3cYj98kyaDAzxpC7lV6DGiZFuC8XqDsq8/Kl6aQ== - dependencies: - "@babel/helper-explode-assignable-expression" "^7.16.0" - "@babel/types" "^7.16.0" - -"@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.16.0", "@babel/helper-compilation-targets@^7.16.3": - version "7.16.3" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.3.tgz#5b480cd13f68363df6ec4dc8ac8e2da11363cbf0" - integrity sha512-vKsoSQAyBmxS35JUOOt+07cLc6Nk/2ljLIHwmq2/NM6hdioUaqEXq/S+nXvbvXbZkNDlWOymPanJGOc4CBjSJA== - dependencies: - "@babel/compat-data" "^7.16.0" - "@babel/helper-validator-option" "^7.14.5" - browserslist "^4.17.5" - semver "^6.3.0" - -"@babel/helper-create-class-features-plugin@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.16.0.tgz#090d4d166b342a03a9fec37ef4fd5aeb9c7c6a4b" - integrity sha512-XLwWvqEaq19zFlF5PTgOod4bUA+XbkR4WLQBct1bkzmxJGB0ZEJaoKF4c8cgH9oBtCDuYJ8BP5NB9uFiEgO5QA== - dependencies: - "@babel/helper-annotate-as-pure" "^7.16.0" - "@babel/helper-function-name" "^7.16.0" - "@babel/helper-member-expression-to-functions" "^7.16.0" - "@babel/helper-optimise-call-expression" "^7.16.0" - "@babel/helper-replace-supers" "^7.16.0" - "@babel/helper-split-export-declaration" "^7.16.0" - -"@babel/helper-create-regexp-features-plugin@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.16.0.tgz#06b2348ce37fccc4f5e18dcd8d75053f2a7c44ff" - integrity sha512-3DyG0zAFAZKcOp7aVr33ddwkxJ0Z0Jr5V99y3I690eYLpukJsJvAbzTy1ewoCqsML8SbIrjH14Jc/nSQ4TvNPA== - dependencies: - "@babel/helper-annotate-as-pure" "^7.16.0" - regexpu-core "^4.7.1" - -"@babel/helper-define-polyfill-provider@^0.3.0": - version "0.3.0" - resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.0.tgz#c5b10cf4b324ff840140bb07e05b8564af2ae971" - integrity sha512-7hfT8lUljl/tM3h+izTX/pO3W3frz2ok6Pk+gzys8iJqDfZrZy2pXjRTZAvG2YmfHun1X4q8/UZRLatMfqc5Tg== - dependencies: - "@babel/helper-compilation-targets" "^7.13.0" - "@babel/helper-module-imports" "^7.12.13" - "@babel/helper-plugin-utils" "^7.13.0" - "@babel/traverse" "^7.13.0" - debug "^4.1.1" - lodash.debounce "^4.0.8" - resolve "^1.14.2" - semver "^6.1.2" - -"@babel/helper-explode-assignable-expression@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.0.tgz#753017337a15f46f9c09f674cff10cee9b9d7778" - integrity sha512-Hk2SLxC9ZbcOhLpg/yMznzJ11W++lg5GMbxt1ev6TXUiJB0N42KPC+7w8a+eWGuqDnUYuwStJoZHM7RgmIOaGQ== - dependencies: - "@babel/types" "^7.16.0" - -"@babel/helper-function-name@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.16.0.tgz#b7dd0797d00bbfee4f07e9c4ea5b0e30c8bb1481" - integrity sha512-BZh4mEk1xi2h4HFjWUXRQX5AEx4rvaZxHgax9gcjdLWdkjsY7MKt5p0otjsg5noXw+pB+clMCjw+aEVYADMjog== - dependencies: - "@babel/helper-get-function-arity" "^7.16.0" - "@babel/template" "^7.16.0" - "@babel/types" "^7.16.0" - -"@babel/helper-get-function-arity@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.0.tgz#0088c7486b29a9cb5d948b1a1de46db66e089cfa" - integrity sha512-ASCquNcywC1NkYh/z7Cgp3w31YW8aojjYIlNg4VeJiHkqyP4AzIvr4qx7pYDb4/s8YcsZWqqOSxgkvjUz1kpDQ== - dependencies: - "@babel/types" "^7.16.0" - -"@babel/helper-hoist-variables@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.0.tgz#4c9023c2f1def7e28ff46fc1dbcd36a39beaa81a" - integrity sha512-1AZlpazjUR0EQZQv3sgRNfM9mEVWPK3M6vlalczA+EECcPz3XPh6VplbErL5UoMpChhSck5wAJHthlj1bYpcmg== - dependencies: - "@babel/types" "^7.16.0" - -"@babel/helper-member-expression-to-functions@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.0.tgz#29287040efd197c77636ef75188e81da8bccd5a4" - integrity sha512-bsjlBFPuWT6IWhl28EdrQ+gTvSvj5tqVP5Xeftp07SEuz5pLnsXZuDkDD3Rfcxy0IsHmbZ+7B2/9SHzxO0T+sQ== - dependencies: - "@babel/types" "^7.16.0" - -"@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.16.0.tgz#90538e60b672ecf1b448f5f4f5433d37e79a3ec3" - integrity sha512-kkH7sWzKPq0xt3H1n+ghb4xEMP8k0U7XV3kkB+ZGy69kDk2ySFW1qPi06sjKzFY3t1j6XbJSqr4mF9L7CYVyhg== - dependencies: - "@babel/types" "^7.16.0" - -"@babel/helper-module-transforms@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.16.0.tgz#1c82a8dd4cb34577502ebd2909699b194c3e9bb5" - integrity sha512-My4cr9ATcaBbmaEa8M0dZNA74cfI6gitvUAskgDtAFmAqyFKDSHQo5YstxPbN+lzHl2D9l/YOEFqb2mtUh4gfA== - dependencies: - "@babel/helper-module-imports" "^7.16.0" - "@babel/helper-replace-supers" "^7.16.0" - "@babel/helper-simple-access" "^7.16.0" - "@babel/helper-split-export-declaration" "^7.16.0" - "@babel/helper-validator-identifier" "^7.15.7" - "@babel/template" "^7.16.0" - "@babel/traverse" "^7.16.0" - "@babel/types" "^7.16.0" - -"@babel/helper-optimise-call-expression@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.0.tgz#cecdb145d70c54096b1564f8e9f10cd7d193b338" - integrity sha512-SuI467Gi2V8fkofm2JPnZzB/SUuXoJA5zXe/xzyPP2M04686RzFKFHPK6HDVN6JvWBIEW8tt9hPR7fXdn2Lgpw== - dependencies: - "@babel/types" "^7.16.0" - -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.13.0", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz#5ac822ce97eec46741ab70a517971e443a70c5a9" - integrity sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ== - -"@babel/helper-remap-async-to-generator@^7.16.0", "@babel/helper-remap-async-to-generator@^7.16.4": - version "7.16.4" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.4.tgz#5d7902f61349ff6b963e07f06a389ce139fbfe6e" - integrity sha512-vGERmmhR+s7eH5Y/cp8PCVzj4XEjerq8jooMfxFdA5xVtAk9Sh4AQsrWgiErUEBjtGrBtOFKDUcWQFW4/dFwMA== - dependencies: - "@babel/helper-annotate-as-pure" "^7.16.0" - "@babel/helper-wrap-function" "^7.16.0" - "@babel/types" "^7.16.0" - -"@babel/helper-replace-supers@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.16.0.tgz#73055e8d3cf9bcba8ddb55cad93fedc860f68f17" - integrity sha512-TQxuQfSCdoha7cpRNJvfaYxxxzmbxXw/+6cS7V02eeDYyhxderSoMVALvwupA54/pZcOTtVeJ0xccp1nGWladA== - dependencies: - "@babel/helper-member-expression-to-functions" "^7.16.0" - "@babel/helper-optimise-call-expression" "^7.16.0" - "@babel/traverse" "^7.16.0" - "@babel/types" "^7.16.0" - -"@babel/helper-simple-access@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.16.0.tgz#21d6a27620e383e37534cf6c10bba019a6f90517" - integrity sha512-o1rjBT/gppAqKsYfUdfHq5Rk03lMQrkPHG1OWzHWpLgVXRH4HnMM9Et9CVdIqwkCQlobnGHEJMsgWP/jE1zUiw== - dependencies: - "@babel/types" "^7.16.0" - -"@babel/helper-skip-transparent-expression-wrappers@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz#0ee3388070147c3ae051e487eca3ebb0e2e8bb09" - integrity sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw== - dependencies: - "@babel/types" "^7.16.0" - -"@babel/helper-split-export-declaration@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.0.tgz#29672f43663e936df370aaeb22beddb3baec7438" - integrity sha512-0YMMRpuDFNGTHNRiiqJX19GjNXA4H0E8jZ2ibccfSxaCogbm3am5WN/2nQNj0YnQwGWM1J06GOcQ2qnh3+0paw== - dependencies: - "@babel/types" "^7.16.0" - -"@babel/helper-validator-identifier@^7.15.7": - version "7.15.7" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz#220df993bfe904a4a6b02ab4f3385a5ebf6e2389" - integrity sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w== - -"@babel/helper-validator-option@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz#6e72a1fff18d5dfcb878e1e62f1a021c4b72d5a3" - integrity sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow== - -"@babel/helper-wrap-function@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.16.0.tgz#b3cf318afce774dfe75b86767cd6d68f3482e57c" - integrity sha512-VVMGzYY3vkWgCJML+qVLvGIam902mJW0FvT7Avj1zEe0Gn7D93aWdLblYARTxEw+6DhZmtzhBM2zv0ekE5zg1g== - dependencies: - "@babel/helper-function-name" "^7.16.0" - "@babel/template" "^7.16.0" - "@babel/traverse" "^7.16.0" - "@babel/types" "^7.16.0" - -"@babel/helpers@^7.16.0": - version "7.16.3" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.16.3.tgz#27fc64f40b996e7074dc73128c3e5c3e7f55c43c" - integrity sha512-Xn8IhDlBPhvYTvgewPKawhADichOsbkZuzN7qz2BusOM0brChsyXMDJvldWaYMMUNiCQdQzNEioXTp3sC8Nt8w== - dependencies: - "@babel/template" "^7.16.0" - "@babel/traverse" "^7.16.3" - "@babel/types" "^7.16.0" - -"@babel/highlight@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.16.0.tgz#6ceb32b2ca4b8f5f361fb7fd821e3fddf4a1725a" - integrity sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g== - dependencies: - "@babel/helper-validator-identifier" "^7.15.7" - chalk "^2.0.0" - js-tokens "^4.0.0" - -"@babel/parser@^7.16.0", "@babel/parser@^7.16.3": - version "7.16.4" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.16.4.tgz#d5f92f57cf2c74ffe9b37981c0e72fee7311372e" - integrity sha512-6V0qdPUaiVHH3RtZeLIsc+6pDhbYzHR8ogA8w+f+Wc77DuXto19g2QUwveINoS34Uw+W8/hQDGJCx+i4n7xcng== - -"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.16.2": - version "7.16.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.16.2.tgz#2977fca9b212db153c195674e57cfab807733183" - integrity sha512-h37CvpLSf8gb2lIJ2CgC3t+EjFbi0t8qS7LCS1xcJIlEXE4czlofwaW7W1HA8zpgOCzI9C1nmoqNR1zWkk0pQg== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.16.0.tgz#358972eaab006f5eb0826183b0c93cbcaf13e1e2" - integrity sha512-4tcFwwicpWTrpl9qjf7UsoosaArgImF85AxqCRZlgc3IQDvkUHjJpruXAL58Wmj+T6fypWTC/BakfEkwIL/pwA== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" - "@babel/plugin-proposal-optional-chaining" "^7.16.0" - -"@babel/plugin-proposal-async-generator-functions@^7.16.4": - version "7.16.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.4.tgz#e606eb6015fec6fa5978c940f315eae4e300b081" - integrity sha512-/CUekqaAaZCQHleSK/9HajvcD/zdnJiKRiuUFq8ITE+0HsPzquf53cpFiqAwl/UfmJbR6n5uGPQSPdrmKOvHHg== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-remap-async-to-generator" "^7.16.4" - "@babel/plugin-syntax-async-generators" "^7.8.4" - -"@babel/plugin-proposal-class-properties@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.0.tgz#c029618267ddebc7280fa286e0f8ca2a278a2d1a" - integrity sha512-mCF3HcuZSY9Fcx56Lbn+CGdT44ioBMMvjNVldpKtj8tpniETdLjnxdHI1+sDWXIM1nNt+EanJOZ3IG9lzVjs7A== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.16.0" - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-proposal-class-static-block@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.16.0.tgz#5296942c564d8144c83eea347d0aa8a0b89170e7" - integrity sha512-mAy3sdcY9sKAkf3lQbDiv3olOfiLqI51c9DR9b19uMoR2Z6r5pmGl7dfNFqEvqOyqbf1ta4lknK4gc5PJn3mfA== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.16.0" - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/plugin-syntax-class-static-block" "^7.14.5" - -"@babel/plugin-proposal-dynamic-import@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.0.tgz#783eca61d50526202f9b296095453977e88659f1" - integrity sha512-QGSA6ExWk95jFQgwz5GQ2Dr95cf7eI7TKutIXXTb7B1gCLTCz5hTjFTQGfLFBBiC5WSNi7udNwWsqbbMh1c4yQ== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/plugin-syntax-dynamic-import" "^7.8.3" - -"@babel/plugin-proposal-export-namespace-from@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.16.0.tgz#9c01dee40b9d6b847b656aaf4a3976a71740f222" - integrity sha512-CjI4nxM/D+5wCnhD11MHB1AwRSAYeDT+h8gCdcVJZ/OK7+wRzFsf7PFPWVpVpNRkHMmMkQWAHpTq+15IXQ1diA== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/plugin-syntax-export-namespace-from" "^7.8.3" - -"@babel/plugin-proposal-json-strings@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.16.0.tgz#cae35a95ed1d2a7fa29c4dc41540b84a72e9ab25" - integrity sha512-kouIPuiv8mSi5JkEhzApg5Gn6hFyKPnlkO0a9YSzqRurH8wYzSlf6RJdzluAsbqecdW5pBvDJDfyDIUR/vLxvg== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/plugin-syntax-json-strings" "^7.8.3" - -"@babel/plugin-proposal-logical-assignment-operators@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.0.tgz#a711b8ceb3ffddd3ef88d3a49e86dbd3cc7db3fd" - integrity sha512-pbW0fE30sVTYXXm9lpVQQ/Vc+iTeQKiXlaNRZPPN2A2VdlWyAtsUrsQ3xydSlDW00TFMK7a8m3cDTkBF5WnV3Q== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" - -"@babel/plugin-proposal-nullish-coalescing-operator@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.0.tgz#44e1cce08fe2427482cf446a91bb451528ed0596" - integrity sha512-3bnHA8CAFm7cG93v8loghDYyQ8r97Qydf63BeYiGgYbjKKB/XP53W15wfRC7dvKfoiJ34f6Rbyyx2btExc8XsQ== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - -"@babel/plugin-proposal-numeric-separator@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.0.tgz#5d418e4fbbf8b9b7d03125d3a52730433a373734" - integrity sha512-FAhE2I6mjispy+vwwd6xWPyEx3NYFS13pikDBWUAFGZvq6POGs5eNchw8+1CYoEgBl9n11I3NkzD7ghn25PQ9Q== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/plugin-syntax-numeric-separator" "^7.10.4" - -"@babel/plugin-proposal-object-rest-spread@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.16.0.tgz#5fb32f6d924d6e6712810362a60e12a2609872e6" - integrity sha512-LU/+jp89efe5HuWJLmMmFG0+xbz+I2rSI7iLc1AlaeSMDMOGzWlc5yJrMN1d04osXN4sSfpo4O+azkBNBes0jg== - dependencies: - "@babel/compat-data" "^7.16.0" - "@babel/helper-compilation-targets" "^7.16.0" - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.16.0" - -"@babel/plugin-proposal-optional-catch-binding@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.0.tgz#5910085811ab4c28b00d6ebffa4ab0274d1e5f16" - integrity sha512-kicDo0A/5J0nrsCPbn89mTG3Bm4XgYi0CZtvex9Oyw7gGZE3HXGD0zpQNH+mo+tEfbo8wbmMvJftOwpmPy7aVw== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" - -"@babel/plugin-proposal-optional-chaining@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.0.tgz#56dbc3970825683608e9efb55ea82c2a2d6c8dc0" - integrity sha512-Y4rFpkZODfHrVo70Uaj6cC1JJOt3Pp0MdWSwIKtb8z1/lsjl9AmnB7ErRFV+QNGIfcY1Eruc2UMx5KaRnXjMyg== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" - -"@babel/plugin-proposal-private-methods@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.0.tgz#b4dafb9c717e4301c5776b30d080d6383c89aff6" - integrity sha512-IvHmcTHDFztQGnn6aWq4t12QaBXTKr1whF/dgp9kz84X6GUcwq9utj7z2wFCUfeOup/QKnOlt2k0zxkGFx9ubg== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.16.0" - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-proposal-private-property-in-object@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.16.0.tgz#69e935b2c5c79d2488112d886f0c4e2790fee76f" - integrity sha512-3jQUr/HBbMVZmi72LpjQwlZ55i1queL8KcDTQEkAHihttJnAPrcvG9ZNXIfsd2ugpizZo595egYV6xy+pv4Ofw== - dependencies: - "@babel/helper-annotate-as-pure" "^7.16.0" - "@babel/helper-create-class-features-plugin" "^7.16.0" - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/plugin-syntax-private-property-in-object" "^7.14.5" - -"@babel/plugin-proposal-unicode-property-regex@^7.16.0", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.16.0.tgz#890482dfc5ea378e42e19a71e709728cabf18612" - integrity sha512-ti7IdM54NXv29cA4+bNNKEMS4jLMCbJgl+Drv+FgYy0erJLAxNAIXcNjNjrRZEcWq0xJHsNVwQezskMFpF8N9g== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.16.0" - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-syntax-async-generators@^7.8.4": - version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" - integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-class-properties@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" - integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - -"@babel/plugin-syntax-class-static-block@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz#195df89b146b4b78b3bf897fd7a257c84659d406" - integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-syntax-dynamic-import@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" - integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-export-namespace-from@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz#028964a9ba80dbc094c915c487ad7c4e7a66465a" - integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - -"@babel/plugin-syntax-json-strings@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" - integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-jsx@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.16.0.tgz#f9624394317365a9a88c82358d3f8471154698f1" - integrity sha512-8zv2+xiPHwly31RK4RmnEYY5zziuF3O7W2kIDW+07ewWDh6Oi0dRq8kwvulRkFgt6DB97RlKs5c1y068iPlCUg== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-syntax-logical-assignment-operators@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" - integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" - integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-numeric-separator@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" - integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-object-rest-spread@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" - integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-optional-catch-binding@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" - integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-optional-chaining@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" - integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-private-property-in-object@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz#0dc6671ec0ea22b6e94a1114f857970cd39de1ad" - integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-syntax-top-level-await@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" - integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-syntax-typescript@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.16.0.tgz#2feeb13d9334cc582ea9111d3506f773174179bb" - integrity sha512-Xv6mEXqVdaqCBfJFyeab0fH2DnUoMsDmhamxsSi4j8nLd4Vtw213WMJr55xxqipC/YVWyPY3K0blJncPYji+dQ== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-arrow-functions@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.16.0.tgz#951706f8b449c834ed07bd474c0924c944b95a8e" - integrity sha512-vIFb5250Rbh7roWARvCLvIJ/PtAU5Lhv7BtZ1u24COwpI9Ypjsh+bZcKk6rlIyalK+r0jOc1XQ8I4ovNxNrWrA== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-async-to-generator@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.0.tgz#df12637f9630ddfa0ef9d7a11bc414d629d38604" - integrity sha512-PbIr7G9kR8tdH6g8Wouir5uVjklETk91GMVSUq+VaOgiinbCkBP6Q7NN/suM/QutZkMJMvcyAriogcYAdhg8Gw== - dependencies: - "@babel/helper-module-imports" "^7.16.0" - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-remap-async-to-generator" "^7.16.0" - -"@babel/plugin-transform-block-scoped-functions@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.0.tgz#c618763233ad02847805abcac4c345ce9de7145d" - integrity sha512-V14As3haUOP4ZWrLJ3VVx5rCnrYhMSHN/jX7z6FAt5hjRkLsb0snPCmJwSOML5oxkKO4FNoNv7V5hw/y2bjuvg== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-block-scoping@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.16.0.tgz#bcf433fb482fe8c3d3b4e8a66b1c4a8e77d37c16" - integrity sha512-27n3l67/R3UrXfizlvHGuTwsRIFyce3D/6a37GRxn28iyTPvNXaW4XvznexRh1zUNLPjbLL22Id0XQElV94ruw== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-classes@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.16.0.tgz#54cf5ff0b2242c6573d753cd4bfc7077a8b282f5" - integrity sha512-HUxMvy6GtAdd+GKBNYDWCIA776byUQH8zjnfjxwT1P1ARv/wFu8eBDpmXQcLS/IwRtrxIReGiplOwMeyO7nsDQ== - dependencies: - "@babel/helper-annotate-as-pure" "^7.16.0" - "@babel/helper-function-name" "^7.16.0" - "@babel/helper-optimise-call-expression" "^7.16.0" - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-replace-supers" "^7.16.0" - "@babel/helper-split-export-declaration" "^7.16.0" - globals "^11.1.0" - -"@babel/plugin-transform-computed-properties@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.16.0.tgz#e0c385507d21e1b0b076d66bed6d5231b85110b7" - integrity sha512-63l1dRXday6S8V3WFY5mXJwcRAnPYxvFfTlt67bwV1rTyVTM5zrp0DBBb13Kl7+ehkCVwIZPumPpFP/4u70+Tw== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-destructuring@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.16.0.tgz#ad3d7e74584ad5ea4eadb1e6642146c590dee33c" - integrity sha512-Q7tBUwjxLTsHEoqktemHBMtb3NYwyJPTJdM+wDwb0g8PZ3kQUIzNvwD5lPaqW/p54TXBc/MXZu9Jr7tbUEUM8Q== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-dotall-regex@^7.16.0", "@babel/plugin-transform-dotall-regex@^7.4.4": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.0.tgz#50bab00c1084b6162d0a58a818031cf57798e06f" - integrity sha512-FXlDZfQeLILfJlC6I1qyEwcHK5UpRCFkaoVyA1nk9A1L1Yu583YO4un2KsLBsu3IJb4CUbctZks8tD9xPQubLw== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.16.0" - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-duplicate-keys@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.16.0.tgz#8bc2e21813e3e89e5e5bf3b60aa5fc458575a176" - integrity sha512-LIe2kcHKAZOJDNxujvmp6z3mfN6V9lJxubU4fJIGoQCkKe3Ec2OcbdlYP+vW++4MpxwG0d1wSDOJtQW5kLnkZQ== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-exponentiation-operator@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.0.tgz#a180cd2881e3533cef9d3901e48dad0fbeff4be4" - integrity sha512-OwYEvzFI38hXklsrbNivzpO3fh87skzx8Pnqi4LoSYeav0xHlueSoCJrSgTPfnbyzopo5b3YVAJkFIcUpK2wsw== - dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.16.0" - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-for-of@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.16.0.tgz#f7abaced155260e2461359bbc7c7248aca5e6bd2" - integrity sha512-5QKUw2kO+GVmKr2wMYSATCTTnHyscl6sxFRAY+rvN7h7WB0lcG0o4NoV6ZQU32OZGVsYUsfLGgPQpDFdkfjlJQ== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-function-name@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.0.tgz#02e3699c284c6262236599f751065c5d5f1f400e" - integrity sha512-lBzMle9jcOXtSOXUpc7tvvTpENu/NuekNJVova5lCCWCV9/U1ho2HH2y0p6mBg8fPm/syEAbfaaemYGOHCY3mg== - dependencies: - "@babel/helper-function-name" "^7.16.0" - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-literals@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.16.0.tgz#79711e670ffceb31bd298229d50f3621f7980cac" - integrity sha512-gQDlsSF1iv9RU04clgXqRjrPyyoJMTclFt3K1cjLmTKikc0s/6vE3hlDeEVC71wLTRu72Fq7650kABrdTc2wMQ== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-member-expression-literals@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.0.tgz#5251b4cce01eaf8314403d21aedb269d79f5e64b" - integrity sha512-WRpw5HL4Jhnxw8QARzRvwojp9MIE7Tdk3ez6vRyUk1MwgjJN0aNpRoXainLR5SgxmoXx/vsXGZ6OthP6t/RbUg== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-modules-amd@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.16.0.tgz#09abd41e18dcf4fd479c598c1cef7bd39eb1337e" - integrity sha512-rWFhWbCJ9Wdmzln1NmSCqn7P0RAD+ogXG/bd9Kg5c7PKWkJtkiXmYsMBeXjDlzHpVTJ4I/hnjs45zX4dEv81xw== - dependencies: - "@babel/helper-module-transforms" "^7.16.0" - "@babel/helper-plugin-utils" "^7.14.5" - babel-plugin-dynamic-import-node "^2.3.3" - -"@babel/plugin-transform-modules-commonjs@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.16.0.tgz#add58e638c8ddc4875bd9a9ecb5c594613f6c922" - integrity sha512-Dzi+NWqyEotgzk/sb7kgQPJQf7AJkQBWsVp1N6JWc1lBVo0vkElUnGdr1PzUBmfsCCN5OOFya3RtpeHk15oLKQ== - dependencies: - "@babel/helper-module-transforms" "^7.16.0" - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-simple-access" "^7.16.0" - babel-plugin-dynamic-import-node "^2.3.3" - -"@babel/plugin-transform-modules-systemjs@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.16.0.tgz#a92cf240afeb605f4ca16670453024425e421ea4" - integrity sha512-yuGBaHS3lF1m/5R+6fjIke64ii5luRUg97N2wr+z1sF0V+sNSXPxXDdEEL/iYLszsN5VKxVB1IPfEqhzVpiqvg== - dependencies: - "@babel/helper-hoist-variables" "^7.16.0" - "@babel/helper-module-transforms" "^7.16.0" - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-validator-identifier" "^7.15.7" - babel-plugin-dynamic-import-node "^2.3.3" - -"@babel/plugin-transform-modules-umd@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.16.0.tgz#195f26c2ad6d6a391b70880effce18ce625e06a7" - integrity sha512-nx4f6no57himWiHhxDM5pjwhae5vLpTK2zCnDH8+wNLJy0TVER/LJRHl2bkt6w9Aad2sPD5iNNoUpY3X9sTGDg== - dependencies: - "@babel/helper-module-transforms" "^7.16.0" - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-named-capturing-groups-regex@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.16.0.tgz#d3db61cc5d5b97986559967cd5ea83e5c32096ca" - integrity sha512-LogN88uO+7EhxWc8WZuQ8vxdSyVGxhkh8WTC3tzlT8LccMuQdA81e9SGV6zY7kY2LjDhhDOFdQVxdGwPyBCnvg== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.16.0" - -"@babel/plugin-transform-new-target@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.16.0.tgz#af823ab576f752215a49937779a41ca65825ab35" - integrity sha512-fhjrDEYv2DBsGN/P6rlqakwRwIp7rBGLPbrKxwh7oVt5NNkIhZVOY2GRV+ULLsQri1bDqwDWnU3vhlmx5B2aCw== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-object-super@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.0.tgz#fb20d5806dc6491a06296ac14ea8e8d6fedda72b" - integrity sha512-fds+puedQHn4cPLshoHcR1DTMN0q1V9ou0mUjm8whx9pGcNvDrVVrgw+KJzzCaiTdaYhldtrUps8DWVMgrSEyg== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-replace-supers" "^7.16.0" - -"@babel/plugin-transform-parameters@^7.16.0", "@babel/plugin-transform-parameters@^7.16.3": - version "7.16.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.3.tgz#fa9e4c874ee5223f891ee6fa8d737f4766d31d15" - integrity sha512-3MaDpJrOXT1MZ/WCmkOFo7EtmVVC8H4EUZVrHvFOsmwkk4lOjQj8rzv8JKUZV4YoQKeoIgk07GO+acPU9IMu/w== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-property-literals@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.0.tgz#a95c552189a96a00059f6776dc4e00e3690c78d1" - integrity sha512-XLldD4V8+pOqX2hwfWhgwXzGdnDOThxaNTgqagOcpBgIxbUvpgU2FMvo5E1RyHbk756WYgdbS0T8y0Cj9FKkWQ== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-react-display-name@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.16.0.tgz#9a0ad8aa8e8790883a7bd2736f66229a58125676" - integrity sha512-FJFdJAqaCpndL+pIf0aeD/qlQwT7QXOvR6Cc8JPvNhKJBi2zc/DPc4g05Y3fbD/0iWAMQFGij4+Xw+4L/BMpTg== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-react-jsx-development@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.16.0.tgz#1cb52874678d23ab11d0d16488d54730807303ef" - integrity sha512-qq65iSqBRq0Hr3wq57YG2AmW0H6wgTnIzpffTphrUWUgLCOK+zf1f7G0vuOiXrp7dU1qq+fQBoqZ3wCDAkhFzw== - dependencies: - "@babel/plugin-transform-react-jsx" "^7.16.0" - -"@babel/plugin-transform-react-jsx@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.16.0.tgz#55b797d4960c3de04e07ad1c0476e2bc6a4889f1" - integrity sha512-rqDgIbukZ44pqq7NIRPGPGNklshPkvlmvqjdx3OZcGPk4zGIenYkxDTvl3LsSL8gqcc3ZzGmXPE6hR/u/voNOw== - dependencies: - "@babel/helper-annotate-as-pure" "^7.16.0" - "@babel/helper-module-imports" "^7.16.0" - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/plugin-syntax-jsx" "^7.16.0" - "@babel/types" "^7.16.0" - -"@babel/plugin-transform-react-pure-annotations@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.16.0.tgz#23db6ddf558d8abde41b8ad9d59f48ad5532ccab" - integrity sha512-NC/Bj2MG+t8Ef5Pdpo34Ay74X4Rt804h5y81PwOpfPtmAK3i6CizmQqwyBQzIepz1Yt8wNr2Z2L7Lu3qBMfZMA== - dependencies: - "@babel/helper-annotate-as-pure" "^7.16.0" - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-regenerator@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.16.0.tgz#eaee422c84b0232d03aea7db99c97deeaf6125a4" - integrity sha512-JAvGxgKuwS2PihiSFaDrp94XOzzTUeDeOQlcKzVAyaPap7BnZXK/lvMDiubkPTdotPKOIZq9xWXWnggUMYiExg== - dependencies: - regenerator-transform "^0.14.2" - -"@babel/plugin-transform-reserved-words@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.16.0.tgz#fff4b9dcb19e12619394bda172d14f2d04c0379c" - integrity sha512-Dgs8NNCehHSvXdhEhln8u/TtJxfVwGYCgP2OOr5Z3Ar+B+zXicEOKNTyc+eca2cuEOMtjW6m9P9ijOt8QdqWkg== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-runtime@^7.14.3": - version "7.16.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.16.4.tgz#f9ba3c7034d429c581e1bd41b4952f3db3c2c7e8" - integrity sha512-pru6+yHANMTukMtEZGC4fs7XPwg35v8sj5CIEmE+gEkFljFiVJxEWxx/7ZDkTK+iZRYo1bFXBtfIN95+K3cJ5A== - dependencies: - "@babel/helper-module-imports" "^7.16.0" - "@babel/helper-plugin-utils" "^7.14.5" - babel-plugin-polyfill-corejs2 "^0.3.0" - babel-plugin-polyfill-corejs3 "^0.4.0" - babel-plugin-polyfill-regenerator "^0.3.0" - semver "^6.3.0" - -"@babel/plugin-transform-shorthand-properties@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.0.tgz#090372e3141f7cc324ed70b3daf5379df2fa384d" - integrity sha512-iVb1mTcD8fuhSv3k99+5tlXu5N0v8/DPm2mO3WACLG6al1CGZH7v09HJyUb1TtYl/Z+KrM6pHSIJdZxP5A+xow== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-spread@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.16.0.tgz#d21ca099bbd53ab307a8621e019a7bd0f40cdcfb" - integrity sha512-Ao4MSYRaLAQczZVp9/7E7QHsCuK92yHRrmVNRe/SlEJjhzivq0BSn8mEraimL8wizHZ3fuaHxKH0iwzI13GyGg== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" - -"@babel/plugin-transform-sticky-regex@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.0.tgz#c35ea31a02d86be485f6aa510184b677a91738fd" - integrity sha512-/ntT2NljR9foobKk4E/YyOSwcGUXtYWv5tinMK/3RkypyNBNdhHUaq6Orw5DWq9ZcNlS03BIlEALFeQgeVAo4Q== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-strict-mode@^7.12.13": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-strict-mode/-/plugin-transform-strict-mode-7.16.0.tgz#2be5ad4f087c188cfed6f01e327a9ccd4dc0c488" - integrity sha512-lcLX2TEX4EI5fRQDV7dIWNJdLnyhVE7K5oHZkKpo/lnOP+7LdkrV9v/enjBxts+xLn56TGf6zbyB2rvYl1zbYQ== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-template-literals@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.16.0.tgz#a8eced3a8e7b8e2d40ec4ec4548a45912630d302" - integrity sha512-Rd4Ic89hA/f7xUSJQk5PnC+4so50vBoBfxjdQAdvngwidM8jYIBVxBZ/sARxD4e0yMXRbJVDrYf7dyRtIIKT6Q== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-typeof-symbol@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.16.0.tgz#8b19a244c6f8c9d668dca6a6f754ad6ead1128f2" - integrity sha512-++V2L8Bdf4vcaHi2raILnptTBjGEFxn5315YU+e8+EqXIucA+q349qWngCLpUYqqv233suJ6NOienIVUpS9cqg== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-typescript@^7.16.0": - version "7.16.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.16.1.tgz#cc0670b2822b0338355bc1b3d2246a42b8166409" - integrity sha512-NO4XoryBng06jjw/qWEU2LhcLJr1tWkhpMam/H4eas/CDKMX/b2/Ylb6EI256Y7+FVPCawwSM1rrJNOpDiz+Lg== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.16.0" - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/plugin-syntax-typescript" "^7.16.0" - -"@babel/plugin-transform-unicode-escapes@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.0.tgz#1a354064b4c45663a32334f46fa0cf6100b5b1f3" - integrity sha512-VFi4dhgJM7Bpk8lRc5CMaRGlKZ29W9C3geZjt9beuzSUrlJxsNwX7ReLwaL6WEvsOf2EQkyIJEPtF8EXjB/g2A== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-unicode-regex@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.0.tgz#293b80950177c8c85aede87cef280259fb995402" - integrity sha512-jHLK4LxhHjvCeZDWyA9c+P9XH1sOxRd1RO9xMtDVRAOND/PczPqizEtVdx4TQF/wyPaewqpT+tgQFYMnN/P94A== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.16.0" - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/preset-env@^7.14.4": - version "7.16.4" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.16.4.tgz#4f6ec33b2a3fe72d6bfdcdf3859500232563a2e3" - integrity sha512-v0QtNd81v/xKj4gNKeuAerQ/azeNn/G1B1qMLeXOcV8+4TWlD2j3NV1u8q29SDFBXx/NBq5kyEAO+0mpRgacjA== - dependencies: - "@babel/compat-data" "^7.16.4" - "@babel/helper-compilation-targets" "^7.16.3" - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-validator-option" "^7.14.5" - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.16.2" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.16.0" - "@babel/plugin-proposal-async-generator-functions" "^7.16.4" - "@babel/plugin-proposal-class-properties" "^7.16.0" - "@babel/plugin-proposal-class-static-block" "^7.16.0" - "@babel/plugin-proposal-dynamic-import" "^7.16.0" - "@babel/plugin-proposal-export-namespace-from" "^7.16.0" - "@babel/plugin-proposal-json-strings" "^7.16.0" - "@babel/plugin-proposal-logical-assignment-operators" "^7.16.0" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.16.0" - "@babel/plugin-proposal-numeric-separator" "^7.16.0" - "@babel/plugin-proposal-object-rest-spread" "^7.16.0" - "@babel/plugin-proposal-optional-catch-binding" "^7.16.0" - "@babel/plugin-proposal-optional-chaining" "^7.16.0" - "@babel/plugin-proposal-private-methods" "^7.16.0" - "@babel/plugin-proposal-private-property-in-object" "^7.16.0" - "@babel/plugin-proposal-unicode-property-regex" "^7.16.0" - "@babel/plugin-syntax-async-generators" "^7.8.4" - "@babel/plugin-syntax-class-properties" "^7.12.13" - "@babel/plugin-syntax-class-static-block" "^7.14.5" - "@babel/plugin-syntax-dynamic-import" "^7.8.3" - "@babel/plugin-syntax-export-namespace-from" "^7.8.3" - "@babel/plugin-syntax-json-strings" "^7.8.3" - "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - "@babel/plugin-syntax-numeric-separator" "^7.10.4" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" - "@babel/plugin-syntax-private-property-in-object" "^7.14.5" - "@babel/plugin-syntax-top-level-await" "^7.14.5" - "@babel/plugin-transform-arrow-functions" "^7.16.0" - "@babel/plugin-transform-async-to-generator" "^7.16.0" - "@babel/plugin-transform-block-scoped-functions" "^7.16.0" - "@babel/plugin-transform-block-scoping" "^7.16.0" - "@babel/plugin-transform-classes" "^7.16.0" - "@babel/plugin-transform-computed-properties" "^7.16.0" - "@babel/plugin-transform-destructuring" "^7.16.0" - "@babel/plugin-transform-dotall-regex" "^7.16.0" - "@babel/plugin-transform-duplicate-keys" "^7.16.0" - "@babel/plugin-transform-exponentiation-operator" "^7.16.0" - "@babel/plugin-transform-for-of" "^7.16.0" - "@babel/plugin-transform-function-name" "^7.16.0" - "@babel/plugin-transform-literals" "^7.16.0" - "@babel/plugin-transform-member-expression-literals" "^7.16.0" - "@babel/plugin-transform-modules-amd" "^7.16.0" - "@babel/plugin-transform-modules-commonjs" "^7.16.0" - "@babel/plugin-transform-modules-systemjs" "^7.16.0" - "@babel/plugin-transform-modules-umd" "^7.16.0" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.16.0" - "@babel/plugin-transform-new-target" "^7.16.0" - "@babel/plugin-transform-object-super" "^7.16.0" - "@babel/plugin-transform-parameters" "^7.16.3" - "@babel/plugin-transform-property-literals" "^7.16.0" - "@babel/plugin-transform-regenerator" "^7.16.0" - "@babel/plugin-transform-reserved-words" "^7.16.0" - "@babel/plugin-transform-shorthand-properties" "^7.16.0" - "@babel/plugin-transform-spread" "^7.16.0" - "@babel/plugin-transform-sticky-regex" "^7.16.0" - "@babel/plugin-transform-template-literals" "^7.16.0" - "@babel/plugin-transform-typeof-symbol" "^7.16.0" - "@babel/plugin-transform-unicode-escapes" "^7.16.0" - "@babel/plugin-transform-unicode-regex" "^7.16.0" - "@babel/preset-modules" "^0.1.5" - "@babel/types" "^7.16.0" - babel-plugin-polyfill-corejs2 "^0.3.0" - babel-plugin-polyfill-corejs3 "^0.4.0" - babel-plugin-polyfill-regenerator "^0.3.0" - core-js-compat "^3.19.1" - semver "^6.3.0" - -"@babel/preset-modules@^0.1.5": - version "0.1.5" - resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.5.tgz#ef939d6e7f268827e1841638dc6ff95515e115d9" - integrity sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" - "@babel/plugin-transform-dotall-regex" "^7.4.4" - "@babel/types" "^7.4.4" - esutils "^2.0.2" - -"@babel/preset-react@^7.13.13": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.16.0.tgz#f71d3e8dff5218478011df037fad52660ee6d82a" - integrity sha512-d31IFW2bLRB28uL1WoElyro8RH5l6531XfxMtCeCmp6RVAF1uTfxxUA0LH1tXl+psZdwfmIbwoG4U5VwgbhtLw== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-validator-option" "^7.14.5" - "@babel/plugin-transform-react-display-name" "^7.16.0" - "@babel/plugin-transform-react-jsx" "^7.16.0" - "@babel/plugin-transform-react-jsx-development" "^7.16.0" - "@babel/plugin-transform-react-pure-annotations" "^7.16.0" - -"@babel/preset-typescript@^7.14.5": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.16.0.tgz#b0b4f105b855fb3d631ec036cdc9d1ffd1fa5eac" - integrity sha512-txegdrZYgO9DlPbv+9QOVpMnKbOtezsLHWsnsRF4AjbSIsVaujrq1qg8HK0mxQpWv0jnejt0yEoW1uWpvbrDTg== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-validator-option" "^7.14.5" - "@babel/plugin-transform-typescript" "^7.16.0" - -"@babel/runtime@^7.12.5", "@babel/runtime@^7.14.0", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7": - version "7.16.3" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.16.3.tgz#b86f0db02a04187a3c17caa77de69840165d42d5" - integrity sha512-WBwekcqacdY2e9AF/Q7WLFUWmdJGJTkbjqTjoMDgXkVZ3ZRUvOPsLb5KdwISoQVsbP+DQzVZW4Zhci0DvpbNTQ== - dependencies: - regenerator-runtime "^0.13.4" - -"@babel/template@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.16.0.tgz#d16a35ebf4cd74e202083356fab21dd89363ddd6" - integrity sha512-MnZdpFD/ZdYhXwiunMqqgyZyucaYsbL0IrjoGjaVhGilz+x8YB++kRfygSOIj1yOtWKPlx7NBp+9I1RQSgsd5A== - dependencies: - "@babel/code-frame" "^7.16.0" - "@babel/parser" "^7.16.0" - "@babel/types" "^7.16.0" - -"@babel/traverse@^7.13.0", "@babel/traverse@^7.16.0", "@babel/traverse@^7.16.3", "@babel/traverse@^7.4.5": - version "7.16.3" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.16.3.tgz#f63e8a938cc1b780f66d9ed3c54f532ca2d14787" - integrity sha512-eolumr1vVMjqevCpwVO99yN/LoGL0EyHiLO5I043aYQvwOJ9eR5UsZSClHVCzfhBduMAsSzgA/6AyqPjNayJag== - dependencies: - "@babel/code-frame" "^7.16.0" - "@babel/generator" "^7.16.0" - "@babel/helper-function-name" "^7.16.0" - "@babel/helper-hoist-variables" "^7.16.0" - "@babel/helper-split-export-declaration" "^7.16.0" - "@babel/parser" "^7.16.3" - "@babel/types" "^7.16.0" - debug "^4.1.0" - globals "^11.1.0" - -"@babel/types@^7.16.0", "@babel/types@^7.2.0", "@babel/types@^7.4.4": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.16.0.tgz#db3b313804f96aadd0b776c4823e127ad67289ba" - integrity sha512-PJgg/k3SdLsGb3hhisFvtLOw5ts113klrpLuIPtCJIU+BB24fqq6lf8RWqKJEjzqXR9AEH1rIb5XTqwBHB+kQg== - dependencies: - "@babel/helper-validator-identifier" "^7.15.7" - to-fast-properties "^2.0.0" - -"@choojs/findup@^0.2.0": - version "0.2.1" - resolved "https://registry.yarnpkg.com/@choojs/findup/-/findup-0.2.1.tgz#ac13c59ae7be6e1da64de0779a0a7f03d75615a3" - integrity sha512-YstAqNb0MCN8PjdLCDfRsBcGVRN41f3vgLvaI0IrIcBp4AqILRSS0DeWNGkicC+f/zRIPJLc+9RURVSepwvfBw== - dependencies: - commander "^2.15.1" - -"@csstools/convert-colors@2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@csstools/convert-colors/-/convert-colors-2.0.0.tgz#6dd323583b40cfe05aaaca30debbb30f26742bbf" - integrity sha512-P7BVvddsP2Wl5v3drJ3ArzpdfXMqoZ/oHOV/yFiGFb3JQr9Z9UXZ9tnHAKJsO89lfprR1F9ExW3Yij21EjEBIA== - -"@discoveryjs/json-ext@^0.5.0": - version "0.5.5" - resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.5.tgz#9283c9ce5b289a3c4f61c12757469e59377f81f3" - integrity sha512-6nFkfkmSeV/rqSaS4oWHgmpnYw194f6hmWF5is6b0J1naJZoiD0NTc9AiUwPHvWsowkjuHErCZT1wa0jg+BLIA== - -"@emotion/is-prop-valid@^0.8.8": - version "0.8.8" - resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz#db28b1c4368a259b60a97311d6a952d4fd01ac1a" - integrity sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA== - dependencies: - "@emotion/memoize" "0.7.4" - -"@emotion/memoize@0.7.4": - version "0.7.4" - resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.7.4.tgz#19bf0f5af19149111c40d98bb0cf82119f5d9eeb" - integrity sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw== - -"@emotion/stylis@^0.8.4": - version "0.8.5" - resolved "https://registry.yarnpkg.com/@emotion/stylis/-/stylis-0.8.5.tgz#deacb389bd6ee77d1e7fcaccce9e16c5c7e78e04" - integrity sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ== - -"@emotion/unitless@^0.7.4": - version "0.7.5" - resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.7.5.tgz#77211291c1900a700b8a78cfafda3160d76949ed" - integrity sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg== - -"@jetbrains/angular-elastic@^2.5.1": - version "2.5.1" - resolved "https://registry.yarnpkg.com/@jetbrains/angular-elastic/-/angular-elastic-2.5.1.tgz#ddfffdd3941eaf839fd29069fc8faf7536329988" - integrity sha512-/XU38+J5c3vKKoiwGmqze0UaKt7mnrR0mQJg1WxuZFBSTf6e1co8rN8bgxik0jAX5s8yXUMWhPhmrIYKaR140Q== - dependencies: - angular ">=1.0.6" - -"@jetbrains/babel-preset-jetbrains@^2.3.2": - version "2.3.2" - resolved "https://registry.yarnpkg.com/@jetbrains/babel-preset-jetbrains/-/babel-preset-jetbrains-2.3.2.tgz#b62fab630080c5e78513e2cdbe85d4940f4e3164" - integrity sha512-hC8HpdxftzMc2OwwzKIsBzq/8paGT/+IcH7TZfy0RWusq0K1wWnjRQMH5o9J0RkdARlDnOxDxEHYA9fE6DFKLw== - dependencies: - "@babel/plugin-transform-runtime" "^7.14.3" - "@babel/plugin-transform-strict-mode" "^7.12.13" - "@babel/preset-env" "^7.14.4" - "@babel/preset-react" "^7.13.13" - "@babel/preset-typescript" "^7.14.5" - "@babel/runtime" "^7.14.0" - babel-plugin-angularjs-annotate "^0.10.0" - -"@jetbrains/icons@^3.18.0": - version "3.18.0" - resolved "https://registry.yarnpkg.com/@jetbrains/icons/-/icons-3.18.0.tgz#96d3ff8f9029b9f196a9a936cd2c6797aa2c17f2" - integrity sha512-aaKe4KVwjbnnbXEdWCVWMNwHrE1WCdwpVZYt468NXHukPX8KfnE8pGGuUcyEC/j4lXm+V8N24yGZ3GGMfq/wFA== - -"@jetbrains/logos@^1.4.27": - version "1.4.27" - resolved "https://registry.yarnpkg.com/@jetbrains/logos/-/logos-1.4.27.tgz#4412ed2abaf74756e44bb84643431fc270ec3031" - integrity sha512-1+S4mjh7Z9HliTlgJeemr+my4mD6HeEY0GH/qc8FKsY7jprFPsbJnfgiVdrhRFMtx7Rb4AKRjiM4CIqqweF+zA== - -"@jetbrains/postcss-require-hover@^0.1.2": - version "0.1.2" - resolved "https://registry.yarnpkg.com/@jetbrains/postcss-require-hover/-/postcss-require-hover-0.1.2.tgz#927f24fa7cb27e3a3ed2c4eca716e5a206577e18" - integrity sha512-U094mXSp0KOfqZLTlkPLz4vHdIZYm1gJFRFJP7nMrGA1OI4Nigwl0TUwFt/7YDNAff57Eo9Zttu9Ln5QoXguAw== - dependencies: - postcss "^6.0.1" - -"@jetbrains/ring-ui@^4.1.5": - version "4.1.6" - resolved "https://registry.yarnpkg.com/@jetbrains/ring-ui/-/ring-ui-4.1.6.tgz#bb1d95a169dc5b8b0915258d772fbbd99ad739bf" - integrity sha512-/HFw77+gzN6YxsaGG5Wga4ZOwfs65GfailwCoY4Xdm05OqWHKIJmzTr0+Tc0w12Lg9Km7ymxrRIOQKcXOdjSFQ== - dependencies: - "@babel/core" "^7.16.0" - "@jetbrains/angular-elastic" "^2.5.1" - "@jetbrains/babel-preset-jetbrains" "^2.3.2" - "@jetbrains/icons" "^3.18.0" - "@jetbrains/logos" "^1.4.27" - "@jetbrains/postcss-require-hover" "^0.1.2" - "@ungap/url-search-params" "^0.2.2" - babel-loader "^8.2.3" - babel-plugin-transform-define "^2.0.1" - browserslist "^4.16.6" - change-case "^4.1.1" - classnames "^2.3.1" - combokeys "^3.0.1" - compile-code-loader "^1.0.0" - conic-gradient "^1.0.0" - css-loader "^6.5.1" - date-fns "^2.27.0" - deep-equal "^2.0.4" - element-resize-detector "^1.2.3" - es6-error "^4.1.1" - eslint-plugin-react-hooks "^4.3.0" - extricate-loader "^3.0.0" - fastdom "^1.0.10" - file-loader "^6.2.0" - focus-trap "^6.7.1" - focus-visible "^5.2.0" - highlight.js "^10.7.2" - html-loader "^3.0.1" - interpolate-loader "^2.0.1" - just-debounce-it "^3.0.1" - memoize-one "^6.0.0" - postcss "^8.4.4" - postcss-calc "^8.0.0" - postcss-flexbugs-fixes "^5.0.2" - postcss-font-family-system-ui "^5.0.0" - postcss-loader "^6.2.1" - postcss-modules-values-replace "^3.4.0" - postcss-preset-env "^7.0.1" - prop-types "^15.7.2" - react-markdown "^5.0.3" - react-movable "^3.0.2" - react-virtualized "^9.22.3" - react-waypoint "^10.1.0" - remark-breaks "^3.0.2" - remark-gfm "^1.0.0" - scrollbar-width "^3.1.1" - simply-uuid "^1.0.1" - sniffr "^1.2.0" - style-inject "^0.3.0" - style-loader "~3.3.1" - url-loader "^4.1.1" - util-deprecate "^1.0.2" - -"@mapbox/geojson-rewind@^0.5.0": - version "0.5.1" - resolved "https://registry.yarnpkg.com/@mapbox/geojson-rewind/-/geojson-rewind-0.5.1.tgz#adbe16dc683eb40e90934c51a5e28c7bbf44f4e1" - integrity sha512-eL7fMmfTBKjrb+VFHXCGv9Ot0zc3C0U+CwXo1IrP+EPwDczLoXv34Tgq3y+2mPSFNVUXgU42ILWJTC7145KPTA== - dependencies: - get-stream "^6.0.1" - minimist "^1.2.5" - -"@mapbox/geojson-types@^1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@mapbox/geojson-types/-/geojson-types-1.0.2.tgz#9aecf642cb00eab1080a57c4f949a65b4a5846d6" - integrity sha512-e9EBqHHv3EORHrSfbR9DqecPNn+AmuAoQxV6aL8Xu30bJMJR1o8PZLZzpk1Wq7/NfCbuhmakHTPYRhoqLsXRnw== - -"@mapbox/jsonlint-lines-primitives@^2.0.2": - version "2.0.2" - resolved "https://registry.yarnpkg.com/@mapbox/jsonlint-lines-primitives/-/jsonlint-lines-primitives-2.0.2.tgz#ce56e539f83552b58d10d672ea4d6fc9adc7b234" - integrity sha1-zlblOfg1UrWNENZy6k1vya3HsjQ= - -"@mapbox/mapbox-gl-supported@^1.5.0": - version "1.5.0" - resolved "https://registry.yarnpkg.com/@mapbox/mapbox-gl-supported/-/mapbox-gl-supported-1.5.0.tgz#f60b6a55a5d8e5ee908347d2ce4250b15103dc8e" - integrity sha512-/PT1P6DNf7vjEEiPkVIRJkvibbqWtqnyGaBz3nfRdcxclNSnSdaLU5tfAgcD7I8Yt5i+L19s406YLl1koLnLbg== - -"@mapbox/point-geometry@0.1.0", "@mapbox/point-geometry@^0.1.0", "@mapbox/point-geometry@~0.1.0": - version "0.1.0" - resolved "https://registry.yarnpkg.com/@mapbox/point-geometry/-/point-geometry-0.1.0.tgz#8a83f9335c7860effa2eeeca254332aa0aeed8f2" - integrity sha1-ioP5M1x4YO/6Lu7KJUMyqgru2PI= - -"@mapbox/tiny-sdf@^1.1.1": - version "1.2.5" - resolved "https://registry.yarnpkg.com/@mapbox/tiny-sdf/-/tiny-sdf-1.2.5.tgz#424c620a96442b20402552be70a7f62a8407cc59" - integrity sha512-cD8A/zJlm6fdJOk6DqPUV8mcpyJkRz2x2R+/fYcWDYG3oWbG7/L7Yl/WqQ1VZCjnL9OTIMAn6c+BC5Eru4sQEw== - -"@mapbox/unitbezier@^0.0.0": - version "0.0.0" - resolved "https://registry.yarnpkg.com/@mapbox/unitbezier/-/unitbezier-0.0.0.tgz#15651bd553a67b8581fb398810c98ad86a34524e" - integrity sha1-FWUb1VOme4WB+zmIEMmK2Go0Uk4= - -"@mapbox/vector-tile@^1.3.1": - version "1.3.1" - resolved "https://registry.yarnpkg.com/@mapbox/vector-tile/-/vector-tile-1.3.1.tgz#d3a74c90402d06e89ec66de49ec817ff53409666" - integrity sha512-MCEddb8u44/xfQ3oD+Srl/tNcQoqTw3goGk2oLsrFxOTc3dUp+kAnby3PvAeeBYSMSjSPD1nd1AJA6W49WnoUw== - dependencies: - "@mapbox/point-geometry" "~0.1.0" - -"@mapbox/whoots-js@^3.1.0": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@mapbox/whoots-js/-/whoots-js-3.1.0.tgz#497c67a1cef50d1a2459ba60f315e448d2ad87fe" - integrity sha512-Es6WcD0nO5l+2BOQS4uLfNPYQaNDfbot3X1XUoloz+x0mPDS3eeORZJl06HXjwBG1fOGwCRnzK88LMdxKRrd6Q== - -"@nodelib/fs.scandir@2.1.5": - version "2.1.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" - integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== - dependencies: - "@nodelib/fs.stat" "2.0.5" - run-parallel "^1.1.9" - -"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": - version "2.0.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" - integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== - -"@nodelib/fs.walk@^1.2.3": - version "1.2.8" - resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" - integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== - dependencies: - "@nodelib/fs.scandir" "2.1.5" - fastq "^1.6.0" - -"@plotly/d3-sankey-circular@0.33.1": - version "0.33.1" - resolved "https://registry.yarnpkg.com/@plotly/d3-sankey-circular/-/d3-sankey-circular-0.33.1.tgz#15d1e0337e0e4b1135bdf0e2195c88adacace1a7" - integrity sha512-FgBV1HEvCr3DV7RHhDsPXyryknucxtfnLwPtCKKxdolKyTFYoLX/ibEfX39iFYIL7DYbVeRtP43dbFcrHNE+KQ== - dependencies: - d3-array "^1.2.1" - d3-collection "^1.0.4" - d3-shape "^1.2.0" - elementary-circuits-directed-graph "^1.0.4" - -"@plotly/d3-sankey@0.7.2": - version "0.7.2" - resolved "https://registry.yarnpkg.com/@plotly/d3-sankey/-/d3-sankey-0.7.2.tgz#ddd5290d3b02c60037ced018a162644a2ccef33b" - integrity sha512-2jdVos1N3mMp3QW0k2q1ph7Gd6j5PY1YihBrwpkFnKqO+cqtZq3AdEYUeSGXMeLsBDQYiqTVcihYfk8vr5tqhw== - dependencies: - d3-array "1" - d3-collection "1" - d3-shape "^1.2.0" - -"@plotly/point-cluster@^3.1.9": - version "3.1.9" - resolved "https://registry.yarnpkg.com/@plotly/point-cluster/-/point-cluster-3.1.9.tgz#8ffec77fbf5041bf15401079e4fdf298220291c1" - integrity sha512-MwaI6g9scKf68Orpr1pHZ597pYx9uP8UEFXLPbsCmuw3a84obwz6pnMXGc90VhgDNeNiLEdlmuK7CPo+5PIxXw== - dependencies: - array-bounds "^1.0.1" - binary-search-bounds "^2.0.4" - clamp "^1.0.1" - defined "^1.0.0" - dtype "^2.0.0" - flatten-vertex-data "^1.0.2" - is-obj "^1.0.1" - math-log2 "^1.0.1" - parse-rect "^1.2.0" - pick-by-alias "^1.2.0" - -"@polka/url@^1.0.0-next.20": - version "1.0.0-next.21" - resolved "https://registry.yarnpkg.com/@polka/url/-/url-1.0.0-next.21.tgz#5de5a2385a35309427f6011992b544514d559aa1" - integrity sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g== - -"@turf/area@^6.0.1": - version "6.5.0" - resolved "https://registry.yarnpkg.com/@turf/area/-/area-6.5.0.tgz#1d0d7aee01d8a4a3d4c91663ed35cc615f36ad56" - integrity sha512-xCZdiuojokLbQ+29qR6qoMD89hv+JAgWjLrwSEWL+3JV8IXKeNFl6XkEJz9HGkVpnXvQKJoRz4/liT+8ZZ5Jyg== - dependencies: - "@turf/helpers" "^6.5.0" - "@turf/meta" "^6.5.0" - -"@turf/bbox@^6.0.1": - version "6.5.0" - resolved "https://registry.yarnpkg.com/@turf/bbox/-/bbox-6.5.0.tgz#bec30a744019eae420dac9ea46fb75caa44d8dc5" - integrity sha512-RBbLaao5hXTYyyg577iuMtDB8ehxMlUqHEJiMs8jT1GHkFhr6sYre3lmLsPeYEi/ZKj5TP5tt7fkzNdJ4GIVyw== - dependencies: - "@turf/helpers" "^6.5.0" - "@turf/meta" "^6.5.0" - -"@turf/centroid@^6.0.2": - version "6.5.0" - resolved "https://registry.yarnpkg.com/@turf/centroid/-/centroid-6.5.0.tgz#ecaa365412e5a4d595bb448e7dcdacfb49eb0009" - integrity sha512-MwE1oq5E3isewPprEClbfU5pXljIK/GUOMbn22UM3IFPDJX0KeoyLNwghszkdmFp/qMGL/M13MMWvU+GNLXP/A== - dependencies: - "@turf/helpers" "^6.5.0" - "@turf/meta" "^6.5.0" - -"@turf/helpers@^6.5.0": - version "6.5.0" - resolved "https://registry.yarnpkg.com/@turf/helpers/-/helpers-6.5.0.tgz#f79af094bd6b8ce7ed2bd3e089a8493ee6cae82e" - integrity sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw== - -"@turf/meta@^6.5.0": - version "6.5.0" - resolved "https://registry.yarnpkg.com/@turf/meta/-/meta-6.5.0.tgz#b725c3653c9f432133eaa04d3421f7e51e0418ca" - integrity sha512-RrArvtsV0vdsCBegoBtOalgdSOfkBrTJ07VkpiCnq/491W67hnMWmDu7e6Ztw0C3WldRYTXkg3SumfdzZxLBHA== - dependencies: - "@turf/helpers" "^6.5.0" - -"@types/component-emitter@^1.2.10": - version "1.2.11" - resolved "https://registry.yarnpkg.com/@types/component-emitter/-/component-emitter-1.2.11.tgz#50d47d42b347253817a39709fef03ce66a108506" - integrity sha512-SRXjM+tfsSlA9VuG8hGO2nft2p8zjXCK1VcC6N4NXbBbYbSia9kzCChYQajIjzIqOOOuh5Ock6MmV2oux4jDZQ== - -"@types/cookie@^0.4.0": - version "0.4.1" - resolved "https://registry.yarnpkg.com/@types/cookie/-/cookie-0.4.1.tgz#bfd02c1f2224567676c1545199f87c3a861d878d" - integrity sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q== - -"@types/cors@^2.8.8": - version "2.8.12" - resolved "https://registry.yarnpkg.com/@types/cors/-/cors-2.8.12.tgz#6b2c510a7ad7039e98e7b8d3d6598f4359e5c080" - integrity sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw== - -"@types/eslint-scope@^3.7.0": - version "3.7.1" - resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.1.tgz#8dc390a7b4f9dd9f1284629efce982e41612116e" - integrity sha512-SCFeogqiptms4Fg29WpOTk5nHIzfpKCemSN63ksBQYKTcXoJEmJagV+DhVmbapZzY4/5YaOV1nZwrsU79fFm1g== - dependencies: - "@types/eslint" "*" - "@types/estree" "*" - -"@types/eslint@*": - version "8.2.0" - resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.2.0.tgz#afd0519223c29c347087542cbaee2fedc0873b16" - integrity sha512-74hbvsnc+7TEDa1z5YLSe4/q8hGYB3USNvCuzHUJrjPV6hXaq8IXcngCrHkuvFt0+8rFz7xYXrHgNayIX0UZvQ== - dependencies: - "@types/estree" "*" - "@types/json-schema" "*" - -"@types/estree@*", "@types/estree@^0.0.50": - version "0.0.50" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.50.tgz#1e0caa9364d3fccd2931c3ed96fdbeaa5d4cca83" - integrity sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw== - -"@types/http-proxy@^1.17.5": - version "1.17.7" - resolved "https://registry.yarnpkg.com/@types/http-proxy/-/http-proxy-1.17.7.tgz#30ea85cc2c868368352a37f0d0d3581e24834c6f" - integrity sha512-9hdj6iXH64tHSLTY+Vt2eYOGzSogC+JQ2H7bdPWkuh7KXP5qLllWx++t+K9Wk556c3dkDdPws/SpMRi0sdCT1w== - dependencies: - "@types/node" "*" - -"@types/json-schema@*", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": - version "7.0.9" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.9.tgz#97edc9037ea0c38585320b28964dde3b39e4660d" - integrity sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ== - -"@types/mdast@^3.0.0", "@types/mdast@^3.0.3": - version "3.0.10" - resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-3.0.10.tgz#4724244a82a4598884cbbe9bcfd73dff927ee8af" - integrity sha512-W864tg/Osz1+9f4lrGTZpCSO5/z4608eUp19tbozkq2HJK6i3z1kT0H9tlADXuYIb1YYOBByU4Jsqkk75q48qA== - dependencies: - "@types/unist" "*" - -"@types/node@*", "@types/node@>=10.0.0": - version "16.11.11" - resolved "https://registry.yarnpkg.com/@types/node/-/node-16.11.11.tgz#6ea7342dfb379ea1210835bada87b3c512120234" - integrity sha512-KB0sixD67CeecHC33MYn+eYARkqTheIRNuu97y2XMjR7Wu3XibO1vaY6VBV6O/a89SPI81cEUIYT87UqUWlZNw== - -"@types/parse-json@^4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" - integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== - -"@types/retry@^0.12.0": - version "0.12.1" - resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.1.tgz#d8f1c0d0dc23afad6dc16a9e993a0865774b4065" - integrity sha512-xoDlM2S4ortawSWORYqsdU+2rxdh4LRW9ytc3zmT37RIKQh6IHyKwwtKhKis9ah8ol07DCkZxPt8BBvPjC6v4g== - -"@types/tabulator-tables@5.0.1": - version "5.0.1" - resolved "https://registry.yarnpkg.com/@types/tabulator-tables/-/tabulator-tables-5.0.1.tgz#824fef3bef01c38a3bd934016a25e52e1043bf35" - integrity sha512-ieidxy+/bzMCPZsDeSw56DN9ipQ0K4Ts3ZUxPy4yCVExcAsezL4u2UYHBA+BxQ8l7QmEaERT/ctmBqjkRUhh+w== - -"@types/unist@*", "@types/unist@^2.0.0", "@types/unist@^2.0.2", "@types/unist@^2.0.3": - version "2.0.6" - resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.6.tgz#250a7b16c3b91f672a24552ec64678eeb1d3a08d" - integrity sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ== - -"@ungap/promise-all-settled@1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz#aa58042711d6e3275dd37dc597e5d31e8c290a44" - integrity sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q== - -"@ungap/url-search-params@^0.2.2": - version "0.2.2" - resolved "https://registry.yarnpkg.com/@ungap/url-search-params/-/url-search-params-0.2.2.tgz#2de3bdec21476a9b70ef11fd7b794752f9afa04c" - integrity sha512-qQsguKXZVKdCixOHX9jqnX/K/1HekPDpGKyEcXHT+zR6EjGA7S4boSuelL4uuPv6YfhN0n8c4UxW+v/Z3gM2iw== - -"@webassemblyjs/ast@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.1.tgz#2bfd767eae1a6996f432ff7e8d7fc75679c0b6a7" - integrity sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw== - dependencies: - "@webassemblyjs/helper-numbers" "1.11.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.1" - -"@webassemblyjs/floating-point-hex-parser@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz#f6c61a705f0fd7a6aecaa4e8198f23d9dc179e4f" - integrity sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ== - -"@webassemblyjs/helper-api-error@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz#1a63192d8788e5c012800ba6a7a46c705288fd16" - integrity sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg== - -"@webassemblyjs/helper-buffer@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz#832a900eb444884cde9a7cad467f81500f5e5ab5" - integrity sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA== - -"@webassemblyjs/helper-numbers@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz#64d81da219fbbba1e3bd1bfc74f6e8c4e10a62ae" - integrity sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ== - dependencies: - "@webassemblyjs/floating-point-hex-parser" "1.11.1" - "@webassemblyjs/helper-api-error" "1.11.1" - "@xtuc/long" "4.2.2" - -"@webassemblyjs/helper-wasm-bytecode@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz#f328241e41e7b199d0b20c18e88429c4433295e1" - integrity sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q== - -"@webassemblyjs/helper-wasm-section@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz#21ee065a7b635f319e738f0dd73bfbda281c097a" - integrity sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg== - dependencies: - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/helper-buffer" "1.11.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.1" - "@webassemblyjs/wasm-gen" "1.11.1" - -"@webassemblyjs/ieee754@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz#963929e9bbd05709e7e12243a099180812992614" - integrity sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ== - dependencies: - "@xtuc/ieee754" "^1.2.0" - -"@webassemblyjs/leb128@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.11.1.tgz#ce814b45574e93d76bae1fb2644ab9cdd9527aa5" - integrity sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw== - dependencies: - "@xtuc/long" "4.2.2" - -"@webassemblyjs/utf8@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.1.tgz#d1f8b764369e7c6e6bae350e854dec9a59f0a3ff" - integrity sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ== - -"@webassemblyjs/wasm-edit@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz#ad206ebf4bf95a058ce9880a8c092c5dec8193d6" - integrity sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA== - dependencies: - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/helper-buffer" "1.11.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.1" - "@webassemblyjs/helper-wasm-section" "1.11.1" - "@webassemblyjs/wasm-gen" "1.11.1" - "@webassemblyjs/wasm-opt" "1.11.1" - "@webassemblyjs/wasm-parser" "1.11.1" - "@webassemblyjs/wast-printer" "1.11.1" - -"@webassemblyjs/wasm-gen@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz#86c5ea304849759b7d88c47a32f4f039ae3c8f76" - integrity sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA== - dependencies: - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.1" - "@webassemblyjs/ieee754" "1.11.1" - "@webassemblyjs/leb128" "1.11.1" - "@webassemblyjs/utf8" "1.11.1" - -"@webassemblyjs/wasm-opt@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz#657b4c2202f4cf3b345f8a4c6461c8c2418985f2" - integrity sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw== - dependencies: - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/helper-buffer" "1.11.1" - "@webassemblyjs/wasm-gen" "1.11.1" - "@webassemblyjs/wasm-parser" "1.11.1" - -"@webassemblyjs/wasm-parser@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz#86ca734534f417e9bd3c67c7a1c75d8be41fb199" - integrity sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA== - dependencies: - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/helper-api-error" "1.11.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.1" - "@webassemblyjs/ieee754" "1.11.1" - "@webassemblyjs/leb128" "1.11.1" - "@webassemblyjs/utf8" "1.11.1" - -"@webassemblyjs/wast-printer@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz#d0c73beda8eec5426f10ae8ef55cee5e7084c2f0" - integrity sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg== - dependencies: - "@webassemblyjs/ast" "1.11.1" - "@xtuc/long" "4.2.2" - -"@webpack-cli/configtest@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@webpack-cli/configtest/-/configtest-1.1.0.tgz#8342bef0badfb7dfd3b576f2574ab80c725be043" - integrity sha512-ttOkEkoalEHa7RaFYpM0ErK1xc4twg3Am9hfHhL7MVqlHebnkYd2wuI/ZqTDj0cVzZho6PdinY0phFZV3O0Mzg== - -"@webpack-cli/info@^1.4.0": - version "1.4.0" - resolved "https://registry.yarnpkg.com/@webpack-cli/info/-/info-1.4.0.tgz#b9179c3227ab09cbbb149aa733475fcf99430223" - integrity sha512-F6b+Man0rwE4n0409FyAJHStYA5OIZERxmnUfLVwv0mc0V1wLad3V7jqRlMkgKBeAq07jUvglacNaa6g9lOpuw== - dependencies: - envinfo "^7.7.3" - -"@webpack-cli/serve@^1.6.0": - version "1.6.0" - resolved "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-1.6.0.tgz#2c275aa05c895eccebbfc34cfb223c6e8bd591a2" - integrity sha512-ZkVeqEmRpBV2GHvjjUZqEai2PpUbuq8Bqd//vEYsp63J8WyexI8ppCqVS3Zs0QADf6aWuPdU+0XsPI647PVlQA== - -"@xtuc/ieee754@^1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" - integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== - -"@xtuc/long@4.2.2": - version "4.2.2" - resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" - integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== - -a-big-triangle@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/a-big-triangle/-/a-big-triangle-1.0.3.tgz#eefd30b02a8f525e8b1f72bb6bb1b0c16751c794" - integrity sha1-7v0wsCqPUl6LH3K7a7GwwWdRx5Q= - dependencies: - gl-buffer "^2.1.1" - gl-vao "^1.2.0" - weak-map "^1.0.5" - -abab@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.5.tgz#c0b678fb32d60fc1219c784d6a826fe385aeb79a" - integrity sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q== - -abs-svg-path@^0.1.1, abs-svg-path@~0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/abs-svg-path/-/abs-svg-path-0.1.1.tgz#df601c8e8d2ba10d4a76d625e236a9a39c2723bf" - integrity sha1-32Acjo0roQ1KdtYl4japo5wnI78= - -accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.7: - version "1.3.7" - resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" - integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA== - dependencies: - mime-types "~2.1.24" - negotiator "0.6.2" - -acorn-dynamic-import@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-4.0.0.tgz#482210140582a36b83c3e342e1cfebcaa9240948" - integrity sha512-d3OEjQV4ROpoflsnUA8HozoIR504TFxNivYEUi6uwz0IYhBkTDXGuWlNdMtybRt3nqVx/L6XqMt0FxkXuWKZhw== - -acorn-import-assertions@^1.7.6: - version "1.8.0" - resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz#ba2b5939ce62c238db6d93d81c9b111b29b855e9" - integrity sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw== - -acorn-jsx@^5.0.1: - version "5.3.2" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" - integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== - -acorn-walk@^8.0.0: - version "8.2.0" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" - integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== - -acorn@^6.1.1: - version "6.4.2" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.2.tgz#35866fd710528e92de10cf06016498e47e39e1e6" - integrity sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ== - -acorn@^7.1.1: - version "7.4.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" - integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== - -acorn@^8.0.4: - version "8.7.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.0.tgz#90951fde0f8f09df93549481e5fc141445b791cf" - integrity sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ== - -acorn@^8.4.1: - version "8.6.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.6.0.tgz#e3692ba0eb1a0c83eaa4f37f5fa7368dd7142895" - integrity sha512-U1riIR+lBSNi3IbxtaHOIKdH8sLFv3NYfNv8sg7ZsNhcfl4HF2++BfqqrNAxoCLQW1iiylOj76ecnaUxz+z9yw== - -add-line-numbers@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/add-line-numbers/-/add-line-numbers-1.0.1.tgz#48dbbdea47dbd234deafeac6c93cea6f70b4b7e3" - integrity sha1-SNu96kfb0jTer+rGyTzqb3C0t+M= - dependencies: - pad-left "^1.0.2" - -affine-hull@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/affine-hull/-/affine-hull-1.0.0.tgz#763ff1d38d063ceb7e272f17ee4d7bbcaf905c5d" - integrity sha1-dj/x040GPOt+Jy8X7k17vK+QXF0= - dependencies: - robust-orientation "^1.1.3" - -aggregate-error@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" - integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== - dependencies: - clean-stack "^2.0.0" - indent-string "^4.0.0" - -ajv-formats@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-2.1.1.tgz#6e669400659eb74973bbf2e33327180a0996b520" - integrity sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA== - dependencies: - ajv "^8.0.0" - -ajv-keywords@^3.5.2: - version "3.5.2" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" - integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== - -ajv-keywords@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-5.1.0.tgz#69d4d385a4733cdbeab44964a1170a88f87f0e16" - integrity sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw== - dependencies: - fast-deep-equal "^3.1.3" - -ajv@^6.12.4, ajv@^6.12.5: - version "6.12.6" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" - integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== - dependencies: - fast-deep-equal "^3.1.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - -ajv@^8.0.0, ajv@^8.8.0: - version "8.8.2" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.8.2.tgz#01b4fef2007a28bf75f0b7fc009f62679de4abbb" - integrity sha512-x9VuX+R/jcFj1DHo/fCp99esgGDWiHENrKxaCENuCxpoMCmAt/COCGVDwA7kleEpEzJjDnvh3yGoOuLu0Dtllw== - dependencies: - fast-deep-equal "^3.1.1" - json-schema-traverse "^1.0.0" - require-from-string "^2.0.2" - uri-js "^4.2.2" - -almost-equal@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/almost-equal/-/almost-equal-1.1.0.tgz#f851c631138757994276aa2efbe8dfa3066cccdd" - integrity sha1-+FHGMROHV5lCdqou++jfowZszN0= - -alpha-complex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/alpha-complex/-/alpha-complex-1.0.0.tgz#90865870d6b0542ae73c0c131d4ef989669b72d2" - integrity sha1-kIZYcNawVCrnPAwTHU75iWabctI= - dependencies: - circumradius "^1.0.0" - delaunay-triangulate "^1.1.6" - -alpha-shape@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/alpha-shape/-/alpha-shape-1.0.0.tgz#c83109923ecfda667d2163fe4f26fe24726f64a9" - integrity sha1-yDEJkj7P2mZ9IWP+Tyb+JHJvZKk= - dependencies: - alpha-complex "^1.0.0" - simplicial-complex-boundary "^1.0.0" - -angular@>=1.0.6: - version "1.8.2" - resolved "https://registry.yarnpkg.com/angular/-/angular-1.8.2.tgz#5983bbb5a9fa63e213cb7749199e0d352de3a2f1" - integrity sha512-IauMOej2xEe7/7Ennahkbb5qd/HFADiNuLSESz9Q27inmi32zB0lnAsFeLEWcox3Gd1F6YhNd1CP7/9IukJ0Gw== - -ansi-colors@4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" - integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== - -ansi-html-community@^0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/ansi-html-community/-/ansi-html-community-0.0.8.tgz#69fbc4d6ccbe383f9736934ae34c3f8290f1bf41" - integrity sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw== - -ansi-regex@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" - integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== - -ansi-regex@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" - integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== - -ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== - dependencies: - color-convert "^1.9.0" - -ansi-styles@^4.0.0, ansi-styles@^4.1.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== - dependencies: - color-convert "^2.0.1" - -anymatch@~3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" - integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== - dependencies: - normalize-path "^3.0.0" - picomatch "^2.0.4" - -argparse@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" - integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== - -arr-flatten@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" - integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== - -array-bounds@^1.0.0, array-bounds@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/array-bounds/-/array-bounds-1.0.1.tgz#da11356b4e18e075a4f0c86e1f179a67b7d7ea31" - integrity sha512-8wdW3ZGk6UjMPJx/glyEt0sLzzwAE1bhToPsO1W2pbpR2gULyxe3BjSiuJFheP50T/GgODVPz2fuMUmIywt8cQ== - -array-find-index@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" - integrity sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E= - -array-flatten@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" - integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= - -array-flatten@^2.1.0: - version "2.1.2" - resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099" - integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== - -array-normalize@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/array-normalize/-/array-normalize-1.1.4.tgz#d75cec57383358af38efdf6a78071aa36ae4174c" - integrity sha512-fCp0wKFLjvSPmCn4F5Tiw4M3lpMZoHlCjfcs7nNzuj3vqQQ1/a8cgB9DXcpDSn18c+coLnaW7rqfcYCvKbyJXg== - dependencies: - array-bounds "^1.0.0" - -array-range@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/array-range/-/array-range-1.0.1.tgz#f56e46591843611c6a56f77ef02eda7c50089bfc" - integrity sha1-9W5GWRhDYRxqVvd+8C7afFAIm/w= - -array-rearrange@^2.2.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/array-rearrange/-/array-rearrange-2.2.2.tgz#fa1a2acf8d02e88dd0c9602aa0e06a79158b2283" - integrity sha512-UfobP5N12Qm4Qu4fwLDIi2v6+wZsSf6snYSxAMeKhrh37YGnNWZPRmVEKc/2wfms53TLQnzfpG8wCx2Y/6NG1w== - -array-union@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" - integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== - -async@^2.6.2: - version "2.6.3" - resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff" - integrity sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg== - dependencies: - lodash "^4.17.14" - -atob-lite@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/atob-lite/-/atob-lite-1.0.0.tgz#b88dca6006922b962094f7556826bab31c4a296b" - integrity sha1-uI3KYAaSK5YglPdVaCa6sxxKKWs= - -atob-lite@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/atob-lite/-/atob-lite-2.0.0.tgz#0fef5ad46f1bd7a8502c65727f0367d5ee43d696" - integrity sha1-D+9a1G8b16hQLGVyfwNn1e5D1pY= - -autoprefixer@^10.4.0: - version "10.4.0" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.0.tgz#c3577eb32a1079a440ec253e404eaf1eb21388c8" - integrity sha512-7FdJ1ONtwzV1G43GDD0kpVMn/qbiNqyOPMFTX5nRffI+7vgWoFEc6DcXOxHJxrWNDXrZh18eDsZjvZGUljSRGA== - dependencies: - browserslist "^4.17.5" - caniuse-lite "^1.0.30001272" - fraction.js "^4.1.1" - normalize-range "^0.1.2" - picocolors "^1.0.0" - postcss-value-parser "^4.1.0" - -available-typed-arrays@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" - integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== - -babel-loader@^8.2.3: - version "8.2.3" - resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.2.3.tgz#8986b40f1a64cacfcb4b8429320085ef68b1342d" - integrity sha512-n4Zeta8NC3QAsuyiizu0GkmRcQ6clkV9WFUnUf1iXP//IeSKbWjofW3UHyZVwlOB4y039YQKefawyTn64Zwbuw== - dependencies: - find-cache-dir "^3.3.1" - loader-utils "^1.4.0" - make-dir "^3.1.0" - schema-utils "^2.6.5" - -babel-plugin-angularjs-annotate@^0.10.0: - version "0.10.0" - resolved "https://registry.yarnpkg.com/babel-plugin-angularjs-annotate/-/babel-plugin-angularjs-annotate-0.10.0.tgz#4213b3aaae494a087aad0b8237c5d0716d22ca76" - integrity sha512-NPE7FOAxcLPCUR/kNkrhHIjoScR3RyIlRH3yRn79j8EZWtpILVnCOdA9yKfsOmRh6BHnLHKl8ZAThc+YDd/QwQ== - dependencies: - "@babel/code-frame" "^7.0.0" - "@babel/types" "^7.2.0" - simple-is "~0.2.0" - -babel-plugin-dynamic-import-node@^2.3.3: - version "2.3.3" - resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3" - integrity sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ== - dependencies: - object.assign "^4.1.0" - -babel-plugin-polyfill-corejs2@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.0.tgz#407082d0d355ba565af24126fb6cb8e9115251fd" - integrity sha512-wMDoBJ6uG4u4PNFh72Ty6t3EgfA91puCuAwKIazbQlci+ENb/UU9A3xG5lutjUIiXCIn1CY5L15r9LimiJyrSA== - dependencies: - "@babel/compat-data" "^7.13.11" - "@babel/helper-define-polyfill-provider" "^0.3.0" - semver "^6.1.1" - -babel-plugin-polyfill-corejs3@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.4.0.tgz#0b571f4cf3d67f911512f5c04842a7b8e8263087" - integrity sha512-YxFreYwUfglYKdLUGvIF2nJEsGwj+RhWSX/ije3D2vQPOXuyMLMtg/cCGMDpOA7Nd+MwlNdnGODbd2EwUZPlsw== - dependencies: - "@babel/helper-define-polyfill-provider" "^0.3.0" - core-js-compat "^3.18.0" - -babel-plugin-polyfill-regenerator@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.0.tgz#9ebbcd7186e1a33e21c5e20cae4e7983949533be" - integrity sha512-dhAPTDLGoMW5/84wkgwiLRwMnio2i1fUe53EuvtKMv0pn2p3S8OCoV1xAzfJPl0KOX7IB89s2ib85vbYiea3jg== - dependencies: - "@babel/helper-define-polyfill-provider" "^0.3.0" - -"babel-plugin-styled-components@>= 1.12.0": - version "2.0.2" - resolved "https://registry.yarnpkg.com/babel-plugin-styled-components/-/babel-plugin-styled-components-2.0.2.tgz#0fac11402dc9db73698b55847ab1dc73f5197c54" - integrity sha512-7eG5NE8rChnNTDxa6LQfynwgHTVOYYaHJbUYSlOhk8QBXIQiMBKq4gyfHBBKPrxUcVBXVJL61ihduCpCQbuNbw== - dependencies: - "@babel/helper-annotate-as-pure" "^7.16.0" - "@babel/helper-module-imports" "^7.16.0" - babel-plugin-syntax-jsx "^6.18.0" - lodash "^4.17.11" - -babel-plugin-syntax-jsx@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz#0af32a9a6e13ca7a3fd5069e62d7b0f58d0d8946" - integrity sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY= - -babel-plugin-transform-define@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-define/-/babel-plugin-transform-define-2.0.1.tgz#6a34fd6ea89989feb75721ee4cce817ec779be7f" - integrity sha512-7lDR1nFGSJHmhq/ScQtp9LTDmNE2yKPoLtwfiu+WQZnj84XL/J/5AZWZXwYcOwbDtUPhtg+y0yxTiP/oGDU6Kw== - dependencies: - lodash "^4.17.11" - traverse "0.6.6" - -bail@^1.0.0: - version "1.0.5" - resolved "https://registry.yarnpkg.com/bail/-/bail-1.0.5.tgz#b6fa133404a392cbc1f8c4bf63f5953351e7a776" - integrity sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ== - -bail@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/bail/-/bail-2.0.2.tgz#d26f5cd8fe5d6f832a31517b9f7c356040ba6d5d" - integrity sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw== - -balanced-match@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" - integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== - -barycentric@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/barycentric/-/barycentric-1.0.1.tgz#f1562bb891b26f4fec463a82eeda3657800ec688" - integrity sha1-8VYruJGyb0/sRjqC7to2V4AOxog= - dependencies: - robust-linear-solve "^1.0.0" - -base64-arraybuffer@0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz#9818c79e059b1355f97e0428a017c838e90ba812" - integrity sha1-mBjHngWbE1X5fgQooBfIOOkLqBI= - -base64id@2.0.0, base64id@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/base64id/-/base64id-2.0.0.tgz#2770ac6bc47d312af97a8bf9a634342e0cd25cb6" - integrity sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog== - -batch-processor@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/batch-processor/-/batch-processor-1.0.0.tgz#75c95c32b748e0850d10c2b168f6bdbe9891ace8" - integrity sha1-dclcMrdI4IUNEMKxaPa9vpiRrOg= - -batch@0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" - integrity sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY= - -big-rat@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/big-rat/-/big-rat-1.0.4.tgz#768d093bb57930dd18ed575c7fca27dc5391adea" - integrity sha1-do0JO7V5MN0Y7Vdcf8on3FORreo= - dependencies: - bit-twiddle "^1.0.2" - bn.js "^4.11.6" - double-bits "^1.1.1" - -big.js@^5.2.2: - version "5.2.2" - resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" - integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== - -binary-extensions@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" - integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== - -binary-search-bounds@^2.0.0, binary-search-bounds@^2.0.3, binary-search-bounds@^2.0.4: - version "2.0.5" - resolved "https://registry.yarnpkg.com/binary-search-bounds/-/binary-search-bounds-2.0.5.tgz#125e5bd399882f71e6660d4bf1186384e989fba7" - integrity sha512-H0ea4Fd3lS1+sTEB2TgcLoK21lLhwEJzlQv3IN47pJS976Gx4zoWe0ak3q+uYh60ppQxg9F16Ri4tS1sfD4+jA== - -bit-twiddle@^1.0.0, bit-twiddle@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/bit-twiddle/-/bit-twiddle-1.0.2.tgz#0c6c1fabe2b23d17173d9a61b7b7093eb9e1769e" - integrity sha1-DGwfq+KyPRcXPZpht7cJPrnhdp4= - -bit-twiddle@~0.0.1: - version "0.0.2" - resolved "https://registry.yarnpkg.com/bit-twiddle/-/bit-twiddle-0.0.2.tgz#c2eaebb952a3b94acc140497e1cdcd2f1a33f58e" - integrity sha1-wurruVKjuUrMFASX4c3NLxoz9Y4= - -bitmap-sdf@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/bitmap-sdf/-/bitmap-sdf-1.0.3.tgz#c99913e5729357a6fd350de34158180c013880b2" - integrity sha512-ojYySSvWTx21cbgntR942zgEgqj38wHctN64vr4vYRFf3GKVmI23YlA94meWGkFslidwLwGCsMy2laJ3g/94Sg== - dependencies: - clamp "^1.0.1" - -bl@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/bl/-/bl-2.2.1.tgz#8c11a7b730655c5d56898cdc871224f40fd901d5" - integrity sha512-6Pesp1w0DEX1N550i/uGV/TqucVL4AM/pgThFSN/Qq9si1/DF9aIHs1BxD8V/QU0HoeHO6cQRTAuYnLPKq1e4g== - dependencies: - readable-stream "^2.3.5" - safe-buffer "^5.1.1" - -bn.js@^4.11.6: - version "4.12.0" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" - integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== - -body-parser@1.19.0, body-parser@^1.19.0: - version "1.19.0" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a" - integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw== - dependencies: - bytes "3.1.0" - content-type "~1.0.4" - debug "2.6.9" - depd "~1.1.2" - http-errors "1.7.2" - iconv-lite "0.4.24" - on-finished "~2.3.0" - qs "6.7.0" - raw-body "2.4.0" - type-is "~1.6.17" - -bonjour@^3.5.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/bonjour/-/bonjour-3.5.0.tgz#8e890a183d8ee9a2393b3844c691a42bcf7bc9f5" - integrity sha1-jokKGD2O6aI5OzhExpGkK897yfU= - dependencies: - array-flatten "^2.1.0" - deep-equal "^1.0.1" - dns-equal "^1.0.0" - dns-txt "^2.0.2" - multicast-dns "^6.0.1" - multicast-dns-service-types "^1.1.0" - -bootstrap@4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-4.6.0.tgz#97b9f29ac98f98dfa43bf7468262d84392552fd7" - integrity sha512-Io55IuQY3kydzHtbGvQya3H+KorS/M9rSNyfCGCg9WZ4pyT/lCxIlpJgG1GXW/PswzC84Tr2fBYi+7+jFVQQBw== - -boundary-cells@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/boundary-cells/-/boundary-cells-2.0.2.tgz#ed28c5a2eb36500413e5714f8eec862ad8ffec14" - integrity sha512-/S48oUFYEgZMNvdqC87iYRbLBAPHYijPRNrNpm/sS8u7ijIViKm/hrV3YD4sx/W68AsG5zLMyBEditVHApHU5w== - -box-intersect@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/box-intersect/-/box-intersect-1.0.2.tgz#4693ad63e828868d0654b114e09364d6281f3fbd" - integrity sha512-yJeMwlmFPG1gIa7Rs/cGXeI6iOj6Qz5MG5PE61xLKpElUGzmJ4abm+qsLpzxKJFpsSDq742BQEocr8dI2t8Nxw== - dependencies: - bit-twiddle "^1.0.2" - typedarray-pool "^1.1.0" - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -braces@^3.0.1, braces@^3.0.2, braces@~3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== - dependencies: - fill-range "^7.0.1" - -browser-stdout@1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" - integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== - -browserslist@^4.0.0, browserslist@^4.14.5, browserslist@^4.16.6, browserslist@^4.17.5, browserslist@^4.18.1: - version "4.18.1" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.18.1.tgz#60d3920f25b6860eb917c6c7b185576f4d8b017f" - integrity sha512-8ScCzdpPwR2wQh8IT82CA2VgDwjHyqMovPBZSNH54+tm4Jk2pCuv90gmAdH6J84OCRWi0b4gMe6O6XPXuJnjgQ== - dependencies: - caniuse-lite "^1.0.30001280" - electron-to-chromium "^1.3.896" - escalade "^3.1.1" - node-releases "^2.0.1" - picocolors "^1.0.0" - -buble@^0.19.3: - version "0.19.8" - resolved "https://registry.yarnpkg.com/buble/-/buble-0.19.8.tgz#d642f0081afab66dccd897d7b6360d94030b9d3d" - integrity sha512-IoGZzrUTY5fKXVkgGHw3QeXFMUNBFv+9l8a4QJKG1JhG3nCMHTdEX1DCOg8568E2Q9qvAQIiSokv6Jsgx8p2cA== - dependencies: - acorn "^6.1.1" - acorn-dynamic-import "^4.0.0" - acorn-jsx "^5.0.1" - chalk "^2.4.2" - magic-string "^0.25.3" - minimist "^1.2.0" - os-homedir "^2.0.0" - regexpu-core "^4.5.4" - -bubleify@^1.1.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/bubleify/-/bubleify-1.2.1.tgz#c11fa33fa59d5b9b747d4e486f43889084257f37" - integrity sha512-vp3NHmaQVoKaKWvi15FTMinPNjfp+47+/kFJ9ifezdMF/CBLArCxDVUh+FQE3qRxCRj1qyjJqilTBHHqlM8MaQ== - dependencies: - buble "^0.19.3" - -buffer-from@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" - integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== - -buffer-indexof@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/buffer-indexof/-/buffer-indexof-1.1.1.tgz#52fabcc6a606d1a00302802648ef68f639da268c" - integrity sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g== - -bytes@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" - integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg= - -bytes@3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" - integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== - -call-bind@^1.0.0, call-bind@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" - integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== - dependencies: - function-bind "^1.1.1" - get-intrinsic "^1.0.2" - -callsites@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" - integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== - -camel-case@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-4.1.2.tgz#9728072a954f805228225a6deea6b38461e1bd5a" - integrity sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw== - dependencies: - pascal-case "^3.1.2" - tslib "^2.0.3" - -camelcase@^6.0.0: - version "6.2.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.2.1.tgz#250fd350cfd555d0d2160b1d51510eaf8326e86e" - integrity sha512-tVI4q5jjFV5CavAU8DXfza/TJcZutVKo/5Foskmsqcm0MsL91moHvwiGNnqaa2o6PF/7yT5ikDRcVcl8Rj6LCA== - -camelize@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/camelize/-/camelize-1.0.0.tgz#164a5483e630fa4321e5af07020e531831b2609b" - integrity sha1-FkpUg+Yw+kMh5a8HAg5TGDGyYJs= - -caniuse-lite@^1.0.30000655, caniuse-lite@^1.0.30001272, caniuse-lite@^1.0.30001280: - version "1.0.30001283" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001283.tgz#8573685bdae4d733ef18f78d44ba0ca5fe9e896b" - integrity sha512-9RoKo841j1GQFSJz/nCXOj0sD7tHBtlowjYlrqIUS812x9/emfBLBt6IyMz1zIaYc/eRL8Cs6HPUVi2Hzq4sIg== - -canvas-fit@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/canvas-fit/-/canvas-fit-1.5.0.tgz#ae13be66ade42f5be0e487e345fce30a5e5b5e5f" - integrity sha1-rhO+Zq3kL1vg5IfjRfzjCl5bXl8= - dependencies: - element-size "^1.1.1" - -capital-case@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/capital-case/-/capital-case-1.0.4.tgz#9d130292353c9249f6b00fa5852bee38a717e669" - integrity sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A== - dependencies: - no-case "^3.0.4" - tslib "^2.0.3" - upper-case-first "^2.0.2" - -ccount@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/ccount/-/ccount-1.1.0.tgz#246687debb6014735131be8abab2d93898f8d043" - integrity sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg== - -cdt2d@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/cdt2d/-/cdt2d-1.0.0.tgz#4f212434bcd67bdb3d68b8fef4acdc2c54415141" - integrity sha1-TyEkNLzWe9s9aLj+9KzcLFRBUUE= - dependencies: - binary-search-bounds "^2.0.3" - robust-in-sphere "^1.1.3" - robust-orientation "^1.1.3" - -cell-orientation@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/cell-orientation/-/cell-orientation-1.0.1.tgz#b504ad96a66ad286d9edd985a2253d03b80d2850" - integrity sha1-tQStlqZq0obZ7dmFoiU9A7gNKFA= - -chalk@^2.0.0, chalk@^2.4.1, chalk@^2.4.2: - version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -chalk@^4.1.0: - version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -change-case@^4.1.1: - version "4.1.2" - resolved "https://registry.yarnpkg.com/change-case/-/change-case-4.1.2.tgz#fedfc5f136045e2398c0410ee441f95704641e12" - integrity sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A== - dependencies: - camel-case "^4.1.2" - capital-case "^1.0.4" - constant-case "^3.0.4" - dot-case "^3.0.4" - header-case "^2.0.4" - no-case "^3.0.4" - param-case "^3.0.4" - pascal-case "^3.1.2" - path-case "^3.0.4" - sentence-case "^3.0.4" - snake-case "^3.0.4" - tslib "^2.0.3" - -character-entities-legacy@^1.0.0: - version "1.1.4" - resolved "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz#94bc1845dce70a5bb9d2ecc748725661293d8fc1" - integrity sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA== - -character-entities@^1.0.0: - version "1.2.4" - resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-1.2.4.tgz#e12c3939b7eaf4e5b15e7ad4c5e28e1d48c5b16b" - integrity sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw== - -character-reference-invalid@^1.0.0: - version "1.1.4" - resolved "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz#083329cda0eae272ab3dbbf37e9a382c13af1560" - integrity sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg== - -chokidar@3.5.2, chokidar@^3.5.1: - version "3.5.2" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.2.tgz#dba3976fcadb016f66fd365021d91600d01c1e75" - integrity sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ== - dependencies: - anymatch "~3.1.2" - braces "~3.0.2" - glob-parent "~5.1.2" - is-binary-path "~2.1.0" - is-glob "~4.0.1" - normalize-path "~3.0.0" - readdirp "~3.6.0" - optionalDependencies: - fsevents "~2.3.2" - -chrome-trace-event@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" - integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== - -circumcenter@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/circumcenter/-/circumcenter-1.0.0.tgz#20d7aa13b17fbac52f52da4f54c6ac8b906ee529" - integrity sha1-INeqE7F/usUvUtpPVMasi5Bu5Sk= - dependencies: - dup "^1.0.0" - robust-linear-solve "^1.0.0" - -circumradius@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/circumradius/-/circumradius-1.0.0.tgz#706c447e3e55cd1ed3d11bd133e37c252cc305b5" - integrity sha1-cGxEfj5VzR7T0RvRM+N8JSzDBbU= - dependencies: - circumcenter "^1.0.0" - -clamp@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/clamp/-/clamp-1.0.1.tgz#66a0e64011816e37196828fdc8c8c147312c8634" - integrity sha1-ZqDmQBGBbjcZaCj9yMjBRzEshjQ= - -classnames@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.3.1.tgz#dfcfa3891e306ec1dad105d0e88f4417b8535e8e" - integrity sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA== - -clean-css@^5.2.2: - version "5.2.2" - resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-5.2.2.tgz#d3a7c6ee2511011e051719838bdcf8314dc4548d" - integrity sha512-/eR8ru5zyxKzpBLv9YZvMXgTSSQn7AdkMItMYynsFgGwTveCRVam9IUPFloE85B4vAIj05IuKmmEoV7/AQjT0w== - dependencies: - source-map "~0.6.0" - -clean-pslg@^1.1.0, clean-pslg@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/clean-pslg/-/clean-pslg-1.1.2.tgz#bd35c7460b7e8ab5a9f761a5ed51796aa3c86c11" - integrity sha1-vTXHRgt+irWp92Gl7VF5aqPIbBE= - dependencies: - big-rat "^1.0.3" - box-intersect "^1.0.1" - nextafter "^1.0.0" - rat-vec "^1.1.1" - robust-segment-intersect "^1.0.1" - union-find "^1.0.2" - uniq "^1.0.1" - -clean-stack@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" - integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== - -cliui@^7.0.2: - version "7.0.4" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" - integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.0" - wrap-ansi "^7.0.0" - -clone-deep@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" - integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== - dependencies: - is-plain-object "^2.0.4" - kind-of "^6.0.2" - shallow-clone "^3.0.0" - -clsx@^1.0.4: - version "1.1.1" - resolved "https://registry.yarnpkg.com/clsx/-/clsx-1.1.1.tgz#98b3134f9abbdf23b2663491ace13c5c03a73188" - integrity sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA== - -color-alpha@^1.0.4: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-alpha/-/color-alpha-1.1.3.tgz#71250189e9f02bba8261a94d5e7d5f5606d1749a" - integrity sha512-krPYBO1RSO5LH4AGb/b6z70O1Ip2o0F0+0cVFN5FN99jfQtZFT08rQyg+9oOBNJYAn3SRwJIFC8jUEOKz7PisA== - dependencies: - color-parse "^1.4.1" - -color-convert@^1.9.0: - version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== - dependencies: - color-name "1.1.3" - -color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== - dependencies: - color-name "~1.1.4" - -color-id@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/color-id/-/color-id-1.1.0.tgz#5e9159b99a73ac98f74820cb98a15fde3d7e034c" - integrity sha512-2iRtAn6dC/6/G7bBIo0uupVrIne1NsQJvJxZOBCzQOfk7jRq97feaDZ3RdzuHakRXXnHGNwglto3pqtRx1sX0g== - dependencies: - clamp "^1.0.1" - -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= - -color-name@^1.0.0, color-name@^1.1.4, color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -color-normalize@^1.5.0: - version "1.5.2" - resolved "https://registry.yarnpkg.com/color-normalize/-/color-normalize-1.5.2.tgz#d6c8beb02966849548f91a6ac0274c6f19924509" - integrity sha512-yYMIoyFJmUoKbCK6sBShljBWfkt8DXVfaZJn9/zvRJkF9eQJDbZhcYC6LdOVy40p4tfVwYYb9cXl8oqpu7pzBw== - dependencies: - color-rgba "^2.2.0" - dtype "^2.0.0" - -color-parse@^1.4.1: - version "1.4.2" - resolved "https://registry.yarnpkg.com/color-parse/-/color-parse-1.4.2.tgz#78651f5d34df1a57f997643d86f7f87268ad4eb5" - integrity sha512-RI7s49/8yqDj3fECFZjUI1Yi0z/Gq1py43oNJivAIIDSyJiOZLfYCRQEgn8HEVAj++PcRe8AnL2XF0fRJ3BTnA== - dependencies: - color-name "^1.0.0" - -color-rgba@^2.1.1, color-rgba@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/color-rgba/-/color-rgba-2.3.0.tgz#d5eb481d7933d2542d1f222ea10ad40d159e9d35" - integrity sha512-z/5fMOY8/IzrBHPBk+n3ATNSM/1atXcHCRPTGPLlzYJ4fn7CRD46zzt3lkLtQ44cL8UIUU4JBXDVrhWj1khiwg== - dependencies: - color-parse "^1.4.1" - color-space "^1.14.6" - -color-space@^1.14.6: - version "1.16.0" - resolved "https://registry.yarnpkg.com/color-space/-/color-space-1.16.0.tgz#611781bca41cd8582a1466fd9e28a7d3d89772a2" - integrity sha512-A6WMiFzunQ8KEPFmj02OnnoUnqhmSaHaZ/0LVFcPTdlvm8+3aMJ5x1HRHy3bDHPkovkf4sS0f4wsVvwk71fKkg== - dependencies: - hsluv "^0.0.3" - mumath "^3.3.4" - -colorette@^2.0.10, colorette@^2.0.14: - version "2.0.16" - resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.16.tgz#713b9af84fdb000139f04546bd4a93f62a5085da" - integrity sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g== - -colormap@^2.3.1: - version "2.3.2" - resolved "https://registry.yarnpkg.com/colormap/-/colormap-2.3.2.tgz#4422c1178ce563806e265b96782737be85815abf" - integrity sha512-jDOjaoEEmA9AgA11B/jCSAvYE95r3wRoAyTf3LEHGiUVlNHJaL1mRkf5AyLSpQBVGfTEPwGEqCIzL+kgr2WgNA== - dependencies: - lerp "^1.0.3" - -colors@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" - integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== - -combokeys@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/combokeys/-/combokeys-3.0.1.tgz#fc8ca5c3f5f2d2b03a458544cb88b14ab5f53f86" - integrity sha512-5nAfaLZ3oO3kA+/xdoL7t197UJTz2WWidyH3BBeU6hqHtvyFERICd0y3DQFrQkJFTKBrtUDck/xCLLoFpnjaCw== - -commander@2, commander@^2.15.1, commander@^2.20.0: - version "2.20.3" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" - integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== - -commander@^7.0.0, commander@^7.2.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" - integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== - -commander@^8.3.0: - version "8.3.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" - integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== - -commondir@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" - integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= - -compare-angle@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/compare-angle/-/compare-angle-1.0.1.tgz#a4eb63416ea3c747fc6bd6c8b63668b4de4fa129" - integrity sha1-pOtjQW6jx0f8a9bItjZotN5PoSk= - dependencies: - robust-orientation "^1.0.2" - robust-product "^1.0.0" - robust-sum "^1.0.0" - signum "^0.0.0" - two-sum "^1.0.0" - -compare-cell@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/compare-cell/-/compare-cell-1.0.0.tgz#a9eb708f6e0e41aef7aa566b130f1968dc9e1aaa" - integrity sha1-qetwj24OQa73qlZrEw8ZaNyeGqo= - -compare-oriented-cell@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/compare-oriented-cell/-/compare-oriented-cell-1.0.1.tgz#6a149feef9dfc4f8fc62358e51dd42effbbdc39e" - integrity sha1-ahSf7vnfxPj8YjWOUd1C7/u9w54= - dependencies: - cell-orientation "^1.0.1" - compare-cell "^1.0.0" - -compile-code-loader@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/compile-code-loader/-/compile-code-loader-1.0.0.tgz#492002e69e0ce91dff42bec420bbaf575f4c9c4a" - integrity sha512-MFE1K+xC3f28urqFQ/7LGAzl/MZXzrFz5n3Tp83n6DwiucAVPkbB+z18D7Z0BqvmcuFiYy6hgm9sGrF/mbyZUw== - dependencies: - loader-utils "^2.0.0" - -component-emitter@~1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" - integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== - -compressible@~2.0.16: - version "2.0.18" - resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" - integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== - dependencies: - mime-db ">= 1.43.0 < 2" - -compression@^1.7.4: - version "1.7.4" - resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f" - integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== - dependencies: - accepts "~1.3.5" - bytes "3.0.0" - compressible "~2.0.16" - debug "2.6.9" - on-headers "~1.0.2" - safe-buffer "5.1.2" - vary "~1.1.2" - -compute-dims@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/compute-dims/-/compute-dims-1.1.0.tgz#6d5b712929b6c531af3b4d580ed5adacbbd77e0c" - integrity sha512-YHMiIKjH/8Eom8zATk3g8/lH3HxGCZcVQyEfEoVrfWI7od/WRpTgRGShnei3jArYSx77mQqPxZNokjGHCdLfxg== - dependencies: - utils-copy "^1.0.0" - validate.io-array "^1.0.6" - validate.io-matrix-like "^1.0.2" - validate.io-ndarray-like "^1.0.0" - validate.io-positive-integer "^1.0.0" - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= - -concat-stream@^1.5.2: - version "1.6.2" - resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" - integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== - dependencies: - buffer-from "^1.0.0" - inherits "^2.0.3" - readable-stream "^2.2.2" - typedarray "^0.0.6" - -conic-gradient@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/conic-gradient/-/conic-gradient-1.0.0.tgz#0bd7aaddeaa14aa5a7c08b22a6ee90613f610479" - integrity sha512-TEmM3Ondx8nid2AN0Rsw6eQG7PgTUkL6gs90UqX1cNqO/bpt/H/Rw6DwbzoylQ9SSxqLG1SsteAr9/yBsAzdtw== - dependencies: - prefixfree "^1.0.0" - -connect-history-api-fallback@^1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz#8b32089359308d111115d81cad3fceab888f97bc" - integrity sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg== - -connect@^3.7.0: - version "3.7.0" - resolved "https://registry.yarnpkg.com/connect/-/connect-3.7.0.tgz#5d49348910caa5e07a01800b030d0c35f20484f8" - integrity sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ== - dependencies: - debug "2.6.9" - finalhandler "1.1.2" - parseurl "~1.3.3" - utils-merge "1.0.1" - -"consolidated-events@^1.1.0 || ^2.0.0": - version "2.0.2" - resolved "https://registry.yarnpkg.com/consolidated-events/-/consolidated-events-2.0.2.tgz#da8d8f8c2b232831413d9e190dc11669c79f4a91" - integrity sha512-2/uRVMdRypf5z/TW/ncD/66l75P5hH2vM/GR8Jf8HLc2xnfJtmina6F6du8+v4Z2vTrMo7jC+W1tmEEuuELgkQ== - -const-max-uint32@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/const-max-uint32/-/const-max-uint32-1.0.2.tgz#f009bb6230e678ed874dd2d6a9cd9e3cbfabb676" - integrity sha1-8Am7YjDmeO2HTdLWqc2ePL+rtnY= - -const-pinf-float64@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/const-pinf-float64/-/const-pinf-float64-1.0.0.tgz#f6efb0d79f9c0986d3e79f2923abf9b70b63d726" - integrity sha1-9u+w15+cCYbT558pI6v5twtj1yY= - -constant-case@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/constant-case/-/constant-case-3.0.4.tgz#3b84a9aeaf4cf31ec45e6bf5de91bdfb0589faf1" - integrity sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ== - dependencies: - no-case "^3.0.4" - tslib "^2.0.3" - upper-case "^2.0.2" - -content-disposition@0.5.3: - version "0.5.3" - resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd" - integrity sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g== - dependencies: - safe-buffer "5.1.2" - -content-type@~1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" - integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== - -convert-source-map@^1.7.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369" - integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA== - dependencies: - safe-buffer "~5.1.1" - -convex-hull@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/convex-hull/-/convex-hull-1.0.3.tgz#20a3aa6ce87f4adea2ff7d17971c9fc1c67e1fff" - integrity sha1-IKOqbOh/St6i/30XlxyfwcZ+H/8= - dependencies: - affine-hull "^1.0.0" - incremental-convex-hull "^1.0.1" - monotone-convex-hull-2d "^1.0.1" - -cookie-signature@1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" - integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= - -cookie@0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba" - integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg== - -cookie@~0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.1.tgz#afd713fe26ebd21ba95ceb61f9a8116e50a537d1" - integrity sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA== - -core-js-compat@^3.18.0, core-js-compat@^3.19.1: - version "3.19.2" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.19.2.tgz#18066a3404a302433cb0aa8be82dd3d75c76e5c4" - integrity sha512-ObBY1W5vx/LFFMaL1P5Udo4Npib6fu+cMokeziWkA8Tns4FcDemKF5j9JvaI5JhdkW8EQJQGJN1EcrzmEwuAqQ== - dependencies: - browserslist "^4.18.1" - semver "7.0.0" - -core-js@3.12.1: - version "3.12.1" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.12.1.tgz#6b5af4ff55616c08a44d386f1f510917ff204112" - integrity sha512-Ne9DKPHTObRuB09Dru5AjwKjY4cJHVGu+y5f7coGn1E9Grkc3p2iBwE9AI/nJzsE29mQF7oq+mhYYRqOMFN1Bw== - -core-util-is@~1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" - integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== - -cors@~2.8.5: - version "2.8.5" - resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" - integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== - dependencies: - object-assign "^4" - vary "^1" - -cosmiconfig@^7.0.0: - version "7.0.1" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.1.tgz#714d756522cace867867ccb4474c5d01bbae5d6d" - integrity sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ== - dependencies: - "@types/parse-json" "^4.0.0" - import-fresh "^3.2.1" - parse-json "^5.0.0" - path-type "^4.0.0" - yaml "^1.10.0" - -country-regex@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/country-regex/-/country-regex-1.1.0.tgz#51c333dcdf12927b7e5eeb9c10ac8112a6120896" - integrity sha1-UcMz3N8Sknt+XuucEKyBEqYSCJY= - -cross-spawn@^7.0.3: - version "7.0.3" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" - integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - -css-blank-pseudo@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/css-blank-pseudo/-/css-blank-pseudo-2.0.0.tgz#10667f9c5f91e4fbde76c4efac55e8eaa6ed9967" - integrity sha512-n7fxEOyuvAVPLPb9kL4XTIK/gnp2fKQ7KFQ+9lj60W9pDn/jTr5LjS/kHHm+rES/YJ3m0S6+uJgYSuAJg9zOyA== - -css-color-keywords@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/css-color-keywords/-/css-color-keywords-1.0.0.tgz#fea2616dc676b2962686b3af8dbdbe180b244e05" - integrity sha1-/qJhbcZ2spYmhrOvjb2+GAskTgU= - -css-font-size-keywords@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/css-font-size-keywords/-/css-font-size-keywords-1.0.0.tgz#854875ace9aca6a8d2ee0d345a44aae9bb6db6cb" - integrity sha1-hUh1rOmspqjS7g00WkSq6btttss= - -css-font-stretch-keywords@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/css-font-stretch-keywords/-/css-font-stretch-keywords-1.0.1.tgz#50cee9b9ba031fb5c952d4723139f1e107b54b10" - integrity sha1-UM7puboDH7XJUtRyMTnx4Qe1SxA= - -css-font-style-keywords@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/css-font-style-keywords/-/css-font-style-keywords-1.0.1.tgz#5c3532813f63b4a1de954d13cea86ab4333409e4" - integrity sha1-XDUygT9jtKHelU0TzqhqtDM0CeQ= - -css-font-weight-keywords@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/css-font-weight-keywords/-/css-font-weight-keywords-1.0.0.tgz#9bc04671ac85bc724b574ef5d3ac96b0d604fd97" - integrity sha1-m8BGcayFvHJLV07106yWsNYE/Zc= - -css-font@^1.0.0, css-font@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/css-font/-/css-font-1.2.0.tgz#e73cbdc11fd87c8e6c928ad7098a9771c8c2b6e3" - integrity sha512-V4U4Wps4dPDACJ4WpgofJ2RT5Yqwe1lEH6wlOOaIxMi0gTjdIijsc5FmxQlZ7ZZyKQkkutqqvULOp07l9c7ssA== - dependencies: - css-font-size-keywords "^1.0.0" - css-font-stretch-keywords "^1.0.1" - css-font-style-keywords "^1.0.1" - css-font-weight-keywords "^1.0.0" - css-global-keywords "^1.0.1" - css-system-font-keywords "^1.0.0" - pick-by-alias "^1.2.0" - string-split-by "^1.0.0" - unquote "^1.1.0" - -css-global-keywords@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/css-global-keywords/-/css-global-keywords-1.0.1.tgz#72a9aea72796d019b1d2a3252de4e5aaa37e4a69" - integrity sha1-cqmupyeW0Bmx0qMlLeTlqqN+Smk= - -css-has-pseudo@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/css-has-pseudo/-/css-has-pseudo-2.0.0.tgz#43ae03a990cf3d9e7356837c6b500e04037606b5" - integrity sha512-URYSGI0ggED1W1/xOAH0Zn1bf+YL6tYh1PQzAPlWddEAyyO37mPqMbwCzSjTTNmeCR8BMNXSFLaT5xb6MERdAA== - dependencies: - postcss-selector-parser "^6" - -css-in-js-utils@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/css-in-js-utils/-/css-in-js-utils-2.0.1.tgz#3b472b398787291b47cfe3e44fecfdd9e914ba99" - integrity sha512-PJF0SpJT+WdbVVt0AOYp9C8GnuruRlL/UFW7932nLWmFLQTaWEzTBQEx7/hn4BuV+WON75iAViSUJLiU3PKbpA== - dependencies: - hyphenate-style-name "^1.0.2" - isobject "^3.0.1" - -css-in-js-utils@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/css-in-js-utils/-/css-in-js-utils-3.1.0.tgz#640ae6a33646d401fc720c54fc61c42cd76ae2bb" - integrity sha512-fJAcud6B3rRu+KHYk+Bwf+WFL2MDCJJ1XG9x137tJQ0xYxor7XziQtuGFbWNdqrvF4Tk26O3H73nfVqXt/fW1A== - dependencies: - hyphenate-style-name "^1.0.3" - -css-loader@6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-6.3.0.tgz#334d3500ff0a0c14cfbd4b0670088dbb5b5c1530" - integrity sha512-9NGvHOR+L6ps13Ilw/b216++Q8q+5RpJcVufCdW9S/9iCzs4KBDNa8qnA/n3FK/sSfWmH35PAIK/cfPi7LOSUg== - dependencies: - icss-utils "^5.1.0" - postcss "^8.2.15" - postcss-modules-extract-imports "^3.0.0" - postcss-modules-local-by-default "^4.0.0" - postcss-modules-scope "^3.0.0" - postcss-modules-values "^4.0.0" - postcss-value-parser "^4.1.0" - semver "^7.3.5" - -css-loader@^6.5.1: - version "6.5.1" - resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-6.5.1.tgz#0c43d4fbe0d97f699c91e9818cb585759091d1b1" - integrity sha512-gEy2w9AnJNnD9Kuo4XAP9VflW/ujKoS9c/syO+uWMlm5igc7LysKzPXaDoR2vroROkSwsTS2tGr1yGGEbZOYZQ== - dependencies: - icss-utils "^5.1.0" - postcss "^8.2.15" - postcss-modules-extract-imports "^3.0.0" - postcss-modules-local-by-default "^4.0.0" - postcss-modules-scope "^3.0.0" - postcss-modules-values "^4.0.0" - postcss-value-parser "^4.1.0" - semver "^7.3.5" - -css-prefers-color-scheme@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/css-prefers-color-scheme/-/css-prefers-color-scheme-5.0.0.tgz#a89bc1abfe946e77a1a1e12dbc25a1439705933f" - integrity sha512-XpzVrdwbppHm+Nnrzcb/hQb8eq1aKv4U8Oh59LsLfTsbIZZ6Fvn9razb66ihH2aTJ0VhO9n9sVm8piyKXJAZMA== - -css-system-font-keywords@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/css-system-font-keywords/-/css-system-font-keywords-1.0.0.tgz#85c6f086aba4eb32c571a3086affc434b84823ed" - integrity sha1-hcbwhquk6zLFcaMIav/ENLhII+0= - -css-to-react-native@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/css-to-react-native/-/css-to-react-native-3.0.0.tgz#62dbe678072a824a689bcfee011fc96e02a7d756" - integrity sha512-Ro1yETZA813eoyUp2GDBhG2j+YggidUmzO1/v9eYBKR2EHVEniE2MI/NqpTQ954BMpTPZFsGNPm46qFB9dpaPQ== - dependencies: - camelize "^1.0.0" - css-color-keywords "^1.0.0" - postcss-value-parser "^4.0.2" - -csscolorparser@~1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/csscolorparser/-/csscolorparser-1.0.3.tgz#b34f391eea4da8f3e98231e2ccd8df9c041f171b" - integrity sha1-s085HupNqPPpgjHizNjfnAQfFxs= - -cssdb@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/cssdb/-/cssdb-5.0.0.tgz#96db23e70dda3d03a32346de611f0e79fee68b7f" - integrity sha512-Q7982SynYCtcLUBCPgUPFy2TZmDiFyimpdln8K2v4w2c07W4rXL7q5F1ksVAqOAQfxKyyUGCKSsioezKT5bU1Q== - -cssesc@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" - integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== - -csstype@^3.0.10, csstype@^3.0.2: - version "3.0.10" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.10.tgz#2ad3a7bed70f35b965707c092e5f30b327c290e5" - integrity sha512-2u44ZG2OcNUO9HDp/Jl8C07x6pU/eTR3ncV91SiK3dhG9TWvRVsCoJw14Ckx5DgWkzGA3waZWO3d7pgqpUI/XA== - -cubic-hermite@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/cubic-hermite/-/cubic-hermite-1.0.0.tgz#84e3b2f272b31454e8393b99bb6aed45168c14e5" - integrity sha1-hOOy8nKzFFToOTuZu2rtRRaMFOU= - -custom-event@~1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/custom-event/-/custom-event-1.0.1.tgz#5d02a46850adf1b4a317946a3928fccb5bfd0425" - integrity sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU= - -cwise-compiler@^1.0.0, cwise-compiler@^1.1.2: - version "1.1.3" - resolved "https://registry.yarnpkg.com/cwise-compiler/-/cwise-compiler-1.1.3.tgz#f4d667410e850d3a313a7d2db7b1e505bb034cc5" - integrity sha1-9NZnQQ6FDToxOn0tt7HlBbsDTMU= - dependencies: - uniq "^1.0.0" - -d3-array@1, d3-array@^1.2.1: - version "1.2.4" - resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-1.2.4.tgz#635ce4d5eea759f6f605863dbcfc30edc737f71f" - integrity sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw== - -d3-collection@1, d3-collection@^1.0.4: - version "1.0.7" - resolved "https://registry.yarnpkg.com/d3-collection/-/d3-collection-1.0.7.tgz#349bd2aa9977db071091c13144d5e4f16b5b310e" - integrity sha512-ii0/r5f4sjKNTfh84Di+DpztYwqKhEyUlKoPrzUFfeSkWxjW49xU2QzO9qrPrNkpdI0XJkfzvmTu8V2Zylln6A== - -d3-color@1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/d3-color/-/d3-color-1.4.1.tgz#c52002bf8846ada4424d55d97982fef26eb3bc8a" - integrity sha512-p2sTHSLCJI2QKunbGb7ocOh7DgTAn8IrLx21QRc/BSnodXM4sv6aLQlnfpvehFMLZEfBc6g9pH9SWQccFYfJ9Q== - -d3-dispatch@1: - version "1.0.6" - resolved "https://registry.yarnpkg.com/d3-dispatch/-/d3-dispatch-1.0.6.tgz#00d37bcee4dd8cd97729dd893a0ac29caaba5d58" - integrity sha512-fVjoElzjhCEy+Hbn8KygnmMS7Or0a9sI2UzGwoB7cCtvI1XpVN9GpoYlnb3xt2YV66oXYb1fLJ8GMvP4hdU1RA== - -d3-force@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/d3-force/-/d3-force-1.2.1.tgz#fd29a5d1ff181c9e7f0669e4bd72bdb0e914ec0b" - integrity sha512-HHvehyaiUlVo5CxBJ0yF/xny4xoaxFxDnBXNvNcfW9adORGZfyNF1dj6DGLKyk4Yh3brP/1h3rnDzdIAwL08zg== - dependencies: - d3-collection "1" - d3-dispatch "1" - d3-quadtree "1" - d3-timer "1" - -d3-hierarchy@^1.1.9: - version "1.1.9" - resolved "https://registry.yarnpkg.com/d3-hierarchy/-/d3-hierarchy-1.1.9.tgz#2f6bee24caaea43f8dc37545fa01628559647a83" - integrity sha512-j8tPxlqh1srJHAtxfvOUwKNYJkQuBFdM1+JAUfq6xqH5eAqf93L7oG1NVqDa4CpFZNvnNKtCYEUC8KY9yEn9lQ== - -d3-interpolate@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/d3-interpolate/-/d3-interpolate-1.4.0.tgz#526e79e2d80daa383f9e0c1c1c7dcc0f0583e987" - integrity sha512-V9znK0zc3jOPV4VD2zZn0sDhZU3WAE2bmlxdIwwQPPzPjvyLkd8B3JUVdS1IDUFDkWZ72c9qnv1GK2ZagTZ8EA== - dependencies: - d3-color "1" - -d3-path@1: - version "1.0.9" - resolved "https://registry.yarnpkg.com/d3-path/-/d3-path-1.0.9.tgz#48c050bb1fe8c262493a8caf5524e3e9591701cf" - integrity sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg== - -d3-quadtree@1: - version "1.0.7" - resolved "https://registry.yarnpkg.com/d3-quadtree/-/d3-quadtree-1.0.7.tgz#ca8b84df7bb53763fe3c2f24bd435137f4e53135" - integrity sha512-RKPAeXnkC59IDGD0Wu5mANy0Q2V28L+fNe65pOCXVdVuTJS3WPKaJlFHer32Rbh9gIo9qMuJXio8ra4+YmIymA== - -d3-shape@^1.2.0: - version "1.3.7" - resolved "https://registry.yarnpkg.com/d3-shape/-/d3-shape-1.3.7.tgz#df63801be07bc986bc54f63789b4fe502992b5d7" - integrity sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw== - dependencies: - d3-path "1" - -d3-timer@1: - version "1.0.10" - resolved "https://registry.yarnpkg.com/d3-timer/-/d3-timer-1.0.10.tgz#dfe76b8a91748831b13b6d9c793ffbd508dd9de5" - integrity sha512-B1JDm0XDaQC+uvo4DT79H0XmBskgS3l6Ve+1SBCfxgmtIb1AVrPIoqd+nPSv+loMX8szQ0sVUhGngL7D5QPiXw== - -d3@^3.5.17: - version "3.5.17" - resolved "https://registry.yarnpkg.com/d3/-/d3-3.5.17.tgz#bc46748004378b21a360c9fc7cf5231790762fb8" - integrity sha1-vEZ0gAQ3iyGjYMn8fPUjF5B2L7g= - -d@1, d@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a" - integrity sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA== - dependencies: - es5-ext "^0.10.50" - type "^1.0.1" - -date-fns@^2.27.0: - version "2.28.0" - resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.28.0.tgz#9570d656f5fc13143e50c975a3b6bbeb46cd08b2" - integrity sha512-8d35hViGYx/QH0icHYCeLmsLmMUheMmTyV9Fcm6gvNwdw31yXXH+O85sOBJ+OLnLQMKZowvpKb6FgMIQjcpvQw== - -date-format@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/date-format/-/date-format-2.1.0.tgz#31d5b5ea211cf5fd764cd38baf9d033df7e125cf" - integrity sha512-bYQuGLeFxhkxNOF3rcMtiZxvCBAquGzZm6oWA1oZ0g2THUzivaRhv8uOhdr19LmoobSOLoIAxeUK2RdbM8IFTA== - -date-format@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/date-format/-/date-format-3.0.0.tgz#eb8780365c7d2b1511078fb491e6479780f3ad95" - integrity sha512-eyTcpKOcamdhWJXj56DpQMo1ylSQpcGtGKXcU0Tb97+K56/CF5amAqqqNj0+KvA0iw2ynxtHWFsPDSClCxe48w== - -debug@2.6.9: - version "2.6.9" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" - integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== - dependencies: - ms "2.0.0" - -debug@4.3.2: - version "4.3.2" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.2.tgz#f0a49c18ac8779e31d4a0c6029dfb76873c7428b" - integrity sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw== - dependencies: - ms "2.1.2" - -debug@^3.1.1: - version "3.2.7" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" - integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== - dependencies: - ms "^2.1.1" - -debug@^4.0.0, debug@^4.1.0, debug@^4.1.1, debug@~4.3.1: - version "4.3.3" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664" - integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q== - dependencies: - ms "2.1.2" - -decamelize@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" - integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== - -deep-equal@^1.0.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.1.1.tgz#b5c98c942ceffaf7cb051e24e1434a25a2e6076a" - integrity sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g== - dependencies: - is-arguments "^1.0.4" - is-date-object "^1.0.1" - is-regex "^1.0.4" - object-is "^1.0.1" - object-keys "^1.1.1" - regexp.prototype.flags "^1.2.0" - -deep-equal@^2.0.4: - version "2.0.5" - resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-2.0.5.tgz#55cd2fe326d83f9cbf7261ef0e060b3f724c5cb9" - integrity sha512-nPiRgmbAtm1a3JsnLCf6/SLfXcjyN5v8L1TXzdCmHrXJ4hx+gW/w1YCcn7z8gJtSiDArZCgYtbao3QqLm/N1Sw== - dependencies: - call-bind "^1.0.0" - es-get-iterator "^1.1.1" - get-intrinsic "^1.0.1" - is-arguments "^1.0.4" - is-date-object "^1.0.2" - is-regex "^1.1.1" - isarray "^2.0.5" - object-is "^1.1.4" - object-keys "^1.1.1" - object.assign "^4.1.2" - regexp.prototype.flags "^1.3.0" - side-channel "^1.0.3" - which-boxed-primitive "^1.0.1" - which-collection "^1.0.1" - which-typed-array "^1.1.2" - -deep-is@~0.1.3: - version "0.1.4" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" - integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== - -default-gateway@^6.0.0: - version "6.0.3" - resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-6.0.3.tgz#819494c888053bdb743edbf343d6cdf7f2943a71" - integrity sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg== - dependencies: - execa "^5.0.0" - -define-lazy-prop@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" - integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== - -define-properties@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" - integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== - dependencies: - object-keys "^1.0.12" - -defined@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" - integrity sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM= - -del@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/del/-/del-6.0.0.tgz#0b40d0332cea743f1614f818be4feb717714c952" - integrity sha512-1shh9DQ23L16oXSZKB2JxpL7iMy2E0S9d517ptA1P8iw0alkPtQcrKH7ru31rYtKwF499HkTu+DRzq3TCKDFRQ== - dependencies: - globby "^11.0.1" - graceful-fs "^4.2.4" - is-glob "^4.0.1" - is-path-cwd "^2.2.0" - is-path-inside "^3.0.2" - p-map "^4.0.0" - rimraf "^3.0.2" - slash "^3.0.0" - -delaunay-triangulate@^1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/delaunay-triangulate/-/delaunay-triangulate-1.1.6.tgz#5bbca21b078198d4bc3c75796a35cbb98c25954c" - integrity sha1-W7yiGweBmNS8PHV5ajXLuYwllUw= - dependencies: - incremental-convex-hull "^1.0.1" - uniq "^1.0.1" - -depd@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" - integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= - -destroy@~1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" - integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= - -detect-kerning@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/detect-kerning/-/detect-kerning-2.1.2.tgz#4ecd548e4a5a3fc880fe2a50609312d000fa9fc2" - integrity sha512-I3JIbrnKPAntNLl1I6TpSQQdQ4AutYzv/sKMFKbepawV/hlH0GmYKhUoOEMd4xqaUHT+Bm0f4127lh5qs1m1tw== - -detect-node@^2.0.4: - version "2.1.0" - resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1" - integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== - -di@^0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/di/-/di-0.0.1.tgz#806649326ceaa7caa3306d75d985ea2748ba913c" - integrity sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw= - -diff@5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b" - integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w== - -dir-glob@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" - integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== - dependencies: - path-type "^4.0.0" - -dns-equal@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d" - integrity sha1-s55/HabrCnW6nBcySzR1PEfgZU0= - -dns-packet@^1.3.1: - version "1.3.4" - resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-1.3.4.tgz#e3455065824a2507ba886c55a89963bb107dec6f" - integrity sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA== - dependencies: - ip "^1.1.0" - safe-buffer "^5.0.1" - -dns-txt@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/dns-txt/-/dns-txt-2.0.2.tgz#b91d806f5d27188e4ab3e7d107d881a1cc4642b6" - integrity sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY= - dependencies: - buffer-indexof "^1.0.0" - -dom-helpers@^5.1.3: - version "5.2.1" - resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-5.2.1.tgz#d9400536b2bf8225ad98fe052e029451ac40e902" - integrity sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA== - dependencies: - "@babel/runtime" "^7.8.7" - csstype "^3.0.2" - -dom-serialize@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/dom-serialize/-/dom-serialize-2.2.1.tgz#562ae8999f44be5ea3076f5419dcd59eb43ac95b" - integrity sha1-ViromZ9Evl6jB29UGdzVnrQ6yVs= - dependencies: - custom-event "~1.0.0" - ent "~2.2.0" - extend "^3.0.0" - void-elements "^2.0.0" - -dom-serializer@^1.0.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.3.2.tgz#6206437d32ceefaec7161803230c7a20bc1b4d91" - integrity sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig== - dependencies: - domelementtype "^2.0.1" - domhandler "^4.2.0" - entities "^2.0.0" - -domelementtype@^2.0.1, domelementtype@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.2.0.tgz#9a0b6c2782ed6a1c7323d42267183df9bd8b1d57" - integrity sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A== - -domhandler@^4.0, domhandler@^4.2.0, domhandler@^4.2.2: - version "4.2.2" - resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.2.2.tgz#e825d721d19a86b8c201a35264e226c678ee755f" - integrity sha512-PzE9aBMsdZO8TK4BnuJwH0QT41wgMbRzuZrHUcpYncEjmQazq8QEaBWgLG7ZyC/DAZKEgglpIA6j4Qn/HmxS3w== - dependencies: - domelementtype "^2.2.0" - -domutils@^2.8.0: - version "2.8.0" - resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.8.0.tgz#4437def5db6e2d1f5d6ee859bd95ca7d02048135" - integrity sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A== - dependencies: - dom-serializer "^1.0.1" - domelementtype "^2.2.0" - domhandler "^4.2.0" - -dot-case@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-3.0.4.tgz#9b2b670d00a431667a8a75ba29cd1b98809ce751" - integrity sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w== - dependencies: - no-case "^3.0.4" - tslib "^2.0.3" - -double-bits@^1.1.0, double-bits@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/double-bits/-/double-bits-1.1.1.tgz#58abba45494da4d0fa36b73ad11a286c9184b1c6" - integrity sha1-WKu6RUlNpND6Nrc60RoobJGEscY= - -draw-svg-path@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/draw-svg-path/-/draw-svg-path-1.0.0.tgz#6f116d962dd314b99ea534d6f58dd66cdbd69379" - integrity sha1-bxFtli3TFLmepTTW9Y3WbNvWk3k= - dependencies: - abs-svg-path "~0.1.1" - normalize-svg-path "~0.1.0" - -dtype@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/dtype/-/dtype-2.0.0.tgz#cd052323ce061444ecd2e8f5748f69a29be28434" - integrity sha1-zQUjI84GFETs0uj1dI9popvihDQ= - -dukat@0.5.8-rc.4: - version "0.5.8-rc.4" - resolved "https://registry.yarnpkg.com/dukat/-/dukat-0.5.8-rc.4.tgz#90384dcb50b14c26f0e99dae92b2dea44f5fce21" - integrity sha512-ZnMt6DGBjlVgK2uQamXfd7uP/AxH7RqI0BL9GLrrJb2gKdDxvJChWy+M9AQEaL+7/6TmxzJxFOsRiInY9oGWTA== - dependencies: - google-protobuf "3.12.2" - typescript "3.9.5" - -dup@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/dup/-/dup-1.0.0.tgz#51fc5ac685f8196469df0b905e934b20af5b4029" - integrity sha1-UfxaxoX4GWRp3wuQXpNLIK9bQCk= - -duplexer@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" - integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== - -duplexify@^3.4.5: - version "3.7.1" - resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309" - integrity sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g== - dependencies: - end-of-stream "^1.0.0" - inherits "^2.0.1" - readable-stream "^2.0.0" - stream-shift "^1.0.0" - -earcut@^2.1.5, earcut@^2.2.2: - version "2.2.3" - resolved "https://registry.yarnpkg.com/earcut/-/earcut-2.2.3.tgz#d44ced2ff5a18859568e327dd9c7d46b16f55cf4" - integrity sha512-iRDI1QeCQIhMCZk48DRDMVgQSSBDmbzzNhnxIo+pwx3swkfjMh6vh0nWLq1NdvGHLKH6wIrAM3vQWeTj6qeoug== - -edges-to-adjacency-list@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/edges-to-adjacency-list/-/edges-to-adjacency-list-1.0.0.tgz#c146d2e084addfba74a51293c6e0199a49f757f1" - integrity sha1-wUbS4ISt37p0pRKTxuAZmkn3V/E= - dependencies: - uniq "^1.0.0" - -ee-first@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" - integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= - -electron-to-chromium@^1.3.896: - version "1.4.5" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.5.tgz#912e8fd1645edee2f0f212558f40916eb538b1f9" - integrity sha512-YKaB+t8ul5crdh6OeqT2qXdxJGI0fAYb6/X8pDIyye+c3a7ndOCk5gVeKX+ABwivCGNS56vOAif3TN0qJMpEHw== - -element-resize-detector@^1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/element-resize-detector/-/element-resize-detector-1.2.3.tgz#5078d9b99398fe4c589f8c8df94ff99e5d413ff3" - integrity sha512-+dhNzUgLpq9ol5tyhoG7YLoXL3ssjfFW+0gpszXPwRU6NjGr1fVHMEAF8fVzIiRJq57Nre0RFeIjJwI8Nh2NmQ== - dependencies: - batch-processor "1.0.0" - -element-size@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/element-size/-/element-size-1.1.1.tgz#64e5f159d97121631845bcbaecaf279c39b5e34e" - integrity sha1-ZOXxWdlxIWMYRby67K8nnDm1404= - -elementary-circuits-directed-graph@^1.0.4: - version "1.3.1" - resolved "https://registry.yarnpkg.com/elementary-circuits-directed-graph/-/elementary-circuits-directed-graph-1.3.1.tgz#31c5a1c69517de833127247e5460472168e9e1c1" - integrity sha512-ZEiB5qkn2adYmpXGnJKkxT8uJHlW/mxmBpmeqawEHzPxh9HkLD4/1mFYX5l0On+f6rcPIt8/EWlRU2Vo3fX6dQ== - dependencies: - strongly-connected-components "^1.0.1" - -emoji-regex@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" - integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== - -emojis-list@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" - integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== - -encodeurl@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" - integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= - -end-of-stream@^1.0.0: - version "1.4.4" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" - integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== - dependencies: - once "^1.4.0" - -engine.io-parser@~4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-4.0.3.tgz#83d3a17acfd4226f19e721bb22a1ee8f7662d2f6" - integrity sha512-xEAAY0msNnESNPc00e19y5heTPX4y/TJ36gr8t1voOaNmTojP9b3oK3BbJLFufW2XFPQaaijpFewm2g2Um3uqA== - dependencies: - base64-arraybuffer "0.1.4" - -engine.io@~4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-4.1.1.tgz#9a8f8a5ac5a5ea316183c489bf7f5b6cf91ace5b" - integrity sha512-t2E9wLlssQjGw0nluF6aYyfX8LwYU8Jj0xct+pAhfWfv/YrBn6TSNtEYsgxHIfaMqfrLx07czcMg9bMN6di+3w== - dependencies: - accepts "~1.3.4" - base64id "2.0.0" - cookie "~0.4.1" - cors "~2.8.5" - debug "~4.3.1" - engine.io-parser "~4.0.0" - ws "~7.4.2" - -enhanced-resolve@^3.1.0: - version "3.4.1" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz#0421e339fd71419b3da13d129b3979040230476e" - integrity sha1-BCHjOf1xQZs9oT0Smzl5BAIwR24= - dependencies: - graceful-fs "^4.1.2" - memory-fs "^0.4.0" - object-assign "^4.0.1" - tapable "^0.2.7" - -enhanced-resolve@^5.8.3: - version "5.8.3" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.8.3.tgz#6d552d465cce0423f5b3d718511ea53826a7b2f0" - integrity sha512-EGAbGvH7j7Xt2nc0E7D99La1OiEs8LnyimkRgwExpUMScN6O+3x9tIWs7PLQZVNx4YD+00skHXPXi1yQHpAmZA== - dependencies: - graceful-fs "^4.2.4" - tapable "^2.2.0" - -ent@~2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/ent/-/ent-2.2.0.tgz#e964219325a21d05f44466a2f686ed6ce5f5dd1d" - integrity sha1-6WQhkyWiHQX0RGai9obtbOX13R0= - -entities@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" - integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== - -entities@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/entities/-/entities-3.0.1.tgz#2b887ca62585e96db3903482d336c1006c3001d4" - integrity sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q== - -envinfo@^7.7.3: - version "7.8.1" - resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.8.1.tgz#06377e3e5f4d379fea7ac592d5ad8927e0c4d475" - integrity sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw== - -errno@^0.1.3: - version "0.1.8" - resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f" - integrity sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A== - dependencies: - prr "~1.0.1" - -error-ex@^1.3.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" - integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== - dependencies: - is-arrayish "^0.2.1" - -es-abstract@^1.18.5: - version "1.19.1" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.19.1.tgz#d4885796876916959de78edaa0df456627115ec3" - integrity sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w== - dependencies: - call-bind "^1.0.2" - es-to-primitive "^1.2.1" - function-bind "^1.1.1" - get-intrinsic "^1.1.1" - get-symbol-description "^1.0.0" - has "^1.0.3" - has-symbols "^1.0.2" - internal-slot "^1.0.3" - is-callable "^1.2.4" - is-negative-zero "^2.0.1" - is-regex "^1.1.4" - is-shared-array-buffer "^1.0.1" - is-string "^1.0.7" - is-weakref "^1.0.1" - object-inspect "^1.11.0" - object-keys "^1.1.1" - object.assign "^4.1.2" - string.prototype.trimend "^1.0.4" - string.prototype.trimstart "^1.0.4" - unbox-primitive "^1.0.1" - -es-get-iterator@^1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/es-get-iterator/-/es-get-iterator-1.1.2.tgz#9234c54aba713486d7ebde0220864af5e2b283f7" - integrity sha512-+DTO8GYwbMCwbywjimwZMHp8AuYXOS2JZFWoi2AlPOS3ebnII9w/NLpNZtA7A0YLaVDw+O7KFCeoIV7OPvM7hQ== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.1.0" - has-symbols "^1.0.1" - is-arguments "^1.1.0" - is-map "^2.0.2" - is-set "^2.0.2" - is-string "^1.0.5" - isarray "^2.0.5" - -es-module-lexer@^0.9.0: - version "0.9.3" - resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-0.9.3.tgz#6f13db00cc38417137daf74366f535c8eb438f19" - integrity sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ== - -es-to-primitive@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" - integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== - dependencies: - is-callable "^1.1.4" - is-date-object "^1.0.1" - is-symbol "^1.0.2" - -es5-ext@^0.10.35, es5-ext@^0.10.46, es5-ext@^0.10.50: - version "0.10.53" - resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.53.tgz#93c5a3acfdbef275220ad72644ad02ee18368de1" - integrity sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q== - dependencies: - es6-iterator "~2.0.3" - es6-symbol "~3.1.3" - next-tick "~1.0.0" - -es6-error@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/es6-error/-/es6-error-4.1.1.tgz#9e3af407459deed47e9a91f9b885a84eb05c561d" - integrity sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg== - -es6-iterator@^2.0.3, es6-iterator@~2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" - integrity sha1-p96IkUGgWpSwhUQDstCg+/qY87c= - dependencies: - d "1" - es5-ext "^0.10.35" - es6-symbol "^3.1.1" - -es6-promise@^4.0.3, es6-promise@^4.2.8: - version "4.2.8" - resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" - integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w== - -es6-promisify@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203" - integrity sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM= - dependencies: - es6-promise "^4.0.3" - -es6-symbol@^3.1.1, es6-symbol@~3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.3.tgz#bad5d3c1bcdac28269f4cb331e431c78ac705d18" - integrity sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA== - dependencies: - d "^1.0.1" - ext "^1.1.2" - -es6-weak-map@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.3.tgz#b6da1f16cc2cc0d9be43e6bdbfc5e7dfcdf31d53" - integrity sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA== - dependencies: - d "1" - es5-ext "^0.10.46" - es6-iterator "^2.0.3" - es6-symbol "^3.1.1" - -escalade@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" - integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== - -escape-html@~1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" - integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= - -escape-string-regexp@4.0.0, escape-string-regexp@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" - integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== - -escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= - -escape-string-regexp@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" - integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== - -escodegen@^1.11.1: - version "1.14.3" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.3.tgz#4e7b81fba61581dc97582ed78cab7f0e8d63f503" - integrity sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw== - dependencies: - esprima "^4.0.1" - estraverse "^4.2.0" - esutils "^2.0.2" - optionator "^0.8.1" - optionalDependencies: - source-map "~0.6.1" - -eslint-plugin-react-hooks@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.3.0.tgz#318dbf312e06fab1c835a4abef00121751ac1172" - integrity sha512-XslZy0LnMn+84NEG9jSGR6eGqaZB3133L8xewQo3fQagbQuGt7a63gf+P1NGKZavEYEC3UXaWEAA/AqDkuN6xA== - -eslint-scope@5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" - integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== - dependencies: - esrecurse "^4.3.0" - estraverse "^4.1.1" - -esprima@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" - integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== - -esrecurse@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" - integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== - dependencies: - estraverse "^5.2.0" - -estraverse@^4.1.1, estraverse@^4.2.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" - integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== - -estraverse@^5.2.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" - integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== - -esutils@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" - integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== - -etag@~1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" - integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= - -eventemitter3@^4.0.0: - version "4.0.7" - resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" - integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== - -events@^3.2.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" - integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== - -execa@^5.0.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" - integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== - dependencies: - cross-spawn "^7.0.3" - get-stream "^6.0.0" - human-signals "^2.1.0" - is-stream "^2.0.0" - merge-stream "^2.0.0" - npm-run-path "^4.0.1" - onetime "^5.1.2" - signal-exit "^3.0.3" - strip-final-newline "^2.0.0" - -express@^4.17.1: - version "4.17.1" - resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134" - integrity sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g== - dependencies: - accepts "~1.3.7" - array-flatten "1.1.1" - body-parser "1.19.0" - content-disposition "0.5.3" - content-type "~1.0.4" - cookie "0.4.0" - cookie-signature "1.0.6" - debug "2.6.9" - depd "~1.1.2" - encodeurl "~1.0.2" - escape-html "~1.0.3" - etag "~1.8.1" - finalhandler "~1.1.2" - fresh "0.5.2" - merge-descriptors "1.0.1" - methods "~1.1.2" - on-finished "~2.3.0" - parseurl "~1.3.3" - path-to-regexp "0.1.7" - proxy-addr "~2.0.5" - qs "6.7.0" - range-parser "~1.2.1" - safe-buffer "5.1.2" - send "0.17.1" - serve-static "1.14.1" - setprototypeof "1.1.1" - statuses "~1.5.0" - type-is "~1.6.18" - utils-merge "1.0.1" - vary "~1.1.2" - -ext@^1.1.2: - version "1.6.0" - resolved "https://registry.yarnpkg.com/ext/-/ext-1.6.0.tgz#3871d50641e874cc172e2b53f919842d19db4c52" - integrity sha512-sdBImtzkq2HpkdRLtlLWDa6w4DX22ijZLKx8BMPUuKe1c5lbN6xwQDQCxSfxBQnHZ13ls/FH0MQZx/q/gr6FQg== - dependencies: - type "^2.5.0" - -extend@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" - integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== - -extract-frustum-planes@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/extract-frustum-planes/-/extract-frustum-planes-1.0.0.tgz#97d5703ff0564c8c3c6838cac45f9e7bc52c9ef5" - integrity sha1-l9VwP/BWTIw8aDjKxF+ee8UsnvU= - -extricate-loader@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/extricate-loader/-/extricate-loader-3.0.0.tgz#7a9998e885046d5d6991d62d4887ee113ca1e0bd" - integrity sha512-Ts6BIh25xhFpeGaG0La345bYQdRXWv3ZvUwmJB6/QsXRywWrZmM1hGz8eZfQaBwy/HsmGOZevzGLesVtsrrmyg== - dependencies: - loader-utils "^1.1.0" - -falafel@^2.1.0: - version "2.2.4" - resolved "https://registry.yarnpkg.com/falafel/-/falafel-2.2.4.tgz#b5d86c060c2412a43166243cb1bce44d1abd2819" - integrity sha512-0HXjo8XASWRmsS0X1EkhwEMZaD3Qvp7FfURwjLKjG1ghfRm/MGZl2r4cWUTv41KdNghTw4OUMmVtdGQp3+H+uQ== - dependencies: - acorn "^7.1.1" - foreach "^2.0.5" - isarray "^2.0.1" - object-keys "^1.0.6" - -fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" - integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== - -fast-glob@^3.1.1: - version "3.2.7" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.7.tgz#fd6cb7a2d7e9aa7a7846111e85a196d6b2f766a1" - integrity sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q== - dependencies: - "@nodelib/fs.stat" "^2.0.2" - "@nodelib/fs.walk" "^1.2.3" - glob-parent "^5.1.2" - merge2 "^1.3.0" - micromatch "^4.0.4" - -fast-isnumeric@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/fast-isnumeric/-/fast-isnumeric-1.1.4.tgz#e165786ff471c439e9ace2b8c8e66cceb47e2ea4" - integrity sha512-1mM8qOr2LYz8zGaUdmiqRDiuue00Dxjgcb1NQR7TnhLVh6sQyngP9xvLo7Sl7LZpP/sk5eb+bcyWXw530NTBZw== - dependencies: - is-string-blank "^1.0.1" - -fast-json-stable-stringify@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" - integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== - -fast-levenshtein@~2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" - integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= - -fastdom@^1.0.10: - version "1.0.10" - resolved "https://registry.yarnpkg.com/fastdom/-/fastdom-1.0.10.tgz#4f2c7c9b24e7e249fc70c63131842b859b92bf09" - integrity sha512-sbL4h358IlZn8VsTvA5TYnKVLYif46XhPEll+HTSxVtDSpqZEO/17D/QqlxE9V2K7AQ82GXeYeQLU2HWwKgk1A== - dependencies: - strictdom "^1.0.1" - -fastest-levenshtein@^1.0.12: - version "1.0.12" - resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz#9990f7d3a88cc5a9ffd1f1745745251700d497e2" - integrity sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow== - -fastq@^1.6.0: - version "1.13.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c" - integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw== - dependencies: - reusify "^1.0.4" - -faye-websocket@^0.11.3: - version "0.11.4" - resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.4.tgz#7f0d9275cfdd86a1c963dc8b65fcc451edcbb1da" - integrity sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g== - dependencies: - websocket-driver ">=0.5.1" - -file-loader@^6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-6.2.0.tgz#baef7cf8e1840df325e4390b4484879480eebe4d" - integrity sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw== - dependencies: - loader-utils "^2.0.0" - schema-utils "^3.0.0" - -file-saver@2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/file-saver/-/file-saver-2.0.2.tgz#06d6e728a9ea2df2cce2f8d9e84dfcdc338ec17a" - integrity sha512-Wz3c3XQ5xroCxd1G8b7yL0Ehkf0TC9oYC6buPFkNnU9EnaPlifeAFCyCh+iewXTyFRcg0a6j3J7FmJsIhlhBdw== - -fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== - dependencies: - to-regex-range "^5.0.1" - -filtered-vector@^1.2.1: - version "1.2.5" - resolved "https://registry.yarnpkg.com/filtered-vector/-/filtered-vector-1.2.5.tgz#5a831278c159721dd3be34ef017842836ef3d461" - integrity sha512-5Vu6wdtQJ1O2nRmz39dIr9m3hEDq1skYby5k1cJQdNWK4dMgvYcUEiA/9j7NcKfNZ5LGxn8w2LSLiigyH7pTAw== - dependencies: - binary-search-bounds "^2.0.0" - cubic-hermite "^1.0.0" - -finalhandler@1.1.2, finalhandler@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" - integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== - dependencies: - debug "2.6.9" - encodeurl "~1.0.2" - escape-html "~1.0.3" - on-finished "~2.3.0" - parseurl "~1.3.3" - statuses "~1.5.0" - unpipe "~1.0.0" - -find-cache-dir@^3.3.1: - version "3.3.2" - resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.2.tgz#b30c5b6eff0730731aea9bbd9dbecbd80256d64b" - integrity sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig== - dependencies: - commondir "^1.0.1" - make-dir "^3.0.2" - pkg-dir "^4.1.0" - -find-up@5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" - integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== - dependencies: - locate-path "^6.0.0" - path-exists "^4.0.0" - -find-up@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" - integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== - dependencies: - locate-path "^5.0.0" - path-exists "^4.0.0" - -flat@^5.0.2: - version "5.0.2" - resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" - integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== - -flatted@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.2.tgz#4575b21e2bcee7434aa9be662f4b7b5f9c2b5138" - integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA== - -flatten-vertex-data@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/flatten-vertex-data/-/flatten-vertex-data-1.0.2.tgz#889fd60bea506006ca33955ee1105175fb620219" - integrity sha512-BvCBFK2NZqerFTdMDgqfHBwxYWnxeCkwONsw6PvBMcUXqo8U/KDWwmXhqx1x2kLIg7DqIsJfOaJFOmlua3Lxuw== - dependencies: - dtype "^2.0.0" - -flatten@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.3.tgz#c1283ac9f27b368abc1e36d1ff7b04501a30356b" - integrity sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg== - -flip-pixels@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/flip-pixels/-/flip-pixels-1.0.2.tgz#aad7b7d9fc65932d5f27e2e4dac4b494140845e4" - integrity sha512-oXbJGbjDnfJRWPC7Va38EFhd+A8JWE5/hCiKcK8qjCdbLj9DTpsq6MEudwpRTH+V4qq+Jw7d3pUgQdSr3x3mTA== - -focus-trap@^6.7.1: - version "6.7.1" - resolved "https://registry.yarnpkg.com/focus-trap/-/focus-trap-6.7.1.tgz#d474f86dbaf3c7fbf0d53cf0b12295f4f4068d10" - integrity sha512-a6czHbT9twVpy2RpkWQA9vIgwQgB9Nx1PIxNNUxQT4nugG/3QibwxO+tWTh9i+zSY2SFiX4pnYhTaFaQF/6ZAg== - dependencies: - tabbable "^5.2.1" - -focus-visible@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/focus-visible/-/focus-visible-5.2.0.tgz#3a9e41fccf587bd25dcc2ef045508284f0a4d6b3" - integrity sha512-Rwix9pBtC1Nuy5wysTmKy+UjbDJpIfg8eHjw0rjZ1mX4GNLz1Bmd16uDpI3Gk1i70Fgcs8Csg2lPm8HULFg9DQ== - -follow-redirects@^1.0.0: - version "1.14.5" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.5.tgz#f09a5848981d3c772b5392309778523f8d85c381" - integrity sha512-wtphSXy7d4/OR+MvIFbCVBDzZ5520qV8XfPklSN5QtxuMUJZ+b0Wnst1e1lCDocfzuCkHqj8k0FpZqO+UIaKNA== - -font-atlas@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/font-atlas/-/font-atlas-2.1.0.tgz#aa2d6dcf656a6c871d66abbd3dfbea2f77178348" - integrity sha512-kP3AmvX+HJpW4w3d+PiPR2X6E1yvsBXt2yhuCw+yReO9F1WYhvZwx3c95DGZGwg9xYzDGrgJYa885xmVA+28Cg== - dependencies: - css-font "^1.0.0" - -font-measure@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/font-measure/-/font-measure-1.2.2.tgz#41dbdac5d230dbf4db08865f54da28a475e83026" - integrity sha512-mRLEpdrWzKe9hbfaF3Qpr06TAjquuBVP5cHy4b3hyeNdjc9i0PO6HniGsX5vjL5OWv7+Bd++NiooNpT/s8BvIA== - dependencies: - css-font "^1.2.0" - -foreach@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99" - integrity sha1-C+4AUBiusmDQo6865ljdATbsG5k= - -format-util@1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/format-util/-/format-util-1.0.5.tgz#1ffb450c8a03e7bccffe40643180918cc297d271" - integrity sha512-varLbTj0e0yVyRpqQhuWV+8hlePAgaoFRhNFj50BNjEIrw1/DphHSObtqwskVCPWNgzwPoQrZAbfa/SBiicNeg== - -forwarded@0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" - integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== - -fraction.js@^4.1.1: - version "4.1.2" - resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.1.2.tgz#13e420a92422b6cf244dff8690ed89401029fbe8" - integrity sha512-o2RiJQ6DZaR/5+Si0qJUIy637QMRudSi9kU/FFzx9EZazrIdnBgpU+3sEWCxAVhH2RtxW2Oz+T4p2o8uOPVcgA== - -fresh@0.5.2: - version "0.5.2" - resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" - integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= - -from2@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" - integrity sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8= - dependencies: - inherits "^2.0.1" - readable-stream "^2.0.0" - -fs-extra@^8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" - integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== - dependencies: - graceful-fs "^4.2.0" - jsonfile "^4.0.0" - universalify "^0.1.0" - -fs-monkey@1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/fs-monkey/-/fs-monkey-1.0.3.tgz#ae3ac92d53bb328efe0e9a1d9541f6ad8d48e2d3" - integrity sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q== - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= - -fsevents@~2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" - integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== - -function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== - -functional-red-black-tree@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" - integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= - -gamma@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/gamma/-/gamma-0.1.0.tgz#3315643403bf27906ca80ab37c36ece9440ef330" - integrity sha1-MxVkNAO/J5BsqAqzfDbs6UQO8zA= - -gensync@^1.0.0-beta.2: - version "1.0.0-beta.2" - resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" - integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== - -geojson-vt@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/geojson-vt/-/geojson-vt-3.2.1.tgz#f8adb614d2c1d3f6ee7c4265cad4bbf3ad60c8b7" - integrity sha512-EvGQQi/zPrDA6zr6BnJD/YhwAkBP8nnJ9emh3EnHQKVMfg/MRVtPbMYdgVy/IaEmn4UfagD2a6fafPDL5hbtwg== - -get-caller-file@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" - integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== - -get-canvas-context@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/get-canvas-context/-/get-canvas-context-1.0.2.tgz#d6e7b50bc4e4c86357cd39f22647a84b73601e93" - integrity sha1-1ue1C8TkyGNXzTnyJkeoS3NgHpM= - -get-intrinsic@^1.0.1, get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" - integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== - dependencies: - function-bind "^1.1.1" - has "^1.0.3" - has-symbols "^1.0.1" - -get-stream@^6.0.0, get-stream@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" - integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== - -get-symbol-description@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" - integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.1.1" - -gl-axes3d@^1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/gl-axes3d/-/gl-axes3d-1.5.3.tgz#47e3dd6c21356a59349910ec01af58e28ea69fe9" - integrity sha512-KRYbguKQcDQ6PcB9g1pgqB8Ly4TY1DQODpPKiDTasyWJ8PxQk0t2Q7XoQQijNqvsguITCpVVCzNb5GVtIWiVlQ== - dependencies: - bit-twiddle "^1.0.2" - dup "^1.0.0" - extract-frustum-planes "^1.0.0" - gl-buffer "^2.1.2" - gl-mat4 "^1.2.0" - gl-shader "^4.2.1" - gl-state "^1.0.0" - gl-vao "^1.3.0" - gl-vec4 "^1.0.1" - glslify "^7.0.0" - robust-orientation "^1.1.3" - split-polygon "^1.0.0" - vectorize-text "^3.2.1" - -gl-buffer@^2.1.1, gl-buffer@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/gl-buffer/-/gl-buffer-2.1.2.tgz#2db8d9c1a5527fba0cdb91289c206e882b889cdb" - integrity sha1-LbjZwaVSf7oM25EonCBuiCuInNs= - dependencies: - ndarray "^1.0.15" - ndarray-ops "^1.1.0" - typedarray-pool "^1.0.0" - -gl-cone3d@^1.5.2: - version "1.5.2" - resolved "https://registry.yarnpkg.com/gl-cone3d/-/gl-cone3d-1.5.2.tgz#66af5c33b7d5174034dfa3654a88e995998d92bc" - integrity sha512-1JNeHH4sUtUmDA4ZK7Om8/kShwb8IZVAsnxaaB7IPRJsNGciLj1sTpODrJGeMl41RNkex5kXD2SQFrzyEAR2Rw== - dependencies: - colormap "^2.3.1" - gl-buffer "^2.1.2" - gl-mat4 "^1.2.0" - gl-shader "^4.2.1" - gl-texture2d "^2.1.0" - gl-vao "^1.3.0" - gl-vec3 "^1.1.3" - glsl-inverse "^1.0.0" - glsl-out-of-range "^1.0.4" - glsl-specular-cook-torrance "^2.0.1" - glslify "^7.0.0" - ndarray "^1.0.18" - -gl-constants@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/gl-constants/-/gl-constants-1.0.0.tgz#597a504e364750ff50253aa35f8dea7af4a5d233" - integrity sha1-WXpQTjZHUP9QJTqjX43qevSl0jM= - -gl-contour2d@^1.1.7: - version "1.1.7" - resolved "https://registry.yarnpkg.com/gl-contour2d/-/gl-contour2d-1.1.7.tgz#ca330cf8449673a9ca0b3f6726c83f8d35c7a50c" - integrity sha512-GdebvJ9DtT3pJDpoE+eU2q+Wo9S3MijPpPz5arZbhK85w2bARmpFpVfPaDlZqWkB644W3BlH8TVyvAo1KE4Bhw== - dependencies: - binary-search-bounds "^2.0.4" - cdt2d "^1.0.0" - clean-pslg "^1.1.2" - gl-buffer "^2.1.2" - gl-shader "^4.2.1" - glslify "^7.0.0" - iota-array "^1.0.0" - ndarray "^1.0.18" - surface-nets "^1.0.2" - -gl-error3d@^1.0.16: - version "1.0.16" - resolved "https://registry.yarnpkg.com/gl-error3d/-/gl-error3d-1.0.16.tgz#88a94952f5303d9cf5cb86806789a360777c5446" - integrity sha512-TGJewnKSp7ZnqGgG3XCF9ldrDbxZrO+OWlx6oIet4OdOM//n8xJ5isArnIV/sdPJnFbhfoLxWrW9f5fxHFRQ1A== - dependencies: - gl-buffer "^2.1.2" - gl-shader "^4.2.1" - gl-vao "^1.3.0" - glsl-out-of-range "^1.0.4" - glslify "^7.0.0" - -gl-fbo@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/gl-fbo/-/gl-fbo-2.0.5.tgz#0fa75a497cf787695530691c8f04abb6fb55fa22" - integrity sha1-D6daSXz3h2lVMGkcjwSrtvtV+iI= - dependencies: - gl-texture2d "^2.0.0" - -gl-format-compiler-error@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/gl-format-compiler-error/-/gl-format-compiler-error-1.0.3.tgz#0c79b1751899ce9732e86240f090aa41e98471a8" - integrity sha1-DHmxdRiZzpcy6GJA8JCqQemEcag= - dependencies: - add-line-numbers "^1.0.1" - gl-constants "^1.0.0" - glsl-shader-name "^1.0.0" - sprintf-js "^1.0.3" - -gl-heatmap2d@^1.0.6: - version "1.1.1" - resolved "https://registry.yarnpkg.com/gl-heatmap2d/-/gl-heatmap2d-1.1.1.tgz#dbbb2c288bfe277002fa50985155b0403d87640f" - integrity sha512-6Vo1fPIB1vQFWBA/MR6JAA16XuQuhwvZRbSjYEq++m4QV33iqjGS2HcVIRfJGX+fomd5eiz6bwkVZcKm69zQPw== - dependencies: - binary-search-bounds "^2.0.4" - gl-buffer "^2.1.2" - gl-shader "^4.2.1" - glslify "^7.0.0" - iota-array "^1.0.0" - typedarray-pool "^1.2.0" - -gl-line3d@1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/gl-line3d/-/gl-line3d-1.2.1.tgz#632fc5b931a84a315995322b271aaf497e292609" - integrity sha512-eeb0+RI2ZBRqMYJK85SgsRiJK7c4aiOjcnirxv0830A3jmOc99snY3AbPcV8KvKmW0Yaf3KA4e+qNCbHiTOTnA== - dependencies: - binary-search-bounds "^2.0.4" - gl-buffer "^2.1.2" - gl-shader "^4.2.1" - gl-texture2d "^2.1.0" - gl-vao "^1.3.0" - glsl-out-of-range "^1.0.4" - glslify "^7.0.0" - ndarray "^1.0.18" - -gl-mat3@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/gl-mat3/-/gl-mat3-1.0.0.tgz#89633219ca429379a16b9185d95d41713453b912" - integrity sha1-iWMyGcpCk3mha5GF2V1BcTRTuRI= - -gl-mat4@^1.0.1, gl-mat4@^1.0.2, gl-mat4@^1.0.3, gl-mat4@^1.1.2, gl-mat4@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/gl-mat4/-/gl-mat4-1.2.0.tgz#49d8a7636b70aa00819216635f4a3fd3f4669b26" - integrity sha512-sT5C0pwB1/e9G9AvAoLsoaJtbMGjfd/jfxo8jMCKqYYEnjZuFvqV5rehqar0538EmssjdDeiEWnKyBSTw7quoA== - -gl-matrix@^3.2.1: - version "3.4.3" - resolved "https://registry.yarnpkg.com/gl-matrix/-/gl-matrix-3.4.3.tgz#fc1191e8320009fd4d20e9339595c6041ddc22c9" - integrity sha512-wcCp8vu8FT22BnvKVPjXa/ICBWRq/zjFfdofZy1WSpQZpphblv12/bOQLBC1rMM7SGOFS9ltVmKOHil5+Ml7gA== - -gl-mesh3d@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/gl-mesh3d/-/gl-mesh3d-2.3.1.tgz#087a93c5431df923570ca51cfc691bab0d21a6b8" - integrity sha512-pXECamyGgu4/9HeAQSE5OEUuLBGS1aq9V4BCsTcxsND4fNLaajEkYKUz/WY2QSYElqKdsMBVsldGiKRKwlybqA== - dependencies: - barycentric "^1.0.1" - colormap "^2.3.1" - gl-buffer "^2.1.2" - gl-mat4 "^1.2.0" - gl-shader "^4.2.1" - gl-texture2d "^2.1.0" - gl-vao "^1.3.0" - glsl-out-of-range "^1.0.4" - glsl-specular-cook-torrance "^2.0.1" - glslify "^7.0.0" - ndarray "^1.0.18" - normals "^1.1.0" - polytope-closest-point "^1.0.0" - simplicial-complex-contour "^1.0.2" - typedarray-pool "^1.1.0" - -gl-plot2d@^1.4.5: - version "1.4.5" - resolved "https://registry.yarnpkg.com/gl-plot2d/-/gl-plot2d-1.4.5.tgz#6412b8b3f8df3e7d89c5955daac7059e04d657d4" - integrity sha512-6GmCN10SWtV+qHFQ1gjdnVubeHFVsm6P4zmo0HrPIl9TcdePCUHDlBKWAuE6XtFhiMKMj7R8rApOX8O8uXUYog== - dependencies: - binary-search-bounds "^2.0.4" - gl-buffer "^2.1.2" - gl-select-static "^2.0.7" - gl-shader "^4.2.1" - glsl-inverse "^1.0.0" - glslify "^7.0.0" - text-cache "^4.2.2" - -gl-plot3d@^2.4.6: - version "2.4.7" - resolved "https://registry.yarnpkg.com/gl-plot3d/-/gl-plot3d-2.4.7.tgz#b66e18c5affdd664f42c884acf7b82c60b41ee78" - integrity sha512-mLDVWrl4Dj0O0druWyHUK5l7cBQrRIJRn2oROEgrRuOgbbrLAzsREKefwMO0bA0YqkiZMFMnV5VvPA9j57X5Xg== - dependencies: - "3d-view" "^2.0.0" - a-big-triangle "^1.0.3" - gl-axes3d "^1.5.3" - gl-fbo "^2.0.5" - gl-mat4 "^1.2.0" - gl-select-static "^2.0.7" - gl-shader "^4.2.1" - gl-spikes3d "^1.0.10" - glslify "^7.0.0" - has-passive-events "^1.0.0" - is-mobile "^2.2.1" - mouse-change "^1.4.0" - mouse-event-offset "^3.0.2" - mouse-wheel "^1.2.0" - ndarray "^1.0.19" - right-now "^1.0.0" - -gl-pointcloud2d@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/gl-pointcloud2d/-/gl-pointcloud2d-1.0.3.tgz#f37e215f21ccb2e17f0604664e99fc3d6a4e611d" - integrity sha512-OS2e1irvJXVRpg/GziXj10xrFJm9kkRfFoB6BLUvkjCQV7ZRNNcs2CD+YSK1r0gvMwTg2T3lfLM3UPwNtz+4Xw== - dependencies: - gl-buffer "^2.1.2" - gl-shader "^4.2.1" - glslify "^7.0.0" - typedarray-pool "^1.1.0" - -gl-quat@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/gl-quat/-/gl-quat-1.0.0.tgz#0945ec923386f45329be5dc357b1c8c2d47586c5" - integrity sha1-CUXskjOG9FMpvl3DV7HIwtR1hsU= - dependencies: - gl-mat3 "^1.0.0" - gl-vec3 "^1.0.3" - gl-vec4 "^1.0.0" - -gl-scatter3d@^1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/gl-scatter3d/-/gl-scatter3d-1.2.3.tgz#83d63700ec2fe4e95b3d1cd613e86de9a6b5f603" - integrity sha512-nXqPlT1w5Qt51dTksj+DUqrZqwWAEWg0PocsKcoDnVNv0X8sGA+LBZ0Y+zrA+KNXUL0PPCX9WR9cF2uJAZl1Sw== - dependencies: - gl-buffer "^2.1.2" - gl-mat4 "^1.2.0" - gl-shader "^4.2.1" - gl-vao "^1.3.0" - glsl-out-of-range "^1.0.4" - glslify "^7.0.0" - is-string-blank "^1.0.1" - typedarray-pool "^1.1.0" - vectorize-text "^3.2.1" - -gl-select-box@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/gl-select-box/-/gl-select-box-1.0.4.tgz#47c11caa2b84f81e8bbfde08c6e39eeebb53d3d8" - integrity sha512-mKsCnglraSKyBbQiGq0Ila0WF+m6Tr+EWT2yfaMn/Sh9aMHq5Wt0F/l6Cf/Ed3CdERq5jHWAY5yxLviZteYu2w== - dependencies: - gl-buffer "^2.1.2" - gl-shader "^4.2.1" - glslify "^7.0.0" - -gl-select-static@^2.0.7: - version "2.0.7" - resolved "https://registry.yarnpkg.com/gl-select-static/-/gl-select-static-2.0.7.tgz#ce7eb05ae0139009c15e2d2d0d731600b3dae5c0" - integrity sha512-OvpYprd+ngl3liEatBTdXhSyNBjwvjMSvV2rN0KHpTU+BTi4viEETXNZXFgGXY37qARs0L28ybk3UQEW6C5Nnw== - dependencies: - bit-twiddle "^1.0.2" - gl-fbo "^2.0.5" - ndarray "^1.0.18" - typedarray-pool "^1.1.0" - -gl-shader@^4.2.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/gl-shader/-/gl-shader-4.3.1.tgz#56094cf3c06e802ac6c286b3b2166abce901d882" - integrity sha512-xLoN6XtRLlg97SEqtuzfKc+pVWpVkQ3YjDI1kuCale8tF7+zMhiKlMfmG4IMQPMdKJZQbIc/Ny8ZusEpfh5U+w== - dependencies: - gl-format-compiler-error "^1.0.2" - weakmap-shim "^1.1.0" - -gl-spikes2d@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/gl-spikes2d/-/gl-spikes2d-1.0.2.tgz#ef8dbcff6c7451dec2b751d7a3c593d09ad5457f" - integrity sha512-QVeOZsi9nQuJJl7NB3132CCv5KA10BWxAY2QgJNsKqbLsG53B/TrGJpjIAohnJftdZ4fT6b3ZojWgeaXk8bOOA== - -gl-spikes3d@^1.0.10: - version "1.0.10" - resolved "https://registry.yarnpkg.com/gl-spikes3d/-/gl-spikes3d-1.0.10.tgz#e3b2b677a6f51750f23c064447af4f093da79305" - integrity sha512-lT3xroowOFxMvlhT5Mof76B2TE02l5zt/NIWljhczV2FFHgIVhA4jMrd5dIv1so1RXMBDJIKu0uJI3QKliDVLg== - dependencies: - gl-buffer "^2.1.2" - gl-shader "^4.2.1" - gl-vao "^1.3.0" - glslify "^7.0.0" - -gl-state@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/gl-state/-/gl-state-1.0.0.tgz#262faa75835b0b9c532c12f38adc425d1d30cd17" - integrity sha1-Ji+qdYNbC5xTLBLzitxCXR0wzRc= - dependencies: - uniq "^1.0.0" - -gl-streamtube3d@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/gl-streamtube3d/-/gl-streamtube3d-1.4.1.tgz#bd2b725e00aa96989ce34b06ebf66a76f93e35ae" - integrity sha512-rH02v00kgwgdpkXVo7KsSoPp38bIAYR9TE1iONjcQ4cQAlDhrGRauqT/P5sUaOIzs17A2DxWGcXM+EpNQs9pUA== - dependencies: - gl-cone3d "^1.5.2" - gl-vec3 "^1.1.3" - gl-vec4 "^1.0.1" - glsl-inverse "^1.0.0" - glsl-out-of-range "^1.0.4" - glsl-specular-cook-torrance "^2.0.1" - glslify "^7.0.0" - -gl-surface3d@^1.5.2: - version "1.6.0" - resolved "https://registry.yarnpkg.com/gl-surface3d/-/gl-surface3d-1.6.0.tgz#5fc915759a91e9962dcfbf3982296c462a032526" - integrity sha512-x15+u4712ysnB85G55RLJEml6mOB4VaDn0VTlXCc9JcjRl5Es10Tk7lhGGyiPtkCfHwvhnkxzYA1/rHHYN7Y0A== - dependencies: - binary-search-bounds "^2.0.4" - bit-twiddle "^1.0.2" - colormap "^2.3.1" - dup "^1.0.0" - gl-buffer "^2.1.2" - gl-mat4 "^1.2.0" - gl-shader "^4.2.1" - gl-texture2d "^2.1.0" - gl-vao "^1.3.0" - glsl-out-of-range "^1.0.4" - glsl-specular-beckmann "^1.1.2" - glslify "^7.0.0" - ndarray "^1.0.18" - ndarray-gradient "^1.0.0" - ndarray-ops "^1.2.2" - ndarray-pack "^1.2.1" - ndarray-scratch "^1.2.0" - surface-nets "^1.0.2" - typedarray-pool "^1.1.0" - -gl-text@^1.1.8: - version "1.3.1" - resolved "https://registry.yarnpkg.com/gl-text/-/gl-text-1.3.1.tgz#f36594464101b5b053178d6d219c3d08fb9144c8" - integrity sha512-/f5gcEMiZd+UTBJLTl3D+CkCB/0UFGTx3nflH8ZmyWcLkZhsZ1+Xx5YYkw2rgWAzgPeE35xCqBuHSoMKQVsR+w== - dependencies: - bit-twiddle "^1.0.2" - color-normalize "^1.5.0" - css-font "^1.2.0" - detect-kerning "^2.1.2" - es6-weak-map "^2.0.3" - flatten-vertex-data "^1.0.2" - font-atlas "^2.1.0" - font-measure "^1.2.2" - gl-util "^3.1.2" - is-plain-obj "^1.1.0" - object-assign "^4.1.1" - parse-rect "^1.2.0" - parse-unit "^1.0.1" - pick-by-alias "^1.2.0" - regl "^2.0.0" - to-px "^1.0.1" - typedarray-pool "^1.1.0" - -gl-texture2d@^2.0.0, gl-texture2d@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/gl-texture2d/-/gl-texture2d-2.1.0.tgz#ff6824e7e7c31a8ba6fdcdbe9e5c695d7e2187c7" - integrity sha1-/2gk5+fDGoum/c2+nlxpXX4hh8c= - dependencies: - ndarray "^1.0.15" - ndarray-ops "^1.2.2" - typedarray-pool "^1.1.0" - -gl-util@^3.1.2: - version "3.1.3" - resolved "https://registry.yarnpkg.com/gl-util/-/gl-util-3.1.3.tgz#1e9a724f844b802597c6e30565d4c1e928546861" - integrity sha512-dvRTggw5MSkJnCbh74jZzSoTOGnVYK+Bt+Ckqm39CVcl6+zSsxqWk4lr5NKhkqXHL6qvZAU9h17ZF8mIskY9mA== - dependencies: - is-browser "^2.0.1" - is-firefox "^1.0.3" - is-plain-obj "^1.1.0" - number-is-integer "^1.0.1" - object-assign "^4.1.0" - pick-by-alias "^1.2.0" - weak-map "^1.0.5" - -gl-vao@^1.2.0, gl-vao@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/gl-vao/-/gl-vao-1.3.0.tgz#e9e92aa95588cab9d5c2f04b693440c3df691923" - integrity sha1-6ekqqVWIyrnVwvBLaTRAw99pGSM= - -gl-vec3@^1.0.2, gl-vec3@^1.0.3, gl-vec3@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/gl-vec3/-/gl-vec3-1.1.3.tgz#a47c62f918774a06cbed1b65bcd0288ecbb03826" - integrity sha512-jduKUqT0SGH02l8Yl+mV1yVsDfYgQAJyXGxkJQGyxPLHRiW25DwVIRPt6uvhrEMHftJfqhqKthRcyZqNEl9Xdw== - -gl-vec4@^1.0.0, gl-vec4@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/gl-vec4/-/gl-vec4-1.0.1.tgz#97d96878281b14b532cbce101785dfd1cb340964" - integrity sha1-l9loeCgbFLUyy84QF4Xf0cs0CWQ= - -glob-parent@^5.1.2, glob-parent@~5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" - integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== - dependencies: - is-glob "^4.0.1" - -glob-to-regexp@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" - integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== - -glob@7.1.7: - version "7.1.7" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90" - integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - -glob@^7.1.3, glob@^7.1.7: - version "7.2.0" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" - integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - -globals@^11.1.0: - version "11.12.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" - integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== - -globby@^11.0.1: - version "11.0.4" - resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.4.tgz#2cbaff77c2f2a62e71e9b2813a67b97a3a3001a5" - integrity sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg== - dependencies: - array-union "^2.1.0" - dir-glob "^3.0.1" - fast-glob "^3.1.1" - ignore "^5.1.4" - merge2 "^1.3.0" - slash "^3.0.0" - -glsl-inject-defines@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/glsl-inject-defines/-/glsl-inject-defines-1.0.3.tgz#dd1aacc2c17fcb2bd3fc32411c6633d0d7b60fd4" - integrity sha1-3RqswsF/yyvT/DJBHGYz0Ne2D9Q= - dependencies: - glsl-token-inject-block "^1.0.0" - glsl-token-string "^1.0.1" - glsl-tokenizer "^2.0.2" - -glsl-inverse@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/glsl-inverse/-/glsl-inverse-1.0.0.tgz#12c0b1d065f558444d1e6feaf79b5ddf8a918ae6" - integrity sha1-EsCx0GX1WERNHm/q95td34qRiuY= - -glsl-out-of-range@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/glsl-out-of-range/-/glsl-out-of-range-1.0.4.tgz#3d73d083bc9ecc73efd45dfc7063c29e92c9c873" - integrity sha512-fCcDu2LCQ39VBvfe1FbhuazXEf0CqMZI9OYXrYlL6uUARG48CTAbL04+tZBtVM0zo1Ljx4OLu2AxNquq++lxWQ== - -glsl-resolve@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/glsl-resolve/-/glsl-resolve-0.0.1.tgz#894bef73910d792c81b5143180035d0a78af76d3" - integrity sha1-iUvvc5ENeSyBtRQxgANdCnivdtM= - dependencies: - resolve "^0.6.1" - xtend "^2.1.2" - -glsl-shader-name@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/glsl-shader-name/-/glsl-shader-name-1.0.0.tgz#a2c30b3ba73499befb0cc7184d7c7733dd4b487d" - integrity sha1-osMLO6c0mb77DMcYTXx3M91LSH0= - dependencies: - atob-lite "^1.0.0" - glsl-tokenizer "^2.0.2" - -glsl-specular-beckmann@^1.1.1, glsl-specular-beckmann@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/glsl-specular-beckmann/-/glsl-specular-beckmann-1.1.2.tgz#fce9056933ecdf2456278376a54d082893e775f1" - integrity sha1-/OkFaTPs3yRWJ4N2pU0IKJPndfE= - -glsl-specular-cook-torrance@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/glsl-specular-cook-torrance/-/glsl-specular-cook-torrance-2.0.1.tgz#a891cc06c8c7b4f4728702b4824fdacbb967d78f" - integrity sha1-qJHMBsjHtPRyhwK0gk/ay7ln148= - dependencies: - glsl-specular-beckmann "^1.1.1" - -glsl-token-assignments@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/glsl-token-assignments/-/glsl-token-assignments-2.0.2.tgz#a5d82ab78499c2e8a6b83cb69495e6e665ce019f" - integrity sha1-pdgqt4SZwuimuDy2lJXm5mXOAZ8= - -glsl-token-defines@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/glsl-token-defines/-/glsl-token-defines-1.0.0.tgz#cb892aa959936231728470d4f74032489697fa9d" - integrity sha1-y4kqqVmTYjFyhHDU90AySJaX+p0= - dependencies: - glsl-tokenizer "^2.0.0" - -glsl-token-depth@^1.1.0, glsl-token-depth@^1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/glsl-token-depth/-/glsl-token-depth-1.1.2.tgz#23c5e30ee2bd255884b4a28bc850b8f791e95d84" - integrity sha1-I8XjDuK9JViEtKKLyFC495HpXYQ= - -glsl-token-descope@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/glsl-token-descope/-/glsl-token-descope-1.0.2.tgz#0fc90ab326186b82f597b2e77dc9e21efcd32076" - integrity sha1-D8kKsyYYa4L1l7LnfcniHvzTIHY= - dependencies: - glsl-token-assignments "^2.0.0" - glsl-token-depth "^1.1.0" - glsl-token-properties "^1.0.0" - glsl-token-scope "^1.1.0" - -glsl-token-inject-block@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/glsl-token-inject-block/-/glsl-token-inject-block-1.1.0.tgz#e1015f5980c1091824adaa2625f1dfde8bd00034" - integrity sha1-4QFfWYDBCRgkraomJfHf3ovQADQ= - -glsl-token-properties@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/glsl-token-properties/-/glsl-token-properties-1.0.1.tgz#483dc3d839f0d4b5c6171d1591f249be53c28a9e" - integrity sha1-SD3D2Dnw1LXGFx0VkfJJvlPCip4= - -glsl-token-scope@^1.1.0, glsl-token-scope@^1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/glsl-token-scope/-/glsl-token-scope-1.1.2.tgz#a1728e78df24444f9cb93fd18ef0f75503a643b1" - integrity sha1-oXKOeN8kRE+cuT/RjvD3VQOmQ7E= - -glsl-token-string@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/glsl-token-string/-/glsl-token-string-1.0.1.tgz#59441d2f857de7c3449c945666021ece358e48ec" - integrity sha1-WUQdL4V958NEnJRWZgIezjWOSOw= - -glsl-token-whitespace-trim@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/glsl-token-whitespace-trim/-/glsl-token-whitespace-trim-1.0.0.tgz#46d1dfe98c75bd7d504c05d7d11b1b3e9cc93b10" - integrity sha1-RtHf6Yx1vX1QTAXX0RsbPpzJOxA= - -glsl-tokenizer@^2.0.0, glsl-tokenizer@^2.0.2: - version "2.1.5" - resolved "https://registry.yarnpkg.com/glsl-tokenizer/-/glsl-tokenizer-2.1.5.tgz#1c2e78c16589933c274ba278d0a63b370c5fee1a" - integrity sha512-XSZEJ/i4dmz3Pmbnpsy3cKh7cotvFlBiZnDOwnj/05EwNp2XrhQ4XKJxT7/pDt4kp4YcpRSKz8eTV7S+mwV6MA== - dependencies: - through2 "^0.6.3" - -glslify-bundle@^5.0.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/glslify-bundle/-/glslify-bundle-5.1.1.tgz#30d2ddf2e6b935bf44d1299321e3b729782c409a" - integrity sha512-plaAOQPv62M1r3OsWf2UbjN0hUYAB7Aph5bfH58VxJZJhloRNbxOL9tl/7H71K7OLJoSJ2ZqWOKk3ttQ6wy24A== - dependencies: - glsl-inject-defines "^1.0.1" - glsl-token-defines "^1.0.0" - glsl-token-depth "^1.1.1" - glsl-token-descope "^1.0.2" - glsl-token-scope "^1.1.1" - glsl-token-string "^1.0.1" - glsl-token-whitespace-trim "^1.0.0" - glsl-tokenizer "^2.0.2" - murmurhash-js "^1.0.0" - shallow-copy "0.0.1" - -glslify-deps@^1.2.5: - version "1.3.2" - resolved "https://registry.yarnpkg.com/glslify-deps/-/glslify-deps-1.3.2.tgz#c09ee945352bfc07ac2d8a1cc9e3de776328c72b" - integrity sha512-7S7IkHWygJRjcawveXQjRXLO2FTjijPDYC7QfZyAQanY+yGLCFHYnPtsGT9bdyHiwPTw/5a1m1M9hamT2aBpag== - dependencies: - "@choojs/findup" "^0.2.0" - events "^3.2.0" - glsl-resolve "0.0.1" - glsl-tokenizer "^2.0.0" - graceful-fs "^4.1.2" - inherits "^2.0.1" - map-limit "0.0.1" - resolve "^1.0.0" - -glslify@^7.0.0: - version "7.1.1" - resolved "https://registry.yarnpkg.com/glslify/-/glslify-7.1.1.tgz#454d9172b410cb49864029c86d5613947fefd30b" - integrity sha512-bud98CJ6kGZcP9Yxcsi7Iz647wuDz3oN+IZsjCRi5X1PI7t/xPKeL0mOwXJjo+CRZMqvq0CkSJiywCcY7kVYog== - dependencies: - bl "^2.2.1" - concat-stream "^1.5.2" - duplexify "^3.4.5" - falafel "^2.1.0" - from2 "^2.3.0" - glsl-resolve "0.0.1" - glsl-token-whitespace-trim "^1.0.0" - glslify-bundle "^5.0.0" - glslify-deps "^1.2.5" - minimist "^1.2.5" - resolve "^1.1.5" - stack-trace "0.0.9" - static-eval "^2.0.5" - through2 "^2.0.1" - xtend "^4.0.0" - -google-protobuf@3.12.2: - version "3.12.2" - resolved "https://registry.yarnpkg.com/google-protobuf/-/google-protobuf-3.12.2.tgz#50ce9f9b6281235724eb243d6a83e969a2176e53" - integrity sha512-4CZhpuRr1d6HjlyrxoXoocoGFnRYgKULgMtikMddA9ztRyYR59Aondv2FioyxWVamRo0rF2XpYawkTCBEQOSkA== - -graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.6: - version "4.2.8" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.8.tgz#e412b8d33f5e006593cbd3cee6df9f2cebbe802a" - integrity sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg== - -grid-index@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/grid-index/-/grid-index-1.1.0.tgz#97f8221edec1026c8377b86446a7c71e79522ea7" - integrity sha512-HZRwumpOGUrHyxO5bqKZL0B0GlUpwtCAzZ42sgxUPniu33R1LSFH5yrIcBCHjkctCAh3mtWKcKd9J4vDDdeVHA== - -growl@1.10.5: - version "1.10.5" - resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" - integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== - -gzip-size@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-6.0.0.tgz#065367fd50c239c0671cbcbad5be3e2eeb10e462" - integrity sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q== - dependencies: - duplexer "^0.1.2" - -handle-thing@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e" - integrity sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg== - -has-bigints@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.1.tgz#64fe6acb020673e3b78db035a5af69aa9d07b113" - integrity sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA== - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= - -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== - -has-hover@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/has-hover/-/has-hover-1.0.1.tgz#3d97437aeb199c62b8ac08acbdc53d3bc52c17f7" - integrity sha1-PZdDeusZnGK4rAisvcU9O8UsF/c= - dependencies: - is-browser "^2.0.1" - -has-passive-events@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-passive-events/-/has-passive-events-1.0.0.tgz#75fc3dc6dada182c58f24ebbdc018276d1ea3515" - integrity sha512-2vSj6IeIsgvsRMyeQ0JaCX5Q3lX4zMn5HpoVc7MEhQ6pv8Iq9rsXjsp+E5ZwaT7T0xhMT0KmU8gtt1EFVdbJiw== - dependencies: - is-browser "^2.0.1" - -has-symbols@^1.0.1, has-symbols@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423" - integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw== - -has-tostringtag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" - integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== - dependencies: - has-symbols "^1.0.2" - -has@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== - dependencies: - function-bind "^1.1.1" - -he@1.2.0, he@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" - integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== - -header-case@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/header-case/-/header-case-2.0.4.tgz#5a42e63b55177349cf405beb8d775acabb92c063" - integrity sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q== - dependencies: - capital-case "^1.0.4" - tslib "^2.0.3" - -highlight.js@^10.7.2: - version "10.7.3" - resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-10.7.3.tgz#697272e3991356e40c3cac566a74eef681756531" - integrity sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A== - -hoist-non-react-statics@^3.0.0: - version "3.3.2" - resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" - integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== - dependencies: - react-is "^16.7.0" - -hpack.js@^2.1.6: - version "2.1.6" - resolved "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2" - integrity sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI= - dependencies: - inherits "^2.0.1" - obuf "^1.0.0" - readable-stream "^2.0.1" - wbuf "^1.1.0" - -hsluv@^0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/hsluv/-/hsluv-0.0.3.tgz#829107dafb4a9f8b52a1809ed02e091eade6754c" - integrity sha1-gpEH2vtKn4tSoYCe0C4JHq3mdUw= - -html-entities@^2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-2.3.2.tgz#760b404685cb1d794e4f4b744332e3b00dcfe488" - integrity sha512-c3Ab/url5ksaT0WyleslpBEthOzWhrjQbg75y7XUsfSzi3Dgzt0l8w5e7DylRn15MTlMMD58dTfzddNS2kcAjQ== - -html-loader@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/html-loader/-/html-loader-3.0.1.tgz#84d9094d7fc2e3fcd871d1524736953742758585" - integrity sha512-90Sxg9FhTkQEzmmHT2KOAQniTZgC72aifcfR0fZsuo1PJz0K4EXiTwxejTUombF8XShLj5RaZKYsUJhxR6G2dA== - dependencies: - html-minifier-terser "^6.0.2" - parse5 "^6.0.1" - -html-minifier-terser@^6.0.2: - version "6.1.0" - resolved "https://registry.yarnpkg.com/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz#bfc818934cc07918f6b3669f5774ecdfd48f32ab" - integrity sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw== - dependencies: - camel-case "^4.1.2" - clean-css "^5.2.2" - commander "^8.3.0" - he "^1.2.0" - param-case "^3.0.4" - relateurl "^0.2.7" - terser "^5.10.0" - -html-to-react@^1.3.4: - version "1.4.7" - resolved "https://registry.yarnpkg.com/html-to-react/-/html-to-react-1.4.7.tgz#a58129c1b77c6d4e047a647372bd194e25420b89" - integrity sha512-adtKiee5AtnuUhdB8bxbASRP2bW/A0OrlwysEuqZxXdURb0/1XR0m/woE1V5cJA1U5nyzAvk/PdFNO9S73DE/g== - dependencies: - domhandler "^4.0" - htmlparser2 "^7.0" - lodash.camelcase "^4.3.0" - ramda "^0.27.1" - -htmlparser2@^7.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-7.2.0.tgz#8817cdea38bbc324392a90b1990908e81a65f5a5" - integrity sha512-H7MImA4MS6cw7nbyURtLPO1Tms7C5H602LRETv95z1MxO/7CP7rDVROehUYeYBUYEON94NXXDEPmZuq+hX4sog== - dependencies: - domelementtype "^2.0.1" - domhandler "^4.2.2" - domutils "^2.8.0" - entities "^3.0.1" - -http-deceiver@^1.2.7: - version "1.2.7" - resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" - integrity sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc= - -http-errors@1.7.2: - version "1.7.2" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f" - integrity sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg== - dependencies: - depd "~1.1.2" - inherits "2.0.3" - setprototypeof "1.1.1" - statuses ">= 1.5.0 < 2" - toidentifier "1.0.0" - -http-errors@~1.6.2: - version "1.6.3" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" - integrity sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0= - dependencies: - depd "~1.1.2" - inherits "2.0.3" - setprototypeof "1.1.0" - statuses ">= 1.4.0 < 2" - -http-errors@~1.7.2: - version "1.7.3" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06" - integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== - dependencies: - depd "~1.1.2" - inherits "2.0.4" - setprototypeof "1.1.1" - statuses ">= 1.5.0 < 2" - toidentifier "1.0.0" - -http-parser-js@>=0.5.1: - version "0.5.5" - resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.5.tgz#d7c30d5d3c90d865b4a2e870181f9d6f22ac7ac5" - integrity sha512-x+JVEkO2PoM8qqpbPbOL3cqHPwerep7OwzK7Ay+sMQjKzaKCqWvjoXm5tqMP9tXWWTnTzAjIhXg+J99XYuPhPA== - -http-proxy-middleware@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-2.0.1.tgz#7ef3417a479fb7666a571e09966c66a39bd2c15f" - integrity sha512-cfaXRVoZxSed/BmkA7SwBVNI9Kj7HFltaE5rqYOub5kWzWZ+gofV2koVN1j2rMW7pEfSSlCHGJ31xmuyFyfLOg== - dependencies: - "@types/http-proxy" "^1.17.5" - http-proxy "^1.18.1" - is-glob "^4.0.1" - is-plain-obj "^3.0.0" - micromatch "^4.0.2" - -http-proxy@^1.18.1: - version "1.18.1" - resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549" - integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ== - dependencies: - eventemitter3 "^4.0.0" - follow-redirects "^1.0.0" - requires-port "^1.0.0" - -human-signals@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" - integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== - -hyphenate-style-name@^1.0.2, hyphenate-style-name@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz#691879af8e220aea5750e8827db4ef62a54e361d" - integrity sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ== - -iconv-lite@0.4.24: - version "0.4.24" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" - integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== - dependencies: - safer-buffer ">= 2.1.2 < 3" - -iconv-lite@^0.6.2: - version "0.6.3" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" - integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== - dependencies: - safer-buffer ">= 2.1.2 < 3.0.0" - -icss-utils@^4.0.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-4.1.1.tgz#21170b53789ee27447c2f47dd683081403f9a467" - integrity sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA== - dependencies: - postcss "^7.0.14" - -icss-utils@^5.0.0, icss-utils@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-5.1.0.tgz#c6be6858abd013d768e98366ae47e25d5887b1ae" - integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA== - -ieee754@^1.1.12: - version "1.2.1" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" - integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== - -ignore@^5.1.4: - version "5.1.9" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.9.tgz#9ec1a5cbe8e1446ec60d4420060d43aa6e7382fb" - integrity sha512-2zeMQpbKz5dhZ9IwL0gbxSW5w0NK/MSAMtNuhgIHEPmaU3vPdKPL0UdvUCXs5SS4JAwsBxysK5sFMW8ocFiVjQ== - -image-palette@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/image-palette/-/image-palette-2.1.0.tgz#d976525a1df75964ca125d2dba2741e92905547f" - integrity sha512-3ImSEWD26+xuQFdP0RWR4WSXadZwvgrFhjGNpMEapTG1tf2XrBFS2dlKK5hNgH4UIaSQlSUFRn1NeA+zULIWbQ== - dependencies: - color-id "^1.1.0" - pxls "^2.0.0" - quantize "^1.0.2" - -import-fresh@^3.2.1: - version "3.3.0" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" - integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== - dependencies: - parent-module "^1.0.0" - resolve-from "^4.0.0" - -import-local@^3.0.2: - version "3.0.3" - resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.0.3.tgz#4d51c2c495ca9393da259ec66b62e022920211e0" - integrity sha512-bE9iaUY3CXH8Cwfan/abDKAxe1KGT9kyGsBPqf6DMK/z0a2OzAsrukeYNgIH6cH5Xr452jb1TUL8rSfCLjZ9uA== - dependencies: - pkg-dir "^4.2.0" - resolve-cwd "^3.0.0" - -incremental-convex-hull@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/incremental-convex-hull/-/incremental-convex-hull-1.0.1.tgz#51428c14cb9d9a6144bfe69b2851fb377334be1e" - integrity sha1-UUKMFMudmmFEv+abKFH7N3M0vh4= - dependencies: - robust-orientation "^1.1.2" - simplicial-complex "^1.0.0" - -indent-string@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" - integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== - -indexes-of@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" - integrity sha1-8w9xbI4r00bHtn0985FVZqfAVgc= - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -inherits@2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" - integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= - -inline-style-prefixer@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/inline-style-prefixer/-/inline-style-prefixer-6.0.1.tgz#c5c0e43ba8831707afc5f5bbfd97edf45c1fa7ae" - integrity sha512-AsqazZ8KcRzJ9YPN1wMH2aNM7lkWQ8tSPrW5uDk1ziYwiAPWSZnUsC7lfZq+BDqLqz0B4Pho5wscWcJzVvRzDQ== - dependencies: - css-in-js-utils "^2.0.0" - -internal-ip@^6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/internal-ip/-/internal-ip-6.2.0.tgz#d5541e79716e406b74ac6b07b856ef18dc1621c1" - integrity sha512-D8WGsR6yDt8uq7vDMu7mjcR+yRMm3dW8yufyChmszWRjcSHuxLBkR3GdS2HZAjodsaGuCvXeEJpueisXJULghg== - dependencies: - default-gateway "^6.0.0" - ipaddr.js "^1.9.1" - is-ip "^3.1.0" - p-event "^4.2.0" - -internal-slot@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c" - integrity sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA== - dependencies: - get-intrinsic "^1.1.0" - has "^1.0.3" - side-channel "^1.0.4" - -interpolate-loader@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/interpolate-loader/-/interpolate-loader-2.0.1.tgz#bdf0092a3d4732842ac29c20bd03f1fb34891705" - integrity sha512-X5/cKHUnAS5gV/oK9Z6pEjg2xVH5EGgnC5QmaOPwK/o7qMOMyyafwFL1mtH3yAK+COCjyaH56MOs9G8uXG12yA== - dependencies: - escape-string-regexp "^2.0.0" - loader-utils "^1.1.0" - -interpret@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/interpret/-/interpret-2.2.0.tgz#1a78a0b5965c40a5416d007ad6f50ad27c417df9" - integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw== - -interval-tree-1d@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/interval-tree-1d/-/interval-tree-1d-1.0.4.tgz#b44f657de7ddae69ea3f98e0a9ad4bb046b07d11" - integrity sha512-wY8QJH+6wNI0uh4pDQzMvl+478Qh7Rl4qLmqiluxALlNvl+I+o5x38Pw3/z7mDPTPS1dQalZJXsmbvxx5gclhQ== - dependencies: - binary-search-bounds "^2.0.0" - -invert-permutation@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/invert-permutation/-/invert-permutation-1.0.0.tgz#a0a78042eadb36bc17551e787efd1439add54933" - integrity sha1-oKeAQurbNrwXVR54fv0UOa3VSTM= - -iota-array@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/iota-array/-/iota-array-1.0.0.tgz#81ef57fe5d05814cd58c2483632a99c30a0e8087" - integrity sha1-ge9X/l0FgUzVjCSDYyqZwwoOgIc= - -ip-regex@^4.0.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-4.3.0.tgz#687275ab0f57fa76978ff8f4dddc8a23d5990db5" - integrity sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q== - -ip@^1.1.0: - version "1.1.5" - resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" - integrity sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo= - -ipaddr.js@1.9.1, ipaddr.js@^1.9.1: - version "1.9.1" - resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" - integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== - -ipaddr.js@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-2.0.1.tgz#eca256a7a877e917aeb368b0a7497ddf42ef81c0" - integrity sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng== - -is-alphabetical@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-1.0.4.tgz#9e7d6b94916be22153745d184c298cbf986a686d" - integrity sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg== - -is-alphanumerical@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz#7eb9a2431f855f6b1ef1a78e326df515696c4dbf" - integrity sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A== - dependencies: - is-alphabetical "^1.0.0" - is-decimal "^1.0.0" - -is-arguments@^1.0.4, is-arguments@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" - integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-arrayish@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= - -is-base64@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/is-base64/-/is-base64-0.1.0.tgz#a6f20610c6ef4863a51cba32bc0222544b932622" - integrity sha512-WRRyllsGXJM7ZN7gPTCCQ/6wNPTRDwiWdPK66l5sJzcU/oOzcIcRRf0Rux8bkpox/1yjt0F6VJRsQOIG2qz5sg== - -is-bigint@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" - integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== - dependencies: - has-bigints "^1.0.1" - -is-binary-path@~2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" - integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== - dependencies: - binary-extensions "^2.0.0" - -is-blob@^2.0.1: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-blob/-/is-blob-2.1.0.tgz#e36cd82c90653f1e1b930f11baf9c64216a05385" - integrity sha512-SZ/fTft5eUhQM6oF/ZaASFDEdbFVe89Imltn9uZr03wdKMcWNVYSMjQPFtg05QuNkt5l5c135ElvXEQG0rk4tw== - -is-boolean-object@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" - integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-browser@^2.0.1, is-browser@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-browser/-/is-browser-2.1.0.tgz#fc084d59a5fced307d6708c59356bad7007371a9" - integrity sha512-F5rTJxDQ2sW81fcfOR1GnCXT6sVJC104fCyfj+mjpwNEwaPYSn5fte5jiHmBg3DHsIoL/l8Kvw5VN5SsTRcRFQ== - -is-buffer@^1.0.2: - version "1.1.6" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" - integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== - -is-buffer@^2.0.0, is-buffer@^2.0.3: - version "2.0.5" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" - integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== - -is-callable@^1.1.4, is-callable@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945" - integrity sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w== - -is-core-module@^2.2.0: - version "2.8.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.8.0.tgz#0321336c3d0925e497fd97f5d95cb114a5ccd548" - integrity sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw== - dependencies: - has "^1.0.3" - -is-date-object@^1.0.1, is-date-object@^1.0.2: - version "1.0.5" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" - integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== - dependencies: - has-tostringtag "^1.0.0" - -is-decimal@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-decimal/-/is-decimal-1.0.4.tgz#65a3a5958a1c5b63a706e1b333d7cd9f630d3fa5" - integrity sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw== - -is-docker@^2.0.0, is-docker@^2.1.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" - integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== - -is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= - -is-finite@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.1.0.tgz#904135c77fb42c0641d6aa1bcdbc4daa8da082f3" - integrity sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w== - -is-firefox@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/is-firefox/-/is-firefox-1.0.3.tgz#2a2a1567783a417f6e158323108f3861b0918562" - integrity sha1-KioVZ3g6QX9uFYMjEI84YbCRhWI= - -is-float-array@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-float-array/-/is-float-array-1.0.0.tgz#96d67b1cbadf47ab1e05be208933acd386978a09" - integrity sha512-4ew1Sx6B6kEAl3T3NOM0yB94J3NZnBdNt4paw0e8nY73yHHTeTEhyQ3Lj7EQEnv5LD+GxNTaT4L46jcKjjpLiQ== - -is-fullwidth-code-point@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" - integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== - -is-glob@^4.0.1, is-glob@~4.0.1: - version "4.0.3" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" - integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== - dependencies: - is-extglob "^2.1.1" - -is-hexadecimal@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz#cc35c97588da4bd49a8eedd6bc4082d44dcb23a7" - integrity sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw== - -is-iexplorer@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-iexplorer/-/is-iexplorer-1.0.0.tgz#1d72bc66d3fe22eaf6170dda8cf10943248cfc76" - integrity sha1-HXK8ZtP+Iur2Fw3ajPEJQySM/HY= - -is-ip@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/is-ip/-/is-ip-3.1.0.tgz#2ae5ddfafaf05cb8008a62093cf29734f657c5d8" - integrity sha512-35vd5necO7IitFPjd/YBeqwWnyDWbuLH9ZXQdMfDA8TEo7pv5X8yfrvVO3xbJbLUlERCMvf6X0hTUamQxCYJ9Q== - dependencies: - ip-regex "^4.0.0" - -is-map@^2.0.1, is-map@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.2.tgz#00922db8c9bf73e81b7a335827bc2a43f2b91127" - integrity sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg== - -is-mobile@^2.2.1, is-mobile@^2.2.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/is-mobile/-/is-mobile-2.2.2.tgz#f6c9c5d50ee01254ce05e739bdd835f1ed4e9954" - integrity sha512-wW/SXnYJkTjs++tVK5b6kVITZpAZPtUrt9SF80vvxGiF/Oywal+COk1jlRkiVq15RFNEQKQY31TkV24/1T5cVg== - -is-negative-zero@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.1.tgz#3de746c18dda2319241a53675908d8f766f11c24" - integrity sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w== - -is-number-object@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.6.tgz#6a7aaf838c7f0686a50b4553f7e54a96494e89f0" - integrity sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g== - dependencies: - has-tostringtag "^1.0.0" - -is-number@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== - -is-obj@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" - integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8= - -is-path-cwd@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-2.2.0.tgz#67d43b82664a7b5191fd9119127eb300048a9fdb" - integrity sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ== - -is-path-inside@^3.0.2: - version "3.0.3" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" - integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== - -is-plain-obj@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" - integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= - -is-plain-obj@^2.0.0, is-plain-obj@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" - integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== - -is-plain-obj@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-3.0.0.tgz#af6f2ea14ac5a646183a5bbdb5baabbc156ad9d7" - integrity sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA== - -is-plain-obj@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-4.0.0.tgz#06c0999fd7574edf5a906ba5644ad0feb3a84d22" - integrity sha512-NXRbBtUdBioI73y/HmOhogw/U5msYPC9DAtGkJXeFcFWSFZw0mCUsPxk/snTuJHzNKA8kLBK4rH97RMB1BfCXw== - -is-plain-object@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" - integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== - dependencies: - isobject "^3.0.1" - -is-regex@^1.0.4, is-regex@^1.1.1, is-regex@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" - integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-set@^2.0.1, is-set@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.2.tgz#90755fa4c2562dc1c5d4024760d6119b94ca18ec" - integrity sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g== - -is-shared-array-buffer@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz#97b0c85fbdacb59c9c446fe653b82cf2b5b7cfe6" - integrity sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA== - -is-stream@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" - integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== - -is-string-blank@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-string-blank/-/is-string-blank-1.0.1.tgz#866dca066d41d2894ebdfd2d8fe93e586e583a03" - integrity sha512-9H+ZBCVs3L9OYqv8nuUAzpcT9OTgMD1yAWrG7ihlnibdkbtB850heAmYWxHuXc4CHy4lKeK69tN+ny1K7gBIrw== - -is-string@^1.0.5, is-string@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" - integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== - dependencies: - has-tostringtag "^1.0.0" - -is-svg-path@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-svg-path/-/is-svg-path-1.0.2.tgz#77ab590c12b3d20348e5c7a13d0040c87784dda0" - integrity sha1-d6tZDBKz0gNI5cehPQBAyHeE3aA= - -is-symbol@^1.0.2, is-symbol@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" - integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== - dependencies: - has-symbols "^1.0.2" - -is-typed-array@^1.1.7: - version "1.1.8" - resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.8.tgz#cbaa6585dc7db43318bc5b89523ea384a6f65e79" - integrity sha512-HqH41TNZq2fgtGT8WHVFVJhBVGuY3AnP3Q36K8JKXUxSxRgk/d+7NjmwG2vo2mYmXK8UYZKu0qH8bVP5gEisjA== - dependencies: - available-typed-arrays "^1.0.5" - call-bind "^1.0.2" - es-abstract "^1.18.5" - foreach "^2.0.5" - has-tostringtag "^1.0.0" - -is-unicode-supported@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" - integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== - -is-url-superb@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/is-url-superb/-/is-url-superb-4.0.0.tgz#b54d1d2499bb16792748ac967aa3ecb41a33a8c2" - integrity sha512-GI+WjezhPPcbM+tqE9LnmsY5qqjwHzTvjJ36wxYX5ujNXefSUJ/T17r5bqDV8yLhcgB59KTPNOc9O9cmHTPWsA== - -is-weakmap@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.1.tgz#5008b59bdc43b698201d18f62b37b2ca243e8cf2" - integrity sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA== - -is-weakref@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.1.tgz#842dba4ec17fa9ac9850df2d6efbc1737274f2a2" - integrity sha512-b2jKc2pQZjaeFYWEf7ScFj+Be1I+PXmlu572Q8coTXZ+LD/QQZ7ShPMst8h16riVgyXTQwUsFEl74mDvc/3MHQ== - dependencies: - call-bind "^1.0.0" - -is-weakset@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.1.tgz#e9a0af88dbd751589f5e50d80f4c98b780884f83" - integrity sha512-pi4vhbhVHGLxohUw7PhGsueT4vRGFoXhP7+RGN0jKIv9+8PWYCQTqtADngrxOm2g46hoH0+g8uZZBzMrvVGDmw== - -is-wsl@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" - integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== - dependencies: - is-docker "^2.0.0" - -isarray@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" - integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= - -isarray@^2.0.1, isarray@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" - integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== - -isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= - -isbinaryfile@^4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-4.0.8.tgz#5d34b94865bd4946633ecc78a026fc76c5b11fcf" - integrity sha512-53h6XFniq77YdW+spoRrebh0mnmTxRPTlcuIArO57lmMdq4uBKFKaeTjnb92oYWrSn/LVL+LT+Hap2tFQj8V+w== - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= - -isobject@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" - integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= - -jest-worker@^27.0.6: - version "27.4.0" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.4.0.tgz#fa10dddc611cbb47a4153543dd16a0c7e7fd745c" - integrity sha512-4WuKcUxtzxBoKOUFbt1MtTY9fJwPVD4aN/4Cgxee7OLetPZn5as2bjfZz98XSf2Zq1JFfhqPZpS+43BmWXKgCA== - dependencies: - "@types/node" "*" - merge-stream "^2.0.0" - supports-color "^8.0.0" - -jquery@3.5.1: - version "3.5.1" - resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.5.1.tgz#d7b4d08e1bfdb86ad2f1a3d039ea17304717abb5" - integrity sha512-XwIBPqcMn57FxfT+Go5pzySnm4KWkT1Tv7gjrpT1srtf8Weynl6R273VJ5GjkRb51IzMp5nbaPjJXMWeju2MKg== - -"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - -js-yaml@4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" - integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== - dependencies: - argparse "^2.0.1" - -jsesc@^2.5.1: - version "2.5.2" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" - integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== - -jsesc@~0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" - integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= - -json-parse-better-errors@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" - integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== - -json-parse-even-better-errors@^2.3.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" - integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== - -json-schema-traverse@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" - integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== - -json-schema-traverse@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" - integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== - -json5@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" - integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== - dependencies: - minimist "^1.2.0" - -json5@^2.1.2: - version "2.2.0" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.0.tgz#2dfefe720c6ba525d9ebd909950f0515316c89a3" - integrity sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA== - dependencies: - minimist "^1.2.5" - -jsonfile@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" - integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= - optionalDependencies: - graceful-fs "^4.1.6" - -just-debounce-it@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/just-debounce-it/-/just-debounce-it-3.0.1.tgz#8c8a4c9327c9523366ec79ac9a959a938153bd2f" - integrity sha512-6EQWOpRV8fm/ame6XvGBSxvsjoMbqj7JS9TV/4Q9aOXt9DQw22GBfTGP6gTAqcBNN/PbzlwtwH7jtM0k9oe9pg== - -karma-chrome-launcher@3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/karma-chrome-launcher/-/karma-chrome-launcher-3.1.0.tgz#805a586799a4d05f4e54f72a204979f3f3066738" - integrity sha512-3dPs/n7vgz1rxxtynpzZTvb9y/GIaW8xjAwcIGttLbycqoFtI7yo1NGnQi6oFTherRE+GIhCAHZC4vEqWGhNvg== - dependencies: - which "^1.2.1" - -karma-mocha@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/karma-mocha/-/karma-mocha-2.0.1.tgz#4b0254a18dfee71bdbe6188d9a6861bf86b0cd7d" - integrity sha512-Tzd5HBjm8his2OA4bouAsATYEpZrp9vC7z5E5j4C5Of5Rrs1jY67RAwXNcVmd/Bnk1wgvQRou0zGVLey44G4tQ== - dependencies: - minimist "^1.2.3" - -karma-sourcemap-loader@0.3.8: - version "0.3.8" - resolved "https://registry.yarnpkg.com/karma-sourcemap-loader/-/karma-sourcemap-loader-0.3.8.tgz#d4bae72fb7a8397328a62b75013d2df937bdcf9c" - integrity sha512-zorxyAakYZuBcHRJE+vbrK2o2JXLFWK8VVjiT/6P+ltLBUGUvqTEkUiQ119MGdOrK7mrmxXHZF1/pfT6GgIZ6g== - dependencies: - graceful-fs "^4.1.2" - -karma-webpack@5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/karma-webpack/-/karma-webpack-5.0.0.tgz#2a2c7b80163fe7ffd1010f83f5507f95ef39f840" - integrity sha512-+54i/cd3/piZuP3dr54+NcFeKOPnys5QeM1IY+0SPASwrtHsliXUiCL50iW+K9WWA7RvamC4macvvQ86l3KtaA== - dependencies: - glob "^7.1.3" - minimatch "^3.0.4" - webpack-merge "^4.1.5" - -karma@6.3.4: - version "6.3.4" - resolved "https://registry.yarnpkg.com/karma/-/karma-6.3.4.tgz#359899d3aab3d6b918ea0f57046fd2a6b68565e6" - integrity sha512-hbhRogUYIulfkBTZT7xoPrCYhRBnBoqbbL4fszWD0ReFGUxU+LYBr3dwKdAluaDQ/ynT9/7C+Lf7pPNW4gSx4Q== - dependencies: - body-parser "^1.19.0" - braces "^3.0.2" - chokidar "^3.5.1" - colors "^1.4.0" - connect "^3.7.0" - di "^0.0.1" - dom-serialize "^2.2.1" - glob "^7.1.7" - graceful-fs "^4.2.6" - http-proxy "^1.18.1" - isbinaryfile "^4.0.8" - lodash "^4.17.21" - log4js "^6.3.0" - mime "^2.5.2" - minimatch "^3.0.4" - qjobs "^1.2.0" - range-parser "^1.2.1" - rimraf "^3.0.2" - socket.io "^3.1.0" - source-map "^0.6.1" - tmp "^0.2.1" - ua-parser-js "^0.7.28" - yargs "^16.1.1" - -kdbush@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/kdbush/-/kdbush-3.0.0.tgz#f8484794d47004cc2d85ed3a79353dbe0abc2bf0" - integrity sha512-hRkd6/XW4HTsA9vjVpY9tuXJYLSlelnkTmVFu4M9/7MIYQtFcHpbugAU7UbOfjOiVSVYl2fqgBuJ32JUmRo5Ew== - -kind-of@^6.0.2: - version "6.0.3" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" - integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== - -klona@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/klona/-/klona-2.0.5.tgz#d166574d90076395d9963aa7a928fabb8d76afbc" - integrity sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ== - -lerp@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/lerp/-/lerp-1.0.3.tgz#a18c8968f917896de15ccfcc28d55a6b731e776e" - integrity sha1-oYyJaPkXiW3hXM/MKNVaa3Med24= - -levn@~0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" - integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= - dependencies: - prelude-ls "~1.1.2" - type-check "~0.3.2" - -lines-and-columns@^1.1.6: - version "1.2.4" - resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" - integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== - -loader-runner@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.2.0.tgz#d7022380d66d14c5fb1d496b89864ebcfd478384" - integrity sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw== - -loader-utils@^1.1.0, loader-utils@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz#c579b5e34cb34b1a74edc6c1fb36bfa371d5a613" - integrity sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA== - dependencies: - big.js "^5.2.2" - emojis-list "^3.0.0" - json5 "^1.0.1" - -loader-utils@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.2.tgz#d6e3b4fb81870721ae4e0868ab11dd638368c129" - integrity sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A== - dependencies: - big.js "^5.2.2" - emojis-list "^3.0.0" - json5 "^2.1.2" - -locate-path@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" - integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== - dependencies: - p-locate "^4.1.0" - -locate-path@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" - integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== - dependencies: - p-locate "^5.0.0" - -lodash.camelcase@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" - integrity sha1-soqmKIorn8ZRA1x3EfZathkDMaY= - -lodash.debounce@^4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" - integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= - -lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.20, lodash@^4.17.21: - version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" - integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== - -log-symbols@4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" - integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== - dependencies: - chalk "^4.1.0" - is-unicode-supported "^0.1.0" - -log4js@^6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/log4js/-/log4js-6.3.0.tgz#10dfafbb434351a3e30277a00b9879446f715bcb" - integrity sha512-Mc8jNuSFImQUIateBFwdOQcmC6Q5maU0VVvdC2R6XMb66/VnT+7WS4D/0EeNMZu1YODmJe5NIn2XftCzEocUgw== - dependencies: - date-format "^3.0.0" - debug "^4.1.1" - flatted "^2.0.1" - rfdc "^1.1.4" - streamroller "^2.2.4" - -longest-streak@^2.0.0: - version "2.0.4" - resolved "https://registry.yarnpkg.com/longest-streak/-/longest-streak-2.0.4.tgz#b8599957da5b5dab64dee3fe316fa774597d90e4" - integrity sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg== - -loose-envify@^1.1.0, loose-envify@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" - integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== - dependencies: - js-tokens "^3.0.0 || ^4.0.0" - -lower-case@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28" - integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg== - dependencies: - tslib "^2.0.3" - -lru-cache@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" - integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== - dependencies: - yallist "^4.0.0" - -magic-string@^0.25.3: - version "0.25.7" - resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.7.tgz#3f497d6fd34c669c6798dcb821f2ef31f5445051" - integrity sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA== - dependencies: - sourcemap-codec "^1.4.4" - -make-dir@^3.0.2, make-dir@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" - integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== - dependencies: - semver "^6.0.0" - -map-limit@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/map-limit/-/map-limit-0.0.1.tgz#eb7961031c0f0e8d001bf2d56fab685d58822f38" - integrity sha1-63lhAxwPDo0AG/LVb6toXViCLzg= - dependencies: - once "~1.3.0" - -mapbox-gl@1.10.1: - version "1.10.1" - resolved "https://registry.yarnpkg.com/mapbox-gl/-/mapbox-gl-1.10.1.tgz#7dbd53bdf2f78e45e125c1115e94dea286ef663c" - integrity sha512-0aHt+lFUpYfvh0kMIqXqNXqoYMuhuAsMlw87TbhWrw78Tx2zfuPI0Lx31/YPUgJ+Ire0tzQ4JnuBL7acDNXmMg== - dependencies: - "@mapbox/geojson-rewind" "^0.5.0" - "@mapbox/geojson-types" "^1.0.2" - "@mapbox/jsonlint-lines-primitives" "^2.0.2" - "@mapbox/mapbox-gl-supported" "^1.5.0" - "@mapbox/point-geometry" "^0.1.0" - "@mapbox/tiny-sdf" "^1.1.1" - "@mapbox/unitbezier" "^0.0.0" - "@mapbox/vector-tile" "^1.3.1" - "@mapbox/whoots-js" "^3.1.0" - csscolorparser "~1.0.3" - earcut "^2.2.2" - geojson-vt "^3.2.1" - gl-matrix "^3.2.1" - grid-index "^1.1.0" - minimist "^1.2.5" - murmurhash-js "^1.0.0" - pbf "^3.2.1" - potpack "^1.0.1" - quickselect "^2.0.0" - rw "^1.3.3" - supercluster "^7.0.0" - tinyqueue "^2.0.3" - vt-pbf "^3.1.1" - -marching-simplex-table@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/marching-simplex-table/-/marching-simplex-table-1.0.0.tgz#bc16256e0f8f9b558aa9b2872f8832d9433f52ea" - integrity sha1-vBYlbg+Pm1WKqbKHL4gy2UM/Uuo= - dependencies: - convex-hull "^1.0.3" - -markdown-table@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/markdown-table/-/markdown-table-2.0.0.tgz#194a90ced26d31fe753d8b9434430214c011865b" - integrity sha512-Ezda85ToJUBhM6WGaG6veasyym+Tbs3cMAw/ZhOPqXiYsr0jgocBV3j3nx+4lk47plLlIqjwuTm/ywVI+zjJ/A== - dependencies: - repeat-string "^1.0.0" - -mat4-decompose@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/mat4-decompose/-/mat4-decompose-1.0.4.tgz#65eb4fe39d70878f7a444eb4624d52f7e7eb2faf" - integrity sha1-ZetP451wh496RE60Yk1S9+frL68= - dependencies: - gl-mat4 "^1.0.1" - gl-vec3 "^1.0.2" - -mat4-interpolate@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/mat4-interpolate/-/mat4-interpolate-1.0.4.tgz#55ffe9eb3c35295e2c0d5a9f7725d9068a89ff74" - integrity sha1-Vf/p6zw1KV4sDVqfdyXZBoqJ/3Q= - dependencies: - gl-mat4 "^1.0.1" - gl-vec3 "^1.0.2" - mat4-decompose "^1.0.3" - mat4-recompose "^1.0.3" - quat-slerp "^1.0.0" - -mat4-recompose@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/mat4-recompose/-/mat4-recompose-1.0.4.tgz#3953c230ff2473dc772ee014a52c925cf81b0e4d" - integrity sha1-OVPCMP8kc9x3LuAUpSySXPgbDk0= - dependencies: - gl-mat4 "^1.0.1" - -math-log2@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/math-log2/-/math-log2-1.0.1.tgz#fb8941be5f5ebe8979e718e6273b178e58694565" - integrity sha1-+4lBvl9evol55xjmJzsXjlhpRWU= - -matrix-camera-controller@^2.1.1, matrix-camera-controller@^2.1.3: - version "2.1.4" - resolved "https://registry.yarnpkg.com/matrix-camera-controller/-/matrix-camera-controller-2.1.4.tgz#d316ae5e99fe801610c1d7842ab54566d4c62411" - integrity sha512-zsPGPONclrKSImNpqqKDTcqFpWLAIwMXEJtCde4IFPOw1dA9udzFg4HOFytOTosOFanchrx7+Hqq6glLATIxBA== - dependencies: - binary-search-bounds "^2.0.0" - gl-mat4 "^1.1.2" - gl-vec3 "^1.0.3" - mat4-interpolate "^1.0.3" - -mdast-add-list-metadata@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/mdast-add-list-metadata/-/mdast-add-list-metadata-1.0.1.tgz#95e73640ce2fc1fa2dcb7ec443d09e2bfe7db4cf" - integrity sha512-fB/VP4MJ0LaRsog7hGPxgOrSL3gE/2uEdZyDuSEnKCv/8IkYHiDkIQSbChiJoHyxZZXZ9bzckyRk+vNxFzh8rA== - dependencies: - unist-util-visit-parents "1.1.2" - -mdast-util-find-and-replace@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/mdast-util-find-and-replace/-/mdast-util-find-and-replace-1.1.1.tgz#b7db1e873f96f66588c321f1363069abf607d1b5" - integrity sha512-9cKl33Y21lyckGzpSmEQnIDjEfeeWelN5s1kUW1LwdB0Fkuq2u+4GdqcGEygYxJE8GVqCl0741bYXHgamfWAZA== - dependencies: - escape-string-regexp "^4.0.0" - unist-util-is "^4.0.0" - unist-util-visit-parents "^3.0.0" - -mdast-util-from-markdown@^0.8.0: - version "0.8.5" - resolved "https://registry.yarnpkg.com/mdast-util-from-markdown/-/mdast-util-from-markdown-0.8.5.tgz#d1ef2ca42bc377ecb0463a987910dae89bd9a28c" - integrity sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ== - dependencies: - "@types/mdast" "^3.0.0" - mdast-util-to-string "^2.0.0" - micromark "~2.11.0" - parse-entities "^2.0.0" - unist-util-stringify-position "^2.0.0" - -mdast-util-gfm-autolink-literal@^0.1.0: - version "0.1.3" - resolved "https://registry.yarnpkg.com/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-0.1.3.tgz#9c4ff399c5ddd2ece40bd3b13e5447d84e385fb7" - integrity sha512-GjmLjWrXg1wqMIO9+ZsRik/s7PLwTaeCHVB7vRxUwLntZc8mzmTsLVr6HW1yLokcnhfURsn5zmSVdi3/xWWu1A== - dependencies: - ccount "^1.0.0" - mdast-util-find-and-replace "^1.1.0" - micromark "^2.11.3" - -mdast-util-gfm-strikethrough@^0.2.0: - version "0.2.3" - resolved "https://registry.yarnpkg.com/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-0.2.3.tgz#45eea337b7fff0755a291844fbea79996c322890" - integrity sha512-5OQLXpt6qdbttcDG/UxYY7Yjj3e8P7X16LzvpX8pIQPYJ/C2Z1qFGMmcw+1PZMUM3Z8wt8NRfYTvCni93mgsgA== - dependencies: - mdast-util-to-markdown "^0.6.0" - -mdast-util-gfm-table@^0.1.0: - version "0.1.6" - resolved "https://registry.yarnpkg.com/mdast-util-gfm-table/-/mdast-util-gfm-table-0.1.6.tgz#af05aeadc8e5ee004eeddfb324b2ad8c029b6ecf" - integrity sha512-j4yDxQ66AJSBwGkbpFEp9uG/LS1tZV3P33fN1gkyRB2LoRL+RR3f76m0HPHaby6F4Z5xr9Fv1URmATlRRUIpRQ== - dependencies: - markdown-table "^2.0.0" - mdast-util-to-markdown "~0.6.0" - -mdast-util-gfm-task-list-item@^0.1.0: - version "0.1.6" - resolved "https://registry.yarnpkg.com/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-0.1.6.tgz#70c885e6b9f543ddd7e6b41f9703ee55b084af10" - integrity sha512-/d51FFIfPsSmCIRNp7E6pozM9z1GYPIkSy1urQ8s/o4TC22BZ7DqfHFWiqBD23bc7J3vV1Fc9O4QIHBlfuit8A== - dependencies: - mdast-util-to-markdown "~0.6.0" - -mdast-util-gfm@^0.1.0: - version "0.1.2" - resolved "https://registry.yarnpkg.com/mdast-util-gfm/-/mdast-util-gfm-0.1.2.tgz#8ecddafe57d266540f6881f5c57ff19725bd351c" - integrity sha512-NNkhDx/qYcuOWB7xHUGWZYVXvjPFFd6afg6/e2g+SV4r9q5XUcCbV4Wfa3DLYIiD+xAEZc6K4MGaE/m0KDcPwQ== - dependencies: - mdast-util-gfm-autolink-literal "^0.1.0" - mdast-util-gfm-strikethrough "^0.2.0" - mdast-util-gfm-table "^0.1.0" - mdast-util-gfm-task-list-item "^0.1.0" - mdast-util-to-markdown "^0.6.1" - -mdast-util-to-markdown@^0.6.0, mdast-util-to-markdown@^0.6.1, mdast-util-to-markdown@~0.6.0: - version "0.6.5" - resolved "https://registry.yarnpkg.com/mdast-util-to-markdown/-/mdast-util-to-markdown-0.6.5.tgz#b33f67ca820d69e6cc527a93d4039249b504bebe" - integrity sha512-XeV9sDE7ZlOQvs45C9UKMtfTcctcaj/pGwH8YLbMHoMOXNNCn2LsqVQOqrF1+/NU8lKDAqozme9SCXWyo9oAcQ== - dependencies: - "@types/unist" "^2.0.0" - longest-streak "^2.0.0" - mdast-util-to-string "^2.0.0" - parse-entities "^2.0.0" - repeat-string "^1.0.0" - zwitch "^1.0.0" - -mdast-util-to-string@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz#b8cfe6a713e1091cb5b728fc48885a4767f8b97b" - integrity sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w== - -media-typer@0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" - integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= - -memfs@^3.2.2: - version "3.4.0" - resolved "https://registry.yarnpkg.com/memfs/-/memfs-3.4.0.tgz#8bc12062b973be6b295d4340595736a656f0a257" - integrity sha512-o/RfP0J1d03YwsAxyHxAYs2kyJp55AFkMazlFAZFR2I2IXkxiUTXRabJ6RmNNCQ83LAD2jy52Khj0m3OffpNdA== - dependencies: - fs-monkey "1.0.3" - -memoize-one@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/memoize-one/-/memoize-one-6.0.0.tgz#b2591b871ed82948aee4727dc6abceeeac8c1045" - integrity sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw== - -memory-fs@^0.4.0: - version "0.4.1" - resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" - integrity sha1-OpoguEYlI+RHz7x+i7gO1me/xVI= - dependencies: - errno "^0.1.3" - readable-stream "^2.0.1" - -merge-descriptors@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" - integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= - -merge-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" - integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== - -merge2@^1.3.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" - integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== - -methods@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" - integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= - -micromark-extension-gfm-autolink-literal@~0.5.0: - version "0.5.7" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-0.5.7.tgz#53866c1f0c7ef940ae7ca1f72c6faef8fed9f204" - integrity sha512-ePiDGH0/lhcngCe8FtH4ARFoxKTUelMp4L7Gg2pujYD5CSMb9PbblnyL+AAMud/SNMyusbS2XDSiPIRcQoNFAw== - dependencies: - micromark "~2.11.3" - -micromark-extension-gfm-strikethrough@~0.6.5: - version "0.6.5" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-0.6.5.tgz#96cb83356ff87bf31670eefb7ad7bba73e6514d1" - integrity sha512-PpOKlgokpQRwUesRwWEp+fHjGGkZEejj83k9gU5iXCbDG+XBA92BqnRKYJdfqfkrRcZRgGuPuXb7DaK/DmxOhw== - dependencies: - micromark "~2.11.0" - -micromark-extension-gfm-table@~0.4.0: - version "0.4.3" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm-table/-/micromark-extension-gfm-table-0.4.3.tgz#4d49f1ce0ca84996c853880b9446698947f1802b" - integrity sha512-hVGvESPq0fk6ALWtomcwmgLvH8ZSVpcPjzi0AjPclB9FsVRgMtGZkUcpE0zgjOCFAznKepF4z3hX8z6e3HODdA== - dependencies: - micromark "~2.11.0" - -micromark-extension-gfm-tagfilter@~0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-0.3.0.tgz#d9f26a65adee984c9ccdd7e182220493562841ad" - integrity sha512-9GU0xBatryXifL//FJH+tAZ6i240xQuFrSL7mYi8f4oZSbc+NvXjkrHemeYP0+L4ZUT+Ptz3b95zhUZnMtoi/Q== - -micromark-extension-gfm-task-list-item@~0.3.0: - version "0.3.3" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-0.3.3.tgz#d90c755f2533ed55a718129cee11257f136283b8" - integrity sha512-0zvM5iSLKrc/NQl84pZSjGo66aTGd57C1idmlWmE87lkMcXrTxg1uXa/nXomxJytoje9trP0NDLvw4bZ/Z/XCQ== - dependencies: - micromark "~2.11.0" - -micromark-extension-gfm@^0.3.0: - version "0.3.3" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm/-/micromark-extension-gfm-0.3.3.tgz#36d1a4c089ca8bdfd978c9bd2bf1a0cb24e2acfe" - integrity sha512-oVN4zv5/tAIA+l3GbMi7lWeYpJ14oQyJ3uEim20ktYFAcfX1x3LNlFGGlmrZHt7u9YlKExmyJdDGaTt6cMSR/A== - dependencies: - micromark "~2.11.0" - micromark-extension-gfm-autolink-literal "~0.5.0" - micromark-extension-gfm-strikethrough "~0.6.5" - micromark-extension-gfm-table "~0.4.0" - micromark-extension-gfm-tagfilter "~0.3.0" - micromark-extension-gfm-task-list-item "~0.3.0" - -micromark@^2.11.3, micromark@~2.11.0, micromark@~2.11.3: - version "2.11.4" - resolved "https://registry.yarnpkg.com/micromark/-/micromark-2.11.4.tgz#d13436138eea826383e822449c9a5c50ee44665a" - integrity sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA== - dependencies: - debug "^4.0.0" - parse-entities "^2.0.0" - -micromatch@^4.0.2, micromatch@^4.0.4: - version "4.0.4" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9" - integrity sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg== - dependencies: - braces "^3.0.1" - picomatch "^2.2.3" - -mime-db@1.51.0, "mime-db@>= 1.43.0 < 2": - version "1.51.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.51.0.tgz#d9ff62451859b18342d960850dc3cfb77e63fb0c" - integrity sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g== - -mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.17, mime-types@~2.1.24: - version "2.1.34" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.34.tgz#5a712f9ec1503511a945803640fafe09d3793c24" - integrity sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A== - dependencies: - mime-db "1.51.0" - -mime@1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" - integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== - -mime@^2.5.2: - version "2.6.0" - resolved "https://registry.yarnpkg.com/mime/-/mime-2.6.0.tgz#a2a682a95cd4d0cb1d6257e28f83da7e35800367" - integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg== - -mimic-fn@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" - integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== - -minimalistic-assert@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" - integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== - -minimatch@3.0.4, minimatch@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" - integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== - dependencies: - brace-expansion "^1.1.7" - -minimist@^1.2.0, minimist@^1.2.3, minimist@^1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" - integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== - -mkdirp@^0.5.5: - version "0.5.5" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" - integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== - dependencies: - minimist "^1.2.5" - -mocha@9.1.2: - version "9.1.2" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-9.1.2.tgz#93f53175b0f0dc4014bd2d612218fccfcf3534d3" - integrity sha512-ta3LtJ+63RIBP03VBjMGtSqbe6cWXRejF9SyM9Zyli1CKZJZ+vfCTj3oW24V7wAphMJdpOFLoMI3hjJ1LWbs0w== - dependencies: - "@ungap/promise-all-settled" "1.1.2" - ansi-colors "4.1.1" - browser-stdout "1.3.1" - chokidar "3.5.2" - debug "4.3.2" - diff "5.0.0" - escape-string-regexp "4.0.0" - find-up "5.0.0" - glob "7.1.7" - growl "1.10.5" - he "1.2.0" - js-yaml "4.1.0" - log-symbols "4.1.0" - minimatch "3.0.4" - ms "2.1.3" - nanoid "3.1.25" - serialize-javascript "6.0.0" - strip-json-comments "3.1.1" - supports-color "8.1.1" - which "2.0.2" - workerpool "6.1.5" - yargs "16.2.0" - yargs-parser "20.2.4" - yargs-unparser "2.0.0" - -monotone-convex-hull-2d@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/monotone-convex-hull-2d/-/monotone-convex-hull-2d-1.0.1.tgz#47f5daeadf3c4afd37764baa1aa8787a40eee08c" - integrity sha1-R/Xa6t88Sv03dkuqGqh4ekDu4Iw= - dependencies: - robust-orientation "^1.1.3" - -mouse-change@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/mouse-change/-/mouse-change-1.4.0.tgz#c2b77e5bfa34a43ce1445c8157a4e4dc9895c14f" - integrity sha1-wrd+W/o0pDzhRFyBV6Tk3JiVwU8= - dependencies: - mouse-event "^1.0.0" - -mouse-event-offset@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/mouse-event-offset/-/mouse-event-offset-3.0.2.tgz#dfd86a6e248c6ba8cad53b905d5037a2063e9984" - integrity sha1-39hqbiSMa6jK1TuQXVA3ogY+mYQ= - -mouse-event@^1.0.0: - version "1.0.5" - resolved "https://registry.yarnpkg.com/mouse-event/-/mouse-event-1.0.5.tgz#b3789edb7109997d5a932d1d01daa1543a501732" - integrity sha1-s3ie23EJmX1aky0dAdqhVDpQFzI= - -mouse-wheel@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/mouse-wheel/-/mouse-wheel-1.2.0.tgz#6d2903b1ea8fb48e61f1b53b9036773f042cdb5c" - integrity sha1-bSkDseqPtI5h8bU7kDZ3PwQs21w= - dependencies: - right-now "^1.0.0" - signum "^1.0.0" - to-px "^1.0.1" - -mrmime@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/mrmime/-/mrmime-1.0.0.tgz#14d387f0585a5233d291baba339b063752a2398b" - integrity sha512-a70zx7zFfVO7XpnQ2IX1Myh9yY4UYvfld/dikWRnsXxbyvMcfz+u6UfgNAtH+k2QqtJuzVpv6eLTx1G2+WKZbQ== - -ms@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= - -ms@2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" - integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== - -ms@2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -ms@2.1.3, ms@^2.1.1: - version "2.1.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== - -multicast-dns-service-types@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz#899f11d9686e5e05cb91b35d5f0e63b773cfc901" - integrity sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE= - -multicast-dns@^6.0.1: - version "6.2.3" - resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-6.2.3.tgz#a0ec7bd9055c4282f790c3c82f4e28db3b31b229" - integrity sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g== - dependencies: - dns-packet "^1.3.1" - thunky "^1.0.2" - -mumath@^3.3.4: - version "3.3.4" - resolved "https://registry.yarnpkg.com/mumath/-/mumath-3.3.4.tgz#48d4a0f0fd8cad4e7b32096ee89b161a63d30bbf" - integrity sha1-SNSg8P2MrU57Mglu6JsWGmPTC78= - dependencies: - almost-equal "^1.1.0" - -murmurhash-js@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/murmurhash-js/-/murmurhash-js-1.0.0.tgz#b06278e21fc6c37fa5313732b0412bcb6ae15f51" - integrity sha1-sGJ44h/Gw3+lMTcysEEry2rhX1E= - -nanoid@3.1.25: - version "3.1.25" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.25.tgz#09ca32747c0e543f0e1814b7d3793477f9c8e152" - integrity sha512-rdwtIXaXCLFAQbnfqDRnI6jaRHp9fTcYBjtFKE8eezcZ7LuLjhUaQGNeMXf1HmRoCH32CLz6XwX0TtxEOS/A3Q== - -nanoid@^3.1.30: - version "3.1.30" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.30.tgz#63f93cc548d2a113dc5dfbc63bfa09e2b9b64362" - integrity sha512-zJpuPDwOv8D2zq2WRoMe1HsfZthVewpel9CAvTfc/2mBD1uUT/agc5f7GHGWXlYkFvi1mVxe4IjvP2HNrop7nQ== - -ndarray-extract-contour@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/ndarray-extract-contour/-/ndarray-extract-contour-1.0.1.tgz#0aee113a3a33b226b90c4888cf877bf4751305e4" - integrity sha1-Cu4ROjozsia5DEiIz4d79HUTBeQ= - dependencies: - typedarray-pool "^1.0.0" - -ndarray-gradient@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/ndarray-gradient/-/ndarray-gradient-1.0.1.tgz#16126a78ac241162248224aa662b6db6a5885402" - integrity sha512-+xONVi7xxTCGL6KOb11Yyoe0tPNqAUKF39CvFoRjL5pdOmPd2G2pckK9lD5bpLF3q45LLnYNyiUSJSdNmQ2MTg== - dependencies: - cwise-compiler "^1.0.0" - dup "^1.0.0" - -ndarray-linear-interpolate@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/ndarray-linear-interpolate/-/ndarray-linear-interpolate-1.0.0.tgz#78bc92b85b9abc15b6e67ee65828f9e2137ae72b" - integrity sha1-eLySuFuavBW25n7mWCj54hN65ys= - -ndarray-ops@^1.1.0, ndarray-ops@^1.2.1, ndarray-ops@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/ndarray-ops/-/ndarray-ops-1.2.2.tgz#59e88d2c32a7eebcb1bc690fae141579557a614e" - integrity sha1-WeiNLDKn7ryxvGkPrhQVeVV6YU4= - dependencies: - cwise-compiler "^1.0.0" - -ndarray-pack@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/ndarray-pack/-/ndarray-pack-1.2.1.tgz#8caebeaaa24d5ecf70ff86020637977da8ee585a" - integrity sha1-jK6+qqJNXs9w/4YCBjeXfajuWFo= - dependencies: - cwise-compiler "^1.1.2" - ndarray "^1.0.13" - -ndarray-scratch@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/ndarray-scratch/-/ndarray-scratch-1.2.0.tgz#6304636d62eba93db4727ac13c693341dba50e01" - integrity sha1-YwRjbWLrqT20cnrBPGkzQdulDgE= - dependencies: - ndarray "^1.0.14" - ndarray-ops "^1.2.1" - typedarray-pool "^1.0.2" - -ndarray-sort@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/ndarray-sort/-/ndarray-sort-1.0.1.tgz#fea05b4cb834c7f4e0216a354f3ca751300dfd6a" - integrity sha1-/qBbTLg0x/TgIWo1TzynUTAN/Wo= - dependencies: - typedarray-pool "^1.0.0" - -ndarray@^1.0.11, ndarray@^1.0.13, ndarray@^1.0.14, ndarray@^1.0.15, ndarray@^1.0.18, ndarray@^1.0.19: - version "1.0.19" - resolved "https://registry.yarnpkg.com/ndarray/-/ndarray-1.0.19.tgz#6785b5f5dfa58b83e31ae5b2a058cfd1ab3f694e" - integrity sha512-B4JHA4vdyZU30ELBw3g7/p9bZupyew5a7tX1Y/gGeF2hafrPaQZhgrGQfsvgfYbgdFZjYwuEcnaobeM/WMW+HQ== - dependencies: - iota-array "^1.0.0" - is-buffer "^1.0.2" - -negotiator@0.6.2: - version "0.6.2" - resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" - integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== - -neo-async@^2.6.2: - version "2.6.2" - resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" - integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== - -next-tick@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c" - integrity sha1-yobR/ogoFpsBICCOPchCS524NCw= - -nextafter@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/nextafter/-/nextafter-1.0.0.tgz#b7d77b535310e3e097e6025abb0a903477ec1a3a" - integrity sha1-t9d7U1MQ4+CX5gJauwqQNHfsGjo= - dependencies: - double-bits "^1.1.0" - -no-case@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d" - integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg== - dependencies: - lower-case "^2.0.2" - tslib "^2.0.3" - -node-forge@^0.10.0: - version "0.10.0" - resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.10.0.tgz#32dea2afb3e9926f02ee5ce8794902691a676bf3" - integrity sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA== - -node-releases@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.1.tgz#3d1d395f204f1f2f29a54358b9fb678765ad2fc5" - integrity sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA== - -normalize-path@^3.0.0, normalize-path@~3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" - integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== - -normalize-range@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" - integrity sha1-LRDAa9/TEuqXd2laTShDlFa3WUI= - -normalize-svg-path@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/normalize-svg-path/-/normalize-svg-path-1.1.0.tgz#0e614eca23c39f0cffe821d6be6cd17e569a766c" - integrity sha512-r9KHKG2UUeB5LoTouwDzBy2VxXlHsiM6fyLQvnJa0S5hrhzqElH/CH7TUGhT1fVvIYBIKf3OpY4YJ4CK+iaqHg== - dependencies: - svg-arc-to-cubic-bezier "^3.0.0" - -normalize-svg-path@~0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/normalize-svg-path/-/normalize-svg-path-0.1.0.tgz#456360e60ece75fbef7b5d7e160480e7ffd16fe5" - integrity sha1-RWNg5g7Odfvve11+FgSA5//Rb+U= - -normals@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/normals/-/normals-1.1.0.tgz#325b595ed34afe467a6c55a14fd9085787ff59c0" - integrity sha1-MltZXtNK/kZ6bFWhT9kIV4f/WcA= - -npm-run-path@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" - integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== - dependencies: - path-key "^3.0.0" - -number-is-integer@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/number-is-integer/-/number-is-integer-1.0.1.tgz#e59bca172ffed27318e79c7ceb6cb72c095b2152" - integrity sha1-5ZvKFy/+0nMY55x862y3LAlbIVI= - dependencies: - is-finite "^1.0.1" - -numeric@^1.2.6: - version "1.2.6" - resolved "https://registry.yarnpkg.com/numeric/-/numeric-1.2.6.tgz#765b02bef97988fcf880d4eb3f36b80fa31335aa" - integrity sha1-dlsCvvl5iPz4gNTrPza4D6MTNao= - -object-assign@^4, object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= - -object-inspect@^1.11.0, object-inspect@^1.9.0: - version "1.11.0" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.11.0.tgz#9dceb146cedd4148a0d9e51ab88d34cf509922b1" - integrity sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg== - -object-is@^1.0.1, object-is@^1.1.4: - version "1.1.5" - resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac" - integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - -object-keys@^1.0.12, object-keys@^1.0.6, object-keys@^1.0.9, object-keys@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" - integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== - -object.assign@^4.1.0, object.assign@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" - integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== - dependencies: - call-bind "^1.0.0" - define-properties "^1.1.3" - has-symbols "^1.0.1" - object-keys "^1.1.1" - -obuf@^1.0.0, obuf@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" - integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== - -on-finished@~2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" - integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= - dependencies: - ee-first "1.1.1" - -on-headers@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" - integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== - -once@^1.3.0, once@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= - dependencies: - wrappy "1" - -once@~1.3.0: - version "1.3.3" - resolved "https://registry.yarnpkg.com/once/-/once-1.3.3.tgz#b2e261557ce4c314ec8304f3fa82663e4297ca20" - integrity sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA= - dependencies: - wrappy "1" - -onetime@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" - integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== - dependencies: - mimic-fn "^2.1.0" - -open@^8.0.9: - version "8.4.0" - resolved "https://registry.yarnpkg.com/open/-/open-8.4.0.tgz#345321ae18f8138f82565a910fdc6b39e8c244f8" - integrity sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q== - dependencies: - define-lazy-prop "^2.0.0" - is-docker "^2.1.1" - is-wsl "^2.2.0" - -opener@^1.5.2: - version "1.5.2" - resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.2.tgz#5d37e1f35077b9dcac4301372271afdeb2a13598" - integrity sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A== - -optionator@^0.8.1: - version "0.8.3" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" - integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== - dependencies: - deep-is "~0.1.3" - fast-levenshtein "~2.0.6" - levn "~0.3.0" - prelude-ls "~1.1.2" - type-check "~0.3.2" - word-wrap "~1.2.3" - -orbit-camera-controller@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/orbit-camera-controller/-/orbit-camera-controller-4.0.0.tgz#6e2b36f0e7878663c330f50da9b7ce686c277005" - integrity sha1-bis28OeHhmPDMPUNqbfOaGwncAU= - dependencies: - filtered-vector "^1.2.1" - gl-mat4 "^1.0.3" - -os-homedir@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-2.0.0.tgz#a0c76bb001a8392a503cbd46e7e650b3423a923c" - integrity sha512-saRNz0DSC5C/I++gFIaJTXoFJMRwiP5zHar5vV3xQ2TkgEw6hDCcU5F272JjUylpiVgBrZNQHnfjkLabTfb92Q== - -p-event@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/p-event/-/p-event-4.2.0.tgz#af4b049c8acd91ae81083ebd1e6f5cae2044c1b5" - integrity sha512-KXatOjCRXXkSePPb1Nbi0p0m+gQAwdlbhi4wQKJPI1HsMQS9g+Sqp2o+QHziPr7eYJyOZet836KoHEVM1mwOrQ== - dependencies: - p-timeout "^3.1.0" - -p-finally@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" - integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= - -p-limit@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" - integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== - dependencies: - p-try "^2.0.0" - -p-limit@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" - integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== - dependencies: - yocto-queue "^0.1.0" - -p-locate@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" - integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== - dependencies: - p-limit "^2.2.0" - -p-locate@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" - integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== - dependencies: - p-limit "^3.0.2" - -p-map@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" - integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== - dependencies: - aggregate-error "^3.0.0" - -p-retry@^4.5.0: - version "4.6.1" - resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-4.6.1.tgz#8fcddd5cdf7a67a0911a9cf2ef0e5df7f602316c" - integrity sha512-e2xXGNhZOZ0lfgR9kL34iGlU8N/KO0xZnQxVEwdeOvpqNDQfdnxIYizvWtK8RglUa3bGqI8g0R/BdfzLMxRkiA== - dependencies: - "@types/retry" "^0.12.0" - retry "^0.13.1" - -p-timeout@^3.1.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-3.2.0.tgz#c7e17abc971d2a7962ef83626b35d635acf23dfe" - integrity sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg== - dependencies: - p-finally "^1.0.0" - -p-try@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" - integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== - -pad-left@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/pad-left/-/pad-left-1.0.2.tgz#19e5735ea98395a26cedc6ab926ead10f3100d4c" - integrity sha1-GeVzXqmDlaJs7carkm6tEPMQDUw= - dependencies: - repeat-string "^1.3.0" - -param-case@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/param-case/-/param-case-3.0.4.tgz#7d17fe4aa12bde34d4a77d91acfb6219caad01c5" - integrity sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A== - dependencies: - dot-case "^3.0.4" - tslib "^2.0.3" - -parent-module@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" - integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== - dependencies: - callsites "^3.0.0" - -parenthesis@^3.1.5: - version "3.1.8" - resolved "https://registry.yarnpkg.com/parenthesis/-/parenthesis-3.1.8.tgz#3457fccb8f05db27572b841dad9d2630b912f125" - integrity sha512-KF/U8tk54BgQewkJPvB4s/US3VQY68BRDpH638+7O/n58TpnwiwnOtGIOsT2/i+M78s61BBpeC83STB88d8sqw== - -parse-entities@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-2.0.0.tgz#53c6eb5b9314a1f4ec99fa0fdf7ce01ecda0cbe8" - integrity sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ== - 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" - -parse-json@^5.0.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" - integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== - dependencies: - "@babel/code-frame" "^7.0.0" - error-ex "^1.3.1" - json-parse-even-better-errors "^2.3.0" - lines-and-columns "^1.1.6" - -parse-rect@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/parse-rect/-/parse-rect-1.2.0.tgz#e0a5b0dbaaaee637a0a1eb9779969e19399d8dec" - integrity sha512-4QZ6KYbnE6RTwg9E0HpLchUM9EZt6DnDxajFZZDSV4p/12ZJEvPO702DZpGvRYEPo00yKDys7jASi+/w7aO8LA== - dependencies: - pick-by-alias "^1.2.0" - -parse-svg-path@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/parse-svg-path/-/parse-svg-path-0.1.2.tgz#7a7ec0d1eb06fa5325c7d3e009b859a09b5d49eb" - integrity sha1-en7A0esG+lMlx9PgCbhZoJtdSes= - -parse-unit@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/parse-unit/-/parse-unit-1.0.1.tgz#7e1bb6d5bef3874c28e392526a2541170291eecf" - integrity sha1-fhu21b7zh0wo45JSaiVBFwKR7s8= - -parse5@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" - integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== - -parseurl@~1.3.2, parseurl@~1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" - integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== - -pascal-case@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/pascal-case/-/pascal-case-3.1.2.tgz#b48e0ef2b98e205e7c1dae747d0b1508237660eb" - integrity sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g== - dependencies: - no-case "^3.0.4" - tslib "^2.0.3" - -path-case@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/path-case/-/path-case-3.0.4.tgz#9168645334eb942658375c56f80b4c0cb5f82c6f" - integrity sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg== - dependencies: - dot-case "^3.0.4" - tslib "^2.0.3" - -path-exists@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" - integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= - -path-key@^3.0.0, path-key@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" - integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== - -path-parse@^1.0.6: - version "1.0.7" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" - integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== - -path-to-regexp@0.1.7: - version "0.1.7" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" - integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= - -path-type@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" - integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== - -pbf@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/pbf/-/pbf-3.2.1.tgz#b4c1b9e72af966cd82c6531691115cc0409ffe2a" - integrity sha512-ClrV7pNOn7rtmoQVF4TS1vyU0WhYRnP92fzbfF75jAIwpnzdJXf8iTd4CMEqO4yUenH6NDqLiwjqlh6QgZzgLQ== - dependencies: - ieee754 "^1.1.12" - resolve-protobuf-schema "^2.1.0" - -performance-now@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" - integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= - -permutation-parity@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/permutation-parity/-/permutation-parity-1.0.0.tgz#0174d51fca704b11b9a4b152b23d537fdc6b5ef4" - integrity sha1-AXTVH8pwSxG5pLFSsj1Tf9xrXvQ= - dependencies: - typedarray-pool "^1.0.0" - -permutation-rank@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/permutation-rank/-/permutation-rank-1.0.0.tgz#9fd98bbcecf08fbf5994b5eadc94a62e679483b5" - integrity sha1-n9mLvOzwj79ZlLXq3JSmLmeUg7U= - dependencies: - invert-permutation "^1.0.0" - typedarray-pool "^1.0.0" - -pick-by-alias@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/pick-by-alias/-/pick-by-alias-1.2.0.tgz#5f7cb2b1f21a6e1e884a0c87855aa4a37361107b" - integrity sha1-X3yysfIabh6ISgyHhVqko3NhEHs= - -picocolors@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-0.2.1.tgz#570670f793646851d1ba135996962abad587859f" - integrity sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA== - -picocolors@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" - integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== - -picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3: - version "2.3.0" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972" - integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw== - -pkg-dir@^4.1.0, pkg-dir@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" - integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== - dependencies: - find-up "^4.0.0" - -planar-dual@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/planar-dual/-/planar-dual-1.0.2.tgz#b6a4235523b1b0cb79e5f926f8ea335dd982d563" - integrity sha1-tqQjVSOxsMt55fkm+OozXdmC1WM= - dependencies: - compare-angle "^1.0.0" - dup "^1.0.0" - -planar-graph-to-polyline@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/planar-graph-to-polyline/-/planar-graph-to-polyline-1.0.6.tgz#ed300620c33001ee2cca0ac6d1dae8d02d23f009" - integrity sha512-h8a9kdAjo7mRhC0X6HZ42xzFp7vKDZA+Hygyhsq/08Qi4vVAQYJaLLYLvKUUzRbVKvdYqq0reXHyV0EygyEBHA== - dependencies: - edges-to-adjacency-list "^1.0.0" - planar-dual "^1.0.0" - point-in-big-polygon "^2.0.1" - robust-orientation "^1.0.1" - robust-sum "^1.0.0" - two-product "^1.0.0" - uniq "^1.0.0" - -plotly.js@1.54.6: - version "1.54.6" - resolved "https://registry.yarnpkg.com/plotly.js/-/plotly.js-1.54.6.tgz#ed021aa8da85759c69602c97bd3dab2b09eeec22" - integrity sha512-z6FDeo/O4iNN+TfKJvk3Sv+MS7prFfM6oLJK5q9TYpwIQEz8oOtxwKQJospqtKub6mvxOhPoDIxxmpDZeiNopQ== - dependencies: - "@plotly/d3-sankey" "0.7.2" - "@plotly/d3-sankey-circular" "0.33.1" - "@turf/area" "^6.0.1" - "@turf/bbox" "^6.0.1" - "@turf/centroid" "^6.0.2" - alpha-shape "^1.0.0" - canvas-fit "^1.5.0" - color-normalize "^1.5.0" - color-rgba "^2.1.1" - convex-hull "^1.0.3" - country-regex "^1.1.0" - d3 "^3.5.17" - d3-force "^1.2.1" - d3-hierarchy "^1.1.9" - d3-interpolate "^1.4.0" - delaunay-triangulate "^1.1.6" - es6-promise "^4.2.8" - fast-isnumeric "^1.1.4" - gl-cone3d "^1.5.2" - gl-contour2d "^1.1.7" - gl-error3d "^1.0.16" - gl-heatmap2d "^1.0.6" - gl-line3d "1.2.1" - gl-mat4 "^1.2.0" - gl-mesh3d "^2.3.1" - gl-plot2d "^1.4.5" - gl-plot3d "^2.4.6" - gl-pointcloud2d "^1.0.3" - gl-scatter3d "^1.2.3" - gl-select-box "^1.0.4" - gl-spikes2d "^1.0.2" - gl-streamtube3d "^1.4.1" - gl-surface3d "^1.5.2" - gl-text "^1.1.8" - glslify "^7.0.0" - has-hover "^1.0.1" - has-passive-events "^1.0.0" - is-mobile "^2.2.2" - mapbox-gl "1.10.1" - matrix-camera-controller "^2.1.3" - mouse-change "^1.4.0" - mouse-event-offset "^3.0.2" - mouse-wheel "^1.2.0" - ndarray "^1.0.19" - ndarray-linear-interpolate "^1.0.0" - parse-svg-path "^0.1.2" - point-cluster "^3.1.8" - polybooljs "^1.2.0" - regl "^1.6.1" - regl-error2d "^2.0.8" - regl-line2d "^3.0.15" - regl-scatter2d "^3.1.8" - regl-splom "^1.0.8" - right-now "^1.0.0" - robust-orientation "^1.1.3" - sane-topojson "^4.0.0" - strongly-connected-components "^1.0.1" - superscript-text "^1.0.0" - svg-path-sdf "^1.1.3" - tinycolor2 "^1.4.1" - to-px "1.0.1" - topojson-client "^3.1.0" - webgl-context "^2.2.0" - world-calendars "^1.0.3" - -point-cluster@^3.1.8: - version "3.1.8" - resolved "https://registry.yarnpkg.com/point-cluster/-/point-cluster-3.1.8.tgz#a63625fd8964f2a5b446025a1acf8bcac42500c0" - integrity sha512-7klIr45dpMeZuqjIK9+qBg3m2IhyZJNJkdqjJFw0Olq75FM8ojrTMjClVUrMjNYRVqtwztxCHH71Fyjhg+YwyQ== - dependencies: - array-bounds "^1.0.1" - array-normalize "^1.1.4" - binary-search-bounds "^2.0.4" - bubleify "^1.1.0" - clamp "^1.0.1" - defined "^1.0.0" - dtype "^2.0.0" - flatten-vertex-data "^1.0.2" - is-obj "^1.0.1" - math-log2 "^1.0.1" - parse-rect "^1.2.0" - pick-by-alias "^1.2.0" - -point-in-big-polygon@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/point-in-big-polygon/-/point-in-big-polygon-2.0.1.tgz#69d293010cead58af08c3082ad1d23f600ef10af" - integrity sha512-DtrN8pa2VfMlvmWlCcypTFeBE4+OYz1ojDNJLKCWa4doiVAD6PRBbxFYAT71tsp5oKaRXT5sxEiHCAQKb1zr2Q== - dependencies: - binary-search-bounds "^2.0.0" - interval-tree-1d "^1.0.1" - robust-orientation "^1.1.3" - slab-decomposition "^1.0.1" - -polybooljs@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/polybooljs/-/polybooljs-1.2.0.tgz#b4390c2e079d4c262d3b2504c6288d95ba7a4758" - integrity sha1-tDkMLgedTCYtOyUExiiNlbp6R1g= - -polytope-closest-point@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/polytope-closest-point/-/polytope-closest-point-1.0.0.tgz#e6e57f4081ab5e8c778b811ef06e2c48ae338c3f" - integrity sha1-5uV/QIGrXox3i4Ee8G4sSK4zjD8= - dependencies: - numeric "^1.2.6" - -popper.js@1.16.1: - version "1.16.1" - resolved "https://registry.yarnpkg.com/popper.js/-/popper.js-1.16.1.tgz#2a223cb3dc7b6213d740e40372be40de43e65b1b" - integrity sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ== - -portfinder@^1.0.28: - version "1.0.28" - resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.28.tgz#67c4622852bd5374dd1dd900f779f53462fac778" - integrity sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA== - dependencies: - async "^2.6.2" - debug "^3.1.1" - mkdirp "^0.5.5" - -postcss-attribute-case-insensitive@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-5.0.0.tgz#39cbf6babf3ded1e4abf37d09d6eda21c644105c" - integrity sha512-b4g9eagFGq9T5SWX4+USfVyjIb3liPnjhHHRMP7FMB2kFVpYyfEscV0wP3eaXhKlcHKUut8lt5BGoeylWA/dBQ== - dependencies: - postcss-selector-parser "^6.0.2" - -postcss-calc@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-8.0.0.tgz#a05b87aacd132740a5db09462a3612453e5df90a" - integrity sha512-5NglwDrcbiy8XXfPM11F3HeC6hoT9W7GUH/Zi5U/p7u3Irv4rHhdDcIZwG0llHXV4ftsBjpfWMXAnXNl4lnt8g== - dependencies: - postcss-selector-parser "^6.0.2" - postcss-value-parser "^4.0.2" - -postcss-color-functional-notation@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-color-functional-notation/-/postcss-color-functional-notation-4.0.1.tgz#2fd769959e7fe658b4c0e7d40b0ab245fc8664f1" - integrity sha512-qxD/7Q2rdmqJLSYxlJFJM9gVdyVLTBVrOUc+B6+KbOe4t2G2KnoI3HdimdK4PerGLqAqKnEVGgal7YKImm0g+w== - dependencies: - postcss-values-parser "6.0.1" - -postcss-color-hex-alpha@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/postcss-color-hex-alpha/-/postcss-color-hex-alpha-8.0.0.tgz#84bfd985a93b0a18e047ebcb5fd463e2cae5e7a6" - integrity sha512-Z0xiE0j+hbefUj0LWOMkzmTIS7k+dqJKzLwoKww0KJhju/sWXr+84Yk7rmvFoML/4LjGpJgefZvDwExrsWfHZw== - dependencies: - postcss-values-parser "^6.0.0" - -postcss-color-rebeccapurple@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-7.0.0.tgz#980fbd98eb68ebbb38be02a82c7554e043c8fdf4" - integrity sha512-+Ogw3SA0ESjjO87S8Dn+aAEHK6hFAWAVbTVnyXnmbV6Xh0TKi0vXpzhlKG/yrxujxtlgQcMQNQjg75uWWv28xA== - dependencies: - postcss-values-parser "^6" - -postcss-custom-media@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/postcss-custom-media/-/postcss-custom-media-8.0.0.tgz#1be6aff8be7dc9bf1fe014bde3b71b92bb4552f1" - integrity sha512-FvO2GzMUaTN0t1fBULDeIvxr5IvbDXcIatt6pnJghc736nqNgsGao5NT+5+WVLAQiTt6Cb3YUms0jiPaXhL//g== - -postcss-custom-properties@^12.0.0: - version "12.0.0" - resolved "https://registry.yarnpkg.com/postcss-custom-properties/-/postcss-custom-properties-12.0.0.tgz#fd01ec9bd1462336ea8af7ba3c1a2c47c203031e" - integrity sha512-eAyX3rMjZKxdne6tWKjkWbNWfw6bbv4xTsrjNJ7C3uGDODrzbQXR+ueshRkw7Lhlhc3qyTmYH/sFfD0AbhgdSQ== - dependencies: - postcss-values-parser "^6" - -postcss-custom-selectors@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/postcss-custom-selectors/-/postcss-custom-selectors-6.0.0.tgz#022839e41fbf71c47ae6e316cb0e6213012df5ef" - integrity sha512-/1iyBhz/W8jUepjGyu7V1OPcGbc636snN1yXEQCinb6Bwt7KxsiU7/bLQlp8GwAXzCh7cobBU5odNn/2zQWR8Q== - dependencies: - postcss-selector-parser "^6.0.4" - -postcss-dir-pseudo-class@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-6.0.0.tgz#7026a070a4849072a232eaf0cdd960de3013658d" - integrity sha512-TC4eB5ZnLRSV1PLsAPualEjxFysU9IVEBx8h+Md2qzo8iWdNqwWCckx5fTWfe6dJxUpB0TWEpWEFhZ/YHvjSCA== - dependencies: - postcss-selector-parser "6.0.6" - -postcss-double-position-gradients@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/postcss-double-position-gradients/-/postcss-double-position-gradients-3.0.1.tgz#3c21ad52b6f13d81caf2563b0010a2c5872272af" - integrity sha512-L18N4Y1gpKQPEnZ6JOxO3H5gswZzTNR+ZqruZG7cOtOF/GR6J1YBRKn5hdTn3Vs4Y9XuDqaBD8vIXFIEft9Jqw== - dependencies: - postcss-values-parser "6.0.1" - -postcss-env-function@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-env-function/-/postcss-env-function-4.0.2.tgz#5509d008ff0f069fa18bd2eace4f3fdb18150c28" - integrity sha512-VXKv0Vskq7olS3Q2zj38G4au4PkW+YWBRgng2Czx0pP9PyqU6uzjS6uVU1VkJN8i0OTPM7g82YFUdiz/7pEvpg== - dependencies: - postcss-values-parser "6.0.1" - -postcss-flexbugs-fixes@^5.0.2: - version "5.0.2" - resolved "https://registry.yarnpkg.com/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-5.0.2.tgz#2028e145313074fc9abe276cb7ca14e5401eb49d" - integrity sha512-18f9voByak7bTktR2QgDveglpn9DTbBWPUzSOe9g0N4WR/2eSt6Vrcbf0hmspvMI6YWGywz6B9f7jzpFNJJgnQ== - -postcss-focus-visible@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/postcss-focus-visible/-/postcss-focus-visible-6.0.1.tgz#b12a859616eca7152976fec24ef337ab29bbc405" - integrity sha512-UddLlBmJ78Nu7OrKME70EKxCPBdxTx7pKIyD3GDNRM8Tnq19zmscT9QzsvR8gygz0i0nNUjMtSz4N3AEWZ5R/Q== - -postcss-focus-within@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/postcss-focus-within/-/postcss-focus-within-5.0.1.tgz#615659122325d86e00bc8ed84ab6129d0b3a0f62" - integrity sha512-50v1AZVlFSVzLTNdBQG521Aa54VABf/X1RkhR8Fm/9dDQby0W0XdwOnuo8Juvf0ZZXbKkxyTkyyQD0QaNVZVGg== - -postcss-font-family-system-ui@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/postcss-font-family-system-ui/-/postcss-font-family-system-ui-5.0.0.tgz#cceb13dccb11019e9d6246db9a93137a30a53e21" - integrity sha512-3ndzyyMPhSbZekEPTuvKZz17jQXftAGMcVxNV4rTKNXsOsl23ZKlHcccEPB9tpB/SmGtDszdPvajdJrjZeKBfQ== - dependencies: - browserslist "^4.0.0" - caniuse-lite "^1.0.30000655" - -postcss-font-variant@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz#efd59b4b7ea8bb06127f2d031bfbb7f24d32fa66" - integrity sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA== - -postcss-gap-properties@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-gap-properties/-/postcss-gap-properties-3.0.0.tgz#8941c400df902247603fd915c7dc81e1d7686b15" - integrity sha512-QJOkz1epC/iCuOdhQPm3n9T+F25+P+MYJEEcs5xz/Q+020mc9c6ZRGJkzPJd8FS9hFmT9eEKFEx9PEDl+lH5og== - -postcss-image-set-function@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-image-set-function/-/postcss-image-set-function-4.0.2.tgz#95b64db01b8812fcbece3bb36a3f2b8133bf7c91" - integrity sha512-NbTOc3xOq/YjIJS8/UVnhI16NxRuCiEWjem0eYt87sKvjdpk00niQ9oVo3eSR+kmMKWIO979x3j5i1GYJNxe1A== - dependencies: - postcss-values-parser "6.0.1" - -postcss-initial@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-initial/-/postcss-initial-4.0.1.tgz#529f735f72c5724a0fb30527df6fb7ac54d7de42" - integrity sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ== - -postcss-lab-function@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-lab-function/-/postcss-lab-function-4.0.1.tgz#b6a1fb1032ddd7f4f7198ca78ec84c9b5bc7d80e" - integrity sha512-8F2keZUlUiX/tznbCZ5y3Bmx6pnc19kvL4oq+x+uoK0ZYQjUWmHDdVHBG6iMq2T0Fteu+AgGAo94UcIsL4ay2w== - dependencies: - "@csstools/convert-colors" "2.0.0" - postcss-values-parser "6.0.1" - -postcss-loader@^6.2.1: - version "6.2.1" - resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-6.2.1.tgz#0895f7346b1702103d30fdc66e4d494a93c008ef" - integrity sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q== - dependencies: - cosmiconfig "^7.0.0" - klona "^2.0.5" - semver "^7.3.5" - -postcss-logical@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/postcss-logical/-/postcss-logical-5.0.0.tgz#f646ef6a3562890e1123a32e695d14cc271afb21" - integrity sha512-fWEWMn/xf6F9SMzAD7OS0GTm8Qh1BlBmEbVT/YZGYhwipQEwOpO7YOOu+qnzLksDg9JjLRj5tLmeN8OW8+ogIA== - -postcss-media-minmax@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/postcss-media-minmax/-/postcss-media-minmax-5.0.0.tgz#7140bddec173e2d6d657edbd8554a55794e2a5b5" - integrity sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ== - -postcss-modules-extract-imports@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz#cda1f047c0ae80c97dbe28c3e76a43b88025741d" - integrity sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw== - -postcss-modules-local-by-default@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz#ebbb54fae1598eecfdf691a02b3ff3b390a5a51c" - integrity sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ== - dependencies: - icss-utils "^5.0.0" - postcss-selector-parser "^6.0.2" - postcss-value-parser "^4.1.0" - -postcss-modules-scope@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz#9ef3151456d3bbfa120ca44898dfca6f2fa01f06" - integrity sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg== - dependencies: - postcss-selector-parser "^6.0.4" - -postcss-modules-values-replace@^3.4.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/postcss-modules-values-replace/-/postcss-modules-values-replace-3.4.0.tgz#259192a73a291888816edb93934dd7177fb877ac" - integrity sha512-pY8iCSKxdt25uE+N4dO1PUUDOl8FIuvtZfT5964TuFJVhq+CEG8uqDpOCpCnqda/3K9ZFCNo4prn84H9SgP4Rw== - dependencies: - enhanced-resolve "^3.1.0" - es6-promisify "^5.0.0" - icss-utils "^4.0.0" - loader-utils "^2.0.0" - postcss "^7.0.0" - postcss-values-parser "^1.3.1" - -postcss-modules-values@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz#d7c5e7e68c3bb3c9b27cbf48ca0bb3ffb4602c9c" - integrity sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ== - dependencies: - icss-utils "^5.0.0" - -postcss-nesting@^10.0.2: - version "10.0.2" - resolved "https://registry.yarnpkg.com/postcss-nesting/-/postcss-nesting-10.0.2.tgz#0cf9e81712fe7b6c3005e7d884cce2cb0a06326e" - integrity sha512-FdecapAKIe+kp6uLNW7icw1g1B2HRhAAfsNv/TPzopeM08gpUbnBpqKSVqxrCqLDwzQG854ZJn5I0BiJ35WvmA== - dependencies: - postcss-selector-parser "6.0.6" - -postcss-overflow-shorthand@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-overflow-shorthand/-/postcss-overflow-shorthand-3.0.0.tgz#f57631672333b302ffdcfc0735b8b7d0244c2a25" - integrity sha512-4fTapLT68wUoIr4m3Z0sKn1NbXX0lJYvj4aDA2++KpNx8wMSVf55UuLPz0nSjXa7dV1p0xQHlJ0iFJRNrSY2mw== - -postcss-page-break@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/postcss-page-break/-/postcss-page-break-3.0.4.tgz#7fbf741c233621622b68d435babfb70dd8c1ee5f" - integrity sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ== - -postcss-place@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/postcss-place/-/postcss-place-7.0.1.tgz#9fbd18b3d1d438d313b2a29f5a50424c8ebca28d" - integrity sha512-X+vHHzqZjI4JbSoj3uYpL6rGRUHE1O9F8g+jBFn5U94U0t6GjJuL/xSN7tU6Pnm9tpfXioHfxwt9E8+JrCB9OQ== - dependencies: - postcss-values-parser "6.0.1" - -postcss-preset-env@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/postcss-preset-env/-/postcss-preset-env-7.0.1.tgz#7f1fc5ac38e60a8e5ff9a920396d936a830e6120" - integrity sha512-oB7IJGwLBEwnao823mS2b9hqbp5Brm0EZKWRVROayjGwyPQVjY9gZpPZk/ItFakdx7GAPgv3ya+9R3KrUqCwYA== - dependencies: - autoprefixer "^10.4.0" - browserslist "^4.17.5" - caniuse-lite "^1.0.30001272" - css-blank-pseudo "^2.0.0" - css-has-pseudo "^2.0.0" - css-prefers-color-scheme "^5.0.0" - cssdb "^5.0.0" - postcss "^8.3" - postcss-attribute-case-insensitive "^5.0.0" - postcss-color-functional-notation "^4.0.1" - postcss-color-hex-alpha "^8.0.0" - postcss-color-rebeccapurple "^7.0.0" - postcss-custom-media "^8.0.0" - postcss-custom-properties "^12.0.0" - postcss-custom-selectors "^6.0.0" - postcss-dir-pseudo-class "^6.0.0" - postcss-double-position-gradients "^3.0.1" - postcss-env-function "^4.0.2" - postcss-focus-visible "^6.0.1" - postcss-focus-within "^5.0.1" - postcss-font-variant "^5.0.0" - postcss-gap-properties "^3.0.0" - postcss-image-set-function "^4.0.2" - postcss-initial "^4.0.1" - postcss-lab-function "^4.0.1" - postcss-logical "^5.0.0" - postcss-media-minmax "^5.0.0" - postcss-nesting "^10.0.2" - postcss-overflow-shorthand "^3.0.0" - postcss-page-break "^3.0.4" - postcss-place "^7.0.1" - postcss-pseudo-class-any-link "^7.0.0" - postcss-replace-overflow-wrap "^4.0.0" - postcss-selector-not "^5.0.0" - -postcss-pseudo-class-any-link@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-7.0.0.tgz#b06483c8a241cee1e420f9ebd08680d4f95b2b20" - integrity sha512-Q4KjHlyBo91nvW+wTDZHGYcjtlSSkYwxweMuq1g8+dx1S8qAnedItvHLnbdAAdqJCZP1is5dLqiI8TvfJ+cjVQ== - dependencies: - postcss-selector-parser "^6" - -postcss-replace-overflow-wrap@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz#d2df6bed10b477bf9c52fab28c568b4b29ca4319" - integrity sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw== - -postcss-selector-not@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/postcss-selector-not/-/postcss-selector-not-5.0.0.tgz#ac5fc506f7565dd872f82f5314c0f81a05630dc7" - integrity sha512-/2K3A4TCP9orP4TNS7u3tGdRFVKqz/E6pX3aGnriPG0jU78of8wsUcqE4QAhWEU0d+WnMSF93Ah3F//vUtK+iQ== - dependencies: - balanced-match "^1.0.0" - -postcss-selector-parser@6.0.6, postcss-selector-parser@^6, postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4: - version "6.0.6" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.6.tgz#2c5bba8174ac2f6981ab631a42ab0ee54af332ea" - integrity sha512-9LXrvaaX3+mcv5xkg5kFwqSzSH1JIObIx51PrndZwlmznwXRfxMddDvo9gve3gVR8ZTKgoFDdWkbRFmEhT4PMg== - dependencies: - cssesc "^3.0.0" - util-deprecate "^1.0.2" - -postcss-value-parser@^4.0.2, postcss-value-parser@^4.1.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" - integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== - -postcss-values-parser@6.0.1, postcss-values-parser@^6, postcss-values-parser@^6.0.0: - version "6.0.1" - resolved "https://registry.yarnpkg.com/postcss-values-parser/-/postcss-values-parser-6.0.1.tgz#aeb5e4522c4aabeb1ebbb14122194b9c08069675" - integrity sha512-hH3HREaFAEsVOzUgYiwvFggUqUvoIZoXD2OjhzY2CEM7uVDaQTKP5bmqbchCBoVvywsqiGVYhwC8p2wMUzpW+Q== - dependencies: - color-name "^1.1.4" - is-url-superb "^4.0.0" - quote-unquote "^1.0.0" - -postcss-values-parser@^1.3.1: - version "1.5.0" - resolved "https://registry.yarnpkg.com/postcss-values-parser/-/postcss-values-parser-1.5.0.tgz#5d9fa63e2bcb0179ce48f3235303765eb89f3047" - integrity sha512-3M3p+2gMp0AH3da530TlX8kiO1nxdTnc3C6vr8dMxRLIlh8UYkz0/wcwptSXjhtx2Fr0TySI7a+BHDQ8NL7LaQ== - dependencies: - flatten "^1.0.2" - indexes-of "^1.0.1" - uniq "^1.0.1" - -postcss@^6.0.1: - version "6.0.23" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.23.tgz#61c82cc328ac60e677645f979054eb98bc0e3324" - integrity sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag== - dependencies: - chalk "^2.4.1" - source-map "^0.6.1" - supports-color "^5.4.0" - -postcss@^7.0.0, postcss@^7.0.14: - version "7.0.39" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.39.tgz#9624375d965630e2e1f2c02a935c82a59cb48309" - integrity sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA== - dependencies: - picocolors "^0.2.1" - source-map "^0.6.1" - -postcss@^8.2.15, postcss@^8.3: - version "8.4.4" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.4.tgz#d53d4ec6a75fd62557a66bb41978bf47ff0c2869" - integrity sha512-joU6fBsN6EIer28Lj6GDFoC/5yOZzLCfn0zHAn/MYXI7aPt4m4hK5KC5ovEZXy+lnCjmYIbQWngvju2ddyEr8Q== - dependencies: - nanoid "^3.1.30" - picocolors "^1.0.0" - source-map-js "^1.0.1" - -postcss@^8.4.4: - version "8.4.5" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.5.tgz#bae665764dfd4c6fcc24dc0fdf7e7aa00cc77f95" - integrity sha512-jBDboWM8qpaqwkMwItqTQTiFikhs/67OYVvblFFTM7MrZjt6yMKd6r2kgXizEbTTljacm4NldIlZnhbjr84QYg== - dependencies: - nanoid "^3.1.30" - picocolors "^1.0.0" - source-map-js "^1.0.1" - -potpack@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/potpack/-/potpack-1.0.2.tgz#23b99e64eb74f5741ffe7656b5b5c4ddce8dfc14" - integrity sha512-choctRBIV9EMT9WGAZHn3V7t0Z2pMQyl0EZE6pFc/6ml3ssw7Dlf/oAOvFwjm1HVsqfQN8GfeFyJ+d8tRzqueQ== - -prefixfree@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/prefixfree/-/prefixfree-1.0.0.tgz#82b0edbbac107f2a3e2dc569d6c3df4035cd7910" - integrity sha1-grDtu6wQfyo+LcVp1sPfQDXNeRA= - -prelude-ls@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" - integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= - -process-nextick-args@~2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" - integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== - -prop-types@^15.0.0, prop-types@^15.7.2: - version "15.7.2" - resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5" - integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ== - dependencies: - loose-envify "^1.4.0" - object-assign "^4.1.1" - react-is "^16.8.1" - -protocol-buffers-schema@^3.3.1: - version "3.6.0" - resolved "https://registry.yarnpkg.com/protocol-buffers-schema/-/protocol-buffers-schema-3.6.0.tgz#77bc75a48b2ff142c1ad5b5b90c94cd0fa2efd03" - integrity sha512-TdDRD+/QNdrCGCE7v8340QyuXd4kIWIgapsE2+n/SaGiSSbomYl4TjHlvIoCWRpE7wFt02EpB35VVA2ImcBVqw== - -proxy-addr@~2.0.5: - version "2.0.7" - resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" - integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== - dependencies: - forwarded "0.2.0" - ipaddr.js "1.9.1" - -prr@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" - integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY= - -punycode@1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" - integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= - -punycode@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" - integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== - -pxls@^2.0.0: - version "2.3.2" - resolved "https://registry.yarnpkg.com/pxls/-/pxls-2.3.2.tgz#79100d2cc95089fc6e00053a9d93c1ddddb2c7b4" - integrity sha512-pQkwgbLqWPcuES5iEmGa10OlCf5xG0blkIF3dg7PpRZShbTYcvAdfFfGL03SMrkaSUaa/V0UpN9HWg40O2AIIw== - dependencies: - arr-flatten "^1.1.0" - compute-dims "^1.1.0" - flip-pixels "^1.0.2" - is-browser "^2.1.0" - is-buffer "^2.0.3" - to-uint8 "^1.4.1" - -qjobs@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/qjobs/-/qjobs-1.2.0.tgz#c45e9c61800bd087ef88d7e256423bdd49e5d071" - integrity sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg== - -qs@6.7.0: - version "6.7.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" - integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== - -quantize@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/quantize/-/quantize-1.0.2.tgz#d25ac200a77b6d70f40127ca171a10e33c8546de" - integrity sha1-0lrCAKd7bXD0ASfKFxoQ4zyFRt4= - -quat-slerp@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/quat-slerp/-/quat-slerp-1.0.1.tgz#2baa15ce3a6bbdc3241d972eb17283139ed69f29" - integrity sha1-K6oVzjprvcMkHZcusXKDE57Wnyk= - dependencies: - gl-quat "^1.0.0" - -querystring@0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" - integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= - -queue-microtask@^1.2.2: - version "1.2.3" - resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" - integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== - -quickselect@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/quickselect/-/quickselect-2.0.0.tgz#f19680a486a5eefb581303e023e98faaf25dd018" - integrity sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw== - -quote-unquote@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/quote-unquote/-/quote-unquote-1.0.0.tgz#67a9a77148effeaf81a4d428404a710baaac8a0b" - integrity sha1-Z6mncUjv/q+BpNQoQEpxC6qsigs= - -raf@^3.4.1: - version "3.4.1" - resolved "https://registry.yarnpkg.com/raf/-/raf-3.4.1.tgz#0742e99a4a6552f445d73e3ee0328af0ff1ede39" - integrity sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA== - dependencies: - performance-now "^2.1.0" - -ramda@^0.27.1: - version "0.27.1" - resolved "https://registry.yarnpkg.com/ramda/-/ramda-0.27.1.tgz#66fc2df3ef873874ffc2da6aa8984658abacf5c9" - integrity sha512-PgIdVpn5y5Yns8vqb8FzBUEYn98V3xcPgawAkkgj0YJ0qDsnHCiNmZYfOGMgOvoB0eWFLpYbhxUR3mxfDIMvpw== - -randombytes@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" - integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== - dependencies: - safe-buffer "^5.1.0" - -range-parser@^1.2.1, range-parser@~1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" - integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== - -rat-vec@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/rat-vec/-/rat-vec-1.1.1.tgz#0dde2b66b7b34bb1bcd2a23805eac806d87fd17f" - integrity sha1-Dd4rZrezS7G80qI4BerIBth/0X8= - dependencies: - big-rat "^1.0.3" - -raw-body@2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332" - integrity sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q== - dependencies: - bytes "3.1.0" - http-errors "1.7.2" - iconv-lite "0.4.24" - unpipe "1.0.0" - -react-dom@^17.0.2: - version "17.0.2" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-17.0.2.tgz#ecffb6845e3ad8dbfcdc498f0d0a939736502c23" - integrity sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA== - dependencies: - loose-envify "^1.1.0" - object-assign "^4.1.1" - scheduler "^0.20.2" - -react-file-drop@3.0.6: - version "3.0.6" - resolved "https://registry.yarnpkg.com/react-file-drop/-/react-file-drop-3.0.6.tgz#7fb75bdc0e9a10be4f6c653d2a906cacdd460d3e" - integrity sha512-OXfSpA8YY/OsKNITXPAOr+Rar8izqNZkx/N7B5vkp00AhQOFvj8ctC4bWInq1Mzpm4De5+XfpXAYbj4D4ze1QA== - dependencies: - prop-types "^15.7.2" - -react-is@^16.7.0, react-is@^16.8.1, react-is@^16.8.6: - version "16.13.1" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" - integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== - -react-is@^17.0.1: - version "17.0.2" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" - integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== - -react-lifecycles-compat@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362" - integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA== - -react-markdown@^5.0.3: - version "5.0.3" - resolved "https://registry.yarnpkg.com/react-markdown/-/react-markdown-5.0.3.tgz#41040ea7a9324b564b328fb81dd6c04f2a5373ac" - integrity sha512-jDWOc1AvWn0WahpjW6NK64mtx6cwjM4iSsLHJPNBqoAgGOVoIdJMqaKX4++plhOtdd4JksdqzlDibgPx6B/M2w== - dependencies: - "@types/mdast" "^3.0.3" - "@types/unist" "^2.0.3" - html-to-react "^1.3.4" - mdast-add-list-metadata "1.0.1" - prop-types "^15.7.2" - react-is "^16.8.6" - remark-parse "^9.0.0" - unified "^9.0.0" - unist-util-visit "^2.0.0" - xtend "^4.0.1" - -react-movable@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/react-movable/-/react-movable-3.0.2.tgz#45e6bd95db9f8340a114ddc8860dc9994719e94a" - integrity sha512-dDDYm3CRnDy8YLXMyyaR2MbcQiTwhPOP+dfl3fZukiI6mN1flVatcjSozT7HXjVk2yHwBC67ZOWGVAmjY6F/dA== - -react-virtualized@^9.22.3: - version "9.22.3" - resolved "https://registry.yarnpkg.com/react-virtualized/-/react-virtualized-9.22.3.tgz#f430f16beb0a42db420dbd4d340403c0de334421" - integrity sha512-MKovKMxWTcwPSxE1kK1HcheQTWfuCxAuBoSTf2gwyMM21NdX/PXUhnoP8Uc5dRKd+nKm8v41R36OellhdCpkrw== - dependencies: - "@babel/runtime" "^7.7.2" - clsx "^1.0.4" - dom-helpers "^5.1.3" - loose-envify "^1.4.0" - prop-types "^15.7.2" - react-lifecycles-compat "^3.0.4" - -react-waypoint@^10.1.0: - version "10.1.0" - resolved "https://registry.yarnpkg.com/react-waypoint/-/react-waypoint-10.1.0.tgz#6ab522a61bd52946260e4a78b3182759a97b40ec" - integrity sha512-wiVF0lTslVm27xHbnvUUADUrcDjrQxAp9lEYGExvcoEBScYbXu3Kt++pLrfj6CqOeeRAL4HcX8aANVLSn6bK0Q== - dependencies: - "@babel/runtime" "^7.12.5" - consolidated-events "^1.1.0 || ^2.0.0" - prop-types "^15.0.0" - react-is "^17.0.1" - -react@^17.0.2: - version "17.0.2" - resolved "https://registry.yarnpkg.com/react/-/react-17.0.2.tgz#d0b5cc516d29eb3eee383f75b62864cfb6800037" - integrity sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA== - dependencies: - loose-envify "^1.1.0" - object-assign "^4.1.1" - -"readable-stream@>=1.0.33-1 <1.1.0-0": - version "1.0.34" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" - integrity sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw= - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.1" - isarray "0.0.1" - string_decoder "~0.10.x" - -readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.2.2, readable-stream@^2.3.5, readable-stream@~2.3.6: - version "2.3.7" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" - integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.3" - isarray "~1.0.0" - process-nextick-args "~2.0.0" - safe-buffer "~5.1.1" - string_decoder "~1.1.1" - util-deprecate "~1.0.1" - -readable-stream@^3.0.6: - version "3.6.0" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" - integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - -readdirp@~3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" - integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== - dependencies: - picomatch "^2.2.1" - -rechoir@^0.7.0: - version "0.7.1" - resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.7.1.tgz#9478a96a1ca135b5e88fc027f03ee92d6c645686" - integrity sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg== - dependencies: - resolve "^1.9.0" - -reduce-simplicial-complex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/reduce-simplicial-complex/-/reduce-simplicial-complex-1.0.0.tgz#74d696a2f835f7a6dcd92065fd8c5181f2edf8bc" - integrity sha1-dNaWovg196bc2SBl/YxRgfLt+Lw= - dependencies: - cell-orientation "^1.0.1" - compare-cell "^1.0.0" - compare-oriented-cell "^1.0.1" - -regenerate-unicode-properties@^9.0.0: - version "9.0.0" - resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-9.0.0.tgz#54d09c7115e1f53dc2314a974b32c1c344efe326" - integrity sha512-3E12UeNSPfjrgwjkR81m5J7Aw/T55Tu7nUyZVQYCKEOs+2dkxEY+DpPtZzO4YruuiPb7NkYLVcyJC4+zCbk5pA== - dependencies: - regenerate "^1.4.2" - -regenerate@^1.4.2: - version "1.4.2" - resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" - integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== - -regenerator-runtime@^0.13.4: - version "0.13.9" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52" - integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA== - -regenerator-transform@^0.14.2: - version "0.14.5" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.5.tgz#c98da154683671c9c4dcb16ece736517e1b7feb4" - integrity sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw== - dependencies: - "@babel/runtime" "^7.8.4" - -regex-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/regex-regex/-/regex-regex-1.0.0.tgz#9048a1eaeb870f4d480dabc76fc42cdcc0bc3a72" - integrity sha1-kEih6uuHD01IDavHb8Qs3MC8OnI= - -regexp.prototype.flags@^1.2.0, regexp.prototype.flags@^1.3.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz#7ef352ae8d159e758c0eadca6f8fcb4eef07be26" - integrity sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - -regexpu-core@^4.5.4, regexpu-core@^4.7.1: - version "4.8.0" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.8.0.tgz#e5605ba361b67b1718478501327502f4479a98f0" - integrity sha512-1F6bYsoYiz6is+oz70NWur2Vlh9KWtswuRuzJOfeYUrfPX2o8n74AnUVaOGDbUqVGO9fNHu48/pjJO4sNVwsOg== - dependencies: - regenerate "^1.4.2" - regenerate-unicode-properties "^9.0.0" - regjsgen "^0.5.2" - regjsparser "^0.7.0" - unicode-match-property-ecmascript "^2.0.0" - unicode-match-property-value-ecmascript "^2.0.0" - -regjsgen@^0.5.2: - version "0.5.2" - resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.2.tgz#92ff295fb1deecbf6ecdab2543d207e91aa33733" - integrity sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A== - -regjsparser@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.7.0.tgz#a6b667b54c885e18b52554cb4960ef71187e9968" - integrity sha512-A4pcaORqmNMDVwUjWoTzuhwMGpP+NykpfqAsEgI1FSH/EzC7lrN5TMd+kN8YCovX+jMpu8eaqXgXPCa0g8FQNQ== - dependencies: - jsesc "~0.5.0" - -regl-error2d@^2.0.8: - version "2.0.12" - resolved "https://registry.yarnpkg.com/regl-error2d/-/regl-error2d-2.0.12.tgz#3b976e13fe641d5242a154fcacc80aecfa0a9881" - integrity sha512-r7BUprZoPO9AbyqM5qlJesrSRkl+hZnVKWKsVp7YhOl/3RIpi4UDGASGJY0puQ96u5fBYw/OlqV24IGcgJ0McA== - dependencies: - array-bounds "^1.0.1" - color-normalize "^1.5.0" - flatten-vertex-data "^1.0.2" - object-assign "^4.1.1" - pick-by-alias "^1.2.0" - to-float32 "^1.1.0" - update-diff "^1.1.0" - -regl-line2d@^3.0.15: - version "3.1.2" - resolved "https://registry.yarnpkg.com/regl-line2d/-/regl-line2d-3.1.2.tgz#2bedef7f44c1f7fae75c90f9918258723ca84c1c" - integrity sha512-nmT7WWS/WxmXAQMkgaMKWXaVmwJ65KCrjbqHGOUjjqQi6shfT96YbBOvelXwO9hG7/hjvbzjtQ2UO0L3e7YaXQ== - dependencies: - array-bounds "^1.0.1" - array-find-index "^1.0.2" - array-normalize "^1.1.4" - color-normalize "^1.5.0" - earcut "^2.1.5" - es6-weak-map "^2.0.3" - flatten-vertex-data "^1.0.2" - glslify "^7.0.0" - object-assign "^4.1.1" - parse-rect "^1.2.0" - pick-by-alias "^1.2.0" - to-float32 "^1.1.0" - -regl-scatter2d@^3.1.8, regl-scatter2d@^3.2.3: - version "3.2.8" - resolved "https://registry.yarnpkg.com/regl-scatter2d/-/regl-scatter2d-3.2.8.tgz#a1360e803e3fdf628ca09a72a435a0b7d4cf5675" - integrity sha512-bqrqJyeHkGBa9mEfuBnRd7FUtdtZ1l+gsM2C5Ugr1U3vJG5K3mdWdVWtOAllZ5FHHyWJV/vgjVvftgFUg6CDig== - dependencies: - "@plotly/point-cluster" "^3.1.9" - array-range "^1.0.1" - array-rearrange "^2.2.2" - clamp "^1.0.1" - color-id "^1.1.0" - color-normalize "^1.5.0" - color-rgba "^2.1.1" - flatten-vertex-data "^1.0.2" - glslify "^7.0.0" - image-palette "^2.1.0" - is-iexplorer "^1.0.0" - object-assign "^4.1.1" - parse-rect "^1.2.0" - pick-by-alias "^1.2.0" - to-float32 "^1.1.0" - update-diff "^1.1.0" - -regl-splom@^1.0.8: - version "1.0.14" - resolved "https://registry.yarnpkg.com/regl-splom/-/regl-splom-1.0.14.tgz#58800b7bbd7576aa323499a1966868a6c9ea1456" - integrity sha512-OiLqjmPRYbd7kDlHC6/zDf6L8lxgDC65BhC8JirhP4ykrK4x22ZyS+BnY8EUinXKDeMgmpRwCvUmk7BK4Nweuw== - dependencies: - array-bounds "^1.0.1" - array-range "^1.0.1" - color-alpha "^1.0.4" - flatten-vertex-data "^1.0.2" - parse-rect "^1.2.0" - pick-by-alias "^1.2.0" - raf "^3.4.1" - regl-scatter2d "^3.2.3" - -regl@^1.6.1: - version "1.7.0" - resolved "https://registry.yarnpkg.com/regl/-/regl-1.7.0.tgz#0d185431044a356bf80e9b775b11b935ef2746d3" - integrity sha512-bEAtp/qrtKucxXSJkD4ebopFZYP0q1+3Vb2WECWv/T8yQEgKxDxJ7ztO285tAMaYZVR6mM1GgI6CCn8FROtL1w== - -regl@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/regl/-/regl-2.1.0.tgz#7dae71e9ff20f29c4f42f510c70cd92ebb6b657c" - integrity sha512-oWUce/aVoEvW5l2V0LK7O5KJMzUSKeiOwFuJehzpSFd43dO5spP9r+sSUfhKtsky4u6MCqWJaRL+abzExynfTg== - -relateurl@^0.2.7: - version "0.2.7" - resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" - integrity sha1-VNvzd+UUQKypCkzSdGANP/LYiKk= - -remark-breaks@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/remark-breaks/-/remark-breaks-3.0.2.tgz#f466b9d3474d7323146c0149fc1496dabadd908e" - integrity sha512-x96YDJ9X+Ry0/JNZFKfr1hpcAKvGYWfUTszxY9RbxKEqq6uzPPoLCuHdZsLPZZUdAv3nCROyc7FPrQLWr2rxyw== - dependencies: - "@types/mdast" "^3.0.0" - unified "^10.0.0" - unist-util-visit "^4.0.0" - -remark-gfm@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/remark-gfm/-/remark-gfm-1.0.0.tgz#9213643001be3f277da6256464d56fd28c3b3c0d" - integrity sha512-KfexHJCiqvrdBZVbQ6RopMZGwaXz6wFJEfByIuEwGf0arvITHjiKKZ1dpXujjH9KZdm1//XJQwgfnJ3lmXaDPA== - dependencies: - mdast-util-gfm "^0.1.0" - micromark-extension-gfm "^0.3.0" - -remark-parse@^9.0.0: - version "9.0.0" - resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-9.0.0.tgz#4d20a299665880e4f4af5d90b7c7b8a935853640" - integrity sha512-geKatMwSzEXKHuzBNU1z676sGcDcFoChMK38TgdHJNAYfFtsfHDQG7MoJAjs6sgYMqyLduCYWDIWZIxiPeafEw== - dependencies: - mdast-util-from-markdown "^0.8.0" - -repeat-string@^1.0.0, repeat-string@^1.3.0: - version "1.6.1" - resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" - integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= - -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= - -require-from-string@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" - integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== - -requires-port@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" - integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8= - -resolve-cwd@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" - integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== - dependencies: - resolve-from "^5.0.0" - -resolve-from@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" - integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== - -resolve-from@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" - integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== - -resolve-protobuf-schema@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/resolve-protobuf-schema/-/resolve-protobuf-schema-2.1.0.tgz#9ca9a9e69cf192bbdaf1006ec1973948aa4a3758" - integrity sha512-kI5ffTiZWmJaS/huM8wZfEMer1eRd7oJQhDuxeCLe3t7N7mX3z94CN0xPxBQxFYQTSNz9T0i+v6inKqSdK8xrQ== - dependencies: - protocol-buffers-schema "^3.3.1" - -resolve@^0.6.1: - version "0.6.3" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-0.6.3.tgz#dd957982e7e736debdf53b58a4dd91754575dd46" - integrity sha1-3ZV5gufnNt699TtYpN2RdUV13UY= - -resolve@^1.0.0, resolve@^1.1.5, resolve@^1.14.2, resolve@^1.9.0: - version "1.20.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" - integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== - dependencies: - is-core-module "^2.2.0" - path-parse "^1.0.6" - -retry@^0.13.1: - version "0.13.1" - resolved "https://registry.yarnpkg.com/retry/-/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658" - integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== - -reusify@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" - integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== - -rfdc@^1.1.4: - version "1.3.0" - resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.3.0.tgz#d0b7c441ab2720d05dc4cf26e01c89631d9da08b" - integrity sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA== - -right-now@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/right-now/-/right-now-1.0.0.tgz#6e89609deebd7dcdaf8daecc9aea39cf585a0918" - integrity sha1-bolgne69fc2vja7Mmuo5z1haCRg= - -rimraf@^3.0.0, rimraf@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" - integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== - dependencies: - glob "^7.1.3" - -robust-compress@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/robust-compress/-/robust-compress-1.0.0.tgz#4cf62c4b318d8308516012bb8c11752f39329b1b" - integrity sha1-TPYsSzGNgwhRYBK7jBF1Lzkymxs= - -robust-determinant@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/robust-determinant/-/robust-determinant-1.1.0.tgz#8ecae79b79caab3e74f6debe2237e5391a27e9c7" - integrity sha1-jsrnm3nKqz509t6+IjflORon6cc= - dependencies: - robust-compress "^1.0.0" - robust-scale "^1.0.0" - robust-sum "^1.0.0" - two-product "^1.0.0" - -robust-dot-product@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/robust-dot-product/-/robust-dot-product-1.0.0.tgz#c9ba0178bd2c304bfd725f58e889f1d946004553" - integrity sha1-yboBeL0sMEv9cl9Y6Inx2UYARVM= - dependencies: - robust-sum "^1.0.0" - two-product "^1.0.0" - -robust-in-sphere@^1.1.3: - version "1.2.1" - resolved "https://registry.yarnpkg.com/robust-in-sphere/-/robust-in-sphere-1.2.1.tgz#ece3c2ae0fdf36b351680566adea7e93c6ba46da" - integrity sha512-3zJdcMIOP1gdwux93MKTS0RiMYEGwQBoE5R1IW/9ZQmGeZzP7f7i4+xdcK8ujJvF/dEOS1WPuI9IB1WNFbj3Cg== - dependencies: - robust-scale "^1.0.0" - robust-subtract "^1.0.0" - robust-sum "^1.0.0" - two-product "^1.0.0" - -robust-linear-solve@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/robust-linear-solve/-/robust-linear-solve-1.0.0.tgz#0cd6ac5040691a6f2aa3cd6311d728905ca3a1f1" - integrity sha1-DNasUEBpGm8qo81jEdcokFyjofE= - dependencies: - robust-determinant "^1.1.0" - -robust-orientation@^1.0.1, robust-orientation@^1.0.2, robust-orientation@^1.1.2, robust-orientation@^1.1.3: - version "1.2.1" - resolved "https://registry.yarnpkg.com/robust-orientation/-/robust-orientation-1.2.1.tgz#f6c2b00a5df5f1cb9597be63a45190f273899361" - integrity sha512-FuTptgKwY6iNuU15nrIJDLjXzCChWB+T4AvksRtwPS/WZ3HuP1CElCm1t+OBfgQKfWbtZIawip+61k7+buRKAg== - dependencies: - robust-scale "^1.0.2" - robust-subtract "^1.0.0" - robust-sum "^1.0.0" - two-product "^1.0.2" - -robust-product@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/robust-product/-/robust-product-1.0.0.tgz#685250007cdbba7cf1de75bff6d2927011098abe" - integrity sha1-aFJQAHzbunzx3nW/9tKScBEJir4= - dependencies: - robust-scale "^1.0.0" - robust-sum "^1.0.0" - -robust-scale@^1.0.0, robust-scale@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/robust-scale/-/robust-scale-1.0.2.tgz#775132ed09542d028e58b2cc79c06290bcf78c32" - integrity sha1-d1Ey7QlULQKOWLLMecBikLz3jDI= - dependencies: - two-product "^1.0.2" - two-sum "^1.0.0" - -robust-segment-intersect@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/robust-segment-intersect/-/robust-segment-intersect-1.0.1.tgz#3252b6a0fc1ba14ade6915ccbe09cbce9aab1c1c" - integrity sha1-MlK2oPwboUreaRXMvgnLzpqrHBw= - dependencies: - robust-orientation "^1.1.3" - -robust-subtract@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/robust-subtract/-/robust-subtract-1.0.0.tgz#e0b164e1ed8ba4e3a5dda45a12038348dbed3e9a" - integrity sha1-4LFk4e2LpOOl3aRaEgODSNvtPpo= - -robust-sum@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/robust-sum/-/robust-sum-1.0.0.tgz#16646e525292b4d25d82757a286955e0bbfa53d9" - integrity sha1-FmRuUlKStNJdgnV6KGlV4Lv6U9k= - -run-parallel@^1.1.9: - version "1.2.0" - resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" - integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== - dependencies: - queue-microtask "^1.2.2" - -rw@^1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/rw/-/rw-1.3.3.tgz#3f862dfa91ab766b14885ef4d01124bfda074fb4" - integrity sha1-P4Yt+pGrdmsUiF700BEkv9oHT7Q= - -safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: - version "5.1.2" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== - -safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@~5.2.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - -"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0": - version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== - -sane-topojson@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/sane-topojson/-/sane-topojson-4.0.0.tgz#624cdb26fc6d9392c806897bfd1a393f29bb5308" - integrity sha512-bJILrpBboQfabG3BNnHI2hZl52pbt80BE09u4WhnrmzuF2JbMKZdl62G5glXskJ46p+gxE2IzOwGj/awR4g8AA== - -scheduler@^0.20.2: - version "0.20.2" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.20.2.tgz#4baee39436e34aa93b4874bddcbf0fe8b8b50e91" - integrity sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ== - dependencies: - loose-envify "^1.1.0" - object-assign "^4.1.1" - -schema-utils@^2.6.5: - version "2.7.1" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.1.tgz#1ca4f32d1b24c590c203b8e7a50bf0ea4cd394d7" - integrity sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg== - dependencies: - "@types/json-schema" "^7.0.5" - ajv "^6.12.4" - ajv-keywords "^3.5.2" - -schema-utils@^3.0.0, schema-utils@^3.1.0, schema-utils@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.1.1.tgz#bc74c4b6b6995c1d88f76a8b77bea7219e0c8281" - integrity sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw== - dependencies: - "@types/json-schema" "^7.0.8" - ajv "^6.12.5" - ajv-keywords "^3.5.2" - -schema-utils@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.0.0.tgz#60331e9e3ae78ec5d16353c467c34b3a0a1d3df7" - integrity sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg== - dependencies: - "@types/json-schema" "^7.0.9" - ajv "^8.8.0" - ajv-formats "^2.1.1" - ajv-keywords "^5.0.0" - -scrollbar-width@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/scrollbar-width/-/scrollbar-width-3.1.1.tgz#c62e63efa5934dac37b43da34f7550caca8444a2" - integrity sha1-xi5j76WTTaw3tD2jT3VQysqERKI= - -select-hose@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" - integrity sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo= - -selfsigned@^1.10.11: - version "1.10.11" - resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-1.10.11.tgz#24929cd906fe0f44b6d01fb23999a739537acbe9" - integrity sha512-aVmbPOfViZqOZPgRBT0+3u4yZFHpmnIghLMlAcb5/xhp5ZtB/RVnKhz5vl2M32CLXAqR4kha9zfhNg0Lf/sxKA== - dependencies: - node-forge "^0.10.0" - -semver@7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" - integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== - -semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" - integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== - -semver@^7.3.5: - version "7.3.5" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" - integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== - dependencies: - lru-cache "^6.0.0" - -send@0.17.1: - version "0.17.1" - resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" - integrity sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg== - dependencies: - debug "2.6.9" - depd "~1.1.2" - destroy "~1.0.4" - encodeurl "~1.0.2" - escape-html "~1.0.3" - etag "~1.8.1" - fresh "0.5.2" - http-errors "~1.7.2" - mime "1.6.0" - ms "2.1.1" - on-finished "~2.3.0" - range-parser "~1.2.1" - statuses "~1.5.0" - -sentence-case@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/sentence-case/-/sentence-case-3.0.4.tgz#3645a7b8c117c787fde8702056225bb62a45131f" - integrity sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg== - dependencies: - no-case "^3.0.4" - tslib "^2.0.3" - upper-case-first "^2.0.2" - -serialize-javascript@6.0.0, serialize-javascript@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" - integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag== - dependencies: - randombytes "^2.1.0" - -serve-index@^1.9.1: - version "1.9.1" - resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239" - integrity sha1-03aNabHn2C5c4FD/9bRTvqEqkjk= - dependencies: - accepts "~1.3.4" - batch "0.6.1" - debug "2.6.9" - escape-html "~1.0.3" - http-errors "~1.6.2" - mime-types "~2.1.17" - parseurl "~1.3.2" - -serve-static@1.14.1: - version "1.14.1" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9" - integrity sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg== - dependencies: - encodeurl "~1.0.2" - escape-html "~1.0.3" - parseurl "~1.3.3" - send "0.17.1" - -setprototypeof@1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" - integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== - -setprototypeof@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" - integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== - -shallow-clone@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" - integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== - dependencies: - kind-of "^6.0.2" - -shallow-copy@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/shallow-copy/-/shallow-copy-0.0.1.tgz#415f42702d73d810330292cc5ee86eae1a11a170" - integrity sha1-QV9CcC1z2BAzApLMXuhurhoRoXA= - -shallowequal@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-1.1.0.tgz#188d521de95b9087404fd4dcb68b13df0ae4e7f8" - integrity sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ== - -shebang-command@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" - integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== - dependencies: - shebang-regex "^3.0.0" - -shebang-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" - integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== - -side-channel@^1.0.3, side-channel@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" - integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== - dependencies: - call-bind "^1.0.0" - get-intrinsic "^1.0.2" - object-inspect "^1.9.0" - -signal-exit@^3.0.3: - version "3.0.6" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.6.tgz#24e630c4b0f03fea446a2bd299e62b4a6ca8d0af" - integrity sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ== - -signum@^0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/signum/-/signum-0.0.0.tgz#ab551b1003351070a704783f1a09c5e7691f9cf6" - integrity sha1-q1UbEAM1EHCnBHg/GgnF52kfnPY= - -signum@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/signum/-/signum-1.0.0.tgz#74a7d2bf2a20b40eba16a92b152124f1d559fa77" - integrity sha1-dKfSvyogtA66FqkrFSEk8dVZ+nc= - -simple-is@~0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/simple-is/-/simple-is-0.2.0.tgz#2abb75aade39deb5cc815ce10e6191164850baf0" - integrity sha1-Krt1qt453rXMgVzhDmGRFkhQuvA= - -simplicial-complex-boundary@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/simplicial-complex-boundary/-/simplicial-complex-boundary-1.0.1.tgz#72c9ff1e24deaa374c9bb2fa0cbf0c081ebef815" - integrity sha1-csn/HiTeqjdMm7L6DL8MCB6++BU= - dependencies: - boundary-cells "^2.0.0" - reduce-simplicial-complex "^1.0.0" - -simplicial-complex-contour@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/simplicial-complex-contour/-/simplicial-complex-contour-1.0.2.tgz#890aacac284365340110545cf2629a26e04bf9d1" - integrity sha1-iQqsrChDZTQBEFRc8mKaJuBL+dE= - dependencies: - marching-simplex-table "^1.0.0" - ndarray "^1.0.15" - ndarray-sort "^1.0.0" - typedarray-pool "^1.1.0" - -simplicial-complex@^0.3.3: - version "0.3.3" - resolved "https://registry.yarnpkg.com/simplicial-complex/-/simplicial-complex-0.3.3.tgz#4c30cad57f9e45729dd8f306c8753579f46be99e" - integrity sha1-TDDK1X+eRXKd2PMGyHU1efRr6Z4= - dependencies: - bit-twiddle "~0.0.1" - union-find "~0.0.3" - -simplicial-complex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/simplicial-complex/-/simplicial-complex-1.0.0.tgz#6c33a4ed69fcd4d91b7bcadd3b30b63683eae241" - integrity sha1-bDOk7Wn81Nkbe8rdOzC2NoPq4kE= - dependencies: - bit-twiddle "^1.0.0" - union-find "^1.0.0" - -simplify-planar-graph@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/simplify-planar-graph/-/simplify-planar-graph-2.0.1.tgz#bc85893725f32e8fa8ae25681398446d2cbcf766" - integrity sha1-vIWJNyXzLo+oriVoE5hEbSy892Y= - dependencies: - robust-orientation "^1.0.1" - simplicial-complex "^0.3.3" - -simply-uuid@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/simply-uuid/-/simply-uuid-1.0.1.tgz#539241d81528969cef23892faf4588005fa99ab8" - integrity sha1-U5JB2BUolpzvI4kvr0WIAF+pmrg= - -sirv@^1.0.7: - version "1.0.19" - resolved "https://registry.yarnpkg.com/sirv/-/sirv-1.0.19.tgz#1d73979b38c7fe91fcba49c85280daa9c2363b49" - integrity sha512-JuLThK3TnZG1TAKDwNIqNq6QA2afLOCcm+iE8D1Kj3GA40pSPsxQjjJl0J8X3tsR7T+CP1GavpzLwYkgVLWrZQ== - dependencies: - "@polka/url" "^1.0.0-next.20" - mrmime "^1.0.0" - totalist "^1.0.0" - -slab-decomposition@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/slab-decomposition/-/slab-decomposition-1.0.3.tgz#0345b3d364d78dad3f400cd5c8e0424547d23e7c" - integrity sha512-1EfR304JHvX9vYQkUi4AKqN62mLsjk6W45xTk/TxwN8zd3HGwS7PVj9zj0I6fgCZqfGlimDEY+RzzASHn97ZmQ== - dependencies: - binary-search-bounds "^2.0.0" - functional-red-black-tree "^1.0.0" - robust-orientation "^1.1.3" - -slash@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" - integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== - -snake-case@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/snake-case/-/snake-case-3.0.4.tgz#4f2bbd568e9935abdfd593f34c691dadb49c452c" - integrity sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg== - dependencies: - dot-case "^3.0.4" - tslib "^2.0.3" - -sniffr@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/sniffr/-/sniffr-1.2.0.tgz#d4e31073ef4f7c00d87dba89289736fba25cadb4" - integrity sha512-k7C0ZcHBU330LcSkKyc2cOOB0uHosME8b2t9qFJqdqB1cKwGmZWd7BVwBz5mWOMJ5dggK1dy2qv+DSwteKLBzQ== - -socket.io-adapter@~2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-2.1.0.tgz#edc5dc36602f2985918d631c1399215e97a1b527" - integrity sha512-+vDov/aTsLjViYTwS9fPy5pEtTkrbEKsw2M+oVSoFGw6OD1IpvlV1VPhUzNbofCQ8oyMbdYJqDtGdmHQK6TdPg== - -socket.io-parser@~4.0.3: - version "4.0.4" - resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-4.0.4.tgz#9ea21b0d61508d18196ef04a2c6b9ab630f4c2b0" - integrity sha512-t+b0SS+IxG7Rxzda2EVvyBZbvFPBCjJoyHuE0P//7OAsN23GItzDRdWa6ALxZI/8R5ygK7jAR6t028/z+7295g== - dependencies: - "@types/component-emitter" "^1.2.10" - component-emitter "~1.3.0" - debug "~4.3.1" - -socket.io@^3.1.0: - version "3.1.2" - resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-3.1.2.tgz#06e27caa1c4fc9617547acfbb5da9bc1747da39a" - integrity sha512-JubKZnTQ4Z8G4IZWtaAZSiRP3I/inpy8c/Bsx2jrwGrTbKeVU5xd6qkKMHpChYeM3dWZSO0QACiGK+obhBNwYw== - dependencies: - "@types/cookie" "^0.4.0" - "@types/cors" "^2.8.8" - "@types/node" ">=10.0.0" - accepts "~1.3.4" - base64id "~2.0.0" - debug "~4.3.1" - engine.io "~4.1.0" - socket.io-adapter "~2.1.0" - socket.io-parser "~4.0.3" - -sockjs@^0.3.21: - version "0.3.24" - resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.24.tgz#c9bc8995f33a111bea0395ec30aa3206bdb5ccce" - integrity sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ== - dependencies: - faye-websocket "^0.11.3" - uuid "^8.3.2" - websocket-driver "^0.7.4" - -source-map-js@^0.6.2: - version "0.6.2" - resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-0.6.2.tgz#0bb5de631b41cfbda6cfba8bd05a80efdfd2385e" - integrity sha512-/3GptzWzu0+0MBQFrDKzw/DvvMTUORvgY6k6jd/VS6iCR4RDTKWH6v6WPwQoUO8667uQEf9Oe38DxAYWY5F/Ug== - -source-map-js@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.1.tgz#a1741c131e3c77d048252adfa24e23b908670caf" - integrity sha512-4+TN2b3tqOCd/kaGRJ/sTYA0tR0mdXx26ipdolxcwtJVqEnqNYvlCAt1q3ypy4QMlYus+Zh34RNtYLoq2oQ4IA== - -source-map-loader@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/source-map-loader/-/source-map-loader-3.0.0.tgz#f2a04ee2808ad01c774dea6b7d2639839f3b3049" - integrity sha512-GKGWqWvYr04M7tn8dryIWvb0s8YM41z82iQv01yBtIylgxax0CwvSy6gc2Y02iuXwEfGWRlMicH0nvms9UZphw== - dependencies: - abab "^2.0.5" - iconv-lite "^0.6.2" - source-map-js "^0.6.2" - -source-map-support@~0.5.20: - version "0.5.21" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" - integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -source-map@^0.5.0: - version "0.5.7" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" - integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= - -source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - -source-map@~0.7.2: - version "0.7.3" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" - integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== - -sourcemap-codec@^1.4.4: - version "1.4.8" - resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4" - integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== - -spdy-transport@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-3.0.0.tgz#00d4863a6400ad75df93361a1608605e5dcdcf31" - integrity sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw== - dependencies: - debug "^4.1.0" - detect-node "^2.0.4" - hpack.js "^2.1.6" - obuf "^1.1.2" - readable-stream "^3.0.6" - wbuf "^1.7.3" - -spdy@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/spdy/-/spdy-4.0.2.tgz#b74f466203a3eda452c02492b91fb9e84a27677b" - integrity sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA== - dependencies: - debug "^4.1.0" - handle-thing "^2.0.0" - http-deceiver "^1.2.7" - select-hose "^2.0.0" - spdy-transport "^3.0.0" - -split-polygon@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/split-polygon/-/split-polygon-1.0.0.tgz#0eacc8a136a76b12a3d95256ea7da45db0c2d247" - integrity sha1-DqzIoTanaxKj2VJW6n2kXbDC0kc= - dependencies: - robust-dot-product "^1.0.0" - robust-sum "^1.0.0" - -sprintf-js@^1.0.3: - version "1.1.2" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.2.tgz#da1765262bf8c0f571749f2ad6c26300207ae673" - integrity sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug== - -stack-trace@0.0.9: - version "0.0.9" - resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.9.tgz#a8f6eaeca90674c333e7c43953f275b451510695" - integrity sha1-qPbq7KkGdMMz58Q5U/J1tFFRBpU= - -static-eval@^2.0.5: - version "2.1.0" - resolved "https://registry.yarnpkg.com/static-eval/-/static-eval-2.1.0.tgz#a16dbe54522d7fa5ef1389129d813fd47b148014" - integrity sha512-agtxZ/kWSsCkI5E4QifRwsaPs0P0JmZV6dkLz6ILYfFYQGn+5plctanRN+IC8dJRiFkyXHrwEE3W9Wmx67uDbw== - dependencies: - escodegen "^1.11.1" - -"statuses@>= 1.4.0 < 2", "statuses@>= 1.5.0 < 2", statuses@~1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" - integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= - -stream-shift@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d" - integrity sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ== - -streamroller@^2.2.4: - version "2.2.4" - resolved "https://registry.yarnpkg.com/streamroller/-/streamroller-2.2.4.tgz#c198ced42db94086a6193608187ce80a5f2b0e53" - integrity sha512-OG79qm3AujAM9ImoqgWEY1xG4HX+Lw+yY6qZj9R1K2mhF5bEmQ849wvrb+4vt4jLMLzwXttJlQbOdPOQVRv7DQ== - dependencies: - date-format "^2.1.0" - debug "^4.1.1" - fs-extra "^8.1.0" - -strictdom@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/strictdom/-/strictdom-1.0.1.tgz#189de91649f73d44d59b8432efa68ef9d2659460" - integrity sha1-GJ3pFkn3PUTVm4Qy76aO+dJllGA= - -string-split-by@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/string-split-by/-/string-split-by-1.0.0.tgz#53895fb3397ebc60adab1f1e3a131f5372586812" - integrity sha512-KaJKY+hfpzNyet/emP81PJA9hTVSfxNLS9SFTWxdCnnW1/zOOwiV248+EfoX7IQFcBaOp4G5YE6xTJMF+pLg6A== - dependencies: - parenthesis "^3.1.5" - -string-to-arraybuffer@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/string-to-arraybuffer/-/string-to-arraybuffer-1.0.2.tgz#161147fbadea02e28b0935002cec4c40f1ca7f0a" - integrity sha512-DaGZidzi93dwjQen5I2osxR9ERS/R7B1PFyufNMnzhj+fmlDQAc1DSDIJVJhgI8Oq221efIMbABUBdPHDRt43Q== - dependencies: - atob-lite "^2.0.0" - is-base64 "^0.1.0" - -string-width@^4.1.0, string-width@^4.2.0: - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string.prototype.trimend@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz#e75ae90c2942c63504686c18b287b4a0b1a45f80" - integrity sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - -string.prototype.trimstart@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz#b36399af4ab2999b4c9c648bd7a3fb2bb26feeed" - integrity sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - -string_decoder@^1.1.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== - dependencies: - safe-buffer "~5.2.0" - -string_decoder@~0.10.x: - version "0.10.31" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" - integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ= - -string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== - dependencies: - safe-buffer "~5.1.0" - -strip-ansi@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-ansi@^7.0.0: - version "7.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.0.1.tgz#61740a08ce36b61e50e65653f07060d000975fb2" - integrity sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw== - dependencies: - ansi-regex "^6.0.1" - -strip-final-newline@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" - integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== - -strip-json-comments@3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" - integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== - -strongly-connected-components@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/strongly-connected-components/-/strongly-connected-components-1.0.1.tgz#0920e2b4df67c8eaee96c6b6234fe29e873dba99" - integrity sha1-CSDitN9nyOrulsa2I0/inoc9upk= - -style-inject@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/style-inject/-/style-inject-0.3.0.tgz#d21c477affec91811cc82355832a700d22bf8dd3" - integrity sha512-IezA2qp+vcdlhJaVm5SOdPPTUu0FCEqfNSli2vRuSIBbu5Nq5UvygTk/VzeCqfLz2Atj3dVII5QBKGZRZ0edzw== - -style-loader@3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-3.3.0.tgz#d66ea95fc50b22f8b79b69a9e414760fcf58d8d8" - integrity sha512-szANub7ksJtQioJYtpbWwh1hUl99uK15n5HDlikeCRil/zYMZgSxucHddyF/4A3qJMUiAjPhFowrrQuNMA7jwQ== - -style-loader@~3.3.1: - version "3.3.1" - resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-3.3.1.tgz#057dfa6b3d4d7c7064462830f9113ed417d38575" - integrity sha512-GPcQ+LDJbrcxHORTRes6Jy2sfvK2kS6hpSfI/fXhPt+spVzxF6LJ1dHLN9zIGmVaaP044YKaIatFaufENRiDoQ== - -styled-components@^5.3.3: - version "5.3.3" - resolved "https://registry.yarnpkg.com/styled-components/-/styled-components-5.3.3.tgz#312a3d9a549f4708f0fb0edc829eb34bde032743" - integrity sha512-++4iHwBM7ZN+x6DtPPWkCI4vdtwumQ+inA/DdAsqYd4SVgUKJie5vXyzotA00ttcFdQkCng7zc6grwlfIfw+lw== - dependencies: - "@babel/helper-module-imports" "^7.0.0" - "@babel/traverse" "^7.4.5" - "@emotion/is-prop-valid" "^0.8.8" - "@emotion/stylis" "^0.8.4" - "@emotion/unitless" "^0.7.4" - babel-plugin-styled-components ">= 1.12.0" - css-to-react-native "^3.0.0" - hoist-non-react-statics "^3.0.0" - shallowequal "^1.1.0" - supports-color "^5.5.0" - -supercluster@^7.0.0: - version "7.1.4" - resolved "https://registry.yarnpkg.com/supercluster/-/supercluster-7.1.4.tgz#6762aabfd985d3390b49f13b815567d5116a828a" - integrity sha512-GhKkRM1jMR6WUwGPw05fs66pOFWhf59lXq+Q3J3SxPvhNcmgOtLRV6aVQPMRsmXdpaeFJGivt+t7QXUPL3ff4g== - dependencies: - kdbush "^3.0.0" - -superscript-text@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/superscript-text/-/superscript-text-1.0.0.tgz#e7cb2752567360df50beb0610ce8df3d71d8dfd8" - integrity sha1-58snUlZzYN9QvrBhDOjfPXHY39g= - -supports-color@8.1.1, supports-color@^8.0.0: - version "8.1.1" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" - integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== - dependencies: - has-flag "^4.0.0" - -supports-color@^5.3.0, supports-color@^5.4.0, supports-color@^5.5.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== - dependencies: - has-flag "^3.0.0" - -supports-color@^7.1.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" - integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== - dependencies: - has-flag "^4.0.0" - -surface-nets@^1.0.0, surface-nets@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/surface-nets/-/surface-nets-1.0.2.tgz#e433c8cbba94a7274c6f4c99552b461bf1fc7a4b" - integrity sha1-5DPIy7qUpydMb0yZVStGG/H8eks= - dependencies: - ndarray-extract-contour "^1.0.0" - triangulate-hypercube "^1.0.0" - zero-crossings "^1.0.0" - -svg-arc-to-cubic-bezier@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/svg-arc-to-cubic-bezier/-/svg-arc-to-cubic-bezier-3.2.0.tgz#390c450035ae1c4a0104d90650304c3bc814abe6" - integrity sha512-djbJ/vZKZO+gPoSDThGNpKDO+o+bAeA4XQKovvkNCqnIS2t+S4qnLAGQhyyrulhCFRl1WWzAp0wUDV8PpTVU3g== - -svg-path-bounds@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/svg-path-bounds/-/svg-path-bounds-1.0.2.tgz#00312f672b08afc432a66ddfbd06db40cec8d0d0" - integrity sha512-H4/uAgLWrppIC0kHsb2/dWUYSmb4GE5UqH06uqWBcg6LBjX2fu0A8+JrO2/FJPZiSsNOKZAhyFFgsLTdYUvSqQ== - dependencies: - abs-svg-path "^0.1.1" - is-svg-path "^1.0.1" - normalize-svg-path "^1.0.0" - parse-svg-path "^0.1.2" - -svg-path-sdf@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/svg-path-sdf/-/svg-path-sdf-1.1.3.tgz#92957a31784c0eaf68945472c8dc6bf9e6d126fc" - integrity sha512-vJJjVq/R5lSr2KLfVXVAStktfcfa1pNFjFOgyJnzZFXlO/fDZ5DmM8FpnSKKzLPfEYTVeXuVBTHF296TpxuJVg== - dependencies: - bitmap-sdf "^1.0.0" - draw-svg-path "^1.0.0" - is-svg-path "^1.0.1" - parse-svg-path "^0.1.2" - svg-path-bounds "^1.0.1" - -tabbable@^5.2.1: - version "5.2.1" - resolved "https://registry.yarnpkg.com/tabbable/-/tabbable-5.2.1.tgz#e3fda7367ddbb172dcda9f871c0fdb36d1c4cd9c" - integrity sha512-40pEZ2mhjaZzK0BnI+QGNjJO8UYx9pP5v7BGe17SORTO0OEuuaAwQTkAp8whcZvqon44wKFOikD+Al11K3JICQ== - -tabulator-tables@5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/tabulator-tables/-/tabulator-tables-5.0.1.tgz#c077de5da11ddca654a3132e908e80ff5f5382e2" - integrity sha512-zSPYzkLIBGwmAFEPOgUpXXNKzO95bVj6EKRikS0Em32gnfhSR9n73mN5TpQV1jU4nPv/pUUTbMZVVHrjzIaaJQ== - -tapable@^0.2.7: - version "0.2.9" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-0.2.9.tgz#af2d8bbc9b04f74ee17af2b4d9048f807acd18a8" - integrity sha512-2wsvQ+4GwBvLPLWsNfLCDYGsW6xb7aeC6utq2Qh0PFwgEy7K7dsma9Jsmb2zSQj7GvYAyUGSntLtsv++GmgL1A== - -tapable@^2.1.1, tapable@^2.2.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" - integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== - -terser-webpack-plugin@^5.1.3: - version "5.2.5" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.2.5.tgz#ce65b9880a0c36872555c4874f45bbdb02ee32c9" - integrity sha512-3luOVHku5l0QBeYS8r4CdHYWEGMmIj3H1U64jgkdZzECcSOJAyJ9TjuqcQZvw1Y+4AOBN9SeYJPJmFn2cM4/2g== - dependencies: - jest-worker "^27.0.6" - schema-utils "^3.1.1" - serialize-javascript "^6.0.0" - source-map "^0.6.1" - terser "^5.7.2" - -terser@^5.10.0, terser@^5.7.2: - version "5.10.0" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.10.0.tgz#b86390809c0389105eb0a0b62397563096ddafcc" - integrity sha512-AMmF99DMfEDiRJfxfY5jj5wNH/bYO09cniSqhfoyxc8sFoYIgkJy86G04UoZU5VjlpnplVu0K6Tx6E9b5+DlHA== - dependencies: - commander "^2.20.0" - source-map "~0.7.2" - source-map-support "~0.5.20" - -text-cache@^4.2.2: - version "4.2.2" - resolved "https://registry.yarnpkg.com/text-cache/-/text-cache-4.2.2.tgz#d0d30ba89b7312ea1c1a31cd9a4db56c1cef7fe7" - integrity sha512-zky+UDYiX0a/aPw/YTBD+EzKMlCTu1chFuCMZeAkgoRiceySdROu1V2kJXhCbtEdBhiOviYnAdGiSYl58HW0ZQ== - dependencies: - vectorize-text "^3.2.1" - -three-csg-ts@3.1.9: - version "3.1.9" - resolved "https://registry.yarnpkg.com/three-csg-ts/-/three-csg-ts-3.1.9.tgz#1438de3b6747b9b55deb88d9e0acdc6e47681979" - integrity sha512-Qke0+07AKDfeiRjh46sOF2iiilSMcKnfgHjuArdMB4poZs3X0FQLHGFIEBbGrv3ejrkHASW9o5pLRfFFQhk9hg== - -three@0.130.1: - version "0.130.1" - resolved "https://registry.yarnpkg.com/three/-/three-0.130.1.tgz#797588b2877ace31603bbbc864eb2e3022f0b3b4" - integrity sha512-OSPPKcGvFSiGkG3jFrwwC76PBV/ZSrGxpBbg28bW8s9GU8r/y2spNGtEXHEb/CVqo0Ctf5Lx2rVaxQZB6OasaA== - -through2@^0.6.3: - version "0.6.5" - resolved "https://registry.yarnpkg.com/through2/-/through2-0.6.5.tgz#41ab9c67b29d57209071410e1d7a7a968cd3ad48" - integrity sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg= - dependencies: - readable-stream ">=1.0.33-1 <1.1.0-0" - xtend ">=4.0.0 <4.1.0-0" - -through2@^2.0.1: - version "2.0.5" - resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" - integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== - dependencies: - readable-stream "~2.3.6" - xtend "~4.0.1" - -thunky@^1.0.2: - version "1.1.0" - resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d" - integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA== - -tinycolor2@^1.4.1: - version "1.4.2" - resolved "https://registry.yarnpkg.com/tinycolor2/-/tinycolor2-1.4.2.tgz#3f6a4d1071ad07676d7fa472e1fac40a719d8803" - integrity sha512-vJhccZPs965sV/L2sU4oRQVAos0pQXwsvTLkWYdqJ+a8Q5kPFzJTuOFwy7UniPli44NKQGAglksjvOcpo95aZA== - -tinyqueue@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/tinyqueue/-/tinyqueue-2.0.3.tgz#64d8492ebf39e7801d7bd34062e29b45b2035f08" - integrity sha512-ppJZNDuKGgxzkHihX8v9v9G5f+18gzaTfrukGrq6ueg0lmH4nqVnA2IPG0AEH3jKEk2GRJCUhDoqpoiw3PHLBA== - -tmp@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.1.tgz#8457fc3037dcf4719c251367a1af6500ee1ccf14" - integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ== - dependencies: - rimraf "^3.0.0" - -to-array-buffer@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/to-array-buffer/-/to-array-buffer-3.2.0.tgz#cb684dd691a7368c3b249c2348d75227f7d4dbb4" - integrity sha512-zN33mwi0gpL+7xW1ITLfJ48CEj6ZQW0ZAP0MU+2W3kEY0PAIncyuxmD4OqkUVhPAbTP7amq9j/iwvZKYS+lzSQ== - dependencies: - flatten-vertex-data "^1.0.2" - is-blob "^2.0.1" - string-to-arraybuffer "^1.0.0" - -to-fast-properties@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" - integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= - -to-float32@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/to-float32/-/to-float32-1.1.0.tgz#39bd3b11eadccd490c08f5f9171da5127b6f3946" - integrity sha512-keDnAusn/vc+R3iEiSDw8TOF7gPiTLdK1ArvWtYbJQiVfmRg6i/CAvbKq3uIS0vWroAC7ZecN3DjQKw3aSklUg== - -to-px@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/to-px/-/to-px-1.0.1.tgz#5bbaed5e5d4f76445bcc903c293a2307dd324646" - integrity sha1-W7rtXl1PdkRbzJA8KTojB90yRkY= - dependencies: - parse-unit "^1.0.1" - -to-px@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/to-px/-/to-px-1.1.0.tgz#b6b269ed5db0cc9aefc15272a4c8bcb2ca1e99ca" - integrity sha512-bfg3GLYrGoEzrGoE05TAL/Uw+H/qrf2ptr9V3W7U0lkjjyYnIfgxmVLUfhQ1hZpIQwin81uxhDjvUkDYsC0xWw== - dependencies: - parse-unit "^1.0.1" - -to-regex-range@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" - integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== - dependencies: - is-number "^7.0.0" - -to-uint8@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/to-uint8/-/to-uint8-1.4.1.tgz#9f45694905b827f247d37bc8ec83b2818d81fac9" - integrity sha512-o+ochsMlTZyucbww8It401FC2Rx+OP2RpDeYbA6h+y9HgedDl1UjdsJ9CmzKEG7AFP9es5PmJ4eDWeeeXihESg== - dependencies: - arr-flatten "^1.1.0" - clamp "^1.0.1" - is-base64 "^0.1.0" - is-float-array "^1.0.0" - to-array-buffer "^3.0.0" - -toidentifier@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" - integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== - -topojson-client@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/topojson-client/-/topojson-client-3.1.0.tgz#22e8b1ed08a2b922feeb4af6f53b6ef09a467b99" - integrity sha512-605uxS6bcYxGXw9qi62XyrV6Q3xwbndjachmNxu8HWTtVPxZfEJN9fd/SZS1Q54Sn2y0TMyMxFj/cJINqGHrKw== - dependencies: - commander "2" - -totalist@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/totalist/-/totalist-1.1.0.tgz#a4d65a3e546517701e3e5c37a47a70ac97fe56df" - integrity sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g== - -traverse@0.6.6: - version "0.6.6" - resolved "https://registry.yarnpkg.com/traverse/-/traverse-0.6.6.tgz#cbdf560fd7b9af632502fed40f918c157ea97137" - integrity sha1-y99WD9e5r2MlAv7UD5GMFX6pcTc= - -triangulate-hypercube@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/triangulate-hypercube/-/triangulate-hypercube-1.0.1.tgz#d8071db2ebfcfd51f308d0bcf2a5c48a5b36d137" - integrity sha1-2Acdsuv8/VHzCNC88qXEils20Tc= - dependencies: - gamma "^0.1.0" - permutation-parity "^1.0.0" - permutation-rank "^1.0.0" - -triangulate-polyline@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/triangulate-polyline/-/triangulate-polyline-1.0.3.tgz#bf8ba877a85054103feb9fa5a61b4e8d7017814d" - integrity sha1-v4uod6hQVBA/65+lphtOjXAXgU0= - dependencies: - cdt2d "^1.0.0" - -trough@^1.0.0: - version "1.0.5" - resolved "https://registry.yarnpkg.com/trough/-/trough-1.0.5.tgz#b8b639cefad7d0bb2abd37d433ff8293efa5f406" - integrity sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA== - -trough@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/trough/-/trough-2.0.2.tgz#94a3aa9d5ce379fc561f6244905b3f36b7458d96" - integrity sha512-FnHq5sTMxC0sk957wHDzRnemFnNBvt/gSY99HzK8F7UP5WAbvP70yX5bd7CjEQkN+TjdxwI7g7lJ6podqrG2/w== - -tslib@^2.0.3: - version "2.3.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01" - integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw== - -turntable-camera-controller@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/turntable-camera-controller/-/turntable-camera-controller-3.0.1.tgz#8dbd3fe00550191c65164cb888971049578afd99" - integrity sha1-jb0/4AVQGRxlFky4iJcQSVeK/Zk= - dependencies: - filtered-vector "^1.2.1" - gl-mat4 "^1.0.2" - gl-vec3 "^1.0.2" - -two-product@^1.0.0, two-product@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/two-product/-/two-product-1.0.2.tgz#67d95d4b257a921e2cb4bd7af9511f9088522eaa" - integrity sha1-Z9ldSyV6kh4stL16+VEfkIhSLqo= - -two-sum@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/two-sum/-/two-sum-1.0.0.tgz#31d3f32239e4f731eca9df9155e2b297f008ab64" - integrity sha1-MdPzIjnk9zHsqd+RVeKyl/AIq2Q= - -type-check@~0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" - integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= - dependencies: - prelude-ls "~1.1.2" - -type-is@~1.6.17, type-is@~1.6.18: - version "1.6.18" - resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" - integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== - dependencies: - media-typer "0.3.0" - mime-types "~2.1.24" - -type-name@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/type-name/-/type-name-2.0.2.tgz#efe7d4123d8ac52afff7f40c7e4dec5266008fb4" - integrity sha1-7+fUEj2KxSr/9/QMfk3sUmYAj7Q= - -type@^1.0.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/type/-/type-1.2.0.tgz#848dd7698dafa3e54a6c479e759c4bc3f18847a0" - integrity sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg== - -type@^2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/type/-/type-2.5.0.tgz#0a2e78c2e77907b252abe5f298c1b01c63f0db3d" - integrity sha512-180WMDQaIMm3+7hGXWf12GtdniDEy7nYcyFMKJn/eZz/6tSLXrUN9V0wKSbMjej0I1WHWbpREDEKHtqPQa9NNw== - -typedarray-pool@^1.0.0, typedarray-pool@^1.0.2, typedarray-pool@^1.1.0, typedarray-pool@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/typedarray-pool/-/typedarray-pool-1.2.0.tgz#e7e90720144ba02b9ed660438af6f3aacfe33ac3" - integrity sha512-YTSQbzX43yvtpfRtIDAYygoYtgT+Rpjuxy9iOpczrjpXLgGoyG7aS5USJXV2d3nn8uHTeb9rXDvzS27zUg5KYQ== - dependencies: - bit-twiddle "^1.0.0" - dup "^1.0.0" - -typedarray@^0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" - integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= - -typescript@3.9.5: - version "3.9.5" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.5.tgz#586f0dba300cde8be52dd1ac4f7e1009c1b13f36" - integrity sha512-hSAifV3k+i6lEoCJ2k6R2Z/rp/H3+8sdmcn5NrS3/3kE7+RyZXm9aqvxWqjEXHAd8b0pShatpcdMTvEdvAJltQ== - -ua-parser-js@^0.7.28: - version "0.7.31" - resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.31.tgz#649a656b191dffab4f21d5e053e27ca17cbff5c6" - integrity sha512-qLK/Xe9E2uzmYI3qLeOmI0tEOt+TBBQyUIAh4aAgU05FVYzeZrKUdkAZfBNVGRaHVgV0TDkdEngJSw/SyQchkQ== - -unbox-primitive@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.1.tgz#085e215625ec3162574dc8859abee78a59b14471" - integrity sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw== - dependencies: - function-bind "^1.1.1" - has-bigints "^1.0.1" - has-symbols "^1.0.2" - which-boxed-primitive "^1.0.2" - -unicode-canonical-property-names-ecmascript@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc" - integrity sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ== - -unicode-match-property-ecmascript@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz#54fd16e0ecb167cf04cf1f756bdcc92eba7976c3" - integrity sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q== - dependencies: - unicode-canonical-property-names-ecmascript "^2.0.0" - unicode-property-aliases-ecmascript "^2.0.0" - -unicode-match-property-value-ecmascript@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz#1a01aa57247c14c568b89775a54938788189a714" - integrity sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw== - -unicode-property-aliases-ecmascript@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz#0a36cb9a585c4f6abd51ad1deddb285c165297c8" - integrity sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ== - -unified@^10.0.0: - version "10.1.1" - resolved "https://registry.yarnpkg.com/unified/-/unified-10.1.1.tgz#345e349e3ab353ab612878338eb9d57b4dea1d46" - integrity sha512-v4ky1+6BN9X3pQrOdkFIPWAaeDsHPE1svRDxq7YpTc2plkIqFMwukfqM+l0ewpP9EfwARlt9pPFAeWYhHm8X9w== - dependencies: - "@types/unist" "^2.0.0" - bail "^2.0.0" - extend "^3.0.0" - is-buffer "^2.0.0" - is-plain-obj "^4.0.0" - trough "^2.0.0" - vfile "^5.0.0" - -unified@^9.0.0: - version "9.2.2" - resolved "https://registry.yarnpkg.com/unified/-/unified-9.2.2.tgz#67649a1abfc3ab85d2969502902775eb03146975" - integrity sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ== - dependencies: - bail "^1.0.0" - extend "^3.0.0" - is-buffer "^2.0.0" - is-plain-obj "^2.0.0" - trough "^1.0.0" - vfile "^4.0.0" - -union-find@^1.0.0, union-find@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/union-find/-/union-find-1.0.2.tgz#292bac415e6ad3a89535d237010db4a536284e58" - integrity sha1-KSusQV5q06iVNdI3AQ20pTYoTlg= - -union-find@~0.0.3: - version "0.0.4" - resolved "https://registry.yarnpkg.com/union-find/-/union-find-0.0.4.tgz#b854b3301619bdad144b0014c78f96eac0d2f0f6" - integrity sha1-uFSzMBYZva0USwAUx4+W6sDS8PY= - -uniq@^1.0.0, uniq@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" - integrity sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8= - -unist-util-is@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-4.1.0.tgz#976e5f462a7a5de73d94b706bac1b90671b57797" - integrity sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg== - -unist-util-is@^5.0.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-5.1.1.tgz#e8aece0b102fa9bc097b0fef8f870c496d4a6236" - integrity sha512-F5CZ68eYzuSvJjGhCLPL3cYx45IxkqXSetCcRgUXtbcm50X2L9oOWQlfUfDdAf+6Pd27YDblBfdtmsThXmwpbQ== - -unist-util-stringify-position@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz#cce3bfa1cdf85ba7375d1d5b17bdc4cada9bd9da" - integrity sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g== - dependencies: - "@types/unist" "^2.0.2" - -unist-util-stringify-position@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-3.0.0.tgz#d517d2883d74d0daa0b565adc3d10a02b4a8cde9" - integrity sha512-SdfAl8fsDclywZpfMDTVDxA2V7LjtRDTOFd44wUJamgl6OlVngsqWjxvermMYf60elWHbxhuRCZml7AnuXCaSA== - dependencies: - "@types/unist" "^2.0.0" - -unist-util-visit-parents@1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-1.1.2.tgz#f6e3afee8bdbf961c0e6f028ea3c0480028c3d06" - integrity sha512-yvo+MMLjEwdc3RhhPYSximset7rwjMrdt9E41Smmvg25UQIenzrN83cRnF1JMzoMi9zZOQeYXHSDf7p+IQkW3Q== - -unist-util-visit-parents@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz#65a6ce698f78a6b0f56aa0e88f13801886cdaef6" - integrity sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg== - dependencies: - "@types/unist" "^2.0.0" - unist-util-is "^4.0.0" - -unist-util-visit-parents@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-5.1.0.tgz#44bbc5d25f2411e7dfc5cecff12de43296aa8521" - integrity sha512-y+QVLcY5eR/YVpqDsLf/xh9R3Q2Y4HxkZTp7ViLDU6WtJCEcPmRzW1gpdWDCDIqIlhuPDXOgttqPlykrHYDekg== - dependencies: - "@types/unist" "^2.0.0" - unist-util-is "^5.0.0" - -unist-util-visit@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-2.0.3.tgz#c3703893146df47203bb8a9795af47d7b971208c" - integrity sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q== - dependencies: - "@types/unist" "^2.0.0" - unist-util-is "^4.0.0" - unist-util-visit-parents "^3.0.0" - -unist-util-visit@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-4.1.0.tgz#f41e407a9e94da31594e6b1c9811c51ab0b3d8f5" - integrity sha512-n7lyhFKJfVZ9MnKtqbsqkQEk5P1KShj0+//V7mAcoI6bpbUjh3C/OG8HVD+pBihfh6Ovl01m8dkcv9HNqYajmQ== - dependencies: - "@types/unist" "^2.0.0" - unist-util-is "^5.0.0" - unist-util-visit-parents "^5.0.0" - -universalify@^0.1.0: - version "0.1.2" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" - integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== - -unpipe@1.0.0, unpipe@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" - integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= - -unquote@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/unquote/-/unquote-1.1.1.tgz#8fded7324ec6e88a0ff8b905e7c098cdc086d544" - integrity sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ= - -update-diff@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/update-diff/-/update-diff-1.1.0.tgz#f510182d81ee819fb82c3a6b22b62bbdeda7808f" - integrity sha1-9RAYLYHugZ+4LDprIrYrve2ngI8= - -upper-case-first@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/upper-case-first/-/upper-case-first-2.0.2.tgz#992c3273f882abd19d1e02894cc147117f844324" - integrity sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg== - dependencies: - tslib "^2.0.3" - -upper-case@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/upper-case/-/upper-case-2.0.2.tgz#d89810823faab1df1549b7d97a76f8662bae6f7a" - integrity sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg== - dependencies: - tslib "^2.0.3" - -uri-js@^4.2.2: - version "4.4.1" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" - integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== - dependencies: - punycode "^2.1.0" - -url-loader@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/url-loader/-/url-loader-4.1.1.tgz#28505e905cae158cf07c92ca622d7f237e70a4e2" - integrity sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA== - dependencies: - loader-utils "^2.0.0" - mime-types "^2.1.27" - schema-utils "^3.0.0" - -url@^0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" - integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE= - dependencies: - punycode "1.3.2" - querystring "0.2.0" - -util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= - -utils-copy-error@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/utils-copy-error/-/utils-copy-error-1.0.1.tgz#791de393c0f09890afd59f3cbea635f079a94fa5" - integrity sha1-eR3jk8DwmJCv1Z88vqY18HmpT6U= - dependencies: - object-keys "^1.0.9" - utils-copy "^1.1.0" - -utils-copy@^1.0.0, utils-copy@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/utils-copy/-/utils-copy-1.1.1.tgz#6e2b97982aa8cd73e1182a3e6f8bec3c0f4058a7" - integrity sha1-biuXmCqozXPhGCo+b4vsPA9AWKc= - dependencies: - const-pinf-float64 "^1.0.0" - object-keys "^1.0.9" - type-name "^2.0.0" - utils-copy-error "^1.0.0" - utils-indexof "^1.0.0" - utils-regex-from-string "^1.0.0" - validate.io-array "^1.0.3" - validate.io-buffer "^1.0.1" - validate.io-nonnegative-integer "^1.0.0" - -utils-indexof@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/utils-indexof/-/utils-indexof-1.0.0.tgz#20feabf09ef1018b523643e8380e7bc83ec61b5c" - integrity sha1-IP6r8J7xAYtSNkPoOA57yD7GG1w= - dependencies: - validate.io-array-like "^1.0.1" - validate.io-integer-primitive "^1.0.0" - -utils-merge@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" - integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= - -utils-regex-from-string@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/utils-regex-from-string/-/utils-regex-from-string-1.0.0.tgz#fe1a2909f8de0ff0d5182c80fbc654d6a687d189" - integrity sha1-/hopCfjeD/DVGCyA+8ZU1qaH0Yk= - dependencies: - regex-regex "^1.0.0" - validate.io-string-primitive "^1.0.0" - -uuid@^8.3.2: - version "8.3.2" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" - integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== - -v8-compile-cache@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" - integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== - -validate.io-array-like@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/validate.io-array-like/-/validate.io-array-like-1.0.2.tgz#7af9f7eb7b51715beb2215668ec5cce54faddb5a" - integrity sha1-evn363tRcVvrIhVmjsXM5U+t21o= - dependencies: - const-max-uint32 "^1.0.2" - validate.io-integer-primitive "^1.0.0" - -validate.io-array@^1.0.3, validate.io-array@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/validate.io-array/-/validate.io-array-1.0.6.tgz#5b5a2cafd8f8b85abb2f886ba153f2d93a27774d" - integrity sha1-W1osr9j4uFq7L4hroVPy2Tond00= - -validate.io-buffer@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/validate.io-buffer/-/validate.io-buffer-1.0.2.tgz#852d6734021914d5d13afc32531761e3720ed44e" - integrity sha1-hS1nNAIZFNXROvwyUxdh43IO1E4= - -validate.io-integer-primitive@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/validate.io-integer-primitive/-/validate.io-integer-primitive-1.0.0.tgz#a9aa010355fe8681c0fea6c1a74ad2419cadddc6" - integrity sha1-qaoBA1X+hoHA/qbBp0rSQZyt3cY= - dependencies: - validate.io-number-primitive "^1.0.0" - -validate.io-integer@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/validate.io-integer/-/validate.io-integer-1.0.5.tgz#168496480b95be2247ec443f2233de4f89878068" - integrity sha1-FoSWSAuVviJH7EQ/IjPeT4mHgGg= - dependencies: - validate.io-number "^1.0.3" - -validate.io-matrix-like@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/validate.io-matrix-like/-/validate.io-matrix-like-1.0.2.tgz#5ec32a75d0889dac736dea68bdd6145b155edfc3" - integrity sha1-XsMqddCInaxzbepovdYUWxVe38M= - -validate.io-ndarray-like@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/validate.io-ndarray-like/-/validate.io-ndarray-like-1.0.0.tgz#d8a3b0ed165bbf1d2fc0d0073270cfa552295919" - integrity sha1-2KOw7RZbvx0vwNAHMnDPpVIpWRk= - -validate.io-nonnegative-integer@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/validate.io-nonnegative-integer/-/validate.io-nonnegative-integer-1.0.0.tgz#8069243a08c5f98e95413c929dfd7b18f3f6f29f" - integrity sha1-gGkkOgjF+Y6VQTySnf17GPP28p8= - dependencies: - validate.io-integer "^1.0.5" - -validate.io-number-primitive@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/validate.io-number-primitive/-/validate.io-number-primitive-1.0.0.tgz#d2e01f202989369dcf1155449564203afe584e55" - integrity sha1-0uAfICmJNp3PEVVElWQgOv5YTlU= - -validate.io-number@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/validate.io-number/-/validate.io-number-1.0.3.tgz#f63ffeda248bf28a67a8d48e0e3b461a1665baf8" - integrity sha1-9j/+2iSL8opnqNSODjtGGhZluvg= - -validate.io-positive-integer@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/validate.io-positive-integer/-/validate.io-positive-integer-1.0.0.tgz#7ed2d03b4c27558cc66a00aab0f0e921814a6582" - integrity sha1-ftLQO0wnVYzGagCqsPDpIYFKZYI= - dependencies: - validate.io-integer "^1.0.5" - -validate.io-string-primitive@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/validate.io-string-primitive/-/validate.io-string-primitive-1.0.1.tgz#b8135b9fb1372bde02fdd53ad1d0ccd6de798fee" - integrity sha1-uBNbn7E3K94C/dU60dDM1t55j+4= - -vary@^1, vary@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" - integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= - -vectorize-text@^3.2.1: - version "3.2.2" - resolved "https://registry.yarnpkg.com/vectorize-text/-/vectorize-text-3.2.2.tgz#3e978889df4ae333975d38669529c942a63e1f65" - integrity sha512-34NVOCpMMQVXujU4vb/c6u98h6djI0jGdtC202H4Huvzn48B6ARsR7cmGh1xsAc0pHNQiUKGK/aHF05VtGv+eA== - dependencies: - cdt2d "^1.0.0" - clean-pslg "^1.1.0" - ndarray "^1.0.11" - planar-graph-to-polyline "^1.0.6" - simplify-planar-graph "^2.0.1" - surface-nets "^1.0.0" - triangulate-polyline "^1.0.0" - -vfile-message@^2.0.0: - version "2.0.4" - resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-2.0.4.tgz#5b43b88171d409eae58477d13f23dd41d52c371a" - integrity sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ== - dependencies: - "@types/unist" "^2.0.0" - unist-util-stringify-position "^2.0.0" - -vfile-message@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-3.0.2.tgz#db7eaebe7fecb853010f2ef1664427f52baf8f74" - integrity sha512-UUjZYIOg9lDRwwiBAuezLIsu9KlXntdxwG+nXnjuQAHvBpcX3x0eN8h+I7TkY5nkCXj+cWVp4ZqebtGBvok8ww== - dependencies: - "@types/unist" "^2.0.0" - unist-util-stringify-position "^3.0.0" - -vfile@^4.0.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/vfile/-/vfile-4.2.1.tgz#03f1dce28fc625c625bc6514350fbdb00fa9e624" - integrity sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA== - dependencies: - "@types/unist" "^2.0.0" - is-buffer "^2.0.0" - unist-util-stringify-position "^2.0.0" - vfile-message "^2.0.0" - -vfile@^5.0.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/vfile/-/vfile-5.2.0.tgz#a32a646ff9251c274dbe8675644a39031025b369" - integrity sha512-ftCpb6pU8Jrzcqku8zE6N3Gi4/RkDhRwEXSWudzZzA2eEOn/cBpsfk9aulCUR+j1raRSAykYQap9u6j6rhUaCA== - dependencies: - "@types/unist" "^2.0.0" - is-buffer "^2.0.0" - unist-util-stringify-position "^3.0.0" - vfile-message "^3.0.0" - -void-elements@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-2.0.1.tgz#c066afb582bb1cb4128d60ea92392e94d5e9dbec" - integrity sha1-wGavtYK7HLQSjWDqkjkulNXp2+w= - -vt-pbf@^3.1.1: - version "3.1.3" - resolved "https://registry.yarnpkg.com/vt-pbf/-/vt-pbf-3.1.3.tgz#68fd150756465e2edae1cc5c048e063916dcfaac" - integrity sha512-2LzDFzt0mZKZ9IpVF2r69G9bXaP2Q2sArJCmcCgvfTdCCZzSyz4aCLoQyUilu37Ll56tCblIZrXFIjNUpGIlmA== - dependencies: - "@mapbox/point-geometry" "0.1.0" - "@mapbox/vector-tile" "^1.3.1" - pbf "^3.2.1" - -watchpack@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.3.0.tgz#a41bca3da6afaff31e92a433f4c856a0c25ea0c4" - integrity sha512-MnN0Q1OsvB/GGHETrFeZPQaOelWh/7O+EiFlj8sM9GPjtQkis7k01aAxrg/18kTfoIVcLL+haEVFlXDaSRwKRw== - dependencies: - glob-to-regexp "^0.4.1" - graceful-fs "^4.1.2" - -wbuf@^1.1.0, wbuf@^1.7.3: - version "1.7.3" - resolved "https://registry.yarnpkg.com/wbuf/-/wbuf-1.7.3.tgz#c1d8d149316d3ea852848895cb6a0bfe887b87df" - integrity sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA== - dependencies: - minimalistic-assert "^1.0.0" - -weak-map@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/weak-map/-/weak-map-1.0.5.tgz#79691584d98607f5070bd3b70a40e6bb22e401eb" - integrity sha1-eWkVhNmGB/UHC9O3CkDmuyLkAes= - -weakmap-shim@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/weakmap-shim/-/weakmap-shim-1.1.1.tgz#d65afd784109b2166e00ff571c33150ec2a40b49" - integrity sha1-1lr9eEEJshZuAP9XHDMVDsKkC0k= - -webgl-context@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/webgl-context/-/webgl-context-2.2.0.tgz#8f37d7257cf6df1cd0a49e6a7b1b721b94cc86a0" - integrity sha1-jzfXJXz23xzQpJ5qextyG5TMhqA= - dependencies: - get-canvas-context "^1.0.1" - -webpack-bundle-analyzer@4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.5.0.tgz#1b0eea2947e73528754a6f9af3e91b2b6e0f79d5" - integrity sha512-GUMZlM3SKwS8Z+CKeIFx7CVoHn3dXFcUAjT/dcZQQmfSZGvitPfMob2ipjai7ovFFqPvTqkEZ/leL4O0YOdAYQ== - dependencies: - acorn "^8.0.4" - acorn-walk "^8.0.0" - chalk "^4.1.0" - commander "^7.2.0" - gzip-size "^6.0.0" - lodash "^4.17.20" - opener "^1.5.2" - sirv "^1.0.7" - ws "^7.3.1" - -webpack-cli@4.9.0: - version "4.9.0" - resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-4.9.0.tgz#dc43e6e0f80dd52e89cbf73d5294bcd7ad6eb343" - integrity sha512-n/jZZBMzVEl4PYIBs+auy2WI0WTQ74EnJDiyD98O2JZY6IVIHJNitkYp/uTXOviIOMfgzrNvC9foKv/8o8KSZw== - dependencies: - "@discoveryjs/json-ext" "^0.5.0" - "@webpack-cli/configtest" "^1.1.0" - "@webpack-cli/info" "^1.4.0" - "@webpack-cli/serve" "^1.6.0" - colorette "^2.0.14" - commander "^7.0.0" - execa "^5.0.0" - fastest-levenshtein "^1.0.12" - import-local "^3.0.2" - interpret "^2.2.0" - rechoir "^0.7.0" - v8-compile-cache "^2.2.0" - webpack-merge "^5.7.3" - -webpack-dev-middleware@^5.2.1: - version "5.2.2" - resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-5.2.2.tgz#eb5193faa5479ca1086b9f7bed68b89c731bff62" - integrity sha512-DjZyYrsHhkikAFNvSNKrpnziXukU1EChFAh9j4LAm6ndPLPW8cN0KhM7T+RAiOqsQ6ABfQ8hoKIs9IWMTjov+w== - dependencies: - colorette "^2.0.10" - memfs "^3.2.2" - mime-types "^2.1.31" - range-parser "^1.2.1" - schema-utils "^4.0.0" - -webpack-dev-server@4.3.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-4.3.1.tgz#759d3337f0fbea297fbd1e433ab04ccfc000076b" - integrity sha512-qNXQCVYo1kYhH9pgLtm8LRNkXX3XzTfHSj/zqzaqYzGPca+Qjr+81wj1jgPMCHhIhso9WEQ+kX9z23iG9PzQ7w== - dependencies: - ansi-html-community "^0.0.8" - bonjour "^3.5.0" - chokidar "^3.5.1" - colorette "^2.0.10" - compression "^1.7.4" - connect-history-api-fallback "^1.6.0" - del "^6.0.0" - express "^4.17.1" - graceful-fs "^4.2.6" - html-entities "^2.3.2" - http-proxy-middleware "^2.0.0" - internal-ip "^6.2.0" - ipaddr.js "^2.0.1" - open "^8.0.9" - p-retry "^4.5.0" - portfinder "^1.0.28" - schema-utils "^3.1.0" - selfsigned "^1.10.11" - serve-index "^1.9.1" - sockjs "^0.3.21" - spdy "^4.0.2" - strip-ansi "^7.0.0" - url "^0.11.0" - webpack-dev-middleware "^5.2.1" - ws "^8.1.0" - -webpack-merge@^4.1.5: - version "4.2.2" - resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-4.2.2.tgz#a27c52ea783d1398afd2087f547d7b9d2f43634d" - integrity sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g== - dependencies: - lodash "^4.17.15" - -webpack-merge@^5.7.3: - version "5.8.0" - resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.8.0.tgz#2b39dbf22af87776ad744c390223731d30a68f61" - integrity sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q== - dependencies: - clone-deep "^4.0.1" - wildcard "^2.0.0" - -webpack-sources@^3.2.0: - version "3.2.2" - resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.2.tgz#d88e3741833efec57c4c789b6010db9977545260" - integrity sha512-cp5qdmHnu5T8wRg2G3vZZHoJPN14aqQ89SyQ11NpGH5zEMDCclt49rzo+MaRazk7/UeILhAI+/sEtcM+7Fr0nw== - -webpack@5.57.1: - version "5.57.1" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.57.1.tgz#ead5ace2c17ecef2ae8126f143bfeaa7f55eab44" - integrity sha512-kHszukYjTPVfCOEyrUthA3jqJwduY/P3eO8I0gMNOZGIQWKAwZftxmp5hq6paophvwo9NoUrcZOecs9ulOyyTg== - dependencies: - "@types/eslint-scope" "^3.7.0" - "@types/estree" "^0.0.50" - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/wasm-edit" "1.11.1" - "@webassemblyjs/wasm-parser" "1.11.1" - acorn "^8.4.1" - acorn-import-assertions "^1.7.6" - browserslist "^4.14.5" - chrome-trace-event "^1.0.2" - enhanced-resolve "^5.8.3" - es-module-lexer "^0.9.0" - eslint-scope "5.1.1" - events "^3.2.0" - glob-to-regexp "^0.4.1" - graceful-fs "^4.2.4" - json-parse-better-errors "^1.0.2" - loader-runner "^4.2.0" - mime-types "^2.1.27" - neo-async "^2.6.2" - schema-utils "^3.1.0" - tapable "^2.1.1" - terser-webpack-plugin "^5.1.3" - watchpack "^2.2.0" - webpack-sources "^3.2.0" - -websocket-driver@>=0.5.1, websocket-driver@^0.7.4: - version "0.7.4" - resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.4.tgz#89ad5295bbf64b480abcba31e4953aca706f5760" - integrity sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg== - dependencies: - http-parser-js ">=0.5.1" - safe-buffer ">=5.1.0" - websocket-extensions ">=0.1.1" - -websocket-extensions@>=0.1.1: - version "0.1.4" - resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz#7f8473bc839dfd87608adb95d7eb075211578a42" - integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg== - -which-boxed-primitive@^1.0.1, which-boxed-primitive@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" - integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== - dependencies: - is-bigint "^1.0.1" - is-boolean-object "^1.1.0" - is-number-object "^1.0.4" - is-string "^1.0.5" - is-symbol "^1.0.3" - -which-collection@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.1.tgz#70eab71ebbbd2aefaf32f917082fc62cdcb70906" - integrity sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A== - dependencies: - is-map "^2.0.1" - is-set "^2.0.1" - is-weakmap "^2.0.1" - is-weakset "^2.0.1" - -which-typed-array@^1.1.2: - version "1.1.7" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.7.tgz#2761799b9a22d4b8660b3c1b40abaa7739691793" - integrity sha512-vjxaB4nfDqwKI0ws7wZpxIlde1XrLX5uB0ZjpfshgmapJMD7jJWhZI+yToJTqaFByF0eNBcYxbjmCzoRP7CfEw== - dependencies: - available-typed-arrays "^1.0.5" - call-bind "^1.0.2" - es-abstract "^1.18.5" - foreach "^2.0.5" - has-tostringtag "^1.0.0" - is-typed-array "^1.1.7" - -which@2.0.2, which@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" - integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== - dependencies: - isexe "^2.0.0" - -which@^1.2.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" - integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== - dependencies: - isexe "^2.0.0" - -wildcard@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.0.tgz#a77d20e5200c6faaac979e4b3aadc7b3dd7f8fec" - integrity sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw== - -word-wrap@~1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" - integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== - -workerpool@6.1.5: - version "6.1.5" - resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.1.5.tgz#0f7cf076b6215fd7e1da903ff6f22ddd1886b581" - integrity sha512-XdKkCK0Zqc6w3iTxLckiuJ81tiD/o5rBE/m+nXpRCB+/Sq4DqkfXZ/x0jW02DG1tGsfUGXbTJyZDP+eu67haSw== - -world-calendars@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/world-calendars/-/world-calendars-1.0.3.tgz#b25c5032ba24128ffc41d09faf4a5ec1b9c14335" - integrity sha1-slxQMrokEo/8QdCfr0pewbnBQzU= - dependencies: - object-assign "^4.1.0" - -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= - -ws@^7.3.1: - version "7.5.6" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.6.tgz#e59fc509fb15ddfb65487ee9765c5a51dec5fe7b" - integrity sha512-6GLgCqo2cy2A2rjCNFlxQS6ZljG/coZfZXclldI8FB/1G3CCI36Zd8xy2HrFVACi8tfk5XrgLQEk+P0Tnz9UcA== - -ws@^8.1.0: - version "8.3.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.3.0.tgz#7185e252c8973a60d57170175ff55fdbd116070d" - integrity sha512-Gs5EZtpqZzLvmIM59w4igITU57lrtYVFneaa434VROv4thzJyV6UjIL3D42lslWlI+D4KzLYnxSwtfuiO79sNw== - -ws@~7.4.2: - version "7.4.6" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c" - integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A== - -"xtend@>=4.0.0 <4.1.0-0", xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" - integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== - -xtend@^2.1.2: - version "2.2.0" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-2.2.0.tgz#eef6b1f198c1c8deafad8b1765a04dad4a01c5a9" - integrity sha1-7vax8ZjByN6vrYsXZaBNrUoBxak= - -y18n@^5.0.5: - version "5.0.8" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" - integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== - -yallist@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" - integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== - -yaml@^1.10.0: - version "1.10.2" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" - integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== - -yargs-parser@20.2.4: - version "20.2.4" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" - integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== - -yargs-parser@^20.2.2: - version "20.2.9" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" - integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== - -yargs-unparser@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb" - integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== - dependencies: - camelcase "^6.0.0" - decamelize "^4.0.0" - flat "^5.0.2" - is-plain-obj "^2.1.0" - -yargs@16.2.0, yargs@^16.1.1: - version "16.2.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" - integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== - dependencies: - cliui "^7.0.2" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.0" - y18n "^5.0.5" - yargs-parser "^20.2.2" - -yocto-queue@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" - integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== - -zero-crossings@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/zero-crossings/-/zero-crossings-1.0.1.tgz#c562bd3113643f3443a245d12406b88b69b9a9ff" - integrity sha1-xWK9MRNkPzRDokXRJAa4i2m5qf8= - dependencies: - cwise-compiler "^1.0.0" - -zwitch@^1.0.0: - version "1.0.5" - resolved "https://registry.yarnpkg.com/zwitch/-/zwitch-1.0.5.tgz#d11d7381ffed16b742f6af7b3f223d5cd9fe9920" - integrity sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw== From 7b9fe54363b0f4c8e3b35b0166dc24499494684a Mon Sep 17 00:00:00 2001 From: Igor Dunaev Date: Fri, 17 Nov 2023 22:17:03 +0300 Subject: [PATCH 02/41] Write Javadocs for ThreePlugin --- .../visionforge/solid/three/ThreePlugin.kt | 49 ++++++++++++++++++- 1 file changed, 47 insertions(+), 2 deletions(-) diff --git a/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/ThreePlugin.kt b/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/ThreePlugin.kt index 7051f887..f5ee8876 100644 --- a/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/ThreePlugin.kt +++ b/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/ThreePlugin.kt @@ -10,12 +10,14 @@ import space.kscience.dataforge.names.* import space.kscience.visionforge.* import space.kscience.visionforge.solid.* import space.kscience.visionforge.solid.specifications.Canvas3DOptions -import space.kscience.visionforge.solid.three.set import three.core.Object3D import kotlin.collections.set import kotlin.reflect.KClass import three.objects.Group as ThreeGroup +/** + * A plugin that handles Three Object3D representation of Visions. + */ public class ThreePlugin : AbstractPlugin(), ElementVisionRenderer { override val tag: PluginTag get() = Companion.tag @@ -48,6 +50,13 @@ public class ThreePlugin : AbstractPlugin(), ElementVisionRenderer { as ThreeFactory? } + /** + * Build an Object3D representation of the given [Solid]. + * + * @param vision 3D vision to build a representation of; + * @param observe whether the constructed Object3D should be changed when its + * parent vision changes. + */ public suspend fun buildObject3D(vision: Solid, observe: Boolean = true): Object3D = when (vision) { is ThreeJsVision -> vision.render(this) is SolidReference -> ThreeReferenceFactory.build(this, vision, observe) @@ -125,6 +134,16 @@ public class ThreePlugin : AbstractPlugin(), ElementVisionRenderer { private val canvasCache = HashMap() + /** + * Return a [ThreeCanvas] object attached to the given [Element]. + * If there is no canvas bound, a new canvas object is created + * and returned. + * + * @param element HTML element to which the canvas is + * (or should be if it is created by this call) attached; + * @param options canvas options that are applied to a newly + * created [ThreeCanvas] in case it does not exist. + */ public fun getOrCreateCanvas( element: Element, options: Canvas3DOptions, @@ -142,6 +161,19 @@ public class ThreePlugin : AbstractPlugin(), ElementVisionRenderer { override fun rateVision(vision: Vision): Int = if (vision is Solid) ElementVisionRenderer.DEFAULT_RATING else ElementVisionRenderer.ZERO_RATING + /** + * Render the given [Solid] Vision in a [ThreeCanvas] attached + * to the [element]. Canvas objects are cached, so subsequent calls + * with the same [element] value do not create new canvas objects, + * but they replace existing content, so multiple Visions cannot be + * displayed in a single [ThreeCanvas]. + * + * @param element HTML element [ThreeCanvas] should be + * attached to; + * @param vision Vision to render; + * @param options options that are applied to a canvas + * in case it is not in the cache and should be created. + */ internal fun renderSolid( element: Element, vision: Solid, @@ -165,6 +197,19 @@ public class ThreePlugin : AbstractPlugin(), ElementVisionRenderer { } } +/** + * Render the given [Solid] Vision in a [ThreeCanvas] attached + * to the [element]. Canvas objects are cached, so subsequent calls + * with the same [element] value do not create new canvas objects, + * but they replace existing content, so multiple Visions cannot be + * displayed in a single [ThreeCanvas]. + * + * @param element HTML element [ThreeCanvas] should be + * attached to; + * @param obj Vision to render; + * @param optionsBuilder option builder that is applied to a canvas + * in case it is not in the cache and should be created. + */ public fun ThreePlugin.render( element: HTMLElement, obj: Solid, @@ -207,4 +252,4 @@ internal fun Object3D.findChild(name: Name): Object3D? { name.length == 1 -> this.children.find { it.name == name.tokens.first().toString() } else -> findChild(name.tokens.first().asName())?.findChild(name.cutFirst()) } -} \ No newline at end of file +} From 71f7f59cb3e1d7911f51fa851b916a0f5317d8b2 Mon Sep 17 00:00:00 2001 From: Igor Dunaev Date: Mon, 20 Nov 2023 17:29:53 +0300 Subject: [PATCH 03/41] More docs for ThreePlugin and VisionContainer --- .../kscience/visionforge/VisionContainer.kt | 17 +++++++++++++++++ .../visionforge/solid/three/ThreePlugin.kt | 6 +++--- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionContainer.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionContainer.kt index c74f027d..09edf4c1 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionContainer.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionContainer.kt @@ -10,10 +10,17 @@ import space.kscience.visionforge.VisionChildren.Companion.STATIC_TOKEN_BODY @DslMarker public annotation class VisionBuilder +/** + * A container interface with read access to its content + * using DataForge [Name] objects as keys. + */ public interface VisionContainer { public fun getChild(name: Name): V? } +/** + * A container interface with write/replace/delete access to its content. + */ public interface MutableVisionContainer { //TODO add documentation public fun setChild(name: Name?, child: V?) @@ -61,12 +68,22 @@ public inline fun VisionChildren.forEach(block: (NameToken, Vision) -> Unit) { keys.forEach { block(it, get(it)!!) } } +/** + * A serializable representation of [Vision] children container + * with the ability to modify the container content. + */ public interface MutableVisionChildren : VisionChildren, MutableVisionContainer { public override val parent: MutableVisionGroup public operator fun set(token: NameToken, value: Vision?) + /** + * Set child [Vision] by name. + * @param name child name. Pass null to add a static child. Note that static children cannot + * be removed, replaced or accessed by name by other means. + * @param child new child value. Pass null to delete the child. + */ override fun setChild(name: Name?, child: Vision?) { when { name == null -> { diff --git a/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/ThreePlugin.kt b/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/ThreePlugin.kt index f5ee8876..bb5e0c79 100644 --- a/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/ThreePlugin.kt +++ b/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/ThreePlugin.kt @@ -53,9 +53,9 @@ public class ThreePlugin : AbstractPlugin(), ElementVisionRenderer { /** * Build an Object3D representation of the given [Solid]. * - * @param vision 3D vision to build a representation of; - * @param observe whether the constructed Object3D should be changed when its - * parent vision changes. + * @param vision [Solid] object to build a representation of; + * @param observe whether the constructed Object3D should be changed when the + * original [Vision] changes. */ public suspend fun buildObject3D(vision: Solid, observe: Boolean = true): Object3D = when (vision) { is ThreeJsVision -> vision.render(this) From 80284a99ef7b7e4c79aa510e27f6a03b03a20225 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Fri, 24 Nov 2023 10:02:25 +0300 Subject: [PATCH 04/41] Add click handlers --- .../kscience/visionforge/ControlVision.kt | 52 +++++++++++++++++++ .../space/kscience/visionforge/Vision.kt | 15 ++---- .../space/kscience/visionforge/VisionEvent.kt | 14 +---- .../space/kscience/visionforge/VisionGroup.kt | 8 +-- .../visionforge/solid/VisionUpdateTest.kt | 2 +- 5 files changed, 63 insertions(+), 28 deletions(-) create mode 100644 visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/ControlVision.kt diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/ControlVision.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/ControlVision.kt new file mode 100644 index 00000000..38ee4d7f --- /dev/null +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/ControlVision.kt @@ -0,0 +1,52 @@ +package space.kscience.visionforge + +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Job +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.filterIsInstance +import kotlinx.coroutines.flow.launchIn +import kotlinx.coroutines.flow.onEach +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +import space.kscience.dataforge.meta.Meta +import space.kscience.dataforge.meta.MetaRepr +import space.kscience.dataforge.meta.MutableMeta + +@Serializable +@SerialName("control") +public abstract class VisionControlEvent : VisionEvent, MetaRepr { + public abstract val meta: Meta + + override fun toMeta(): Meta = meta +} + +public interface ControlVision : Vision { + public val controlEventFlow: Flow + + public fun dispatchControlEvent(event: VisionControlEvent) + + override fun receiveEvent(event: VisionEvent) { + if (event is VisionControlEvent) { + dispatchControlEvent(event) + } else super.receiveEvent(event) + } +} + +@Serializable +@SerialName("control.click") +public class VisionClickEvent(override val meta: Meta) : VisionControlEvent() + + +public interface ClickControl : ControlVision { + public fun click(builder: MutableMeta.() -> Unit = {}) { + dispatchControlEvent(VisionClickEvent(Meta(builder))) + } + + public fun onClick(scope: CoroutineScope, block: suspend VisionClickEvent.() -> Unit): Job { + return controlEventFlow.filterIsInstance().onEach(block).launchIn(scope) + } + + public companion object { + + } +} \ No newline at end of file diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/Vision.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/Vision.kt index b4e6cba7..29965944 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/Vision.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/Vision.kt @@ -4,7 +4,8 @@ import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Job import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach -import space.kscience.dataforge.meta.Meta +import space.kscience.dataforge.context.logger +import space.kscience.dataforge.context.warn import space.kscience.dataforge.meta.asValue import space.kscience.dataforge.meta.boolean import space.kscience.dataforge.meta.descriptors.Described @@ -37,7 +38,7 @@ public interface Vision : Described { /** * Update this vision using a dif represented by [VisionChange]. */ - public fun receiveChange(change: VisionChange) { + public fun update(change: VisionChange) { if (change.children?.isNotEmpty() == true) { error("Vision is not a group") } @@ -46,18 +47,12 @@ public interface Vision : Described { } } - public fun onMetaEvent(meta: Meta){ - //Do nothing by default - } - /** * Receive and process a generic [VisionEvent]. */ public fun receiveEvent(event: VisionEvent) { - when (event) { - is VisionChange -> receiveChange(event) - is VisionMetaEvent -> onMetaEvent(event.meta) - } + if(event is VisionChange) update(event) + else manager?.logger?.warn { "Undispatched event: $event" } } override val descriptor: MetaDescriptor? diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionEvent.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionEvent.kt index 84d36217..de0b2643 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionEvent.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionEvent.kt @@ -3,8 +3,6 @@ package space.kscience.visionforge import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable import space.kscience.dataforge.meta.Meta -import space.kscience.dataforge.meta.MutableMeta -import space.kscience.dataforge.meta.set import space.kscience.dataforge.names.Name /** @@ -22,14 +20,4 @@ public sealed interface VisionEvent { */ @Serializable @SerialName("meta") -public class VisionMetaEvent(public val meta: Meta) : VisionEvent - - -public val Vision.Companion.CLICK_EVENT_KEY: Name get() = Name.of("events", "click", "payload") - -/** - * Set the payload to be sent to server on click - */ -public fun Vision.onClickPayload(payloadBuilder: MutableMeta.() -> Unit) { - properties[VisionEvent.CLICK_EVENT_KEY] = Meta(payloadBuilder) -} \ No newline at end of file +public class VisionMetaEvent(public val meta: Meta) : VisionEvent \ No newline at end of file diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionGroup.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionGroup.kt index 1edfa40a..fd8aaa16 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionGroup.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionGroup.kt @@ -17,12 +17,12 @@ import space.kscience.visionforge.Vision.Companion.STYLE_KEY public interface VisionGroup : Vision { public val children: VisionChildren - override fun receiveChange(change: VisionChange) { + override fun update(change: VisionChange) { change.children?.forEach { (name, change) -> if (change.vision != null || change.vision == NullVision) { error("VisionGroup is read-only") } else { - children.getChild(name)?.receiveChange(change) + children.getChild(name)?.update(change) } } change.properties?.let { @@ -37,12 +37,12 @@ public interface MutableVisionGroup : VisionGroup { public fun createGroup(): MutableVisionGroup - override fun receiveChange(change: VisionChange) { + override fun update(change: VisionChange) { change.children?.forEach { (name, change) -> when { change.vision == NullVision -> children.setChild(name, null) change.vision != null -> children.setChild(name, change.vision) - else -> children.getChild(name)?.receiveChange(change) + else -> children.getChild(name)?.update(change) } } change.properties?.let { diff --git a/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/VisionUpdateTest.kt b/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/VisionUpdateTest.kt index 898fae11..0e495aaa 100644 --- a/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/VisionUpdateTest.kt +++ b/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/VisionUpdateTest.kt @@ -28,7 +28,7 @@ internal class VisionUpdateTest { propertyChanged("top".asName(), SolidMaterial.MATERIAL_COLOR_KEY, Meta("red".asValue())) propertyChanged("origin".asName(), SolidMaterial.MATERIAL_COLOR_KEY, Meta("red".asValue())) } - targetVision.receiveChange(dif) + targetVision.update(dif) assertTrue { targetVision.children.getChild("top") is SolidGroup } assertEquals("red", (targetVision.children.getChild("origin") as Solid).color.string) // Should work assertEquals( From 469655092e8c7f871dfb610f1c34555d82da0d81 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Wed, 29 Nov 2023 09:41:22 +0300 Subject: [PATCH 05/41] Change controls API --- demo/playground/notebooks/common-demo.ipynb | 9 +- demo/playground/notebooks/controls.ipynb | 45 ++++++ demo/playground/notebooks/dynamic-demo.ipynb | 7 +- .../src/jvmMain/kotlin/formServer.kt | 2 +- .../kscience/visionforge/ControlVision.kt | 29 ++-- .../kscience/visionforge/html/VisionOfHtml.kt | 54 ++++++++ .../visionforge/html/VisionOfHtmlForm.kt | 7 +- .../visionforge/html/VisionOfHtmlInput.kt | 58 -------- .../kscience/visionforge/JsVisionClient.kt | 6 +- .../kscience/visionforge/inputRenderers.kt | 130 +++++++++--------- .../jvmMain/kotlin/VisionForgeIntegration.kt | 2 - .../kotlin/JupyterCommonIntegration.kt | 7 +- 12 files changed, 200 insertions(+), 156 deletions(-) create mode 100644 demo/playground/notebooks/controls.ipynb create mode 100644 visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionOfHtml.kt delete mode 100644 visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionOfHtmlInput.kt diff --git a/demo/playground/notebooks/common-demo.ipynb b/demo/playground/notebooks/common-demo.ipynb index 78797545..caa7306f 100644 --- a/demo/playground/notebooks/common-demo.ipynb +++ b/demo/playground/notebooks/common-demo.ipynb @@ -54,9 +54,6 @@ "cell_type": "code", "execution_count": null, "metadata": { - "jupyter": { - "outputs_hidden": false - }, "tags": [] }, "outputs": [], @@ -83,9 +80,6 @@ "language": "kotlin", "name": "kotlin" }, - "ktnbPluginMetadata": { - "isAddProjectLibrariesToClasspath": false - }, "language_info": { "codemirror_mode": "text/x-kotlin", "file_extension": ".kt", @@ -94,6 +88,9 @@ "nbconvert_exporter": "", "pygments_lexer": "kotlin", "version": "1.8.20" + }, + "ktnbPluginMetadata": { + "projectLibraries": [] } }, "nbformat": 4, diff --git a/demo/playground/notebooks/controls.ipynb b/demo/playground/notebooks/controls.ipynb new file mode 100644 index 00000000..8552a178 --- /dev/null +++ b/demo/playground/notebooks/controls.ipynb @@ -0,0 +1,45 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "USE(JupyterCommonIntegration())" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "outputs": [], + "source": [], + "metadata": { + "collapsed": false + } + } + ], + "metadata": { + "kernelspec": { + "display_name": "Kotlin", + "language": "kotlin", + "name": "kotlin" + }, + "language_info": { + "name": "kotlin", + "version": "1.9.0", + "mimetype": "text/x-kotlin", + "file_extension": ".kt", + "pygments_lexer": "kotlin", + "codemirror_mode": "text/x-kotlin", + "nbconvert_exporter": "" + }, + "ktnbPluginMetadata": { + "projectDependencies": true + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/demo/playground/notebooks/dynamic-demo.ipynb b/demo/playground/notebooks/dynamic-demo.ipynb index ac70b4c2..3fcd31e3 100644 --- a/demo/playground/notebooks/dynamic-demo.ipynb +++ b/demo/playground/notebooks/dynamic-demo.ipynb @@ -25,10 +25,7 @@ "cell_type": "code", "execution_count": null, "metadata": { - "collapsed": false, - "jupyter": { - "outputs_hidden": false - } + "collapsed": false }, "outputs": [], "source": [ @@ -84,7 +81,7 @@ "version": "1.8.0-dev-3517" }, "ktnbPluginMetadata": { - "isAddProjectLibrariesToClasspath": false + "projectLibraries": [] } }, "nbformat": 4, diff --git a/demo/playground/src/jvmMain/kotlin/formServer.kt b/demo/playground/src/jvmMain/kotlin/formServer.kt index d832d85a..21d2d4a7 100644 --- a/demo/playground/src/jvmMain/kotlin/formServer.kt +++ b/demo/playground/src/jvmMain/kotlin/formServer.kt @@ -75,7 +75,7 @@ fun main() { server.openInBrowser() - while (readln() != "exit") { + while (readlnOrNull() != "exit") { } diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/ControlVision.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/ControlVision.kt index 38ee4d7f..e0d44930 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/ControlVision.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/ControlVision.kt @@ -2,7 +2,7 @@ package space.kscience.visionforge import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Job -import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.SharedFlow import kotlinx.coroutines.flow.filterIsInstance import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach @@ -21,7 +21,7 @@ public abstract class VisionControlEvent : VisionEvent, MetaRepr { } public interface ControlVision : Vision { - public val controlEventFlow: Flow + public val controlEventFlow: SharedFlow public fun dispatchControlEvent(event: VisionControlEvent) @@ -32,21 +32,32 @@ public interface ControlVision : Vision { } } +/** + * @param payload The optional payload associated with the click event. + */ @Serializable @SerialName("control.click") -public class VisionClickEvent(override val meta: Meta) : VisionControlEvent() +public class VisionClickEvent(public val payload: Meta = Meta.EMPTY) : VisionControlEvent() { + override val meta: Meta get() = Meta { ::payload.name put payload } +} public interface ClickControl : ControlVision { + /** + * Create and dispatch a click event + */ public fun click(builder: MutableMeta.() -> Unit = {}) { dispatchControlEvent(VisionClickEvent(Meta(builder))) } +} - public fun onClick(scope: CoroutineScope, block: suspend VisionClickEvent.() -> Unit): Job { - return controlEventFlow.filterIsInstance().onEach(block).launchIn(scope) - } +/** + * Register listener + */ +public fun ClickControl.onClick(scope: CoroutineScope, block: suspend VisionClickEvent.() -> Unit): Job = + controlEventFlow.filterIsInstance().onEach(block).launchIn(scope) - public companion object { - } -} \ No newline at end of file +@Serializable +@SerialName("control.valueChange") +public class VisionValueChangeEvent(override val meta: Meta) : VisionControlEvent() \ No newline at end of file diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionOfHtml.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionOfHtml.kt new file mode 100644 index 00000000..d9f09ec1 --- /dev/null +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionOfHtml.kt @@ -0,0 +1,54 @@ +package space.kscience.visionforge.html + +import kotlinx.html.InputType +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +import space.kscience.dataforge.meta.* +import space.kscience.dataforge.names.asName +import space.kscience.visionforge.AbstractVision + + +@Serializable +public abstract class VisionOfHtml: AbstractVision(){ + public var classes: List by properties.stringList(*emptyArray()) +} + +@Serializable +@SerialName("html.input") +public open class VisionOfHtmlInput( + public val inputType: String, +) : VisionOfHtml() { + public var value : Value? by properties.value() + public var disabled: Boolean by properties.boolean { false } + public var fieldName: String? by properties.string() +} + + +@Serializable +@SerialName("html.text") +public class VisionOfTextField : VisionOfHtmlInput(InputType.text.realValue) { + public var text: String? by properties.string(key = VisionOfHtmlInput::value.name.asName()) +} + +@Serializable +@SerialName("html.checkbox") +public class VisionOfCheckbox : VisionOfHtmlInput(InputType.checkBox.realValue) { + public var checked: Boolean? by properties.boolean(key = VisionOfHtmlInput::value.name.asName()) +} + +@Serializable +@SerialName("html.number") +public class VisionOfNumberField : VisionOfHtmlInput(InputType.number.realValue) { + public var number: Number? by properties.number(key = VisionOfHtmlInput::value.name.asName()) +} + +@Serializable +@SerialName("html.range") +public class VisionOfRangeField( + public val min: Double, + public val max: Double, + public val step: Double = 1.0, +) : VisionOfHtmlInput(InputType.range.realValue) { + public var number: Number? by properties.number(key = VisionOfHtmlInput::value.name.asName()) +} + diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionOfHtmlForm.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionOfHtmlForm.kt index d9c0347d..e56af874 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionOfHtmlForm.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionOfHtmlForm.kt @@ -9,12 +9,15 @@ import kotlinx.serialization.Serializable import space.kscience.dataforge.meta.Meta import space.kscience.dataforge.meta.node +/** + * @param formId an id of the element in rendered DOM, this form is bound to + */ @Serializable @SerialName("html.form") public class VisionOfHtmlForm( public val formId: String, -) : VisionOfHtmlInput() { - public var values: Meta? by mutableProperties.node() +) : VisionOfHtml() { + public var values: Meta? by properties.node() } public fun TagConsumer.bindForm( diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionOfHtmlInput.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionOfHtmlInput.kt deleted file mode 100644 index d2bb2c52..00000000 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionOfHtmlInput.kt +++ /dev/null @@ -1,58 +0,0 @@ -package space.kscience.visionforge.html - -import kotlinx.serialization.SerialName -import kotlinx.serialization.Serializable -import space.kscience.dataforge.meta.boolean -import space.kscience.dataforge.meta.number -import space.kscience.dataforge.meta.string -import space.kscience.dataforge.names.Name -import space.kscience.visionforge.AbstractVision -import space.kscience.visionforge.Vision - -//TODO replace by something -internal val Vision.mutableProperties get() = properties.getMeta(Name.EMPTY, false, false) - -@Serializable -public abstract class VisionOfHtmlInput : AbstractVision() { - public var disabled: Boolean by mutableProperties.boolean { false } -} - -@Serializable -@SerialName("html.text") -public class VisionOfTextField( - public val label: String? = null, - public val name: String? = null, -) : VisionOfHtmlInput() { - public var text: String? by mutableProperties.string() -} - -@Serializable -@SerialName("html.checkbox") -public class VisionOfCheckbox( - public val label: String? = null, - public val name: String? = null, -) : VisionOfHtmlInput() { - public var checked: Boolean? by mutableProperties.boolean() -} - -@Serializable -@SerialName("html.number") -public class VisionOfNumberField( - public val label: String? = null, - public val name: String? = null, -) : VisionOfHtmlInput() { - public var value: Number? by mutableProperties.number() -} - -@Serializable -@SerialName("html.range") -public class VisionOfRangeField( - public val min: Double, - public val max: Double, - public val step: Double = 1.0, - public val label: String? = null, - public val name: String? = null, -) : VisionOfHtmlInput() { - public var value: Number? by mutableProperties.number() -} - diff --git a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/JsVisionClient.kt b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/JsVisionClient.kt index b9e0ef93..d164e5ea 100644 --- a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/JsVisionClient.kt +++ b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/JsVisionClient.kt @@ -252,9 +252,9 @@ public class JsVisionClient : AbstractPlugin(), VisionClient { override fun content(target: String): Map = if (target == ElementVisionRenderer.TYPE) { listOf( - numberVisionRenderer(this), - textVisionRenderer(this), - formVisionRenderer(this) + numberVisionRenderer(), + textVisionRenderer(), + formVisionRenderer() ).associateByName() } else super.content(target) diff --git a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/inputRenderers.kt b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/inputRenderers.kt index ff84c403..8b07e177 100644 --- a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/inputRenderers.kt +++ b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/inputRenderers.kt @@ -3,66 +3,63 @@ package space.kscience.visionforge import kotlinx.browser.document import kotlinx.html.InputType import kotlinx.html.js.input -import kotlinx.html.js.label import kotlinx.html.js.onChangeFunction +import org.w3c.dom.HTMLElement import org.w3c.dom.HTMLFormElement import org.w3c.dom.HTMLInputElement import org.w3c.dom.get import org.w3c.xhr.FormData import space.kscience.dataforge.context.debug import space.kscience.dataforge.context.logger -import space.kscience.dataforge.meta.DynamicMeta -import space.kscience.dataforge.meta.Meta -import space.kscience.dataforge.meta.toMap -import space.kscience.dataforge.meta.valueSequence -import space.kscience.visionforge.html.VisionOfHtmlForm -import space.kscience.visionforge.html.VisionOfNumberField -import space.kscience.visionforge.html.VisionOfTextField +import space.kscience.dataforge.meta.* +import space.kscience.visionforge.html.* -internal fun textVisionRenderer( - client: JsVisionClient, -): ElementVisionRenderer = ElementVisionRenderer { name, vision, _ -> - val fieldName = vision.name ?: "input[${vision.hashCode().toUInt()}]" - vision.label?.let { - label { - htmlFor = fieldName - +it - } - } - input { - type = InputType.text - this.name = fieldName - vision.useProperty(VisionOfTextField::text) { - value = it ?: "" - } - onChangeFunction = { - client.notifyPropertyChanged(name, VisionOfTextField::text.name, value) - } + +private fun HTMLElement.subscribeToVision(vision: VisionOfHtml) { + vision.useProperty(VisionOfHtml::classes) { + classList.value = classes.joinToString(separator = " ") } } -internal fun numberVisionRenderer( - client: JsVisionClient, -): ElementVisionRenderer = ElementVisionRenderer { name, vision, _ -> - val fieldName = vision.name ?: "input[${vision.hashCode().toUInt()}]" - vision.label?.let { - label { - htmlFor = fieldName - +it - } - } - input { - type = InputType.text - this.name = fieldName - vision.useProperty(VisionOfNumberField::value) { - value = it?.toDouble() ?: 0.0 - } - onChangeFunction = { - client.notifyPropertyChanged(name, VisionOfNumberField::value.name, value) - } + +private fun HTMLInputElement.subscribeToInput(inputVision: VisionOfHtmlInput) { + subscribeToVision(inputVision) + inputVision.useProperty(VisionOfHtmlInput::disabled) { + disabled = it } } + +internal fun JsVisionClient.textVisionRenderer(): ElementVisionRenderer = + ElementVisionRenderer { visionName, vision, _ -> + input { + type = InputType.text + onChangeFunction = { + notifyPropertyChanged(visionName, VisionOfTextField::text.name, value) + } + }.apply { + subscribeToInput(vision) + vision.useProperty(VisionOfTextField::text) { + value = (it ?: "").asValue() + } + } + } + +internal fun JsVisionClient.numberVisionRenderer(): ElementVisionRenderer = + ElementVisionRenderer { visionName, vision, _ -> + input { + type = InputType.text + onChangeFunction = { + notifyPropertyChanged(visionName, VisionOfNumberField::value.name, value) + } + }.apply { + subscribeToInput(vision) + vision.useProperty(VisionOfNumberField::value) { + value = (it?.double ?: 0.0).asValue() + } + } + } + internal fun FormData.toMeta(): Meta { @Suppress("UNUSED_VARIABLE") val formData = this //val res = js("Object.fromEntries(formData);") @@ -86,28 +83,29 @@ internal fun FormData.toMeta(): Meta { return DynamicMeta(`object`) } -internal fun formVisionRenderer( - client: JsVisionClient, -): ElementVisionRenderer = ElementVisionRenderer { name, vision, _ -> +internal fun JsVisionClient.formVisionRenderer(): ElementVisionRenderer = + ElementVisionRenderer { visionName, vision, _ -> - val form = document.getElementById(vision.formId) as? HTMLFormElement - ?: error("An element with id = '${vision.formId} is not a form") + val form = document.getElementById(vision.formId) as? HTMLFormElement + ?: error("An element with id = '${vision.formId} is not a form") - client.logger.debug{"Adding hooks to form with id = '$vision.formId'"} + form.subscribeToVision(vision) - vision.useProperty(VisionOfHtmlForm::values) { values -> - client.logger.debug{"Updating form '${vision.formId}' with values $values"} - val inputs = form.getElementsByTagName("input") - values?.valueSequence()?.forEach { (token, value) -> - (inputs[token.toString()] as? HTMLInputElement)?.value = value.toString() + logger.debug { "Adding hooks to form with id = '$vision.formId'" } + + vision.useProperty(VisionOfHtmlForm::values) { values -> + logger.debug { "Updating form '${vision.formId}' with values $values" } + val inputs = form.getElementsByTagName("input") + values?.valueSequence()?.forEach { (token, value) -> + (inputs[token.toString()] as? HTMLInputElement)?.value = value.toString() + } } - } - form.onsubmit = { event -> - event.preventDefault() - val formData = FormData(form).toMeta() - client.notifyPropertyChanged(name, VisionOfHtmlForm::values.name, formData) - console.info("Sent: ${formData.toMap()}") - false - } -} \ No newline at end of file + form.onsubmit = { event -> + event.preventDefault() + val formData = FormData(form).toMeta() + notifyPropertyChanged(visionName, VisionOfHtmlForm::values.name, formData) + console.info("Sent: ${formData.toMap()}") + false + } + } \ No newline at end of file diff --git a/visionforge-jupyter/src/jvmMain/kotlin/VisionForgeIntegration.kt b/visionforge-jupyter/src/jvmMain/kotlin/VisionForgeIntegration.kt index afc2ecc2..935f183c 100644 --- a/visionforge-jupyter/src/jvmMain/kotlin/VisionForgeIntegration.kt +++ b/visionforge-jupyter/src/jvmMain/kotlin/VisionForgeIntegration.kt @@ -7,7 +7,6 @@ import org.jetbrains.kotlinx.jupyter.api.declare import org.jetbrains.kotlinx.jupyter.api.libraries.JupyterIntegration import space.kscience.dataforge.context.Context import space.kscience.dataforge.context.ContextAware -import space.kscience.dataforge.misc.DFExperimental import space.kscience.visionforge.Vision import space.kscience.visionforge.VisionManager import space.kscience.visionforge.html.* @@ -17,7 +16,6 @@ import kotlin.random.nextUInt /** * A base class for different Jupyter VF integrations */ -@DFExperimental public abstract class VisionForgeIntegration( public val visionManager: VisionManager, ) : JupyterIntegration(), ContextAware { diff --git a/visionforge-jupyter/visionforge-jupyter-common/src/jvmMain/kotlin/JupyterCommonIntegration.kt b/visionforge-jupyter/visionforge-jupyter-common/src/jvmMain/kotlin/JupyterCommonIntegration.kt index 6200bd5d..2f7988f8 100644 --- a/visionforge-jupyter/visionforge-jupyter-common/src/jvmMain/kotlin/JupyterCommonIntegration.kt +++ b/visionforge-jupyter/visionforge-jupyter-common/src/jvmMain/kotlin/JupyterCommonIntegration.kt @@ -1,14 +1,14 @@ package space.kscience.visionforge.jupyter -import kotlinx.html.* +import kotlinx.html.div +import kotlinx.html.p import org.jetbrains.kotlinx.jupyter.api.libraries.resources import space.kscience.dataforge.context.Context -import space.kscience.dataforge.misc.DFExperimental import space.kscience.gdml.Gdml import space.kscience.plotly.Plot import space.kscience.plotly.PlotlyPage import space.kscience.plotly.StaticPlotlyRenderer -import space.kscience.tables.* +import space.kscience.tables.Table import space.kscience.visionforge.gdml.toVision import space.kscience.visionforge.html.HtmlFragment import space.kscience.visionforge.html.VisionPage @@ -21,7 +21,6 @@ import space.kscience.visionforge.tables.toVision import space.kscience.visionforge.visionManager -@DFExperimental public class JupyterCommonIntegration : VisionForgeIntegration(CONTEXT.visionManager) { override fun Builder.afterLoaded(vf: VisionForge) { From 7561ddad364527cfc1ccfc63aa43781c5949c599 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Sat, 2 Dec 2023 23:01:15 +0300 Subject: [PATCH 06/41] Fix html input renderers --- .../kscience/visionforge/VisionClient.kt | 34 ++--- .../kscience/visionforge/VisionManager.kt | 7 +- .../kscience/visionforge/html/VisionOfHtml.kt | 35 ++++- .../space/kscience/visionforge/useProperty.kt | 17 ++- .../visionforge/ElementVisionRenderer.kt | 2 +- .../kscience/visionforge/JsVisionClient.kt | 79 ++++++---- .../kscience/visionforge/inputRenderers.kt | 139 +++++++++++++++--- 7 files changed, 234 insertions(+), 79 deletions(-) diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionClient.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionClient.kt index 76d8aa80..9d6a5561 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionClient.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionClient.kt @@ -2,10 +2,8 @@ package space.kscience.visionforge import kotlinx.coroutines.launch import space.kscience.dataforge.context.Plugin -import space.kscience.dataforge.meta.Meta import space.kscience.dataforge.meta.MetaRepr import space.kscience.dataforge.names.Name -import space.kscience.dataforge.names.parseAsName /** * A feedback client that communicates with a server and provides ability to propagate events and changes back to the model @@ -15,25 +13,25 @@ public interface VisionClient: Plugin { public suspend fun sendEvent(targetName: Name, event: VisionEvent) - public fun notifyPropertyChanged(visionName: Name, propertyName: Name, item: Meta?) +// public fun notifyPropertyChanged(visionName: Name, propertyName: Name, item: Meta?) } -public fun VisionClient.notifyPropertyChanged(visionName: Name, propertyName: String, item: Meta?) { - notifyPropertyChanged(visionName, propertyName.parseAsName(true), item) -} - -public fun VisionClient.notifyPropertyChanged(visionName: Name, propertyName: String, item: Number) { - notifyPropertyChanged(visionName, propertyName.parseAsName(true), Meta(item)) -} - -public fun VisionClient.notifyPropertyChanged(visionName: Name, propertyName: String, item: String) { - notifyPropertyChanged(visionName, propertyName.parseAsName(true), Meta(item)) -} - -public fun VisionClient.notifyPropertyChanged(visionName: Name, propertyName: String, item: Boolean) { - notifyPropertyChanged(visionName, propertyName.parseAsName(true), Meta(item)) -} +//public fun VisionClient.notifyPropertyChanged(visionName: Name, propertyName: String, item: Meta?) { +// notifyPropertyChanged(visionName, propertyName.parseAsName(true), item) +//} +// +//public fun VisionClient.notifyPropertyChanged(visionName: Name, propertyName: String, item: Number) { +// notifyPropertyChanged(visionName, propertyName.parseAsName(true), Meta(item)) +//} +// +//public fun VisionClient.notifyPropertyChanged(visionName: Name, propertyName: String, item: String) { +// notifyPropertyChanged(visionName, propertyName.parseAsName(true), Meta(item)) +//} +// +//public fun VisionClient.notifyPropertyChanged(visionName: Name, propertyName: String, item: Boolean) { +// notifyPropertyChanged(visionName, propertyName.parseAsName(true), Meta(item)) +//} public fun VisionClient.sendEvent(targetName: Name, payload: MetaRepr): Unit { context.launch { diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionManager.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionManager.kt index e4ca1cdb..8799a73f 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionManager.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionManager.kt @@ -13,10 +13,7 @@ import space.kscience.dataforge.meta.descriptors.MetaDescriptor import space.kscience.dataforge.meta.toJson import space.kscience.dataforge.meta.toMeta import space.kscience.dataforge.names.Name -import space.kscience.visionforge.html.VisionOfCheckbox -import space.kscience.visionforge.html.VisionOfHtmlForm -import space.kscience.visionforge.html.VisionOfNumberField -import space.kscience.visionforge.html.VisionOfTextField +import space.kscience.visionforge.html.* public class VisionManager(meta: Meta) : AbstractPlugin(meta), MutableVisionContainer { override val tag: PluginTag get() = Companion.tag @@ -72,9 +69,11 @@ public class VisionManager(meta: Meta) : AbstractPlugin(meta), MutableVisionCont defaultDeserializer { SimpleVisionGroup.serializer() } subclass(NullVision.serializer()) subclass(SimpleVisionGroup.serializer()) + subclass(VisionOfHtmlInput.serializer()) subclass(VisionOfNumberField.serializer()) subclass(VisionOfTextField.serializer()) subclass(VisionOfCheckbox.serializer()) + subclass(VisionOfRangeField.serializer()) subclass(VisionOfHtmlForm.serializer()) } } diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionOfHtml.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionOfHtml.kt index d9f09ec1..51458047 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionOfHtml.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionOfHtml.kt @@ -1,6 +1,8 @@ package space.kscience.visionforge.html import kotlinx.html.InputType +import kotlinx.html.TagConsumer +import kotlinx.html.stream.createHTML import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable import space.kscience.dataforge.meta.* @@ -9,16 +11,45 @@ import space.kscience.visionforge.AbstractVision @Serializable -public abstract class VisionOfHtml: AbstractVision(){ +public abstract class VisionOfHtml : AbstractVision() { public var classes: List by properties.stringList(*emptyArray()) } +@Serializable +@SerialName("html.plain") +public class VisionOfPlainHtml : VisionOfHtml() { + public var content: String? by properties.string() +} + +public inline fun VisionOfPlainHtml.content(block: TagConsumer<*>.() -> Unit) { + content = createHTML().apply(block).finalize() +} + +@Serializable +public enum class InputFeedbackMode{ + /** + * Fire feedback event on `onchange` event + */ + ONCHANGE, + + /** + * Fire feedback event on `oninput` event + */ + ONINPUT, + + /** + * provide only manual feedback + */ + NONE +} + @Serializable @SerialName("html.input") public open class VisionOfHtmlInput( public val inputType: String, + public val feedbackMode: InputFeedbackMode = InputFeedbackMode.ONCHANGE ) : VisionOfHtml() { - public var value : Value? by properties.value() + public var value: Value? by properties.value() public var disabled: Boolean by properties.boolean { false } public var fieldName: String? by properties.string() } diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/useProperty.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/useProperty.kt index f6f95a6f..cee3a002 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/useProperty.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/useProperty.kt @@ -39,9 +39,22 @@ public fun Vision.useProperty( callback: (Meta) -> Unit, ): Job = useProperty(propertyName.parseAsName(), inherit, includeStyles, scope, callback) +/** + * Observe changes to the specific property without passing the initial value. + */ +public fun V.onPropertyChange( + property: KProperty1, + scope: CoroutineScope = manager?.context ?: error("Orphan Vision can't observe properties"), + callback: suspend V.(T) -> Unit, +): Job = properties.changes.onEach { name -> + if (name.startsWith(property.name.asName())) { + callback(property.get(this)) + } +}.launchIn(scope) + public fun V.useProperty( property: KProperty1, - scope: CoroutineScope? = manager?.context, + scope: CoroutineScope = manager?.context ?: error("Orphan Vision can't observe properties"), callback: V.(T) -> Unit, ): Job { //Pass initial value. @@ -50,5 +63,5 @@ public fun V.useProperty( if (name.startsWith(property.name.asName())) { callback(property.get(this@useProperty)) } - }.launchIn(scope ?: error("Orphan Vision can't observe properties")) + }.launchIn(scope) } \ No newline at end of file diff --git a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/ElementVisionRenderer.kt b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/ElementVisionRenderer.kt index 75ec785a..8842e08e 100644 --- a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/ElementVisionRenderer.kt +++ b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/ElementVisionRenderer.kt @@ -26,7 +26,7 @@ public interface ElementVisionRenderer : Named { /** * Give a [vision] integer rating based on this renderer capabilities. [ZERO_RATING] or negative values means that this renderer * can't process a vision. The value of [DEFAULT_RATING] used for default renderer. Specialized renderers could specify - * higher value in order to "steal" rendering job + * higher value to "steal" rendering job */ public fun rateVision(vision: Vision): Int diff --git a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/JsVisionClient.kt b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/JsVisionClient.kt index d164e5ea..388ed2af 100644 --- a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/JsVisionClient.kt +++ b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/JsVisionClient.kt @@ -65,20 +65,20 @@ public class JsVisionClient : AbstractPlugin(), VisionClient { private fun Element.getFlag(attribute: String): Boolean = attributes[attribute]?.value != null - private val mutex = Mutex() +// private val mutex = Mutex() - private val changeCollector = VisionChangeBuilder() - /** - * Communicate vision property changed from rendering engine to model - */ - override fun notifyPropertyChanged(visionName: Name, propertyName: Name, item: Meta?) { - context.launch { - mutex.withLock { - changeCollector.propertyChanged(visionName, propertyName, item) - } - } - } + +// /** +// * Communicate vision property changed from rendering engine to model +// */ +// private fun notifyPropertyChanged(visionName: Name, propertyName: Name, item: Meta?) { +// context.launch { +// mutex.withLock { +// changeCollector.propertyChanged(visionName, propertyName, item) +// } +// } +// } private val eventCollector by lazy { MutableSharedFlow>(meta["feedback.eventCache"].int ?: 100) @@ -97,7 +97,7 @@ public class JsVisionClient : AbstractPlugin(), VisionClient { renderer.render(element, name, vision, outputMeta) } - private fun startVisionUpdate(element: Element, name: Name, vision: Vision?, outputMeta: Meta) { + private fun startVisionUpdate(element: Element, visionName: Name, vision: Vision, outputMeta: Meta) { element.attributes[OUTPUT_CONNECT_ATTRIBUTE]?.let { attr -> val wsUrl = if (attr.value.isBlank() || attr.value == VisionTagConsumer.AUTO_DATA_ATTRIBUTE) { val endpoint = resolveEndpoint(element) @@ -109,9 +109,10 @@ public class JsVisionClient : AbstractPlugin(), VisionClient { URL(attr.value) }.apply { protocol = "ws" - searchParams.append("name", name.toString()) + searchParams.append("name", visionName.toString()) } + logger.info { "Updating vision data from $wsUrl" } //Individual websocket for this vision @@ -125,14 +126,13 @@ public class JsVisionClient : AbstractPlugin(), VisionClient { ) // If change contains root vision replacement, do it - if(event is VisionChange) { + if (event is VisionChange) { event.vision?.let { vision -> - renderVision(element, name, vision, outputMeta) + renderVision(element, visionName, vision, outputMeta) } } - logger.debug { "Got $event for output with name $name" } - if (vision == null) error("Can't update vision because it is not loaded.") + logger.debug { "Got $event for output with name $visionName" } vision.receiveEvent(event) } else { logger.error { "WebSocket message data is not a string" } @@ -147,32 +147,44 @@ public class JsVisionClient : AbstractPlugin(), VisionClient { val feedbackAggregationTime = meta["feedback.aggregationTime"]?.int ?: 300 onopen = { + + + val mutex = Mutex() + + val changeCollector = VisionChangeBuilder() + feedbackJob = visionManager.context.launch { - eventCollector.filter { it.first == name }.onEach { + //launch a separate coroutine to send events to the backend + eventCollector.filter { it.first == visionName }.onEach { send(visionManager.jsonFormat.encodeToString(VisionEvent.serializer(), it.second)) }.launchIn(this) + //launch backward property propagation + vision.properties.changes.onEach { propertyName: Name -> + changeCollector.propertyChanged(visionName, propertyName, vision.properties.getMeta(propertyName)) + }.launchIn(this) + + //aggregate atomic changes while (isActive) { delay(feedbackAggregationTime.milliseconds) - val change = changeCollector[name] ?: continue - if (!change.isEmpty()) { + if (!changeCollector.isEmpty()) { mutex.withLock { - eventCollector.emit(name to change.deepCopy(visionManager)) - change.reset() + eventCollector.emit(visionName to changeCollector.deepCopy(visionManager)) + changeCollector.reset() } } } } - logger.info { "WebSocket feedback channel established for output '$name'" } + logger.info { "WebSocket feedback channel established for output '$visionName'" } } onclose = { feedbackJob?.cancel() - logger.info { "WebSocket feedback channel closed for output '$name'" } + logger.info { "WebSocket feedback channel closed for output '$visionName'" } } onerror = { feedbackJob?.cancel() - logger.error { "WebSocket feedback channel error for output '$name'" } + logger.error { "WebSocket feedback channel error for output '$visionName'" } } } } @@ -241,9 +253,9 @@ public class JsVisionClient : AbstractPlugin(), VisionClient { } //Try to load vision via websocket - element.attributes[OUTPUT_CONNECT_ATTRIBUTE] != null -> { - startVisionUpdate(element, name, null, outputMeta) - } +// element.attributes[OUTPUT_CONNECT_ATTRIBUTE] != null -> { +// startVisionUpdate(element, name, null, outputMeta) +// } else -> error("No embedded vision data / fetch url for $name") } @@ -252,9 +264,12 @@ public class JsVisionClient : AbstractPlugin(), VisionClient { override fun content(target: String): Map = if (target == ElementVisionRenderer.TYPE) { listOf( - numberVisionRenderer(), - textVisionRenderer(), - formVisionRenderer() + inputVisionRenderer, + checkboxVisionRenderer, + numberVisionRenderer, + textVisionRenderer, + rangeVisionRenderer, + formVisionRenderer ).associateByName() } else super.content(target) diff --git a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/inputRenderers.kt b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/inputRenderers.kt index 8b07e177..4e984cb0 100644 --- a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/inputRenderers.kt +++ b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/inputRenderers.kt @@ -3,10 +3,10 @@ package space.kscience.visionforge import kotlinx.browser.document import kotlinx.html.InputType import kotlinx.html.js.input -import kotlinx.html.js.onChangeFunction import org.w3c.dom.HTMLElement import org.w3c.dom.HTMLFormElement import org.w3c.dom.HTMLInputElement +import org.w3c.dom.events.Event import org.w3c.dom.get import org.w3c.xhr.FormData import space.kscience.dataforge.context.debug @@ -14,7 +14,11 @@ import space.kscience.dataforge.context.logger import space.kscience.dataforge.meta.* import space.kscience.visionforge.html.* - +/** + * Subscribes the HTML element to a given vision. + * + * @param vision The vision to subscribe to. + */ private fun HTMLElement.subscribeToVision(vision: VisionOfHtml) { vision.useProperty(VisionOfHtml::classes) { classList.value = classes.joinToString(separator = " ") @@ -22,6 +26,11 @@ private fun HTMLElement.subscribeToVision(vision: VisionOfHtml) { } +/** + * Subscribes the HTML input element to a given vision. + * + * @param inputVision The input vision to subscribe to. + */ private fun HTMLInputElement.subscribeToInput(inputVision: VisionOfHtmlInput) { subscribeToVision(inputVision) inputVision.useProperty(VisionOfHtmlInput::disabled) { @@ -29,33 +38,123 @@ private fun HTMLInputElement.subscribeToInput(inputVision: VisionOfHtmlInput) { } } - -internal fun JsVisionClient.textVisionRenderer(): ElementVisionRenderer = - ElementVisionRenderer { visionName, vision, _ -> +internal val inputVisionRenderer: ElementVisionRenderer = + ElementVisionRenderer(acceptRating = ElementVisionRenderer.DEFAULT_RATING - 1) { _, vision, _ -> input { type = InputType.text - onChangeFunction = { - notifyPropertyChanged(visionName, VisionOfTextField::text.name, value) - } }.apply { + val onEvent: (Event) -> Unit = { + vision.value = value.asValue() + } + + + when (vision.feedbackMode) { + InputFeedbackMode.ONCHANGE -> onchange = onEvent + + InputFeedbackMode.ONINPUT -> oninput = onEvent + InputFeedbackMode.NONE -> {} + } + subscribeToInput(vision) - vision.useProperty(VisionOfTextField::text) { - value = (it ?: "").asValue() + vision.useProperty(VisionOfHtmlInput::value) { + this@apply.value = it?.string ?: "" } } } -internal fun JsVisionClient.numberVisionRenderer(): ElementVisionRenderer = - ElementVisionRenderer { visionName, vision, _ -> +internal val checkboxVisionRenderer: ElementVisionRenderer = + ElementVisionRenderer { _, vision, _ -> + input { + type = InputType.checkBox + }.apply { + val onEvent: (Event) -> Unit = { + vision.checked = checked + } + + + when (vision.feedbackMode) { + InputFeedbackMode.ONCHANGE -> onchange = onEvent + + InputFeedbackMode.ONINPUT -> oninput = onEvent + InputFeedbackMode.NONE -> {} + } + + subscribeToInput(vision) + vision.useProperty(VisionOfCheckbox::checked) { + this@apply.checked = it ?: false + } + } + } + +internal val textVisionRenderer: ElementVisionRenderer = + ElementVisionRenderer { _, vision, _ -> input { type = InputType.text - onChangeFunction = { - notifyPropertyChanged(visionName, VisionOfNumberField::value.name, value) - } }.apply { + val onEvent: (Event) -> Unit = { + vision.text = value + } + + + when (vision.feedbackMode) { + InputFeedbackMode.ONCHANGE -> onchange = onEvent + + InputFeedbackMode.ONINPUT -> oninput = onEvent + InputFeedbackMode.NONE -> {} + } + + subscribeToInput(vision) + vision.useProperty(VisionOfTextField::text) { + this@apply.value = it ?: "" + } + } + } + +internal val numberVisionRenderer: ElementVisionRenderer = + ElementVisionRenderer { _, vision, _ -> + input { + type = InputType.text + }.apply { + + val onEvent: (Event) -> Unit = { + value.toDoubleOrNull()?.let { vision.number = it } + } + + when (vision.feedbackMode) { + InputFeedbackMode.ONCHANGE -> onchange = onEvent + + InputFeedbackMode.ONINPUT -> oninput = onEvent + InputFeedbackMode.NONE -> {} + } subscribeToInput(vision) vision.useProperty(VisionOfNumberField::value) { - value = (it?.double ?: 0.0).asValue() + this@apply.valueAsNumber = it?.double ?: 0.0 + } + } + } + +internal val rangeVisionRenderer: ElementVisionRenderer = + ElementVisionRenderer { _, vision, _ -> + input { + type = InputType.text + min = vision.min.toString() + max = vision.max.toString() + step = vision.step.toString() + }.apply { + + val onEvent: (Event) -> Unit = { + value.toDoubleOrNull()?.let { vision.number = it } + } + + when (vision.feedbackMode) { + InputFeedbackMode.ONCHANGE -> onchange = onEvent + + InputFeedbackMode.ONINPUT -> oninput = onEvent + InputFeedbackMode.NONE -> {} + } + subscribeToInput(vision) + vision.useProperty(VisionOfRangeField::value) { + this@apply.valueAsNumber = it?.double ?: 0.0 } } } @@ -83,7 +182,7 @@ internal fun FormData.toMeta(): Meta { return DynamicMeta(`object`) } -internal fun JsVisionClient.formVisionRenderer(): ElementVisionRenderer = +internal val formVisionRenderer: ElementVisionRenderer = ElementVisionRenderer { visionName, vision, _ -> val form = document.getElementById(vision.formId) as? HTMLFormElement @@ -91,10 +190,10 @@ internal fun JsVisionClient.formVisionRenderer(): ElementVisionRenderer = form.subscribeToVision(vision) - logger.debug { "Adding hooks to form with id = '$vision.formId'" } + vision.manager?.logger?.debug { "Adding hooks to form with id = '$vision.formId'" } vision.useProperty(VisionOfHtmlForm::values) { values -> - logger.debug { "Updating form '${vision.formId}' with values $values" } + vision.manager?.logger?.debug { "Updating form '${vision.formId}' with values $values" } val inputs = form.getElementsByTagName("input") values?.valueSequence()?.forEach { (token, value) -> (inputs[token.toString()] as? HTMLInputElement)?.value = value.toString() @@ -104,7 +203,7 @@ internal fun JsVisionClient.formVisionRenderer(): ElementVisionRenderer = form.onsubmit = { event -> event.preventDefault() val formData = FormData(form).toMeta() - notifyPropertyChanged(visionName, VisionOfHtmlForm::values.name, formData) + vision.values = formData console.info("Sent: ${formData.toMap()}") false } From c877fcbce37cc6a4f1049a5a8ed7a2762445d739 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Sat, 2 Dec 2023 23:07:00 +0300 Subject: [PATCH 07/41] Add plain html input renderer --- .../kscience/visionforge/JsVisionClient.kt | 1 + .../kscience/visionforge/inputRenderers.kt | 71 +++++++++++-------- 2 files changed, 42 insertions(+), 30 deletions(-) diff --git a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/JsVisionClient.kt b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/JsVisionClient.kt index 388ed2af..6ae70280 100644 --- a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/JsVisionClient.kt +++ b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/JsVisionClient.kt @@ -264,6 +264,7 @@ public class JsVisionClient : AbstractPlugin(), VisionClient { override fun content(target: String): Map = if (target == ElementVisionRenderer.TYPE) { listOf( + htmlVisionRenderer, inputVisionRenderer, checkboxVisionRenderer, numberVisionRenderer, diff --git a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/inputRenderers.kt b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/inputRenderers.kt index 4e984cb0..af54bd75 100644 --- a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/inputRenderers.kt +++ b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/inputRenderers.kt @@ -2,6 +2,7 @@ package space.kscience.visionforge import kotlinx.browser.document import kotlinx.html.InputType +import kotlinx.html.div import kotlinx.html.js.input import org.w3c.dom.HTMLElement import org.w3c.dom.HTMLFormElement @@ -38,26 +39,36 @@ private fun HTMLInputElement.subscribeToInput(inputVision: VisionOfHtmlInput) { } } +internal val htmlVisionRenderer: ElementVisionRenderer = + ElementVisionRenderer { _, vision, _ -> + div {}.also { div -> + div.subscribeToVision(vision) + vision.useProperty(VisionOfPlainHtml::content) { + div.textContent = it + } + } + } + internal val inputVisionRenderer: ElementVisionRenderer = ElementVisionRenderer(acceptRating = ElementVisionRenderer.DEFAULT_RATING - 1) { _, vision, _ -> input { type = InputType.text - }.apply { + }.also { htmlInputElement -> val onEvent: (Event) -> Unit = { - vision.value = value.asValue() + vision.value = htmlInputElement.value.asValue() } when (vision.feedbackMode) { - InputFeedbackMode.ONCHANGE -> onchange = onEvent + InputFeedbackMode.ONCHANGE -> htmlInputElement.onchange = onEvent - InputFeedbackMode.ONINPUT -> oninput = onEvent + InputFeedbackMode.ONINPUT -> htmlInputElement.oninput = onEvent InputFeedbackMode.NONE -> {} } - subscribeToInput(vision) + htmlInputElement.subscribeToInput(vision) vision.useProperty(VisionOfHtmlInput::value) { - this@apply.value = it?.string ?: "" + htmlInputElement.value = it?.string ?: "" } } } @@ -66,22 +77,22 @@ internal val checkboxVisionRenderer: ElementVisionRenderer = ElementVisionRenderer { _, vision, _ -> input { type = InputType.checkBox - }.apply { + }.also { htmlInputElement -> val onEvent: (Event) -> Unit = { - vision.checked = checked + vision.checked = htmlInputElement.checked } when (vision.feedbackMode) { - InputFeedbackMode.ONCHANGE -> onchange = onEvent + InputFeedbackMode.ONCHANGE -> htmlInputElement.onchange = onEvent - InputFeedbackMode.ONINPUT -> oninput = onEvent + InputFeedbackMode.ONINPUT -> htmlInputElement.oninput = onEvent InputFeedbackMode.NONE -> {} } - subscribeToInput(vision) + htmlInputElement.subscribeToInput(vision) vision.useProperty(VisionOfCheckbox::checked) { - this@apply.checked = it ?: false + htmlInputElement.checked = it ?: false } } } @@ -90,22 +101,22 @@ internal val textVisionRenderer: ElementVisionRenderer = ElementVisionRenderer { _, vision, _ -> input { type = InputType.text - }.apply { + }.also { htmlInputElement -> val onEvent: (Event) -> Unit = { - vision.text = value + vision.text = htmlInputElement.value } when (vision.feedbackMode) { - InputFeedbackMode.ONCHANGE -> onchange = onEvent + InputFeedbackMode.ONCHANGE -> htmlInputElement.onchange = onEvent - InputFeedbackMode.ONINPUT -> oninput = onEvent + InputFeedbackMode.ONINPUT -> htmlInputElement.oninput = onEvent InputFeedbackMode.NONE -> {} } - subscribeToInput(vision) + htmlInputElement.subscribeToInput(vision) vision.useProperty(VisionOfTextField::text) { - this@apply.value = it ?: "" + htmlInputElement.value = it ?: "" } } } @@ -114,21 +125,21 @@ internal val numberVisionRenderer: ElementVisionRenderer = ElementVisionRenderer { _, vision, _ -> input { type = InputType.text - }.apply { + }.also { htmlInputElement -> val onEvent: (Event) -> Unit = { - value.toDoubleOrNull()?.let { vision.number = it } + htmlInputElement.value.toDoubleOrNull()?.let { vision.number = it } } when (vision.feedbackMode) { - InputFeedbackMode.ONCHANGE -> onchange = onEvent + InputFeedbackMode.ONCHANGE -> htmlInputElement.onchange = onEvent - InputFeedbackMode.ONINPUT -> oninput = onEvent + InputFeedbackMode.ONINPUT -> htmlInputElement.oninput = onEvent InputFeedbackMode.NONE -> {} } - subscribeToInput(vision) + htmlInputElement.subscribeToInput(vision) vision.useProperty(VisionOfNumberField::value) { - this@apply.valueAsNumber = it?.double ?: 0.0 + htmlInputElement.valueAsNumber = it?.double ?: 0.0 } } } @@ -140,21 +151,21 @@ internal val rangeVisionRenderer: ElementVisionRenderer = min = vision.min.toString() max = vision.max.toString() step = vision.step.toString() - }.apply { + }.also { htmlInputElement -> val onEvent: (Event) -> Unit = { - value.toDoubleOrNull()?.let { vision.number = it } + htmlInputElement.value.toDoubleOrNull()?.let { vision.number = it } } when (vision.feedbackMode) { - InputFeedbackMode.ONCHANGE -> onchange = onEvent + InputFeedbackMode.ONCHANGE -> htmlInputElement.onchange = onEvent - InputFeedbackMode.ONINPUT -> oninput = onEvent + InputFeedbackMode.ONINPUT -> htmlInputElement.oninput = onEvent InputFeedbackMode.NONE -> {} } - subscribeToInput(vision) + htmlInputElement.subscribeToInput(vision) vision.useProperty(VisionOfRangeField::value) { - this@apply.valueAsNumber = it?.double ?: 0.0 + htmlInputElement.valueAsNumber = it?.double ?: 0.0 } } } From fbb402de90463f893d016e72329958c067e87ce8 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Sun, 3 Dec 2023 20:17:48 +0300 Subject: [PATCH 08/41] add builders for html field --- .../kscience/visionforge/html/VisionOfHtml.kt | 38 ++++++++++++++++++- .../visionforge/meta/VisionPropertyTest.kt | 2 - .../kscience/visionforge/inputRenderers.kt | 2 +- 3 files changed, 37 insertions(+), 5 deletions(-) diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionOfHtml.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionOfHtml.kt index 51458047..9cc223e5 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionOfHtml.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionOfHtml.kt @@ -25,8 +25,13 @@ public inline fun VisionOfPlainHtml.content(block: TagConsumer<*>.() -> Unit) { content = createHTML().apply(block).finalize() } +@Suppress("UnusedReceiverParameter") +public inline fun VisionOutput.html( + block: VisionOfPlainHtml.() -> Unit, +): VisionOfPlainHtml = VisionOfPlainHtml().apply(block) + @Serializable -public enum class InputFeedbackMode{ +public enum class InputFeedbackMode { /** * Fire feedback event on `onchange` event */ @@ -47,13 +52,18 @@ public enum class InputFeedbackMode{ @SerialName("html.input") public open class VisionOfHtmlInput( public val inputType: String, - public val feedbackMode: InputFeedbackMode = InputFeedbackMode.ONCHANGE + public val feedbackMode: InputFeedbackMode = InputFeedbackMode.ONCHANGE, ) : VisionOfHtml() { public var value: Value? by properties.value() public var disabled: Boolean by properties.boolean { false } public var fieldName: String? by properties.string() } +@Suppress("UnusedReceiverParameter") +public inline fun VisionOutput.htmlInput( + inputType: String, + block: VisionOfHtmlInput.() -> Unit = {}, +): VisionOfHtmlInput = VisionOfHtmlInput(inputType).apply(block) @Serializable @SerialName("html.text") @@ -61,18 +71,34 @@ public class VisionOfTextField : VisionOfHtmlInput(InputType.text.realValue) { public var text: String? by properties.string(key = VisionOfHtmlInput::value.name.asName()) } +@Suppress("UnusedReceiverParameter") +public inline fun VisionOutput.htmlTextField( + block: VisionOfTextField.() -> Unit = {}, +): VisionOfTextField = VisionOfTextField().apply(block) + + @Serializable @SerialName("html.checkbox") public class VisionOfCheckbox : VisionOfHtmlInput(InputType.checkBox.realValue) { public var checked: Boolean? by properties.boolean(key = VisionOfHtmlInput::value.name.asName()) } +@Suppress("UnusedReceiverParameter") +public inline fun VisionOutput.htmlCheckBox( + block: VisionOfCheckbox.() -> Unit = {}, +): VisionOfCheckbox = VisionOfCheckbox().apply(block) + @Serializable @SerialName("html.number") public class VisionOfNumberField : VisionOfHtmlInput(InputType.number.realValue) { public var number: Number? by properties.number(key = VisionOfHtmlInput::value.name.asName()) } +@Suppress("UnusedReceiverParameter") +public inline fun VisionOutput.htmlNumberField( + block: VisionOfNumberField.() -> Unit = {}, +): VisionOfNumberField = VisionOfNumberField().apply(block) + @Serializable @SerialName("html.range") public class VisionOfRangeField( @@ -83,3 +109,11 @@ public class VisionOfRangeField( public var number: Number? by properties.number(key = VisionOfHtmlInput::value.name.asName()) } +@Suppress("UnusedReceiverParameter") +public inline fun VisionOutput.htmlRangeField( + min: Double, + max: Double, + step: Double = 1.0, + block: VisionOfRangeField.() -> Unit = {}, +): VisionOfRangeField = VisionOfRangeField(min, max, step).apply(block) + diff --git a/visionforge-core/src/commonTest/kotlin/space/kscience/visionforge/meta/VisionPropertyTest.kt b/visionforge-core/src/commonTest/kotlin/space/kscience/visionforge/meta/VisionPropertyTest.kt index a6ea86a2..38abe34c 100644 --- a/visionforge-core/src/commonTest/kotlin/space/kscience/visionforge/meta/VisionPropertyTest.kt +++ b/visionforge-core/src/commonTest/kotlin/space/kscience/visionforge/meta/VisionPropertyTest.kt @@ -1,7 +1,6 @@ package space.kscience.visionforge.meta import kotlinx.coroutines.CompletableDeferred -import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.delay import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.take @@ -24,7 +23,6 @@ private class TestScheme : Scheme() { companion object : SchemeSpec(::TestScheme) } -@OptIn(ExperimentalCoroutinesApi::class) internal class VisionPropertyTest { private val manager = Global.request(VisionManager) diff --git a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/inputRenderers.kt b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/inputRenderers.kt index af54bd75..e1410752 100644 --- a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/inputRenderers.kt +++ b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/inputRenderers.kt @@ -194,7 +194,7 @@ internal fun FormData.toMeta(): Meta { } internal val formVisionRenderer: ElementVisionRenderer = - ElementVisionRenderer { visionName, vision, _ -> + ElementVisionRenderer { _, vision, _ -> val form = document.getElementById(vision.formId) as? HTMLFormElement ?: error("An element with id = '${vision.formId} is not a form") From 595512959c4e358a0eb86d11f24f104bd0284013 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Tue, 5 Dec 2023 16:39:15 +0300 Subject: [PATCH 09/41] DataForge 0.7.1 and other version updates --- build.gradle.kts | 4 +- .../visionforge/gdml/GDMLVisionTest.kt | 2 +- .../kotlin/ru/mipt/npm/muon/monitor/Model.kt | 2 +- gradle.properties | 2 +- gradle/wrapper/gradle-wrapper.properties | 2 +- .../bootstrap/visionPropertyEditor.kt | 2 +- ui/compose/build.gradle.kts | 3 +- .../visionforge/compose/PropertyEditor.kt | 5 +-- .../visionforge/compose/valueChooser.kt | 4 +- .../visionforge/react/PropertyEditor.kt | 7 ++-- .../visionforge/react/RangeValueChooser.kt | 4 +- .../space/kscience/visionforge/StyleSheet.kt | 6 +-- .../space/kscience/visionforge/Vision.kt | 4 +- .../kscience/visionforge/VisionProperties.kt | 42 +++++++++---------- .../kscience/visionforge/flowProperty.kt | 4 +- .../space/kscience/visionforge/useProperty.kt | 4 +- .../visionforge/meta/VisionPropertyTest.kt | 6 +-- .../visionforge/ElementVisionRenderer.kt | 4 +- .../kscience/visionforge/JsVisionClient.kt | 2 +- visionforge-plotly/build.gradle.kts | 2 +- .../visionforge/plotly/VisionOfPlotly.kt | 8 ++-- .../visionforge/server/VisionServer.kt | 2 +- .../kscience/visionforge/solid/Composite.kt | 2 +- .../kscience/visionforge/solid/Extruded.kt | 2 +- .../space/kscience/visionforge/solid/Solid.kt | 2 +- .../visionforge/solid/SolidMaterial.kt | 8 ++-- .../visionforge/solid/SolidReference.kt | 6 +-- .../kscience/visionforge/solid/Surface.kt | 2 +- .../kscience/visionforge/solid/geometry.kt | 6 +-- .../solid/transform/RemoveSingleChild.kt | 2 +- visionforge-tables/build.gradle.kts | 2 +- .../visionforge/tables/VisionOfTableTest.kt | 3 +- .../visionforge/solid/three/ThreeFactory.kt | 4 +- .../solid/three/ThreeLineFactory.kt | 2 +- .../visionforge/solid/three/ThreeMaterials.kt | 12 +++--- .../solid/three/ThreeMeshFactory.kt | 2 +- 36 files changed, 88 insertions(+), 88 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 2da86b96..b578696d 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -7,12 +7,12 @@ plugins { // id("org.jetbrains.kotlinx.kover") version "0.5.0" } -val dataforgeVersion by extra("0.6.2") +val dataforgeVersion by extra("0.7.1") val fxVersion by extra("11") allprojects { group = "space.kscience" - version = "0.3.0-dev-16" + version = "0.3.0-dev-17" } subprojects { diff --git a/demo/gdml/src/commonTest/kotlin/space/kscience/visionforge/gdml/GDMLVisionTest.kt b/demo/gdml/src/commonTest/kotlin/space/kscience/visionforge/gdml/GDMLVisionTest.kt index ba9cb333..6ade4ec8 100644 --- a/demo/gdml/src/commonTest/kotlin/space/kscience/visionforge/gdml/GDMLVisionTest.kt +++ b/demo/gdml/src/commonTest/kotlin/space/kscience/visionforge/gdml/GDMLVisionTest.kt @@ -34,6 +34,6 @@ class GDMLVisionTest { val child = cubes[Name.of("composite-000","segment-0")] assertNotNull(child) child.properties.setValue(SolidMaterial.MATERIAL_COLOR_KEY, "red".asValue()) - assertEquals("red", child.properties.getMeta(SolidMaterial.MATERIAL_COLOR_KEY).string) + assertEquals("red", child.properties[SolidMaterial.MATERIAL_COLOR_KEY].string) } } \ No newline at end of file diff --git a/demo/muon-monitor/src/commonMain/kotlin/ru/mipt/npm/muon/monitor/Model.kt b/demo/muon-monitor/src/commonMain/kotlin/ru/mipt/npm/muon/monitor/Model.kt index 7f7958b9..34b750e9 100644 --- a/demo/muon-monitor/src/commonMain/kotlin/ru/mipt/npm/muon/monitor/Model.kt +++ b/demo/muon-monitor/src/commonMain/kotlin/ru/mipt/npm/muon/monitor/Model.kt @@ -71,7 +71,7 @@ class Model(val manager: VisionManager) { fun reset() { map.values.forEach { - it.properties.setMeta(SolidMaterial.MATERIAL_COLOR_KEY, null) + it.properties[SolidMaterial.MATERIAL_COLOR_KEY] = null } tracks.children.clear() } diff --git a/gradle.properties b/gradle.properties index 9413b93e..4e33feb5 100644 --- a/gradle.properties +++ b/gradle.properties @@ -8,6 +8,6 @@ org.gradle.jvmargs=-Xmx4G org.jetbrains.compose.experimental.jscanvas.enabled=true -toolsVersion=0.15.0-kotlin-1.9.20 +toolsVersion=0.15.2-kotlin-1.9.21 #kotlin.experimental.tryK2=true #kscience.wasm.disabled=true diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index e411586a..a5952066 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.5-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/ui/bootstrap/src/jsMain/kotlin/space/kscience/visionforge/bootstrap/visionPropertyEditor.kt b/ui/bootstrap/src/jsMain/kotlin/space/kscience/visionforge/bootstrap/visionPropertyEditor.kt index 8e7e1208..8264ae43 100644 --- a/ui/bootstrap/src/jsMain/kotlin/space/kscience/visionforge/bootstrap/visionPropertyEditor.kt +++ b/ui/bootstrap/src/jsMain/kotlin/space/kscience/visionforge/bootstrap/visionPropertyEditor.kt @@ -29,7 +29,7 @@ public fun RBuilder.visionPropertyEditor( this.descriptor = descriptor this.scope = vision.manager?.context ?: error("Orphan vision could not be observed") this.getPropertyState = { name -> - val ownMeta = vision.properties.own?.getMeta(name) + val ownMeta = vision.properties.own?.get(name) if (ownMeta != null && !ownMeta.isEmpty()) { EditorPropertyState.Defined } else if (vision.properties.root().getValue(name) != null) { diff --git a/ui/compose/build.gradle.kts b/ui/compose/build.gradle.kts index a2f2c4a7..f77c8e26 100644 --- a/ui/compose/build.gradle.kts +++ b/ui/compose/build.gradle.kts @@ -1,7 +1,8 @@ plugins { id("space.kscience.gradle.mpp") - id("org.jetbrains.compose") version "1.5.10" + alias(spclibs.plugins.compose) +// id("org.jetbrains.compose") version "1.5.11" // id("com.android.library") } diff --git a/ui/compose/src/jsMain/kotlin/space/kscience/visionforge/compose/PropertyEditor.kt b/ui/compose/src/jsMain/kotlin/space/kscience/visionforge/compose/PropertyEditor.kt index d919cd77..0892b9af 100644 --- a/ui/compose/src/jsMain/kotlin/space/kscience/visionforge/compose/PropertyEditor.kt +++ b/ui/compose/src/jsMain/kotlin/space/kscience/visionforge/compose/PropertyEditor.kt @@ -17,9 +17,8 @@ import org.jetbrains.compose.web.dom.Text import space.kscience.dataforge.meta.MutableMeta import space.kscience.dataforge.meta.ObservableMutableMeta import space.kscience.dataforge.meta.descriptors.MetaDescriptor -import space.kscience.dataforge.meta.descriptors.ValueRequirement +import space.kscience.dataforge.meta.descriptors.ValueRestriction import space.kscience.dataforge.meta.descriptors.get -import space.kscience.dataforge.meta.get import space.kscience.dataforge.meta.remove import space.kscience.dataforge.names.* import space.kscience.visionforge.hidden @@ -104,7 +103,7 @@ public fun PropertyEditor( Text(token) } - if (!name.isEmpty() && descriptor?.valueRequirement != ValueRequirement.ABSENT) { + if (!name.isEmpty() && descriptor?.valueRestriction != ValueRestriction.ABSENT) { Div({ style { width(160.px) diff --git a/ui/compose/src/jsMain/kotlin/space/kscience/visionforge/compose/valueChooser.kt b/ui/compose/src/jsMain/kotlin/space/kscience/visionforge/compose/valueChooser.kt index 0be879ad..b6aefee7 100644 --- a/ui/compose/src/jsMain/kotlin/space/kscience/visionforge/compose/valueChooser.kt +++ b/ui/compose/src/jsMain/kotlin/space/kscience/visionforge/compose/valueChooser.kt @@ -16,7 +16,7 @@ import org.w3c.dom.HTMLOptionElement import org.w3c.dom.asList import space.kscience.dataforge.meta.* import space.kscience.dataforge.meta.descriptors.MetaDescriptor -import space.kscience.dataforge.meta.descriptors.ValueRequirement +import space.kscience.dataforge.meta.descriptors.ValueRestriction import space.kscience.dataforge.meta.descriptors.allowedValues import space.kscience.visionforge.Colors import space.kscience.visionforge.widgetType @@ -199,7 +199,7 @@ public fun RangeValueChooser( FlexRow { - if (descriptor?.valueRequirement != ValueRequirement.REQUIRED) { + if (descriptor?.valueRestriction != ValueRestriction.REQUIRED) { Input(type = InputType.Checkbox) { if (!rangeDisabled) defaultChecked() diff --git a/ui/react/src/jsMain/kotlin/space/kscience/visionforge/react/PropertyEditor.kt b/ui/react/src/jsMain/kotlin/space/kscience/visionforge/react/PropertyEditor.kt index 58986076..b13e7304 100644 --- a/ui/react/src/jsMain/kotlin/space/kscience/visionforge/react/PropertyEditor.kt +++ b/ui/react/src/jsMain/kotlin/space/kscience/visionforge/react/PropertyEditor.kt @@ -16,9 +16,8 @@ import react.dom.attrs import space.kscience.dataforge.meta.MutableMeta import space.kscience.dataforge.meta.ObservableMutableMeta import space.kscience.dataforge.meta.descriptors.MetaDescriptor -import space.kscience.dataforge.meta.descriptors.ValueRequirement +import space.kscience.dataforge.meta.descriptors.ValueRestriction import space.kscience.dataforge.meta.descriptors.get -import space.kscience.dataforge.meta.get import space.kscience.dataforge.meta.remove import space.kscience.dataforge.names.* import space.kscience.visionforge.hidden @@ -146,7 +145,7 @@ private fun RBuilder.propertyEditorItem(props: PropertyEditorProps) { } +token } - if (!props.name.isEmpty() && descriptor?.valueRequirement != ValueRequirement.ABSENT) { + if (!props.name.isEmpty() && descriptor?.valueRestriction != ValueRestriction.ABSENT) { styledDiv { css { //+TreeStyles.resizeableInput @@ -185,7 +184,7 @@ private fun RBuilder.propertyEditorItem(props: PropertyEditorProps) { } +"\u00D7" attrs { - if (editorPropertyState!= EditorPropertyState.Defined) { + if (editorPropertyState != EditorPropertyState.Defined) { disabled = true } else { onClickFunction = removeClick diff --git a/ui/react/src/jsMain/kotlin/space/kscience/visionforge/react/RangeValueChooser.kt b/ui/react/src/jsMain/kotlin/space/kscience/visionforge/react/RangeValueChooser.kt index 4a82a6e9..bec34fc1 100644 --- a/ui/react/src/jsMain/kotlin/space/kscience/visionforge/react/RangeValueChooser.kt +++ b/ui/react/src/jsMain/kotlin/space/kscience/visionforge/react/RangeValueChooser.kt @@ -12,7 +12,7 @@ import react.dom.attrs import react.fc import react.useState import space.kscience.dataforge.meta.asValue -import space.kscience.dataforge.meta.descriptors.ValueRequirement +import space.kscience.dataforge.meta.descriptors.ValueRestriction import space.kscience.dataforge.meta.double import space.kscience.dataforge.meta.get import space.kscience.dataforge.meta.string @@ -43,7 +43,7 @@ public val RangeValueChooser: FC = fc("RangeValueChooser") { } flexRow { - if (props.descriptor?.valueRequirement != ValueRequirement.REQUIRED) { + if (props.descriptor?.valueRestriction != ValueRestriction.REQUIRED) { styledInput(type = InputType.checkBox) { attrs { defaultChecked = rangeDisabled.not() diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/StyleSheet.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/StyleSheet.kt index 00213644..ed893162 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/StyleSheet.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/StyleSheet.kt @@ -13,7 +13,7 @@ import kotlin.jvm.JvmInline @JvmInline public value class StyleSheet(private val owner: Vision) { - private val styleNode: Meta get() = owner.properties.getMeta(STYLESHEET_KEY) + private val styleNode: Meta get() = owner.properties[STYLESHEET_KEY] public val items: Map get() = styleNode.items @@ -23,7 +23,7 @@ public value class StyleSheet(private val owner: Vision) { * Define a style without notifying owner */ public fun define(key: String, style: Meta?) { - owner.properties.setMeta(STYLESHEET_KEY + key, style) + owner.properties[STYLESHEET_KEY + key] = style } /** @@ -92,7 +92,7 @@ public fun Vision.useStyle(name: String, notify: Boolean = true) { * Resolve a style with given name for given [Vision]. The style is not necessarily applied to this [Vision]. */ public fun Vision.getStyle(name: String): Meta? = - properties.own?.getMeta(StyleSheet.STYLESHEET_KEY + name) ?: parent?.getStyle(name) + properties.own?.get(StyleSheet.STYLESHEET_KEY + name) ?: parent?.getStyle(name) /** * Resolve a property from all styles diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/Vision.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/Vision.kt index 29965944..78f917a9 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/Vision.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/Vision.kt @@ -10,7 +10,7 @@ import space.kscience.dataforge.meta.asValue import space.kscience.dataforge.meta.boolean import space.kscience.dataforge.meta.descriptors.Described import space.kscience.dataforge.meta.descriptors.MetaDescriptor -import space.kscience.dataforge.misc.Type +import space.kscience.dataforge.misc.DfType import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.asName import space.kscience.visionforge.AbstractVisionGroup.Companion.updateProperties @@ -19,7 +19,7 @@ import space.kscience.visionforge.Vision.Companion.TYPE /** * A root type for display hierarchy */ -@Type(TYPE) +@DfType(TYPE) public interface Vision : Described { /** diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionProperties.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionProperties.kt index dfb06b50..3c375c62 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionProperties.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionProperties.kt @@ -34,13 +34,13 @@ public interface VisionProperties : MetaProvider { * @param inherit toggles parent node property lookup. Null means inference from descriptor. * @param includeStyles toggles inclusion of properties from styles. */ - public fun getMeta( + public fun get( name: Name, inherit: Boolean?, includeStyles: Boolean? = null, ): Meta - override fun getMeta(name: Name): Meta? = getMeta(name, null, null) + override fun get(name: Name): Meta? = get(name, null, null) public val changes: Flow @@ -54,7 +54,7 @@ public interface VisionProperties : MetaProvider { public interface MutableVisionProperties : VisionProperties, MutableMetaProvider { - override fun getMeta( + override fun get( name: Name, inherit: Boolean?, includeStyles: Boolean?, @@ -65,7 +65,7 @@ public interface MutableVisionProperties : VisionProperties, MutableMetaProvider includeStyles, ) - public fun setMeta( + public fun set( name: Name, node: Meta?, notify: Boolean, @@ -77,10 +77,10 @@ public interface MutableVisionProperties : VisionProperties, MutableMetaProvider notify: Boolean, ) - override fun getMeta(name: Name): MutableMeta = getMeta(name, null, null) + override fun get(name: Name): MutableMeta = get(name, null, null) - override fun setMeta(name: Name, node: Meta?) { - setMeta(name, node, true) + override fun set(name: Name, node: Meta?) { + set(name, node, true) } override fun setValue(name: Name, value: Value?) { @@ -89,7 +89,7 @@ public interface MutableVisionProperties : VisionProperties, MutableMetaProvider } public fun MutableVisionProperties.remove(name: Name) { - setMeta(name, null) + set(name, null) } public fun MutableVisionProperties.remove(name: String) { @@ -114,7 +114,7 @@ private class VisionPropertiesItem( override val items: Map get() { - val metaKeys = properties.own?.getMeta(nodeName)?.items?.keys ?: emptySet() + val metaKeys = properties.own?.get(nodeName)?.items?.keys ?: emptySet() val descriptorKeys = descriptor?.children?.map { NameToken(it.key) } ?: emptySet() val defaultKeys = default?.get(nodeName)?.items?.keys ?: emptySet() val inheritFlag = descriptor?.inherited ?: inherit @@ -148,8 +148,8 @@ private class VisionPropertiesItem( default ) - override fun setMeta(name: Name, node: Meta?) { - properties.setMeta(nodeName + name, node) + override fun set(name: Name, node: Meta?) { + properties[nodeName + name] = node } override fun toString(): String = Meta.toString(this) @@ -202,16 +202,16 @@ public abstract class AbstractVisionProperties( return descriptor?.defaultValue } - override fun setMeta(name: Name, node: Meta?, notify: Boolean) { + override fun set(name: Name, node: Meta?, notify: Boolean) { //ignore if the value is the same as existing - if (own?.getMeta(name) == node) return + if (own?.get(name) == node) return if (name.isEmpty()) { properties = node?.asMutableMeta() } else if (node == null) { - properties?.setMeta(name, node) + properties?.set(name, node) } else { - getOrCreateProperties().setMeta(name, node) + getOrCreateProperties()[name] = node } if (notify) { invalidate(name) @@ -223,7 +223,7 @@ public abstract class AbstractVisionProperties( if (own?.getValue(name) == value) return if (value == null) { - properties?.getMeta(name)?.value = null + properties?.get(name)?.value = null } else { getOrCreateProperties().setValue(name, value) } @@ -272,11 +272,11 @@ public fun VisionProperties.getValue( /** * Get [Vision] property using key as a String */ -public fun VisionProperties.getMeta( +public fun VisionProperties.get( name: String, inherit: Boolean? = null, includeStyles: Boolean? = null, -): Meta = getMeta(name.parseAsName(), inherit, includeStyles) +): Meta = get(name.parseAsName(), inherit, includeStyles) /** * The root property node with given inheritance and style flags @@ -286,17 +286,17 @@ public fun VisionProperties.getMeta( public fun MutableVisionProperties.root( inherit: Boolean? = null, includeStyles: Boolean? = null, -): MutableMeta = getMeta(Name.EMPTY, inherit, includeStyles) +): MutableMeta = get(Name.EMPTY, inherit, includeStyles) /** * Get [Vision] property using key as a String */ -public fun MutableVisionProperties.getMeta( +public fun MutableVisionProperties.get( name: String, inherit: Boolean? = null, includeStyles: Boolean? = null, -): MutableMeta = getMeta(name.parseAsName(), inherit, includeStyles) +): MutableMeta = get(name.parseAsName(), inherit, includeStyles) // //public operator fun MutableVisionProperties.set(name: Name, value: Number): Unit = diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/flowProperty.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/flowProperty.kt index f8d128e1..60c39c20 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/flowProperty.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/flowProperty.kt @@ -17,10 +17,10 @@ public fun Vision.flowProperty( includeStyles: Boolean? = null, ): Flow = flow { //Pass initial value. - emit(properties.getMeta(propertyName, inherit, includeStyles)) + emit(properties.get(propertyName, inherit, includeStyles)) properties.changes.collect { name -> if (name.startsWith(propertyName)) { - emit(properties.getMeta(propertyName, inherit, includeStyles)) + emit(properties.get(propertyName, inherit, includeStyles)) } } } diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/useProperty.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/useProperty.kt index cee3a002..8ffb272a 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/useProperty.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/useProperty.kt @@ -23,10 +23,10 @@ public fun Vision.useProperty( callback: (Meta) -> Unit, ): Job { //Pass initial value. - callback(properties.getMeta(propertyName, inherit, includeStyles)) + callback(properties.get(propertyName, inherit, includeStyles)) return properties.changes.onEach { name -> if (name.startsWith(propertyName)) { - callback(properties.getMeta(propertyName, inherit, includeStyles)) + callback(properties.get(propertyName, inherit, includeStyles)) } }.launchIn(scope ?: error("Orphan Vision can't observe properties")) } diff --git a/visionforge-core/src/commonTest/kotlin/space/kscience/visionforge/meta/VisionPropertyTest.kt b/visionforge-core/src/commonTest/kotlin/space/kscience/visionforge/meta/VisionPropertyTest.kt index 38abe34c..b1ca970a 100644 --- a/visionforge-core/src/commonTest/kotlin/space/kscience/visionforge/meta/VisionPropertyTest.kt +++ b/visionforge-core/src/commonTest/kotlin/space/kscience/visionforge/meta/VisionPropertyTest.kt @@ -40,7 +40,7 @@ internal class VisionPropertyTest { @Test fun testPropertyEdit() { val vision = manager.group() - vision.properties.getMeta("fff.ddd").apply { + vision.properties.get("fff.ddd").apply { value = 2.asValue() } assertEquals(2, vision.properties.getValue("fff.ddd")?.int) @@ -50,7 +50,7 @@ internal class VisionPropertyTest { @Test fun testPropertyUpdate() { val vision = manager.group() - vision.properties.getMeta("fff").updateWith(TestScheme) { + vision.properties.get("fff").updateWith(TestScheme) { ddd = 2 } assertEquals(2, vision.properties.getValue("fff.ddd")?.int) @@ -85,7 +85,7 @@ internal class VisionPropertyTest { child.properties.remove("test") - assertEquals(11, child.properties.getMeta("test", inherit = true).int) + assertEquals(11, child.properties.get("test", inherit = true).int) // assertEquals(11, deferred.await()?.int) // assertEquals(2, callCounter) subscription.cancel() diff --git a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/ElementVisionRenderer.kt b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/ElementVisionRenderer.kt index 8842e08e..8e1254d9 100644 --- a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/ElementVisionRenderer.kt +++ b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/ElementVisionRenderer.kt @@ -9,8 +9,8 @@ import kotlinx.serialization.serializerOrNull import org.w3c.dom.Element import org.w3c.dom.HTMLElement import space.kscience.dataforge.meta.Meta +import space.kscience.dataforge.misc.DfType import space.kscience.dataforge.misc.Named -import space.kscience.dataforge.misc.Type import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.asName import space.kscience.dataforge.names.parseAsName @@ -20,7 +20,7 @@ import kotlin.reflect.cast /** * A browser renderer for a [Vision]. */ -@Type(ElementVisionRenderer.TYPE) +@DfType(ElementVisionRenderer.TYPE) public interface ElementVisionRenderer : Named { /** diff --git a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/JsVisionClient.kt b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/JsVisionClient.kt index 6ae70280..17958f97 100644 --- a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/JsVisionClient.kt +++ b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/JsVisionClient.kt @@ -161,7 +161,7 @@ public class JsVisionClient : AbstractPlugin(), VisionClient { //launch backward property propagation vision.properties.changes.onEach { propertyName: Name -> - changeCollector.propertyChanged(visionName, propertyName, vision.properties.getMeta(propertyName)) + changeCollector.propertyChanged(visionName, propertyName, vision.properties[propertyName]) }.launchIn(this) //aggregate atomic changes diff --git a/visionforge-plotly/build.gradle.kts b/visionforge-plotly/build.gradle.kts index 9d313266..c4df8593 100644 --- a/visionforge-plotly/build.gradle.kts +++ b/visionforge-plotly/build.gradle.kts @@ -2,7 +2,7 @@ plugins { id("space.kscience.gradle.mpp") } -val plotlyVersion = "0.6.0" +val plotlyVersion = "0.6.1" kscience { jvm() diff --git a/visionforge-plotly/src/commonMain/kotlin/space/kscience/visionforge/plotly/VisionOfPlotly.kt b/visionforge-plotly/src/commonMain/kotlin/space/kscience/visionforge/plotly/VisionOfPlotly.kt index d5333dda..19d98171 100644 --- a/visionforge-plotly/src/commonMain/kotlin/space/kscience/visionforge/plotly/VisionOfPlotly.kt +++ b/visionforge-plotly/src/commonMain/kotlin/space/kscience/visionforge/plotly/VisionOfPlotly.kt @@ -33,8 +33,8 @@ public class VisionOfPlotly private constructor( @Transient override val properties: MutableVisionProperties = object : MutableVisionProperties { - override fun setMeta(name: Name, node: Meta?, notify: Boolean) { - meta.setMeta(name, node) + override fun set(name: Name, node: Meta?, notify: Boolean) { + meta[name] = node } override fun setValue(name: Name, value: Value?, notify: Boolean) { @@ -45,11 +45,11 @@ public class VisionOfPlotly private constructor( override val descriptor: MetaDescriptor? get() = this@VisionOfPlotly.descriptor - override fun getMeta( + override fun get( name: Name, inherit: Boolean?, includeStyles: Boolean?, - ): MutableMeta = meta.getMeta(name) ?: MutableMeta() + ): MutableMeta = meta[name] ?: MutableMeta() override fun getValue( name: Name, diff --git a/visionforge-server/src/main/kotlin/space/kscience/visionforge/server/VisionServer.kt b/visionforge-server/src/main/kotlin/space/kscience/visionforge/server/VisionServer.kt index 4c5e093a..3c5e397a 100644 --- a/visionforge-server/src/main/kotlin/space/kscience/visionforge/server/VisionServer.kt +++ b/visionforge-server/src/main/kotlin/space/kscience/visionforge/server/VisionServer.kt @@ -32,7 +32,7 @@ import kotlin.time.Duration.Companion.milliseconds public class VisionRoute( public val route: String, public val visionManager: VisionManager, - override val meta: ObservableMutableMeta = MutableMeta(), + override val meta: ObservableMutableMeta = ObservableMutableMeta(), ) : Configurable, ContextAware { public enum class Mode { diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Composite.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Composite.kt index 3cc6ff61..3ae6a681 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Composite.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Composite.kt @@ -39,7 +39,7 @@ public inline fun MutableVisionContainer.composite( } val res = Composite(type, children[0], children[1]) - res.properties.setMeta(Name.EMPTY, group.properties.own) + res.properties[Name.EMPTY] = group.properties.own setChild(name, res) return res diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Extruded.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Extruded.kt index 8276722e..c2157480 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Extruded.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Extruded.kt @@ -92,7 +92,7 @@ public class Extruded( } internal fun build(): Extruded = Extruded(shape, layers).apply { - this.properties.setMeta(Name.EMPTY, this@Builder.properties) + this.properties[Name.EMPTY] = this@Builder.properties } } diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solid.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solid.kt index a42427da..aab583a0 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solid.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solid.kt @@ -190,7 +190,7 @@ internal fun float32Vector( override fun setValue(thisRef: Solid, property: KProperty<*>, value: Float32Vector3D?) { if (value == null) { - thisRef.properties.setMeta(name, null) + thisRef.properties[name] = null } else { thisRef.properties[name + X_KEY] = value.x thisRef.properties[name + Y_KEY] = value.y diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidMaterial.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidMaterial.kt index 40857b14..c411cf4c 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidMaterial.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidMaterial.kt @@ -110,12 +110,12 @@ public val Solid.color: ColorAccessor get() = ColorAccessor(properties.root(true), MATERIAL_COLOR_KEY) public var Solid.material: SolidMaterial? - get() = SolidMaterial.read(properties.getMeta(MATERIAL_KEY)) - set(value) = properties.setMeta(MATERIAL_KEY, value?.meta) + get() = SolidMaterial.read(properties[MATERIAL_KEY]) + set(value) = properties.set(MATERIAL_KEY, value?.meta) @VisionBuilder public fun Solid.material(builder: SolidMaterial.() -> Unit) { - properties.getMeta(MATERIAL_KEY).updateWith(SolidMaterial, builder) + properties[MATERIAL_KEY].updateWith(SolidMaterial, builder) } public var Solid.opacity: Number? @@ -128,5 +128,5 @@ public var Solid.opacity: Number? @VisionBuilder public fun Solid.edges(enabled: Boolean = true, block: SolidMaterial.() -> Unit = {}) { properties[SolidMaterial.EDGES_ENABLED_KEY] = enabled - SolidMaterial.write(properties.getMeta(SolidMaterial.EDGES_MATERIAL_KEY)).apply(block) + SolidMaterial.write(properties[SolidMaterial.EDGES_MATERIAL_KEY]).apply(block) } \ No newline at end of file diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidReference.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidReference.kt index 32e69520..b832865c 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidReference.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidReference.kt @@ -162,7 +162,7 @@ internal class SolidReferenceChild( override val properties: MutableVisionProperties = object : MutableVisionProperties { override val descriptor: MetaDescriptor get() = this@SolidReferenceChild.descriptor - override val own: MutableMeta by lazy { owner.properties.getMeta(childToken(childName).asName()) } + override val own: MutableMeta by lazy { owner.properties[childToken(childName).asName()] } override fun getValue( name: Name, @@ -170,8 +170,8 @@ internal class SolidReferenceChild( includeStyles: Boolean?, ): Value? = own.getValue(name) ?: prototype.properties.getValue(name, inherit, includeStyles) - override fun setMeta(name: Name, node: Meta?, notify: Boolean) { - own.setMeta(name, node) + override fun set(name: Name, node: Meta?, notify: Boolean) { + own[name] = node } override fun setValue(name: Name, value: Value?, notify: Boolean) { diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Surface.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Surface.kt index 35f9b75f..cf442c62 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Surface.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Surface.kt @@ -155,7 +155,7 @@ public class Surface( } internal fun build(): Surface = Surface(layers).apply { - properties.setMeta(Name.EMPTY, this@Builder.properties) + properties[Name.EMPTY] = this@Builder.properties } } diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/geometry.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/geometry.kt index 58c3021d..8f799f2e 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/geometry.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/geometry.kt @@ -36,9 +36,9 @@ internal fun Meta.toVector2D(): Float32Vector2D = //} internal fun MetaProvider.point3D(default: Float = 0f) = Float32Euclidean3DSpace.vector( - getMeta(X_KEY).float ?: default, - getMeta(Y_KEY).float ?: default, - getMeta(Z_KEY).float ?: default + get(X_KEY).float ?: default, + get(Y_KEY).float ?: default, + get(Z_KEY).float ?: default ) diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/transform/RemoveSingleChild.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/transform/RemoveSingleChild.kt index cdc9caaf..bcf3baa9 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/transform/RemoveSingleChild.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/transform/RemoveSingleChild.kt @@ -19,7 +19,7 @@ internal fun Solid.updateFrom(other: Solid): Solid { scaleX *= other.scaleX scaleY *= other.scaleY scaleZ *= other.scaleZ - properties.setMeta(Name.EMPTY, other.properties.root()) + properties[Name.EMPTY] = other.properties.root() return this } diff --git a/visionforge-tables/build.gradle.kts b/visionforge-tables/build.gradle.kts index 33988cf0..f4197864 100644 --- a/visionforge-tables/build.gradle.kts +++ b/visionforge-tables/build.gradle.kts @@ -2,7 +2,7 @@ plugins { id("space.kscience.gradle.mpp") } -val tablesVersion = "0.2.1" +val tablesVersion = "0.3.0" kscience { jvm() diff --git a/visionforge-tables/src/commonTest/kotlin/space/kscience/visionforge/tables/VisionOfTableTest.kt b/visionforge-tables/src/commonTest/kotlin/space/kscience/visionforge/tables/VisionOfTableTest.kt index e1210ffa..def7017b 100644 --- a/visionforge-tables/src/commonTest/kotlin/space/kscience/visionforge/tables/VisionOfTableTest.kt +++ b/visionforge-tables/src/commonTest/kotlin/space/kscience/visionforge/tables/VisionOfTableTest.kt @@ -6,6 +6,7 @@ import space.kscience.dataforge.meta.double import space.kscience.dataforge.meta.int import space.kscience.tables.ColumnHeader import space.kscience.tables.ColumnTable +import space.kscience.tables.fill import space.kscience.tables.get import kotlin.math.pow import kotlin.test.Test @@ -18,7 +19,7 @@ internal class VisionOfTableTest { val y by ColumnHeader.typed() val table = ColumnTable(100) { - x.fill { it.asValue() } + fill(x, null) { it.asValue() } y.values = x.values.map { it?.double?.pow(2)?.asValue() } } diff --git a/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/ThreeFactory.kt b/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/ThreeFactory.kt index 122a2c30..09b81053 100644 --- a/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/ThreeFactory.kt +++ b/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/ThreeFactory.kt @@ -1,6 +1,6 @@ package space.kscience.visionforge.solid.three -import space.kscience.dataforge.misc.Type +import space.kscience.dataforge.misc.DfType import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.startsWith import space.kscience.visionforge.Vision @@ -17,7 +17,7 @@ import kotlin.reflect.KClass /** * Builder and updater for three.js object */ -@Type(TYPE) +@DfType(TYPE) public interface ThreeFactory { public val type: KClass diff --git a/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/ThreeLineFactory.kt b/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/ThreeLineFactory.kt index 42722254..68bfd7b2 100644 --- a/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/ThreeLineFactory.kt +++ b/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/ThreeLineFactory.kt @@ -24,7 +24,7 @@ public object ThreeLineFactory : ThreeFactory { } val material = ThreeMaterials.getLineMaterial( - vision.properties.getMeta(SolidMaterial.MATERIAL_KEY), + vision.properties[SolidMaterial.MATERIAL_KEY], false ) diff --git a/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/ThreeMaterials.kt b/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/ThreeMaterials.kt index 49667c8e..8e1b2e3f 100644 --- a/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/ThreeMaterials.kt +++ b/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/ThreeMaterials.kt @@ -83,7 +83,7 @@ public object ThreeMaterials { private val visionMaterialCache = HashMap() internal fun cacheMaterial(vision: Vision): Material = visionMaterialCache.getOrPut(vision) { - buildMaterial(vision.properties.getMeta(SolidMaterial.MATERIAL_KEY)).apply { + buildMaterial(vision.properties[SolidMaterial.MATERIAL_KEY]).apply { cached = true } } @@ -133,11 +133,11 @@ public fun Mesh.setMaterial(vision: Vision) { } else { material = vision.parent?.let { parent -> //TODO cache parent material - ThreeMaterials.buildMaterial(parent.properties.getMeta(SolidMaterial.MATERIAL_KEY)) + ThreeMaterials.buildMaterial(parent.properties[SolidMaterial.MATERIAL_KEY]) } ?: ThreeMaterials.cacheMaterial(vision) } } else { - material = ThreeMaterials.buildMaterial(vision.properties.getMeta(SolidMaterial.MATERIAL_KEY)) + material = ThreeMaterials.buildMaterial(vision.properties[SolidMaterial.MATERIAL_KEY]) } } @@ -153,18 +153,18 @@ public fun Mesh.updateMaterialProperty(vision: Vision, propertyName: Name) { when (propertyName) { SolidMaterial.MATERIAL_COLOR_KEY -> { material.asDynamic().color = - vision.properties.getMeta(SolidMaterial.MATERIAL_COLOR_KEY).threeColor() + vision.properties[SolidMaterial.MATERIAL_COLOR_KEY].threeColor() ?: ThreeMaterials.DEFAULT_COLOR } SolidMaterial.SPECULAR_COLOR_KEY -> { material.asDynamic().specular = - vision.properties.getMeta(SolidMaterial.SPECULAR_COLOR_KEY).threeColor() + vision.properties[SolidMaterial.SPECULAR_COLOR_KEY].threeColor() ?: ThreeMaterials.DEFAULT_COLOR } SolidMaterial.MATERIAL_EMISSIVE_COLOR_KEY -> { - material.asDynamic().emissive = vision.properties.getMeta(SolidMaterial.MATERIAL_EMISSIVE_COLOR_KEY) + material.asDynamic().emissive = vision.properties[SolidMaterial.MATERIAL_EMISSIVE_COLOR_KEY] .threeColor() ?: ThreeMaterials.BLACK_COLOR } diff --git a/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/ThreeMeshFactory.kt b/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/ThreeMeshFactory.kt index 4ba19998..2e5fc0ca 100644 --- a/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/ThreeMeshFactory.kt +++ b/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/ThreeMeshFactory.kt @@ -76,7 +76,7 @@ public fun Mesh.applyEdges(vision: Solid) { val edges = children.find { it.name == EDGES_OBJECT_NAME } as? LineSegments //inherited edges definition, enabled by default if (vision.properties.getValue(EDGES_ENABLED_KEY, inherit = false)?.boolean != false) { - val material = ThreeMaterials.getLineMaterial(vision.properties.getMeta(EDGES_MATERIAL_KEY), true) + val material = ThreeMaterials.getLineMaterial(vision.properties[EDGES_MATERIAL_KEY], true) if (edges == null) { add( LineSegments( From 9fc6f1e34ccfaf2c49775422e436a48ecdf077c6 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Tue, 5 Dec 2023 17:43:53 +0300 Subject: [PATCH 10/41] revert chagnes to client change collector --- .../kscience/visionforge/VisionClient.kt | 33 +++++++-------- .../kscience/visionforge/JsVisionClient.kt | 41 ++++++++----------- 2 files changed, 33 insertions(+), 41 deletions(-) diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionClient.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionClient.kt index 9d6a5561..20974f0c 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionClient.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionClient.kt @@ -2,8 +2,10 @@ package space.kscience.visionforge import kotlinx.coroutines.launch import space.kscience.dataforge.context.Plugin +import space.kscience.dataforge.meta.Meta import space.kscience.dataforge.meta.MetaRepr import space.kscience.dataforge.names.Name +import space.kscience.dataforge.names.parseAsName /** * A feedback client that communicates with a server and provides ability to propagate events and changes back to the model @@ -13,25 +15,24 @@ public interface VisionClient: Plugin { public suspend fun sendEvent(targetName: Name, event: VisionEvent) -// public fun notifyPropertyChanged(visionName: Name, propertyName: Name, item: Meta?) + public fun notifyPropertyChanged(visionName: Name, propertyName: Name, item: Meta?) } +public fun VisionClient.notifyPropertyChanged(visionName: Name, propertyName: String, item: Meta?) { + notifyPropertyChanged(visionName, propertyName.parseAsName(true), item) +} -//public fun VisionClient.notifyPropertyChanged(visionName: Name, propertyName: String, item: Meta?) { -// notifyPropertyChanged(visionName, propertyName.parseAsName(true), item) -//} -// -//public fun VisionClient.notifyPropertyChanged(visionName: Name, propertyName: String, item: Number) { -// notifyPropertyChanged(visionName, propertyName.parseAsName(true), Meta(item)) -//} -// -//public fun VisionClient.notifyPropertyChanged(visionName: Name, propertyName: String, item: String) { -// notifyPropertyChanged(visionName, propertyName.parseAsName(true), Meta(item)) -//} -// -//public fun VisionClient.notifyPropertyChanged(visionName: Name, propertyName: String, item: Boolean) { -// notifyPropertyChanged(visionName, propertyName.parseAsName(true), Meta(item)) -//} +public fun VisionClient.notifyPropertyChanged(visionName: Name, propertyName: String, item: Number) { + notifyPropertyChanged(visionName, propertyName.parseAsName(true), Meta(item)) +} + +public fun VisionClient.notifyPropertyChanged(visionName: Name, propertyName: String, item: String) { + notifyPropertyChanged(visionName, propertyName.parseAsName(true), Meta(item)) +} + +public fun VisionClient.notifyPropertyChanged(visionName: Name, propertyName: String, item: Boolean) { + notifyPropertyChanged(visionName, propertyName.parseAsName(true), Meta(item)) +} public fun VisionClient.sendEvent(targetName: Name, payload: MetaRepr): Unit { context.launch { diff --git a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/JsVisionClient.kt b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/JsVisionClient.kt index 17958f97..c7ada5fe 100644 --- a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/JsVisionClient.kt +++ b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/JsVisionClient.kt @@ -65,20 +65,21 @@ public class JsVisionClient : AbstractPlugin(), VisionClient { private fun Element.getFlag(attribute: String): Boolean = attributes[attribute]?.value != null -// private val mutex = Mutex() + private val mutex = Mutex() + private val rootChangeCollector = VisionChangeBuilder() -// /** -// * Communicate vision property changed from rendering engine to model -// */ -// private fun notifyPropertyChanged(visionName: Name, propertyName: Name, item: Meta?) { -// context.launch { -// mutex.withLock { -// changeCollector.propertyChanged(visionName, propertyName, item) -// } -// } -// } + /** + * Communicate vision property changed from rendering engine to model + */ + override fun notifyPropertyChanged(visionName: Name, propertyName: Name, item: Meta?) { + context.launch { + mutex.withLock { + rootChangeCollector.propertyChanged(visionName, propertyName, item) + } + } + } private val eventCollector by lazy { MutableSharedFlow>(meta["feedback.eventCache"].int ?: 100) @@ -139,7 +140,6 @@ public class JsVisionClient : AbstractPlugin(), VisionClient { } } - //Backward change propagation var feedbackJob: Job? = null @@ -148,29 +148,20 @@ public class JsVisionClient : AbstractPlugin(), VisionClient { onopen = { - - val mutex = Mutex() - - val changeCollector = VisionChangeBuilder() - feedbackJob = visionManager.context.launch { //launch a separate coroutine to send events to the backend eventCollector.filter { it.first == visionName }.onEach { send(visionManager.jsonFormat.encodeToString(VisionEvent.serializer(), it.second)) }.launchIn(this) - //launch backward property propagation - vision.properties.changes.onEach { propertyName: Name -> - changeCollector.propertyChanged(visionName, propertyName, vision.properties[propertyName]) - }.launchIn(this) - //aggregate atomic changes while (isActive) { delay(feedbackAggregationTime.milliseconds) - if (!changeCollector.isEmpty()) { + val visionChangeCollector = rootChangeCollector[name] + if (visionChangeCollector?.isEmpty() == false) { mutex.withLock { - eventCollector.emit(visionName to changeCollector.deepCopy(visionManager)) - changeCollector.reset() + eventCollector.emit(visionName to visionChangeCollector.deepCopy(visionManager)) + rootChangeCollector.reset() } } } From bce61c0fb0885a30c0bc0ce860425128d70e2ef0 Mon Sep 17 00:00:00 2001 From: darksnake Date: Tue, 5 Dec 2023 18:50:26 +0300 Subject: [PATCH 11/41] Html input events --- build.gradle.kts | 2 +- .../kscience/visionforge/ControlVision.kt | 9 +++++- .../kscience/visionforge/VisionClient.kt | 2 +- .../kscience/visionforge/html/VisionOfHtml.kt | 21 +++++++++++++- .../visionforge/ElementVisionRenderer.kt | 22 +++++++++++---- .../kscience/visionforge/JsVisionClient.kt | 5 ++-- .../kscience/visionforge/inputRenderers.kt | 28 +++++++++++-------- 7 files changed, 67 insertions(+), 22 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index b578696d..1a9de8d2 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -12,7 +12,7 @@ val fxVersion by extra("11") allprojects { group = "space.kscience" - version = "0.3.0-dev-17" + version = "0.3.0-dev-18" } subprojects { diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/ControlVision.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/ControlVision.kt index e0d44930..20525b90 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/ControlVision.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/ControlVision.kt @@ -11,6 +11,7 @@ import kotlinx.serialization.Serializable import space.kscience.dataforge.meta.Meta import space.kscience.dataforge.meta.MetaRepr import space.kscience.dataforge.meta.MutableMeta +import space.kscience.dataforge.meta.Value @Serializable @SerialName("control") @@ -60,4 +61,10 @@ public fun ClickControl.onClick(scope: CoroutineScope, block: suspend VisionClic @Serializable @SerialName("control.valueChange") -public class VisionValueChangeEvent(override val meta: Meta) : VisionControlEvent() \ No newline at end of file +public class VisionValueChangeEvent(override val meta: Meta) : VisionControlEvent() { + + public val value: Value? get() = meta.value +} + +public fun VisionValueChangeEvent(value: Value?): VisionValueChangeEvent = + VisionValueChangeEvent(Meta { this.value = value }) diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionClient.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionClient.kt index 20974f0c..e337fea0 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionClient.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionClient.kt @@ -34,7 +34,7 @@ public fun VisionClient.notifyPropertyChanged(visionName: Name, propertyName: St notifyPropertyChanged(visionName, propertyName.parseAsName(true), Meta(item)) } -public fun VisionClient.sendEvent(targetName: Name, payload: MetaRepr): Unit { +public fun VisionClient.sendMetaEvent(targetName: Name, payload: MetaRepr): Unit { context.launch { sendEvent(targetName, VisionMetaEvent(payload.toMeta())) } diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionOfHtml.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionOfHtml.kt index 9cc223e5..5e597702 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionOfHtml.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionOfHtml.kt @@ -1,13 +1,19 @@ package space.kscience.visionforge.html +import kotlinx.coroutines.flow.MutableSharedFlow +import kotlinx.coroutines.flow.SharedFlow import kotlinx.html.InputType import kotlinx.html.TagConsumer import kotlinx.html.stream.createHTML import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable +import kotlinx.serialization.Transient import space.kscience.dataforge.meta.* import space.kscience.dataforge.names.asName import space.kscience.visionforge.AbstractVision +import space.kscience.visionforge.ControlVision +import space.kscience.visionforge.VisionControlEvent +import space.kscience.visionforge.VisionValueChangeEvent @Serializable @@ -53,10 +59,23 @@ public enum class InputFeedbackMode { public open class VisionOfHtmlInput( public val inputType: String, public val feedbackMode: InputFeedbackMode = InputFeedbackMode.ONCHANGE, -) : VisionOfHtml() { +) : VisionOfHtml(), ControlVision { public var value: Value? by properties.value() public var disabled: Boolean by properties.boolean { false } public var fieldName: String? by properties.string() + + @Transient + private val mutableControlEventFlow = MutableSharedFlow() + + override val controlEventFlow: SharedFlow + get() = mutableControlEventFlow + + override fun dispatchControlEvent(event: VisionControlEvent) { + if(event is VisionValueChangeEvent){ + this.value = event.value + } + mutableControlEventFlow.tryEmit(event) + } } @Suppress("UnusedReceiverParameter") diff --git a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/ElementVisionRenderer.kt b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/ElementVisionRenderer.kt index 8e1254d9..f67172e5 100644 --- a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/ElementVisionRenderer.kt +++ b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/ElementVisionRenderer.kt @@ -34,7 +34,13 @@ public interface ElementVisionRenderer : Named { * Display the [vision] inside a given [element] replacing its current content. * @param meta additional parameters for rendering container */ - public fun render(element: Element, name: Name, vision: Vision, meta: Meta = Meta.EMPTY) + public fun render( + element: Element, + client: VisionClient, + name: Name, + vision: Vision, + meta: Meta = Meta.EMPTY, + ) public companion object { public const val TYPE: String = "elementVisionRenderer" @@ -49,7 +55,7 @@ public interface ElementVisionRenderer : Named { public class SingleTypeVisionRenderer( public val kClass: KClass, private val acceptRating: Int = ElementVisionRenderer.DEFAULT_RATING, - private val renderFunction: TagConsumer.(name: Name, vision: T, meta: Meta) -> Unit, + private val renderFunction: TagConsumer.(name: Name, client: VisionClient, vision: T, meta: Meta) -> Unit, ) : ElementVisionRenderer { @OptIn(InternalSerializationApi::class, ExperimentalSerializationApi::class) @@ -60,15 +66,21 @@ public class SingleTypeVisionRenderer( override fun rateVision(vision: Vision): Int = if (vision::class == kClass) acceptRating else ElementVisionRenderer.ZERO_RATING - override fun render(element: Element, name: Name, vision: Vision, meta: Meta) { + override fun render( + element: Element, + client: VisionClient, + name: Name, + vision: Vision, + meta: Meta, + ) { element.clear() element.append { - renderFunction(name, kClass.cast(vision), meta) + renderFunction(name, client, kClass.cast(vision), meta) } } } public inline fun ElementVisionRenderer( acceptRating: Int = ElementVisionRenderer.DEFAULT_RATING, - noinline renderFunction: TagConsumer.(name: Name, vision: T, meta: Meta) -> Unit, + noinline renderFunction: TagConsumer.(name: Name, client: VisionClient, vision: T, meta: Meta) -> Unit, ): ElementVisionRenderer = SingleTypeVisionRenderer(T::class, acceptRating, renderFunction) diff --git a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/JsVisionClient.kt b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/JsVisionClient.kt index c7ada5fe..c24ab493 100644 --- a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/JsVisionClient.kt +++ b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/JsVisionClient.kt @@ -94,8 +94,9 @@ public class JsVisionClient : AbstractPlugin(), VisionClient { private fun renderVision(element: Element, name: Name, vision: Vision, outputMeta: Meta) { vision.setAsRoot(visionManager) - val renderer = findRendererFor(vision) ?: error("Could not find renderer for ${vision::class}") - renderer.render(element, name, vision, outputMeta) + val renderer: ElementVisionRenderer = + findRendererFor(vision) ?: error("Could not find renderer for ${vision::class}") + renderer.render(element, this, name, vision, outputMeta) } private fun startVisionUpdate(element: Element, visionName: Name, vision: Vision, outputMeta: Meta) { diff --git a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/inputRenderers.kt b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/inputRenderers.kt index e1410752..f17ac78f 100644 --- a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/inputRenderers.kt +++ b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/inputRenderers.kt @@ -40,7 +40,7 @@ private fun HTMLInputElement.subscribeToInput(inputVision: VisionOfHtmlInput) { } internal val htmlVisionRenderer: ElementVisionRenderer = - ElementVisionRenderer { _, vision, _ -> + ElementVisionRenderer { _, _, vision, _ -> div {}.also { div -> div.subscribeToVision(vision) vision.useProperty(VisionOfPlainHtml::content) { @@ -50,12 +50,14 @@ internal val htmlVisionRenderer: ElementVisionRenderer = } internal val inputVisionRenderer: ElementVisionRenderer = - ElementVisionRenderer(acceptRating = ElementVisionRenderer.DEFAULT_RATING - 1) { _, vision, _ -> + ElementVisionRenderer( + acceptRating = ElementVisionRenderer.DEFAULT_RATING - 1 + ) { name, client, vision, _ -> input { type = InputType.text }.also { htmlInputElement -> val onEvent: (Event) -> Unit = { - vision.value = htmlInputElement.value.asValue() + client.sendEvent(name, VisionValueChangeEvent(htmlInputElement.value.asValue())) } @@ -74,12 +76,12 @@ internal val inputVisionRenderer: ElementVisionRenderer = } internal val checkboxVisionRenderer: ElementVisionRenderer = - ElementVisionRenderer { _, vision, _ -> + ElementVisionRenderer { name, client, vision, _ -> input { type = InputType.checkBox }.also { htmlInputElement -> val onEvent: (Event) -> Unit = { - vision.checked = htmlInputElement.checked + client.sendEvent(name, VisionValueChangeEvent(htmlInputElement.checked.asValue())) } @@ -98,12 +100,12 @@ internal val checkboxVisionRenderer: ElementVisionRenderer = } internal val textVisionRenderer: ElementVisionRenderer = - ElementVisionRenderer { _, vision, _ -> + ElementVisionRenderer { name, client, vision, _ -> input { type = InputType.text }.also { htmlInputElement -> val onEvent: (Event) -> Unit = { - vision.text = htmlInputElement.value + client.sendEvent(name, VisionValueChangeEvent(htmlInputElement.value.asValue())) } @@ -122,13 +124,15 @@ internal val textVisionRenderer: ElementVisionRenderer = } internal val numberVisionRenderer: ElementVisionRenderer = - ElementVisionRenderer { _, vision, _ -> + ElementVisionRenderer { name, client, vision, _ -> input { type = InputType.text }.also { htmlInputElement -> val onEvent: (Event) -> Unit = { - htmlInputElement.value.toDoubleOrNull()?.let { vision.number = it } + htmlInputElement.value.toDoubleOrNull()?.let { + client.sendEvent(name, VisionValueChangeEvent(it.asValue())) + } } when (vision.feedbackMode) { @@ -145,7 +149,7 @@ internal val numberVisionRenderer: ElementVisionRenderer = } internal val rangeVisionRenderer: ElementVisionRenderer = - ElementVisionRenderer { _, vision, _ -> + ElementVisionRenderer { name, client, vision, _ -> input { type = InputType.text min = vision.min.toString() @@ -154,7 +158,9 @@ internal val rangeVisionRenderer: ElementVisionRenderer = }.also { htmlInputElement -> val onEvent: (Event) -> Unit = { - htmlInputElement.value.toDoubleOrNull()?.let { vision.number = it } + htmlInputElement.value.toDoubleOrNull()?.let { + client.sendEvent(name, VisionValueChangeEvent(it.asValue())) + } } when (vision.feedbackMode) { From 05b87857f421df90bd4232311ae2b2f6e2a20aca Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Wed, 6 Dec 2023 23:01:22 +0300 Subject: [PATCH 12/41] Add input listeners --- .../ThreeWithControlsPlugin.kt | 7 +++-- .../kscience/visionforge/inputRenderers.kt | 28 ++++++++++++++----- .../visionforge/markup/MarkupPlugin.kt | 2 +- .../kscience/visionforge/plotly/plotlyJs.kt | 7 ++--- .../visionforge/tables/TableVisionJsPlugin.kt | 3 +- .../visionforge/solid/three/ThreePlugin.kt | 2 +- 6 files changed, 31 insertions(+), 18 deletions(-) diff --git a/ui/ring/src/jsMain/kotlin/space.kscience.visionforge.ring/ThreeWithControlsPlugin.kt b/ui/ring/src/jsMain/kotlin/space.kscience.visionforge.ring/ThreeWithControlsPlugin.kt index 94259b2f..a2223692 100644 --- a/ui/ring/src/jsMain/kotlin/space.kscience.visionforge.ring/ThreeWithControlsPlugin.kt +++ b/ui/ring/src/jsMain/kotlin/space.kscience.visionforge.ring/ThreeWithControlsPlugin.kt @@ -13,6 +13,7 @@ import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.asName import space.kscience.visionforge.ElementVisionRenderer import space.kscience.visionforge.Vision +import space.kscience.visionforge.VisionClient import space.kscience.visionforge.react.render import space.kscience.visionforge.solid.Solid import space.kscience.visionforge.solid.specifications.Canvas3DOptions @@ -26,9 +27,9 @@ public class ThreeWithControlsPlugin : AbstractPlugin(), ElementVisionRenderer { override fun rateVision(vision: Vision): Int = if (vision is Solid) ElementVisionRenderer.DEFAULT_RATING * 2 else ElementVisionRenderer.ZERO_RATING - override fun render(element: Element, name: Name, vision: Vision, meta: Meta) { - if(meta["controls.enabled"].boolean == false){ - three.render(element, name, vision, meta) + override fun render(element: Element, client: VisionClient, name: Name, vision: Vision, meta: Meta) { + if (meta["controls.enabled"].boolean == false) { + three.render(element, client, name, vision, meta) } else { space.kscience.visionforge.react.createRoot(element).render { child(ThreeCanvasWithControls) { diff --git a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/inputRenderers.kt b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/inputRenderers.kt index f17ac78f..a43a99f1 100644 --- a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/inputRenderers.kt +++ b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/inputRenderers.kt @@ -1,8 +1,11 @@ package space.kscience.visionforge import kotlinx.browser.document +import kotlinx.coroutines.launch +import kotlinx.dom.clear import kotlinx.html.InputType import kotlinx.html.div +import kotlinx.html.dom.append import kotlinx.html.js.input import org.w3c.dom.HTMLElement import org.w3c.dom.HTMLFormElement @@ -13,6 +16,7 @@ import org.w3c.xhr.FormData import space.kscience.dataforge.context.debug import space.kscience.dataforge.context.logger import space.kscience.dataforge.meta.* +import space.kscience.dataforge.names.Name import space.kscience.visionforge.html.* /** @@ -27,6 +31,12 @@ private fun HTMLElement.subscribeToVision(vision: VisionOfHtml) { } +private fun VisionClient.sendInputEvent(name: Name, value: Value?) { + context.launch { + sendEvent(name, VisionValueChangeEvent(value)) + } +} + /** * Subscribes the HTML input element to a given vision. * @@ -44,6 +54,10 @@ internal val htmlVisionRenderer: ElementVisionRenderer = div {}.also { div -> div.subscribeToVision(vision) vision.useProperty(VisionOfPlainHtml::content) { + div.clear() + div.append { + + } div.textContent = it } } @@ -57,7 +71,7 @@ internal val inputVisionRenderer: ElementVisionRenderer = type = InputType.text }.also { htmlInputElement -> val onEvent: (Event) -> Unit = { - client.sendEvent(name, VisionValueChangeEvent(htmlInputElement.value.asValue())) + client.sendInputEvent(name, htmlInputElement.value.asValue()) } @@ -81,7 +95,7 @@ internal val checkboxVisionRenderer: ElementVisionRenderer = type = InputType.checkBox }.also { htmlInputElement -> val onEvent: (Event) -> Unit = { - client.sendEvent(name, VisionValueChangeEvent(htmlInputElement.checked.asValue())) + client.sendInputEvent(name, htmlInputElement.value.asValue()) } @@ -105,7 +119,7 @@ internal val textVisionRenderer: ElementVisionRenderer = type = InputType.text }.also { htmlInputElement -> val onEvent: (Event) -> Unit = { - client.sendEvent(name, VisionValueChangeEvent(htmlInputElement.value.asValue())) + client.sendInputEvent(name, htmlInputElement.value.asValue()) } @@ -131,7 +145,7 @@ internal val numberVisionRenderer: ElementVisionRenderer = val onEvent: (Event) -> Unit = { htmlInputElement.value.toDoubleOrNull()?.let { - client.sendEvent(name, VisionValueChangeEvent(it.asValue())) + client.sendInputEvent(name, htmlInputElement.value.asValue()) } } @@ -159,7 +173,7 @@ internal val rangeVisionRenderer: ElementVisionRenderer = val onEvent: (Event) -> Unit = { htmlInputElement.value.toDoubleOrNull()?.let { - client.sendEvent(name, VisionValueChangeEvent(it.asValue())) + client.sendInputEvent(name, htmlInputElement.value.asValue()) } } @@ -200,7 +214,7 @@ internal fun FormData.toMeta(): Meta { } internal val formVisionRenderer: ElementVisionRenderer = - ElementVisionRenderer { _, vision, _ -> + ElementVisionRenderer { name, client, vision, _ -> val form = document.getElementById(vision.formId) as? HTMLFormElement ?: error("An element with id = '${vision.formId} is not a form") @@ -220,7 +234,7 @@ internal val formVisionRenderer: ElementVisionRenderer = form.onsubmit = { event -> event.preventDefault() val formData = FormData(form).toMeta() - vision.values = formData + client.sendMetaEvent(name, formData) console.info("Sent: ${formData.toMap()}") false } diff --git a/visionforge-markdown/src/jsMain/kotlin/space/kscience/visionforge/markup/MarkupPlugin.kt b/visionforge-markdown/src/jsMain/kotlin/space/kscience/visionforge/markup/MarkupPlugin.kt index ef700466..0d5e0431 100644 --- a/visionforge-markdown/src/jsMain/kotlin/space/kscience/visionforge/markup/MarkupPlugin.kt +++ b/visionforge-markdown/src/jsMain/kotlin/space/kscience/visionforge/markup/MarkupPlugin.kt @@ -27,7 +27,7 @@ public actual class MarkupPlugin : VisionPlugin(), ElementVisionRenderer { else -> ElementVisionRenderer.ZERO_RATING } - override fun render(element: Element, name: Name, vision: Vision, meta: Meta) { + override fun render(element: Element, client: VisionClient, name: Name, vision: Vision, meta: Meta) { require(vision is VisionOfMarkup) { "The vision is not a markup vision" } val div = document.createElement("div") val flavour = when (vision.format) { diff --git a/visionforge-plotly/src/jsMain/kotlin/space/kscience/visionforge/plotly/plotlyJs.kt b/visionforge-plotly/src/jsMain/kotlin/space/kscience/visionforge/plotly/plotlyJs.kt index 074be6dc..99a0795e 100644 --- a/visionforge-plotly/src/jsMain/kotlin/space/kscience/visionforge/plotly/plotlyJs.kt +++ b/visionforge-plotly/src/jsMain/kotlin/space/kscience/visionforge/plotly/plotlyJs.kt @@ -10,10 +10,7 @@ import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.asName import space.kscience.plotly.PlotlyConfig import space.kscience.plotly.plot -import space.kscience.visionforge.ElementVisionRenderer -import space.kscience.visionforge.JsVisionClient -import space.kscience.visionforge.Vision -import space.kscience.visionforge.VisionPlugin +import space.kscience.visionforge.* public actual class PlotlyPlugin : VisionPlugin(), ElementVisionRenderer { public val visionClient: JsVisionClient by require(JsVisionClient) @@ -27,7 +24,7 @@ public actual class PlotlyPlugin : VisionPlugin(), ElementVisionRenderer { else -> ElementVisionRenderer.ZERO_RATING } - override fun render(element: Element, name: Name, vision: Vision, meta: Meta) { + override fun render(element: Element, client: VisionClient, name: Name, vision: Vision, meta: Meta) { val plot = (vision as? VisionOfPlotly)?.plot ?: error("VisionOfPlotly expected but ${vision::class} found") val config = PlotlyConfig.read(meta) element.plot(config, plot) diff --git a/visionforge-tables/src/jsMain/kotlin/space/kscience/visionforge/tables/TableVisionJsPlugin.kt b/visionforge-tables/src/jsMain/kotlin/space/kscience/visionforge/tables/TableVisionJsPlugin.kt index 75977d79..18170686 100644 --- a/visionforge-tables/src/jsMain/kotlin/space/kscience/visionforge/tables/TableVisionJsPlugin.kt +++ b/visionforge-tables/src/jsMain/kotlin/space/kscience/visionforge/tables/TableVisionJsPlugin.kt @@ -14,6 +14,7 @@ import space.kscience.dataforge.names.asName import space.kscience.visionforge.ElementVisionRenderer import space.kscience.visionforge.JsVisionClient import space.kscience.visionforge.Vision +import space.kscience.visionforge.VisionClient import tabulator.Tabulator import tabulator.TabulatorFull @@ -34,7 +35,7 @@ public class TableVisionJsPlugin : AbstractPlugin(), ElementVisionRenderer { else -> ElementVisionRenderer.ZERO_RATING } - override fun render(element: Element, name: Name, vision: Vision, meta: Meta) { + override fun render(element: Element, client: VisionClient, name: Name, vision: Vision, meta: Meta) { val table: VisionOfTable = (vision as? VisionOfTable) ?: error("VisionOfTable expected but ${vision::class} found") diff --git a/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/ThreePlugin.kt b/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/ThreePlugin.kt index 7051f887..84552dd4 100644 --- a/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/ThreePlugin.kt +++ b/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/ThreePlugin.kt @@ -150,7 +150,7 @@ public class ThreePlugin : AbstractPlugin(), ElementVisionRenderer { render(vision) } - override fun render(element: Element, name: Name, vision: Vision, meta: Meta) { + override fun render(element: Element, client: VisionClient, name: Name, vision: Vision, meta: Meta) { renderSolid( element, vision as? Solid ?: error("Solid expected but ${vision::class} found"), From c5c3868786f4d6a38eb39c4e88cae5bc87261f3a Mon Sep 17 00:00:00 2001 From: Igor Dunaev Date: Sun, 10 Dec 2023 16:02:26 +0300 Subject: [PATCH 13/41] Add event display tutorial --- docs/images/event-display-final.png | Bin 0 -> 23507 bytes docs/images/event-display-selection.png | Bin 0 -> 29623 bytes docs/tutorials/tutorial-event-display.md | 416 +++++++++++++++++++++++ 3 files changed, 416 insertions(+) create mode 100644 docs/images/event-display-final.png create mode 100644 docs/images/event-display-selection.png create mode 100644 docs/tutorials/tutorial-event-display.md diff --git a/docs/images/event-display-final.png b/docs/images/event-display-final.png new file mode 100644 index 0000000000000000000000000000000000000000..d492e15b1057e10c99ac39d92aed37bf716902ab GIT binary patch literal 23507 zcmeIaXH-*f+9!`20)Y~In#)M z5>-$nqa?|pfhO~+s@1*sId|Xt&KTeOamTmYfxT9(Su@XBv*s$eqjK)drVUIRFbvxy zclM+zhOHxF*y?L^v|xnsb&(zT`e33dXDTOm1fv5t0CLqDY!$d7t^=1pudl7fFq&1X zG4O@?f}gG68p6OIrd4avw;#CP`|~;oTyy<|fphp*(O{dvcO>``0N2~W_e=0&af?c; z7+k{-9r{-UuGWH|U*BislvLORc=>U>cwsOfCx92{7ZAsZu?g^t3yF#g;sE_sv43y` zF-cl`?gjkau#lBik&~5Wv$MA~wXib5FqcTrhmvQ@WSGnKF2^0YaQxV9QR5fqoX&5# z`tkzTiJL0inS=WF1G@w*&Z=rNuWh>S!+P(+x?N^E`?S{{A7B0UbGh8dQ}T;?s^(j| zORq|Iw7a(ztzMiKP^*4q1WH(xfMSxc3$xf!K1ybvZ;Wp zeo~6k|Kox^$7&Cnt9}E%rwWft6j=;JQtp%`aUFi!|F)Y}=fUj5q4a9o$c+pOuBKnl zCiLAYdwb%^{a#_yQ?iGm+5Nd*o}OFwtKQJhQ+Fk=DxA{8N8g(nY?9Kze4OT<=5@MN z0x!9q&~H3{Nk~=kxw-V{H&&-b_B>fS zJX`KY!7JHIo>r~*x3P`WYg_Pm$1&7+1nOE^JUkHVy*D@4#$uAiE^jrx=%WUa7uQvCgv7r-Rw=&+|H>Rxmg;C8M8}EZIEyg2MDZ991Pf8tgUPa;x3Zx2(LJ} zhQoa9YzV}`Qj%R0_>ruwy$PEjuOKgu=ah?ulK{Ka1~v(MV^eX}lc#^80C$q?<_->a z;(UD0&d$8fcwSq3Gd_MXF)==z0H1&W4}jnyxY{@vxbWBz4nP!C94Ac(M)nqV4i>gH zY!Ih`p{=8XBs)8J&i0ExYda;S-{@@!KeYh#!RKON$H&i$v5)3#5aE=^x7a3vciV66ep1fa$;S{ssD%>s?8%*! zWQX*{jctuAjK$FNLU!pBVsCy;}PT+HsUcf;5Xsn7ZwpS5fC&L5Ee7~6Dm0y zf`fsLkqJZvkn>sqJOU;-BfN+qKM!6+z?er+(3GFYP}CUDV=QEh;}|inXkp{%^2Y;p3u_ZK z2Lq^0ei57izn~~y04IhQ62%Gs0iaiZLbo;8VM1j5PKz`@|8frAM^`a2J+|H{MMIJ`KH%05J=WNU0;>iR!H z!{A|)0Pw)%XDtYTzAGA{MwFV#Rq7q}*2)5f5*r%|3ULD?st5!FCljiM0WRtzBXa{A zGZT|%n)a6h_vt< zJHgh}!P&sxKC&QmQ1N{EK{QR`V|4R~VZ2u7XkM#SGy8cnuf24u` z2>2iG`bS;=kp})F;D5a9|1))M_+vX|VgsrmXRuicpFegJY_w<%70#T*R^Y$bqJ&3a zWWC*4EdquyyoEojg1H&M))`ypAg6R{T|fQ$t>RpE4eVfh&xXmJJg)B2GTiPQ8Z=!* znW!J;ReJ8DU&^-TJn62^>vG-O{4+Kl{)UQHuWtzUM;PY=f{5p~(`j=*qKMV*D(JqDwO_{Lb>y zg6UAQh{9NhCFSVqm6>zM#}#@@z%jqwuM3Rc3&gOF4NTqB+x^{MIK|mk z782g*4qGhMR&Q>EG^EDpe`TH?YI08G?H$$>mj=(xo7d=Ln0}sJV%K-(U6r5afF@+B z523aUc)a}vMi0KgM}?6FZ~#9t$LUDu0<={2{~h25dm*WCvh$CaM`MweJ9*k#MOcED z-L-=zluV(ntC6BL(tITrV=fz$EL=fi>)QVK-2g?uYatYZ#oEnX>S&TaTWKiqoEa(X1>zVla3PTgfYQ=v+} zXT9T*7js*#4cOJ?eCjPEgCEWd|T=PHL|vWFZrUsEm*M&>KgK9A2#^R|s?Nk09& zJEZPhzpWQOs$Np^6>Fa5pa%Ec3{cs2)u=5%&g8PG#ggjc;7;ozPlm70jik=cCk{O7 zwsGO=Y#%KOQH^VC{F3tZmSq2v#rf8Y&ll=9S7l3D?yER>zg{oqqjYGbElaNDm$@~z zmMP~J&YWhoS5FzSJ6S9>A22siVQG?;XKVb49AI{$-EBaH)L-~X-OPB@)+@+aH|crf z6SF}lQMP>y&62^aoq-iQvQ$bcD=bRX5^B5_=hUV8Jh#SObC2(?YZsvSatl~~A2yyI zO&n?92zGv19148yL^=%!0dp26*4nvaV}Z6h1g&!&M&0yGMVUXIgY&ED15 z_I&Wx&py_3Id7z#vO(X7qkUmprdMgzQb6RIuWPhF8o0qy@uB*43aC+5{@gU#J=J8 znk+33nf~C_dsojARl@FRK*>q#U!1vr#_Y%8lKQWmUi<}{bvRf1FP`_pJ=L3;druDY zJ~T3rx72gId2x6pB-rh)`m4mcm&#?K391&I_^h$y?2)g0BT_4@0}fxB2R!=T59AKb zCnknbva-HB9CG!R%g?a^0^mRLM@g(=3%!t1DRkzUI_mlNVqk{^bFvu3vmkhP= zT4W4;(^~S&_%xT)kTHL}^|B*~<)rN}^?mRVlzQ|kC8>VPMX5-$O6lk!|CGL}ZOZjy z92Wv>s+Kw>c{^EhjChy&XC?4`{*kTZUyy!NJ-rIRqE2A%>k~WC1Tln@@gv&G6I&)o9=VfVeyy@TkQU{k39Q= zujl)j5Yt4%Rx7U`rCQ`Mk)FDF*Hej;hRZJ9&-S>1G3k}M)H7cDo1DeCb0j9MSXQck zOqC1;MNYn2PiEHM@<(3$3oMB}4eWu=RUZdOYXmUeufV%+wC4XmE5s(342F^s?{Fm7w(K zh!s%wiCOoU>}d*8*IjfhUM%l4n^qgE>8_WGSn$sFjxJeB4J%>G;Ao#83+(o?Gh^{s zY?hcvz<(O(J3sfWvp?RZY}+Jx%>QhT)UE!6l?8K_vLc3ysn}ahuPI1^q)}gC!Mavzy22 z8|nkL zC;Hp$Y@3+vzRqyFnh*|KbRMwIW)2K*idOEPx}rK5ogE`BYHhZ{gXhb~HSn#dg@2J| z+m}5Y9V8xCYZD_^t9H?B-rJk6fv@mr#;E6!;0h20YOGaB$719iE1rc-Kf8zTPM1!Y zSiNxeqMGaI9YM#ABm0~>MYE!$9QJ3b)@L4@eUOi=#yJP zLU*)egG;xvz|xz0c(UHUhUEwCYE3gm4Vlg@HVu-SN>=3J_3R8fmRpk=M=~s1G8F<_ z8X2UI?wePBKOEyF-M}|*(kIAJePv;jlH6)g9BJTSVPt;#N=EN_y&4A377n2(d`~Fe zUWKyqeji0yA^7O$9Ph59+A0*m>}@zRoGqhtc)BLOz$(NmYA{eW#HzSj zV?ba!SkYoWcj0CHa>^@$a{U3q{PESFo~S=M7r`8JAbZx?ri2_8&{>^53DRv>IGKX! zn$>I1kHt4y+nr_5S}ARFSa_};C@ASnuwg0DVOSW>Pdqm(o3i)VLC(lLvoBX3HO_qH ztz?y83+Qli){V-M$%>~e?{RIb7`PPD=-4T+FqUtl>$+U-G3=Bo6h%(-(jm9SctuJ3 zy9yCnr)o$~meSn__v9V-_H{j)smtFdf7nrz??9cXuupU`o>JHtdYIDjn16`*VFSZ( z%uL+#_7?Y^duMFsuSwo*nd+1(*fbKH9rwIe{FqtgaXfzR^Pah{_hy9s-cL7`L`D_6 zT*@BNjmXqG=Dsh-TYPEcahr5^*{!AfjV0$FNmsjvX3?ICm+S9}17O!-r!SM&b*uuC?-q4_QZxLlx<5Y)8C95EApXHTL z7Vn~)6ZMpY#a)bjDHaip$q%Duz8)FTb>)8)vD4XmBP$`xbird_(I|cHlFp|%qk^fn z{@h{7?h0*6SLDIZih14hi$?9T_CMmSFVG;>}99q^rdj=fdMq3noDP-=jv};Kc6C*57x`dlv49vr;x)L-3g%ew? z%qM%6!tk!=0xQ&6JViHIuZvUaq&(g&5;yQ|p+Pj6KT-JkWRIG~%aQ2tb8*j2M>3nA zD=@80NLxf+PzsMv`1UP9ZA99|O9r^I=6SyN_d$`S`B8qO)+8v#yvQCf#&nzVKM4W|35z@;e6Fp9%BTE?9OyUzjA{OMMr$5+2kn=m+I}^$t`7!z zv-8q@aYo8Dei1fx&vokFcNEDd`b7jK5-NM%c#2dX8j~EW(6Y#>OR9Onq4TJ5YWR`v z#zM)Qloa9Msy8n?2b-s_w-V-pLwY_nIM;bU&aQcA7DA|4j?rDuEulcx;NvarNEB-S zR5Y~6d7;&8Wa@BHm`KN!nuyeruuqpfGx`=n29xDdr7UZ_Z`nJZj?N$WzWBr0yZ*+& z=f*FB@m?OXv@C@W7OcYq->Y@j>6J)HlvRy+`iq4%J2ljVYsrc8;o4N29L7}N6V&vS z4_U@>$hAgQ%{3J1)wbQLulGt&u5Y`d8kT;$`->ot+EBmg{U@F~T`oFWf6;cYRbLSl zvQ-cK90e*2+CObDKm>TFi0mYR_Nu9fFWPIPtT<(TTo zV+GG`UKKTb3q7DV-^+(jFiHqwN=OhNlI_<>l$DQai8t-KHX!&SoiwK>FB?G_%?ccB z&FJflSCvzBqa@D=MX6@E6*P``+KZ3yuP}276@{y|stQytmth#`?g6-O;?}fwn;Lvr z6?!L3Rc^jmuZ9V4@%?$@)Q>P;q4x#VI(sKuf|}IchmW03kH1K+>QT*~9)7Hu>rhH{fXK+>{Hl#}17^-Odb@U4t?Rqc%56FI zgo^jylDx6kGXy^6y(W zdW;SZtD6Zw7wF5c$?XpgSO~0V@1#2)7B*O;Ws$p7>1yWjj1{;GNxpaM2k^DQyZQBK z@hy`fGrrm;-W7M!F!|~Iz8fTb=<}ZorUKppXVk<_)N|P`o8zBR!-gX$d^)gy-BZn>T^@Q>5#L6 z&XKU0ulMto66dxgHx`-Y7f-84hl+|MYN%OfoRV6ZW0@nD@9OIa>68F}` z-ChgDL-^=C4(ZwUq2`eflApS_Y5Tih?SFqJn*3C%$!%T#i`vS*kpA`uA)o|Ah-0$A~gM6i46y z;6-CZjJIrYj&s1=@#l>P3P!$&l}H*^Tj4;Vw`^_gztVh4ELT}6@N)(^$16CaDgOYc z)%1W>+FbP94EI9+>^Cy+hRZny{!EUBgI+@H$3}`T&q(!@2pA;Drcb*!`SCc`M(au8 z_e#z7T4j8D!0a%WtKKAWP`YqXVPNvsqx9|v$|fYzljd%Pkp3qkJ3(4{L>}^Ks%x>N zL{k!M{YwT$Tvu}4oFp7N3muyz2VA-gnyqxnawDY3S+ZVlSM$Z5AJ$S)t5(w*e>JPG za#XI3#k{HXny@8c=E85w+(@f{B)6I(Kn;h-?vO@ZAJMMJ3(`<8VxL{dF%%bx69#Lb; zqVtkhUeBjT0%^jDBi<)?=RSIcd6e4hNneh&a$X$E7(IWhSB-4baW$u5aypsyy;#9W zkR+w$*n!lssQQtdFAIG7L&D<1{mhLIxM%i6mR|NgM5(a}G3eKhy5}7EU~FI7RoWRn zk-b*#cFRNA>sj67+QYLLY7XV-1{)Q0gpdQ;g!d*DoStX+%H^($lk%Z7OAUQFx}59C zv>Y=x;w(}neU3GHzmHT@azN33opS{oyS$w4EAO1$N$_U%th*+2nE=@=WGlCbYN z3rY&?@tqwc(3{1p-p_gQCf&kqX>6`^^U6b|piI*HpIYBSGSt)Gt5^RbqhU!n76F!!BcUl!qn+~)WBpAK7 z7n2?>qICG}6{#E7h<$kA3=?<@kfsQm;P6Adp0@5kX>-Fl|5yERDqtf|y|Pp3fz&WA zcn{Wc)!9K)$&l85)M|wzv21^^@;|(m_y_Q(2maS@ZT?ZuKk9)I^_N$9|2W0}CZ~7` z7Xz?jFg+6|i&z}WZO03vOWx^D4&y{lPXAW@Uo%L#DJtfj?> z!HTe8#mxJ{Eqin#?eikfM^Lt2TZQQ#+KMQLUwh2ty6emu2&#ZUHRbLyyY8BvJ*5xW zbwyrA>@_}rO~j)4p|jQI@bZNmEKX=^$wpCBuo=0R2MPJL-zbFq`aD6?FUBcevRS7F+shs&YG zmuyg<>k#AH{g+&xI3ndpA+VitJ!^L!ga8GIR5;JWU7Ab~F*0J(iJ9)Tk41nDiC>WJ z^lzr$-32^Gg9S}D;g|$fg$$Vu3Y~WHq%L@5zKk$+aH2=m9Pm*l`@Ic?ciwFTk9ne? zoGLht37TXrpza@A5_W@PEcr1U{y@XC+qJrPa^0JhcN>%FS(iJ&WWmiefFBurmLRw5 zDIgohhMYxX&%y*e*ian-XQt6K2SCO&!yt8{$-zk)LDpxLU-kl! z;JAQ5Oe?(#0Z}Z*4^l|l3WUnk?zL~GTmgEBhn(o&L|8BlYDvh!&WF{O|9Cy^3nY4l zjCt=6R1}s;52Z|dM~b+OQ1aY_D3fnoKzHR3ROTA>Q8JQvE&C+Rhj4FNf0nCvj|0^W ze%=k(-F^#B19dC1H@N!uqYI?1+#%K3%s@0#YWT;N?*$2m5hxb206#JY(EKWF8qxqI zmTB{Q{O5^?OmiS4n4pi`0M7XPa*lZY^=5VeAu~ixP9L7$XSr+(@*OS!u}azsvQdg4 zAXFQP1_12epTUqR^+U5WnPv`xaNA7HQ(($}R~ubQ`e-z?2~gOH92G$SJnykqoi_xI zW3fA^h%}Sz^M*H_hMq{xV&K`&vmYPWwH^Z1vi|Lnk?kL-b_J7vX68Rn&if92EypA1 z?<7=Fp=uO3;U1Jyh^LN(RM(E)Kh^OAga@lK%3J{9pU>-{Km%jM>wm4FiPxEsLB|OU zzwrUEzqb*1_!~2EXPh=K44b3qNX**4T|L;*fS5yG(ZGh)e|ruFV)(T|$mIGNc~lhe z5!IsGLwA5*qXKSy?_c%6b2?937znDl21yTK{+-)dO`xMgA*-<1n=k{!b}fEqfq>Ig z>CO312PBL94>$n)zk13Bo2jpEvREu*Rd4!!3?mu-tL4F*e?K0?dY(5VqCL7`CTkr= zET=BizmO9(V)K%_U{vdu|J5>J=nqAk);oculVbL#4D%T)Gk^;% zD;UO{&(-l6ri$Qt4nq2*)>#!0e((h1op@NP8hIiI1OuU{KdM%e; zrNWE@!%m`wPyL)Wn1szB-PCOjxt8as6OzrBx)TUPiwvN7^6*tHO<$9d`mSaC@x`?m z@hSp-vnAw-_H{lCQ$%$n@!0KZyONZlHF_8pdIx2en~WiM-UI=Nqh}yzMB3ZcigM!s z0kt?KaecRUhu~aIvYiyqlwIyCv*}L(Gcr5g_O29XUoI~0{sF3$9`ej$&`6dd3MeIk zJdf6xYKXP*6f(%Wq>9|5vox3teF_nZ0zR55b=MmRZYhAUlZK%{j8NL)#kZt;0+t_b$XU9ciai^P>(qn4Y)c$kehtz()~KK1 zbxGnhKp``L{NUUXq1?M9h$fml7EqZ@ew;ga$s7!bDj~CnG1Ja?7D`RmgCYGFw~EIW zwE1S1zwNyMkTQMtNVZS>DA*K!_YHVFQ6$;FP~5f#vT&g_Ddz5-=V~_`w!uej$h%|R z)FijLu!bmvJ=p03h~-x7_y8VmdNnuLPpI(y*z)BhWcEc2Vr4gv;iC0b9{GG4a2}Z0 zyJWN;z~1hO4lU4N!S74};CeZENmqAU32o2bUZS%R z{POPyj%_6H=vtPCklj#2T0Gc_U@a)kugM4~rs?t?`ewNfWZWIU^*;^QS%s~OqLsmr z%U(D4I?7U^8Pvb}xhYVJU^CjQ;I9>L8ux+rv_|XHkzTP9`er=1f7`bK=#hAr&ZXz8 zZ1g%1#f%~A^}z%1A)?kDaYOECSla@Six`TmVg3N_P#7P<08|lu!r%@9hW$5{RB5cuK>-~yau^ak(@W-RVI-wdcsF*(Rwu7)1BqkF5 zTM+k{J_D?2NpGn)yh!Pxx5we!np)%p;7W#(1JoIq0RIFWKZ?d>XupF5fT_^@%HeEu z7i9o5e)^Me|G{+!X{k#@x)DN&AiJ%;4F#6DL(L;4*3No60oqtY#KJzsWy1h~Kt%vz z>^i-G<9IMpE&HR$CI*Z)qSQ}3K0mJa1gcks6+zLS*gYc!a0(%_5$~PU2kLc0>b-bd zuM4WMk$S}2h8^tgupm@F=E{s;FR8yl0K`?$eguGFY}5nbxeyE2$)HHVPH%$_T7`;j<}K-@W^nf+7$s&fm+|*e z>z`M~-AvHeOc3dE*EAUGBsQoVnX7IJGM^D@Y9fccP+9roN;JLQQwz?C{bQA;p5cDb zZn|U)PbdFT_pkX~z*4Uw(|%1BhXgU)`ubJSbEw@0#Wx2f0WXWtzlr#_Q1V!6y8yQy zS-pm;SJHMkS7qBDK7p*XL5&24Wq43{=x_CM0gePDiqkq7+y85WswuBM`Mdb``oL*F&gO+y^Jhp*2AL*eSF#1{WCBET;w5(|dzt zb`(q`(I6=l<^4%CLI5K3+mo>csiu2H-m|+lfcrQlspz{U@pvu!6=1IMgq(hl&V&eP z|945xxu2AaJnp*%6Gk7}04W*|FnSD7cKQNXHV(v+A))e1AjbnRKy-Dbh0)~~U&!Em zcFIwbk1!z%_?5Bmk}=0%;PZZ=;*kGYVjg^tz00xET#>MscTY%pR(}hy!y; zQz-WAg74@9z!y|nqrh>(HUI*|6Jd~!{)28hD*=EOdu#@?5%D9+4qQG^$t3fX8xT|g z1(}~I1o-LV-~yw16D}Mj|5&t_hr?9k{a;^cS;5rc4)mjMfSh5C@X&>pq>Hd5!a_g) zs#V4x6#~=+;MrjQXpeW!N`Gs++3KNjWBmB8h7thU4;M4tOHioY1FExaZS3u2Y-y>p4GYqtIB8G=v2FMzmx{& z4ig~B1o21T7d}&Tk>|K3*4HF8JqGoPhdoL92#&h1B9?Lf&<|p2V+ek5ZDAS4Av?6)sl?I1uy_I;E+i zPW9uWR~U=7i(kG^Li~H8XyCrl>0wX%?dr;%*)bw*Z<{){Kb z?nLse)t>;_U4J)3*F_vJNP2QSw-4uL`@`xG%|;U7qzt-+3>lb2{_y&ewfUTMO}kIu zIt|)enxJmQcB7&u+@vK(s_D9&l7WL&j~~;uawj3!?-l3BC%@$9w zY<0S5yv-M;YisoZnL;Qp8~wMC%ZmGaLKwocZs>o5A~8WsDncJap4j_#eKIs1prQ#y zdo*>qS(7UzG!wG&hvP;@@z!6IFWju&dLRw1lQ>DJj29KAMe>IaeG4fcrgS(_w3?f> zcxmqy1C5a35<&bPHWQ~VwDwybby6BVoWvDqp?BpV-A3rD3aF9xG<4=rV9RyjD$|wT z9VbAgj&Y$L!O^-*zT_9vd)@%hMzp%@%-Kvje20{IiV-*r8%hJ3ZS}03-YfGs>|SZ+ zX*fHKrWt?Iy^_qP_-c&- zAmmSl9Nk2!R9sgUv!Dl2nuoxUIBH`BQI>V~A4h|z-FB4M3=Iz8_tSwi{1#=%dl5%4 z)~!C@7V{Wy0I&KES85{r;^Ks7cBcZpZ?%~$MDPM(-EL5ad7P#99qOkJBCOjD64795 z-EGJ#b;ag7v3}L;hpX7m8{Zbiwm`&H$V*Of@nEd@ee^jo+n})eV#usFKCK?#&%fJ7 zn$r+Q4)TFmx`^qQRiQ^{%RJ4H4ntAvb^DVqh}uH^JxJ{Vm9PCLkYH)}15hwObeiwf z?VZHUcS>=KZFJBo6d3PB_LB^xTmB`dkMABmcI-MNh7yE|UyO9I2t_D@!S|}!87S~9 zst>n6D@W8O`qAJe6msR}l2Bv&>-TI0f)T%&5i;`jRk>b5En#XSPSsIK!wou zQl9P~_M$2dJ4##T&~LK>vZ0DF)H3m9)JD>Y9l*DFpe-;uS$bcKx?nt5mZ_~q zIyrh@iT-zCzy$foNq2(vcYdzB;AZSuLtM{7(mD{9$lM>c!|3C#1Np2Gbs}Q541p(N zA5j(YfOnn#@z9<1KAxK~%n{M*dI$Kq`|-`PbXI*qib8A1#f^aMO=K)9MZYbswt5S& zdJ95^2Az-6lbxM20suXA$9wH9&<7@uEF?o~h}$xgwggt?X(TKgo>Th0q;&l0PT6hWch zY&FD*Q35?d^zb7$(0EEylieC?{^B}J*!C;k% zd)t*eHuQm#F_fPPG;|Wk`r%KqE}9C6_PGx(t;UE>h$oU9ltBiS5?I#}{@e~qEiB%w zq03{$0__bX!vi1{rb9Qz^wShpY0~R17rmcgv2u>t2@0YklOHIaF+=4Y(#1)@9uI_v zg2z|iF5Q^wnIg0@GkN7Wc;#qlTd&-#TaEUlV0W?!aQ|y}a*jUQIXM~ZN;0YMQ%w)i zHcjjP)H0Qa^4q0zO${x;9Ic3nSUSV;+35@oz#a?&R0!{Y`lxRSJliVXaU?SSWXHgu2ZyRJ@riQzQlAB%>E<^ds=<8 zr^*m7JlCj>!v!yyRbOSB4g&;EqIz62l99gVkScw&QGPR2M@`>Av*ctkD5?skinlG@<7ln<=(ySBn{0^`M`mY}U22f## za4(y~-nPMD1{S39Rji4_j#z}FjUn~c&g<9W zA~%wxLV$V1LSZU@v-SG5KxS{2_W8NYw^O!FjwRkNpa(?5-4byxbHzsf-I^_N*f1IF zuil{wKfKG$JXSDAdq>gRDZnRnr(}MYkv`}h0R%cx8+FrU?qwI$gB*E5d(~Z|L6G}) zBW->VtY1%?yVy(zGD7hBz9EYgfLk6&f*p zBrXUpLs+aPYMt1CI11lD`-VIRn07=-h?WsH1c_Twv>u=?cai1nc)tEhXo1 zK7`(5D1S0--ek=q}-K&kpg`?uiah-rD$ z(DcotVPaf+ejMaaP55^KfKxCw$*z{2YXc(gM#?23<(fZ28%i3g80M%X{(u1!0XSi# zidcT63Susrb$Wd%X~GOBQw1%Pu~$#vf}RbDn}H_C?s7cLN@owdBK@A!M_b&IP_zLS zN7jf$T?82&hzd*DdVRmJ8ECD2AE$@+Hhp5y_A0_iBlLzxpz5knoZ*0Tfty~G%io=# z^UbdZj>qVO+Kmr_`=M$`_Gkx=+oJ}t;P{~D6W^~dwbN;Ggr{F{=p{YL3W**17)`|$ zED^4Ype@y#wAhrPPcyxrPXP5&yF2%qZ*>KEmFpuLR$PV6J?xa7B>eJ2^`y%7{h=Do zWH13W`><2u^rdfh^Jrd)Vbv{X01l4IhFJ5~_Jlzlmi#*tN1z&vW#xFU=$^g9=L+IU=@bDZMXGD^*qg`W}9Y2tXYH^9BZ6 zX5kw+wl4r9w4nV1Y3&Kz`5At|5iPU~X2Z4yADlA8(SC8}C|F;pzSG4Jy-hLMeJ9uq zQ9CHRNrdZ(*NQ;u89}PhKe#_Mkir45>_k`uQ1f3CnHCFMUm8RLeOsciBzlDqTJdeV z07S$Cqt{F801cFXuo{v&j*wmtGKdaRcFkEjP(J{F&!l!j*V2_LmPgZI#B9`K!j8Tp zTo1EX26`Pqy#wqfZbw^m%20Z7=M1nh>OsmF+|aKW-Uo16Bb?ji>H1h^0M`!!k)O#- z%&0}dcs)3E)inl4Z;fI+cI&Ncwi&vpJ+)Yly8SBqn`8;^VCR+k+Ui9pV~rOpxP9J( zOhQ*mxZe8NQKzN2@Dgxp(7A#+Nro$WTic8~V5f@;RW>PFJ@4V49>1qq2OhIBbH0kU;6o`%QQ7K{fFtKa0V>5V6K;hoSabkQj33NN{?!&?W zYdb}!>ofv*;-z9cKC@qwKKhmru!Ie@hx#mRL$uj_0732e5Up->wL0iHH!*1`1C}%p z&kv#)BfTX7jLn2OYyc7yhs%0l#~{pj-&0U!dAepX0s)l}3;OoAwk5$7$&%{?V4F~W z!$O0Hp4gh*2XoN|9wV^>I$wZtyI81i-FEh(#59N2OYAOa=!S2Q(g%emaX&&ED|#Yr zC zitn(RhYKaO$^CNY;Wenwgf?*)k&*od6|E*h%P5~*zg`&5@1Y(#G59Pk1AhyR=X#!)K5&*_rhnZ zbv9c=&fZb)MR6u{qxqu&O+tt~btS|&YbGKQgEBT~F~oR72gOR`LGBx465ZHz5H+20coW*$A<~i zXY(~+^8T>T|DF}y(&@GAC~kmk#NU61iH-W=4vgKV#v!=+|2Noo>j-dc2z^G$7+8Ve e=f79Z_tn>ULmv>?o~A)qxl`v(rkv2f{(k_OYjRrv literal 0 HcmV?d00001 diff --git a/docs/images/event-display-selection.png b/docs/images/event-display-selection.png new file mode 100644 index 0000000000000000000000000000000000000000..cb50a83e73f5a324a46fc5c9b4fcf3ad34205798 GIT binary patch literal 29623 zcmeFZ2T)Ym)<4>cf`Wh%l#B@lo1C*UihzJamW(8!$xY5C7z3anInM}4&N+*Mk|lHl z4K%qWHrPOudHWo^bMMUkZvE@4djD7Ts_xOQK4+i3*Iw(l!d`ow)4aH^rbtW8M2$co zXqE2%qJcnA1tJg>PmWQ7mZ&RTqu{ICQcuZBNr@YA3|xSohmIf)fwMp=aQgH72?YXi z_z(pGd?A9s=QKEn`amD1Lr3B7*WjG_=lMHue(h%;XpF$2!w6dNod7<9;QTE3&H^8s z;Dfp9z&Ugrga6fnv!meik8edK)%zTRyaN2ZLZVi4%c$5`IyTnwu)p#116?ZJn7J9E ze}qzJ6`cG-`_kuMg4WNl?VV~#z8ZZmkNUg>!~Lh!Uss;)HxeB>Ci>pTpH)UYX2k8C zr+88=pKXT2x0H=Y9@^<@h{UX5;~EyYW0=g7-rBrA-^^ z&li{d@8I82eJq#XkHZ=GuxHTAM^!10AgF>HJYN)HWkyGEBe;6&q1|1?ty!0dYO7&c zV1u4ET6(T}s`n(#9qoC|EF2$N@_O1kK?*}i%XvDPnWHRSIUZVC+c?NvBv#j71xK|X>aF%mh_al2-B4W z=TI}>MGm-&D@x{~9XE*4gj8o%86NdjESTzur} z>Lkg>=i%YO>mkJJ=wi($AR!^a$1lhyD2N0-kZ3OlS2Itf1Nss~;(*34mS}Sq8z)yA zM+XjwrrASBH&>a97r}jwfADATq^kNSc?a}Q6aXH4o@P#b0=)cu_V#@LIs)x_+Z_=3 z$0e1$nEyH6$<4(M7RSPz&(hA)9&|;6Sq1(w zCFF5`j({Mrwy}4DM**<^($m$(>Yrf!g*WI9EY80&0*3!d_b3JaNwAs>qH3n489EQLjctR9+) znmzm%66!8Cz$(q`{*^0;lm#FqEFmKF&{9YMDJ~!=h7^7%E`pS>GM7LKnF&}~S(u56 z2v~~1q%6!O?>M^Hn*nv&*qd2f@;NzJ!#5znC2!tWlDR0z%m2@o`*vooR$ze4#d|gm zZl3?Vp=D!lsp)D4p(!B7FDM`^Ato#YKEnJ56T$R!EM3sR5+Ry!?1YCyYLNuO0AS4^ zI|T&bb|8zSf{Ue@tD}pSqobY7#XqC&pSM+kJ6V{yn*CztY6*z`8Hct05r=vBg(Ue8 z*oVleI$GFRdHtVyL(an?4f+F>-?c%5`Muz#1CP?QbUwH`xU{o@U5SGOb_z)|^8*pk zX6}{;`UbQPZkazabFj7q(c`DN{-fRIe=r3rVG)6cqWt_wApv1gq_DY&I8s9Np%_xY z(o9&wLRipJL`(uk;ZN#lM=MtkGZ)L7)&NI<6);bDh2ppdE9&}RdwV>xgtPzvLkb8Y z`6d1i7~fBU`JkBb4~eDu{tXjpxWm5$88Ggk4FoR`3;F&GhCeX_{QloOe(K`?<`f(p z|DEK2h3|ji`Y&AnD+K;mo&RfH|Ap&+g~0!+^M9@D|24R%|GAyAbO2e92iPp#rV$JS z8!gI*DvG}#_Mv|%wHXnh<+#(`2WSL>?i2Jm6v;!!3>v9il~iw25l$RG!@#(Ahwd5z z!GTcv<))VB(87pUOr+cH{t7ns`R#R8!|s#6oN|8NXZY%dNM!qPM_0&d)+!1ag?ltZt#q}bq2kbCLEPpp=l8oGt_d}@%Y?PKIUC(*YL6xR zC8P6%x=5SDX?wd=T89B6;E*rZ&C=pN%>VQ1kk$pL@&FEbfnyEu38)xw!sQ8Yb@mzJ z#6jczlOlJ(SxIyyI=MBsd^GYwu@&&wJ*Mrgt}MQ>yh?)JB;dgw z=G@0eZB3ia#>_Jf>>X`9j;iK)GVZSKdlN=BORsU?wmkP-2UTNxt0a>rD~HjW4>rHo z;jAYH+=@rH<}D-a-8;9{_LSIc=U$S3=XGVPNgvV*!6Q+uZoZUi`*xIm?%tG1PWLcz z(k`^a?@D`7`ScbITqFAoSHivmi*oKi4~(lDed7yz-R|a&-F9LT zUT615I@A4rNr}0aIMQd<==uciw5+NsbI0`_9O-E>Z+kb9^-Vc#KJU`F7X{V(&G9x( zkEMvs;XO^kxsICBN;l&?IX~ObYA;vWAC-7c+Sh4~ zrTTXn)B7(1?@ejQfy|-mP4mup-;2Thg*J5OTPf>oXJ)I(TzqVpk*8vk0fQYk4e=|z z`p_kuL)EX%jOmT&kUK<$N#aW?Jlx;JdDCa#_DR9&hoAmE2|>u##W1oK;@-=&!yZJFeE{YL4`$}4hPb9KNK`m)PN+JLXvuo0OEE{C||2E+vVKBMH8 zXk?_{Uh5^n@fgQxMr+mtqq5;^%pt7F+h}g_GML|qT$OX))a@}j)mL+BH zWJuWfkNwUZQtV3e6Y1}rf7Q2^ zi<$8X;i;F)6_fA_ljWpPmy@9g+c(`(V_E-U!*B6$i%kGYp(cZ*=n_X#&?Se*?X~T> zEz`|8sN@ACO;JOH^bhCAcHueXx(&(P1L+$sX zRmoZ1O7u+5u=jY9*G|G8KQ@_XGQvM^wlRjaJ`i&6DBlwmq95Ii_jTDYaanvV8c&DK zi9q7zWaR2LlZJivSu35&gVF2z#&Ls@W`n!!H0WU+zv7XMfMltqnoDxhF0RTX|JdHJ z9eoCN{|64$#Kz$txkjX}S@u>hkNUSLYI18C6?=@^zVGckl%DbaUWAE}m&a8$UsKVq z^`xgZ?5)#J)!ONuwUT&z{=E`^)I&l41=t_lfN_yAw6@g=oQD zA96+|*;(HoAvJB9omhs`@A&nvKOfwcbHWC41i~7 z3+^{}O;PMi2~{WTM@ug+x9?0p@gsd244zp<8IQ76udTF^b_14TY4#jq z&zFXiOta${yAtC&TVu-tPQ?PNVab;i1FcDWFXvJAauwhWzn#}+)ksLkRU zTWU(in=>7fVw;0?oa5K_&h(JqBx+{WU#6-55qYC#4xj1W^?0^+wCG&ttC_UfeBGH% zQhoSQligpLeC(s^aQWLm_Sp+=Z!JjjtLpmm(A2xz#~Byyd!plre*A+jU8{-GlG?R8 zdJm16l18c6-WlhXTd!d25;h6GT(A81@9XpQXO2$4S!ERx}kjpXH1miuQjfacva`^&S1EVE3qpw z*{XB<5bOaK6HO>(kdN*SXcgF8E^E?=h&zE>+F+@-)^w;@DiapzCk)LKtXo^u+UXQf z;d70HbKk?P!Z__es@Zs!`L~2#kV(0Eowl`%IKcaKMkcBf$+N8-DLlN~J1oAloZ#Cq zu!_{SY|v386nx$9EXB%H{6Gzs$-aF>HX%==5Me`?@LL`#w$1GCo{Cl?b&a+?^&?7l z<{39Xx3i+Z_=w%J#PFdX?9NEc^vM(%+iS?!wXpb&4GizjN?&pa9NMN+P*h#VjTnCn2c=x!h{O89{%)g7T=$T(l35MC+(hZ zH&Fgg10N!|_U=;gECqJDS<#?ZnpD2Im}CDVRdY0P%{C&-f6}F)aNF87J~0H%eRsjDukL~qseiNWqb@r-%{GH&KaJiBw?=7szkc+> zUeX^$*pEEuL3@=5EkUwaG$D$XzO~VSJU2#RtelD0|N8s$%#yr`7RMr0TZWOyG_rJ} za$0!n8ISiio!xz*CflFsZ4#nq9?)i%T(pfl;myy0-#Qyws%$p&%Su(s9ch(G zL`-F0SSS~%#2^>m?31Ln_RKj?2J8`BJKLNuft5f~@p@WhRCVjCo5VDJjmSd^ROMcU z8u4%E>AJ$VlRCmNpS`^I-sIF9$EW3qToQ88b7M1FZ<%S?e@9I8Fw5I+nehn%*cnx!MHH^^uAuUC*m&mf0M-;}^5E z6$D+E+wfXzlJnMyJ;h!#l^87sxkziD{N!JojQ7Y{rPz)kZ89%&_s8LYey`1;uDyf@ zG~AhawrWl7>93`hwd)+_(OwUiCfciK2Nsk`xMktBB@atW5I1*LgsLqxyfzsP<8IfMbxz#Q z^|CRUJExUj?ksBSGq$}LN56#UQZ)9~OeYq2?jB$M zJHJG9rmgAzyCD1MQnjI(>H0i-wWOuBiAqsh4R2zFmn|h(S)b=?1LxOz92?oXcdH%M zKZ7Ze_4bL92A@^-NMoY6BSzBYK7)y;Lfkg(-Au2W+^=-SGqNb(X9W=Z7S;++c#?m_ z>nCcoow<%Qxozkr8(GHFW?&G}Q#2`UYO35npV1}2l}1)cE*6c&^K9{f&Blczrclh) zqBW6HNZ!{?($i9+tWUVf#2%j*M;cBTN7Hi{Q2dE$L1?{bhj;@%BBgAxN4Ne?)_NwT;buPm+ikG z`cThXRa#uv$j|UjK88(6`+;?`LJ=vtKG8&m|2iq4mfy$EjC_Lo3bF~)Sx{F!HGtp0 zOhvm#JhHk|WU!v){KyM!yX{drZ=GRYmyj4LAr!W^^lI~qGrL-Tq1a5xan>EdeA~Ns zPVh{Bl~7N=a>>O1*TF4MD>+PfYD7>i%P$7Wt;0c47N1_R_y72`AZ>ghZZSwJtq=8x zQmnIecry~*!JE$SSQ}Si(341$FQ=0I`4x@bAJi4Dz3D5F4JX!kV0Q{T?i&l_XWhIY z@Vld^^n_yNW-+d=^VP_ZUFp19rp)BaovoEj3D?@J_gU(cVc#Q!>6D3<$rW=VVYrDM zpT*HwF~UlTg`KfoHqz^1=j8R=TD2hE(#pha{oO1@i$ybqBI5qGPhHiv@;b@5BAmpb zq|B2fRa-P|7EC~D21Lyh2YGenD$GMSmM9a8j_O%<*7x@KWb`=42T=@!v9jA1t=UnQxh&Az>{+u7Aq@qVI_ z9VE3o$&K*N^@8oyrDO`xEmY@jdlS39k6TPj)!h4}G?bvz{?lTGc$Grltw}Qa zn^9N#6{OetdOm>}OKxQY64lz4e@&{+kBqPLxjC1NQqpIfd91?Q?nc{2vHV1O_Z}KE z@=yaq)Kq4&CWzH3!8Em@PKQM|H14 z2ER4YA6r>)MG0jbLzZ9i_w?7fPQP{`%FK_w%a1G*8Ku=TRK+1gtP(?;JW}lun|G+Y zeP_+)p1C;}%a@+98q%0d@iJF(+n`wcmtqxzo{}-S&H3^S!joW+)<)umwI4JcGgKrJ zaqnue$=x3xFICQD%eA(@@F65JYo%F5$o$BoC4Ql=b4JgIT#39AHZ?@tlWy}d=4lb6L$5al=BE!O6-l%;?A_lUGN^0ec=5$8r_(S?v1(J zK_VqrFSVW7FWvRH{*=6Bp@yFe^<7#%2-E9-!=jBXlD zmaX5j<*k{I70wW$VXwJN*jt!g@L#SLTIjg3mXnx3t`E@5lOrw+3;QT>gJn-9DqxQ! z_n@eVG$x{!G#5hGPF0rMMeeG(Se(HUB@^t?Gt^61>g>Up++FNb=&^qFYv!CmeBU}) zResH6)7mv5r(uHk-p-^tswUfG{G1QjXG*4-&8JnFT+dvL)>xbB=S((Hj-hz%rSJ-a_~;JNc=QKuUuT* zs|>4hkHw@~x-ESB&|->Ry)QeaXKcawW9HyO*_omyt9U{njn(_2rJEA_TrJk!d|@4V z@%2~CTU6Vt!|FN8ewrkWOOZSIz59>#|(Y36)+;n?2itUJF$hYWvwX``8ty z`&9V8nEf$S)4ouPULTzbVyT`_zfite{bQeL{VTTKZQ+%{DXc?;X5Dtc;QEqgahnyh zb=!5W8O);GJHM#hlEw0ErOozrkLlMV9&KzsOOZCwVeQ-N4~S`ug(3zlu|jl@TAveR z-yFvUTokLj-*wlkQEwGVW7bbccYulBe_nMm|HZ+6q?wTZ3Ud=*Jf zidz(YAU1Db@$1!ka&>Gy$vCz~ZEc>d{806dy8q5+q)Xe^Y73I8Sm(N;@!OkRM&ZTy z>h<{HxpI%Ii7UMcJ$tH|fB+dD6&@Zb`Z(iB{@ldcumL1`F1gJ( zSnX?rTJ;}d>6^{$mft!^8nvXGv->Y*FRW&2_U?C&XiB+W@wv}e!==Joc_s42wspg7 zuh4P?$UnE;@2=@9CDntxan;V2E+J}`+YGe+Cffw}j z>Z^GqlEgTQU%+P(h)sdo$$lvY=T8hf==(ocy#{l1S-11$1st({A zK0b5&PbGY)I^FHSeNO0FtF!ZsM6lE$T-D)5-sabX9AVOeIF70mMYh;P0drBO8#d8! zaXc@#8Nd~|Ua-54o9a=?R||j5R(n(ViqL~z?nuVTQT(2}HJyxWmbp@O0=tr+dGqV` z^AbHL0rOQU8fg!Uxj;hZ*Pghok< zgpR-`Cj$X*&_NByQt0g3u|xkq?f5|eek%0RcB|}?@d}}8i&EhbBBlF4+N#pBx8;Vs z8HT*|6J0#pGQfZ%;U^;UeW`vpc4k{oyYn0Z@$xPd zDG*gT+D08bQ@{#q4jM4murrpb$pHWx%0mcwGx!OWeDE1B&_yyBhOi`Fd!*T9DeoioP8bT_C*#^KqJgW2kxmb%I6(aEBDY%(NzrVlcBaj7Q ze;iOk6a-a>^10@2n;ZE(y$M3oBHY^j_!nR>2+4!zZ;Phd<#ter429L#zzsCoHvNNV zBCngqsO=^BoA#zBVCpc;lnw;_Q8-{SK@EXyUrW6nN6PT_^^2Vcv2i30!b9HdMNK!l zGK>PztqITQ>XTh%Db$Uw`Gx{8$o~pM=t^UMiTKh?aq7^})0Wc!e|ZRz6qN@+hFj1p z*gInI6l#Q_8hJ(i#Kq*F78-O6JY~HC;n~dzOY+?pHkNG514$5)Ne~we^N?*0>uY~M z`tp-G6JQRu_XZUmH<5gK$T5vz1iG65NDcFHYM7rgghQk6%U=X8gIK)>k(L)L%Q6rJ z6Cz}uLN~iVmxk0#yKJ6w*8P6eGwmEZ7jWwgSO-2;R;=3)}nzLnV{0+Wt zg|1Utoa~Je#_E-ZY9oDDv)cF&a8Cq+RUH~Q6!HZUq`(T& zX#+D1iM)pfZ?vY^n)uT{2SpaeL2RaMLwKYF7soLMUc46FmQ;;Ea6n+L9@8N~=&zoD zuFgIKM6)x1>7N9wu0x`Ix3YubXvl^s&>YYU6oWh_P~?j(WW0zWSa+=L;OhHU>$J;U zI-511;OYYrbqy^0raN_1;kN7-Fe&^lKwzjgZ?p{lFrq>5phwkK(2d%yc;M1NzZqGA zaHRIG`YHcOh!N=c`-&7u2Lz^t1_i3YHi+o{!>gA8csTrg85;8Qp}u@Mm@#+kC?Zf4 zmWl%ekRSvisTiPg;1*El|Gav-rnpqv9Yc&&0@IZYfy@p%?w^F%hmL=&)vhYjE`to6 zKrshC8pxJ?fabNckoqOxuyaF}+a3FNk-on*lsgY%2OLr$itv&fNN42+?PU;&2XPdf z{akIoDAp9Z%JO2%du;MB#Jy2erGGs^4aX?b? zvGyJ4%9Rr06qs-tG(mj!+#K_X(}=)Zf8`A7`43*e*+JIu{YakBF@#aeoH39EQFX8^ z{dpG}@oySboA7>$=$7ru$lgxS*TtK@0V<37&-kvM=Y<}&e}k;PTglK7SQ!YGSK)XL zPXF~4jsw-m1gQuDMY+Ou_B*V^0;aA%l2i^M#!4Y7@bOde-Iw%0c~@TjZ~0{6hXWk~ zZ{YvC!dH*EPXO_`{+=qOwDCl@U5{>qOgbNS7PXmREHs%bYzc_Kk0i<)AS_VBXoL2@ zCtfKL{U8P&MtJT4tEKz6U~^#fPYdHh$vat`ST910{D0e+ADonJ7~->n=a z4@W?Fz$1^p4{&`j?IHn;ngf9_J$C@u*(gs4C1@3GV49%n0W=XM@cICq{ap@VCOJPH zSrLxPP^Say7Wwq@GITW*4+|h4t@Wo&qlg15ymdP45aRobzq*SlZIR${FfMTYAj`Rb z_rRUy!wyz}ukaM#v9ojFX$Q;Pv3SO@Id?q;v|kXnu)0?!>N1@u1pt2r>n zZjlH5B{Qmc_h+0rH+32*^2r1DL8?FjG*oC(jBM6UeoE0MqZ!5FlhhN6MMQrtk?!8IOUS7(OI9{}C$x+wuQvcs@~S z0v$AnB&n+xlO^iwV#UFw-djjtfme}_9Zztc5DMiy3F2^|<#9-1*W#%CdK)}G_$JW= z^R+M@0r_-;;E@I}YKN0?$N2E@O4o`t<78JeE;{tgtz*e*>So8Dn1b6CkuXsc-bSK$ zL&x>!_2!iY;TMm3<0J{uhM-&6!>$~;$qy*BugO8o zI@xt)WISvmv~_8;5yU6SJzEWx)Dz-N(Cg3LYS8-UWE!1?KiS$}k=Ba$Y$B$0p<5Ua z14iYgkSRa}y1Cxj>%Lo?KAA)1tJ|ePvAA8y(aoifcZG7 zaQ%dXO=$vZkmZ)l4y&Wkxz?bMD-*Bh>7EO8O5ji4 z+Hm!zPG+PwivGae$*OP-LR{uT1Z?y!$@Gm-OM(~LxaWiF?K!?t+gh-G{a zQzPsrSgPE#F)`f-e)B8OA!wd)z|eP+X0J;J`)){Z-R;ocp2_l7dF+V%q$-ykA~5Pi zTRCYG`c`V`zUMxveUm=YJo*V9<5b%hzU^WRc}+v%ZWr{!{nd=LM3QIq8$0~z(NHXz zm79>Qy&Q@?>5%ygn_zw>iiv7)(iY$2dm@%3mz;DJC!T@3r_D*gXsQv!7?zZBKa)={ zrUMWM_|7!|a*3JGOJ{vFbE6D!QqhO|C32G#V)B;kbNB4+ZyQOrh{rhCbom}PLg&5@ zZe2kwW}%QZ!Ef?8_SWibO@RkAorW=e-?vwJb~P&Nt_n^yws_P@1;NUg5HCUCE7hmV z$XNC|o0Z<^Xrt!x*frO-YE5$D)9~>pfQL{;nn!?$+U}#bEKP5Id1|9Fr4c`kvBjG` zJi&Q`alI@k4LQ#q&Hbq9(^|mRg)G_Rq?d#X)Y!Oe%DmcJ)8t_ZmHtmdw;&%3h8;f9 zTh_0=X8Y2X54#P~T zT##u6n;Nt^r$IRZ&4Q7vB2oTJeSe%#4d>io=gv4a`VX#daOX*qvYF@ZPG_24YvcC4(EVSZ>?|VXPhdSzu0m?10(`2@I zc=x5yk~Z&q_WfK|XuA^tM@Q)|emwpyL3WlX2i38YbN%(DwgY_$%c6O*6pP3_mHyhw zlNFY-6SUa#TuVwe$wM-~9*4pRBP=TYa>X(^*x5-UPlJ^@Ik+8~{ zqqkh{OWvd9O`lk3Q`uHAGk=^_!-huC{LzAzlXb{3yadd9I|GjMp=_)>GnhTq>8z){ zUFi9CHC7&v8WHS%V$ut_mQ&1m<)TZdyflo4q+h_C=cK%6mdI-LWcFbwUIxL2CFSM2 z5l?>>4BmeK_#yH{$QeRds_|o=&B`g1t#qZpy;7e%Bb-(|LE}8`^f28S^Sq-Q3YP5i z;ID8XR&PR&@)}ypPVN}@aX&D?d``^TLq3nlMIFXsvT4Vw=EfuzGgPn`{S{yPwI2z) zJ&=AE(aW+E{P~CG!Cp7!IBxjg9!S0Ef&y+Q>!pb_r#z$ckBU1pVC>^Ehf- zLOZd0L|!`W`{7$aR-sB!Pg@{hJUPv{wB3n%st zRa)*e-6DS|YyMGj)YZm*Ce?YVrR8{|egn{#&s8W=>V1iNia!~&;9bZ`B5TbPx|cVH z*Pgd*f6mS?Fuu*qC}};vzS4^N!1_nYlH=Ck2AQ+i%ChNj-B2ODnxcMm&LS|E}Mu%19i`@&T6aywti!J71m8JCxKSR z3SnS`j6ULPgBvnSm`ZNnSdg;YU_wvkhxp{KcOgkkdFM^+#NAbnu8#dm1!lMc&v0U! z)-PkSX1J<6H`R$(YxrT{d9J+KIBuN5XtI<#Hq>#Tu@>-Sdf~7sKy6eB`#405jqp${ z#W!r8#;nSA^Q}3n!+_{jl1wS3iw)}-p*Mo+Fz9bB8w0)qMSUDM6KM9L2FllB3SAOX z&F~WDiIR8jH4Bq#oXyDsqIN>YWHN>bToHjwgW^HTx6L(Ns3JR8Q|H!bJvk)%b>5!- zgkI@l?|fC6h6JxPS1vJQk~O#{)ydEKp${0ht_0_!9OXy+P`a;1d3;%z@^Tr9WF;?m zg#00Ljh!0*bX<)LNC&Rj9D+i%DRD7b6aBO<%FTl8y_kl2Aw;lyl+aSSJ=6S6a=#RH zo?T%XJbCD*hY@;a{1MOj=_JjslL^$_QT*Z#?sOPdR89gp4o$0@z-8=QuOAB7Z;*Wi z5x@V$EPEuB=w4 zU&q4dkm0W}hIoDfd>Tp@N>&Th;ry-P+s=nWiOe&hPd``u`0kS4DW%mMgA-%0w%SD{ zm^-x1#4HGv@;W*AO*uz`fP&b*2nB_^EM|*%eZ8R~6JFsOZNph6G*;KgF$?K#xanWw zAm_1HcGebPRKNxyil{#!BwKy;-fNGlAUz4|>&HSO%|o6}4NIS(F(iqg15`f58$|*XAwUbNvJ-+ND1?4wA&A)y%zbEG5^cJDUB)(~AUcdY`-{=Mu6ink`_qn8~ zw@)s|pE70I=)ct?KKZ@!U<*A%vYhJ?(-@WxvXT*`9^!w^lsOX8~|V;3SO}kUJ*aGt=Hz! zs|UX@H}1VCK`Rv;OF)Kjj>!3S#O5n9F%gKT?5n|4dQs4ZZfq>*a#GIG1hCbTn4iP6 z6ulnU7!^tN*xIhmUyPgVw88o5>;j7|K*3&m>lhJ-2&3rCbaQFhzH#A>v3X{xJy!n@ z&)IouTJraASYW3Oe(*{VXrhd2PEV$f^t)B0S~FQ;9#cN*U}ze;lqpPH37QNcX3l~7 zSm3TEWFpJGq}e}|jxElA4$byQn>h|$^~zndRI$$l(X+d>(2)5OVk z-O>fm9{^j#LIS)g^_bC#n#l@62V~f%@yWI1i%&}DV#AZnRY(a2y5gg=qfxSFppC>r zJk*_orFP5X!;W@-0c*W3wX+J&#J}^nZ12m#)s3{ka;?IeNO|$m%@~Cl*%RZ1i@6X~ zLGZX|PX4>@1E?^ey}Y9tr5x^hPC14Aof6n+nr8-C&#)(66Hnd2-Xb|4%Yjy4(|TC( z;}z!`oPXaE^W!T|cdVjZKDl>7hmg}K#dXX+Q;m)m`%Z^58be5ws>2k%Z!s>ibZe{n zSh-DBItDq83Iuwf5wpXn7_F0L+WpeA3F(W^dhffaME7;QC`N>k!@y8p7v>^;d3G8w6V%MgP4=N~qiRa()$vjyhn*K(@aaKfe-q|IUoPd5e zBpJQOMol)a$>oN$xOfHuWPf(DGapaqlD1h<#BdCM>3m+|C0ehHC+!BGUUVtvR}%Cl z#L@ZYF)`$rLA8Ul%9kHxf`}F!eIGGhPD#s{jU25)W*%HdGJVMQ!Z(>_xqhZ9;dB!+ zujWx-e?Jljuva^{U>A5b&9vh7_4ZoJ8=OK(hUZW=_@pHjhq_*SWs*r;lLX1lh879! z`8}oK)#$OEz|M{5AYo%lzcp$$v7r)zRw0QeC1a>(qZWgjE7|i;-8cbtKLNe^fY@5a+FrL6Rj_E1LC5B?|_RFoO{1^RB9oZh=P0g{4~tz(C3r%y04LWuDPWG z`7-#lvaZ5$pEs0^0F@kdczt%NM7Z+wth^t$K7l=2T3Y#ADoYVvBz71TH&ibgDnVY2 zTMTZkG%r%M-(Qt{)&K_1Z<~U(3=ztsw!``{`H+v#WY>z;&8nH>E zM`s9)p;VKLrzWEJ!wzLZl_|_6Xe~Q0QSUEwTuO+}7i~7>6gb~?y)>@wiYs5~6q_I! zyw17md&?A9$~0W5JAG?x{sc2?Zw2d0_iRlx=4@!H%yNhjp6BMb)C>^C;CBIzR@)qt zwpeP}sPjDyMYtPq!Q#y~^syS9lT7TMtZ6z;vl|nvGiHktOkq;G-d_h6;uOqkL z<#Ri_7unv;T=l@K9NN)3#`5GO z6cmpiqyo-q_7Mh$>ohnnB&hLNi*jO5dnaJcI*B`6CbBcEFELV*-=T#HnjPZ)x^o6(lP{vDS$hP9R>LXY=jU{~kkG zuP|U7!>XHry@EZ@#xSrX7&R@PUoe$)2D}m@YWy<`$uCWCa~56p`T@He_Xg_ z+#V&)LXBmJAT__(?H#Mpd20~YmFm)&drfbqxwufZS-2wHy zDBVThQsv%E_pZuGI!?U%hEC-QhTBDjbU|!$_fdRyrjKYplVtgB)Ke$GcP<>fgy#xr zS5Hpl$O~dcD@71S*|(iDpGdHJR5dSjJGEc=%$&DahkvoPPVpiZG1Y!o(TYIUZ zuNb%fB&vO?>W;|5o1J@~Tk+*u-)Fe}CO=gwSo!N?lpGn(s}HG3(&`$_*nHi5L>t-LML2Ke zAeQla6+?SVEWR-b=L8Hk=QbSB(n#~=Ci%5K?8CdE<4eDKNo1UJ9x9UH6%QH~h}Ng^ z@h2w*0|coQnDw<`plFSvM?Rk!4NiQ#prIKZ=$aI8VSCuW#JS1*ya^w z%q8j(YRI3^sqRoSJvfp#6j$RsjZP;hW!Gp!C5w_@;dDK4Pyg2bg=6`w4Iw=C=*2LF zX;P1KRK=E|)OX>61lw=E$;J z9NJL6p=|=@mN!c0`YKW9)I&r(YD-hRuKAWtZ^s$qx-0x%c}|yo1g}8_;$Yku`b@4Y z)29XUk1kW2RrNdZzDYcD8lx|$9z;Jv6YbG~#k1MAY|B<@j%Vdz4Y7==a(1Uca` zy#V^!BIr+dAdU*0h&<*LVw$Jr7w_+1f8k4*;|ufty!|+ISx^RYUN~c(oo|=*F2(FP z9Ucj0{^LF@bpgOUl>7014kNNuT}`g*!mZlV?uOIbn`^m}aha{((xxyh#ykb>+IPD$ zKh(M3Q<(7%K01@@+GQ~08odNe7vTo42s$qQy9`O{>{69+>?^osp_j}bmwA6n)cjR{ zYo{fl_BjdsK9Qzrc2<|;ffOMw)$aPEIz>cnXJWgF`RrC6?NfuL-q9IQxHg@KBQp<^ z?qTvN%Kbdm-BVK``^0UehJthGXmDL+S8%VU``NT_(|c?V6%%?D&BH6`#{~VwqRDf~ z&p*cWo)jMy-!sTJ=m*d68r)!F9zD9Zmv8S(GW8a$?-Cq!J4XyW_q>KR23V{^N^(T> zSg&@<4SVK^yytY|f18nV_s>)HG?Ou5QBaL$VYS?pZ zAN`t|%qEB@M}zYP-eGUCh3hWW_7Ez8L1u;6+lI{ebY*ax0S4w_2G}g}IhQSm!&vsk zkErn&8GP)|d{a^8S7p4kK{9yKX84Gi*<^M=rG?LE@)8BMXUC{l1KR4r#aOnv)4wmJ zB3Cho=SlMh8!WeuWn|d?CLuQbTBxiov3#vo@xs;S0HVO7Z7A!$0S8*j*G>J%=Z!ue zG-T`Ro)eN$6rcirwf4$8R>77mza*S{rc;&WLK^k=6>IW|02OpfhY-M7d7qWR+;E}3 zQg)x*@%k`Wk*D6?TsFpOnmid39!uzDsC26)&Ewb!4z%x7T2#wl3CXpw`h3}ubz4A{ z?$Mt>Q*4f7$v-;e03-6zvb(jz`;_owgn<_ZhsObo9@`lKCZqGHI{)Ct!F>+8MNSJ8 zLL%>%yu|7)_Bo-l5ZacPv{(;Etd>Op!yaIO6%O6t=>{ux#<>0B?&y=z^-Ax!+OE=b z8PT?5CA%xb-Cmsm1?tbS=ZAJe>t4hd?*OTW#akx1Hvzs*$;g3YN(jkv9f8My%4MSBsXx zi9Hniya4?*daVzGp#_} z$8eA6-)G`UPTL;kG3`hcGWN;^n!N`L)<6+C#BB0pybsy9D1xF=_Y-vs^_=!^`m_VO zyx~HCv@0;AtyIOh>WP?I!uBa_HdG2St=o?U*dPXyfHEu)Rnvj46=uoeaUhQUT!I>c z`njDZDVxha$pTN;+6TQ26`|maV0Oz4RBh@uT#gUQP&x7eRTjX;ZO(2Y1#Xe_pc*Jb z)S-sW!EV^!uCoqhbG(p`c%TVGRXBUG8?Z!S+NdDhCwl0%E*jxHYIK$vK7SktHXVVs-Dz+RW2)H9>6CX^ zjP?QhsbkSYa`cfXAgAetgEeHKOZ=Xy0={RcF3m4bCcy5ziOr4ZdTq$4Zm7UeNTD-h zcEM9K&OQZvVN^re+U{!ciuWghcM7vB{@ei|C`M&K?}#H7`qI2b8S~Q9^>4PcXRrF( z;9PH1l6lPvV7p+2Ru05KVV4~Ch?)Vf+{0ab>hkED*NQj@i?st*3B3I!Hi&ow3eOk! zJs%BU#nS0dLy@ftejtiq-8gr6-;hz9HUOO)8$3nutmf>)o=_vJbiFO}W7q*a4+q15 zNQP53a=ud-@tl@;IJp-+MqVfblMjc$wcGAg=g*538e|MZw?Y#^VWY4!KMR6u8?I6y z61^D@Cnsgur|_j``Iws}bE4J2*rfwwrE>E3qe%|f+mqJk+BiL${@Br;_Wx<`+QXW< zvi(6(f<}l^ASxmXXh#uZQ64sdAX=nYZ4nTL*P&Fz0Tl-;AOwyOK?j9)ItpHu$F*vu z6*D6uipmLgv?KEH1sO|CC?bkVQr@q?ti4XPcmBHH{p0>Oe4m({tiAScJ@;$vpjly9 zd5fUj!(V=@>Y?&YR$xse`OWK4JB2O?ZJbbcLHz51Eq&o)c>*0 zqOfha?=vVyryS{9MsEA#*+jStp4c zvvzcxzFObW3yU3N5)(1QeS^3Eo`+}2@5UOZ`x(~4Q|VI7ly`O*XCy{MM97uo8Ez}l zYt=RBA^k&TS>OZAawMB}w0vZ{J=P*bW9T}>zb;d|Bc}uh;sVTmaaq^pBO>CrBN)2D z?9sCHP-8i8De**-x$)P#l1%my;IE2tDgI&VcfgmdOc@zUdiUX`M?05tBw2)n&Mx{k zy;DF|q^t`@)*P$9zUipao4B&b>ycJGDGInITM@LY_@Zqm}X^R7E@)x6kKN14w=BEDY@W*ROw>SybGzI9pbFf7ro_Lt} zKGKe(befGsI!!`=e!$m;WEp%b4bWTX5Opx8P_i7GF^LNb=7Sp}R~HT0`w(*J1p-of zSzc2iAcY4_W<-dlc}l0tD7IoN;a9S>HuC5q0+8N_^p=J-t#x&Ex!48gCe@3_Iz9<7 z0v?K$qz!%9uqOVnlwj~dt5w^LZ85FL1tyv&gb7>DOaJH6M@kBU2(_)6(dHzXNtCUa zN>C_LG9&Y(1SLBQ8=NuDa9j?Ja=jkBUcQA;XRf=&cSvC%+iftrF+TTq~N%sGyyEwM=z9?a-OaU9_yf|cFN zNhkxXj-4~7-gGf05p@&;(Yhy*YpmIBtiC{_rib9PlD6apGYeZ^}LD|85%e&79(NeCaYm zA5D#zQVTlOaykW^TLxQf_}Ma#iv&Q4>m=|YP1{}$RAXllDPrl9Qt(?Gwv%H#+Byva zjgg@7Oc$Ji6;w;mC<#7%ly;(XGXWgGpM-mI z)hQ#Q>*wvWEr=WD<3WP;2I|COes+3MG*N7V69Gn>-N?{?I%|ns+0>Ybn_JDO1{W`? zb%T&Elhh#wUyjz0ZJ9aMJEQR;@x3bSN@ZxEdkwACz1aF0=f5^o#8HuOB<&1Q4f_s3 zsxWRmyV$GaL!i|rE+gjlf5UWe0iY`09tBi_OoCsSf?ZsxjGxNKicxMqs8q6|8pGpRD1&+I6#|Q;}wE` z07vlnY%1APu1q+wHJliRJ92SpAMUeT-?|`5Wc4zH?BlVO=rZ*JN(*tAH+XG2*ozKD z%f#@Q(S^{J1mX*zXWLKKn4U3%Sj_dO9QfJeMW469_}7OAX{}FT=0`NXaFreAQ9b&S z$d~j@jiS5J7Ez*C6SD`dO`@bVqz5YOBO!lOwx@AoEN&rqlsA!36I1q&sx;I4Y8f!6 zG&hjY!O@Z;N}y=m$))m@&X6l#y{O(h-Wh2I&`)B&xlo5lCK`o26F+2i3i;AgYH4e| zzBha_AmCcxkt^es!~OMk(4PVJr^&-f#CO{cEWdTyWMH^vXAD$7nRJ6g{*bwpmle`e z{g+V_eSc%kB3LE3bp4N+lZrZ`1lb+DNN%C#+VW!#YafP?8MhTi73Bg+9Xhg_M1zNX z(%EvE%z(@cmI|gm=$ZEmsF>lVC9Dai$sf=+*#_gRV}DGSIU7UH5Rj(S^8=zG)!-8u z#4yna`?Fl2IJtFKR}y?Sf~kg?ESNff^hxo=aLXDX@ZvD2nRL_uhpmeS6gQ2 zdoTFH{kg-VI9tO*@2cZ|=8vHQO>QI3l=#mE4ZzR<9ca2MaoWCojFby_hiI)_ znLnBYHgn5ca7$RQO4T`W;~12^(}87~rJl8#mz~@HaAW*$;}Ev5YJZC*wmjB!hW-lNOw5<(YO%A^kBdg?_#;~a-%wgoRYdBVbkGV0;|j~czYM}#}hrq=7L*1 z#oX8p9A#!?7VsBDSibGe`)jV>3)}sTM#t2y&TtA4Uj(_jB~jS=czoFDB`oyV9cd$@ z?VsNEC;LKHd1dtT;yXlR-=Mjp4rgfuhTcs}iS!9}s7sxrR{{?NO!6_#ij0V;ieC6IYMNl3m)M z-NwyufdIagvsMFh|Ab~z*=2$_6gIC*+f>cdVE=Lg)*V)OK1$mIn7?i_0|yXeR703?o^GPys)mPGY^A~1cnA_uyl{Be_R&xSy-4V6%e zbs@GOAJ|ugyTH4j`tMhx4VzV$Jcdt*4Rb413uxxaIRl{*aUH0X#)KS#lTZXyVjmR_(1j&4!`yrNEGaUBzhh!`2JEu}}xXq9Q>@7{o7 z%KQR#7`L&LfZH#vXEF7n z`HdV%1=C5spw@qE4nD$0a9c@p!kZ&GG@tbpYUcyhVUmBTm^ntf$c&P-I9`f-EUnVi z*ly(@#BnSp2g;%Z2(DnsQFuK08y6G0!kLgDP zGDo1=C16V8N;Qm6G)_FIRv2i2U?oaUnTjGFKoOdq;LM9^5MQ(wO)M@%H#_>@B&sNv zpZ#CJN$|7z|a{f0Vwn_TGG(Wr~>=fBwMVAnBstKkxi0J6?Ej zO~bmU?e6BPhdn>*4VbTfzgbx)4m?5w0Pc$2*-r89aV=zj-MfoRAoy(#^fm#W7Q9a< zEm>)ptL%L03dXF&+iNx_0(HACHIF%h0XE~^voN_Jty~QZ=-grtU_gb{$-=^(`I4zU z?^7~zP?j;~Y2tLS2W>i?hWDCi^J{lE1s?nYUT@`YT+cs|C?2D8)M6!LC@ z2lk=c7{{~7y4@=Sb6qz?7EwV;eMNJc4=D2eofP1sHioLtg+Du2=CC<6V>5_%9tr7- zqx6-#Uy*d9i`gJ0gyC+c*YmXiua8D}ySETW(|K61@F6P-QZ~w#Li_6u42Z+DHCJ5$ zuIlka%X%2?kJ78`}QVSqe~!I8~kf zTee0nbcg{_u5&H6g^<*c_G|_X)SABLq}>H6Wo6M$aiMYZGm4Sb6I6!HE!oH6&;Icq zcx9Cpr{{G(o~Fw-KyzCT;k}04BrItsyfs)QKXo!^0E0G@6SBifFNPe?2BBdRLgIMo zpYtt>0PQE(1+%w)N!6uAWN*|v1vh~;4I?hv_cjKuj5+^O4||9-cXL@Ycks(S#}?PY z$%^J3PSBzJqR!I&p8<&-`Uzu%g86JkT`82!feIAnOSBBNCpfDc_;!2`+P;(@Pyv5h zP(=PlfGz^DNsSsv67ta)k}*lTRedtYf-J8$D=4B>;nN4HHRn@EwiY&EoNA_g5AZbR zCArGQ;4yOl9N#;UCqco$uNWYsy#Cng0So`r$1A literal 0 HcmV?d00001 diff --git a/docs/tutorials/tutorial-event-display.md b/docs/tutorials/tutorial-event-display.md new file mode 100644 index 00000000..e257178d --- /dev/null +++ b/docs/tutorials/tutorial-event-display.md @@ -0,0 +1,416 @@ +# Event Display Tutorial + +In this tutorial, we will explore properties of Visions and build a simple front-end application. You may find a complete project [here](https://git.sciprog.center/teldufalsari/visionforge-event-display-demo). + +__NOTE:__ You will need Kotlin Multiplatform 1.9.0 or higher to complete this tutorial! + +### Starting the Project + +We will use Idea's default project template for Kotlin Multiplatform. To initialize the project, go to *File -> New -> Project...*, Then choose *Full-Stack Web Application* project template and +*Kotlin Gradle* build system. Then select *Next -> Finish*. You will end up with a project with some sample code. + +To check that everything is working correctly, run *application -> run* Gradle target. You should see a greeting page when you open `http://localhost:8080` in a web browser. + +We will use Kotlin React as our main UI library and Ktor Netty both as a web server. Our event display frontend and server will reside in `jsMain` and `jvmMain` directories respectively. +Before we start, we have to load necessary dependencies: + +* Add SciProgCentre maven repo in `build.gradle.kts` file: +```kotlin +repositories { + mavenCentral() + maven("https://maven.pkg.jetbrains.space/public/p/kotlinx-html/maven") + + // Add either the line below: + maven("https://repo.kotlin.link") + + // Or this line: + maven("https://maven.sciprog.center/kscience") + +} +``` + +* Add `visionforge-threejs-server` into the list of JS dependencies of your project: +```kotlin +kotlin { + sourceSets { + val jsMain by getting { + dependencies { + implementation("space.kscience:visionforge-threejs-server:0.3.0-dev-14") + } + } + } +} +``` + +Refresh build model in the Idea to make sure the dependencies are successfully resolved. + +__NOTE:__ In previous versions of VisionForge, some imports may be broken. If these dependencies fail to resolve, replace `space.kscience:visionforge-threejs-server:0.3.0-dev-14` with `space.kscience:visionforge-threejs:0.3.0-dev-14`. The resulting bundle will lack a React component used in the tutorial (see "Managing Visions"). You may copy and paste it directly from either [VisionForge](https://git.sciprog.center/kscience/visionforge/src/branch/master/ui/react/src/main/kotlin/space/kscience/visionforge/react/ThreeCanvasComponent.kt) or the [tutorial repo](https://git.sciprog.center/teldufalsari/visionforge-event-display-demo/src/branch/main/src/jsMain/kotlin/canvas/ThreeCanvasComponent.kt), or even come up with a better implementation if your own. + +### Setting up Page Markup + +We need to create a page layout and set up Netty to serve our page to clients. There is nothing special related to VisionForge, so feel free to copy and paste the code below. + +File: `src/jvmMain/.../Server.kt` +```kotlin +// ... imports go here + +fun HTML.index() { + head { + // Compatibility headers + meta { charset = "UTF-8" } + meta { + name = "viewport" + content = "width=device-width, initial-scale=1.0" + } + meta { + httpEquiv = "X-UA-Compatible" + content = "IE=edge" + } + title("VF Demo") + } + // Link to our react script + body { + script(src = "/static/vf-demo.js") {} + } +} + +fun main() { + // Seting up Netty + embeddedServer(Netty, port = 8080, host = "127.0.0.1") { + routing { + get("/") { + call.respondHtml(HttpStatusCode.OK, HTML::index) + } + static("/static") { + resources() + } + } + }.start(wait = true) +} +``` + +File: `src/jsMain/.../Client.kt` +```kotlin + +fun main() { + val container = document.createElement("div") + document.body!!.appendChild(container) + + val eventDisplay = EventDisplay.create {} + createRoot(container).render(eventDisplay) +} +``` + +File: `src/jsMain/.../Display.kt` +```kotlin +// All markup goes here: +val EventDisplay = FC { + // Global CSS rules + Global { + styles { + "html,\n" + + "body" { + height = 100.vh + width = 100.vw + margin = 0.px + } + "body > div" { + height = 100.vh + width = 100.vw + display = Display.flex + flexDirection = FlexDirection.column + justifyContent = JustifyContent.start + alignItems = AlignItems.center + } + "*,\n" + + "*:before,\n" + + "*:after" { + boxSizing = BoxSizing.borderBox + } + } + } + + div { + css { + height = 100.pct + width = 100.pct + display = Display.flex + flexDirection = FlexDirection.column + alignItems = AlignItems.center + } + div { + css { + width = 100.pct + display = Display.flex + flexDirection = FlexDirection.row + alignItems = AlignItems.center + justifyContent = JustifyContent.center + + } + input { + css { + margin = 5.px + padding = 5.px + } + type = InputType.button + value = "Update Events" + } + input { + css { + margin = 5.px + padding = 5.px + } + type = InputType.button + value = "Update Geometry" + } + } + div { + css { + width = 98.pct + height = 1.pct + margin = 5.px + display = Display.flex + flexGrow = number(1.0) + justifyContent = JustifyContent.center + alignItems = AlignItems.center + backgroundColor = Color("#b3b3b3") + } + + } + } +} +``` + +After setting everything up, you should see a gray rectangle with two buttons above it when opening `localhost:8080`. + +### Managing Visions + +We are approaching the main part of the tutorial - the place where we will create a working demo. In particle accelerator experiments, event displays are employed to visualise particle collision events. Essentially, it requires drawing a detector setup and visual interpretation of events: tracks, detector hits etc. Usually, a number of events share a common detector setup (e.g. if these events occured in a single experiment run). It makes sense to update and re-render only event information, while keeping detector geometry constant between updates. + +Visions (namely, the `SolidGroup` class) allow us to create an object tree for our displayed event. `SolidGroup` can hold other Visions as its child nodes, access these nodes by names and update/delete them. We will use this property to update our event display efficiently. + +To display Visions as actual 3D object, we will use `ThreePlugin` that renders Visions using *three.js* library. The plugin allows us to create a Three.js representation of a vision that will observe changes of its correspondent Vision. This way we can update only Visions without diving deep into three.js stuff. Using observable Visions is also efficient: Three.js representations are not generated from scratch after each Vision update but are modified too. + +First, let's simulate data load operations: +* Add state variables to our `EventDisplay` React component. These variables will be treated as data loaded from a remote server. In real life, these may be JSON string with event data: +```kotlin +val EventDisplay = FC { + // ... + + var eventData: kotlin.Float? by useState(null) + var geometryData: kotlin.Float? by useState(null) + + // ... +} +``` +* Write two simple functions that will convert data to a Vision. In this case, we will simply parameters of solids like color of size; in real life, these functions will usually take raw data and convert it into Visions. +```kotlin +fun generateEvents(radius: Float): SolidGroup { + val count = Random.nextInt(10, 20) + return SolidGroup { + repeat(count) { + sphere(radius) { + x = 5.0 * (Random.nextFloat() - 0.5) + y = 2.0 * (Random.nextFloat() - 0.5) + z = 2.0 * (Random.nextFloat() - 0.5) + color(Colors.red) + } + } + } +} + +fun generateGeometry(distance: Float): SolidGroup { + return SolidGroup { + box(10, 3, 3) { + x = 0.0 + y = -distance + z = 0.0 + color(Colors.gray) + } + box(10, 3, 3) { + x = 0.0 + y = distance + z = 0.0 + color(Colors.gray) + } + } +} +``` +* Then, let's create our main Vision and add a static light source: +```kotlin +val EventDisplay = FC { + // ... + + val containedVision: SolidGroup by useState(SolidGroup { + ambientLight { + color(Colors.white) + } + }) + + // ... +} +``` + +* A `Context` object is required to hold plugins like `ThreePlugin`. It is also necessary to make Visions observable: we have to root our main Vision in the context. Declare a global `Context` in the same file with `EventDisplay` component: +```kotlin +val viewContext = Context { + plugin(Solids) + plugin(ThreePlugin) +} + +``` + +* Import `ThreeCanvasComponent` from VisionForge. This is a React component that handles all display work. It creates three.js canvas, attaches it to its own parent element and creates and draws `Object3D` on the canvas. We will attach this component to a +separate React component. Note order for Visions to update their Three.js representations, these Visions need to be rooted in a `Context`. This way Visions will be observed for changes, and any such change will trigger an update of the corresponding Three.js object. +```kotlin +external interface EventViewProps: Props { + var displayedVision: Solid? + var context: Context +} + +val EventView = FC { props -> + ThreeCanvasComponent { + solid = props.displayedVision + context = props.context + } + // Make displayedVision observed: + useEffect(props.displayedVision) { + props.displayedVision?.setAsRoot(props.context.visionManager) + } +} +``` + +__NOTE:__ If you had problems with dependency resolution, `ThreeCanvasComponent` may missing from your import scope. You may find a compatible implementation [here](https://git.sciprog.center/teldufalsari/visionforge-event-display-demo/src/branch/main/src/jsMain/kotlin/canvas/ThreeCanvasComponent.kt). + +* Finally, we need to attach EventView to our main component and connect raw data updates to Vision updates using React hooks: +```kotlin +// ... + +// Names used as keys to access and update Visions +// Refer to DataForge documentation for more details +val EVENTS_NAME = "DEMO_EVENTS".parseAsName(false) +val GEOMETRY_NAME = "DEMO_GEOMETRY".parseAsName(false) + +// ... + +val EventDisplay = FC { + // ... + + useEffect(eventData) { + eventData?.let { + containedVision.setChild(EVENTS_NAME, generateEvents(it)) + } + } + useEffect(geometryData) { + geometryData?.let { + containedVision.setChild(GEOMETRY_NAME, generateGeometry(it)) + } + } + // ... + + div { + // ... + + div { + css { + width = 98.pct + height = 1.pct + flexGrow = number(1.0) + margin = 5.px + display = Display.flex + justifyContent = JustifyContent.center + alignItems = AlignItems.center + } + // Replace the gray rectangle with an EventView: + EventView { + displayedVision = containedVision + context = viewContext + } + } + } +// ... +} +``` + +When we press either of the buttons, corresponding raw data changes. This update triggers `UseEffect` hook, which generates new event or geometry data and replaces the old data in the main Vision. Three.js representation is then updated to match our new Vision, so that changes are visible on the canvas. + +Recompile the project and go on `http://localhost:8080`. See how the displayed scene changes with each click: for example, when you update geometry, only the distance between "magnets" varies, but spheres remain intact. + +### Clearing the Scene + +We can erase children Visions from the scene completely. To do so, we cat pass `null` to the function `setChild` as `child` argument. Add these lines to the hooks that update Visions to remove the corresponding Vision from our diplayed `SolidGroup` when raw data changes to `null`: +```kotlin +useEffect(eventData) { + // ... + + if (eventData == null) { + containedVision.setChild(EVENT_NAME, null) + } +} +useEffect(geometryData) { + // ... + + if (geometryData == null) { + containedVision.setChild(GEOMETRY_NAME, null) + } +} +``` +To test how this works, let's create an erase button that will completely clear the scene: +```kotlin +val EventDisplay = FC { + // ... + + div { + // ... + + input { + css { + margin = 5.px + padding = 5.px + backgroundColor = NamedColor.lightcoral + color = NamedColor.white + } + type = InputType.button + value = "Clear Scene" + onClick = { + geometryData = null + eventData = null + } + } + } + + // ... +} +``` +![Picture of an event display with a red button with a caption "Clear Scene" added to the two previous buttons](../images/event-display-final.png "Scene clearing function") + +### Making Selection Fine-Grained + +You may feel annoyed by how selection works in our demo. That's right, selecting the whole detector or the entire event array is not that useful. This is due to the fact that VisionForge selects object based on names. We used names to distinguish SolidGroups, but in fact not only groups but every single Vision can have a name. But when we were randomly generating Vision, we did not use any names, did we? Right, Vision can be nameless, in which case they are treated as a monolithic object together with their parent. So it should be clear now that when we were selecting a single rectangle, we were in fact selecting the whole pair of rectangles and the other one went lit up as well. + +Fortunately, every `Solid` constructor takes a `name` parameter after essential parameters, so it should be easy to fix it. Go to the generator functions and add the change construction invocations to the following: +```kotlin +fun generateGeometry(distance: Float): SolidGroup { + return SolidGroup { + box(10, 3, 3, "Magnet1") { + // ... + } + box(10, 3, 3, "Magnet2") { + // ... + } + } +} +``` +For the events part, we will use the index in a loop as a name: +```kotlin +fun generateEvents(radius: Float): SolidGroup { + // ... + repeat(count) { + sphere(radius, it.toString()) { + // ... +} +``` + +After you update the build, it should be possible to select only one sphere or rectangle: + +![Picture of an event display with only one sphere between the magnets selected](../images/event-display-selection.png "Selection demonstration") \ No newline at end of file From f40bed7bb9a47edfbbb6da1758b476bf55e29284 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Sun, 10 Dec 2023 17:06:58 +0300 Subject: [PATCH 14/41] Implement and test input elements --- .../src/jvmMain/kotlin/controlVision.kt | 59 +++++++++ .../kscience/visionforge/ControlVision.kt | 45 +++++-- .../space/kscience/visionforge/Vision.kt | 2 +- .../kscience/visionforge/VisionClient.kt | 8 -- .../kscience/visionforge/VisionManager.kt | 2 + .../kscience/visionforge/html/VisionOfHtml.kt | 64 ++++++---- .../visionforge/html/VisionOfHtmlForm.kt | 21 +++- .../kscience/visionforge/JsVisionClient.kt | 7 +- .../kscience/visionforge/formRenderers.kt | 90 ++++++++++++++ .../kscience/visionforge/inputRenderers.kt | 116 +++++------------- 10 files changed, 278 insertions(+), 136 deletions(-) create mode 100644 demo/playground/src/jvmMain/kotlin/controlVision.kt create mode 100644 visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/formRenderers.kt diff --git a/demo/playground/src/jvmMain/kotlin/controlVision.kt b/demo/playground/src/jvmMain/kotlin/controlVision.kt new file mode 100644 index 00000000..f7a9c753 --- /dev/null +++ b/demo/playground/src/jvmMain/kotlin/controlVision.kt @@ -0,0 +1,59 @@ +package space.kscience.visionforge.examples + +import kotlinx.html.p +import space.kscience.visionforge.VisionControlEvent +import space.kscience.visionforge.html.* +import space.kscience.visionforge.onClick + + +fun main() = serve { + + val events = ArrayDeque(10) + + val html = VisionOfPlainHtml() + + fun pushEvent(event: VisionControlEvent) { + events.addFirst(event) + if (events.size >= 10) { + events.removeLast() + } + html.content { + events.forEach { event -> + p { + text(event.toString()) + } + } + } + } + + vision { + htmlCheckBox { + checked = true + onValueChange(context) { + pushEvent(this) + } + } + } + + vision { + htmlRangeField(1, 10) { + numberValue = 4 + onValueChange(context) { + pushEvent(this) + } + } + } + + + vision { + button("Click me"){ + onClick(context){ + pushEvent(this) + } + } + } + + + + vision(html) +} \ No newline at end of file diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/ControlVision.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/ControlVision.kt index 20525b90..fec77548 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/ControlVision.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/ControlVision.kt @@ -8,14 +8,13 @@ import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable -import space.kscience.dataforge.meta.Meta -import space.kscience.dataforge.meta.MetaRepr -import space.kscience.dataforge.meta.MutableMeta -import space.kscience.dataforge.meta.Value +import space.kscience.dataforge.meta.* +import space.kscience.dataforge.names.Name +import space.kscience.dataforge.names.parseAsName @Serializable @SerialName("control") -public abstract class VisionControlEvent : VisionEvent, MetaRepr { +public sealed class VisionControlEvent : VisionEvent, MetaRepr { public abstract val meta: Meta override fun toMeta(): Meta = meta @@ -24,30 +23,41 @@ public abstract class VisionControlEvent : VisionEvent, MetaRepr { public interface ControlVision : Vision { public val controlEventFlow: SharedFlow - public fun dispatchControlEvent(event: VisionControlEvent) + public suspend fun dispatchControlEvent(event: VisionControlEvent) - override fun receiveEvent(event: VisionEvent) { + override suspend fun receiveEvent(event: VisionEvent) { if (event is VisionControlEvent) { dispatchControlEvent(event) } else super.receiveEvent(event) } } + /** * @param payload The optional payload associated with the click event. */ @Serializable @SerialName("control.click") -public class VisionClickEvent(public val payload: Meta = Meta.EMPTY) : VisionControlEvent() { - override val meta: Meta get() = Meta { ::payload.name put payload } +public class VisionClickEvent(override val meta: Meta) : VisionControlEvent() { + public val payload: Meta? by meta.node() + public val name: Name? get() = meta["name"].string?.parseAsName() + + override fun toString(): String = meta.toString() } +public fun VisionClickEvent(payload: Meta = Meta.EMPTY, name: Name? = null): VisionClickEvent = VisionClickEvent( + Meta { + VisionClickEvent::payload.name put payload + VisionClickEvent::name.name put name.toString() + } +) + public interface ClickControl : ControlVision { /** * Create and dispatch a click event */ - public fun click(builder: MutableMeta.() -> Unit = {}) { + public suspend fun click(builder: MutableMeta.() -> Unit = {}) { dispatchControlEvent(VisionClickEvent(Meta(builder))) } } @@ -64,7 +74,18 @@ public fun ClickControl.onClick(scope: CoroutineScope, block: suspend VisionClic public class VisionValueChangeEvent(override val meta: Meta) : VisionControlEvent() { public val value: Value? get() = meta.value + + /** + * The name of a control that fired the event + */ + public val name: Name? get() = meta["name"]?.string?.parseAsName() + + override fun toString(): String = meta.toString() } -public fun VisionValueChangeEvent(value: Value?): VisionValueChangeEvent = - VisionValueChangeEvent(Meta { this.value = value }) +public fun VisionValueChangeEvent(value: Value?, name: Name? = null): VisionValueChangeEvent = VisionValueChangeEvent( + Meta { + this.value = value + name?.let { set("name", it.toString()) } + } +) diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/Vision.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/Vision.kt index 78f917a9..ece71edd 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/Vision.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/Vision.kt @@ -50,7 +50,7 @@ public interface Vision : Described { /** * Receive and process a generic [VisionEvent]. */ - public fun receiveEvent(event: VisionEvent) { + public suspend fun receiveEvent(event: VisionEvent) { if(event is VisionChange) update(event) else manager?.logger?.warn { "Undispatched event: $event" } } diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionClient.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionClient.kt index e337fea0..7a62de7d 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionClient.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionClient.kt @@ -1,9 +1,7 @@ package space.kscience.visionforge -import kotlinx.coroutines.launch import space.kscience.dataforge.context.Plugin import space.kscience.dataforge.meta.Meta -import space.kscience.dataforge.meta.MetaRepr import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.parseAsName @@ -32,10 +30,4 @@ public fun VisionClient.notifyPropertyChanged(visionName: Name, propertyName: St public fun VisionClient.notifyPropertyChanged(visionName: Name, propertyName: String, item: Boolean) { notifyPropertyChanged(visionName, propertyName.parseAsName(true), Meta(item)) -} - -public fun VisionClient.sendMetaEvent(targetName: Name, payload: MetaRepr): Unit { - context.launch { - sendEvent(targetName, VisionMetaEvent(payload.toMeta())) - } } \ No newline at end of file diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionManager.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionManager.kt index 8799a73f..2d765a35 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionManager.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionManager.kt @@ -69,12 +69,14 @@ public class VisionManager(meta: Meta) : AbstractPlugin(meta), MutableVisionCont defaultDeserializer { SimpleVisionGroup.serializer() } subclass(NullVision.serializer()) subclass(SimpleVisionGroup.serializer()) + subclass(VisionOfPlainHtml.serializer()) subclass(VisionOfHtmlInput.serializer()) subclass(VisionOfNumberField.serializer()) subclass(VisionOfTextField.serializer()) subclass(VisionOfCheckbox.serializer()) subclass(VisionOfRangeField.serializer()) subclass(VisionOfHtmlForm.serializer()) + subclass(VisionOfHtmlButton.serializer()) } } diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionOfHtml.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionOfHtml.kt index 5e597702..0738ddc6 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionOfHtml.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionOfHtml.kt @@ -1,9 +1,11 @@ package space.kscience.visionforge.html -import kotlinx.coroutines.flow.MutableSharedFlow -import kotlinx.coroutines.flow.SharedFlow +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Job +import kotlinx.coroutines.flow.* +import kotlinx.html.DIV import kotlinx.html.InputType -import kotlinx.html.TagConsumer +import kotlinx.html.div import kotlinx.html.stream.createHTML import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @@ -27,8 +29,10 @@ public class VisionOfPlainHtml : VisionOfHtml() { public var content: String? by properties.string() } -public inline fun VisionOfPlainHtml.content(block: TagConsumer<*>.() -> Unit) { - content = createHTML().apply(block).finalize() +public fun VisionOfPlainHtml.content(block: DIV.() -> Unit) { + content = createHTML().apply { + div(block = block) + }.finalize() } @Suppress("UnusedReceiverParameter") @@ -54,15 +58,7 @@ public enum class InputFeedbackMode { NONE } -@Serializable -@SerialName("html.input") -public open class VisionOfHtmlInput( - public val inputType: String, - public val feedbackMode: InputFeedbackMode = InputFeedbackMode.ONCHANGE, -) : VisionOfHtml(), ControlVision { - public var value: Value? by properties.value() - public var disabled: Boolean by properties.boolean { false } - public var fieldName: String? by properties.string() +public abstract class VisionOfHtmlControl: VisionOfHtml(), ControlVision{ @Transient private val mutableControlEventFlow = MutableSharedFlow() @@ -70,14 +66,32 @@ public open class VisionOfHtmlInput( override val controlEventFlow: SharedFlow get() = mutableControlEventFlow - override fun dispatchControlEvent(event: VisionControlEvent) { - if(event is VisionValueChangeEvent){ - this.value = event.value - } - mutableControlEventFlow.tryEmit(event) + override suspend fun dispatchControlEvent(event: VisionControlEvent) { + mutableControlEventFlow.emit(event) } } + +@Serializable +@SerialName("html.input") +public open class VisionOfHtmlInput( + public val inputType: String, + public val feedbackMode: InputFeedbackMode = InputFeedbackMode.ONCHANGE, +) : VisionOfHtmlControl() { + public var value: Value? by properties.value() + public var disabled: Boolean by properties.boolean { false } + public var fieldName: String? by properties.string() + +} + +/** + * Trigger [callback] on each value change + */ +public fun VisionOfHtmlInput.onValueChange( + scope: CoroutineScope = manager?.context ?: error("Coroutine context is not resolved for $this"), + callback: suspend VisionValueChangeEvent.() -> Unit, +): Job = controlEventFlow.filterIsInstance().onEach(callback).launchIn(scope) + @Suppress("UnusedReceiverParameter") public inline fun VisionOutput.htmlInput( inputType: String, @@ -110,7 +124,7 @@ public inline fun VisionOutput.htmlCheckBox( @Serializable @SerialName("html.number") public class VisionOfNumberField : VisionOfHtmlInput(InputType.number.realValue) { - public var number: Number? by properties.number(key = VisionOfHtmlInput::value.name.asName()) + public var numberValue: Number? by properties.number(key = VisionOfHtmlInput::value.name.asName()) } @Suppress("UnusedReceiverParameter") @@ -125,14 +139,14 @@ public class VisionOfRangeField( public val max: Double, public val step: Double = 1.0, ) : VisionOfHtmlInput(InputType.range.realValue) { - public var number: Number? by properties.number(key = VisionOfHtmlInput::value.name.asName()) + public var numberValue: Number? by properties.number(key = VisionOfHtmlInput::value.name.asName()) } @Suppress("UnusedReceiverParameter") public inline fun VisionOutput.htmlRangeField( - min: Double, - max: Double, - step: Double = 1.0, + min: Number, + max: Number, + step: Number = 1.0, block: VisionOfRangeField.() -> Unit = {}, -): VisionOfRangeField = VisionOfRangeField(min, max, step).apply(block) +): VisionOfRangeField = VisionOfRangeField(min.toDouble(), max.toDouble(), step.toDouble()).apply(block) diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionOfHtmlForm.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionOfHtmlForm.kt index e56af874..c128ec6f 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionOfHtmlForm.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionOfHtmlForm.kt @@ -8,6 +8,8 @@ import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable import space.kscience.dataforge.meta.Meta import space.kscience.dataforge.meta.node +import space.kscience.dataforge.meta.string +import space.kscience.visionforge.ClickControl /** * @param formId an id of the element in rendered DOM, this form is bound to @@ -16,7 +18,7 @@ import space.kscience.dataforge.meta.node @SerialName("html.form") public class VisionOfHtmlForm( public val formId: String, -) : VisionOfHtml() { +) : VisionOfHtmlControl() { public var values: Meta? by properties.node() } @@ -26,4 +28,21 @@ public fun TagConsumer.bindForm( ): R = form { this.id = visionOfForm.formId builder() +} + + +@Serializable +@SerialName("html.button") +public class VisionOfHtmlButton : VisionOfHtmlControl(), ClickControl { + public var label: String? by properties.string() +} + + +@Suppress("UnusedReceiverParameter") +public inline fun VisionOutput.button( + text: String, + block: VisionOfHtmlButton.() -> Unit = {}, +): VisionOfHtmlButton = VisionOfHtmlButton().apply { + label = text + block() } \ No newline at end of file diff --git a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/JsVisionClient.kt b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/JsVisionClient.kt index c24ab493..e0dc975a 100644 --- a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/JsVisionClient.kt +++ b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/JsVisionClient.kt @@ -135,7 +135,9 @@ public class JsVisionClient : AbstractPlugin(), VisionClient { } logger.debug { "Got $event for output with name $visionName" } - vision.receiveEvent(event) + context.launch { + vision.receiveEvent(event) + } } else { logger.error { "WebSocket message data is not a string" } } @@ -262,7 +264,8 @@ public class JsVisionClient : AbstractPlugin(), VisionClient { numberVisionRenderer, textVisionRenderer, rangeVisionRenderer, - formVisionRenderer + formVisionRenderer, + buttonVisionRenderer ).associateByName() } else super.content(target) diff --git a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/formRenderers.kt b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/formRenderers.kt new file mode 100644 index 00000000..6a360af8 --- /dev/null +++ b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/formRenderers.kt @@ -0,0 +1,90 @@ +package space.kscience.visionforge + +import kotlinx.browser.document +import kotlinx.coroutines.launch +import kotlinx.html.ButtonType +import kotlinx.html.js.button +import org.w3c.dom.HTMLFormElement +import org.w3c.dom.HTMLInputElement +import org.w3c.dom.get +import org.w3c.xhr.FormData +import space.kscience.dataforge.context.debug +import space.kscience.dataforge.context.logger +import space.kscience.dataforge.meta.* +import space.kscience.dataforge.names.Name +import space.kscience.visionforge.html.VisionOfHtmlButton +import space.kscience.visionforge.html.VisionOfHtmlForm + + +internal fun FormData.toMeta(): Meta { + @Suppress("UNUSED_VARIABLE") val formData = this + //val res = js("Object.fromEntries(formData);") + val `object` = js("{}") + //language=JavaScript + js( + """ + formData.forEach(function(value, key){ + // Reflect.has in favor of: object.hasOwnProperty(key) + if(!Reflect.has(object, key)){ + object[key] = value; + return; + } + if(!Array.isArray(object[key])){ + object[key] = [object[key]]; + } + object[key].push(value); + }); + """ + ) + return DynamicMeta(`object`) +} + + +public fun VisionClient.sendMetaEvent(targetName: Name, payload: MetaRepr): Unit { + context.launch { + sendEvent(targetName, VisionMetaEvent(payload.toMeta())) + } +} + +internal val formVisionRenderer: ElementVisionRenderer = + ElementVisionRenderer { name, client, vision, _ -> + + val form = document.getElementById(vision.formId) as? HTMLFormElement + ?: error("An element with id = '${vision.formId} is not a form") + + form.subscribeToVision(vision) + + vision.manager?.logger?.debug { "Adding hooks to form with id = '$vision.formId'" } + + vision.useProperty(VisionOfHtmlForm::values) { values -> + vision.manager?.logger?.debug { "Updating form '${vision.formId}' with values $values" } + val inputs = form.getElementsByTagName("input") + values?.valueSequence()?.forEach { (token, value) -> + (inputs[token.toString()] as? HTMLInputElement)?.value = value.toString() + } + } + + form.onsubmit = { event -> + event.preventDefault() + val formData = FormData(form).toMeta() + client.sendMetaEvent(name, formData) + console.info("Sent: ${formData.toMap()}") + false + } + } + +internal val buttonVisionRenderer: ElementVisionRenderer = + ElementVisionRenderer { name, client, vision, _ -> + button(type = ButtonType.button).also { button -> + button.subscribeToVision(vision) + button.onclick = { + client.context.launch { + client.sendEvent(name, VisionClickEvent(name = name)) + } + } + vision.useProperty(VisionOfHtmlButton::label) { + button.innerHTML = it ?: "" + } + + } + } diff --git a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/inputRenderers.kt b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/inputRenderers.kt index a43a99f1..4112370a 100644 --- a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/inputRenderers.kt +++ b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/inputRenderers.kt @@ -1,21 +1,17 @@ package space.kscience.visionforge -import kotlinx.browser.document import kotlinx.coroutines.launch import kotlinx.dom.clear import kotlinx.html.InputType import kotlinx.html.div -import kotlinx.html.dom.append import kotlinx.html.js.input import org.w3c.dom.HTMLElement -import org.w3c.dom.HTMLFormElement import org.w3c.dom.HTMLInputElement import org.w3c.dom.events.Event -import org.w3c.dom.get -import org.w3c.xhr.FormData -import space.kscience.dataforge.context.debug -import space.kscience.dataforge.context.logger -import space.kscience.dataforge.meta.* +import space.kscience.dataforge.meta.Value +import space.kscience.dataforge.meta.asValue +import space.kscience.dataforge.meta.double +import space.kscience.dataforge.meta.string import space.kscience.dataforge.names.Name import space.kscience.visionforge.html.* @@ -24,7 +20,7 @@ import space.kscience.visionforge.html.* * * @param vision The vision to subscribe to. */ -private fun HTMLElement.subscribeToVision(vision: VisionOfHtml) { +internal fun HTMLElement.subscribeToVision(vision: VisionOfHtml) { vision.useProperty(VisionOfHtml::classes) { classList.value = classes.joinToString(separator = " ") } @@ -33,7 +29,7 @@ private fun HTMLElement.subscribeToVision(vision: VisionOfHtml) { private fun VisionClient.sendInputEvent(name: Name, value: Value?) { context.launch { - sendEvent(name, VisionValueChangeEvent(value)) + sendEvent(name, VisionValueChangeEvent(value, name)) } } @@ -51,43 +47,39 @@ private fun HTMLInputElement.subscribeToInput(inputVision: VisionOfHtmlInput) { internal val htmlVisionRenderer: ElementVisionRenderer = ElementVisionRenderer { _, _, vision, _ -> - div {}.also { div -> + div().also { div -> div.subscribeToVision(vision) vision.useProperty(VisionOfPlainHtml::content) { div.clear() - div.append { - - } - div.textContent = it + if (it != null) div.innerHTML = it } } } -internal val inputVisionRenderer: ElementVisionRenderer = - ElementVisionRenderer( - acceptRating = ElementVisionRenderer.DEFAULT_RATING - 1 - ) { name, client, vision, _ -> - input { - type = InputType.text - }.also { htmlInputElement -> - val onEvent: (Event) -> Unit = { - client.sendInputEvent(name, htmlInputElement.value.asValue()) - } +internal val inputVisionRenderer: ElementVisionRenderer = ElementVisionRenderer( + acceptRating = ElementVisionRenderer.DEFAULT_RATING - 1 +) { name, client, vision, _ -> + input { + type = InputType.text + }.also { htmlInputElement -> + val onEvent: (Event) -> Unit = { + client.sendInputEvent(name, htmlInputElement.value.asValue()) + } - when (vision.feedbackMode) { - InputFeedbackMode.ONCHANGE -> htmlInputElement.onchange = onEvent + when (vision.feedbackMode) { + InputFeedbackMode.ONCHANGE -> htmlInputElement.onchange = onEvent - InputFeedbackMode.ONINPUT -> htmlInputElement.oninput = onEvent - InputFeedbackMode.NONE -> {} - } + InputFeedbackMode.ONINPUT -> htmlInputElement.oninput = onEvent + InputFeedbackMode.NONE -> {} + } - htmlInputElement.subscribeToInput(vision) - vision.useProperty(VisionOfHtmlInput::value) { - htmlInputElement.value = it?.string ?: "" - } + htmlInputElement.subscribeToInput(vision) + vision.useProperty(VisionOfHtmlInput::value) { + htmlInputElement.value = it?.string ?: "" } } +} internal val checkboxVisionRenderer: ElementVisionRenderer = ElementVisionRenderer { name, client, vision, _ -> @@ -95,7 +87,7 @@ internal val checkboxVisionRenderer: ElementVisionRenderer = type = InputType.checkBox }.also { htmlInputElement -> val onEvent: (Event) -> Unit = { - client.sendInputEvent(name, htmlInputElement.value.asValue()) + client.sendInputEvent(name, htmlInputElement.checked.asValue()) } @@ -140,7 +132,7 @@ internal val textVisionRenderer: ElementVisionRenderer = internal val numberVisionRenderer: ElementVisionRenderer = ElementVisionRenderer { name, client, vision, _ -> input { - type = InputType.text + type = InputType.number }.also { htmlInputElement -> val onEvent: (Event) -> Unit = { @@ -165,7 +157,7 @@ internal val numberVisionRenderer: ElementVisionRenderer = internal val rangeVisionRenderer: ElementVisionRenderer = ElementVisionRenderer { name, client, vision, _ -> input { - type = InputType.text + type = InputType.range min = vision.min.toString() max = vision.max.toString() step = vision.step.toString() @@ -189,53 +181,3 @@ internal val rangeVisionRenderer: ElementVisionRenderer = } } } - -internal fun FormData.toMeta(): Meta { - @Suppress("UNUSED_VARIABLE") val formData = this - //val res = js("Object.fromEntries(formData);") - val `object` = js("{}") - //language=JavaScript - js( - """ - formData.forEach(function(value, key){ - // Reflect.has in favor of: object.hasOwnProperty(key) - if(!Reflect.has(object, key)){ - object[key] = value; - return; - } - if(!Array.isArray(object[key])){ - object[key] = [object[key]]; - } - object[key].push(value); - }); - """ - ) - return DynamicMeta(`object`) -} - -internal val formVisionRenderer: ElementVisionRenderer = - ElementVisionRenderer { name, client, vision, _ -> - - val form = document.getElementById(vision.formId) as? HTMLFormElement - ?: error("An element with id = '${vision.formId} is not a form") - - form.subscribeToVision(vision) - - vision.manager?.logger?.debug { "Adding hooks to form with id = '$vision.formId'" } - - vision.useProperty(VisionOfHtmlForm::values) { values -> - vision.manager?.logger?.debug { "Updating form '${vision.formId}' with values $values" } - val inputs = form.getElementsByTagName("input") - values?.valueSequence()?.forEach { (token, value) -> - (inputs[token.toString()] as? HTMLInputElement)?.value = value.toString() - } - } - - form.onsubmit = { event -> - event.preventDefault() - val formData = FormData(form).toMeta() - client.sendMetaEvent(name, formData) - console.info("Sent: ${formData.toMap()}") - false - } - } \ No newline at end of file From 9c2db6d32110bd26732fc8d13c385209c181f16a Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Mon, 11 Dec 2023 22:57:23 +0300 Subject: [PATCH 15/41] Allow custom events --- visionforge-core/build.gradle.kts | 4 ++-- .../space/kscience/visionforge/ControlVision.kt | 8 ++++---- .../space/kscience/visionforge/VisionEvent.kt | 11 ++++++++--- .../space/kscience/visionforge/VisionManager.kt | 14 +++++++++++--- .../space/kscience/visionforge/JsVisionClient.kt | 12 ++++-------- .../kscience/visionforge/server/VisionServer.kt | 12 ++++-------- 6 files changed, 33 insertions(+), 28 deletions(-) diff --git a/visionforge-core/build.gradle.kts b/visionforge-core/build.gradle.kts index f2cac4c6..bc7103b9 100644 --- a/visionforge-core/build.gradle.kts +++ b/visionforge-core/build.gradle.kts @@ -8,11 +8,11 @@ kscience { jvm() js() native() +// wasm() useCoroutines() - dependencies { + commonMain { api("space.kscience:dataforge-context:$dataforgeVersion") api(spclibs.kotlinx.html) -// api("org.jetbrains.kotlin-wrappers:kotlin-css") } jsMain { api("org.jetbrains.kotlin-wrappers:kotlin-extensions") diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/ControlVision.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/ControlVision.kt index fec77548..dc27662f 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/ControlVision.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/ControlVision.kt @@ -12,12 +12,12 @@ import space.kscience.dataforge.meta.* import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.parseAsName -@Serializable -@SerialName("control") -public sealed class VisionControlEvent : VisionEvent, MetaRepr { +public abstract class VisionControlEvent : VisionEvent, MetaRepr { public abstract val meta: Meta override fun toMeta(): Meta = meta + + override fun toString(): String = toMeta().toString() } public interface ControlVision : Vision { @@ -42,7 +42,7 @@ public class VisionClickEvent(override val meta: Meta) : VisionControlEvent() { public val payload: Meta? by meta.node() public val name: Name? get() = meta["name"].string?.parseAsName() - override fun toString(): String = meta.toString() + override fun toString(): String = meta.toString() } public fun VisionClickEvent(payload: Meta = Meta.EMPTY, name: Name? = null): VisionClickEvent = VisionClickEvent( diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionEvent.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionEvent.kt index de0b2643..e0f5beca 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionEvent.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionEvent.kt @@ -3,13 +3,13 @@ package space.kscience.visionforge import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable import space.kscience.dataforge.meta.Meta +import space.kscience.dataforge.meta.MetaRepr import space.kscience.dataforge.names.Name /** * An event propagated from client to a server */ -@Serializable -public sealed interface VisionEvent { +public interface VisionEvent { public companion object { public val CLICK_EVENT_KEY: Name get() = Name.of("events", "click", "payload") } @@ -20,4 +20,9 @@ public sealed interface VisionEvent { */ @Serializable @SerialName("meta") -public class VisionMetaEvent(public val meta: Meta) : VisionEvent \ No newline at end of file +public class VisionMetaEvent(public val meta: Meta) : VisionEvent, MetaRepr { + override fun toMeta(): Meta = meta + + override fun toString(): String = toMeta().toString() + +} \ No newline at end of file diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionManager.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionManager.kt index 2d765a35..9b5a21ac 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionManager.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionManager.kt @@ -30,10 +30,11 @@ public class VisionManager(meta: Meta) : AbstractPlugin(meta), MutableVisionCont } } - public val jsonFormat: Json - get() = Json(defaultJson) { + public val jsonFormat: Json by lazy { + Json(defaultJson) { serializersModule = this@VisionManager.serializersModule } + } public fun decodeFromString(string: String): Vision = jsonFormat.decodeFromString(visionSerializer, string) @@ -78,6 +79,13 @@ public class VisionManager(meta: Meta) : AbstractPlugin(meta), MutableVisionCont subclass(VisionOfHtmlForm.serializer()) subclass(VisionOfHtmlButton.serializer()) } + + polymorphic(VisionEvent::class) { + subclass(VisionChange.serializer()) + subclass(VisionMetaEvent.serializer()) + subclass(VisionClickEvent.serializer()) + subclass(VisionValueChangeEvent.serializer()) + } } @OptIn(ExperimentalSerializationApi::class) @@ -107,7 +115,7 @@ public abstract class VisionPlugin(meta: Meta = Meta.EMPTY) : AbstractPlugin(met /** * Fetch a [VisionManager] from this plugin or create a child plugin with a [VisionManager] */ -public val Context.visionManager: VisionManager get() = request(VisionManager ) +public val Context.visionManager: VisionManager get() = request(VisionManager) public fun Vision.encodeToString(): String = manager?.encodeToString(this) ?: error("Orphan vision could not be encoded") diff --git a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/JsVisionClient.kt b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/JsVisionClient.kt index e0dc975a..45af671c 100644 --- a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/JsVisionClient.kt +++ b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/JsVisionClient.kt @@ -12,6 +12,7 @@ import kotlinx.coroutines.isActive import kotlinx.coroutines.launch import kotlinx.coroutines.sync.Mutex import kotlinx.coroutines.sync.withLock +import kotlinx.serialization.encodeToString import org.w3c.dom.* import org.w3c.dom.url.URL import space.kscience.dataforge.context.* @@ -81,9 +82,7 @@ public class JsVisionClient : AbstractPlugin(), VisionClient { } } - private val eventCollector by lazy { - MutableSharedFlow>(meta["feedback.eventCache"].int ?: 100) - } + private val eventCollector = MutableSharedFlow>(meta["feedback.eventCache"].int ?: 100) /** * Send a custom feedback event @@ -122,10 +121,7 @@ public class JsVisionClient : AbstractPlugin(), VisionClient { onmessage = { messageEvent -> val stringData: String? = messageEvent.data as? String if (stringData != null) { - val event: VisionEvent = visionManager.jsonFormat.decodeFromString( - VisionEvent.serializer(), - stringData - ) + val event: VisionEvent = visionManager.jsonFormat.decodeFromString(stringData) // If change contains root vision replacement, do it if (event is VisionChange) { @@ -154,7 +150,7 @@ public class JsVisionClient : AbstractPlugin(), VisionClient { feedbackJob = visionManager.context.launch { //launch a separate coroutine to send events to the backend eventCollector.filter { it.first == visionName }.onEach { - send(visionManager.jsonFormat.encodeToString(VisionEvent.serializer(), it.second)) + send(visionManager.jsonFormat.encodeToString(it.second)) }.launchIn(this) //aggregate atomic changes diff --git a/visionforge-server/src/main/kotlin/space/kscience/visionforge/server/VisionServer.kt b/visionforge-server/src/main/kotlin/space/kscience/visionforge/server/VisionServer.kt index 3c5e397a..d89bf1c0 100644 --- a/visionforge-server/src/main/kotlin/space/kscience/visionforge/server/VisionServer.kt +++ b/visionforge-server/src/main/kotlin/space/kscience/visionforge/server/VisionServer.kt @@ -20,6 +20,7 @@ import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import kotlinx.html.* +import kotlinx.serialization.encodeToString import space.kscience.dataforge.context.Context import space.kscience.dataforge.context.ContextAware import space.kscience.dataforge.meta.* @@ -97,9 +98,7 @@ public fun Application.serveVisionData( for (frame in incoming) { val data = frame.data.decodeToString() application.log.debug("Received event for $name: \n$data") - val event = configuration.visionManager.jsonFormat.decodeFromString( - VisionEvent.serializer(), data - ) + val event: VisionEvent = configuration.visionManager.jsonFormat.decodeFromString(data) vision.receiveEvent(event) } @@ -108,10 +107,7 @@ public fun Application.serveVisionData( try { withContext(configuration.context.coroutineContext) { vision.flowChanges(configuration.updateInterval.milliseconds).onEach { event -> - val json = configuration.visionManager.jsonFormat.encodeToString( - VisionEvent.serializer(), - event - ) + val json = configuration.visionManager.jsonFormat.encodeToString(event) application.log.debug("Sending update for $name: \n$json") outgoing.send(Frame.Text(json)) }.collect() @@ -155,7 +151,7 @@ public fun Application.visionPage( headers: Collection, connector: EngineConnectorConfig? = null, visionFragment: HtmlVisionFragment, -){ +) { require(WebSockets) val collector: MutableMap = mutableMapOf() From 0c9d849e976913d3da2411e485161c0e427838ab Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Tue, 12 Dec 2023 09:17:14 +0300 Subject: [PATCH 16/41] 0.3.0-RC --- README.md | 126 +-- build.gradle.kts | 3 +- cern-root-loader/api/cern-root-loader.api | 249 +++-- demo/gdml/api/gdml.api | 18 - demo/muon-monitor/api/muon-monitor.api | 22 +- demo/playground/api/playground.api | 42 +- demo/sat-demo/api/sat-demo.api | 5 + demo/sat-demo/build.gradle.kts | 7 +- .../kotlin/ru/mipt/npm/sat/geometry.kt | 0 .../kotlin/ru/mipt/npm/sat/satServer.kt | 0 .../kotlin/ru/mipt/npm/sat/static.kt | 0 .../resources/css/styles.css | 0 demo/solid-showcase/api/solid-showcase.api | 36 +- visionforge-core/README.md | 15 +- visionforge-core/api/visionforge-core.api | 863 +++++++++++------ visionforge-gdml/README.md | 15 +- visionforge-gdml/api/visionforge-gdml.api | 5 +- visionforge-jupyter/README.md | 19 +- .../api/visionforge-jupyter.api | 54 ++ .../api/visionforge-jupyter-common.api | 8 + visionforge-markdown/README.md | 15 +- .../api/visionforge-markdown.api | 23 +- visionforge-plotly/README.md | 15 +- visionforge-plotly/api/visionforge-plotly.api | 18 +- visionforge-server/README.md | 15 +- visionforge-server/api/visionforge-server.api | 58 +- visionforge-server/build.gradle.kts | 5 +- .../visionforge/server/VisionServer.kt | 0 .../server/applicationExtensions.kt | 0 visionforge-solid/README.md | 15 +- visionforge-solid/api/visionforge-solid.api | 914 +++++++++++------- visionforge-tables/README.md | 15 +- visionforge-threejs/README.md | 15 +- .../visionforge-threejs-server/README.md | 15 +- .../api/visionforge-threejs-server.api | 6 +- 35 files changed, 1584 insertions(+), 1032 deletions(-) rename demo/sat-demo/src/{main => jvmMain}/kotlin/ru/mipt/npm/sat/geometry.kt (100%) rename demo/sat-demo/src/{main => jvmMain}/kotlin/ru/mipt/npm/sat/satServer.kt (100%) rename demo/sat-demo/src/{main => jvmMain}/kotlin/ru/mipt/npm/sat/static.kt (100%) rename demo/sat-demo/src/{main => jvmMain}/resources/css/styles.css (100%) create mode 100644 visionforge-jupyter/api/visionforge-jupyter.api create mode 100644 visionforge-jupyter/visionforge-jupyter-common/api/visionforge-jupyter-common.api rename visionforge-server/src/{main => jvmMain}/kotlin/space/kscience/visionforge/server/VisionServer.kt (100%) rename visionforge-server/src/{main => jvmMain}/kotlin/space/kscience/visionforge/server/applicationExtensions.kt (100%) diff --git a/README.md b/README.md index eeeaab9e..f8fb04fe 100644 --- a/README.md +++ b/README.md @@ -61,157 +61,104 @@ To learn more about DataForge, please consult the following URLs: ## Modules contained in this repository -
-* ### [cern-root-loader](cern-root-loader) -> +### [cern-root-loader](cern-root-loader) > > **Maturity**: EXPERIMENTAL -
-* ### [demo](demo) -> +### [demo](demo) > > **Maturity**: EXPERIMENTAL -
-* ### [jupyter](jupyter) -> +### [ui](ui) > > **Maturity**: EXPERIMENTAL -
-* ### [ui](ui) -> -> -> **Maturity**: EXPERIMENTAL -
- -* ### [visionforge-core](visionforge-core) -> +### [visionforge-core](visionforge-core) > > **Maturity**: DEVELOPMENT -
-* ### [visionforge-fx](visionforge-fx) -> -> -> **Maturity**: PROTOTYPE -
- -* ### [visionforge-gdml](visionforge-gdml) -> +### [visionforge-gdml](visionforge-gdml) > > **Maturity**: EXPERIMENTAL -
-* ### [visionforge-markdown](visionforge-markdown) -> +### [visionforge-jupyter](visionforge-jupyter) +> Common visionforge jupyter module > > **Maturity**: EXPERIMENTAL -
-* ### [visionforge-plotly](visionforge-plotly) -> +### [visionforge-markdown](visionforge-markdown) > > **Maturity**: EXPERIMENTAL -
-* ### [visionforge-server](visionforge-server) -> +### [visionforge-plotly](visionforge-plotly) > > **Maturity**: EXPERIMENTAL -
-* ### [visionforge-solid](visionforge-solid) -> +### [visionforge-server](visionforge-server) +> +> **Maturity**: EXPERIMENTAL + +### [visionforge-solid](visionforge-solid) > > **Maturity**: DEVELOPMENT -
-* ### [visionforge-tables](visionforge-tables) -> +### [visionforge-tables](visionforge-tables) > > **Maturity**: PROTOTYPE -
-* ### [visionforge-threejs](visionforge-threejs) -> +### [visionforge-threejs](visionforge-threejs) > > **Maturity**: EXPERIMENTAL -
-* ### [gdml](demo/gdml) -> +### [demo/gdml](demo/gdml) > > **Maturity**: EXPERIMENTAL -
-* ### [js-playground](demo/js-playground) -> +### [demo/js-playground](demo/js-playground) > > **Maturity**: EXPERIMENTAL -
-* ### [muon-monitor](demo/muon-monitor) -> +### [demo/muon-monitor](demo/muon-monitor) > > **Maturity**: EXPERIMENTAL -
-* ### [playground](demo/playground) -> +### [demo/playground](demo/playground) > > **Maturity**: EXPERIMENTAL -
-* ### [plotly-fx](demo/plotly-fx) -> +### [demo/sat-demo](demo/sat-demo) > > **Maturity**: EXPERIMENTAL -
-* ### [sat-demo](demo/sat-demo) -> +### [demo/solid-showcase](demo/solid-showcase) > > **Maturity**: EXPERIMENTAL -
-* ### [solid-showcase](demo/solid-showcase) -> +### [ui/bootstrap](ui/bootstrap) > > **Maturity**: EXPERIMENTAL -
-* ### [visionforge-jupyter-gdml](jupyter/visionforge-jupyter-gdml) -> +### [ui/compose](ui/compose) > > **Maturity**: EXPERIMENTAL -
-* ### [bootstrap](ui/bootstrap) -> +### [ui/react](ui/react) > > **Maturity**: EXPERIMENTAL -
-* ### [react](ui/react) -> +### [ui/ring](ui/ring) > > **Maturity**: EXPERIMENTAL -
-* ### [ring](ui/ring) -> +### [visionforge-jupyter/visionforge-jupyter-common](visionforge-jupyter/visionforge-jupyter-common) +> Jupyter api artifact including all common modules > > **Maturity**: EXPERIMENTAL -
-* ### [visionforge-threejs-server](visionforge-threejs/visionforge-threejs-server) -> +### [visionforge-threejs/visionforge-threejs-server](visionforge-threejs/visionforge-threejs-server) > > **Maturity**: EXPERIMENTAL -
**Class diagram:** @@ -283,6 +230,21 @@ Visualization example for geometry defined as GDML file. ![](docs/images/gdml-demo.png) +## Stability and documentation + +VisionForge is a modular library. Different modules provide different features with different API stability guarantees. All core modules are released with the same version, but with different API change policy. The features are described in module definitions below. The module stability could have the following levels: + +* **PROTOTYPE**. On this level there are no compatibility guarantees. All methods and classes form those modules could break any moment. You can still use it, but be sure to fix the specific version. +* **EXPERIMENTAL**. The general API is decided, but some changes could be made. Volatile API is marked + with `@DFExperimental` or other stability warning annotations. +* **DEVELOPMENT**. API breaking generally follows semantic versioning ideology. There could be changes in minor + versions, but not in patch versions. API is protected with [binary-compatibility-validator](https://github.com/Kotlin/binary-compatibility-validator) tool. +* **STABLE**. The API stabilized. Breaking changes are allowed only in major releases. + +Additionally, one should note that the VisionForge Json format impacts the reproducibility of stored vision fragments. There should not be any breaks of the format between major releases. All problems should be reported. + +The documentation for the project is a work in progress. Please report any issues with missing, vague or wrong information. The contributions into documentation are quite welcome. + ## Thanks and references The original three.js bindings were made by [Lars Ivar Hatledal](https://github.com/markaren), but the project is discontinued right now. diff --git a/build.gradle.kts b/build.gradle.kts index 1a9de8d2..57e42d2b 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -8,11 +8,10 @@ plugins { } val dataforgeVersion by extra("0.7.1") -val fxVersion by extra("11") allprojects { group = "space.kscience" - version = "0.3.0-dev-18" + version = "0.3.0-RC" } subprojects { diff --git a/cern-root-loader/api/cern-root-loader.api b/cern-root-loader/api/cern-root-loader.api index 2788976b..7150af55 100644 --- a/cern-root-loader/api/cern-root-loader.api +++ b/cern-root-loader/api/cern-root-loader.api @@ -1,3 +1,77 @@ +public final class ru/mipt/npm/root/BMN { + public static final field INSTANCE Lru/mipt/npm/root/BMN; + public final fun getJson ()Lkotlinx/serialization/json/Json; + public final fun readEventJson (Ljava/lang/String;)Lru/mipt/npm/root/BmnEventContainer; +} + +public final class ru/mipt/npm/root/BMNKt { + public static final fun toVector (Lru/mipt/npm/root/FairTrackParam;)Lspace/kscience/visionforge/solid/Float32Vector3D; +} + +public final class ru/mipt/npm/root/BmnEventContainer { + public fun (Ljava/util/List;Ljava/util/List;)V + public final fun getBmnGlobalTracks ()Ljava/util/List; + public final fun getCbmTracks ()Ljava/util/List; +} + +public final class ru/mipt/npm/root/BmnGlobalTrack { + public static final field Companion Lru/mipt/npm/root/BmnGlobalTrack$Companion; + public fun (Lru/mipt/npm/root/FairTrackParam;Lru/mipt/npm/root/FairTrackParam;)V + public final fun component1 ()Lru/mipt/npm/root/FairTrackParam; + public final fun component2 ()Lru/mipt/npm/root/FairTrackParam; + public final fun copy (Lru/mipt/npm/root/FairTrackParam;Lru/mipt/npm/root/FairTrackParam;)Lru/mipt/npm/root/BmnGlobalTrack; + public static synthetic fun copy$default (Lru/mipt/npm/root/BmnGlobalTrack;Lru/mipt/npm/root/FairTrackParam;Lru/mipt/npm/root/FairTrackParam;ILjava/lang/Object;)Lru/mipt/npm/root/BmnGlobalTrack; + public fun equals (Ljava/lang/Object;)Z + public final fun getFParamFirst ()Lru/mipt/npm/root/FairTrackParam; + public final fun getFParamLast ()Lru/mipt/npm/root/FairTrackParam; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final class ru/mipt/npm/root/BmnGlobalTrack$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lru/mipt/npm/root/BmnGlobalTrack$$serializer; + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lru/mipt/npm/root/BmnGlobalTrack; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lru/mipt/npm/root/BmnGlobalTrack;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class ru/mipt/npm/root/BmnGlobalTrack$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class ru/mipt/npm/root/CbmStsTrack { + public static final field Companion Lru/mipt/npm/root/CbmStsTrack$Companion; + public fun (Lru/mipt/npm/root/FairTrackParam;Lru/mipt/npm/root/FairTrackParam;)V + public final fun component1 ()Lru/mipt/npm/root/FairTrackParam; + public final fun component2 ()Lru/mipt/npm/root/FairTrackParam; + public final fun copy (Lru/mipt/npm/root/FairTrackParam;Lru/mipt/npm/root/FairTrackParam;)Lru/mipt/npm/root/CbmStsTrack; + public static synthetic fun copy$default (Lru/mipt/npm/root/CbmStsTrack;Lru/mipt/npm/root/FairTrackParam;Lru/mipt/npm/root/FairTrackParam;ILjava/lang/Object;)Lru/mipt/npm/root/CbmStsTrack; + public fun equals (Ljava/lang/Object;)Z + public final fun getFParamFirst ()Lru/mipt/npm/root/FairTrackParam; + public final fun getFParamLast ()Lru/mipt/npm/root/FairTrackParam; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final class ru/mipt/npm/root/CbmStsTrack$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lru/mipt/npm/root/CbmStsTrack$$serializer; + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lru/mipt/npm/root/CbmStsTrack; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lru/mipt/npm/root/CbmStsTrack;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class ru/mipt/npm/root/CbmStsTrack$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + public final class ru/mipt/npm/root/DGeoBoolNode : ru/mipt/npm/root/DObject { public fun (Lspace/kscience/dataforge/meta/Meta;Lru/mipt/npm/root/DObjectCache;)V public final fun getFLeft ()Lru/mipt/npm/root/DGeoShape; @@ -6,6 +80,28 @@ public final class ru/mipt/npm/root/DGeoBoolNode : ru/mipt/npm/root/DObject { public final fun getFRightMat ()Lru/mipt/npm/root/DGeoMatrix; } +public class ru/mipt/npm/root/DGeoCombiTrans : ru/mipt/npm/root/DGeoMatrix { + public fun (Lspace/kscience/dataforge/meta/Meta;Lru/mipt/npm/root/DObjectCache;)V + public final fun getFRotation ()Lru/mipt/npm/root/DGeoRotation; + public final fun getFTranslation ()[D +} + +public final class ru/mipt/npm/root/DGeoGenTrans : ru/mipt/npm/root/DGeoCombiTrans { + public fun (Lspace/kscience/dataforge/meta/Meta;Lru/mipt/npm/root/DObjectCache;)V + public final fun getFScale ()[D +} + +public final class ru/mipt/npm/root/DGeoHMatrix : ru/mipt/npm/root/DGeoMatrix { + public fun (Lspace/kscience/dataforge/meta/Meta;Lru/mipt/npm/root/DObjectCache;)V + public final fun getFRotation ()Lru/mipt/npm/root/DGeoRotation; + public final fun getFScale ()[D + public final fun getFTranslation ()[D +} + +public final class ru/mipt/npm/root/DGeoIdentity : ru/mipt/npm/root/DGeoMatrix { + public fun (Lspace/kscience/dataforge/meta/Meta;Lru/mipt/npm/root/DObjectCache;)V +} + public final class ru/mipt/npm/root/DGeoManager : ru/mipt/npm/root/DNamed { public static final field Companion Lru/mipt/npm/root/DGeoManager$Companion; public fun (Lspace/kscience/dataforge/meta/Meta;Lru/mipt/npm/root/DObjectCache;)V @@ -23,8 +119,8 @@ public final class ru/mipt/npm/root/DGeoMaterial : ru/mipt/npm/root/DNamed { public fun (Lspace/kscience/dataforge/meta/Meta;Lru/mipt/npm/root/DObjectCache;)V } -public class ru/mipt/npm/root/DGeoMatrix : ru/mipt/npm/root/DNamed { - public fun (Lspace/kscience/dataforge/meta/Meta;Lru/mipt/npm/root/DObjectCache;)V +public abstract class ru/mipt/npm/root/DGeoMatrix : ru/mipt/npm/root/DNamed { + public synthetic fun (Lspace/kscience/dataforge/meta/Meta;Lru/mipt/npm/root/DObjectCache;Lkotlin/jvm/internal/DefaultConstructorMarker;)V } public final class ru/mipt/npm/root/DGeoMedium : ru/mipt/npm/root/DNamed { @@ -38,7 +134,12 @@ public final class ru/mipt/npm/root/DGeoNode : ru/mipt/npm/root/DNamed { public final fun getFVolume ()Lru/mipt/npm/root/DGeoVolume; } -public class ru/mipt/npm/root/DGeoScale : ru/mipt/npm/root/DGeoMatrix { +public final class ru/mipt/npm/root/DGeoRotation : ru/mipt/npm/root/DGeoMatrix { + public fun (Lspace/kscience/dataforge/meta/Meta;Lru/mipt/npm/root/DObjectCache;)V + public final fun getFRotationMatrix ()[D +} + +public final class ru/mipt/npm/root/DGeoScale : ru/mipt/npm/root/DGeoMatrix { public fun (Lspace/kscience/dataforge/meta/Meta;Lru/mipt/npm/root/DObjectCache;)V public final fun getFScale ()[D public final fun getX ()D @@ -53,6 +154,11 @@ public final class ru/mipt/npm/root/DGeoShape : ru/mipt/npm/root/DNamed { public final fun getFDZ ()D } +public final class ru/mipt/npm/root/DGeoTranslation : ru/mipt/npm/root/DGeoMatrix { + public fun (Lspace/kscience/dataforge/meta/Meta;Lru/mipt/npm/root/DObjectCache;)V + public final fun getFTranslation ()[D +} + public final class ru/mipt/npm/root/DGeoVolume : ru/mipt/npm/root/DNamed, space/kscience/dataforge/misc/Named { public fun (Lspace/kscience/dataforge/meta/Meta;Lru/mipt/npm/root/DObjectCache;)V public final fun getFFillColor ()Ljava/lang/Integer; @@ -94,7 +200,45 @@ public final class ru/mipt/npm/root/DObjectKt { } public final class ru/mipt/npm/root/DRootToSolidKt { - public static final fun toSolid (Lru/mipt/npm/root/DGeoManager;)Lspace/kscience/visionforge/solid/SolidGroup; + public static final fun rootGeo (Lspace/kscience/visionforge/MutableVisionContainer;Lru/mipt/npm/root/DGeoManager;Ljava/lang/String;IZ)Lspace/kscience/visionforge/solid/SolidGroup; + public static synthetic fun rootGeo$default (Lspace/kscience/visionforge/MutableVisionContainer;Lru/mipt/npm/root/DGeoManager;Ljava/lang/String;IZILjava/lang/Object;)Lspace/kscience/visionforge/solid/SolidGroup; +} + +public final class ru/mipt/npm/root/FairTrackParam { + public static final field Companion Lru/mipt/npm/root/FairTrackParam$Companion; + public fun (DDDDDD)V + public final fun component1 ()D + public final fun component2 ()D + public final fun component3 ()D + public final fun component4 ()D + public final fun component5 ()D + public final fun component6 ()D + public final fun copy (DDDDDD)Lru/mipt/npm/root/FairTrackParam; + public static synthetic fun copy$default (Lru/mipt/npm/root/FairTrackParam;DDDDDDILjava/lang/Object;)Lru/mipt/npm/root/FairTrackParam; + public fun equals (Ljava/lang/Object;)Z + public final fun getFQp ()D + public final fun getFTx ()D + public final fun getFTy ()D + public final fun getFX ()D + public final fun getFY ()D + public final fun getFZ ()D + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final class ru/mipt/npm/root/FairTrackParam$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lru/mipt/npm/root/FairTrackParam$$serializer; + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lru/mipt/npm/root/FairTrackParam; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lru/mipt/npm/root/FairTrackParam;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class ru/mipt/npm/root/FairTrackParam$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; } public final class ru/mipt/npm/root/RootColors { @@ -108,7 +252,7 @@ public final class ru/mipt/npm/root/serialization/JsonToRootKt { } public final class ru/mipt/npm/root/serialization/RootToSolidKt { - public static final fun toSolid (Lru/mipt/npm/root/serialization/TGeoManager;)Lspace/kscience/visionforge/solid/SolidGroup; + public static final fun rootGeo (Lspace/kscience/visionforge/MutableVisionContainer;Lru/mipt/npm/root/serialization/TGeoManager;)Lspace/kscience/visionforge/solid/SolidGroup; } public class ru/mipt/npm/root/serialization/TGeoBBox : ru/mipt/npm/root/serialization/TGeoShape { @@ -119,12 +263,11 @@ public class ru/mipt/npm/root/serialization/TGeoBBox : ru/mipt/npm/root/serializ public final fun getFDY ()D public final fun getFDZ ()D public final fun getFOrigin ()[D - public static final fun write$Self (Lru/mipt/npm/root/serialization/TGeoBBox;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V + public static final synthetic fun write$Self (Lru/mipt/npm/root/serialization/TGeoBBox;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V } public final class ru/mipt/npm/root/serialization/TGeoBBox$$serializer : kotlinx/serialization/internal/GeneratedSerializer { public static final field INSTANCE Lru/mipt/npm/root/serialization/TGeoBBox$$serializer; - public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; public fun childSerializers ()[Lkotlinx/serialization/KSerializer; public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lru/mipt/npm/root/serialization/TGeoBBox; @@ -145,7 +288,7 @@ public abstract class ru/mipt/npm/root/serialization/TGeoBoolNode : ru/mipt/npm/ public final fun getFLeftMat ()Lru/mipt/npm/root/serialization/TGeoMatrix; public abstract fun getFRight ()Lru/mipt/npm/root/serialization/TGeoShape; public final fun getFRightMat ()Lru/mipt/npm/root/serialization/TGeoMatrix; - public static final fun write$Self (Lru/mipt/npm/root/serialization/TGeoBoolNode;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V + public static final synthetic fun write$Self (Lru/mipt/npm/root/serialization/TGeoBoolNode;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V } public final class ru/mipt/npm/root/serialization/TGeoBoolNode$Companion { @@ -154,17 +297,14 @@ public final class ru/mipt/npm/root/serialization/TGeoBoolNode$Companion { public final class ru/mipt/npm/root/serialization/TGeoCombiTrans : ru/mipt/npm/root/serialization/TGeoMatrix { public static final field Companion Lru/mipt/npm/root/serialization/TGeoCombiTrans$Companion; - public synthetic fun (ILkotlin/UInt;Lkotlin/UInt;Ljava/lang/String;Ljava/lang/String;[DLru/mipt/npm/root/serialization/TGeoRotation;Lkotlinx/serialization/internal/SerializationConstructorMarker;Lkotlin/jvm/internal/DefaultConstructorMarker;)V public fun ([DLru/mipt/npm/root/serialization/TGeoRotation;)V public synthetic fun ([DLru/mipt/npm/root/serialization/TGeoRotation;ILkotlin/jvm/internal/DefaultConstructorMarker;)V public final fun getFRotation ()Lru/mipt/npm/root/serialization/TGeoRotation; public final fun getFTranslation ()[D - public static final fun write$Self (Lru/mipt/npm/root/serialization/TGeoCombiTrans;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V } public final class ru/mipt/npm/root/serialization/TGeoCombiTrans$$serializer : kotlinx/serialization/internal/GeneratedSerializer { public static final field INSTANCE Lru/mipt/npm/root/serialization/TGeoCombiTrans$$serializer; - public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; public fun childSerializers ()[Lkotlinx/serialization/KSerializer; public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lru/mipt/npm/root/serialization/TGeoCombiTrans; @@ -180,15 +320,12 @@ public final class ru/mipt/npm/root/serialization/TGeoCombiTrans$Companion { public final class ru/mipt/npm/root/serialization/TGeoCompositeShape : ru/mipt/npm/root/serialization/TGeoBBox { public static final field Companion Lru/mipt/npm/root/serialization/TGeoCompositeShape$Companion; - public synthetic fun (ILkotlin/UInt;Lkotlin/UInt;Ljava/lang/String;Ljava/lang/String;Lkotlin/UInt;IDDD[DLru/mipt/npm/root/serialization/TGeoBoolNode;Lkotlinx/serialization/internal/SerializationConstructorMarker;Lkotlin/jvm/internal/DefaultConstructorMarker;)V public fun (Lru/mipt/npm/root/serialization/TGeoBoolNode;)V public final fun getFNode ()Lru/mipt/npm/root/serialization/TGeoBoolNode; - public static final fun write$Self (Lru/mipt/npm/root/serialization/TGeoCompositeShape;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V } public final class ru/mipt/npm/root/serialization/TGeoCompositeShape$$serializer : kotlinx/serialization/internal/GeneratedSerializer { public static final field INSTANCE Lru/mipt/npm/root/serialization/TGeoCompositeShape$$serializer; - public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; public fun childSerializers ()[Lkotlinx/serialization/KSerializer; public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lru/mipt/npm/root/serialization/TGeoCompositeShape; @@ -204,17 +341,14 @@ public final class ru/mipt/npm/root/serialization/TGeoCompositeShape$Companion { public final class ru/mipt/npm/root/serialization/TGeoHMatrix : ru/mipt/npm/root/serialization/TGeoMatrix { public static final field Companion Lru/mipt/npm/root/serialization/TGeoHMatrix$Companion; - public synthetic fun (ILkotlin/UInt;Lkotlin/UInt;Ljava/lang/String;Ljava/lang/String;[D[D[DLkotlinx/serialization/internal/SerializationConstructorMarker;Lkotlin/jvm/internal/DefaultConstructorMarker;)V public fun ([D[D[D)V public final fun getFRotationMatrix ()[D public final fun getFScale ()[D public final fun getFTranslation ()[D - public static final fun write$Self (Lru/mipt/npm/root/serialization/TGeoHMatrix;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V } public final class ru/mipt/npm/root/serialization/TGeoHMatrix$$serializer : kotlinx/serialization/internal/GeneratedSerializer { public static final field INSTANCE Lru/mipt/npm/root/serialization/TGeoHMatrix$$serializer; - public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; public fun childSerializers ()[Lkotlinx/serialization/KSerializer; public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lru/mipt/npm/root/serialization/TGeoHMatrix; @@ -231,13 +365,10 @@ public final class ru/mipt/npm/root/serialization/TGeoHMatrix$Companion { public final class ru/mipt/npm/root/serialization/TGeoIdentity : ru/mipt/npm/root/serialization/TGeoMatrix { public static final field Companion Lru/mipt/npm/root/serialization/TGeoIdentity$Companion; public fun ()V - public synthetic fun (ILkotlin/UInt;Lkotlin/UInt;Ljava/lang/String;Ljava/lang/String;Lkotlinx/serialization/internal/SerializationConstructorMarker;Lkotlin/jvm/internal/DefaultConstructorMarker;)V - public static final fun write$Self (Lru/mipt/npm/root/serialization/TGeoIdentity;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V } public final class ru/mipt/npm/root/serialization/TGeoIdentity$$serializer : kotlinx/serialization/internal/GeneratedSerializer { public static final field INSTANCE Lru/mipt/npm/root/serialization/TGeoIdentity$$serializer; - public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; public fun childSerializers ()[Lkotlinx/serialization/KSerializer; public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lru/mipt/npm/root/serialization/TGeoIdentity; @@ -253,16 +384,13 @@ public final class ru/mipt/npm/root/serialization/TGeoIdentity$Companion { public final class ru/mipt/npm/root/serialization/TGeoIntersection : ru/mipt/npm/root/serialization/TGeoBoolNode { public static final field Companion Lru/mipt/npm/root/serialization/TGeoIntersection$Companion; - public synthetic fun (ILkotlin/UInt;Lkotlin/UInt;Lru/mipt/npm/root/serialization/TGeoMatrix;Lru/mipt/npm/root/serialization/TGeoMatrix;Lru/mipt/npm/root/serialization/TGeoShape;Lru/mipt/npm/root/serialization/TGeoShape;Lkotlinx/serialization/internal/SerializationConstructorMarker;Lkotlin/jvm/internal/DefaultConstructorMarker;)V public fun (Lru/mipt/npm/root/serialization/TGeoShape;Lru/mipt/npm/root/serialization/TGeoShape;)V public fun getFLeft ()Lru/mipt/npm/root/serialization/TGeoShape; public fun getFRight ()Lru/mipt/npm/root/serialization/TGeoShape; - public static final fun write$Self (Lru/mipt/npm/root/serialization/TGeoIntersection;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V } public final class ru/mipt/npm/root/serialization/TGeoIntersection$$serializer : kotlinx/serialization/internal/GeneratedSerializer { public static final field INSTANCE Lru/mipt/npm/root/serialization/TGeoIntersection$$serializer; - public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; public fun childSerializers ()[Lkotlinx/serialization/KSerializer; public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lru/mipt/npm/root/serialization/TGeoIntersection; @@ -279,17 +407,14 @@ public final class ru/mipt/npm/root/serialization/TGeoIntersection$Companion { public final class ru/mipt/npm/root/serialization/TGeoManager : ru/mipt/npm/root/serialization/TNamed { public static final field Companion Lru/mipt/npm/root/serialization/TGeoManager$Companion; public fun ()V - public synthetic fun (ILkotlin/UInt;Lkotlin/UInt;Ljava/lang/String;Ljava/lang/String;Lru/mipt/npm/root/serialization/TObjArray;Lru/mipt/npm/root/serialization/TObjArray;Lru/mipt/npm/root/serialization/TObjArray;Lru/mipt/npm/root/serialization/TObjArray;Lkotlinx/serialization/internal/SerializationConstructorMarker;Lkotlin/jvm/internal/DefaultConstructorMarker;)V public final fun getFMatrices ()Lru/mipt/npm/root/serialization/TObjArray; public final fun getFNodes ()Lru/mipt/npm/root/serialization/TObjArray; public final fun getFShapes ()Lru/mipt/npm/root/serialization/TObjArray; public final fun getFVolumes ()Lru/mipt/npm/root/serialization/TObjArray; - public static final fun write$Self (Lru/mipt/npm/root/serialization/TGeoManager;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V } public final class ru/mipt/npm/root/serialization/TGeoManager$$serializer : kotlinx/serialization/internal/GeneratedSerializer { public static final field INSTANCE Lru/mipt/npm/root/serialization/TGeoManager$$serializer; - public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; public fun childSerializers ()[Lkotlinx/serialization/KSerializer; public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lru/mipt/npm/root/serialization/TGeoManager; @@ -307,12 +432,11 @@ public class ru/mipt/npm/root/serialization/TGeoMaterial : ru/mipt/npm/root/seri public static final field Companion Lru/mipt/npm/root/serialization/TGeoMaterial$Companion; public fun ()V public synthetic fun (ILkotlin/UInt;Lkotlin/UInt;Ljava/lang/String;Ljava/lang/String;Lkotlinx/serialization/internal/SerializationConstructorMarker;Lkotlin/jvm/internal/DefaultConstructorMarker;)V - public static final fun write$Self (Lru/mipt/npm/root/serialization/TGeoMaterial;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V + public static final synthetic fun write$Self (Lru/mipt/npm/root/serialization/TGeoMaterial;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V } public final class ru/mipt/npm/root/serialization/TGeoMaterial$$serializer : kotlinx/serialization/internal/GeneratedSerializer { public static final field INSTANCE Lru/mipt/npm/root/serialization/TGeoMaterial$$serializer; - public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; public fun childSerializers ()[Lkotlinx/serialization/KSerializer; public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lru/mipt/npm/root/serialization/TGeoMaterial; @@ -329,7 +453,7 @@ public final class ru/mipt/npm/root/serialization/TGeoMaterial$Companion { public abstract class ru/mipt/npm/root/serialization/TGeoMatrix : ru/mipt/npm/root/serialization/TNamed { public static final field Companion Lru/mipt/npm/root/serialization/TGeoMatrix$Companion; public synthetic fun (ILkotlin/UInt;Lkotlin/UInt;Ljava/lang/String;Ljava/lang/String;Lkotlinx/serialization/internal/SerializationConstructorMarker;Lkotlin/jvm/internal/DefaultConstructorMarker;)V - public static final fun write$Self (Lru/mipt/npm/root/serialization/TGeoMatrix;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V + public static final synthetic fun write$Self (Lru/mipt/npm/root/serialization/TGeoMatrix;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V } public final class ru/mipt/npm/root/serialization/TGeoMatrix$Companion { @@ -338,17 +462,14 @@ public final class ru/mipt/npm/root/serialization/TGeoMatrix$Companion { public final class ru/mipt/npm/root/serialization/TGeoMedium : ru/mipt/npm/root/serialization/TNamed { public static final field Companion Lru/mipt/npm/root/serialization/TGeoMedium$Companion; - public synthetic fun (ILkotlin/UInt;Lkotlin/UInt;Ljava/lang/String;Ljava/lang/String;ILru/mipt/npm/root/serialization/TGeoMaterial;[DLkotlinx/serialization/internal/SerializationConstructorMarker;Lkotlin/jvm/internal/DefaultConstructorMarker;)V public fun (ILru/mipt/npm/root/serialization/TGeoMaterial;[D)V public final fun getFId ()I public final fun getFMaterial ()Lru/mipt/npm/root/serialization/TGeoMaterial; public final fun getFParams ()[D - public static final fun write$Self (Lru/mipt/npm/root/serialization/TGeoMedium;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V } public final class ru/mipt/npm/root/serialization/TGeoMedium$$serializer : kotlinx/serialization/internal/GeneratedSerializer { public static final field INSTANCE Lru/mipt/npm/root/serialization/TGeoMedium$$serializer; - public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; public fun childSerializers ()[Lkotlinx/serialization/KSerializer; public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lru/mipt/npm/root/serialization/TGeoMedium; @@ -365,13 +486,10 @@ public final class ru/mipt/npm/root/serialization/TGeoMedium$Companion { public final class ru/mipt/npm/root/serialization/TGeoMixture : ru/mipt/npm/root/serialization/TGeoMaterial { public static final field Companion Lru/mipt/npm/root/serialization/TGeoMixture$Companion; public fun ()V - public synthetic fun (ILkotlin/UInt;Lkotlin/UInt;Ljava/lang/String;Ljava/lang/String;Lkotlinx/serialization/internal/SerializationConstructorMarker;Lkotlin/jvm/internal/DefaultConstructorMarker;)V - public static final fun write$Self (Lru/mipt/npm/root/serialization/TGeoMixture;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V } public final class ru/mipt/npm/root/serialization/TGeoMixture$$serializer : kotlinx/serialization/internal/GeneratedSerializer { public static final field INSTANCE Lru/mipt/npm/root/serialization/TGeoMixture$$serializer; - public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; public fun childSerializers ()[Lkotlinx/serialization/KSerializer; public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lru/mipt/npm/root/serialization/TGeoMixture; @@ -394,12 +512,11 @@ public class ru/mipt/npm/root/serialization/TGeoNode : ru/mipt/npm/root/serializ public final fun getFNumber ()I public final fun getFOverlaps ()[I public final fun getFVolume ()Lru/mipt/npm/root/serialization/TGeoVolume; - public static final fun write$Self (Lru/mipt/npm/root/serialization/TGeoNode;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V + public static final synthetic fun write$Self (Lru/mipt/npm/root/serialization/TGeoNode;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V } public final class ru/mipt/npm/root/serialization/TGeoNode$$serializer : kotlinx/serialization/internal/GeneratedSerializer { public static final field INSTANCE Lru/mipt/npm/root/serialization/TGeoNode$$serializer; - public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; public fun childSerializers ()[Lkotlinx/serialization/KSerializer; public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lru/mipt/npm/root/serialization/TGeoNode; @@ -416,14 +533,11 @@ public final class ru/mipt/npm/root/serialization/TGeoNode$Companion { public final class ru/mipt/npm/root/serialization/TGeoNodeMatrix : ru/mipt/npm/root/serialization/TGeoNode { public static final field Companion Lru/mipt/npm/root/serialization/TGeoNodeMatrix$Companion; public fun ()V - public synthetic fun (ILkotlin/UInt;Lkotlin/UInt;Ljava/lang/String;Ljava/lang/String;Lkotlin/UInt;Lru/mipt/npm/root/serialization/TGeoVolume;II[ILru/mipt/npm/root/serialization/TGeoMatrix;Lkotlinx/serialization/internal/SerializationConstructorMarker;Lkotlin/jvm/internal/DefaultConstructorMarker;)V public final fun getFMatrix ()Lru/mipt/npm/root/serialization/TGeoMatrix; - public static final fun write$Self (Lru/mipt/npm/root/serialization/TGeoNodeMatrix;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V } public final class ru/mipt/npm/root/serialization/TGeoNodeMatrix$$serializer : kotlinx/serialization/internal/GeneratedSerializer { public static final field INSTANCE Lru/mipt/npm/root/serialization/TGeoNodeMatrix$$serializer; - public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; public fun childSerializers ()[Lkotlinx/serialization/KSerializer; public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lru/mipt/npm/root/serialization/TGeoNodeMatrix; @@ -440,14 +554,11 @@ public final class ru/mipt/npm/root/serialization/TGeoNodeMatrix$Companion { public final class ru/mipt/npm/root/serialization/TGeoNodeOffset : ru/mipt/npm/root/serialization/TGeoNode { public static final field Companion Lru/mipt/npm/root/serialization/TGeoNodeOffset$Companion; public fun ()V - public synthetic fun (ILkotlin/UInt;Lkotlin/UInt;Ljava/lang/String;Ljava/lang/String;Lkotlin/UInt;Lru/mipt/npm/root/serialization/TGeoVolume;II[IDLkotlinx/serialization/internal/SerializationConstructorMarker;Lkotlin/jvm/internal/DefaultConstructorMarker;)V public final fun getFOffset ()D - public static final fun write$Self (Lru/mipt/npm/root/serialization/TGeoNodeOffset;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V } public final class ru/mipt/npm/root/serialization/TGeoNodeOffset$$serializer : kotlinx/serialization/internal/GeneratedSerializer { public static final field INSTANCE Lru/mipt/npm/root/serialization/TGeoNodeOffset$$serializer; - public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; public fun childSerializers ()[Lkotlinx/serialization/KSerializer; public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lru/mipt/npm/root/serialization/TGeoNodeOffset; @@ -471,12 +582,11 @@ public class ru/mipt/npm/root/serialization/TGeoPcon : ru/mipt/npm/root/serializ public final fun getFRmax ()[D public final fun getFRmin ()[D public final fun getFZ ()[D - public static final fun write$Self (Lru/mipt/npm/root/serialization/TGeoPcon;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V + public static final synthetic fun write$Self (Lru/mipt/npm/root/serialization/TGeoPcon;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V } public final class ru/mipt/npm/root/serialization/TGeoPcon$$serializer : kotlinx/serialization/internal/GeneratedSerializer { public static final field INSTANCE Lru/mipt/npm/root/serialization/TGeoPcon$$serializer; - public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; public fun childSerializers ()[Lkotlinx/serialization/KSerializer; public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lru/mipt/npm/root/serialization/TGeoPcon; @@ -495,12 +605,11 @@ public class ru/mipt/npm/root/serialization/TGeoPgon : ru/mipt/npm/root/serializ public fun ()V public synthetic fun (ILkotlin/UInt;Lkotlin/UInt;Ljava/lang/String;Ljava/lang/String;Lkotlin/UInt;IDDD[DIDD[D[D[DILkotlinx/serialization/internal/SerializationConstructorMarker;Lkotlin/jvm/internal/DefaultConstructorMarker;)V public final fun getFNedges ()I - public static final fun write$Self (Lru/mipt/npm/root/serialization/TGeoPgon;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V + public static final synthetic fun write$Self (Lru/mipt/npm/root/serialization/TGeoPgon;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V } public final class ru/mipt/npm/root/serialization/TGeoPgon$$serializer : kotlinx/serialization/internal/GeneratedSerializer { public static final field INSTANCE Lru/mipt/npm/root/serialization/TGeoPgon$$serializer; - public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; public fun childSerializers ()[Lkotlinx/serialization/KSerializer; public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lru/mipt/npm/root/serialization/TGeoPgon; @@ -516,15 +625,12 @@ public final class ru/mipt/npm/root/serialization/TGeoPgon$Companion { public final class ru/mipt/npm/root/serialization/TGeoRotation : ru/mipt/npm/root/serialization/TGeoMatrix { public static final field Companion Lru/mipt/npm/root/serialization/TGeoRotation$Companion; - public synthetic fun (ILkotlin/UInt;Lkotlin/UInt;Ljava/lang/String;Ljava/lang/String;[DLkotlinx/serialization/internal/SerializationConstructorMarker;Lkotlin/jvm/internal/DefaultConstructorMarker;)V public fun ([D)V public final fun getFRotationMatrix ()[D - public static final fun write$Self (Lru/mipt/npm/root/serialization/TGeoRotation;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V } public final class ru/mipt/npm/root/serialization/TGeoRotation$$serializer : kotlinx/serialization/internal/GeneratedSerializer { public static final field INSTANCE Lru/mipt/npm/root/serialization/TGeoRotation$$serializer; - public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; public fun childSerializers ()[Lkotlinx/serialization/KSerializer; public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lru/mipt/npm/root/serialization/TGeoRotation; @@ -543,7 +649,7 @@ public abstract class ru/mipt/npm/root/serialization/TGeoShape : ru/mipt/npm/roo public synthetic fun (ILkotlin/UInt;Lkotlin/UInt;Ljava/lang/String;Ljava/lang/String;Lkotlin/UInt;ILkotlinx/serialization/internal/SerializationConstructorMarker;Lkotlin/jvm/internal/DefaultConstructorMarker;)V public final fun getFShapeBits-pVg5ArA ()I public final fun getFShapeId ()I - public static final fun write$Self (Lru/mipt/npm/root/serialization/TGeoShape;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V + public static final synthetic fun write$Self (Lru/mipt/npm/root/serialization/TGeoShape;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V } public final class ru/mipt/npm/root/serialization/TGeoShape$Companion { @@ -552,17 +658,14 @@ public final class ru/mipt/npm/root/serialization/TGeoShape$Companion { public final class ru/mipt/npm/root/serialization/TGeoShapeAssembly : ru/mipt/npm/root/serialization/TGeoBBox { public static final field Companion Lru/mipt/npm/root/serialization/TGeoShapeAssembly$Companion; - public synthetic fun (ILkotlin/UInt;Lkotlin/UInt;Ljava/lang/String;Ljava/lang/String;Lkotlin/UInt;IDDD[DLru/mipt/npm/root/serialization/TGeoVolumeAssembly;ZLkotlinx/serialization/internal/SerializationConstructorMarker;Lkotlin/jvm/internal/DefaultConstructorMarker;)V public fun (Lru/mipt/npm/root/serialization/TGeoVolumeAssembly;Z)V public synthetic fun (Lru/mipt/npm/root/serialization/TGeoVolumeAssembly;ZILkotlin/jvm/internal/DefaultConstructorMarker;)V public final fun getFBBoxOK ()Z public final fun getFVolume ()Lru/mipt/npm/root/serialization/TGeoVolumeAssembly; - public static final fun write$Self (Lru/mipt/npm/root/serialization/TGeoShapeAssembly;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V } public final class ru/mipt/npm/root/serialization/TGeoShapeAssembly$$serializer : kotlinx/serialization/internal/GeneratedSerializer { public static final field INSTANCE Lru/mipt/npm/root/serialization/TGeoShapeAssembly$$serializer; - public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; public fun childSerializers ()[Lkotlinx/serialization/KSerializer; public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lru/mipt/npm/root/serialization/TGeoShapeAssembly; @@ -583,16 +686,13 @@ public final class ru/mipt/npm/root/serialization/TGeoShapeRef : ru/mipt/npm/roo public final class ru/mipt/npm/root/serialization/TGeoSubtraction : ru/mipt/npm/root/serialization/TGeoBoolNode { public static final field Companion Lru/mipt/npm/root/serialization/TGeoSubtraction$Companion; - public synthetic fun (ILkotlin/UInt;Lkotlin/UInt;Lru/mipt/npm/root/serialization/TGeoMatrix;Lru/mipt/npm/root/serialization/TGeoMatrix;Lru/mipt/npm/root/serialization/TGeoShape;Lru/mipt/npm/root/serialization/TGeoShape;Lkotlinx/serialization/internal/SerializationConstructorMarker;Lkotlin/jvm/internal/DefaultConstructorMarker;)V public fun (Lru/mipt/npm/root/serialization/TGeoShape;Lru/mipt/npm/root/serialization/TGeoShape;)V public fun getFLeft ()Lru/mipt/npm/root/serialization/TGeoShape; public fun getFRight ()Lru/mipt/npm/root/serialization/TGeoShape; - public static final fun write$Self (Lru/mipt/npm/root/serialization/TGeoSubtraction;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V } public final class ru/mipt/npm/root/serialization/TGeoSubtraction$$serializer : kotlinx/serialization/internal/GeneratedSerializer { public static final field INSTANCE Lru/mipt/npm/root/serialization/TGeoSubtraction$$serializer; - public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; public fun childSerializers ()[Lkotlinx/serialization/KSerializer; public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lru/mipt/npm/root/serialization/TGeoSubtraction; @@ -608,15 +708,12 @@ public final class ru/mipt/npm/root/serialization/TGeoSubtraction$Companion { public final class ru/mipt/npm/root/serialization/TGeoTranslation : ru/mipt/npm/root/serialization/TGeoMatrix { public static final field Companion Lru/mipt/npm/root/serialization/TGeoTranslation$Companion; - public synthetic fun (ILkotlin/UInt;Lkotlin/UInt;Ljava/lang/String;Ljava/lang/String;[DLkotlinx/serialization/internal/SerializationConstructorMarker;Lkotlin/jvm/internal/DefaultConstructorMarker;)V public fun ([D)V public final fun getFTranslation ()[D - public static final fun write$Self (Lru/mipt/npm/root/serialization/TGeoTranslation;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V } public final class ru/mipt/npm/root/serialization/TGeoTranslation$$serializer : kotlinx/serialization/internal/GeneratedSerializer { public static final field INSTANCE Lru/mipt/npm/root/serialization/TGeoTranslation$$serializer; - public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; public fun childSerializers ()[Lkotlinx/serialization/KSerializer; public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lru/mipt/npm/root/serialization/TGeoTranslation; @@ -637,12 +734,11 @@ public class ru/mipt/npm/root/serialization/TGeoTube : ru/mipt/npm/root/serializ public final fun getFDz ()D public final fun getFRmax ()D public final fun getFRmin ()D - public static final fun write$Self (Lru/mipt/npm/root/serialization/TGeoTube;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V + public static final synthetic fun write$Self (Lru/mipt/npm/root/serialization/TGeoTube;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V } public final class ru/mipt/npm/root/serialization/TGeoTube$$serializer : kotlinx/serialization/internal/GeneratedSerializer { public static final field INSTANCE Lru/mipt/npm/root/serialization/TGeoTube$$serializer; - public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; public fun childSerializers ()[Lkotlinx/serialization/KSerializer; public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lru/mipt/npm/root/serialization/TGeoTube; @@ -659,7 +755,6 @@ public final class ru/mipt/npm/root/serialization/TGeoTube$Companion { public final class ru/mipt/npm/root/serialization/TGeoTubeSeg : ru/mipt/npm/root/serialization/TGeoTube { public static final field Companion Lru/mipt/npm/root/serialization/TGeoTubeSeg$Companion; public fun (DDDDDDDDD)V - public synthetic fun (ILkotlin/UInt;Lkotlin/UInt;Ljava/lang/String;Ljava/lang/String;Lkotlin/UInt;IDDD[DDDDDDDDDDDDDLkotlinx/serialization/internal/SerializationConstructorMarker;Lkotlin/jvm/internal/DefaultConstructorMarker;)V public final fun getFC1 ()D public final fun getFC2 ()D public final fun getFCdfi ()D @@ -669,12 +764,10 @@ public final class ru/mipt/npm/root/serialization/TGeoTubeSeg : ru/mipt/npm/root public final fun getFS1 ()D public final fun getFS2 ()D public final fun getFSm ()D - public static final fun write$Self (Lru/mipt/npm/root/serialization/TGeoTubeSeg;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V } public final class ru/mipt/npm/root/serialization/TGeoTubeSeg$$serializer : kotlinx/serialization/internal/GeneratedSerializer { public static final field INSTANCE Lru/mipt/npm/root/serialization/TGeoTubeSeg$$serializer; - public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; public fun childSerializers ()[Lkotlinx/serialization/KSerializer; public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lru/mipt/npm/root/serialization/TGeoTubeSeg; @@ -690,16 +783,13 @@ public final class ru/mipt/npm/root/serialization/TGeoTubeSeg$Companion { public final class ru/mipt/npm/root/serialization/TGeoUnion : ru/mipt/npm/root/serialization/TGeoBoolNode { public static final field Companion Lru/mipt/npm/root/serialization/TGeoUnion$Companion; - public synthetic fun (ILkotlin/UInt;Lkotlin/UInt;Lru/mipt/npm/root/serialization/TGeoMatrix;Lru/mipt/npm/root/serialization/TGeoMatrix;Lru/mipt/npm/root/serialization/TGeoShape;Lru/mipt/npm/root/serialization/TGeoShape;Lkotlinx/serialization/internal/SerializationConstructorMarker;Lkotlin/jvm/internal/DefaultConstructorMarker;)V public fun (Lru/mipt/npm/root/serialization/TGeoShape;Lru/mipt/npm/root/serialization/TGeoShape;)V public fun getFLeft ()Lru/mipt/npm/root/serialization/TGeoShape; public fun getFRight ()Lru/mipt/npm/root/serialization/TGeoShape; - public static final fun write$Self (Lru/mipt/npm/root/serialization/TGeoUnion;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V } public final class ru/mipt/npm/root/serialization/TGeoUnion$$serializer : kotlinx/serialization/internal/GeneratedSerializer { public static final field INSTANCE Lru/mipt/npm/root/serialization/TGeoUnion$$serializer; - public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; public fun childSerializers ()[Lkotlinx/serialization/KSerializer; public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lru/mipt/npm/root/serialization/TGeoUnion; @@ -729,12 +819,11 @@ public class ru/mipt/npm/root/serialization/TGeoVolume : ru/mipt/npm/root/serial public final fun getFNumber ()I public final fun getFRefCount ()I public final fun getFShape ()Lru/mipt/npm/root/serialization/TGeoShape; - public static final fun write$Self (Lru/mipt/npm/root/serialization/TGeoVolume;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V + public static final synthetic fun write$Self (Lru/mipt/npm/root/serialization/TGeoVolume;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V } public final class ru/mipt/npm/root/serialization/TGeoVolume$$serializer : kotlinx/serialization/internal/GeneratedSerializer { public static final field INSTANCE Lru/mipt/npm/root/serialization/TGeoVolume$$serializer; - public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; public fun childSerializers ()[Lkotlinx/serialization/KSerializer; public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lru/mipt/npm/root/serialization/TGeoVolume; @@ -752,12 +841,11 @@ public class ru/mipt/npm/root/serialization/TGeoVolumeAssembly : ru/mipt/npm/roo public static final field Companion Lru/mipt/npm/root/serialization/TGeoVolumeAssembly$Companion; public fun ()V public synthetic fun (ILkotlin/UInt;Lkotlin/UInt;Ljava/lang/String;Ljava/lang/String;Lkotlin/UInt;ILjava/lang/Integer;Lkotlin/UInt;Ljava/lang/Integer;Ljava/lang/Integer;Lru/mipt/npm/root/serialization/TObjArray;Lru/mipt/npm/root/serialization/TGeoShape;Lru/mipt/npm/root/serialization/TGeoMedium;IIILkotlinx/serialization/internal/SerializationConstructorMarker;Lkotlin/jvm/internal/DefaultConstructorMarker;)V - public static final fun write$Self (Lru/mipt/npm/root/serialization/TGeoVolumeAssembly;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V + public static final synthetic fun write$Self (Lru/mipt/npm/root/serialization/TGeoVolumeAssembly;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V } public final class ru/mipt/npm/root/serialization/TGeoVolumeAssembly$$serializer : kotlinx/serialization/internal/GeneratedSerializer { public static final field INSTANCE Lru/mipt/npm/root/serialization/TGeoVolumeAssembly$$serializer; - public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; public fun childSerializers ()[Lkotlinx/serialization/KSerializer; public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lru/mipt/npm/root/serialization/TGeoVolumeAssembly; @@ -784,7 +872,6 @@ public final class ru/mipt/npm/root/serialization/TGeoVolumeRef : ru/mipt/npm/ro public final class ru/mipt/npm/root/serialization/TGeoXtru : ru/mipt/npm/root/serialization/TGeoBBox { public static final field Companion Lru/mipt/npm/root/serialization/TGeoXtru$Companion; public fun (IID[D[D[D[D[D[D)V - public synthetic fun (ILkotlin/UInt;Lkotlin/UInt;Ljava/lang/String;Ljava/lang/String;Lkotlin/UInt;IDDD[DIID[D[D[D[D[D[DLkotlinx/serialization/internal/SerializationConstructorMarker;Lkotlin/jvm/internal/DefaultConstructorMarker;)V public final fun getFNvert ()I public final fun getFNz ()I public final fun getFScale ()[D @@ -794,12 +881,10 @@ public final class ru/mipt/npm/root/serialization/TGeoXtru : ru/mipt/npm/root/se public final fun getFY0 ()[D public final fun getFZ ()[D public final fun getFZcurrent ()D - public static final fun write$Self (Lru/mipt/npm/root/serialization/TGeoXtru;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V } public final class ru/mipt/npm/root/serialization/TGeoXtru$$serializer : kotlinx/serialization/internal/GeneratedSerializer { public static final field INSTANCE Lru/mipt/npm/root/serialization/TGeoXtru$$serializer; - public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; public fun childSerializers ()[Lkotlinx/serialization/KSerializer; public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lru/mipt/npm/root/serialization/TGeoXtru; @@ -815,15 +900,12 @@ public final class ru/mipt/npm/root/serialization/TGeoXtru$Companion { public final class ru/mipt/npm/root/serialization/THashList : ru/mipt/npm/root/serialization/TObject { public static final field Companion Lru/mipt/npm/root/serialization/THashList$Companion; - public synthetic fun (ILkotlin/UInt;Lkotlin/UInt;Ljava/util/List;Lkotlinx/serialization/internal/SerializationConstructorMarker;Lkotlin/jvm/internal/DefaultConstructorMarker;)V public fun (Ljava/util/List;)V public final fun getArr ()Ljava/util/List; - public static final fun write$Self (Lru/mipt/npm/root/serialization/THashList;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V } public final class ru/mipt/npm/root/serialization/THashList$$serializer : kotlinx/serialization/internal/GeneratedSerializer { public static final field INSTANCE Lru/mipt/npm/root/serialization/THashList$$serializer; - public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; public fun childSerializers ()[Lkotlinx/serialization/KSerializer; public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lru/mipt/npm/root/serialization/THashList; @@ -839,15 +921,12 @@ public final class ru/mipt/npm/root/serialization/THashList$Companion { public final class ru/mipt/npm/root/serialization/TList : ru/mipt/npm/root/serialization/TObject { public static final field Companion Lru/mipt/npm/root/serialization/TList$Companion; - public synthetic fun (ILkotlin/UInt;Lkotlin/UInt;Ljava/util/List;Lkotlinx/serialization/internal/SerializationConstructorMarker;Lkotlin/jvm/internal/DefaultConstructorMarker;)V public fun (Ljava/util/List;)V public final fun getArr ()Ljava/util/List; - public static final fun write$Self (Lru/mipt/npm/root/serialization/TList;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V } public final class ru/mipt/npm/root/serialization/TList$$serializer : kotlinx/serialization/internal/GeneratedSerializer { public static final field INSTANCE Lru/mipt/npm/root/serialization/TList$$serializer; - public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; public fun childSerializers ()[Lkotlinx/serialization/KSerializer; public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lru/mipt/npm/root/serialization/TList; @@ -867,12 +946,11 @@ public class ru/mipt/npm/root/serialization/TNamed : ru/mipt/npm/root/serializat public synthetic fun (ILkotlin/UInt;Lkotlin/UInt;Ljava/lang/String;Ljava/lang/String;Lkotlinx/serialization/internal/SerializationConstructorMarker;Lkotlin/jvm/internal/DefaultConstructorMarker;)V public final fun getFName ()Ljava/lang/String; public final fun getFTitle ()Ljava/lang/String; - public static final fun write$Self (Lru/mipt/npm/root/serialization/TNamed;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V + public static final synthetic fun write$Self (Lru/mipt/npm/root/serialization/TNamed;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V } public final class ru/mipt/npm/root/serialization/TNamed$$serializer : kotlinx/serialization/internal/GeneratedSerializer { public static final field INSTANCE Lru/mipt/npm/root/serialization/TNamed$$serializer; - public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; public fun childSerializers ()[Lkotlinx/serialization/KSerializer; public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lru/mipt/npm/root/serialization/TNamed; @@ -888,14 +966,11 @@ public final class ru/mipt/npm/root/serialization/TNamed$Companion { public final class ru/mipt/npm/root/serialization/TObjArray : ru/mipt/npm/root/serialization/TObject { public static final field Companion Lru/mipt/npm/root/serialization/TObjArray$Companion; - public synthetic fun (ILkotlin/UInt;Lkotlin/UInt;Ljava/util/List;Lkotlinx/serialization/internal/SerializationConstructorMarker;Lkotlin/jvm/internal/DefaultConstructorMarker;)V public fun (Ljava/util/List;)V public final fun getArr ()Ljava/util/List; - public static final fun write$Self (Lru/mipt/npm/root/serialization/TObjArray;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;Lkotlinx/serialization/KSerializer;)V } public final class ru/mipt/npm/root/serialization/TObjArray$$serializer : kotlinx/serialization/internal/GeneratedSerializer { - public final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; public synthetic fun (Lkotlinx/serialization/KSerializer;)V public fun childSerializers ()[Lkotlinx/serialization/KSerializer; public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; @@ -917,7 +992,7 @@ public abstract class ru/mipt/npm/root/serialization/TObject { public synthetic fun (ILkotlin/UInt;Lkotlin/UInt;Lkotlinx/serialization/internal/SerializationConstructorMarker;Lkotlin/jvm/internal/DefaultConstructorMarker;)V public final fun getFBits-pVg5ArA ()I public final fun getFUniqueID-pVg5ArA ()I - public static final fun write$Self (Lru/mipt/npm/root/serialization/TObject;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V + public static final synthetic fun write$Self (Lru/mipt/npm/root/serialization/TObject;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V } public final class ru/mipt/npm/root/serialization/TObject$Companion { diff --git a/demo/gdml/api/gdml.api b/demo/gdml/api/gdml.api index 480385c3..1dba1ad6 100644 --- a/demo/gdml/api/gdml.api +++ b/demo/gdml/api/gdml.api @@ -1,21 +1,3 @@ -public final class space/kscience/visionforge/gdml/demo/GDMLDemoApp : tornadofx/App { - public fun ()V -} - -public final class space/kscience/visionforge/gdml/demo/GDMLView : tornadofx/View { - public static final field Companion Lspace/kscience/visionforge/gdml/demo/GDMLView$Companion; - public fun ()V - public fun getRoot ()Ljavafx/scene/Parent; -} - -public final class space/kscience/visionforge/gdml/demo/GDMLView$Companion { -} - -public final class space/kscience/visionforge/gdml/demo/GdmlFxDemoAppKt { - public static final fun main ()V - public static synthetic fun main ([Ljava/lang/String;)V -} - public final class space/kscience/visionforge/gdml/demo/ReadFileKt { public static final fun readFile (Lspace/kscience/visionforge/VisionManager;Ljava/io/File;)Lspace/kscience/visionforge/Vision; public static final fun readFile (Lspace/kscience/visionforge/VisionManager;Ljava/lang/String;)Lspace/kscience/visionforge/Vision; diff --git a/demo/muon-monitor/api/muon-monitor.api b/demo/muon-monitor/api/muon-monitor.api index da3a84ed..c0b6c4d8 100644 --- a/demo/muon-monitor/api/muon-monitor.api +++ b/demo/muon-monitor/api/muon-monitor.api @@ -1,6 +1,5 @@ public final class ru/mipt/npm/muon/monitor/Event { public static final field Companion Lru/mipt/npm/muon/monitor/Event$Companion; - public synthetic fun (IILjava/util/List;Ljava/util/Collection;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V public fun (ILjava/util/List;Ljava/util/Collection;)V public final fun component1 ()I public final fun component2 ()Ljava/util/List; @@ -13,12 +12,10 @@ public final class ru/mipt/npm/muon/monitor/Event { public final fun getTrack ()Ljava/util/List; public fun hashCode ()I public fun toString ()Ljava/lang/String; - public static final fun write$Self (Lru/mipt/npm/muon/monitor/Event;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V } public final class ru/mipt/npm/muon/monitor/Event$$serializer : kotlinx/serialization/internal/GeneratedSerializer { public static final field INSTANCE Lru/mipt/npm/muon/monitor/Event$$serializer; - public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; public fun childSerializers ()[Lkotlinx/serialization/KSerializer; public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lru/mipt/npm/muon/monitor/Event; @@ -40,7 +37,6 @@ public final class ru/mipt/npm/muon/monitor/Model { public final fun getRoot ()Lspace/kscience/visionforge/solid/SolidGroup; public final fun getTracks ()Lspace/kscience/visionforge/solid/SolidGroup; public final fun reset ()V - public final fun setTracks (Lspace/kscience/visionforge/solid/SolidGroup;)V } public final class ru/mipt/npm/muon/monitor/Monitor { @@ -61,9 +57,9 @@ public final class ru/mipt/npm/muon/monitor/ReadResourceKt { } public final class ru/mipt/npm/muon/monitor/SC1 { - public fun (Ljava/lang/String;Lspace/kscience/visionforge/solid/Point3D;FFF)V - public synthetic fun (Ljava/lang/String;Lspace/kscience/visionforge/solid/Point3D;FFFILkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun getCenter ()Lspace/kscience/visionforge/solid/Point3D; + public fun (Ljava/lang/String;Lspace/kscience/visionforge/solid/Float32Vector3D;FFF)V + public synthetic fun (Ljava/lang/String;Lspace/kscience/visionforge/solid/Float32Vector3D;FFFILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun getCenter ()Lspace/kscience/visionforge/solid/Float32Vector3D; public final fun getName ()Ljava/lang/String; public final fun getXSize ()F public final fun getYSize ()F @@ -71,8 +67,8 @@ public final class ru/mipt/npm/muon/monitor/SC1 { } public final class ru/mipt/npm/muon/monitor/SC16 { - public fun (Ljava/lang/String;Lspace/kscience/visionforge/solid/Point3D;)V - public final fun getCenter ()Lspace/kscience/visionforge/solid/Point3D; + public fun (Ljava/lang/String;Lspace/kscience/visionforge/solid/Float32Vector3D;)V + public final fun getCenter ()Lspace/kscience/visionforge/solid/Float32Vector3D; public final fun getName ()Ljava/lang/String; public final fun getPixels ()Ljava/util/Collection; } @@ -80,8 +76,8 @@ public final class ru/mipt/npm/muon/monitor/SC16 { public final class ru/mipt/npm/muon/monitor/server/MMServerKt { public static final fun main ()V public static synthetic fun main ([Ljava/lang/String;)V - public static final fun module (Lio/ktor/application/Application;Lspace/kscience/dataforge/context/Context;)V - public static synthetic fun module$default (Lio/ktor/application/Application;Lspace/kscience/dataforge/context/Context;ILjava/lang/Object;)V + public static final fun module (Lio/ktor/server/application/Application;Lspace/kscience/dataforge/context/Context;)V + public static synthetic fun module$default (Lio/ktor/server/application/Application;Lspace/kscience/dataforge/context/Context;ILjava/lang/Object;)V } public final class ru/mipt/npm/muon/monitor/sim/Cos2TrackGenerator : ru/mipt/npm/muon/monitor/sim/TrackGenerator { @@ -112,8 +108,8 @@ public final class ru/mipt/npm/muon/monitor/sim/LineKt { public static final fun getY (Lorg/apache/commons/math3/geometry/euclidean/threed/Line;)D public static final fun makeTrack (DDDD)Lorg/apache/commons/math3/geometry/euclidean/threed/Line; public static final fun makeTrack (Lorg/apache/commons/math3/geometry/euclidean/threed/Vector3D;Lorg/apache/commons/math3/geometry/euclidean/threed/Vector3D;)Lorg/apache/commons/math3/geometry/euclidean/threed/Line; - public static final fun toPoint (Lorg/apache/commons/math3/geometry/euclidean/threed/Vector3D;)Lspace/kscience/visionforge/solid/Point3D; - public static final fun toPoints (Lorg/apache/commons/math3/geometry/euclidean/threed/Line;)Ljava/util/List; + public static final fun toKMathVector (Lorg/apache/commons/math3/geometry/euclidean/threed/Vector3D;)Lspace/kscience/visionforge/solid/Float32Vector3D; + public static final fun toKMathVectors (Lorg/apache/commons/math3/geometry/euclidean/threed/Line;)Ljava/util/List; } public final class ru/mipt/npm/muon/monitor/sim/MonitorKt { diff --git a/demo/playground/api/playground.api b/demo/playground/api/playground.api index 7a050caa..ca5e1cc5 100644 --- a/demo/playground/api/playground.api +++ b/demo/playground/api/playground.api @@ -3,6 +3,31 @@ public final class space/kscience/visionforge/examples/AllThingsDemoKt { public static synthetic fun main ([Ljava/lang/String;)V } +public final class space/kscience/visionforge/examples/AntennaKt { + public static final fun main ()V + public static synthetic fun main ([Ljava/lang/String;)V +} + +public final class space/kscience/visionforge/examples/AxesKt { + public static final fun main ()V + public static synthetic fun main ([Ljava/lang/String;)V +} + +public final class space/kscience/visionforge/examples/BmnDemoKt { + public static final fun main ()V + public static synthetic fun main ([Ljava/lang/String;)V +} + +public final class space/kscience/visionforge/examples/ControlVisionKt { + public static final fun main ()V + public static synthetic fun main ([Ljava/lang/String;)V +} + +public final class space/kscience/visionforge/examples/ExtrudedKt { + public static final fun main ()V + public static synthetic fun main ([Ljava/lang/String;)V +} + public final class space/kscience/visionforge/examples/FormServerKt { public static final fun main ()V public static synthetic fun main ([Ljava/lang/String;)V @@ -38,17 +63,24 @@ public final class space/kscience/visionforge/examples/RandomSpheresKt { public static synthetic fun main ([Ljava/lang/String;)V } -public final class space/kscience/visionforge/examples/RootParserKt { +public final class space/kscience/visionforge/examples/ServerExtensionsKt { + public static final fun makeVisionFile (Ljava/nio/file/Path;Ljava/lang/String;Lspace/kscience/visionforge/html/ResourceLocation;ZLspace/kscience/visionforge/html/HtmlVisionFragment;)V + public static synthetic fun makeVisionFile$default (Ljava/nio/file/Path;Ljava/lang/String;Lspace/kscience/visionforge/html/ResourceLocation;ZLspace/kscience/visionforge/html/HtmlVisionFragment;ILjava/lang/Object;)V + public static final fun serve (Ljava/lang/String;ZLspace/kscience/visionforge/html/HtmlVisionFragment;)V + public static synthetic fun serve$default (Ljava/lang/String;ZLspace/kscience/visionforge/html/HtmlVisionFragment;ILjava/lang/Object;)V +} + +public final class space/kscience/visionforge/examples/ShapesKt { public static final fun main ()V public static synthetic fun main ([Ljava/lang/String;)V } -public final class space/kscience/visionforge/examples/ServerExtensionsKt { - public static final fun makeVisionFile (Ljava/nio/file/Path;Ljava/lang/String;Lspace/kscience/visionforge/html/ResourceLocation;ZLkotlin/jvm/functions/Function1;)V - public static synthetic fun makeVisionFile$default (Ljava/nio/file/Path;Ljava/lang/String;Lspace/kscience/visionforge/html/ResourceLocation;ZLkotlin/jvm/functions/Function1;ILjava/lang/Object;)V +public final class space/kscience/visionforge/examples/SimpleCubeKt { + public static final fun main ()V + public static synthetic fun main ([Ljava/lang/String;)V } -public final class space/kscience/visionforge/examples/SimpleCubeKt { +public final class space/kscience/visionforge/examples/SurfaceKt { public static final fun main ()V public static synthetic fun main ([Ljava/lang/String;)V } diff --git a/demo/sat-demo/api/sat-demo.api b/demo/sat-demo/api/sat-demo.api index 00e5cedd..2fdc412b 100644 --- a/demo/sat-demo/api/sat-demo.api +++ b/demo/sat-demo/api/sat-demo.api @@ -3,3 +3,8 @@ public final class ru/mipt/npm/sat/SatServerKt { public static synthetic fun main ([Ljava/lang/String;)V } +public final class ru/mipt/npm/sat/StaticKt { + public static final fun main ()V + public static synthetic fun main ([Ljava/lang/String;)V +} + diff --git a/demo/sat-demo/build.gradle.kts b/demo/sat-demo/build.gradle.kts index 5e881b63..6cf37859 100644 --- a/demo/sat-demo/build.gradle.kts +++ b/demo/sat-demo/build.gradle.kts @@ -1,5 +1,6 @@ plugins { - id("space.kscience.gradle.jvm") + id("space.kscience.gradle.mpp") + alias(spclibs.plugins.ktor) application } @@ -8,8 +9,8 @@ kscience { // useSerialization { // json() // } - useKtor() - dependencies{ + jvm() + jvmMain{ implementation("io.ktor:ktor-server-cio") implementation(projects.visionforgeThreejs.visionforgeThreejsServer) implementation(spclibs.logback.classic) diff --git a/demo/sat-demo/src/main/kotlin/ru/mipt/npm/sat/geometry.kt b/demo/sat-demo/src/jvmMain/kotlin/ru/mipt/npm/sat/geometry.kt similarity index 100% rename from demo/sat-demo/src/main/kotlin/ru/mipt/npm/sat/geometry.kt rename to demo/sat-demo/src/jvmMain/kotlin/ru/mipt/npm/sat/geometry.kt diff --git a/demo/sat-demo/src/main/kotlin/ru/mipt/npm/sat/satServer.kt b/demo/sat-demo/src/jvmMain/kotlin/ru/mipt/npm/sat/satServer.kt similarity index 100% rename from demo/sat-demo/src/main/kotlin/ru/mipt/npm/sat/satServer.kt rename to demo/sat-demo/src/jvmMain/kotlin/ru/mipt/npm/sat/satServer.kt diff --git a/demo/sat-demo/src/main/kotlin/ru/mipt/npm/sat/static.kt b/demo/sat-demo/src/jvmMain/kotlin/ru/mipt/npm/sat/static.kt similarity index 100% rename from demo/sat-demo/src/main/kotlin/ru/mipt/npm/sat/static.kt rename to demo/sat-demo/src/jvmMain/kotlin/ru/mipt/npm/sat/static.kt diff --git a/demo/sat-demo/src/main/resources/css/styles.css b/demo/sat-demo/src/jvmMain/resources/css/styles.css similarity index 100% rename from demo/sat-demo/src/main/resources/css/styles.css rename to demo/sat-demo/src/jvmMain/resources/css/styles.css diff --git a/demo/solid-showcase/api/solid-showcase.api b/demo/solid-showcase/api/solid-showcase.api index 4cc47c7d..8b5b3a52 100644 --- a/demo/solid-showcase/api/solid-showcase.api +++ b/demo/solid-showcase/api/solid-showcase.api @@ -1,20 +1,3 @@ -public final class space/kscience/visionforge/demo/MetaEditorDemo : tornadofx/View { - public fun ()V - public final fun getDescriptor ()Lspace/kscience/dataforge/meta/descriptors/MetaDescriptor; - public final fun getMeta ()Lspace/kscience/dataforge/meta/ObservableMutableMeta; - public synthetic fun getRoot ()Ljavafx/scene/Parent; - public fun getRoot ()Ljavafx/scene/control/SplitPane; -} - -public final class space/kscience/visionforge/demo/MetaEditorDemoApp : tornadofx/App { - public fun ()V -} - -public final class space/kscience/visionforge/demo/MetaEditorDemoKt { - public static final fun main ()V - public static synthetic fun main ([Ljava/lang/String;)V -} - public final class space/kscience/visionforge/solid/demo/DemoKt { public static final fun demo (Lspace/kscience/visionforge/solid/demo/VisionLayout;Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)V public static synthetic fun demo$default (Lspace/kscience/visionforge/solid/demo/VisionLayout;Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)V @@ -23,25 +6,8 @@ public final class space/kscience/visionforge/solid/demo/DemoKt { public static final fun showcaseCSG (Lspace/kscience/visionforge/solid/demo/VisionLayout;)V } -public final class space/kscience/visionforge/solid/demo/FXDemoApp : tornadofx/App { - public fun ()V - public final fun getView ()Lspace/kscience/visionforge/solid/demo/FXDemoGrid; - public fun start (Ljavafx/stage/Stage;)V -} - -public final class space/kscience/visionforge/solid/demo/FXDemoAppKt { - public static final fun main ()V - public static synthetic fun main ([Ljava/lang/String;)V -} - -public final class space/kscience/visionforge/solid/demo/FXDemoGrid : tornadofx/View, space/kscience/visionforge/solid/demo/VisionLayout { - public fun ()V - public fun getRoot ()Ljavafx/scene/Parent; - public synthetic fun render (Lspace/kscience/dataforge/names/Name;Lspace/kscience/visionforge/Vision;Lspace/kscience/dataforge/meta/Meta;)V - public fun render (Lspace/kscience/dataforge/names/Name;Lspace/kscience/visionforge/solid/Solid;Lspace/kscience/dataforge/meta/Meta;)V -} - public abstract interface class space/kscience/visionforge/solid/demo/VisionLayout { + public abstract fun getSolids ()Lspace/kscience/visionforge/solid/Solids; public abstract fun render (Lspace/kscience/dataforge/names/Name;Lspace/kscience/visionforge/Vision;Lspace/kscience/dataforge/meta/Meta;)V public static synthetic fun render$default (Lspace/kscience/visionforge/solid/demo/VisionLayout;Lspace/kscience/dataforge/names/Name;Lspace/kscience/visionforge/Vision;Lspace/kscience/dataforge/meta/Meta;ILjava/lang/Object;)V } diff --git a/visionforge-core/README.md b/visionforge-core/README.md index 2f9e6889..5c5b493b 100644 --- a/visionforge-core/README.md +++ b/visionforge-core/README.md @@ -6,19 +6,8 @@ ## Artifact: -The Maven coordinates of this project are `space.kscience:visionforge-core:0.2.0`. +The Maven coordinates of this project are `space.kscience:visionforge-core:0.3.0-rc`. -**Gradle Groovy:** -```groovy -repositories { - maven { url 'https://repo.kotlin.link' } - mavenCentral() -} - -dependencies { - implementation 'space.kscience:visionforge-core:0.2.0' -} -``` **Gradle Kotlin DSL:** ```kotlin repositories { @@ -27,6 +16,6 @@ repositories { } dependencies { - implementation("space.kscience:visionforge-core:0.2.0") + implementation("space.kscience:visionforge-core:0.3.0-rc") } ``` diff --git a/visionforge-core/api/visionforge-core.api b/visionforge-core/api/visionforge-core.api index f9099a99..0cd2b904 100644 --- a/visionforge-core/api/visionforge-core.api +++ b/visionforge-core/api/visionforge-core.api @@ -1,3 +1,62 @@ +public abstract class space/kscience/visionforge/AbstractVision : space/kscience/visionforge/Vision { + public static final field Companion Lspace/kscience/visionforge/AbstractVision$Companion; + public fun ()V + public synthetic fun (ILspace/kscience/dataforge/meta/MutableMeta;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V + public fun getDescriptor ()Lspace/kscience/dataforge/meta/descriptors/MetaDescriptor; + public fun getParent ()Lspace/kscience/visionforge/Vision; + public final fun getProperties ()Lspace/kscience/visionforge/MutableVisionProperties; + protected final fun getPropertiesInternal ()Lspace/kscience/dataforge/meta/MutableMeta; + public fun setParent (Lspace/kscience/visionforge/Vision;)V + protected final fun setPropertiesInternal (Lspace/kscience/dataforge/meta/MutableMeta;)V + public static final synthetic fun write$Self (Lspace/kscience/visionforge/AbstractVision;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final class space/kscience/visionforge/AbstractVision$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public abstract class space/kscience/visionforge/AbstractVisionGroup : space/kscience/visionforge/AbstractVision, space/kscience/visionforge/MutableVisionGroup { + public static final field Companion Lspace/kscience/visionforge/AbstractVisionGroup$Companion; + public fun ()V + public synthetic fun (ILspace/kscience/dataforge/meta/MutableMeta;Ljava/util/Map;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V + public abstract fun createGroup ()Lspace/kscience/visionforge/AbstractVisionGroup; + public fun getChildren ()Lspace/kscience/visionforge/MutableVisionChildren; + public synthetic fun getChildren ()Lspace/kscience/visionforge/VisionChildren; + protected final fun getChildrenInternal ()Ljava/util/Map; + protected final fun setChildrenInternal (Ljava/util/Map;)V + public static final synthetic fun write$Self (Lspace/kscience/visionforge/AbstractVisionGroup;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final class space/kscience/visionforge/AbstractVisionGroup$Companion { + public final fun getDescriptor ()Lspace/kscience/dataforge/meta/descriptors/MetaDescriptor; + public final fun serializer ()Lkotlinx/serialization/KSerializer; + public final fun updateProperties (Lspace/kscience/visionforge/Vision;Lspace/kscience/dataforge/meta/Meta;Lspace/kscience/dataforge/names/Name;)V + public static synthetic fun updateProperties$default (Lspace/kscience/visionforge/AbstractVisionGroup$Companion;Lspace/kscience/visionforge/Vision;Lspace/kscience/dataforge/meta/Meta;Lspace/kscience/dataforge/names/Name;ILjava/lang/Object;)V +} + +public abstract class space/kscience/visionforge/AbstractVisionProperties : space/kscience/visionforge/MutableVisionProperties { + public fun (Lspace/kscience/visionforge/Vision;)V + public synthetic fun getChanges ()Lkotlinx/coroutines/flow/Flow; + public fun getChanges ()Lkotlinx/coroutines/flow/SharedFlow; + protected final fun getChangesInternal ()Lkotlinx/coroutines/flow/MutableSharedFlow; + public fun getDescriptor ()Lspace/kscience/dataforge/meta/descriptors/MetaDescriptor; + protected final fun getOrCreateProperties ()Lspace/kscience/dataforge/meta/MutableMeta; + public fun getOwn ()Lspace/kscience/dataforge/meta/Meta; + protected abstract fun getProperties ()Lspace/kscience/dataforge/meta/MutableMeta; + public fun getValue (Lspace/kscience/dataforge/names/Name;Ljava/lang/Boolean;Ljava/lang/Boolean;)Lspace/kscience/dataforge/meta/Value; + public final fun getVision ()Lspace/kscience/visionforge/Vision; + public fun invalidate (Lspace/kscience/dataforge/names/Name;)V + public fun set (Lspace/kscience/dataforge/names/Name;Lspace/kscience/dataforge/meta/Meta;Z)V + protected abstract fun setProperties (Lspace/kscience/dataforge/meta/MutableMeta;)V + public fun setValue (Lspace/kscience/dataforge/names/Name;Lspace/kscience/dataforge/meta/Value;Z)V +} + +public abstract interface class space/kscience/visionforge/ClickControl : space/kscience/visionforge/ControlVision { + public fun click (Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public static synthetic fun click$default (Lspace/kscience/visionforge/ClickControl;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object; + public static synthetic fun click$suspendImpl (Lspace/kscience/visionforge/ClickControl;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +} + public final class space/kscience/visionforge/Colors { public static final field BLUE_KEY Ljava/lang/String; public static final field GREEN_KEY Ljava/lang/String; @@ -156,68 +215,134 @@ public final class space/kscience/visionforge/Colors { public final fun rgbToString-8NGXxBw (BBB)Ljava/lang/String; } -public final class space/kscience/visionforge/ComputedVisionPropertiesKt { - public static final fun computeProperties (Lspace/kscience/visionforge/Vision;Lspace/kscience/dataforge/meta/descriptors/MetaDescriptor;)Lspace/kscience/dataforge/meta/Meta; - public static synthetic fun computeProperties$default (Lspace/kscience/visionforge/Vision;Lspace/kscience/dataforge/meta/descriptors/MetaDescriptor;ILjava/lang/Object;)Lspace/kscience/dataforge/meta/Meta; - public static final fun computeProperty (Lspace/kscience/visionforge/Vision;Lspace/kscience/dataforge/names/Name;Lspace/kscience/dataforge/meta/descriptors/MetaDescriptor;)Lspace/kscience/dataforge/values/Value; - public static synthetic fun computeProperty$default (Lspace/kscience/visionforge/Vision;Lspace/kscience/dataforge/names/Name;Lspace/kscience/dataforge/meta/descriptors/MetaDescriptor;ILjava/lang/Object;)Lspace/kscience/dataforge/values/Value; - public static final fun computePropertyNode (Lspace/kscience/visionforge/Vision;Lspace/kscience/dataforge/names/Name;Lspace/kscience/dataforge/meta/descriptors/MetaDescriptor;)Lspace/kscience/dataforge/meta/Meta; - public static synthetic fun computePropertyNode$default (Lspace/kscience/visionforge/Vision;Lspace/kscience/dataforge/names/Name;Lspace/kscience/dataforge/meta/descriptors/MetaDescriptor;ILjava/lang/Object;)Lspace/kscience/dataforge/meta/Meta; - public static final fun computePropertyValues (Lspace/kscience/visionforge/Vision;Lspace/kscience/dataforge/meta/descriptors/MetaDescriptor;)Lspace/kscience/dataforge/values/MutableValueProvider; - public static synthetic fun computePropertyValues$default (Lspace/kscience/visionforge/Vision;Lspace/kscience/dataforge/meta/descriptors/MetaDescriptor;ILjava/lang/Object;)Lspace/kscience/dataforge/values/MutableValueProvider; +public abstract interface class space/kscience/visionforge/ControlVision : space/kscience/visionforge/Vision { + public abstract fun dispatchControlEvent (Lspace/kscience/visionforge/VisionControlEvent;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public abstract fun getControlEventFlow ()Lkotlinx/coroutines/flow/SharedFlow; + public fun receiveEvent (Lspace/kscience/visionforge/VisionEvent;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public static synthetic fun receiveEvent$suspendImpl (Lspace/kscience/visionforge/ControlVision;Lspace/kscience/visionforge/VisionEvent;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; } -public final class space/kscience/visionforge/HtmlExportKt { - public static final fun makeFile (Lspace/kscience/visionforge/html/Page;Ljava/nio/file/Path;Lkotlin/jvm/functions/Function1;)Ljava/nio/file/Path; - public static synthetic fun makeFile$default (Lspace/kscience/visionforge/html/Page;Ljava/nio/file/Path;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Ljava/nio/file/Path; - public static final fun show (Lspace/kscience/visionforge/html/Page;Ljava/nio/file/Path;)V - public static synthetic fun show$default (Lspace/kscience/visionforge/html/Page;Ljava/nio/file/Path;ILjava/lang/Object;)V +public final class space/kscience/visionforge/ControlVisionKt { + public static final fun VisionClickEvent (Lspace/kscience/dataforge/meta/Meta;Lspace/kscience/dataforge/names/Name;)Lspace/kscience/visionforge/VisionClickEvent; + public static synthetic fun VisionClickEvent$default (Lspace/kscience/dataforge/meta/Meta;Lspace/kscience/dataforge/names/Name;ILjava/lang/Object;)Lspace/kscience/visionforge/VisionClickEvent; + public static final fun VisionValueChangeEvent (Lspace/kscience/dataforge/meta/Value;Lspace/kscience/dataforge/names/Name;)Lspace/kscience/visionforge/VisionValueChangeEvent; + public static synthetic fun VisionValueChangeEvent$default (Lspace/kscience/dataforge/meta/Value;Lspace/kscience/dataforge/names/Name;ILjava/lang/Object;)Lspace/kscience/visionforge/VisionValueChangeEvent; + public static final fun onClick (Lspace/kscience/visionforge/ClickControl;Lkotlinx/coroutines/CoroutineScope;Lkotlin/jvm/functions/Function2;)Lkotlinx/coroutines/Job; } -public abstract interface class space/kscience/visionforge/MutableVisionGroup : space/kscience/visionforge/VisionContainerBuilder, space/kscience/visionforge/VisionGroup { - public abstract fun onStructureChanged (Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)V - public abstract fun removeStructureListener (Ljava/lang/Object;)V +public final class space/kscience/visionforge/FlowPropertyKt { + public static final fun flowProperty (Lspace/kscience/visionforge/Vision;Ljava/lang/String;Ljava/lang/Boolean;Ljava/lang/Boolean;)Lkotlinx/coroutines/flow/Flow; + public static final fun flowProperty (Lspace/kscience/visionforge/Vision;Lspace/kscience/dataforge/names/Name;Ljava/lang/Boolean;Ljava/lang/Boolean;)Lkotlinx/coroutines/flow/Flow; + public static synthetic fun flowProperty$default (Lspace/kscience/visionforge/Vision;Ljava/lang/String;Ljava/lang/Boolean;Ljava/lang/Boolean;ILjava/lang/Object;)Lkotlinx/coroutines/flow/Flow; + public static synthetic fun flowProperty$default (Lspace/kscience/visionforge/Vision;Lspace/kscience/dataforge/names/Name;Ljava/lang/Boolean;Ljava/lang/Boolean;ILjava/lang/Object;)Lkotlinx/coroutines/flow/Flow; + public static final fun flowPropertyValue (Lspace/kscience/visionforge/Vision;Ljava/lang/String;Ljava/lang/Boolean;Ljava/lang/Boolean;)Lkotlinx/coroutines/flow/Flow; + public static final fun flowPropertyValue (Lspace/kscience/visionforge/Vision;Lspace/kscience/dataforge/names/Name;Ljava/lang/Boolean;Ljava/lang/Boolean;)Lkotlinx/coroutines/flow/Flow; + public static synthetic fun flowPropertyValue$default (Lspace/kscience/visionforge/Vision;Ljava/lang/String;Ljava/lang/Boolean;Ljava/lang/Boolean;ILjava/lang/Object;)Lkotlinx/coroutines/flow/Flow; + public static synthetic fun flowPropertyValue$default (Lspace/kscience/visionforge/Vision;Lspace/kscience/dataforge/names/Name;Ljava/lang/Boolean;Ljava/lang/Boolean;ILjava/lang/Object;)Lkotlinx/coroutines/flow/Flow; } -public class space/kscience/visionforge/SimpleVisionPropertyContainer : space/kscience/dataforge/meta/Configurable, space/kscience/visionforge/VisionPropertyContainer { - public fun (Lspace/kscience/dataforge/meta/ObservableMutableMeta;)V - public synthetic fun getMeta ()Lspace/kscience/dataforge/meta/MutableMeta; - public fun getMeta ()Lspace/kscience/dataforge/meta/ObservableMutableMeta; - public fun getProperty (Lspace/kscience/dataforge/names/Name;ZZZ)Lspace/kscience/dataforge/values/Value; +public abstract interface class space/kscience/visionforge/MutableVisionChildren : space/kscience/visionforge/MutableVisionContainer, space/kscience/visionforge/VisionChildren { + public abstract fun clear ()V + public abstract fun getParent ()Lspace/kscience/visionforge/MutableVisionGroup; + public abstract fun set (Lspace/kscience/dataforge/names/NameToken;Lspace/kscience/visionforge/Vision;)V + public fun setChild (Lspace/kscience/dataforge/names/Name;Lspace/kscience/visionforge/Vision;)V +} + +public abstract interface class space/kscience/visionforge/MutableVisionContainer { + public abstract fun setChild (Lspace/kscience/dataforge/names/Name;Lspace/kscience/visionforge/Vision;)V +} + +public abstract interface class space/kscience/visionforge/MutableVisionGroup : space/kscience/visionforge/VisionGroup { + public abstract fun createGroup ()Lspace/kscience/visionforge/MutableVisionGroup; + public abstract fun getChildren ()Lspace/kscience/visionforge/MutableVisionChildren; + public fun update (Lspace/kscience/visionforge/VisionChange;)V +} + +public abstract interface class space/kscience/visionforge/MutableVisionProperties : space/kscience/dataforge/meta/MutableMetaProvider, space/kscience/visionforge/VisionProperties { + public synthetic fun get (Lspace/kscience/dataforge/names/Name;)Lspace/kscience/dataforge/meta/Meta; + public fun get (Lspace/kscience/dataforge/names/Name;)Lspace/kscience/dataforge/meta/MutableMeta; + public synthetic fun get (Lspace/kscience/dataforge/names/Name;Ljava/lang/Boolean;Ljava/lang/Boolean;)Lspace/kscience/dataforge/meta/Meta; + public fun get (Lspace/kscience/dataforge/names/Name;Ljava/lang/Boolean;Ljava/lang/Boolean;)Lspace/kscience/dataforge/meta/MutableMeta; + public fun set (Lspace/kscience/dataforge/names/Name;Lspace/kscience/dataforge/meta/Meta;)V + public abstract fun set (Lspace/kscience/dataforge/names/Name;Lspace/kscience/dataforge/meta/Meta;Z)V + public fun setValue (Lspace/kscience/dataforge/names/Name;Lspace/kscience/dataforge/meta/Value;)V + public abstract fun setValue (Lspace/kscience/dataforge/names/Name;Lspace/kscience/dataforge/meta/Value;Z)V +} + +public final class space/kscience/visionforge/NullVision : space/kscience/visionforge/Vision { + public static final field INSTANCE Lspace/kscience/visionforge/NullVision; + public fun getDescriptor ()Lspace/kscience/dataforge/meta/descriptors/MetaDescriptor; + public fun getParent ()Lspace/kscience/visionforge/Vision; + public fun getProperties ()Lspace/kscience/visionforge/MutableVisionProperties; + public final fun serializer ()Lkotlinx/serialization/KSerializer; + public fun setParent (Lspace/kscience/visionforge/Vision;)V +} + +public final class space/kscience/visionforge/RootVision : space/kscience/visionforge/AbstractVisionGroup { + public fun (Lspace/kscience/visionforge/VisionManager;)V + public synthetic fun createGroup ()Lspace/kscience/visionforge/AbstractVisionGroup; + public synthetic fun createGroup ()Lspace/kscience/visionforge/MutableVisionGroup; + public fun createGroup ()Lspace/kscience/visionforge/SimpleVisionGroup; + public fun getManager ()Lspace/kscience/visionforge/VisionManager; +} + +public final class space/kscience/visionforge/SimpleVisionGroup : space/kscience/visionforge/AbstractVisionGroup, space/kscience/visionforge/MutableVisionContainer { + public static final field Companion Lspace/kscience/visionforge/SimpleVisionGroup$Companion; + public fun ()V + public synthetic fun createGroup ()Lspace/kscience/visionforge/AbstractVisionGroup; + public synthetic fun createGroup ()Lspace/kscience/visionforge/MutableVisionGroup; + public fun createGroup ()Lspace/kscience/visionforge/SimpleVisionGroup; + public fun setChild (Lspace/kscience/dataforge/names/Name;Lspace/kscience/visionforge/Vision;)V +} + +public final class space/kscience/visionforge/SimpleVisionGroup$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lspace/kscience/visionforge/SimpleVisionGroup$$serializer; + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lspace/kscience/visionforge/SimpleVisionGroup; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lspace/kscience/visionforge/SimpleVisionGroup;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class space/kscience/visionforge/SimpleVisionGroup$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; } public final class space/kscience/visionforge/StyleReference { - public fun (Lspace/kscience/visionforge/VisionGroup;Ljava/lang/String;)V + public fun (Lspace/kscience/visionforge/Vision;Ljava/lang/String;)V public final fun getName ()Ljava/lang/String; - public final fun getOwner ()Lspace/kscience/visionforge/VisionGroup; + public final fun getOwner ()Lspace/kscience/visionforge/Vision; } public final class space/kscience/visionforge/StyleReferenceKt { - public static final fun style (Lspace/kscience/visionforge/VisionGroup;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lkotlin/properties/ReadOnlyProperty; - public static final fun style (Lspace/kscience/visionforge/VisionGroup;Lspace/kscience/dataforge/meta/Specification;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lkotlin/properties/ReadOnlyProperty; - public static synthetic fun style$default (Lspace/kscience/visionforge/VisionGroup;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lkotlin/properties/ReadOnlyProperty; - public static synthetic fun style$default (Lspace/kscience/visionforge/VisionGroup;Lspace/kscience/dataforge/meta/Specification;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lkotlin/properties/ReadOnlyProperty; - public static final fun useStyle (Lspace/kscience/visionforge/Vision;Lspace/kscience/visionforge/StyleReference;)V + public static final fun style (Lspace/kscience/visionforge/Vision;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lkotlin/properties/ReadOnlyProperty; + public static final fun style (Lspace/kscience/visionforge/Vision;Lspace/kscience/dataforge/meta/Specification;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lkotlin/properties/ReadOnlyProperty; + public static synthetic fun style$default (Lspace/kscience/visionforge/Vision;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lkotlin/properties/ReadOnlyProperty; + public static synthetic fun style$default (Lspace/kscience/visionforge/Vision;Lspace/kscience/dataforge/meta/Specification;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lkotlin/properties/ReadOnlyProperty; + public static final fun useStyle (Lspace/kscience/visionforge/Vision;Lspace/kscience/visionforge/StyleReference;Z)V + public static synthetic fun useStyle$default (Lspace/kscience/visionforge/Vision;Lspace/kscience/visionforge/StyleReference;ZILjava/lang/Object;)V } public final class space/kscience/visionforge/StyleSheet { public static final field Companion Lspace/kscience/visionforge/StyleSheet$Companion; - public static final synthetic fun box-impl (Lspace/kscience/visionforge/VisionGroup;)Lspace/kscience/visionforge/StyleSheet; - public static fun constructor-impl (Lspace/kscience/visionforge/VisionGroup;)Lspace/kscience/visionforge/VisionGroup; - public static final fun define-impl (Lspace/kscience/visionforge/VisionGroup;Ljava/lang/String;Lspace/kscience/dataforge/meta/Meta;)V + public static final synthetic fun box-impl (Lspace/kscience/visionforge/Vision;)Lspace/kscience/visionforge/StyleSheet; + public static fun constructor-impl (Lspace/kscience/visionforge/Vision;)Lspace/kscience/visionforge/Vision; + public static final fun define-impl (Lspace/kscience/visionforge/Vision;Ljava/lang/String;Lspace/kscience/dataforge/meta/Meta;)V public fun equals (Ljava/lang/Object;)Z - public static fun equals-impl (Lspace/kscience/visionforge/VisionGroup;Ljava/lang/Object;)Z - public static final fun equals-impl0 (Lspace/kscience/visionforge/VisionGroup;Lspace/kscience/visionforge/VisionGroup;)Z - public static final fun get-impl (Lspace/kscience/visionforge/VisionGroup;Ljava/lang/String;)Lspace/kscience/dataforge/meta/Meta; - public static final fun getItems-impl (Lspace/kscience/visionforge/VisionGroup;)Ljava/util/Map; + public static fun equals-impl (Lspace/kscience/visionforge/Vision;Ljava/lang/Object;)Z + public static final fun equals-impl0 (Lspace/kscience/visionforge/Vision;Lspace/kscience/visionforge/Vision;)Z + public static final fun get-impl (Lspace/kscience/visionforge/Vision;Ljava/lang/String;)Lspace/kscience/dataforge/meta/Meta; + public static final fun getItems-impl (Lspace/kscience/visionforge/Vision;)Ljava/util/Map; public fun hashCode ()I - public static fun hashCode-impl (Lspace/kscience/visionforge/VisionGroup;)I - public static final fun invoke-impl (Lspace/kscience/visionforge/VisionGroup;Lkotlin/jvm/functions/Function1;)V - public static final fun set-impl (Lspace/kscience/visionforge/VisionGroup;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)V - public static final fun set-impl (Lspace/kscience/visionforge/VisionGroup;Ljava/lang/String;Lspace/kscience/dataforge/meta/Meta;)V + public static fun hashCode-impl (Lspace/kscience/visionforge/Vision;)I + public static final fun invoke-impl (Lspace/kscience/visionforge/Vision;Lkotlin/jvm/functions/Function1;)V + public static final fun set-impl (Lspace/kscience/visionforge/Vision;Ljava/lang/String;Lspace/kscience/dataforge/meta/Meta;)V public fun toString ()Ljava/lang/String; - public static fun toString-impl (Lspace/kscience/visionforge/VisionGroup;)Ljava/lang/String; - public final synthetic fun unbox-impl ()Lspace/kscience/visionforge/VisionGroup; + public static fun toString-impl (Lspace/kscience/visionforge/Vision;)Ljava/lang/String; + public final synthetic fun unbox-impl ()Lspace/kscience/visionforge/Vision; + public static final fun update-impl (Lspace/kscience/visionforge/Vision;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)V } public final class space/kscience/visionforge/StyleSheet$Companion { @@ -227,99 +352,69 @@ public final class space/kscience/visionforge/StyleSheet$Companion { public final class space/kscience/visionforge/StyleSheetKt { public static final fun getStyle (Lspace/kscience/visionforge/Vision;Ljava/lang/String;)Lspace/kscience/dataforge/meta/Meta; public static final fun getStyleNodes (Lspace/kscience/visionforge/Vision;Lspace/kscience/dataforge/names/Name;)Ljava/util/List; - public static final fun getStyleProperty (Lspace/kscience/visionforge/Vision;Lspace/kscience/dataforge/names/Name;)Lspace/kscience/dataforge/values/Value; - public static final fun getStyleSheet (Lspace/kscience/visionforge/VisionGroup;)Lspace/kscience/visionforge/VisionGroup; + public static final fun getStyleProperty (Lspace/kscience/visionforge/Vision;Lspace/kscience/dataforge/names/Name;)Lspace/kscience/dataforge/meta/Meta; + public static final fun getStyleSheet (Lspace/kscience/visionforge/Vision;)Lspace/kscience/visionforge/Vision; public static final fun getStyles (Lspace/kscience/visionforge/Vision;)Ljava/util/List; public static final fun setStyles (Lspace/kscience/visionforge/Vision;Ljava/util/List;)V - public static final fun useStyle (Lspace/kscience/visionforge/Vision;Ljava/lang/String;)V + public static final fun useStyle (Lspace/kscience/visionforge/Vision;Ljava/lang/String;Z)V + public static synthetic fun useStyle$default (Lspace/kscience/visionforge/Vision;Ljava/lang/String;ZILjava/lang/Object;)V } -public abstract interface class space/kscience/visionforge/Vision : space/kscience/dataforge/meta/Configurable, space/kscience/dataforge/meta/descriptors/Described { +public final class space/kscience/visionforge/UsePropertyKt { + public static final fun onPropertyChange (Lspace/kscience/visionforge/Vision;Lkotlin/reflect/KProperty1;Lkotlinx/coroutines/CoroutineScope;Lkotlin/jvm/functions/Function3;)Lkotlinx/coroutines/Job; + public static synthetic fun onPropertyChange$default (Lspace/kscience/visionforge/Vision;Lkotlin/reflect/KProperty1;Lkotlinx/coroutines/CoroutineScope;Lkotlin/jvm/functions/Function3;ILjava/lang/Object;)Lkotlinx/coroutines/Job; + public static final fun useProperty (Lspace/kscience/visionforge/Vision;Ljava/lang/String;Ljava/lang/Boolean;Ljava/lang/Boolean;Lkotlinx/coroutines/CoroutineScope;Lkotlin/jvm/functions/Function1;)Lkotlinx/coroutines/Job; + public static final fun useProperty (Lspace/kscience/visionforge/Vision;Lkotlin/reflect/KProperty1;Lkotlinx/coroutines/CoroutineScope;Lkotlin/jvm/functions/Function2;)Lkotlinx/coroutines/Job; + public static final fun useProperty (Lspace/kscience/visionforge/Vision;Lspace/kscience/dataforge/names/Name;Ljava/lang/Boolean;Ljava/lang/Boolean;Lkotlinx/coroutines/CoroutineScope;Lkotlin/jvm/functions/Function1;)Lkotlinx/coroutines/Job; + public static synthetic fun useProperty$default (Lspace/kscience/visionforge/Vision;Ljava/lang/String;Ljava/lang/Boolean;Ljava/lang/Boolean;Lkotlinx/coroutines/CoroutineScope;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lkotlinx/coroutines/Job; + public static synthetic fun useProperty$default (Lspace/kscience/visionforge/Vision;Lkotlin/reflect/KProperty1;Lkotlinx/coroutines/CoroutineScope;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)Lkotlinx/coroutines/Job; + public static synthetic fun useProperty$default (Lspace/kscience/visionforge/Vision;Lspace/kscience/dataforge/names/Name;Ljava/lang/Boolean;Ljava/lang/Boolean;Lkotlinx/coroutines/CoroutineScope;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lkotlinx/coroutines/Job; +} + +public abstract interface class space/kscience/visionforge/Vision : space/kscience/dataforge/meta/descriptors/Described { public static final field Companion Lspace/kscience/visionforge/Vision$Companion; + public static final field STYLE_TARGET Ljava/lang/String; public static final field TYPE Ljava/lang/String; public abstract fun getDescriptor ()Lspace/kscience/dataforge/meta/descriptors/MetaDescriptor; public fun getManager ()Lspace/kscience/visionforge/VisionManager; - public abstract fun getMeta ()Lspace/kscience/dataforge/meta/ObservableMutableMeta; - public abstract fun getParent ()Lspace/kscience/visionforge/VisionGroup; - public abstract fun getProperty (Lspace/kscience/dataforge/names/Name;ZZZ)Lspace/kscience/dataforge/values/Value; - public static synthetic fun getProperty$default (Lspace/kscience/visionforge/Vision;Lspace/kscience/dataforge/names/Name;ZZZILjava/lang/Object;)Lspace/kscience/dataforge/values/Value; - public abstract fun invalidateProperty (Lspace/kscience/dataforge/names/Name;)V - public abstract fun setParent (Lspace/kscience/visionforge/VisionGroup;)V - public abstract fun update (Lspace/kscience/visionforge/VisionChange;)V + public abstract fun getParent ()Lspace/kscience/visionforge/Vision; + public abstract fun getProperties ()Lspace/kscience/visionforge/MutableVisionProperties; + public fun receiveEvent (Lspace/kscience/visionforge/VisionEvent;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public static synthetic fun receiveEvent$suspendImpl (Lspace/kscience/visionforge/Vision;Lspace/kscience/visionforge/VisionEvent;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public abstract fun setParent (Lspace/kscience/visionforge/Vision;)V + public fun update (Lspace/kscience/visionforge/VisionChange;)V } public final class space/kscience/visionforge/Vision$Companion { + public static final field STYLE_TARGET Ljava/lang/String; public static final field TYPE Ljava/lang/String; public final fun getSTYLE_KEY ()Lspace/kscience/dataforge/names/Name; public final fun getVISIBLE_KEY ()Lspace/kscience/dataforge/names/Name; } -public class space/kscience/visionforge/VisionBase : space/kscience/visionforge/Vision { - public static final field Companion Lspace/kscience/visionforge/VisionBase$Companion; - public fun ()V - public synthetic fun (ILspace/kscience/dataforge/meta/MutableMeta;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V - public fun (Lspace/kscience/visionforge/VisionGroup;Lspace/kscience/dataforge/meta/MutableMeta;)V - public synthetic fun (Lspace/kscience/visionforge/VisionGroup;Lspace/kscience/dataforge/meta/MutableMeta;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public fun getDescriptor ()Lspace/kscience/dataforge/meta/descriptors/MetaDescriptor; - public synthetic fun getMeta ()Lspace/kscience/dataforge/meta/MutableMeta; - public final fun getMeta ()Lspace/kscience/dataforge/meta/ObservableMutableMeta; - protected final fun getOrCreateProperties ()Lspace/kscience/dataforge/meta/MutableMeta; - public fun getParent ()Lspace/kscience/visionforge/VisionGroup; - protected final fun getProperties ()Lspace/kscience/dataforge/meta/MutableMeta; - public fun getProperty (Lspace/kscience/dataforge/names/Name;ZZZ)Lspace/kscience/dataforge/values/Value; - public fun invalidateProperty (Lspace/kscience/dataforge/names/Name;)V - public fun setParent (Lspace/kscience/visionforge/VisionGroup;)V - protected final fun setProperties (Lspace/kscience/dataforge/meta/MutableMeta;)V - public fun update (Lspace/kscience/visionforge/VisionChange;)V - public static final fun write$Self (Lspace/kscience/visionforge/VisionBase;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V -} - -public final class space/kscience/visionforge/VisionBase$$serializer : kotlinx/serialization/internal/GeneratedSerializer { - public static final field INSTANCE Lspace/kscience/visionforge/VisionBase$$serializer; - public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; - public fun childSerializers ()[Lkotlinx/serialization/KSerializer; - public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; - public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lspace/kscience/visionforge/VisionBase; - public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; - public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V - public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lspace/kscience/visionforge/VisionBase;)V - public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; -} - -public final class space/kscience/visionforge/VisionBase$Companion { - public final fun getDescriptor ()Lspace/kscience/dataforge/meta/descriptors/MetaDescriptor; - public final fun serializer ()Lkotlinx/serialization/KSerializer; - public final fun updateProperties (Lspace/kscience/visionforge/Vision;Lspace/kscience/dataforge/names/Name;Lspace/kscience/dataforge/meta/Meta;)V -} - public abstract interface annotation class space/kscience/visionforge/VisionBuilder : java/lang/annotation/Annotation { } -public final class space/kscience/visionforge/VisionChange { +public final class space/kscience/visionforge/VisionChange : space/kscience/visionforge/VisionEvent { public static final field Companion Lspace/kscience/visionforge/VisionChange$Companion; public fun ()V - public synthetic fun (IZLspace/kscience/visionforge/Vision;Lspace/kscience/dataforge/meta/Meta;Ljava/util/Map;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V - public fun (ZLspace/kscience/visionforge/Vision;Lspace/kscience/dataforge/meta/Meta;Ljava/util/Map;)V - public synthetic fun (ZLspace/kscience/visionforge/Vision;Lspace/kscience/dataforge/meta/Meta;Ljava/util/Map;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun component1 ()Z - public final fun component2 ()Lspace/kscience/visionforge/Vision; - public final fun component3 ()Lspace/kscience/dataforge/meta/Meta; - public final fun component4 ()Ljava/util/Map; - public final fun copy (ZLspace/kscience/visionforge/Vision;Lspace/kscience/dataforge/meta/Meta;Ljava/util/Map;)Lspace/kscience/visionforge/VisionChange; - public static synthetic fun copy$default (Lspace/kscience/visionforge/VisionChange;ZLspace/kscience/visionforge/Vision;Lspace/kscience/dataforge/meta/Meta;Ljava/util/Map;ILjava/lang/Object;)Lspace/kscience/visionforge/VisionChange; + public fun (Lspace/kscience/visionforge/Vision;Lspace/kscience/dataforge/meta/Meta;Ljava/util/Map;)V + public synthetic fun (Lspace/kscience/visionforge/Vision;Lspace/kscience/dataforge/meta/Meta;Ljava/util/Map;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Lspace/kscience/visionforge/Vision; + public final fun component2 ()Lspace/kscience/dataforge/meta/Meta; + public final fun component3 ()Ljava/util/Map; + public final fun copy (Lspace/kscience/visionforge/Vision;Lspace/kscience/dataforge/meta/Meta;Ljava/util/Map;)Lspace/kscience/visionforge/VisionChange; + public static synthetic fun copy$default (Lspace/kscience/visionforge/VisionChange;Lspace/kscience/visionforge/Vision;Lspace/kscience/dataforge/meta/Meta;Ljava/util/Map;ILjava/lang/Object;)Lspace/kscience/visionforge/VisionChange; public fun equals (Ljava/lang/Object;)Z public final fun getChildren ()Ljava/util/Map; - public final fun getDelete ()Z public final fun getProperties ()Lspace/kscience/dataforge/meta/Meta; public final fun getVision ()Lspace/kscience/visionforge/Vision; public fun hashCode ()I public fun toString ()Ljava/lang/String; - public static final fun write$Self (Lspace/kscience/visionforge/VisionChange;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V } public final class space/kscience/visionforge/VisionChange$$serializer : kotlinx/serialization/internal/GeneratedSerializer { public static final field INSTANCE Lspace/kscience/visionforge/VisionChange$$serializer; - public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; public fun childSerializers ()[Lkotlinx/serialization/KSerializer; public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lspace/kscience/visionforge/VisionChange; @@ -333,36 +428,98 @@ public final class space/kscience/visionforge/VisionChange$Companion { public final fun serializer ()Lkotlinx/serialization/KSerializer; } -public final class space/kscience/visionforge/VisionChangeBuilder : space/kscience/visionforge/VisionContainerBuilder { +public final class space/kscience/visionforge/VisionChangeBuilder : space/kscience/visionforge/MutableVisionContainer { public fun ()V - public final fun deepCopy ()Lspace/kscience/visionforge/VisionChange; + public final fun deepCopy (Lspace/kscience/visionforge/VisionManager;)Lspace/kscience/visionforge/VisionChange; + public final fun get (Lspace/kscience/dataforge/names/Name;)Lspace/kscience/visionforge/VisionChangeBuilder; public final fun isEmpty ()Z public final fun propertyChanged (Lspace/kscience/dataforge/names/Name;Lspace/kscience/dataforge/names/Name;Lspace/kscience/dataforge/meta/Meta;)V - public fun set (Lspace/kscience/dataforge/names/Name;Lspace/kscience/visionforge/Vision;)V + public fun setChild (Lspace/kscience/dataforge/names/Name;Lspace/kscience/visionforge/Vision;)V + public final fun toJsonString (Lspace/kscience/visionforge/VisionManager;)Ljava/lang/String; } public final class space/kscience/visionforge/VisionChangeKt { - public static final fun VisionChange (Lkotlin/jvm/functions/Function1;)Lspace/kscience/visionforge/VisionChange; - public static final fun flowChanges-HG0u8IE (Lspace/kscience/visionforge/Vision;J)Lkotlinx/coroutines/flow/Flow; + public static final fun VisionChange (Lspace/kscience/visionforge/VisionManager;Lkotlin/jvm/functions/Function1;)Lspace/kscience/visionforge/VisionChange; + public static final fun flowChanges-8Mi8wO0 (Lspace/kscience/visionforge/Vision;JZ)Lkotlinx/coroutines/flow/Flow; + public static synthetic fun flowChanges-8Mi8wO0$default (Lspace/kscience/visionforge/Vision;JZILjava/lang/Object;)Lkotlinx/coroutines/flow/Flow; +} + +public abstract interface class space/kscience/visionforge/VisionChildren : space/kscience/visionforge/VisionContainer { + public static final field Companion Lspace/kscience/visionforge/VisionChildren$Companion; + public static final field STATIC_TOKEN_BODY Ljava/lang/String; + public abstract fun get (Lspace/kscience/dataforge/names/NameToken;)Lspace/kscience/visionforge/Vision; + public abstract fun getChanges ()Lkotlinx/coroutines/flow/Flow; + public fun getChild (Lspace/kscience/dataforge/names/Name;)Lspace/kscience/visionforge/Vision; + public abstract fun getKeys ()Ljava/util/Set; + public abstract fun getParent ()Lspace/kscience/visionforge/Vision; + public fun getValues ()Ljava/lang/Iterable; +} + +public final class space/kscience/visionforge/VisionChildren$Companion { + public static final field STATIC_TOKEN_BODY Ljava/lang/String; + public final fun empty (Lspace/kscience/visionforge/Vision;)Lspace/kscience/visionforge/VisionChildren; +} + +public final class space/kscience/visionforge/VisionClickEvent : space/kscience/visionforge/VisionControlEvent { + public static final field Companion Lspace/kscience/visionforge/VisionClickEvent$Companion; + public fun (Lspace/kscience/dataforge/meta/Meta;)V + public fun getMeta ()Lspace/kscience/dataforge/meta/Meta; + public final fun getName ()Lspace/kscience/dataforge/names/Name; + public final fun getPayload ()Lspace/kscience/dataforge/meta/Meta; + public fun toString ()Ljava/lang/String; +} + +public final class space/kscience/visionforge/VisionClickEvent$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lspace/kscience/visionforge/VisionClickEvent$$serializer; + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lspace/kscience/visionforge/VisionClickEvent; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lspace/kscience/visionforge/VisionClickEvent;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class space/kscience/visionforge/VisionClickEvent$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public abstract interface class space/kscience/visionforge/VisionClient : space/kscience/dataforge/context/Plugin { + public abstract fun getVisionManager ()Lspace/kscience/visionforge/VisionManager; + public abstract fun notifyPropertyChanged (Lspace/kscience/dataforge/names/Name;Lspace/kscience/dataforge/names/Name;Lspace/kscience/dataforge/meta/Meta;)V + public abstract fun sendEvent (Lspace/kscience/dataforge/names/Name;Lspace/kscience/visionforge/VisionEvent;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +} + +public final class space/kscience/visionforge/VisionClientKt { + public static final fun notifyPropertyChanged (Lspace/kscience/visionforge/VisionClient;Lspace/kscience/dataforge/names/Name;Ljava/lang/String;Ljava/lang/Number;)V + public static final fun notifyPropertyChanged (Lspace/kscience/visionforge/VisionClient;Lspace/kscience/dataforge/names/Name;Ljava/lang/String;Ljava/lang/String;)V + public static final fun notifyPropertyChanged (Lspace/kscience/visionforge/VisionClient;Lspace/kscience/dataforge/names/Name;Ljava/lang/String;Lspace/kscience/dataforge/meta/Meta;)V + public static final fun notifyPropertyChanged (Lspace/kscience/visionforge/VisionClient;Lspace/kscience/dataforge/names/Name;Ljava/lang/String;Z)V } public abstract interface class space/kscience/visionforge/VisionContainer { - public abstract fun get (Lspace/kscience/dataforge/names/Name;)Lspace/kscience/visionforge/Vision; + public abstract fun getChild (Lspace/kscience/dataforge/names/Name;)Lspace/kscience/visionforge/Vision; } -public abstract interface class space/kscience/visionforge/VisionContainerBuilder { - public abstract fun set (Lspace/kscience/dataforge/names/Name;Lspace/kscience/visionforge/Vision;)V +public final class space/kscience/visionforge/VisionContainerKt { + public static final fun asSequence (Lspace/kscience/visionforge/VisionChildren;)Lkotlin/sequences/Sequence; + public static final fun forEach (Lspace/kscience/visionforge/VisionChildren;Lkotlin/jvm/functions/Function2;)V + public static final fun get (Lspace/kscience/visionforge/VisionChildren;Ljava/lang/String;)Lspace/kscience/visionforge/Vision; + public static final fun get (Lspace/kscience/visionforge/VisionChildren;Lspace/kscience/dataforge/names/Name;)Lspace/kscience/visionforge/Vision; + public static final fun getChild (Lspace/kscience/visionforge/VisionContainer;Ljava/lang/String;)Lspace/kscience/visionforge/Vision; + public static final fun isEmpty (Lspace/kscience/visionforge/VisionChildren;)Z + public static final fun iterator (Lspace/kscience/visionforge/VisionChildren;)Ljava/util/Iterator; + public static final fun set (Lspace/kscience/visionforge/MutableVisionChildren;Ljava/lang/String;Lspace/kscience/visionforge/Vision;)V + public static final fun set (Lspace/kscience/visionforge/MutableVisionChildren;Lspace/kscience/dataforge/names/Name;Lspace/kscience/visionforge/Vision;)V + public static final fun setChild (Lspace/kscience/visionforge/MutableVisionContainer;Ljava/lang/String;Lspace/kscience/visionforge/Vision;)V + public static final fun static (Lspace/kscience/visionforge/MutableVisionChildren;Lspace/kscience/visionforge/Vision;)V } -public final class space/kscience/visionforge/VisionDelegatesKt { - public static final fun numberProperty (Lspace/kscience/visionforge/Vision;Lspace/kscience/dataforge/names/Name;ZZZ)Lkotlin/properties/ReadWriteProperty; - public static final fun numberProperty (Lspace/kscience/visionforge/Vision;Lspace/kscience/dataforge/names/Name;ZZZLkotlin/jvm/functions/Function0;)Lkotlin/properties/ReadWriteProperty; - public static synthetic fun numberProperty$default (Lspace/kscience/visionforge/Vision;Lspace/kscience/dataforge/names/Name;ZZZILjava/lang/Object;)Lkotlin/properties/ReadWriteProperty; - public static synthetic fun numberProperty$default (Lspace/kscience/visionforge/Vision;Lspace/kscience/dataforge/names/Name;ZZZLkotlin/jvm/functions/Function0;ILjava/lang/Object;)Lkotlin/properties/ReadWriteProperty; - public static final fun propertyValue (Lspace/kscience/visionforge/Vision;Lspace/kscience/dataforge/names/Name;ZZZ)Lkotlin/properties/ReadWriteProperty; - public static final fun propertyValue (Lspace/kscience/visionforge/Vision;Lspace/kscience/dataforge/names/Name;ZZZLkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)Lkotlin/properties/ReadWriteProperty; - public static synthetic fun propertyValue$default (Lspace/kscience/visionforge/Vision;Lspace/kscience/dataforge/names/Name;ZZZILjava/lang/Object;)Lkotlin/properties/ReadWriteProperty; - public static synthetic fun propertyValue$default (Lspace/kscience/visionforge/Vision;Lspace/kscience/dataforge/names/Name;ZZZLkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lkotlin/properties/ReadWriteProperty; +public abstract class space/kscience/visionforge/VisionControlEvent : space/kscience/dataforge/meta/MetaRepr, space/kscience/visionforge/VisionEvent { + public fun ()V + public abstract fun getMeta ()Lspace/kscience/dataforge/meta/Meta; + public fun toMeta ()Lspace/kscience/dataforge/meta/Meta; + public fun toString ()Ljava/lang/String; } public final class space/kscience/visionforge/VisionDescriptorKt { @@ -382,82 +539,35 @@ public final class space/kscience/visionforge/VisionDescriptorKt { public static final fun setWidgetType (Lspace/kscience/dataforge/meta/descriptors/MetaDescriptorBuilder;Ljava/lang/String;)V } -public abstract interface class space/kscience/visionforge/VisionGroup : space/kscience/dataforge/provider/Provider, space/kscience/visionforge/Vision, space/kscience/visionforge/VisionContainer { - public static final field Companion Lspace/kscience/visionforge/VisionGroup$Companion; - public static final field STYLE_TARGET Ljava/lang/String; - public fun content (Ljava/lang/String;)Ljava/util/Map; - public fun get (Lspace/kscience/dataforge/names/Name;)Lspace/kscience/visionforge/Vision; - public abstract fun getChildren ()Ljava/util/Map; - public fun getDefaultTarget ()Ljava/lang/String; +public abstract interface class space/kscience/visionforge/VisionEvent { + public static final field Companion Lspace/kscience/visionforge/VisionEvent$Companion; } -public final class space/kscience/visionforge/VisionGroup$Companion { - public static final field STYLE_TARGET Ljava/lang/String; +public final class space/kscience/visionforge/VisionEvent$Companion { + public final fun getCLICK_EVENT_KEY ()Lspace/kscience/dataforge/names/Name; } -public class space/kscience/visionforge/VisionGroupBase : space/kscience/visionforge/VisionBase, space/kscience/visionforge/MutableVisionGroup { - public static final field Companion Lspace/kscience/visionforge/VisionGroupBase$Companion; - public fun ()V - public synthetic fun (ILspace/kscience/dataforge/meta/MutableMeta;Ljava/util/Map;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V - public fun (Ljava/util/Map;)V - public synthetic fun (Ljava/util/Map;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - protected fun addStatic (Lspace/kscience/visionforge/Vision;)V - protected final fun childrenChanged (Lspace/kscience/dataforge/names/Name;)V - protected fun createGroup ()Lspace/kscience/visionforge/VisionGroupBase; - public fun getChildren ()Ljava/util/Map; - protected final fun getChildrenInternal ()Ljava/util/Map; - public fun invalidateProperty (Lspace/kscience/dataforge/names/Name;)V - public fun onStructureChanged (Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)V - public fun removeStructureListener (Ljava/lang/Object;)V - public fun set (Lspace/kscience/dataforge/names/Name;Lspace/kscience/visionforge/Vision;)V +public abstract interface class space/kscience/visionforge/VisionGroup : space/kscience/visionforge/Vision { + public abstract fun getChildren ()Lspace/kscience/visionforge/VisionChildren; public fun update (Lspace/kscience/visionforge/VisionChange;)V - public static final fun write$Self (Lspace/kscience/visionforge/VisionGroupBase;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V -} - -public final class space/kscience/visionforge/VisionGroupBase$$serializer : kotlinx/serialization/internal/GeneratedSerializer { - public static final field INSTANCE Lspace/kscience/visionforge/VisionGroupBase$$serializer; - public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; - public fun childSerializers ()[Lkotlinx/serialization/KSerializer; - public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; - public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lspace/kscience/visionforge/VisionGroupBase; - public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; - public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V - public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lspace/kscience/visionforge/VisionGroupBase;)V - public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; -} - -public final class space/kscience/visionforge/VisionGroupBase$Companion { - public final fun serializer ()Lkotlinx/serialization/KSerializer; -} - -public final class space/kscience/visionforge/VisionGroupBaseKt { - public static final fun setAsRoot (Lspace/kscience/visionforge/Vision;Lspace/kscience/visionforge/VisionManager;)V } public final class space/kscience/visionforge/VisionGroupKt { - public static final fun get (Lspace/kscience/visionforge/VisionContainer;Ljava/lang/String;)Lspace/kscience/visionforge/Vision; - public static final fun getStructureChanges (Lspace/kscience/visionforge/MutableVisionGroup;)Lkotlinx/coroutines/flow/Flow; - public static final fun isEmpty (Lspace/kscience/visionforge/VisionGroup;)Z - public static final fun iterator (Lspace/kscience/visionforge/VisionGroup;)Ljava/util/Iterator; - public static final fun removeAll (Lspace/kscience/visionforge/MutableVisionGroup;)V - public static final fun set (Lspace/kscience/visionforge/VisionContainerBuilder;Ljava/lang/String;Lspace/kscience/visionforge/Vision;)V - public static final fun set (Lspace/kscience/visionforge/VisionContainerBuilder;Lspace/kscience/dataforge/names/NameToken;Lspace/kscience/visionforge/Vision;)V + public static final fun getChildren (Lspace/kscience/visionforge/Vision;)Lspace/kscience/visionforge/VisionChildren; + public static final fun group (Lspace/kscience/visionforge/MutableVisionContainer;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lspace/kscience/visionforge/SimpleVisionGroup; + public static final fun group (Lspace/kscience/visionforge/MutableVisionContainer;Lspace/kscience/dataforge/names/Name;Lkotlin/jvm/functions/Function1;)Lspace/kscience/visionforge/SimpleVisionGroup; + public static synthetic fun group$default (Lspace/kscience/visionforge/MutableVisionContainer;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lspace/kscience/visionforge/SimpleVisionGroup; + public static synthetic fun group$default (Lspace/kscience/visionforge/MutableVisionContainer;Lspace/kscience/dataforge/names/Name;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lspace/kscience/visionforge/SimpleVisionGroup; } public final class space/kscience/visionforge/VisionKt { - public static final fun getPropertyChanges (Lspace/kscience/visionforge/Vision;)Lkotlinx/coroutines/flow/Flow; - public static final fun getProperty (Lspace/kscience/visionforge/Vision;Ljava/lang/String;ZZZ)Lspace/kscience/dataforge/values/Value; - public static synthetic fun getProperty$default (Lspace/kscience/visionforge/Vision;Ljava/lang/String;ZZZILjava/lang/Object;)Lspace/kscience/dataforge/values/Value; public static final fun getVisible (Lspace/kscience/visionforge/Vision;)Ljava/lang/Boolean; - public static final fun onPropertyChange (Lspace/kscience/visionforge/Vision;Lkotlin/jvm/functions/Function2;)V - public static final fun setProperty (Lspace/kscience/visionforge/Vision;Lspace/kscience/dataforge/names/Name;Ljava/lang/Object;)V - public static final fun setPropertyNode (Lspace/kscience/visionforge/Vision;Ljava/lang/String;Ljava/lang/Object;)V + public static final fun onPropertyChange (Lspace/kscience/visionforge/Vision;Lkotlinx/coroutines/CoroutineScope;Lkotlin/jvm/functions/Function2;)Lkotlinx/coroutines/Job; + public static synthetic fun onPropertyChange$default (Lspace/kscience/visionforge/Vision;Lkotlinx/coroutines/CoroutineScope;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)Lkotlinx/coroutines/Job; public static final fun setVisible (Lspace/kscience/visionforge/Vision;Ljava/lang/Boolean;)V - public static final fun useProperty (Lspace/kscience/visionforge/Vision;Lkotlin/reflect/KProperty1;Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)V - public static synthetic fun useProperty$default (Lspace/kscience/visionforge/Vision;Lkotlin/reflect/KProperty1;Ljava/lang/Object;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)V } -public final class space/kscience/visionforge/VisionManager : space/kscience/dataforge/context/AbstractPlugin { +public final class space/kscience/visionforge/VisionManager : space/kscience/dataforge/context/AbstractPlugin, space/kscience/visionforge/MutableVisionContainer { public static final field Companion Lspace/kscience/visionforge/VisionManager$Companion; public static final field VISION_SERIALIZER_MODULE_TARGET Ljava/lang/String; public fun (Lspace/kscience/dataforge/meta/Meta;)V @@ -473,19 +583,43 @@ public final class space/kscience/visionforge/VisionManager : space/kscience/dat public final fun getJsonFormat ()Lkotlinx/serialization/json/Json; public final fun getSerializersModule ()Lkotlinx/serialization/modules/SerializersModule; public fun getTag ()Lspace/kscience/dataforge/context/PluginTag; + public fun setChild (Lspace/kscience/dataforge/names/Name;Lspace/kscience/visionforge/Vision;)V } public final class space/kscience/visionforge/VisionManager$Companion : space/kscience/dataforge/context/PluginFactory { + public synthetic fun build (Lspace/kscience/dataforge/context/Context;Lspace/kscience/dataforge/meta/Meta;)Ljava/lang/Object; + public fun build (Lspace/kscience/dataforge/context/Context;Lspace/kscience/dataforge/meta/Meta;)Lspace/kscience/visionforge/VisionManager; public final fun getDefaultJson ()Lkotlinx/serialization/json/Json; public fun getTag ()Lspace/kscience/dataforge/context/PluginTag; - public fun getType ()Lkotlin/reflect/KClass; - public synthetic fun invoke (Lspace/kscience/dataforge/meta/Meta;Lspace/kscience/dataforge/context/Context;)Ljava/lang/Object; - public fun invoke (Lspace/kscience/dataforge/meta/Meta;Lspace/kscience/dataforge/context/Context;)Lspace/kscience/visionforge/VisionManager; } public final class space/kscience/visionforge/VisionManagerKt { public static final fun encodeToString (Lspace/kscience/visionforge/Vision;)Ljava/lang/String; public static final fun getVisionManager (Lspace/kscience/dataforge/context/Context;)Lspace/kscience/visionforge/VisionManager; + public static final fun setAsRoot (Lspace/kscience/visionforge/Vision;Lspace/kscience/visionforge/VisionManager;)V +} + +public final class space/kscience/visionforge/VisionMetaEvent : space/kscience/dataforge/meta/MetaRepr, space/kscience/visionforge/VisionEvent { + public static final field Companion Lspace/kscience/visionforge/VisionMetaEvent$Companion; + public fun (Lspace/kscience/dataforge/meta/Meta;)V + public final fun getMeta ()Lspace/kscience/dataforge/meta/Meta; + public fun toMeta ()Lspace/kscience/dataforge/meta/Meta; + public fun toString ()Ljava/lang/String; +} + +public final class space/kscience/visionforge/VisionMetaEvent$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lspace/kscience/visionforge/VisionMetaEvent$$serializer; + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lspace/kscience/visionforge/VisionMetaEvent; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lspace/kscience/visionforge/VisionMetaEvent;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class space/kscience/visionforge/VisionMetaEvent$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; } public abstract class space/kscience/visionforge/VisionPlugin : space/kscience/dataforge/context/AbstractPlugin { @@ -497,69 +631,123 @@ public abstract class space/kscience/visionforge/VisionPlugin : space/kscience/d protected abstract fun getVisionSerializersModule ()Lkotlinx/serialization/modules/SerializersModule; } -public abstract interface class space/kscience/visionforge/VisionPropertyContainer { - public abstract fun getMeta ()Lspace/kscience/dataforge/meta/MutableMeta; - public abstract fun getProperty (Lspace/kscience/dataforge/names/Name;ZZZ)Lspace/kscience/dataforge/values/Value; - public static synthetic fun getProperty$default (Lspace/kscience/visionforge/VisionPropertyContainer;Lspace/kscience/dataforge/names/Name;ZZZILjava/lang/Object;)Lspace/kscience/dataforge/values/Value; +public abstract interface class space/kscience/visionforge/VisionProperties : space/kscience/dataforge/meta/MetaProvider { + public fun get (Lspace/kscience/dataforge/names/Name;)Lspace/kscience/dataforge/meta/Meta; + public abstract fun get (Lspace/kscience/dataforge/names/Name;Ljava/lang/Boolean;Ljava/lang/Boolean;)Lspace/kscience/dataforge/meta/Meta; + public static synthetic fun get$default (Lspace/kscience/visionforge/VisionProperties;Lspace/kscience/dataforge/names/Name;Ljava/lang/Boolean;Ljava/lang/Boolean;ILjava/lang/Object;)Lspace/kscience/dataforge/meta/Meta; + public abstract fun getChanges ()Lkotlinx/coroutines/flow/Flow; + public abstract fun getDescriptor ()Lspace/kscience/dataforge/meta/descriptors/MetaDescriptor; + public abstract fun getOwn ()Lspace/kscience/dataforge/meta/Meta; + public fun getValue (Lspace/kscience/dataforge/names/Name;)Lspace/kscience/dataforge/meta/Value; + public abstract fun getValue (Lspace/kscience/dataforge/names/Name;Ljava/lang/Boolean;Ljava/lang/Boolean;)Lspace/kscience/dataforge/meta/Value; + public static synthetic fun getValue$default (Lspace/kscience/visionforge/VisionProperties;Lspace/kscience/dataforge/names/Name;Ljava/lang/Boolean;Ljava/lang/Boolean;ILjava/lang/Object;)Lspace/kscience/dataforge/meta/Value; + public abstract fun invalidate (Lspace/kscience/dataforge/names/Name;)V } -public final class space/kscience/visionforge/html/HeadersKt { - public static final fun importScriptHeader (Lspace/kscience/visionforge/html/Page$Companion;Ljava/lang/String;Lspace/kscience/visionforge/html/ResourceLocation;Ljava/nio/file/Path;)Lkotlin/jvm/functions/Function1; - public static synthetic fun importScriptHeader$default (Lspace/kscience/visionforge/html/Page$Companion;Ljava/lang/String;Lspace/kscience/visionforge/html/ResourceLocation;Ljava/nio/file/Path;ILjava/lang/Object;)Lkotlin/jvm/functions/Function1; +public final class space/kscience/visionforge/VisionPropertiesKt { + public static final fun get (Lspace/kscience/visionforge/MutableVisionProperties;Ljava/lang/String;Ljava/lang/Boolean;Ljava/lang/Boolean;)Lspace/kscience/dataforge/meta/MutableMeta; + public static final fun get (Lspace/kscience/visionforge/VisionProperties;Ljava/lang/String;Ljava/lang/Boolean;Ljava/lang/Boolean;)Lspace/kscience/dataforge/meta/Meta; + public static synthetic fun get$default (Lspace/kscience/visionforge/MutableVisionProperties;Ljava/lang/String;Ljava/lang/Boolean;Ljava/lang/Boolean;ILjava/lang/Object;)Lspace/kscience/dataforge/meta/MutableMeta; + public static synthetic fun get$default (Lspace/kscience/visionforge/VisionProperties;Ljava/lang/String;Ljava/lang/Boolean;Ljava/lang/Boolean;ILjava/lang/Object;)Lspace/kscience/dataforge/meta/Meta; + public static final fun getValue (Lspace/kscience/visionforge/VisionProperties;Ljava/lang/String;Ljava/lang/Boolean;Ljava/lang/Boolean;)Lspace/kscience/dataforge/meta/Value; + public static synthetic fun getValue$default (Lspace/kscience/visionforge/VisionProperties;Ljava/lang/String;Ljava/lang/Boolean;Ljava/lang/Boolean;ILjava/lang/Object;)Lspace/kscience/dataforge/meta/Value; + public static final fun invoke (Lspace/kscience/visionforge/MutableVisionProperties;Lkotlin/jvm/functions/Function1;)V + public static final fun remove (Lspace/kscience/visionforge/MutableVisionProperties;Ljava/lang/String;)V + public static final fun remove (Lspace/kscience/visionforge/MutableVisionProperties;Lspace/kscience/dataforge/names/Name;)V + public static final fun root (Lspace/kscience/visionforge/MutableVisionProperties;Ljava/lang/Boolean;Ljava/lang/Boolean;)Lspace/kscience/dataforge/meta/MutableMeta; + public static synthetic fun root$default (Lspace/kscience/visionforge/MutableVisionProperties;Ljava/lang/Boolean;Ljava/lang/Boolean;ILjava/lang/Object;)Lspace/kscience/dataforge/meta/MutableMeta; } -public final class space/kscience/visionforge/html/HtmlFormFragment { - public final fun get (Ljava/lang/String;)Lspace/kscience/dataforge/meta/Meta; - public final fun getFormBody ()Lkotlin/jvm/functions/Function1; - public final fun getValues ()Lspace/kscience/dataforge/meta/Meta; - public final fun getVision ()Lspace/kscience/visionforge/html/VisionOfHtmlForm; -} - -public final class space/kscience/visionforge/html/HtmlFragmentKt { - public static final fun fragment (Lkotlinx/html/FlowContent;Lkotlin/jvm/functions/Function1;)V - public static final fun fragment (Lkotlinx/html/TagConsumer;Lkotlin/jvm/functions/Function1;)V - public static final fun plus (Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)Lkotlin/jvm/functions/Function1; - public static final fun renderToString (Lkotlin/jvm/functions/Function1;)Ljava/lang/String; -} - -public final class space/kscience/visionforge/html/HtmlVisionRendererKt { - public static final fun HtmlVisionFragment (Lkotlin/jvm/functions/Function1;)Lkotlin/jvm/functions/Function1; - public static final fun visionFragment (Lkotlinx/html/FlowContent;Lspace/kscience/dataforge/context/Context;ZLjava/lang/String;Ljava/lang/String;Ljava/lang/String;ZLkotlin/jvm/functions/Function1;)Ljava/util/Map; - public static final fun visionFragment (Lkotlinx/html/TagConsumer;Lspace/kscience/dataforge/context/Context;ZLjava/lang/String;Ljava/lang/String;Ljava/lang/String;ZLkotlin/jvm/functions/Function1;)Ljava/util/Map; - public static synthetic fun visionFragment$default (Lkotlinx/html/FlowContent;Lspace/kscience/dataforge/context/Context;ZLjava/lang/String;Ljava/lang/String;Ljava/lang/String;ZLkotlin/jvm/functions/Function1;ILjava/lang/Object;)Ljava/util/Map; - public static synthetic fun visionFragment$default (Lkotlinx/html/TagConsumer;Lspace/kscience/dataforge/context/Context;ZLjava/lang/String;Ljava/lang/String;Ljava/lang/String;ZLkotlin/jvm/functions/Function1;ILjava/lang/Object;)Ljava/util/Map; -} - -public final class space/kscience/visionforge/html/Page { - public static final field Companion Lspace/kscience/visionforge/html/Page$Companion; - public fun (Lspace/kscience/dataforge/context/Context;Ljava/util/Map;Lkotlin/jvm/functions/Function1;)V - public synthetic fun (Lspace/kscience/dataforge/context/Context;Ljava/util/Map;Lkotlin/jvm/functions/Function1;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun component1 ()Lspace/kscience/dataforge/context/Context; - public final fun component2 ()Ljava/util/Map; - public final fun component3 ()Lkotlin/jvm/functions/Function1; - public final fun copy (Lspace/kscience/dataforge/context/Context;Ljava/util/Map;Lkotlin/jvm/functions/Function1;)Lspace/kscience/visionforge/html/Page; - public static synthetic fun copy$default (Lspace/kscience/visionforge/html/Page;Lspace/kscience/dataforge/context/Context;Ljava/util/Map;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lspace/kscience/visionforge/html/Page; - public fun equals (Ljava/lang/Object;)Z - public final fun getContent ()Lkotlin/jvm/functions/Function1; - public final fun getContext ()Lspace/kscience/dataforge/context/Context; - public final fun getHeaders ()Ljava/util/Map; - public fun hashCode ()I - public final fun render (Lkotlinx/html/TagConsumer;)Ljava/lang/Object; +public final class space/kscience/visionforge/VisionValueChangeEvent : space/kscience/visionforge/VisionControlEvent { + public static final field Companion Lspace/kscience/visionforge/VisionValueChangeEvent$Companion; + public fun (Lspace/kscience/dataforge/meta/Meta;)V + public fun getMeta ()Lspace/kscience/dataforge/meta/Meta; + public final fun getName ()Lspace/kscience/dataforge/names/Name; + public final fun getValue ()Lspace/kscience/dataforge/meta/Value; public fun toString ()Ljava/lang/String; } -public final class space/kscience/visionforge/html/Page$Companion { - public final fun scriptHeader (Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lkotlin/jvm/functions/Function1; - public static synthetic fun scriptHeader$default (Lspace/kscience/visionforge/html/Page$Companion;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lkotlin/jvm/functions/Function1; - public final fun styleSheetHeader (Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lkotlin/jvm/functions/Function1; - public static synthetic fun styleSheetHeader$default (Lspace/kscience/visionforge/html/Page$Companion;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lkotlin/jvm/functions/Function1; - public final fun title (Ljava/lang/String;)Lkotlin/jvm/functions/Function1; +public final class space/kscience/visionforge/VisionValueChangeEvent$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lspace/kscience/visionforge/VisionValueChangeEvent$$serializer; + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lspace/kscience/visionforge/VisionValueChangeEvent; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lspace/kscience/visionforge/VisionValueChangeEvent;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class space/kscience/visionforge/VisionValueChangeEvent$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class space/kscience/visionforge/html/HeadersKt { + public static final fun importScriptHeader (Lspace/kscience/visionforge/html/VisionPage$Companion;Ljava/lang/String;Lspace/kscience/visionforge/html/ResourceLocation;Ljava/nio/file/Path;Ljava/lang/ClassLoader;)Lspace/kscience/visionforge/html/HtmlFragment; + public static synthetic fun importScriptHeader$default (Lspace/kscience/visionforge/html/VisionPage$Companion;Ljava/lang/String;Lspace/kscience/visionforge/html/ResourceLocation;Ljava/nio/file/Path;Ljava/lang/ClassLoader;ILjava/lang/Object;)Lspace/kscience/visionforge/html/HtmlFragment; +} + +public final class space/kscience/visionforge/html/HtmlExportKt { + public static final fun makeFile (Lspace/kscience/visionforge/html/VisionPage;Ljava/nio/file/Path;Lkotlin/jvm/functions/Function1;)Ljava/nio/file/Path; + public static synthetic fun makeFile$default (Lspace/kscience/visionforge/html/VisionPage;Ljava/nio/file/Path;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Ljava/nio/file/Path; + public static final fun show (Lspace/kscience/visionforge/html/VisionPage;Ljava/nio/file/Path;)V + public static synthetic fun show$default (Lspace/kscience/visionforge/html/VisionPage;Ljava/nio/file/Path;ILjava/lang/Object;)V +} + +public abstract interface class space/kscience/visionforge/html/HtmlFragment { + public abstract fun append (Lkotlinx/html/TagConsumer;)V +} + +public final class space/kscience/visionforge/html/HtmlFragmentKt { + public static final fun appendFragment (Lkotlinx/html/FlowContent;Lspace/kscience/visionforge/html/HtmlFragment;)V + public static final fun appendFragment (Lkotlinx/html/TagConsumer;Lspace/kscience/visionforge/html/HtmlFragment;)V + public static final fun appendTo (Lspace/kscience/visionforge/html/HtmlFragment;Lkotlinx/html/TagConsumer;)V + public static final fun plus (Lspace/kscience/visionforge/html/HtmlFragment;Lspace/kscience/visionforge/html/HtmlFragment;)Lspace/kscience/visionforge/html/HtmlFragment; + public static final fun renderToString (Lspace/kscience/visionforge/html/HtmlFragment;)Ljava/lang/String; +} + +public abstract interface class space/kscience/visionforge/html/HtmlVisionContext : space/kscience/dataforge/context/ContextAware { + public fun generateId (Lspace/kscience/dataforge/names/Name;)Ljava/lang/String; + public abstract fun renderVision (Lkotlinx/html/DIV;Lspace/kscience/dataforge/names/Name;Lspace/kscience/visionforge/Vision;Lspace/kscience/dataforge/meta/Meta;)V +} + +public final class space/kscience/visionforge/html/HtmlVisionContextKt { + public static final fun vision (Lspace/kscience/visionforge/html/HtmlVisionContext;Lkotlinx/html/TagConsumer;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Ljava/lang/Object; + public static final fun vision (Lspace/kscience/visionforge/html/HtmlVisionContext;Lkotlinx/html/TagConsumer;Lspace/kscience/dataforge/names/Name;Lkotlin/jvm/functions/Function1;)Ljava/lang/Object; + public static synthetic fun vision$default (Lspace/kscience/visionforge/html/HtmlVisionContext;Lkotlinx/html/TagConsumer;Lspace/kscience/dataforge/names/Name;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Ljava/lang/Object; +} + +public abstract interface class space/kscience/visionforge/html/HtmlVisionFragment { + public abstract fun append (Lspace/kscience/visionforge/html/VisionTagConsumer;)V +} + +public final class space/kscience/visionforge/html/HtmlVisionRendererKt { + public static final fun appendTo (Lspace/kscience/visionforge/html/HtmlVisionFragment;Lspace/kscience/visionforge/html/VisionTagConsumer;)V + public static final fun visionFragment (Lkotlinx/html/FlowContent;Lspace/kscience/visionforge/VisionManager;ZLjava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function2;Ljava/lang/String;Lspace/kscience/visionforge/html/HtmlVisionFragment;)V + public static final fun visionFragment (Lkotlinx/html/TagConsumer;Lspace/kscience/visionforge/VisionManager;ZLjava/lang/String;Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function2;Lspace/kscience/visionforge/html/HtmlVisionFragment;)V + public static synthetic fun visionFragment$default (Lkotlinx/html/FlowContent;Lspace/kscience/visionforge/VisionManager;ZLjava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function2;Ljava/lang/String;Lspace/kscience/visionforge/html/HtmlVisionFragment;ILjava/lang/Object;)V + public static synthetic fun visionFragment$default (Lkotlinx/html/TagConsumer;Lspace/kscience/visionforge/VisionManager;ZLjava/lang/String;Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function2;Lspace/kscience/visionforge/html/HtmlVisionFragment;ILjava/lang/Object;)V +} + +public final class space/kscience/visionforge/html/InputFeedbackMode : java/lang/Enum { + public static final field Companion Lspace/kscience/visionforge/html/InputFeedbackMode$Companion; + public static final field NONE Lspace/kscience/visionforge/html/InputFeedbackMode; + public static final field ONCHANGE Lspace/kscience/visionforge/html/InputFeedbackMode; + public static final field ONINPUT Lspace/kscience/visionforge/html/InputFeedbackMode; + public static fun getEntries ()Lkotlin/enums/EnumEntries; + public static fun valueOf (Ljava/lang/String;)Lspace/kscience/visionforge/html/InputFeedbackMode; + public static fun values ()[Lspace/kscience/visionforge/html/InputFeedbackMode; +} + +public final class space/kscience/visionforge/html/InputFeedbackMode$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; } public final class space/kscience/visionforge/html/ResourceLocation : java/lang/Enum { public static final field EMBED Lspace/kscience/visionforge/html/ResourceLocation; public static final field LOCAL Lspace/kscience/visionforge/html/ResourceLocation; public static final field SYSTEM Lspace/kscience/visionforge/html/ResourceLocation; + public static fun getEntries ()Lkotlin/enums/EnumEntries; public static fun valueOf (Ljava/lang/String;)Lspace/kscience/visionforge/html/ResourceLocation; public static fun values ()[Lspace/kscience/visionforge/html/ResourceLocation; } @@ -570,19 +758,12 @@ public abstract interface annotation class space/kscience/visionforge/html/Visio public final class space/kscience/visionforge/html/VisionOfCheckbox : space/kscience/visionforge/html/VisionOfHtmlInput { public static final field Companion Lspace/kscience/visionforge/html/VisionOfCheckbox$Companion; public fun ()V - public synthetic fun (ILspace/kscience/dataforge/meta/MutableMeta;Ljava/lang/String;Ljava/lang/String;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V - public fun (Ljava/lang/String;Ljava/lang/String;)V - public synthetic fun (Ljava/lang/String;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V public final fun getChecked ()Ljava/lang/Boolean; - public final fun getLabel ()Ljava/lang/String; - public final fun getName ()Ljava/lang/String; public final fun setChecked (Ljava/lang/Boolean;)V - public static final fun write$Self (Lspace/kscience/visionforge/html/VisionOfCheckbox;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V } public final class space/kscience/visionforge/html/VisionOfCheckbox$$serializer : kotlinx/serialization/internal/GeneratedSerializer { public static final field INSTANCE Lspace/kscience/visionforge/html/VisionOfCheckbox$$serializer; - public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; public fun childSerializers ()[Lkotlinx/serialization/KSerializer; public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lspace/kscience/visionforge/html/VisionOfCheckbox; @@ -596,19 +777,57 @@ public final class space/kscience/visionforge/html/VisionOfCheckbox$Companion { public final fun serializer ()Lkotlinx/serialization/KSerializer; } -public final class space/kscience/visionforge/html/VisionOfHtmlForm : space/kscience/visionforge/html/VisionOfHtmlInput { +public abstract class space/kscience/visionforge/html/VisionOfHtml : space/kscience/visionforge/AbstractVision { + public static final field Companion Lspace/kscience/visionforge/html/VisionOfHtml$Companion; + public fun ()V + public synthetic fun (ILspace/kscience/dataforge/meta/MutableMeta;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V + public final fun getClasses ()Ljava/util/List; + public final fun setClasses (Ljava/util/List;)V + public static final synthetic fun write$Self (Lspace/kscience/visionforge/html/VisionOfHtml;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final class space/kscience/visionforge/html/VisionOfHtml$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class space/kscience/visionforge/html/VisionOfHtmlButton : space/kscience/visionforge/html/VisionOfHtmlControl, space/kscience/visionforge/ClickControl { + public static final field Companion Lspace/kscience/visionforge/html/VisionOfHtmlButton$Companion; + public fun ()V + public final fun getLabel ()Ljava/lang/String; + public final fun setLabel (Ljava/lang/String;)V +} + +public final class space/kscience/visionforge/html/VisionOfHtmlButton$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lspace/kscience/visionforge/html/VisionOfHtmlButton$$serializer; + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lspace/kscience/visionforge/html/VisionOfHtmlButton; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lspace/kscience/visionforge/html/VisionOfHtmlButton;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class space/kscience/visionforge/html/VisionOfHtmlButton$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public abstract class space/kscience/visionforge/html/VisionOfHtmlControl : space/kscience/visionforge/html/VisionOfHtml, space/kscience/visionforge/ControlVision { + public fun ()V + public fun dispatchControlEvent (Lspace/kscience/visionforge/VisionControlEvent;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public fun getControlEventFlow ()Lkotlinx/coroutines/flow/SharedFlow; +} + +public final class space/kscience/visionforge/html/VisionOfHtmlForm : space/kscience/visionforge/html/VisionOfHtmlControl { public static final field Companion Lspace/kscience/visionforge/html/VisionOfHtmlForm$Companion; - public synthetic fun (ILspace/kscience/dataforge/meta/MutableMeta;Ljava/lang/String;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V public fun (Ljava/lang/String;)V public final fun getFormId ()Ljava/lang/String; public final fun getValues ()Lspace/kscience/dataforge/meta/Meta; public final fun setValues (Lspace/kscience/dataforge/meta/Meta;)V - public static final fun write$Self (Lspace/kscience/visionforge/html/VisionOfHtmlForm;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V } public final class space/kscience/visionforge/html/VisionOfHtmlForm$$serializer : kotlinx/serialization/internal/GeneratedSerializer { public static final field INSTANCE Lspace/kscience/visionforge/html/VisionOfHtmlForm$$serializer; - public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; public fun childSerializers ()[Lkotlinx/serialization/KSerializer; public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lspace/kscience/visionforge/html/VisionOfHtmlForm; @@ -623,41 +842,68 @@ public final class space/kscience/visionforge/html/VisionOfHtmlForm$Companion { } public final class space/kscience/visionforge/html/VisionOfHtmlFormKt { - public static final fun HtmlFormFragment (Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lspace/kscience/visionforge/html/HtmlFormFragment; - public static synthetic fun HtmlFormFragment$default (Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lspace/kscience/visionforge/html/HtmlFormFragment; - public static final fun formFragment (Lkotlinx/html/TagConsumer;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lspace/kscience/visionforge/html/VisionOfHtmlForm; - public static synthetic fun formFragment$default (Lkotlinx/html/TagConsumer;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lspace/kscience/visionforge/html/VisionOfHtmlForm; + public static final fun bindForm (Lkotlinx/html/TagConsumer;Lspace/kscience/visionforge/html/VisionOfHtmlForm;Lkotlin/jvm/functions/Function1;)Ljava/lang/Object; + public static final fun button (Lspace/kscience/visionforge/html/VisionOutput;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lspace/kscience/visionforge/html/VisionOfHtmlButton; + public static synthetic fun button$default (Lspace/kscience/visionforge/html/VisionOutput;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lspace/kscience/visionforge/html/VisionOfHtmlButton; } -public abstract class space/kscience/visionforge/html/VisionOfHtmlInput : space/kscience/visionforge/VisionBase { +public class space/kscience/visionforge/html/VisionOfHtmlInput : space/kscience/visionforge/html/VisionOfHtmlControl { public static final field Companion Lspace/kscience/visionforge/html/VisionOfHtmlInput$Companion; - public fun ()V - public synthetic fun (ILspace/kscience/dataforge/meta/MutableMeta;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V + public synthetic fun (ILjava/lang/String;Lspace/kscience/visionforge/html/InputFeedbackMode;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V + public fun (Ljava/lang/String;Lspace/kscience/visionforge/html/InputFeedbackMode;)V + public synthetic fun (Ljava/lang/String;Lspace/kscience/visionforge/html/InputFeedbackMode;ILkotlin/jvm/internal/DefaultConstructorMarker;)V public final fun getDisabled ()Z + public final fun getFeedbackMode ()Lspace/kscience/visionforge/html/InputFeedbackMode; + public final fun getFieldName ()Ljava/lang/String; + public final fun getInputType ()Ljava/lang/String; + public final fun getValue ()Lspace/kscience/dataforge/meta/Value; public final fun setDisabled (Z)V - public static final fun write$Self (Lspace/kscience/visionforge/html/VisionOfHtmlInput;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V + public final fun setFieldName (Ljava/lang/String;)V + public final fun setValue (Lspace/kscience/dataforge/meta/Value;)V + public static final synthetic fun write$Self (Lspace/kscience/visionforge/html/VisionOfHtmlInput;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final class space/kscience/visionforge/html/VisionOfHtmlInput$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lspace/kscience/visionforge/html/VisionOfHtmlInput$$serializer; + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lspace/kscience/visionforge/html/VisionOfHtmlInput; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lspace/kscience/visionforge/html/VisionOfHtmlInput;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; } public final class space/kscience/visionforge/html/VisionOfHtmlInput$Companion { public final fun serializer ()Lkotlinx/serialization/KSerializer; } +public final class space/kscience/visionforge/html/VisionOfHtmlKt { + public static final fun content (Lspace/kscience/visionforge/html/VisionOfPlainHtml;Lkotlin/jvm/functions/Function1;)V + public static final fun html (Lspace/kscience/visionforge/html/VisionOutput;Lkotlin/jvm/functions/Function1;)Lspace/kscience/visionforge/html/VisionOfPlainHtml; + public static final fun htmlCheckBox (Lspace/kscience/visionforge/html/VisionOutput;Lkotlin/jvm/functions/Function1;)Lspace/kscience/visionforge/html/VisionOfCheckbox; + public static synthetic fun htmlCheckBox$default (Lspace/kscience/visionforge/html/VisionOutput;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lspace/kscience/visionforge/html/VisionOfCheckbox; + public static final fun htmlInput (Lspace/kscience/visionforge/html/VisionOutput;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lspace/kscience/visionforge/html/VisionOfHtmlInput; + public static synthetic fun htmlInput$default (Lspace/kscience/visionforge/html/VisionOutput;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lspace/kscience/visionforge/html/VisionOfHtmlInput; + public static final fun htmlNumberField (Lspace/kscience/visionforge/html/VisionOutput;Lkotlin/jvm/functions/Function1;)Lspace/kscience/visionforge/html/VisionOfNumberField; + public static synthetic fun htmlNumberField$default (Lspace/kscience/visionforge/html/VisionOutput;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lspace/kscience/visionforge/html/VisionOfNumberField; + public static final fun htmlRangeField (Lspace/kscience/visionforge/html/VisionOutput;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Lkotlin/jvm/functions/Function1;)Lspace/kscience/visionforge/html/VisionOfRangeField; + public static synthetic fun htmlRangeField$default (Lspace/kscience/visionforge/html/VisionOutput;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lspace/kscience/visionforge/html/VisionOfRangeField; + public static final fun htmlTextField (Lspace/kscience/visionforge/html/VisionOutput;Lkotlin/jvm/functions/Function1;)Lspace/kscience/visionforge/html/VisionOfTextField; + public static synthetic fun htmlTextField$default (Lspace/kscience/visionforge/html/VisionOutput;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lspace/kscience/visionforge/html/VisionOfTextField; + public static final fun onValueChange (Lspace/kscience/visionforge/html/VisionOfHtmlInput;Lkotlinx/coroutines/CoroutineScope;Lkotlin/jvm/functions/Function2;)Lkotlinx/coroutines/Job; + public static synthetic fun onValueChange$default (Lspace/kscience/visionforge/html/VisionOfHtmlInput;Lkotlinx/coroutines/CoroutineScope;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)Lkotlinx/coroutines/Job; +} + public final class space/kscience/visionforge/html/VisionOfNumberField : space/kscience/visionforge/html/VisionOfHtmlInput { public static final field Companion Lspace/kscience/visionforge/html/VisionOfNumberField$Companion; public fun ()V - public synthetic fun (ILspace/kscience/dataforge/meta/MutableMeta;Ljava/lang/String;Ljava/lang/String;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V - public fun (Ljava/lang/String;Ljava/lang/String;)V - public synthetic fun (Ljava/lang/String;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun getLabel ()Ljava/lang/String; - public final fun getName ()Ljava/lang/String; - public final fun getValue ()Ljava/lang/Number; - public final fun setValue (Ljava/lang/Number;)V - public static final fun write$Self (Lspace/kscience/visionforge/html/VisionOfNumberField;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V + public final fun getNumberValue ()Ljava/lang/Number; + public final fun setNumberValue (Ljava/lang/Number;)V } public final class space/kscience/visionforge/html/VisionOfNumberField$$serializer : kotlinx/serialization/internal/GeneratedSerializer { public static final field INSTANCE Lspace/kscience/visionforge/html/VisionOfNumberField$$serializer; - public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; public fun childSerializers ()[Lkotlinx/serialization/KSerializer; public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lspace/kscience/visionforge/html/VisionOfNumberField; @@ -671,24 +917,41 @@ public final class space/kscience/visionforge/html/VisionOfNumberField$Companion public final fun serializer ()Lkotlinx/serialization/KSerializer; } +public final class space/kscience/visionforge/html/VisionOfPlainHtml : space/kscience/visionforge/html/VisionOfHtml { + public static final field Companion Lspace/kscience/visionforge/html/VisionOfPlainHtml$Companion; + public fun ()V + public final fun getContent ()Ljava/lang/String; + public final fun setContent (Ljava/lang/String;)V +} + +public final class space/kscience/visionforge/html/VisionOfPlainHtml$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lspace/kscience/visionforge/html/VisionOfPlainHtml$$serializer; + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lspace/kscience/visionforge/html/VisionOfPlainHtml; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lspace/kscience/visionforge/html/VisionOfPlainHtml;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class space/kscience/visionforge/html/VisionOfPlainHtml$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + public final class space/kscience/visionforge/html/VisionOfRangeField : space/kscience/visionforge/html/VisionOfHtmlInput { public static final field Companion Lspace/kscience/visionforge/html/VisionOfRangeField$Companion; - public fun (DDDLjava/lang/String;Ljava/lang/String;)V - public synthetic fun (DDDLjava/lang/String;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public synthetic fun (ILspace/kscience/dataforge/meta/MutableMeta;DDDLjava/lang/String;Ljava/lang/String;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V - public final fun getLabel ()Ljava/lang/String; + public fun (DDD)V + public synthetic fun (DDDILkotlin/jvm/internal/DefaultConstructorMarker;)V public final fun getMax ()D public final fun getMin ()D - public final fun getName ()Ljava/lang/String; + public final fun getNumberValue ()Ljava/lang/Number; public final fun getStep ()D - public final fun getValue ()Ljava/lang/Number; - public final fun setValue (Ljava/lang/Number;)V - public static final fun write$Self (Lspace/kscience/visionforge/html/VisionOfRangeField;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V + public final fun setNumberValue (Ljava/lang/Number;)V } public final class space/kscience/visionforge/html/VisionOfRangeField$$serializer : kotlinx/serialization/internal/GeneratedSerializer { public static final field INSTANCE Lspace/kscience/visionforge/html/VisionOfRangeField$$serializer; - public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; public fun childSerializers ()[Lkotlinx/serialization/KSerializer; public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lspace/kscience/visionforge/html/VisionOfRangeField; @@ -705,19 +968,12 @@ public final class space/kscience/visionforge/html/VisionOfRangeField$Companion public final class space/kscience/visionforge/html/VisionOfTextField : space/kscience/visionforge/html/VisionOfHtmlInput { public static final field Companion Lspace/kscience/visionforge/html/VisionOfTextField$Companion; public fun ()V - public synthetic fun (ILspace/kscience/dataforge/meta/MutableMeta;Ljava/lang/String;Ljava/lang/String;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V - public fun (Ljava/lang/String;Ljava/lang/String;)V - public synthetic fun (Ljava/lang/String;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun getLabel ()Ljava/lang/String; - public final fun getName ()Ljava/lang/String; public final fun getText ()Ljava/lang/String; public final fun setText (Ljava/lang/String;)V - public static final fun write$Self (Lspace/kscience/visionforge/html/VisionOfTextField;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V } public final class space/kscience/visionforge/html/VisionOfTextField$$serializer : kotlinx/serialization/internal/GeneratedSerializer { public static final field INSTANCE Lspace/kscience/visionforge/html/VisionOfTextField$$serializer; - public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; public fun childSerializers ()[Lkotlinx/serialization/KSerializer; public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lspace/kscience/visionforge/html/VisionOfTextField; @@ -731,17 +987,43 @@ public final class space/kscience/visionforge/html/VisionOfTextField$Companion { public final fun serializer ()Lkotlinx/serialization/KSerializer; } -public final class space/kscience/visionforge/html/VisionOutput { +public final class space/kscience/visionforge/html/VisionOutput : space/kscience/dataforge/context/ContextAware { public fun (Lspace/kscience/dataforge/context/Context;Lspace/kscience/dataforge/names/Name;)V - public final fun getContext ()Lspace/kscience/dataforge/context/Context; + public fun getContext ()Lspace/kscience/dataforge/context/Context; public final fun getMeta ()Lspace/kscience/dataforge/meta/Meta; public final fun getName ()Lspace/kscience/dataforge/names/Name; + public final fun getVisionManager ()Lspace/kscience/visionforge/VisionManager; public final fun meta (Lkotlin/jvm/functions/Function1;)V public final fun requirePlugin (Lspace/kscience/dataforge/context/PluginFactory;)V public final fun setMeta (Lspace/kscience/dataforge/meta/Meta;)V } -public abstract class space/kscience/visionforge/html/VisionTagConsumer : kotlinx/html/TagConsumer { +public final class space/kscience/visionforge/html/VisionPage { + public static final field Companion Lspace/kscience/visionforge/html/VisionPage$Companion; + public fun (Lspace/kscience/visionforge/VisionManager;Ljava/util/Map;Lspace/kscience/visionforge/html/HtmlVisionFragment;)V + public synthetic fun (Lspace/kscience/visionforge/VisionManager;Ljava/util/Map;Lspace/kscience/visionforge/html/HtmlVisionFragment;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Lspace/kscience/visionforge/VisionManager; + public final fun component2 ()Ljava/util/Map; + public final fun component3 ()Lspace/kscience/visionforge/html/HtmlVisionFragment; + public final fun copy (Lspace/kscience/visionforge/VisionManager;Ljava/util/Map;Lspace/kscience/visionforge/html/HtmlVisionFragment;)Lspace/kscience/visionforge/html/VisionPage; + public static synthetic fun copy$default (Lspace/kscience/visionforge/html/VisionPage;Lspace/kscience/visionforge/VisionManager;Ljava/util/Map;Lspace/kscience/visionforge/html/HtmlVisionFragment;ILjava/lang/Object;)Lspace/kscience/visionforge/html/VisionPage; + public fun equals (Ljava/lang/Object;)Z + public final fun getContent ()Lspace/kscience/visionforge/html/HtmlVisionFragment; + public final fun getPageHeaders ()Ljava/util/Map; + public final fun getVisionManager ()Lspace/kscience/visionforge/VisionManager; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final class space/kscience/visionforge/html/VisionPage$Companion { + public final fun scriptHeader (Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lspace/kscience/visionforge/html/HtmlFragment; + public static synthetic fun scriptHeader$default (Lspace/kscience/visionforge/html/VisionPage$Companion;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lspace/kscience/visionforge/html/HtmlFragment; + public final fun styleSheetHeader (Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lspace/kscience/visionforge/html/HtmlFragment; + public static synthetic fun styleSheetHeader$default (Lspace/kscience/visionforge/html/VisionPage$Companion;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lspace/kscience/visionforge/html/HtmlFragment; + public final fun title (Ljava/lang/String;)Lspace/kscience/visionforge/html/HtmlFragment; +} + +public abstract class space/kscience/visionforge/html/VisionTagConsumer : kotlinx/html/TagConsumer, space/kscience/dataforge/context/ContextAware { public static final field AUTO_DATA_ATTRIBUTE Ljava/lang/String; public static final field Companion Lspace/kscience/visionforge/html/VisionTagConsumer$Companion; public static final field DEFAULT_ENDPOINT Ljava/lang/String; @@ -754,25 +1036,29 @@ public abstract class space/kscience/visionforge/html/VisionTagConsumer : kotlin public static final field OUTPUT_META_CLASS Ljava/lang/String; public static final field OUTPUT_NAME_ATTRIBUTE Ljava/lang/String; public static final field OUTPUT_RENDERED Ljava/lang/String; - public fun (Lkotlinx/html/TagConsumer;Lspace/kscience/dataforge/context/Context;Ljava/lang/String;)V - public synthetic fun (Lkotlinx/html/TagConsumer;Lspace/kscience/dataforge/context/Context;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public fun (Lkotlinx/html/TagConsumer;Lspace/kscience/visionforge/VisionManager;Ljava/lang/String;)V + public synthetic fun (Lkotlinx/html/TagConsumer;Lspace/kscience/visionforge/VisionManager;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + protected final fun addVision (Lkotlinx/html/TagConsumer;Lspace/kscience/dataforge/names/Name;Lspace/kscience/visionforge/VisionManager;Lspace/kscience/visionforge/Vision;Lspace/kscience/dataforge/meta/Meta;)Ljava/lang/Object; + public static synthetic fun addVision$default (Lspace/kscience/visionforge/html/VisionTagConsumer;Lkotlinx/html/TagConsumer;Lspace/kscience/dataforge/names/Name;Lspace/kscience/visionforge/VisionManager;Lspace/kscience/visionforge/Vision;Lspace/kscience/dataforge/meta/Meta;ILjava/lang/Object;)Ljava/lang/Object; public fun finalize ()Ljava/lang/Object; - public final fun getContext ()Lspace/kscience/dataforge/context/Context; + public fun getContext ()Lspace/kscience/dataforge/context/Context; + public final fun getVisionManager ()Lspace/kscience/visionforge/VisionManager; public fun onTagAttributeChange (Lkotlinx/html/Tag;Ljava/lang/String;Ljava/lang/String;)V public fun onTagComment (Ljava/lang/CharSequence;)V public fun onTagContent (Ljava/lang/CharSequence;)V public fun onTagContentEntity (Lkotlinx/html/Entities;)V public fun onTagContentUnsafe (Lkotlin/jvm/functions/Function1;)V public fun onTagEnd (Lkotlinx/html/Tag;)V - public fun onTagError (Lkotlinx/html/Tag;Ljava/lang/Throwable;)V public fun onTagEvent (Lkotlinx/html/Tag;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)V public fun onTagStart (Lkotlinx/html/Tag;)V protected fun processResult (Ljava/lang/Object;)V protected abstract fun renderVision (Lkotlinx/html/DIV;Lspace/kscience/visionforge/VisionManager;Lspace/kscience/dataforge/names/Name;Lspace/kscience/visionforge/Vision;Lspace/kscience/dataforge/meta/Meta;)V public fun resolveId (Lspace/kscience/dataforge/names/Name;)Ljava/lang/String; public final fun vision (Lkotlinx/html/TagConsumer;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Ljava/lang/Object; - public final fun vision (Lkotlinx/html/TagConsumer;Lspace/kscience/dataforge/names/Name;Lkotlin/jvm/functions/Function1;)Ljava/lang/Object; + public fun vision (Lkotlinx/html/TagConsumer;Lspace/kscience/dataforge/names/Name;Lkotlin/jvm/functions/Function1;)Ljava/lang/Object; + public fun vision (Lkotlinx/html/TagConsumer;Lspace/kscience/visionforge/Vision;Lspace/kscience/dataforge/names/Name;Lspace/kscience/dataforge/meta/Meta;)V public static synthetic fun vision$default (Lspace/kscience/visionforge/html/VisionTagConsumer;Lkotlinx/html/TagConsumer;Lspace/kscience/dataforge/names/Name;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Ljava/lang/Object; + public static synthetic fun vision$default (Lspace/kscience/visionforge/html/VisionTagConsumer;Lkotlinx/html/TagConsumer;Lspace/kscience/visionforge/Vision;Lspace/kscience/dataforge/names/Name;Lspace/kscience/dataforge/meta/Meta;ILjava/lang/Object;)V } public final class space/kscience/visionforge/html/VisionTagConsumer$Companion { @@ -806,7 +1092,8 @@ public abstract interface class space/kscience/visionforge/visitor/VisionVisitor public static final field Companion Lspace/kscience/visionforge/visitor/VisionVisitor$Companion; public fun skip (Lspace/kscience/dataforge/names/Name;Lspace/kscience/visionforge/Vision;)Z public abstract fun visit (Lspace/kscience/dataforge/names/Name;Lspace/kscience/visionforge/Vision;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public fun visitChildren (Lspace/kscience/dataforge/names/Name;Lspace/kscience/visionforge/VisionGroup;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public fun visitChildren (Lspace/kscience/dataforge/names/Name;Lspace/kscience/visionforge/Vision;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public static synthetic fun visitChildren$suspendImpl (Lspace/kscience/visionforge/visitor/VisionVisitor;Lspace/kscience/dataforge/names/Name;Lspace/kscience/visionforge/Vision;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; } public final class space/kscience/visionforge/visitor/VisionVisitor$Companion { diff --git a/visionforge-gdml/README.md b/visionforge-gdml/README.md index 135a369e..a6429697 100644 --- a/visionforge-gdml/README.md +++ b/visionforge-gdml/README.md @@ -6,19 +6,8 @@ ## Artifact: -The Maven coordinates of this project are `space.kscience:visionforge-gdml:0.2.0`. +The Maven coordinates of this project are `space.kscience:visionforge-gdml:0.3.0-rc`. -**Gradle Groovy:** -```groovy -repositories { - maven { url 'https://repo.kotlin.link' } - mavenCentral() -} - -dependencies { - implementation 'space.kscience:visionforge-gdml:0.2.0' -} -``` **Gradle Kotlin DSL:** ```kotlin repositories { @@ -27,6 +16,6 @@ repositories { } dependencies { - implementation("space.kscience:visionforge-gdml:0.2.0") + implementation("space.kscience:visionforge-gdml:0.3.0-rc") } ``` diff --git a/visionforge-gdml/api/visionforge-gdml.api b/visionforge-gdml/api/visionforge-gdml.api index 1a73d170..6922b868 100644 --- a/visionforge-gdml/api/visionforge-gdml.api +++ b/visionforge-gdml/api/visionforge-gdml.api @@ -14,19 +14,21 @@ public final class space/kscience/visionforge/gdml/GdmlLoaderKt { public final class space/kscience/visionforge/gdml/GdmlLoaderOptions { public static final field Companion Lspace/kscience/visionforge/gdml/GdmlLoaderOptions$Companion; public fun ()V - public final fun configure (Lkotlin/jvm/functions/Function4;)V public final fun getAUnit ()Lspace/kscience/gdml/AUnit; public final fun getConfigurePaint ()Lkotlin/jvm/functions/Function3; public final fun getConfigureSolid ()Lkotlin/jvm/functions/Function4; public final fun getLUnit ()Lspace/kscience/gdml/LUnit; + public final fun getLight ()Lspace/kscience/visionforge/solid/LightSource; public final fun getSolidAction ()Lkotlin/jvm/functions/Function1; public final fun getVolumeAction ()Lkotlin/jvm/functions/Function1; public final fun paint (Lkotlin/jvm/functions/Function3;)V public final fun registerAndUseStyle (Lspace/kscience/visionforge/solid/Solid;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)V public final fun setAUnit (Lspace/kscience/gdml/AUnit;)V public final fun setLUnit (Lspace/kscience/gdml/LUnit;)V + public final fun setLight (Lspace/kscience/visionforge/solid/LightSource;)V public final fun setSolidAction (Lkotlin/jvm/functions/Function1;)V public final fun setVolumeAction (Lkotlin/jvm/functions/Function1;)V + public final fun solids (Lkotlin/jvm/functions/Function4;)V public final fun transparent (Lspace/kscience/visionforge/solid/Solid;)V } @@ -34,6 +36,7 @@ public final class space/kscience/visionforge/gdml/GdmlLoaderOptions$Action : ja public static final field ADD Lspace/kscience/visionforge/gdml/GdmlLoaderOptions$Action; public static final field PROTOTYPE Lspace/kscience/visionforge/gdml/GdmlLoaderOptions$Action; public static final field REJECT Lspace/kscience/visionforge/gdml/GdmlLoaderOptions$Action; + public static fun getEntries ()Lkotlin/enums/EnumEntries; public static fun valueOf (Ljava/lang/String;)Lspace/kscience/visionforge/gdml/GdmlLoaderOptions$Action; public static fun values ()[Lspace/kscience/visionforge/gdml/GdmlLoaderOptions$Action; } diff --git a/visionforge-jupyter/README.md b/visionforge-jupyter/README.md index 433d3042..43df6bfd 100644 --- a/visionforge-jupyter/README.md +++ b/visionforge-jupyter/README.md @@ -1,4 +1,21 @@ -# Module jupyter +# Module visionforge-jupyter Common visionforge jupyter module +## Usage + +## Artifact: + +The Maven coordinates of this project are `space.kscience:visionforge-jupyter:0.3.0-rc`. + +**Gradle Kotlin DSL:** +```kotlin +repositories { + maven("https://repo.kotlin.link") + mavenCentral() +} + +dependencies { + implementation("space.kscience:visionforge-jupyter:0.3.0-rc") +} +``` diff --git a/visionforge-jupyter/api/visionforge-jupyter.api b/visionforge-jupyter/api/visionforge-jupyter.api new file mode 100644 index 00000000..019c5d4a --- /dev/null +++ b/visionforge-jupyter/api/visionforge-jupyter.api @@ -0,0 +1,54 @@ +public final class space/kscience/visionforge/jupyter/FormsKt { + public static final fun HtmlFormFragment (Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lspace/kscience/visionforge/jupyter/HtmlFormFragment; + public static synthetic fun HtmlFormFragment$default (Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lspace/kscience/visionforge/jupyter/HtmlFormFragment; + public static final fun form (Lspace/kscience/visionforge/jupyter/VisionForge;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lspace/kscience/visionforge/jupyter/HtmlFormFragment; + public static synthetic fun form$default (Lspace/kscience/visionforge/jupyter/VisionForge;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lspace/kscience/visionforge/jupyter/HtmlFormFragment; +} + +public final class space/kscience/visionforge/jupyter/HtmlFormFragment { + public final fun get (Ljava/lang/String;)Lspace/kscience/dataforge/meta/Meta; + public final fun getFormBody ()Lspace/kscience/visionforge/html/HtmlFragment; + public final fun getValues ()Lspace/kscience/dataforge/meta/Meta; + public final fun getVision ()Lspace/kscience/visionforge/html/VisionOfHtmlForm; +} + +public final class space/kscience/visionforge/jupyter/VisionForge : kotlinx/coroutines/CoroutineScope, space/kscience/dataforge/context/ContextAware { + public fun (Lspace/kscience/visionforge/VisionManager;Lorg/jetbrains/kotlinx/jupyter/api/Notebook;Lspace/kscience/dataforge/meta/Meta;)V + public synthetic fun (Lspace/kscience/visionforge/VisionManager;Lorg/jetbrains/kotlinx/jupyter/api/Notebook;Lspace/kscience/dataforge/meta/Meta;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun form (Lkotlin/jvm/functions/Function1;)Lspace/kscience/visionforge/jupyter/HtmlFormFragment; + public final fun getConfiguration ()Lspace/kscience/dataforge/meta/ObservableMutableMeta; + public fun getContext ()Lspace/kscience/dataforge/context/Context; + public fun getCoroutineContext ()Lkotlin/coroutines/CoroutineContext; + public final fun getNotebook ()Lorg/jetbrains/kotlinx/jupyter/api/Notebook; + public final fun getProperty (Ljava/lang/String;)Lspace/kscience/dataforge/meta/TypedMeta; + public final fun getVisionManager ()Lspace/kscience/visionforge/VisionManager; + public final fun isServerRunning ()Z + public final fun produceHtml (Ljava/lang/Boolean;Lspace/kscience/visionforge/html/HtmlVisionFragment;)Lorg/jetbrains/kotlinx/jupyter/api/MimeTypedResult; + public static synthetic fun produceHtml$default (Lspace/kscience/visionforge/jupyter/VisionForge;Ljava/lang/Boolean;Lspace/kscience/visionforge/html/HtmlVisionFragment;ILjava/lang/Object;)Lorg/jetbrains/kotlinx/jupyter/api/MimeTypedResult; +} + +public final class space/kscience/visionforge/jupyter/VisionForgeCompatibility : java/lang/Enum { + public static final field DATALORE Lspace/kscience/visionforge/jupyter/VisionForgeCompatibility; + public static final field IDEA Lspace/kscience/visionforge/jupyter/VisionForgeCompatibility; + public static final field JUPYTER Lspace/kscience/visionforge/jupyter/VisionForgeCompatibility; + public static final field JUPYTER_LAB Lspace/kscience/visionforge/jupyter/VisionForgeCompatibility; + public static fun getEntries ()Lkotlin/enums/EnumEntries; + public static fun valueOf (Ljava/lang/String;)Lspace/kscience/visionforge/jupyter/VisionForgeCompatibility; + public static fun values ()[Lspace/kscience/visionforge/jupyter/VisionForgeCompatibility; +} + +public abstract class space/kscience/visionforge/jupyter/VisionForgeIntegration : org/jetbrains/kotlinx/jupyter/api/libraries/JupyterIntegration, space/kscience/dataforge/context/ContextAware { + public fun (Lspace/kscience/visionforge/VisionManager;)V + protected abstract fun afterLoaded (Lorg/jetbrains/kotlinx/jupyter/api/libraries/JupyterIntegration$Builder;Lspace/kscience/visionforge/jupyter/VisionForge;)V + public fun getContext ()Lspace/kscience/dataforge/context/Context; + public final fun getVisionManager ()Lspace/kscience/visionforge/VisionManager; + public final fun onLoaded (Lorg/jetbrains/kotlinx/jupyter/api/libraries/JupyterIntegration$Builder;)V +} + +public final class space/kscience/visionforge/jupyter/VisionForgeIntegrationKt { + public static final fun fragment (Lspace/kscience/visionforge/jupyter/VisionForge;Lkotlin/jvm/functions/Function1;)Lorg/jetbrains/kotlinx/jupyter/api/MimeTypedResult; + public static final fun html (Lspace/kscience/visionforge/jupyter/VisionForge;Lkotlin/jvm/functions/Function1;)Lorg/jetbrains/kotlinx/jupyter/api/MimeTypedResult; + public static final fun page (Lspace/kscience/visionforge/jupyter/VisionForge;Ljava/util/Map;Lkotlin/jvm/functions/Function1;)Lspace/kscience/visionforge/html/VisionPage; + public static synthetic fun page$default (Lspace/kscience/visionforge/jupyter/VisionForge;Ljava/util/Map;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lspace/kscience/visionforge/html/VisionPage; +} + diff --git a/visionforge-jupyter/visionforge-jupyter-common/api/visionforge-jupyter-common.api b/visionforge-jupyter/visionforge-jupyter-common/api/visionforge-jupyter-common.api new file mode 100644 index 00000000..7e1cbb84 --- /dev/null +++ b/visionforge-jupyter/visionforge-jupyter-common/api/visionforge-jupyter-common.api @@ -0,0 +1,8 @@ +public final class space/kscience/visionforge/jupyter/JupyterCommonIntegration : space/kscience/visionforge/jupyter/VisionForgeIntegration { + public static final field Companion Lspace/kscience/visionforge/jupyter/JupyterCommonIntegration$Companion; + public fun ()V +} + +public final class space/kscience/visionforge/jupyter/JupyterCommonIntegration$Companion { +} + diff --git a/visionforge-markdown/README.md b/visionforge-markdown/README.md index f43c742b..5e35ccf7 100644 --- a/visionforge-markdown/README.md +++ b/visionforge-markdown/README.md @@ -6,19 +6,8 @@ ## Artifact: -The Maven coordinates of this project are `space.kscience:visionforge-markdown:0.2.0`. +The Maven coordinates of this project are `space.kscience:visionforge-markdown:0.3.0-rc`. -**Gradle Groovy:** -```groovy -repositories { - maven { url 'https://repo.kotlin.link' } - mavenCentral() -} - -dependencies { - implementation 'space.kscience:visionforge-markdown:0.2.0' -} -``` **Gradle Kotlin DSL:** ```kotlin repositories { @@ -27,6 +16,6 @@ repositories { } dependencies { - implementation("space.kscience:visionforge-markdown:0.2.0") + implementation("space.kscience:visionforge-markdown:0.3.0-rc") } ``` diff --git a/visionforge-markdown/api/visionforge-markdown.api b/visionforge-markdown/api/visionforge-markdown.api index 08028532..f8e472cf 100644 --- a/visionforge-markdown/api/visionforge-markdown.api +++ b/visionforge-markdown/api/visionforge-markdown.api @@ -3,23 +3,36 @@ public final class space/kscience/visionforge/markup/MarkdownKt { public static synthetic fun markdown$default (Lkotlinx/html/TagConsumer;Lorg/intellij/markdown/flavours/MarkdownFlavourDescriptor;Lkotlin/jvm/functions/Function0;ILjava/lang/Object;)Ljava/lang/Object; } -public final class space/kscience/visionforge/markup/VisionOfMarkup : space/kscience/visionforge/VisionBase { +public final class space/kscience/visionforge/markup/MarkupPlugin : space/kscience/visionforge/VisionPlugin { + public static final field Companion Lspace/kscience/visionforge/markup/MarkupPlugin$Companion; + public fun ()V + public fun getTag ()Lspace/kscience/dataforge/context/PluginTag; +} + +public final class space/kscience/visionforge/markup/MarkupPlugin$Companion : space/kscience/dataforge/context/PluginFactory { + public synthetic fun build (Lspace/kscience/dataforge/context/Context;Lspace/kscience/dataforge/meta/Meta;)Ljava/lang/Object; + public fun build (Lspace/kscience/dataforge/context/Context;Lspace/kscience/dataforge/meta/Meta;)Lspace/kscience/visionforge/markup/MarkupPlugin; + public fun getTag ()Lspace/kscience/dataforge/context/PluginTag; +} + +public final class space/kscience/visionforge/markup/MarkupPluginKt { + public static final fun content (Lspace/kscience/visionforge/markup/VisionOfMarkup;Ljava/lang/String;)V +} + +public final class space/kscience/visionforge/markup/VisionOfMarkup : space/kscience/visionforge/AbstractVision { public static final field COMMONMARK_FORMAT Ljava/lang/String; public static final field Companion Lspace/kscience/visionforge/markup/VisionOfMarkup$Companion; public static final field GFM_FORMAT Ljava/lang/String; public fun ()V - public synthetic fun (ILspace/kscience/dataforge/meta/MutableMeta;Ljava/lang/String;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V public fun (Ljava/lang/String;)V public synthetic fun (Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V public final fun getContent ()Ljava/lang/String; public final fun getFormat ()Ljava/lang/String; public final fun setContent (Ljava/lang/String;)V - public static final fun write$Self (Lspace/kscience/visionforge/markup/VisionOfMarkup;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V } public final class space/kscience/visionforge/markup/VisionOfMarkup$$serializer : kotlinx/serialization/internal/GeneratedSerializer { public static final field INSTANCE Lspace/kscience/visionforge/markup/VisionOfMarkup$$serializer; - public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; public fun childSerializers ()[Lkotlinx/serialization/KSerializer; public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lspace/kscience/visionforge/markup/VisionOfMarkup; @@ -36,5 +49,7 @@ public final class space/kscience/visionforge/markup/VisionOfMarkup$Companion { public final class space/kscience/visionforge/markup/VisionOfMarkupKt { public static final fun content (Lspace/kscience/visionforge/markup/VisionOfMarkup;Lkotlin/jvm/functions/Function0;)V + public static final fun markdown (Lspace/kscience/visionforge/html/VisionOutput;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lspace/kscience/visionforge/markup/VisionOfMarkup; + public static synthetic fun markdown$default (Lspace/kscience/visionforge/html/VisionOutput;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lspace/kscience/visionforge/markup/VisionOfMarkup; } diff --git a/visionforge-plotly/README.md b/visionforge-plotly/README.md index f8a03891..83f3b06b 100644 --- a/visionforge-plotly/README.md +++ b/visionforge-plotly/README.md @@ -6,19 +6,8 @@ ## Artifact: -The Maven coordinates of this project are `space.kscience:visionforge-plotly:0.2.0`. +The Maven coordinates of this project are `space.kscience:visionforge-plotly:0.3.0-rc`. -**Gradle Groovy:** -```groovy -repositories { - maven { url 'https://repo.kotlin.link' } - mavenCentral() -} - -dependencies { - implementation 'space.kscience:visionforge-plotly:0.2.0' -} -``` **Gradle Kotlin DSL:** ```kotlin repositories { @@ -27,6 +16,6 @@ repositories { } dependencies { - implementation("space.kscience:visionforge-plotly:0.2.0") + implementation("space.kscience:visionforge-plotly:0.3.0-rc") } ``` diff --git a/visionforge-plotly/api/visionforge-plotly.api b/visionforge-plotly/api/visionforge-plotly.api index 273f3123..349fe8d5 100644 --- a/visionforge-plotly/api/visionforge-plotly.api +++ b/visionforge-plotly/api/visionforge-plotly.api @@ -5,23 +5,24 @@ public final class space/kscience/visionforge/plotly/PlotlyPlugin : space/kscien } public final class space/kscience/visionforge/plotly/PlotlyPlugin$Companion : space/kscience/dataforge/context/PluginFactory { + public synthetic fun build (Lspace/kscience/dataforge/context/Context;Lspace/kscience/dataforge/meta/Meta;)Ljava/lang/Object; + public fun build (Lspace/kscience/dataforge/context/Context;Lspace/kscience/dataforge/meta/Meta;)Lspace/kscience/visionforge/plotly/PlotlyPlugin; public fun getTag ()Lspace/kscience/dataforge/context/PluginTag; - public fun getType ()Lkotlin/reflect/KClass; - public synthetic fun invoke (Lspace/kscience/dataforge/meta/Meta;Lspace/kscience/dataforge/context/Context;)Ljava/lang/Object; - public fun invoke (Lspace/kscience/dataforge/meta/Meta;Lspace/kscience/dataforge/context/Context;)Lspace/kscience/visionforge/plotly/PlotlyPlugin; } -public final class space/kscience/visionforge/plotly/VisionOfPlotly : space/kscience/visionforge/VisionBase { +public final class space/kscience/visionforge/plotly/VisionOfPlotly : space/kscience/visionforge/Vision { public static final field Companion Lspace/kscience/visionforge/plotly/VisionOfPlotly$Companion; - public synthetic fun (ILspace/kscience/dataforge/meta/MutableMeta;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V public fun (Lspace/kscience/plotly/Plot;)V + public fun getDescriptor ()Lspace/kscience/dataforge/meta/descriptors/MetaDescriptor; + public final fun getMeta ()Lspace/kscience/dataforge/meta/MutableMeta; + public fun getParent ()Lspace/kscience/visionforge/Vision; public final fun getPlot ()Lspace/kscience/plotly/Plot; - public static final fun write$Self (Lspace/kscience/visionforge/plotly/VisionOfPlotly;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V + public fun getProperties ()Lspace/kscience/visionforge/MutableVisionProperties; + public fun setParent (Lspace/kscience/visionforge/Vision;)V } public final class space/kscience/visionforge/plotly/VisionOfPlotly$$serializer : kotlinx/serialization/internal/GeneratedSerializer { public static final field INSTANCE Lspace/kscience/visionforge/plotly/VisionOfPlotly$$serializer; - public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; public fun childSerializers ()[Lkotlinx/serialization/KSerializer; public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lspace/kscience/visionforge/plotly/VisionOfPlotly; @@ -37,6 +38,7 @@ public final class space/kscience/visionforge/plotly/VisionOfPlotly$Companion { public final class space/kscience/visionforge/plotly/VisionOfPlotlyKt { public static final fun asVision (Lspace/kscience/plotly/Plot;)Lspace/kscience/visionforge/plotly/VisionOfPlotly; - public static final fun plotly (Lspace/kscience/visionforge/html/VisionOutput;Lkotlin/jvm/functions/Function1;)Lspace/kscience/visionforge/plotly/VisionOfPlotly; + public static final fun plotly (Lspace/kscience/visionforge/html/VisionOutput;Lspace/kscience/plotly/PlotlyConfig;Lkotlin/jvm/functions/Function1;)Lspace/kscience/visionforge/plotly/VisionOfPlotly; + public static synthetic fun plotly$default (Lspace/kscience/visionforge/html/VisionOutput;Lspace/kscience/plotly/PlotlyConfig;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lspace/kscience/visionforge/plotly/VisionOfPlotly; } diff --git a/visionforge-server/README.md b/visionforge-server/README.md index 0ac4c198..c51b38ae 100644 --- a/visionforge-server/README.md +++ b/visionforge-server/README.md @@ -6,19 +6,8 @@ ## Artifact: -The Maven coordinates of this project are `space.kscience:visionforge-server:0.2.0`. +The Maven coordinates of this project are `space.kscience:visionforge-server:0.3.0-rc`. -**Gradle Groovy:** -```groovy -repositories { - maven { url 'https://repo.kotlin.link' } - mavenCentral() -} - -dependencies { - implementation 'space.kscience:visionforge-server:0.2.0' -} -``` **Gradle Kotlin DSL:** ```kotlin repositories { @@ -27,6 +16,6 @@ repositories { } dependencies { - implementation("space.kscience:visionforge-server:0.2.0") + implementation("space.kscience:visionforge-server:0.3.0-rc") } ``` diff --git a/visionforge-server/api/visionforge-server.api b/visionforge-server/api/visionforge-server.api index 3446765b..5d52283f 100644 --- a/visionforge-server/api/visionforge-server.api +++ b/visionforge-server/api/visionforge-server.api @@ -1,36 +1,48 @@ -public final class space/kscience/visionforge/server/VisionServer : space/kscience/dataforge/meta/Configurable { - public static final field Companion Lspace/kscience/visionforge/server/VisionServer$Companion; +public final class space/kscience/visionforge/server/ApplicationExtensionsKt { + public static final fun EngineConnectorConfig (Ljava/lang/String;I)Lio/ktor/server/engine/EngineConnectorConfig; + public static final fun close (Lio/ktor/server/engine/ApplicationEngine;)V + public static final fun openInBrowser (Lio/ktor/server/engine/ApplicationEngine;)V + public static final fun require (Lio/ktor/util/pipeline/Pipeline;Lio/ktor/server/application/Plugin;)Ljava/lang/Object; +} + +public final class space/kscience/visionforge/server/VisionRoute : space/kscience/dataforge/context/ContextAware, space/kscience/dataforge/meta/Configurable { + public static final field Companion Lspace/kscience/visionforge/server/VisionRoute$Companion; public static final field DEFAULT_PAGE Ljava/lang/String; public static final field DEFAULT_PORT I - public final fun getApplication ()Lio/ktor/application/Application; - public final fun getCacheFragments ()Z - public final fun getDataEmbed ()Z - public final fun getDataFetch ()Z - public final fun getDataUpdate ()Z + public fun (Ljava/lang/String;Lspace/kscience/visionforge/VisionManager;Lspace/kscience/dataforge/meta/ObservableMutableMeta;)V + public synthetic fun (Ljava/lang/String;Lspace/kscience/visionforge/VisionManager;Lspace/kscience/dataforge/meta/ObservableMutableMeta;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public fun getContext ()Lspace/kscience/dataforge/context/Context; + public final fun getDataMode ()Lspace/kscience/visionforge/server/VisionRoute$Mode; public synthetic fun getMeta ()Lspace/kscience/dataforge/meta/MutableMeta; public fun getMeta ()Lspace/kscience/dataforge/meta/ObservableMutableMeta; + public final fun getRoute ()Ljava/lang/String; public final fun getUpdateInterval ()J - public final fun page (Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)V - public static synthetic fun page$default (Lspace/kscience/visionforge/server/VisionServer;Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)V - public final fun serveVisions (Ljava/lang/String;Ljava/util/Map;)V - public final fun serveVisionsFromFragment (Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Ljava/lang/String; - public final fun setCacheFragments (Z)V - public final fun setDataEmbed (Z)V - public final fun setDataFetch (Z)V - public final fun setDataUpdate (Z)V + public final fun getVisionManager ()Lspace/kscience/visionforge/VisionManager; + public final fun setDataMode (Lspace/kscience/visionforge/server/VisionRoute$Mode;)V public final fun setUpdateInterval (J)V } -public final class space/kscience/visionforge/server/VisionServer$Companion { +public final class space/kscience/visionforge/server/VisionRoute$Companion { public final fun getUPDATE_INTERVAL_KEY ()Lspace/kscience/dataforge/names/Name; } -public final class space/kscience/visionforge/server/VisionServerKt { - public static final fun close (Lio/ktor/server/engine/ApplicationEngine;)V - public static final fun openInBrowser (Lio/ktor/server/engine/ApplicationEngine;)V - public static final fun serve (Lspace/kscience/visionforge/VisionManager;Ljava/lang/String;ILkotlin/jvm/functions/Function1;)Lio/ktor/server/engine/ApplicationEngine; - public static synthetic fun serve$default (Lspace/kscience/visionforge/VisionManager;Ljava/lang/String;ILkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lio/ktor/server/engine/ApplicationEngine; - public static final fun visionServer (Lio/ktor/application/Application;Lspace/kscience/visionforge/VisionManager;Lio/ktor/http/Url;Ljava/lang/String;)Lspace/kscience/visionforge/server/VisionServer; - public static synthetic fun visionServer$default (Lio/ktor/application/Application;Lspace/kscience/visionforge/VisionManager;Lio/ktor/http/Url;Ljava/lang/String;ILjava/lang/Object;)Lspace/kscience/visionforge/server/VisionServer; +public final class space/kscience/visionforge/server/VisionRoute$Mode : java/lang/Enum { + public static final field EMBED Lspace/kscience/visionforge/server/VisionRoute$Mode; + public static final field FETCH Lspace/kscience/visionforge/server/VisionRoute$Mode; + public static final field UPDATE Lspace/kscience/visionforge/server/VisionRoute$Mode; + public static fun getEntries ()Lkotlin/enums/EnumEntries; + public static fun valueOf (Ljava/lang/String;)Lspace/kscience/visionforge/server/VisionRoute$Mode; + public static fun values ()[Lspace/kscience/visionforge/server/VisionRoute$Mode; +} + +public final class space/kscience/visionforge/server/VisionServerKt { + public static final fun serveVisionData (Lio/ktor/server/application/Application;Lspace/kscience/visionforge/server/VisionRoute;Ljava/util/Map;)V + public static final fun serveVisionData (Lio/ktor/server/application/Application;Lspace/kscience/visionforge/server/VisionRoute;Lkotlin/jvm/functions/Function1;)V + public static final fun visionPage (Lio/ktor/server/application/Application;Ljava/lang/String;Lspace/kscience/visionforge/server/VisionRoute;Ljava/util/Collection;Lio/ktor/server/engine/EngineConnectorConfig;Lspace/kscience/visionforge/html/HtmlVisionFragment;)V + public static final fun visionPage (Lio/ktor/server/application/Application;Lspace/kscience/visionforge/VisionManager;[Lspace/kscience/visionforge/html/HtmlFragment;Ljava/lang/String;Lio/ktor/server/engine/EngineConnectorConfig;Lkotlin/jvm/functions/Function1;Lspace/kscience/visionforge/html/HtmlVisionFragment;)V + public static final fun visionPage (Lio/ktor/server/application/Application;Lspace/kscience/visionforge/html/VisionPage;Ljava/lang/String;Lio/ktor/server/engine/EngineConnectorConfig;Lkotlin/jvm/functions/Function1;)V + public static synthetic fun visionPage$default (Lio/ktor/server/application/Application;Ljava/lang/String;Lspace/kscience/visionforge/server/VisionRoute;Ljava/util/Collection;Lio/ktor/server/engine/EngineConnectorConfig;Lspace/kscience/visionforge/html/HtmlVisionFragment;ILjava/lang/Object;)V + public static synthetic fun visionPage$default (Lio/ktor/server/application/Application;Lspace/kscience/visionforge/VisionManager;[Lspace/kscience/visionforge/html/HtmlFragment;Ljava/lang/String;Lio/ktor/server/engine/EngineConnectorConfig;Lkotlin/jvm/functions/Function1;Lspace/kscience/visionforge/html/HtmlVisionFragment;ILjava/lang/Object;)V + public static synthetic fun visionPage$default (Lio/ktor/server/application/Application;Lspace/kscience/visionforge/html/VisionPage;Ljava/lang/String;Lio/ktor/server/engine/EngineConnectorConfig;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)V } diff --git a/visionforge-server/build.gradle.kts b/visionforge-server/build.gradle.kts index 59034dd1..650b942a 100644 --- a/visionforge-server/build.gradle.kts +++ b/visionforge-server/build.gradle.kts @@ -1,10 +1,11 @@ plugins { - id("space.kscience.gradle.jvm") + id("space.kscience.gradle.mpp") } kscience{ + jvm() useKtor() - dependencies { + jvmMain { api(projects.visionforgeCore) api("io.ktor:ktor-server-host-common") api("io.ktor:ktor-server-html-builder") diff --git a/visionforge-server/src/main/kotlin/space/kscience/visionforge/server/VisionServer.kt b/visionforge-server/src/jvmMain/kotlin/space/kscience/visionforge/server/VisionServer.kt similarity index 100% rename from visionforge-server/src/main/kotlin/space/kscience/visionforge/server/VisionServer.kt rename to visionforge-server/src/jvmMain/kotlin/space/kscience/visionforge/server/VisionServer.kt diff --git a/visionforge-server/src/main/kotlin/space/kscience/visionforge/server/applicationExtensions.kt b/visionforge-server/src/jvmMain/kotlin/space/kscience/visionforge/server/applicationExtensions.kt similarity index 100% rename from visionforge-server/src/main/kotlin/space/kscience/visionforge/server/applicationExtensions.kt rename to visionforge-server/src/jvmMain/kotlin/space/kscience/visionforge/server/applicationExtensions.kt diff --git a/visionforge-solid/README.md b/visionforge-solid/README.md index cbf4073b..331c8485 100644 --- a/visionforge-solid/README.md +++ b/visionforge-solid/README.md @@ -6,19 +6,8 @@ ## Artifact: -The Maven coordinates of this project are `space.kscience:visionforge-solid:0.2.0`. +The Maven coordinates of this project are `space.kscience:visionforge-solid:0.3.0-rc`. -**Gradle Groovy:** -```groovy -repositories { - maven { url 'https://repo.kotlin.link' } - mavenCentral() -} - -dependencies { - implementation 'space.kscience:visionforge-solid:0.2.0' -} -``` **Gradle Kotlin DSL:** ```kotlin repositories { @@ -27,6 +16,6 @@ repositories { } dependencies { - implementation("space.kscience:visionforge-solid:0.2.0") + implementation("space.kscience:visionforge-solid:0.3.0-rc") } ``` diff --git a/visionforge-solid/api/visionforge-solid.api b/visionforge-solid/api/visionforge-solid.api index c763e3c8..a3dc7838 100644 --- a/visionforge-solid/api/visionforge-solid.api +++ b/visionforge-solid/api/visionforge-solid.api @@ -1,24 +1,63 @@ +public final class space/kscience/visionforge/solid/AmbientLightSource : space/kscience/visionforge/solid/LightSource { + public static final field Companion Lspace/kscience/visionforge/solid/AmbientLightSource$Companion; + public fun ()V +} + +public final class space/kscience/visionforge/solid/AmbientLightSource$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lspace/kscience/visionforge/solid/AmbientLightSource$$serializer; + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lspace/kscience/visionforge/solid/AmbientLightSource; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lspace/kscience/visionforge/solid/AmbientLightSource;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class space/kscience/visionforge/solid/AmbientLightSource$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class space/kscience/visionforge/solid/AxesSolid : space/kscience/visionforge/solid/MiscSolid { + public static final field AXES_NAME Ljava/lang/String; + public static final field Companion Lspace/kscience/visionforge/solid/AxesSolid$Companion; + public fun (D)V + public final fun getSize ()D +} + +public final class space/kscience/visionforge/solid/AxesSolid$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lspace/kscience/visionforge/solid/AxesSolid$$serializer; + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lspace/kscience/visionforge/solid/AxesSolid; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lspace/kscience/visionforge/solid/AxesSolid;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class space/kscience/visionforge/solid/AxesSolid$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + public final class space/kscience/visionforge/solid/Box : space/kscience/visionforge/solid/SolidBase, space/kscience/visionforge/solid/Hexagon { public static final field Companion Lspace/kscience/visionforge/solid/Box$Companion; public fun (FFF)V - public synthetic fun (ILspace/kscience/dataforge/meta/MutableMeta;FFFLkotlinx/serialization/internal/SerializationConstructorMarker;)V - public fun getNode1 ()Lspace/kscience/visionforge/solid/Point3D; - public fun getNode2 ()Lspace/kscience/visionforge/solid/Point3D; - public fun getNode3 ()Lspace/kscience/visionforge/solid/Point3D; - public fun getNode4 ()Lspace/kscience/visionforge/solid/Point3D; - public fun getNode5 ()Lspace/kscience/visionforge/solid/Point3D; - public fun getNode6 ()Lspace/kscience/visionforge/solid/Point3D; - public fun getNode7 ()Lspace/kscience/visionforge/solid/Point3D; - public fun getNode8 ()Lspace/kscience/visionforge/solid/Point3D; + public fun getNode1 ()Lspace/kscience/visionforge/solid/Float32Vector3D; + public fun getNode2 ()Lspace/kscience/visionforge/solid/Float32Vector3D; + public fun getNode3 ()Lspace/kscience/visionforge/solid/Float32Vector3D; + public fun getNode4 ()Lspace/kscience/visionforge/solid/Float32Vector3D; + public fun getNode5 ()Lspace/kscience/visionforge/solid/Float32Vector3D; + public fun getNode6 ()Lspace/kscience/visionforge/solid/Float32Vector3D; + public fun getNode7 ()Lspace/kscience/visionforge/solid/Float32Vector3D; + public fun getNode8 ()Lspace/kscience/visionforge/solid/Float32Vector3D; public final fun getXSize ()F public final fun getYSize ()F public final fun getZSize ()F - public static final fun write$Self (Lspace/kscience/visionforge/solid/Box;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V } public final class space/kscience/visionforge/solid/Box$$serializer : kotlinx/serialization/internal/GeneratedSerializer { public static final field INSTANCE Lspace/kscience/visionforge/solid/Box$$serializer; - public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; public fun childSerializers ()[Lkotlinx/serialization/KSerializer; public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lspace/kscience/visionforge/solid/Box; @@ -32,16 +71,18 @@ public final class space/kscience/visionforge/solid/Box$Companion { public final fun serializer ()Lkotlinx/serialization/KSerializer; } -public final class space/kscience/visionforge/solid/ColorAccessor : space/kscience/dataforge/values/MutableValueProvider { - public fun (Lspace/kscience/dataforge/values/MutableValueProvider;Lspace/kscience/dataforge/names/Name;)V - public final fun getValue ()Lspace/kscience/dataforge/values/Value; - public fun getValue (Lspace/kscience/dataforge/names/Name;)Lspace/kscience/dataforge/values/Value; - public fun setValue (Lspace/kscience/dataforge/names/Name;Lspace/kscience/dataforge/values/Value;)V - public final fun setValue (Lspace/kscience/dataforge/values/Value;)V +public final class space/kscience/visionforge/solid/ColorAccessor : space/kscience/dataforge/meta/MutableValueProvider { + public fun (Lspace/kscience/dataforge/meta/MutableValueProvider;Lspace/kscience/dataforge/names/Name;)V + public final fun getValue ()Lspace/kscience/dataforge/meta/Value; + public fun getValue (Lspace/kscience/dataforge/names/Name;)Lspace/kscience/dataforge/meta/Value; + public final fun setValue (Lspace/kscience/dataforge/meta/Value;)V + public fun setValue (Lspace/kscience/dataforge/names/Name;Lspace/kscience/dataforge/meta/Value;)V } public final class space/kscience/visionforge/solid/ColorAccessorKt { public static final fun clear (Lspace/kscience/visionforge/solid/ColorAccessor;)V + public static final fun colorProperty (Lspace/kscience/visionforge/Vision;Lspace/kscience/dataforge/names/Name;)Lkotlin/properties/ReadOnlyProperty; + public static synthetic fun colorProperty$default (Lspace/kscience/visionforge/Vision;Lspace/kscience/dataforge/names/Name;ILjava/lang/Object;)Lkotlin/properties/ReadOnlyProperty; public static final fun getString (Lspace/kscience/visionforge/solid/ColorAccessor;)Ljava/lang/String; public static final fun invoke (Lspace/kscience/visionforge/solid/ColorAccessor;I)V public static final fun invoke (Lspace/kscience/visionforge/solid/ColorAccessor;Ljava/lang/String;)V @@ -49,19 +90,16 @@ public final class space/kscience/visionforge/solid/ColorAccessorKt { public static final fun setString (Lspace/kscience/visionforge/solid/ColorAccessor;Ljava/lang/String;)V } -public final class space/kscience/visionforge/solid/Composite : space/kscience/visionforge/solid/SolidBase, space/kscience/visionforge/VisionPropertyContainer { +public final class space/kscience/visionforge/solid/Composite : space/kscience/visionforge/solid/SolidBase { public static final field Companion Lspace/kscience/visionforge/solid/Composite$Companion; - public synthetic fun (ILspace/kscience/dataforge/meta/MutableMeta;Lspace/kscience/visionforge/solid/CompositeType;Lspace/kscience/visionforge/solid/Solid;Lspace/kscience/visionforge/solid/Solid;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V public fun (Lspace/kscience/visionforge/solid/CompositeType;Lspace/kscience/visionforge/solid/Solid;Lspace/kscience/visionforge/solid/Solid;)V public final fun getCompositeType ()Lspace/kscience/visionforge/solid/CompositeType; public final fun getFirst ()Lspace/kscience/visionforge/solid/Solid; public final fun getSecond ()Lspace/kscience/visionforge/solid/Solid; - public static final fun write$Self (Lspace/kscience/visionforge/solid/Composite;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V } public final class space/kscience/visionforge/solid/Composite$$serializer : kotlinx/serialization/internal/GeneratedSerializer { public static final field INSTANCE Lspace/kscience/visionforge/solid/Composite$$serializer; - public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; public fun childSerializers ()[Lkotlinx/serialization/KSerializer; public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lspace/kscience/visionforge/solid/Composite; @@ -76,16 +114,16 @@ public final class space/kscience/visionforge/solid/Composite$Companion { } public final class space/kscience/visionforge/solid/CompositeKt { - public static final fun composite (Lspace/kscience/visionforge/VisionContainerBuilder;Lspace/kscience/visionforge/solid/CompositeType;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lspace/kscience/visionforge/solid/Composite; - public static synthetic fun composite$default (Lspace/kscience/visionforge/VisionContainerBuilder;Lspace/kscience/visionforge/solid/CompositeType;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lspace/kscience/visionforge/solid/Composite; - public static final fun intersect (Lspace/kscience/visionforge/VisionContainerBuilder;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lspace/kscience/visionforge/solid/Composite; - public static synthetic fun intersect$default (Lspace/kscience/visionforge/VisionContainerBuilder;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lspace/kscience/visionforge/solid/Composite; + public static final fun composite (Lspace/kscience/visionforge/MutableVisionContainer;Lspace/kscience/visionforge/solid/CompositeType;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lspace/kscience/visionforge/solid/Composite; + public static synthetic fun composite$default (Lspace/kscience/visionforge/MutableVisionContainer;Lspace/kscience/visionforge/solid/CompositeType;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lspace/kscience/visionforge/solid/Composite; + public static final fun intersect (Lspace/kscience/visionforge/MutableVisionContainer;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lspace/kscience/visionforge/solid/Composite; + public static synthetic fun intersect$default (Lspace/kscience/visionforge/MutableVisionContainer;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lspace/kscience/visionforge/solid/Composite; public static final fun smartComposite (Lspace/kscience/visionforge/solid/SolidGroup;Lspace/kscience/visionforge/solid/CompositeType;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lspace/kscience/visionforge/solid/Solid; public static synthetic fun smartComposite$default (Lspace/kscience/visionforge/solid/SolidGroup;Lspace/kscience/visionforge/solid/CompositeType;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lspace/kscience/visionforge/solid/Solid; - public static final fun subtract (Lspace/kscience/visionforge/VisionContainerBuilder;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lspace/kscience/visionforge/solid/Composite; - public static synthetic fun subtract$default (Lspace/kscience/visionforge/VisionContainerBuilder;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lspace/kscience/visionforge/solid/Composite; - public static final fun union (Lspace/kscience/visionforge/VisionContainerBuilder;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lspace/kscience/visionforge/solid/Composite; - public static synthetic fun union$default (Lspace/kscience/visionforge/VisionContainerBuilder;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lspace/kscience/visionforge/solid/Composite; + public static final fun subtract (Lspace/kscience/visionforge/MutableVisionContainer;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lspace/kscience/visionforge/solid/Composite; + public static synthetic fun subtract$default (Lspace/kscience/visionforge/MutableVisionContainer;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lspace/kscience/visionforge/solid/Composite; + public static final fun union (Lspace/kscience/visionforge/MutableVisionContainer;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lspace/kscience/visionforge/solid/Composite; + public static synthetic fun union$default (Lspace/kscience/visionforge/MutableVisionContainer;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lspace/kscience/visionforge/solid/Composite; } public final class space/kscience/visionforge/solid/CompositeType : java/lang/Enum { @@ -93,6 +131,7 @@ public final class space/kscience/visionforge/solid/CompositeType : java/lang/En public static final field INTERSECT Lspace/kscience/visionforge/solid/CompositeType; public static final field SUBTRACT Lspace/kscience/visionforge/solid/CompositeType; public static final field UNION Lspace/kscience/visionforge/solid/CompositeType; + public static fun getEntries ()Lkotlin/enums/EnumEntries; public static fun valueOf (Ljava/lang/String;)Lspace/kscience/visionforge/solid/CompositeType; public static fun values ()[Lspace/kscience/visionforge/solid/CompositeType; } @@ -101,19 +140,16 @@ public final class space/kscience/visionforge/solid/ConeSegment : space/kscience public static final field Companion Lspace/kscience/visionforge/solid/ConeSegment$Companion; public fun (FFFFF)V public synthetic fun (FFFFFILkotlin/jvm/internal/DefaultConstructorMarker;)V - public synthetic fun (ILspace/kscience/dataforge/meta/MutableMeta;FFFFFLkotlinx/serialization/internal/SerializationConstructorMarker;)V - public final fun getAngle ()F public final fun getBottomRadius ()F public final fun getHeight ()F - public final fun getStartAngle ()F + public final fun getPhi ()F + public final fun getPhiStart ()F public final fun getTopRadius ()F public fun toGeometry (Lspace/kscience/visionforge/solid/GeometryBuilder;)V - public static final fun write$Self (Lspace/kscience/visionforge/solid/ConeSegment;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V } public final class space/kscience/visionforge/solid/ConeSegment$$serializer : kotlinx/serialization/internal/GeneratedSerializer { public static final field INSTANCE Lspace/kscience/visionforge/solid/ConeSegment$$serializer; - public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; public fun childSerializers ()[Lkotlinx/serialization/KSerializer; public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lspace/kscience/visionforge/solid/ConeSegment; @@ -128,31 +164,28 @@ public final class space/kscience/visionforge/solid/ConeSegment$Companion { } public final class space/kscience/visionforge/solid/ConeSegmentKt { - public static final fun cone (Lspace/kscience/visionforge/VisionContainerBuilder;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lspace/kscience/visionforge/solid/ConeSegment; - public static synthetic fun cone$default (Lspace/kscience/visionforge/VisionContainerBuilder;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lspace/kscience/visionforge/solid/ConeSegment; - public static final fun cylinder (Lspace/kscience/visionforge/VisionContainerBuilder;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lspace/kscience/visionforge/solid/ConeSegment; - public static synthetic fun cylinder$default (Lspace/kscience/visionforge/VisionContainerBuilder;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lspace/kscience/visionforge/solid/ConeSegment; + public static final fun cone (Lspace/kscience/visionforge/MutableVisionContainer;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lspace/kscience/visionforge/solid/ConeSegment; + public static synthetic fun cone$default (Lspace/kscience/visionforge/MutableVisionContainer;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lspace/kscience/visionforge/solid/ConeSegment; + public static final fun cylinder (Lspace/kscience/visionforge/MutableVisionContainer;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lspace/kscience/visionforge/solid/ConeSegment; + public static synthetic fun cylinder$default (Lspace/kscience/visionforge/MutableVisionContainer;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lspace/kscience/visionforge/solid/ConeSegment; } -public final class space/kscience/visionforge/solid/ConeSurface : space/kscience/visionforge/solid/SolidBase, space/kscience/visionforge/VisionPropertyContainer, space/kscience/visionforge/solid/GeometrySolid { +public final class space/kscience/visionforge/solid/ConeSurface : space/kscience/visionforge/solid/SolidBase, space/kscience/visionforge/solid/GeometrySolid { public static final field Companion Lspace/kscience/visionforge/solid/ConeSurface$Companion; public fun (FFFFFFF)V public synthetic fun (FFFFFFFILkotlin/jvm/internal/DefaultConstructorMarker;)V - public synthetic fun (ILspace/kscience/dataforge/meta/MutableMeta;FFFFFFFLkotlinx/serialization/internal/SerializationConstructorMarker;)V - public final fun getAngle ()F public final fun getBottomInnerRadius ()F public final fun getBottomRadius ()F public final fun getHeight ()F - public final fun getStartAngle ()F + public final fun getPhi ()F + public final fun getPhiStart ()F public final fun getTopInnerRadius ()F public final fun getTopRadius ()F public fun toGeometry (Lspace/kscience/visionforge/solid/GeometryBuilder;)V - public static final fun write$Self (Lspace/kscience/visionforge/solid/ConeSurface;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V } public final class space/kscience/visionforge/solid/ConeSurface$$serializer : kotlinx/serialization/internal/GeneratedSerializer { public static final field INSTANCE Lspace/kscience/visionforge/solid/ConeSurface$$serializer; - public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; public fun childSerializers ()[Lkotlinx/serialization/KSerializer; public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lspace/kscience/visionforge/solid/ConeSurface; @@ -167,23 +200,20 @@ public final class space/kscience/visionforge/solid/ConeSurface$Companion { } public final class space/kscience/visionforge/solid/ConeSurfaceKt { - public static final fun coneSurface (Lspace/kscience/visionforge/VisionContainerBuilder;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lspace/kscience/visionforge/solid/ConeSurface; - public static synthetic fun coneSurface$default (Lspace/kscience/visionforge/VisionContainerBuilder;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lspace/kscience/visionforge/solid/ConeSurface; - public static final fun tube (Lspace/kscience/visionforge/VisionContainerBuilder;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lspace/kscience/visionforge/solid/ConeSurface; - public static synthetic fun tube$default (Lspace/kscience/visionforge/VisionContainerBuilder;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lspace/kscience/visionforge/solid/ConeSurface; + public static final fun coneSurface (Lspace/kscience/visionforge/MutableVisionContainer;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lspace/kscience/visionforge/solid/ConeSurface; + public static synthetic fun coneSurface$default (Lspace/kscience/visionforge/MutableVisionContainer;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lspace/kscience/visionforge/solid/ConeSurface; + public static final fun tube (Lspace/kscience/visionforge/MutableVisionContainer;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lspace/kscience/visionforge/solid/ConeSurface; + public static synthetic fun tube$default (Lspace/kscience/visionforge/MutableVisionContainer;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lspace/kscience/visionforge/solid/ConeSurface; } -public final class space/kscience/visionforge/solid/Convex : space/kscience/visionforge/solid/SolidBase, space/kscience/visionforge/VisionPropertyContainer { +public final class space/kscience/visionforge/solid/Convex : space/kscience/visionforge/solid/SolidBase { public static final field Companion Lspace/kscience/visionforge/solid/Convex$Companion; - public synthetic fun (ILspace/kscience/dataforge/meta/MutableMeta;Ljava/util/List;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V public fun (Ljava/util/List;)V public final fun getPoints ()Ljava/util/List; - public static final fun write$Self (Lspace/kscience/visionforge/solid/Convex;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V } public final class space/kscience/visionforge/solid/Convex$$serializer : kotlinx/serialization/internal/GeneratedSerializer { public static final field INSTANCE Lspace/kscience/visionforge/solid/Convex$$serializer; - public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; public fun childSerializers ()[Lkotlinx/serialization/KSerializer; public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lspace/kscience/visionforge/solid/Convex; @@ -204,37 +234,55 @@ public final class space/kscience/visionforge/solid/ConvexBuilder { } public final class space/kscience/visionforge/solid/ConvexKt { - public static final fun convex (Lspace/kscience/visionforge/VisionContainerBuilder;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lspace/kscience/visionforge/solid/Convex; - public static synthetic fun convex$default (Lspace/kscience/visionforge/VisionContainerBuilder;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lspace/kscience/visionforge/solid/Convex; + public static final fun convex (Lspace/kscience/visionforge/MutableVisionContainer;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lspace/kscience/visionforge/solid/Convex; + public static synthetic fun convex$default (Lspace/kscience/visionforge/MutableVisionContainer;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lspace/kscience/visionforge/solid/Convex; } -public final class space/kscience/visionforge/solid/ExtrudeBuilder : space/kscience/visionforge/SimpleVisionPropertyContainer { - public fun ()V - public fun (Ljava/util/List;Ljava/util/List;Lspace/kscience/dataforge/meta/ObservableMutableMeta;)V - public synthetic fun (Ljava/util/List;Ljava/util/List;Lspace/kscience/dataforge/meta/ObservableMutableMeta;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun getLayers ()Ljava/util/List; - public final fun getShape ()Ljava/util/List; - public final fun layer (Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;)V - public static synthetic fun layer$default (Lspace/kscience/visionforge/solid/ExtrudeBuilder;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;ILjava/lang/Object;)V - public final fun setLayers (Ljava/util/List;)V - public final fun setShape (Ljava/util/List;)V - public final fun shape (Lkotlin/jvm/functions/Function1;)V +public final class space/kscience/visionforge/solid/CutTube : space/kscience/visionforge/solid/SolidBase, space/kscience/visionforge/solid/GeometrySolid { + public static final field Companion Lspace/kscience/visionforge/solid/CutTube$Companion; + public fun (FFFFFLspace/kscience/visionforge/solid/Float32Vector3D;Lspace/kscience/visionforge/solid/Float32Vector3D;)V + public synthetic fun (FFFFFLspace/kscience/visionforge/solid/Float32Vector3D;Lspace/kscience/visionforge/solid/Float32Vector3D;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun getHeight ()F + public final fun getInnerRadius ()F + public final fun getNBottom ()Lspace/kscience/visionforge/solid/Float32Vector3D; + public final fun getNTop ()Lspace/kscience/visionforge/solid/Float32Vector3D; + public final fun getOuterRadius ()F + public final fun getPhi ()F + public final fun getPhiStart ()F + public fun toGeometry (Lspace/kscience/visionforge/solid/GeometryBuilder;)V } -public final class space/kscience/visionforge/solid/Extruded : space/kscience/visionforge/solid/SolidBase, space/kscience/visionforge/VisionPropertyContainer, space/kscience/visionforge/solid/GeometrySolid { +public final class space/kscience/visionforge/solid/CutTube$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lspace/kscience/visionforge/solid/CutTube$$serializer; + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lspace/kscience/visionforge/solid/CutTube; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lspace/kscience/visionforge/solid/CutTube;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class space/kscience/visionforge/solid/CutTube$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class space/kscience/visionforge/solid/CutTubeKt { + public static final fun cutTube (Lspace/kscience/visionforge/MutableVisionContainer;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Lspace/kscience/visionforge/solid/Float32Vector3D;Lspace/kscience/visionforge/solid/Float32Vector3D;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lspace/kscience/visionforge/solid/CutTube; + public static synthetic fun cutTube$default (Lspace/kscience/visionforge/MutableVisionContainer;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Lspace/kscience/visionforge/solid/Float32Vector3D;Lspace/kscience/visionforge/solid/Float32Vector3D;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lspace/kscience/visionforge/solid/CutTube; +} + +public final class space/kscience/visionforge/solid/Extruded : space/kscience/visionforge/solid/SolidBase, space/kscience/visionforge/solid/GeometrySolid { public static final field Companion Lspace/kscience/visionforge/solid/Extruded$Companion; public static final field TYPE Ljava/lang/String; - public synthetic fun (ILspace/kscience/dataforge/meta/MutableMeta;Ljava/util/List;Ljava/util/List;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V public fun (Ljava/util/List;Ljava/util/List;)V public final fun getLayers ()Ljava/util/List; public final fun getShape ()Ljava/util/List; public fun toGeometry (Lspace/kscience/visionforge/solid/GeometryBuilder;)V - public static final fun write$Self (Lspace/kscience/visionforge/solid/Extruded;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V } public final class space/kscience/visionforge/solid/Extruded$$serializer : kotlinx/serialization/internal/GeneratedSerializer { public static final field INSTANCE Lspace/kscience/visionforge/solid/Extruded$$serializer; - public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; public fun childSerializers ()[Lkotlinx/serialization/KSerializer; public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lspace/kscience/visionforge/solid/Extruded; @@ -244,34 +292,172 @@ public final class space/kscience/visionforge/solid/Extruded$$serializer : kotli public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; } +public final class space/kscience/visionforge/solid/Extruded$Builder { + public fun ()V + public fun (Ljava/util/List;Ljava/util/List;Lspace/kscience/dataforge/meta/MutableMeta;)V + public synthetic fun (Ljava/util/List;Ljava/util/List;Lspace/kscience/dataforge/meta/MutableMeta;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun getLayers ()Ljava/util/List; + public final fun getProperties ()Lspace/kscience/dataforge/meta/MutableMeta; + public final fun getShape ()Ljava/util/List; + public final fun layer (Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;)V + public static synthetic fun layer$default (Lspace/kscience/visionforge/solid/Extruded$Builder;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;ILjava/lang/Object;)V + public final fun setLayers (Ljava/util/List;)V + public final fun setShape (Ljava/util/List;)V + public final fun shape (Lkotlin/jvm/functions/Function1;)V +} + public final class space/kscience/visionforge/solid/Extruded$Companion { public final fun serializer ()Lkotlinx/serialization/KSerializer; } +public final class space/kscience/visionforge/solid/Extruded$Layer { + public static final field Companion Lspace/kscience/visionforge/solid/Extruded$Layer$Companion; + public fun (FFFF)V + public final fun component1 ()F + public final fun component2 ()F + public final fun component3 ()F + public final fun component4 ()F + public final fun copy (FFFF)Lspace/kscience/visionforge/solid/Extruded$Layer; + public static synthetic fun copy$default (Lspace/kscience/visionforge/solid/Extruded$Layer;FFFFILjava/lang/Object;)Lspace/kscience/visionforge/solid/Extruded$Layer; + public fun equals (Ljava/lang/Object;)Z + public final fun getScale ()F + public final fun getX ()F + public final fun getY ()F + public final fun getZ ()F + public fun hashCode ()I + public final fun setScale (F)V + public final fun setX (F)V + public final fun setY (F)V + public final fun setZ (F)V + public fun toString ()Ljava/lang/String; +} + +public final class space/kscience/visionforge/solid/Extruded$Layer$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lspace/kscience/visionforge/solid/Extruded$Layer$$serializer; + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lspace/kscience/visionforge/solid/Extruded$Layer; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lspace/kscience/visionforge/solid/Extruded$Layer;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class space/kscience/visionforge/solid/Extruded$Layer$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + public final class space/kscience/visionforge/solid/ExtrudedKt { - public static final fun extruded (Lspace/kscience/visionforge/VisionContainerBuilder;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lspace/kscience/visionforge/solid/Extruded; - public static synthetic fun extruded$default (Lspace/kscience/visionforge/VisionContainerBuilder;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lspace/kscience/visionforge/solid/Extruded; - public static final fun polygon (Lspace/kscience/visionforge/solid/Shape2DBuilder;ILjava/lang/Number;)V + public static final fun extruded (Lspace/kscience/visionforge/MutableVisionContainer;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lspace/kscience/visionforge/solid/Extruded; + public static synthetic fun extruded$default (Lspace/kscience/visionforge/MutableVisionContainer;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lspace/kscience/visionforge/solid/Extruded; +} + +public final class space/kscience/visionforge/solid/Float32Euclidean2DSpace : space/kscience/kmath/geometry/GeometrySpace, space/kscience/kmath/operations/ScaleOperations { + public static final field INSTANCE Lspace/kscience/visionforge/solid/Float32Euclidean2DSpace; + public synthetic fun add (Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; + public fun add (Lspace/kscience/visionforge/solid/Float32Vector2D;Lspace/kscience/visionforge/solid/Float32Vector2D;)Lspace/kscience/visionforge/solid/Float32Vector2D; + public synthetic fun distanceTo (Lspace/kscience/kmath/geometry/Vector;Lspace/kscience/kmath/geometry/Vector;)D + public fun distanceTo (Lspace/kscience/visionforge/solid/Float32Vector2D;Lspace/kscience/visionforge/solid/Float32Vector2D;)D + public synthetic fun dot (Lspace/kscience/kmath/geometry/Vector;Lspace/kscience/kmath/geometry/Vector;)D + public fun dot (Lspace/kscience/visionforge/solid/Float32Vector2D;Lspace/kscience/visionforge/solid/Float32Vector2D;)D + public final fun getXAxis ()Lspace/kscience/visionforge/solid/Float32Vector2D; + public final fun getYAxis ()Lspace/kscience/visionforge/solid/Float32Vector2D; + public synthetic fun getZero ()Ljava/lang/Object; + public fun getZero ()Lspace/kscience/visionforge/solid/Float32Vector2D; + public synthetic fun norm (Ljava/lang/Object;)Ljava/lang/Object; + public final fun norm (Lspace/kscience/visionforge/solid/Float32Vector2D;)D + public fun norm (Lspace/kscience/visionforge/solid/Float32Vector2D;)Ljava/lang/Double; + public synthetic fun scale (Ljava/lang/Object;D)Ljava/lang/Object; + public fun scale (Lspace/kscience/visionforge/solid/Float32Vector2D;D)Lspace/kscience/visionforge/solid/Float32Vector2D; + public synthetic fun unaryMinus (Ljava/lang/Object;)Ljava/lang/Object; + public fun unaryMinus (Lspace/kscience/visionforge/solid/Float32Vector2D;)Lspace/kscience/visionforge/solid/Float32Vector2D; + public final fun vector (FF)Lspace/kscience/visionforge/solid/Float32Vector2D; + public final fun vector (Ljava/lang/Number;Ljava/lang/Number;)Lspace/kscience/visionforge/solid/Float32Vector2D; +} + +public final class space/kscience/visionforge/solid/Float32Euclidean2DSpace$VectorSerializer : kotlinx/serialization/KSerializer { + public static final field INSTANCE Lspace/kscience/visionforge/solid/Float32Euclidean2DSpace$VectorSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lspace/kscience/visionforge/solid/Float32Vector2D; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lspace/kscience/visionforge/solid/Float32Vector2D;)V +} + +public final class space/kscience/visionforge/solid/Float32Euclidean2DSpaceKt { + public static final fun Float32Vector2D (Ljava/lang/Number;Ljava/lang/Number;)Lspace/kscience/visionforge/solid/Float32Vector2D; +} + +public final class space/kscience/visionforge/solid/Float32Euclidean3DSpace : space/kscience/kmath/geometry/GeometrySpace, space/kscience/kmath/operations/ScaleOperations { + public static final field INSTANCE Lspace/kscience/visionforge/solid/Float32Euclidean3DSpace; + public synthetic fun add (Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; + public fun add (Lspace/kscience/visionforge/solid/Float32Vector3D;Lspace/kscience/visionforge/solid/Float32Vector3D;)Lspace/kscience/visionforge/solid/Float32Vector3D; + public final fun cross (Lspace/kscience/visionforge/solid/Float32Vector3D;Lspace/kscience/visionforge/solid/Float32Vector3D;)Lspace/kscience/visionforge/solid/Float32Vector3D; + public synthetic fun distanceTo (Lspace/kscience/kmath/geometry/Vector;Lspace/kscience/kmath/geometry/Vector;)D + public fun distanceTo (Lspace/kscience/visionforge/solid/Float32Vector3D;Lspace/kscience/visionforge/solid/Float32Vector3D;)D + public synthetic fun dot (Lspace/kscience/kmath/geometry/Vector;Lspace/kscience/kmath/geometry/Vector;)D + public fun dot (Lspace/kscience/visionforge/solid/Float32Vector3D;Lspace/kscience/visionforge/solid/Float32Vector3D;)D + public final fun getXAxis ()Lspace/kscience/visionforge/solid/Float32Vector3D; + public final fun getYAxis ()Lspace/kscience/visionforge/solid/Float32Vector3D; + public final fun getZAxis ()Lspace/kscience/visionforge/solid/Float32Vector3D; + public synthetic fun getZero ()Ljava/lang/Object; + public fun getZero ()Lspace/kscience/visionforge/solid/Float32Vector3D; + public synthetic fun norm (Ljava/lang/Object;)Ljava/lang/Object; + public final fun norm (Lspace/kscience/visionforge/solid/Float32Vector3D;)D + public fun norm (Lspace/kscience/visionforge/solid/Float32Vector3D;)Ljava/lang/Double; + public synthetic fun scale (Ljava/lang/Object;D)Ljava/lang/Object; + public fun scale (Lspace/kscience/visionforge/solid/Float32Vector3D;D)Lspace/kscience/visionforge/solid/Float32Vector3D; + public synthetic fun unaryMinus (Ljava/lang/Object;)Ljava/lang/Object; + public fun unaryMinus (Lspace/kscience/visionforge/solid/Float32Vector3D;)Lspace/kscience/visionforge/solid/Float32Vector3D; + public final fun vector (FFF)Lspace/kscience/visionforge/solid/Float32Vector3D; + public final fun vector (Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;)Lspace/kscience/visionforge/solid/Float32Vector3D; + public final fun vectorProduct (Lspace/kscience/visionforge/solid/Float32Vector3D;Lspace/kscience/visionforge/solid/Float32Vector3D;)Lspace/kscience/visionforge/solid/Float32Vector3D; +} + +public final class space/kscience/visionforge/solid/Float32Euclidean3DSpace$VectorSerializer : kotlinx/serialization/KSerializer { + public static final field INSTANCE Lspace/kscience/visionforge/solid/Float32Euclidean3DSpace$VectorSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lspace/kscience/visionforge/solid/Float32Vector3D; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lspace/kscience/visionforge/solid/Float32Vector3D;)V +} + +public final class space/kscience/visionforge/solid/Float32Euclidean3DSpaceKt { + public static final fun Float32Vector3D (Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;)Lspace/kscience/visionforge/solid/Float32Vector3D; +} + +public abstract interface class space/kscience/visionforge/solid/Float32Vector2D : space/kscience/kmath/geometry/Vector2D { + public static final field Companion Lspace/kscience/visionforge/solid/Float32Vector2D$Companion; +} + +public final class space/kscience/visionforge/solid/Float32Vector2D$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public abstract interface class space/kscience/visionforge/solid/Float32Vector3D : space/kscience/kmath/geometry/Vector3D { + public static final field Companion Lspace/kscience/visionforge/solid/Float32Vector3D$Companion; +} + +public final class space/kscience/visionforge/solid/Float32Vector3D$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; } public final class space/kscience/visionforge/solid/GenericHexagon : space/kscience/visionforge/solid/SolidBase, space/kscience/visionforge/solid/Hexagon { public static final field Companion Lspace/kscience/visionforge/solid/GenericHexagon$Companion; - public synthetic fun (ILspace/kscience/dataforge/meta/MutableMeta;Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/visionforge/solid/Point3D;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V - public fun (Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/visionforge/solid/Point3D;)V - public fun getNode1 ()Lspace/kscience/visionforge/solid/Point3D; - public fun getNode2 ()Lspace/kscience/visionforge/solid/Point3D; - public fun getNode3 ()Lspace/kscience/visionforge/solid/Point3D; - public fun getNode4 ()Lspace/kscience/visionforge/solid/Point3D; - public fun getNode5 ()Lspace/kscience/visionforge/solid/Point3D; - public fun getNode6 ()Lspace/kscience/visionforge/solid/Point3D; - public fun getNode7 ()Lspace/kscience/visionforge/solid/Point3D; - public fun getNode8 ()Lspace/kscience/visionforge/solid/Point3D; - public static final fun write$Self (Lspace/kscience/visionforge/solid/GenericHexagon;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V + public fun (Lspace/kscience/visionforge/solid/Float32Vector3D;Lspace/kscience/visionforge/solid/Float32Vector3D;Lspace/kscience/visionforge/solid/Float32Vector3D;Lspace/kscience/visionforge/solid/Float32Vector3D;Lspace/kscience/visionforge/solid/Float32Vector3D;Lspace/kscience/visionforge/solid/Float32Vector3D;Lspace/kscience/visionforge/solid/Float32Vector3D;Lspace/kscience/visionforge/solid/Float32Vector3D;)V + public fun getNode1 ()Lspace/kscience/visionforge/solid/Float32Vector3D; + public fun getNode2 ()Lspace/kscience/visionforge/solid/Float32Vector3D; + public fun getNode3 ()Lspace/kscience/visionforge/solid/Float32Vector3D; + public fun getNode4 ()Lspace/kscience/visionforge/solid/Float32Vector3D; + public fun getNode5 ()Lspace/kscience/visionforge/solid/Float32Vector3D; + public fun getNode6 ()Lspace/kscience/visionforge/solid/Float32Vector3D; + public fun getNode7 ()Lspace/kscience/visionforge/solid/Float32Vector3D; + public fun getNode8 ()Lspace/kscience/visionforge/solid/Float32Vector3D; } public final class space/kscience/visionforge/solid/GenericHexagon$$serializer : kotlinx/serialization/internal/GeneratedSerializer { public static final field INSTANCE Lspace/kscience/visionforge/solid/GenericHexagon$$serializer; - public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; public fun childSerializers ()[Lkotlinx/serialization/KSerializer; public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lspace/kscience/visionforge/solid/GenericHexagon; @@ -287,28 +473,21 @@ public final class space/kscience/visionforge/solid/GenericHexagon$Companion { public abstract interface class space/kscience/visionforge/solid/GeometryBuilder { public abstract fun build ()Ljava/lang/Object; - public abstract fun face (Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/dataforge/meta/Meta;)V - public static synthetic fun face$default (Lspace/kscience/visionforge/solid/GeometryBuilder;Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/dataforge/meta/Meta;ILjava/lang/Object;)V + public abstract fun face (Lspace/kscience/visionforge/solid/Float32Vector3D;Lspace/kscience/visionforge/solid/Float32Vector3D;Lspace/kscience/visionforge/solid/Float32Vector3D;Lspace/kscience/visionforge/solid/Float32Vector3D;Lspace/kscience/dataforge/meta/Meta;)V + public static synthetic fun face$default (Lspace/kscience/visionforge/solid/GeometryBuilder;Lspace/kscience/visionforge/solid/Float32Vector3D;Lspace/kscience/visionforge/solid/Float32Vector3D;Lspace/kscience/visionforge/solid/Float32Vector3D;Lspace/kscience/visionforge/solid/Float32Vector3D;Lspace/kscience/dataforge/meta/Meta;ILjava/lang/Object;)V } public final class space/kscience/visionforge/solid/GeometryBuilderKt { - public static final fun cap (Lspace/kscience/visionforge/solid/GeometryBuilder;Ljava/util/List;Lspace/kscience/visionforge/solid/Point3D;)V - public static synthetic fun cap$default (Lspace/kscience/visionforge/solid/GeometryBuilder;Ljava/util/List;Lspace/kscience/visionforge/solid/Point3D;ILjava/lang/Object;)V - public static final fun face4 (Lspace/kscience/visionforge/solid/GeometryBuilder;Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/dataforge/meta/Meta;)V - public static synthetic fun face4$default (Lspace/kscience/visionforge/solid/GeometryBuilder;Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/dataforge/meta/Meta;ILjava/lang/Object;)V + public static final fun cap (Lspace/kscience/visionforge/solid/GeometryBuilder;Ljava/util/List;Lspace/kscience/visionforge/solid/Float32Vector3D;)V + public static synthetic fun cap$default (Lspace/kscience/visionforge/solid/GeometryBuilder;Ljava/util/List;Lspace/kscience/visionforge/solid/Float32Vector3D;ILjava/lang/Object;)V + public static final fun face4 (Lspace/kscience/visionforge/solid/GeometryBuilder;Lspace/kscience/visionforge/solid/Float32Vector3D;Lspace/kscience/visionforge/solid/Float32Vector3D;Lspace/kscience/visionforge/solid/Float32Vector3D;Lspace/kscience/visionforge/solid/Float32Vector3D;Lspace/kscience/visionforge/solid/Float32Vector3D;Lspace/kscience/dataforge/meta/Meta;)V + public static synthetic fun face4$default (Lspace/kscience/visionforge/solid/GeometryBuilder;Lspace/kscience/visionforge/solid/Float32Vector3D;Lspace/kscience/visionforge/solid/Float32Vector3D;Lspace/kscience/visionforge/solid/Float32Vector3D;Lspace/kscience/visionforge/solid/Float32Vector3D;Lspace/kscience/visionforge/solid/Float32Vector3D;Lspace/kscience/dataforge/meta/Meta;ILjava/lang/Object;)V } public final class space/kscience/visionforge/solid/GeometryKt { public static final field PI2 F - public static final fun Point2D (Ljava/lang/Number;Ljava/lang/Number;)Lspace/kscience/visionforge/solid/Point2D; - public static final fun Point3D (Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;)Lspace/kscience/visionforge/solid/Point3D; - public static final fun cross (Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/visionforge/solid/Point3D;)Lspace/kscience/visionforge/solid/Point3D; - public static final fun minus (Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/visionforge/solid/Point3D;)Lspace/kscience/visionforge/solid/Point3D; - public static final fun normalizeInPlace (Lspace/kscience/visionforge/solid/MutablePoint3D;)V - public static final fun plus (Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/visionforge/solid/Point3D;)Lspace/kscience/visionforge/solid/Point3D; - public static final fun toMeta (Lspace/kscience/visionforge/solid/Point2D;)Lspace/kscience/dataforge/meta/Meta; - public static final fun toMeta (Lspace/kscience/visionforge/solid/Point3D;)Lspace/kscience/dataforge/meta/Meta; - public static final fun unaryMinus (Lspace/kscience/visionforge/solid/Point3D;)Lspace/kscience/visionforge/solid/Point3D; + public static final fun toMeta (Lspace/kscience/visionforge/solid/Float32Vector2D;)Lspace/kscience/dataforge/meta/Meta; + public static final fun toMeta (Lspace/kscience/visionforge/solid/Float32Vector3D;)Lspace/kscience/dataforge/meta/Meta; } public abstract interface class space/kscience/visionforge/solid/GeometrySolid : space/kscience/visionforge/solid/Solid { @@ -316,132 +495,95 @@ public abstract interface class space/kscience/visionforge/solid/GeometrySolid : } public abstract interface class space/kscience/visionforge/solid/Hexagon : space/kscience/visionforge/solid/GeometrySolid { - public abstract fun getNode1 ()Lspace/kscience/visionforge/solid/Point3D; - public abstract fun getNode2 ()Lspace/kscience/visionforge/solid/Point3D; - public abstract fun getNode3 ()Lspace/kscience/visionforge/solid/Point3D; - public abstract fun getNode4 ()Lspace/kscience/visionforge/solid/Point3D; - public abstract fun getNode5 ()Lspace/kscience/visionforge/solid/Point3D; - public abstract fun getNode6 ()Lspace/kscience/visionforge/solid/Point3D; - public abstract fun getNode7 ()Lspace/kscience/visionforge/solid/Point3D; - public abstract fun getNode8 ()Lspace/kscience/visionforge/solid/Point3D; + public abstract fun getNode1 ()Lspace/kscience/visionforge/solid/Float32Vector3D; + public abstract fun getNode2 ()Lspace/kscience/visionforge/solid/Float32Vector3D; + public abstract fun getNode3 ()Lspace/kscience/visionforge/solid/Float32Vector3D; + public abstract fun getNode4 ()Lspace/kscience/visionforge/solid/Float32Vector3D; + public abstract fun getNode5 ()Lspace/kscience/visionforge/solid/Float32Vector3D; + public abstract fun getNode6 ()Lspace/kscience/visionforge/solid/Float32Vector3D; + public abstract fun getNode7 ()Lspace/kscience/visionforge/solid/Float32Vector3D; + public abstract fun getNode8 ()Lspace/kscience/visionforge/solid/Float32Vector3D; public fun toGeometry (Lspace/kscience/visionforge/solid/GeometryBuilder;)V } public final class space/kscience/visionforge/solid/HexagonKt { - public static final fun box (Lspace/kscience/visionforge/VisionContainerBuilder;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lspace/kscience/visionforge/solid/Box; - public static synthetic fun box$default (Lspace/kscience/visionforge/VisionContainerBuilder;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lspace/kscience/visionforge/solid/Box; - public static final fun hexagon (Lspace/kscience/visionforge/VisionContainerBuilder;Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/visionforge/solid/Point3D;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lspace/kscience/visionforge/solid/Hexagon; - public static synthetic fun hexagon$default (Lspace/kscience/visionforge/VisionContainerBuilder;Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/visionforge/solid/Point3D;Lspace/kscience/visionforge/solid/Point3D;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lspace/kscience/visionforge/solid/Hexagon; + public static final fun box (Lspace/kscience/visionforge/MutableVisionContainer;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lspace/kscience/visionforge/solid/Box; + public static synthetic fun box$default (Lspace/kscience/visionforge/MutableVisionContainer;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lspace/kscience/visionforge/solid/Box; + public static final fun hexagon (Lspace/kscience/visionforge/MutableVisionContainer;Lspace/kscience/visionforge/solid/Float32Vector3D;Lspace/kscience/visionforge/solid/Float32Vector3D;Lspace/kscience/visionforge/solid/Float32Vector3D;Lspace/kscience/visionforge/solid/Float32Vector3D;Lspace/kscience/visionforge/solid/Float32Vector3D;Lspace/kscience/visionforge/solid/Float32Vector3D;Lspace/kscience/visionforge/solid/Float32Vector3D;Lspace/kscience/visionforge/solid/Float32Vector3D;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lspace/kscience/visionforge/solid/Hexagon; + public static synthetic fun hexagon$default (Lspace/kscience/visionforge/MutableVisionContainer;Lspace/kscience/visionforge/solid/Float32Vector3D;Lspace/kscience/visionforge/solid/Float32Vector3D;Lspace/kscience/visionforge/solid/Float32Vector3D;Lspace/kscience/visionforge/solid/Float32Vector3D;Lspace/kscience/visionforge/solid/Float32Vector3D;Lspace/kscience/visionforge/solid/Float32Vector3D;Lspace/kscience/visionforge/solid/Float32Vector3D;Lspace/kscience/visionforge/solid/Float32Vector3D;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lspace/kscience/visionforge/solid/Hexagon; } -public final class space/kscience/visionforge/solid/Layer { - public static final field Companion Lspace/kscience/visionforge/solid/Layer$Companion; - public fun (FFFF)V - public synthetic fun (IFFFFLkotlinx/serialization/internal/SerializationConstructorMarker;)V - public final fun component1 ()F - public final fun component2 ()F - public final fun component3 ()F - public final fun component4 ()F - public final fun copy (FFFF)Lspace/kscience/visionforge/solid/Layer; - public static synthetic fun copy$default (Lspace/kscience/visionforge/solid/Layer;FFFFILjava/lang/Object;)Lspace/kscience/visionforge/solid/Layer; - public fun equals (Ljava/lang/Object;)Z - public final fun getScale ()F - public final fun getX ()F - public final fun getY ()F - public final fun getZ ()F - public fun hashCode ()I - public final fun setScale (F)V - public final fun setX (F)V - public final fun setY (F)V - public final fun setZ (F)V - public fun toString ()Ljava/lang/String; - public static final fun write$Self (Lspace/kscience/visionforge/solid/Layer;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +public abstract class space/kscience/visionforge/solid/LightSource : space/kscience/visionforge/solid/MiscSolid { + public static final field Companion Lspace/kscience/visionforge/solid/LightSource$Companion; + public fun ()V + public synthetic fun (ILspace/kscience/dataforge/meta/MutableMeta;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V + public final fun getColor ()Lspace/kscience/visionforge/solid/ColorAccessor; + public fun getDescriptor ()Lspace/kscience/dataforge/meta/descriptors/MetaDescriptor; + public final fun getIntensity ()Ljava/lang/Number; + public final fun setIntensity (Ljava/lang/Number;)V + public static final synthetic fun write$Self (Lspace/kscience/visionforge/solid/LightSource;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V } -public final class space/kscience/visionforge/solid/Layer$$serializer : kotlinx/serialization/internal/GeneratedSerializer { - public static final field INSTANCE Lspace/kscience/visionforge/solid/Layer$$serializer; - public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; - public fun childSerializers ()[Lkotlinx/serialization/KSerializer; - public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; - public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lspace/kscience/visionforge/solid/Layer; - public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; - public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V - public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lspace/kscience/visionforge/solid/Layer;)V - public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; -} - -public final class space/kscience/visionforge/solid/Layer$Companion { +public final class space/kscience/visionforge/solid/LightSource$Companion { + public final fun getDescriptor ()Lspace/kscience/dataforge/meta/descriptors/MetaDescriptor; + public final fun getINTENSITY_KEY ()Lspace/kscience/dataforge/names/Name; public final fun serializer ()Lkotlinx/serialization/KSerializer; } -public abstract interface class space/kscience/visionforge/solid/MutablePoint3D : space/kscience/visionforge/solid/Point3D { - public abstract fun getX ()F - public abstract fun getY ()F - public abstract fun getZ ()F - public abstract fun setX (F)V - public abstract fun setY (F)V - public abstract fun setZ (F)V +public final class space/kscience/visionforge/solid/LightSourceKt { + public static final fun ambientLight (Lspace/kscience/visionforge/MutableVisionContainer;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lspace/kscience/visionforge/solid/AmbientLightSource; + public static synthetic fun ambientLight$default (Lspace/kscience/visionforge/MutableVisionContainer;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lspace/kscience/visionforge/solid/AmbientLightSource; + public static final fun pointLight (Lspace/kscience/visionforge/MutableVisionContainer;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lspace/kscience/visionforge/solid/PointLightSource; + public static synthetic fun pointLight$default (Lspace/kscience/visionforge/MutableVisionContainer;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lspace/kscience/visionforge/solid/PointLightSource; } -public final class space/kscience/visionforge/solid/Point2D { - public static final field Companion Lspace/kscience/visionforge/solid/Point2D$Companion; - public fun (FF)V - public synthetic fun (IFFLkotlinx/serialization/internal/SerializationConstructorMarker;)V - public final fun component1 ()F - public final fun component2 ()F - public final fun copy (FF)Lspace/kscience/visionforge/solid/Point2D; - public static synthetic fun copy$default (Lspace/kscience/visionforge/solid/Point2D;FFILjava/lang/Object;)Lspace/kscience/visionforge/solid/Point2D; - public fun equals (Ljava/lang/Object;)Z - public final fun getX ()F - public final fun getY ()F - public fun hashCode ()I - public final fun setX (F)V - public final fun setY (F)V - public fun toString ()Ljava/lang/String; - public static final fun write$Self (Lspace/kscience/visionforge/solid/Point2D;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +public abstract class space/kscience/visionforge/solid/MiscSolid : space/kscience/visionforge/solid/SolidBase { + public static final field Companion Lspace/kscience/visionforge/solid/MiscSolid$Companion; + public fun ()V + public synthetic fun (ILspace/kscience/dataforge/meta/MutableMeta;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V + public static final synthetic fun write$Self (Lspace/kscience/visionforge/solid/MiscSolid;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V } -public final class space/kscience/visionforge/solid/Point2D$$serializer : kotlinx/serialization/internal/GeneratedSerializer { - public static final field INSTANCE Lspace/kscience/visionforge/solid/Point2D$$serializer; - public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; - public fun childSerializers ()[Lkotlinx/serialization/KSerializer; - public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; - public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lspace/kscience/visionforge/solid/Point2D; - public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; - public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V - public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lspace/kscience/visionforge/solid/Point2D;)V - public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; -} - -public final class space/kscience/visionforge/solid/Point2D$Companion { +public final class space/kscience/visionforge/solid/MiscSolid$Companion { public final fun serializer ()Lkotlinx/serialization/KSerializer; } -public abstract interface class space/kscience/visionforge/solid/Point3D { - public static final field Companion Lspace/kscience/visionforge/solid/Point3D$Companion; - public abstract fun getX ()F - public abstract fun getY ()F - public abstract fun getZ ()F +public final class space/kscience/visionforge/solid/MiscSolidKt { + public static final fun axes (Lspace/kscience/visionforge/MutableVisionContainer;Ljava/lang/Number;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lspace/kscience/visionforge/solid/AxesSolid; + public static synthetic fun axes$default (Lspace/kscience/visionforge/MutableVisionContainer;Ljava/lang/Number;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lspace/kscience/visionforge/solid/AxesSolid; } -public final class space/kscience/visionforge/solid/Point3D$Companion { - public final fun getONE ()Lspace/kscience/visionforge/solid/Point3D; - public final fun getZERO ()Lspace/kscience/visionforge/solid/Point3D; +public final class space/kscience/visionforge/solid/PointLightSource : space/kscience/visionforge/solid/LightSource { + public static final field Companion Lspace/kscience/visionforge/solid/PointLightSource$Companion; + public fun ()V } -public final class space/kscience/visionforge/solid/PolyLine : space/kscience/visionforge/solid/SolidBase, space/kscience/visionforge/VisionPropertyContainer { +public final class space/kscience/visionforge/solid/PointLightSource$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lspace/kscience/visionforge/solid/PointLightSource$$serializer; + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lspace/kscience/visionforge/solid/PointLightSource; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lspace/kscience/visionforge/solid/PointLightSource;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class space/kscience/visionforge/solid/PointLightSource$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class space/kscience/visionforge/solid/PolyLine : space/kscience/visionforge/solid/SolidBase { public static final field Companion Lspace/kscience/visionforge/solid/PolyLine$Companion; - public synthetic fun (ILspace/kscience/dataforge/meta/MutableMeta;Ljava/util/List;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V + public static final field DEFAULT_THICKNESS D public fun (Ljava/util/List;)V public final fun getPoints ()Ljava/util/List; public final fun getThickness ()Ljava/lang/Number; public final fun setThickness (Ljava/lang/Number;)V - public static final fun write$Self (Lspace/kscience/visionforge/solid/PolyLine;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V } public final class space/kscience/visionforge/solid/PolyLine$$serializer : kotlinx/serialization/internal/GeneratedSerializer { public static final field INSTANCE Lspace/kscience/visionforge/solid/PolyLine$$serializer; - public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; public fun childSerializers ()[Lkotlinx/serialization/KSerializer; public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lspace/kscience/visionforge/solid/PolyLine; @@ -452,13 +594,12 @@ public final class space/kscience/visionforge/solid/PolyLine$$serializer : kotli } public final class space/kscience/visionforge/solid/PolyLine$Companion { - public final fun getTHICKNESS_KEY ()Lspace/kscience/dataforge/names/Name; public final fun serializer ()Lkotlinx/serialization/KSerializer; } public final class space/kscience/visionforge/solid/PolyLineKt { - public static final fun polyline (Lspace/kscience/visionforge/VisionContainerBuilder;[Lspace/kscience/visionforge/solid/Point3D;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lspace/kscience/visionforge/solid/PolyLine; - public static synthetic fun polyline$default (Lspace/kscience/visionforge/VisionContainerBuilder;[Lspace/kscience/visionforge/solid/Point3D;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lspace/kscience/visionforge/solid/PolyLine; + public static final fun polyline (Lspace/kscience/visionforge/MutableVisionContainer;[Lspace/kscience/visionforge/solid/Float32Vector3D;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lspace/kscience/visionforge/solid/PolyLine; + public static synthetic fun polyline$default (Lspace/kscience/visionforge/MutableVisionContainer;[Lspace/kscience/visionforge/solid/Float32Vector3D;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lspace/kscience/visionforge/solid/PolyLine; } public abstract interface class space/kscience/visionforge/solid/PrototypeHolder { @@ -466,53 +607,17 @@ public abstract interface class space/kscience/visionforge/solid/PrototypeHolder public abstract fun prototypes (Lkotlin/jvm/functions/Function1;)V } -public final class space/kscience/visionforge/solid/Quaternion { - public static final synthetic fun box-impl ([D)Lspace/kscience/visionforge/solid/Quaternion; - public static fun constructor-impl ([D)[D - public fun equals (Ljava/lang/Object;)Z - public static fun equals-impl ([DLjava/lang/Object;)Z - public static final fun equals-impl0 ([D[D)Z - public final fun getValues ()[D - public fun hashCode ()I - public static fun hashCode-impl ([D)I - public fun toString ()Ljava/lang/String; - public static fun toString-impl ([D)Ljava/lang/String; - public final synthetic fun unbox-impl ()[D -} - -public final class space/kscience/visionforge/solid/QuaternionKt { - public static final fun component1-VMqeIco ([D)D - public static final fun component2-VMqeIco ([D)D - public static final fun component3-VMqeIco ([D)D - public static final fun component4-VMqeIco ([D)D -} - -public final class space/kscience/visionforge/solid/RotationOrder : java/lang/Enum { - public static final field XYZ Lspace/kscience/visionforge/solid/RotationOrder; - public static final field XZY Lspace/kscience/visionforge/solid/RotationOrder; - public static final field YXZ Lspace/kscience/visionforge/solid/RotationOrder; - public static final field YZX Lspace/kscience/visionforge/solid/RotationOrder; - public static final field ZXY Lspace/kscience/visionforge/solid/RotationOrder; - public static final field ZYX Lspace/kscience/visionforge/solid/RotationOrder; - public static fun valueOf (Ljava/lang/String;)Lspace/kscience/visionforge/solid/RotationOrder; - public static fun values ()[Lspace/kscience/visionforge/solid/RotationOrder; -} - public final class space/kscience/visionforge/solid/Shape2DBuilder { public static final field Companion Lspace/kscience/visionforge/solid/Shape2DBuilder$Companion; public fun ()V - public synthetic fun (ILjava/util/ArrayList;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V public fun (Ljava/util/ArrayList;)V public synthetic fun (Ljava/util/ArrayList;ILkotlin/jvm/internal/DefaultConstructorMarker;)V public final fun build ()Ljava/util/List; public final fun point (Ljava/lang/Number;Ljava/lang/Number;)V - public final fun to (Ljava/lang/Number;Ljava/lang/Number;)V - public static final fun write$Self (Lspace/kscience/visionforge/solid/Shape2DBuilder;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V } public final class space/kscience/visionforge/solid/Shape2DBuilder$$serializer : kotlinx/serialization/internal/GeneratedSerializer { public static final field INSTANCE Lspace/kscience/visionforge/solid/Shape2DBuilder$$serializer; - public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; public fun childSerializers ()[Lkotlinx/serialization/KSerializer; public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lspace/kscience/visionforge/solid/Shape2DBuilder; @@ -526,6 +631,10 @@ public final class space/kscience/visionforge/solid/Shape2DBuilder$Companion { public final fun serializer ()Lkotlinx/serialization/KSerializer; } +public final class space/kscience/visionforge/solid/Shape2DKt { + public static final fun polygon (Lspace/kscience/visionforge/solid/Shape2DBuilder;ILjava/lang/Number;)V +} + public abstract interface class space/kscience/visionforge/solid/Solid : space/kscience/visionforge/Vision { public static final field Companion Lspace/kscience/visionforge/solid/Solid$Companion; public fun getDescriptor ()Lspace/kscience/dataforge/meta/descriptors/MetaDescriptor; @@ -555,17 +664,16 @@ public final class space/kscience/visionforge/solid/Solid$Companion { public final fun getZ_SCALE_KEY ()Lspace/kscience/dataforge/names/Name; } -public class space/kscience/visionforge/solid/SolidBase : space/kscience/visionforge/VisionBase, space/kscience/visionforge/solid/Solid { +public class space/kscience/visionforge/solid/SolidBase : space/kscience/visionforge/AbstractVision, space/kscience/visionforge/solid/Solid { public static final field Companion Lspace/kscience/visionforge/solid/SolidBase$Companion; public fun ()V public synthetic fun (ILspace/kscience/dataforge/meta/MutableMeta;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V public fun getDescriptor ()Lspace/kscience/dataforge/meta/descriptors/MetaDescriptor; - public static final fun write$Self (Lspace/kscience/visionforge/solid/SolidBase;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V + public static final synthetic fun write$Self (Lspace/kscience/visionforge/solid/SolidBase;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;Lkotlinx/serialization/KSerializer;)V } public final class space/kscience/visionforge/solid/SolidBase$$serializer : kotlinx/serialization/internal/GeneratedSerializer { - public static final field INSTANCE Lspace/kscience/visionforge/solid/SolidBase$$serializer; - public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun (Lkotlinx/serialization/KSerializer;)V public fun childSerializers ()[Lkotlinx/serialization/KSerializer; public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lspace/kscience/visionforge/solid/SolidBase; @@ -576,24 +684,26 @@ public final class space/kscience/visionforge/solid/SolidBase$$serializer : kotl } public final class space/kscience/visionforge/solid/SolidBase$Companion { - public final fun serializer ()Lkotlinx/serialization/KSerializer; + public final fun serializer (Lkotlinx/serialization/KSerializer;)Lkotlinx/serialization/KSerializer; } -public final class space/kscience/visionforge/solid/SolidGroup : space/kscience/visionforge/VisionGroupBase, space/kscience/visionforge/solid/PrototypeHolder, space/kscience/visionforge/solid/Solid { +public final class space/kscience/visionforge/solid/SolidGroup : space/kscience/visionforge/AbstractVisionGroup, space/kscience/visionforge/MutableVisionContainer, space/kscience/visionforge/MutableVisionGroup, space/kscience/visionforge/solid/PrototypeHolder, space/kscience/visionforge/solid/Solid { public static final field Companion Lspace/kscience/visionforge/solid/SolidGroup$Companion; public fun ()V - public synthetic fun (ILspace/kscience/dataforge/meta/MutableMeta;Ljava/util/Map;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V - public synthetic fun createGroup ()Lspace/kscience/visionforge/VisionGroupBase; - public fun getChildren ()Ljava/util/Map; + public synthetic fun createGroup ()Lspace/kscience/visionforge/AbstractVisionGroup; + public synthetic fun createGroup ()Lspace/kscience/visionforge/MutableVisionGroup; + public fun createGroup ()Lspace/kscience/visionforge/solid/SolidGroup; + public final fun get (Lspace/kscience/dataforge/names/Name;)Lspace/kscience/visionforge/solid/Solid; public fun getDescriptor ()Lspace/kscience/dataforge/meta/descriptors/MetaDescriptor; + public final fun getItems ()Ljava/util/Map; public fun getPrototype (Lspace/kscience/dataforge/names/Name;)Lspace/kscience/visionforge/solid/Solid; public fun prototypes (Lkotlin/jvm/functions/Function1;)V - public static final fun write$Self (Lspace/kscience/visionforge/solid/SolidGroup;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V + public synthetic fun setChild (Lspace/kscience/dataforge/names/Name;Lspace/kscience/visionforge/Vision;)V + public fun setChild (Lspace/kscience/dataforge/names/Name;Lspace/kscience/visionforge/solid/Solid;)V } public final class space/kscience/visionforge/solid/SolidGroup$$serializer : kotlinx/serialization/internal/GeneratedSerializer { public static final field INSTANCE Lspace/kscience/visionforge/solid/SolidGroup$$serializer; - public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; public fun childSerializers ()[Lkotlinx/serialization/KSerializer; public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lspace/kscience/visionforge/solid/SolidGroup; @@ -610,39 +720,45 @@ public final class space/kscience/visionforge/solid/SolidGroup$Companion { public final class space/kscience/visionforge/solid/SolidGroupKt { public static final fun SolidGroup (Lkotlin/jvm/functions/Function1;)Lspace/kscience/visionforge/solid/SolidGroup; - public static final fun group (Lspace/kscience/visionforge/VisionContainerBuilder;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lspace/kscience/visionforge/solid/SolidGroup; - public static final fun group (Lspace/kscience/visionforge/VisionContainerBuilder;Lspace/kscience/dataforge/names/Name;Lkotlin/jvm/functions/Function1;)Lspace/kscience/visionforge/solid/SolidGroup; - public static synthetic fun group$default (Lspace/kscience/visionforge/VisionContainerBuilder;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lspace/kscience/visionforge/solid/SolidGroup; - public static synthetic fun group$default (Lspace/kscience/visionforge/VisionContainerBuilder;Lspace/kscience/dataforge/names/Name;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lspace/kscience/visionforge/solid/SolidGroup; + public static final fun get (Lspace/kscience/visionforge/solid/SolidGroup;Ljava/lang/String;)Lspace/kscience/visionforge/solid/Solid; + public static final fun solidGroup (Lspace/kscience/visionforge/MutableVisionContainer;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lspace/kscience/visionforge/solid/SolidGroup; + public static final fun solidGroup (Lspace/kscience/visionforge/MutableVisionContainer;Lspace/kscience/dataforge/names/Name;Lkotlin/jvm/functions/Function1;)Lspace/kscience/visionforge/solid/SolidGroup; + public static synthetic fun solidGroup$default (Lspace/kscience/visionforge/MutableVisionContainer;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lspace/kscience/visionforge/solid/SolidGroup; + public static synthetic fun solidGroup$default (Lspace/kscience/visionforge/MutableVisionContainer;Lspace/kscience/dataforge/names/Name;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lspace/kscience/visionforge/solid/SolidGroup; } public final class space/kscience/visionforge/solid/SolidKt { public static final fun getDetail (Lspace/kscience/visionforge/solid/Solid;)Ljava/lang/Integer; public static final fun getIgnore (Lspace/kscience/visionforge/Vision;)Ljava/lang/Boolean; public static final fun getLayer (Lspace/kscience/visionforge/solid/Solid;)I - public static final fun getPosition (Lspace/kscience/visionforge/solid/Solid;)Lspace/kscience/visionforge/solid/Point3D; - public static final fun getRotation (Lspace/kscience/visionforge/solid/Solid;)Lspace/kscience/visionforge/solid/Point3D; - public static final fun getRotationOrder (Lspace/kscience/visionforge/solid/Solid;)Lspace/kscience/visionforge/solid/RotationOrder; + public static final fun getPosition (Lspace/kscience/visionforge/solid/Solid;)Lspace/kscience/visionforge/solid/Float32Vector3D; + public static final fun getQuaternion (Lspace/kscience/visionforge/solid/Solid;)Lspace/kscience/kmath/complex/Quaternion; + public static final fun getQuaternionOrNull (Lspace/kscience/visionforge/solid/Solid;)Lspace/kscience/kmath/complex/Quaternion; + public static final fun getRotation (Lspace/kscience/visionforge/solid/Solid;)Lspace/kscience/visionforge/solid/Float32Vector3D; + public static final fun getRotationOrder (Lspace/kscience/visionforge/solid/Solid;)Lspace/kscience/kmath/geometry/RotationOrder; public static final fun getRotationX (Lspace/kscience/visionforge/solid/Solid;)Ljava/lang/Number; public static final fun getRotationY (Lspace/kscience/visionforge/solid/Solid;)Ljava/lang/Number; public static final fun getRotationZ (Lspace/kscience/visionforge/solid/Solid;)Ljava/lang/Number; - public static final fun getScale (Lspace/kscience/visionforge/solid/Solid;)Lspace/kscience/visionforge/solid/Point3D; + public static final fun getScale (Lspace/kscience/visionforge/solid/Solid;)Lspace/kscience/visionforge/solid/Float32Vector3D; public static final fun getScaleX (Lspace/kscience/visionforge/solid/Solid;)Ljava/lang/Number; public static final fun getScaleY (Lspace/kscience/visionforge/solid/Solid;)Ljava/lang/Number; public static final fun getScaleZ (Lspace/kscience/visionforge/solid/Solid;)Ljava/lang/Number; public static final fun getX (Lspace/kscience/visionforge/solid/Solid;)Ljava/lang/Number; public static final fun getY (Lspace/kscience/visionforge/solid/Solid;)Ljava/lang/Number; public static final fun getZ (Lspace/kscience/visionforge/solid/Solid;)Ljava/lang/Number; + public static final fun rotate (Lspace/kscience/visionforge/solid/Solid;Lspace/kscience/kmath/geometry/Angle;Lspace/kscience/kmath/geometry/Vector3D;)V public static final fun setDetail (Lspace/kscience/visionforge/solid/Solid;Ljava/lang/Integer;)V public static final fun setIgnore (Lspace/kscience/visionforge/Vision;Ljava/lang/Boolean;)V public static final fun setLayer (Lspace/kscience/visionforge/solid/Solid;I)V - public static final fun setPosition (Lspace/kscience/visionforge/solid/Solid;Lspace/kscience/visionforge/solid/Point3D;)V - public static final fun setRotation (Lspace/kscience/visionforge/solid/Solid;Lspace/kscience/visionforge/solid/Point3D;)V - public static final fun setRotationOrder (Lspace/kscience/visionforge/solid/Solid;Lspace/kscience/visionforge/solid/RotationOrder;)V + public static final fun setPosition (Lspace/kscience/visionforge/solid/Solid;Lspace/kscience/visionforge/solid/Float32Vector3D;)V + public static final fun setQuaternion (Lspace/kscience/visionforge/solid/Solid;Lspace/kscience/kmath/complex/Quaternion;)V + public static final fun setQuaternionOrNull (Lspace/kscience/visionforge/solid/Solid;Lspace/kscience/kmath/complex/Quaternion;)V + public static final fun setRotation (Lspace/kscience/visionforge/solid/Solid;Lspace/kscience/visionforge/solid/Float32Vector3D;)V + public static final fun setRotationOrder (Lspace/kscience/visionforge/solid/Solid;Lspace/kscience/kmath/geometry/RotationOrder;)V public static final fun setRotationX (Lspace/kscience/visionforge/solid/Solid;Ljava/lang/Number;)V public static final fun setRotationY (Lspace/kscience/visionforge/solid/Solid;Ljava/lang/Number;)V public static final fun setRotationZ (Lspace/kscience/visionforge/solid/Solid;Ljava/lang/Number;)V - public static final fun setScale (Lspace/kscience/visionforge/solid/Solid;Lspace/kscience/visionforge/solid/Point3D;)V + public static final fun setScale (Lspace/kscience/visionforge/solid/Solid;Lspace/kscience/visionforge/solid/Float32Vector3D;)V public static final fun setScaleX (Lspace/kscience/visionforge/solid/Solid;Ljava/lang/Number;)V public static final fun setScaleY (Lspace/kscience/visionforge/solid/Solid;Ljava/lang/Number;)V public static final fun setScaleZ (Lspace/kscience/visionforge/solid/Solid;Ljava/lang/Number;)V @@ -651,19 +767,16 @@ public final class space/kscience/visionforge/solid/SolidKt { public static final fun setZ (Lspace/kscience/visionforge/solid/Solid;Ljava/lang/Number;)V } -public final class space/kscience/visionforge/solid/SolidLabel : space/kscience/visionforge/solid/SolidBase, space/kscience/visionforge/VisionPropertyContainer { +public final class space/kscience/visionforge/solid/SolidLabel : space/kscience/visionforge/solid/SolidBase { public static final field Companion Lspace/kscience/visionforge/solid/SolidLabel$Companion; - public synthetic fun (ILspace/kscience/dataforge/meta/MutableMeta;Ljava/lang/String;DLjava/lang/String;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V public fun (Ljava/lang/String;DLjava/lang/String;)V public final fun getFontFamily ()Ljava/lang/String; public final fun getFontSize ()D public final fun getText ()Ljava/lang/String; - public static final fun write$Self (Lspace/kscience/visionforge/solid/SolidLabel;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V } public final class space/kscience/visionforge/solid/SolidLabel$$serializer : kotlinx/serialization/internal/GeneratedSerializer { public static final field INSTANCE Lspace/kscience/visionforge/solid/SolidLabel$$serializer; - public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; public fun childSerializers ()[Lkotlinx/serialization/KSerializer; public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lspace/kscience/visionforge/solid/SolidLabel; @@ -678,8 +791,8 @@ public final class space/kscience/visionforge/solid/SolidLabel$Companion { } public final class space/kscience/visionforge/solid/SolidLabelKt { - public static final fun label (Lspace/kscience/visionforge/VisionContainerBuilder;Ljava/lang/String;Ljava/lang/Number;Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lspace/kscience/visionforge/solid/SolidLabel; - public static synthetic fun label$default (Lspace/kscience/visionforge/VisionContainerBuilder;Ljava/lang/String;Ljava/lang/Number;Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lspace/kscience/visionforge/solid/SolidLabel; + public static final fun label (Lspace/kscience/visionforge/MutableVisionContainer;Ljava/lang/String;Ljava/lang/Number;Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lspace/kscience/visionforge/solid/SolidLabel; + public static synthetic fun label$default (Lspace/kscience/visionforge/MutableVisionContainer;Ljava/lang/String;Ljava/lang/Number;Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lspace/kscience/visionforge/solid/SolidLabel; } public final class space/kscience/visionforge/solid/SolidMaterial : space/kscience/dataforge/meta/Scheme { @@ -697,17 +810,26 @@ public final class space/kscience/visionforge/solid/SolidMaterial : space/kscien public final class space/kscience/visionforge/solid/SolidMaterial$Companion : space/kscience/dataforge/meta/SchemeSpec { public final fun getCOLOR_KEY ()Lspace/kscience/dataforge/names/Name; public fun getDescriptor ()Lspace/kscience/dataforge/meta/descriptors/MetaDescriptor; + public final fun getEDGES_ENABLED_KEY ()Lspace/kscience/dataforge/names/Name; + public final fun getEDGES_KEY ()Lspace/kscience/dataforge/names/Name; + public final fun getEDGES_MATERIAL_KEY ()Lspace/kscience/dataforge/names/Name; + public final fun getEMISSIVE_COLOR_KEY ()Lspace/kscience/dataforge/names/Name; + public final fun getENABLED_KEY ()Lspace/kscience/dataforge/names/Name; public final fun getMATERIAL_COLOR_KEY ()Lspace/kscience/dataforge/names/Name; + public final fun getMATERIAL_EMISSIVE_COLOR_KEY ()Lspace/kscience/dataforge/names/Name; public final fun getMATERIAL_KEY ()Lspace/kscience/dataforge/names/Name; public final fun getMATERIAL_OPACITY_KEY ()Lspace/kscience/dataforge/names/Name; public final fun getMATERIAL_SPECULAR_COLOR_KEY ()Lspace/kscience/dataforge/names/Name; public final fun getMATERIAL_WIREFRAME_KEY ()Lspace/kscience/dataforge/names/Name; public final fun getOPACITY_KEY ()Lspace/kscience/dataforge/names/Name; public final fun getSPECULAR_COLOR_KEY ()Lspace/kscience/dataforge/names/Name; + public final fun getTYPE_KEY ()Lspace/kscience/dataforge/names/Name; public final fun getWIREFRAME_KEY ()Lspace/kscience/dataforge/names/Name; } public final class space/kscience/visionforge/solid/SolidMaterialKt { + public static final fun edges (Lspace/kscience/visionforge/solid/Solid;ZLkotlin/jvm/functions/Function1;)V + public static synthetic fun edges$default (Lspace/kscience/visionforge/solid/Solid;ZLkotlin/jvm/functions/Function1;ILjava/lang/Object;)V public static final fun getColor (Lspace/kscience/visionforge/solid/Solid;)Lspace/kscience/visionforge/solid/ColorAccessor; public static final fun getMaterial (Lspace/kscience/visionforge/solid/Solid;)Lspace/kscience/visionforge/solid/SolidMaterial; public static final fun getOpacity (Lspace/kscience/visionforge/solid/Solid;)Ljava/lang/Number; @@ -716,87 +838,80 @@ public final class space/kscience/visionforge/solid/SolidMaterialKt { public static final fun setOpacity (Lspace/kscience/visionforge/solid/Solid;Ljava/lang/Number;)V } -public abstract interface class space/kscience/visionforge/solid/SolidReference : space/kscience/visionforge/VisionGroup { - public fun getProperty (Lspace/kscience/dataforge/names/Name;ZZZ)Lspace/kscience/dataforge/values/Value; - public abstract fun getPrototype ()Lspace/kscience/visionforge/solid/Solid; -} - -public final class space/kscience/visionforge/solid/SolidReferenceGroup : space/kscience/visionforge/VisionBase, space/kscience/visionforge/VisionGroup, space/kscience/visionforge/solid/Solid, space/kscience/visionforge/solid/SolidReference { - public static final field Companion Lspace/kscience/visionforge/solid/SolidReferenceGroup$Companion; +public final class space/kscience/visionforge/solid/SolidReference : space/kscience/visionforge/VisionGroup, space/kscience/visionforge/solid/Solid { + public static final field Companion Lspace/kscience/visionforge/solid/SolidReference$Companion; public static final field REFERENCE_CHILD_PROPERTY_PREFIX Ljava/lang/String; - public synthetic fun (ILspace/kscience/dataforge/meta/MutableMeta;Lspace/kscience/dataforge/names/Name;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V public fun (Lspace/kscience/dataforge/names/Name;)V - public fun getChildren ()Ljava/util/Map; + public fun getChildren ()Lspace/kscience/visionforge/VisionChildren; public fun getDescriptor ()Lspace/kscience/dataforge/meta/descriptors/MetaDescriptor; - public fun getProperty (Lspace/kscience/dataforge/names/Name;ZZZ)Lspace/kscience/dataforge/values/Value; - public fun getPrototype ()Lspace/kscience/visionforge/solid/Solid; - public final fun getRefName ()Lspace/kscience/dataforge/names/Name; - public static final fun write$Self (Lspace/kscience/visionforge/solid/SolidReferenceGroup;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V + public fun getParent ()Lspace/kscience/visionforge/Vision; + public fun getProperties ()Lspace/kscience/visionforge/MutableVisionProperties; + public final fun getPrototype ()Lspace/kscience/visionforge/solid/Solid; + public final fun getPrototypeName ()Lspace/kscience/dataforge/names/Name; + public fun setParent (Lspace/kscience/visionforge/Vision;)V } -public final class space/kscience/visionforge/solid/SolidReferenceGroup$$serializer : kotlinx/serialization/internal/GeneratedSerializer { - public static final field INSTANCE Lspace/kscience/visionforge/solid/SolidReferenceGroup$$serializer; - public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; +public final class space/kscience/visionforge/solid/SolidReference$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lspace/kscience/visionforge/solid/SolidReference$$serializer; public fun childSerializers ()[Lkotlinx/serialization/KSerializer; public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; - public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lspace/kscience/visionforge/solid/SolidReferenceGroup; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lspace/kscience/visionforge/solid/SolidReference; public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V - public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lspace/kscience/visionforge/solid/SolidReferenceGroup;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lspace/kscience/visionforge/solid/SolidReference;)V public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; } -public final class space/kscience/visionforge/solid/SolidReferenceGroup$Companion { +public final class space/kscience/visionforge/solid/SolidReference$Companion { public final fun serializer ()Lkotlinx/serialization/KSerializer; } public final class space/kscience/visionforge/solid/SolidReferenceKt { - public static final fun getUnref (Lspace/kscience/visionforge/Vision;)Lspace/kscience/visionforge/solid/Solid; - public static final fun newRef (Lspace/kscience/visionforge/solid/SolidGroup;Ljava/lang/String;Lspace/kscience/visionforge/solid/Solid;Lspace/kscience/visionforge/solid/PrototypeHolder;Lspace/kscience/dataforge/names/Name;)Lspace/kscience/visionforge/solid/SolidReferenceGroup; - public static synthetic fun newRef$default (Lspace/kscience/visionforge/solid/SolidGroup;Ljava/lang/String;Lspace/kscience/visionforge/solid/Solid;Lspace/kscience/visionforge/solid/PrototypeHolder;Lspace/kscience/dataforge/names/Name;ILjava/lang/Object;)Lspace/kscience/visionforge/solid/SolidReferenceGroup; - public static final fun ref (Lspace/kscience/visionforge/solid/SolidGroup;Ljava/lang/String;Ljava/lang/String;)Lspace/kscience/visionforge/solid/SolidReferenceGroup; - public static final fun ref (Lspace/kscience/visionforge/solid/SolidGroup;Lspace/kscience/dataforge/names/Name;Ljava/lang/String;)Lspace/kscience/visionforge/solid/SolidReferenceGroup; - public static synthetic fun ref$default (Lspace/kscience/visionforge/solid/SolidGroup;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Lspace/kscience/visionforge/solid/SolidReferenceGroup; - public static synthetic fun ref$default (Lspace/kscience/visionforge/solid/SolidGroup;Lspace/kscience/dataforge/names/Name;Ljava/lang/String;ILjava/lang/Object;)Lspace/kscience/visionforge/solid/SolidReferenceGroup; + public static final fun getPrototype (Lspace/kscience/visionforge/Vision;)Lspace/kscience/visionforge/solid/Solid; + public static final fun newRef (Lspace/kscience/visionforge/solid/SolidGroup;Ljava/lang/String;Lspace/kscience/visionforge/solid/Solid;Lspace/kscience/visionforge/solid/SolidGroup;Lspace/kscience/dataforge/names/Name;)Lspace/kscience/visionforge/solid/SolidReference; + public static synthetic fun newRef$default (Lspace/kscience/visionforge/solid/SolidGroup;Ljava/lang/String;Lspace/kscience/visionforge/solid/Solid;Lspace/kscience/visionforge/solid/SolidGroup;Lspace/kscience/dataforge/names/Name;ILjava/lang/Object;)Lspace/kscience/visionforge/solid/SolidReference; + public static final fun ref (Lspace/kscience/visionforge/MutableVisionContainer;Lspace/kscience/dataforge/names/Name;Ljava/lang/String;)Lspace/kscience/visionforge/solid/SolidReference; + public static final fun ref (Lspace/kscience/visionforge/MutableVisionContainer;Lspace/kscience/dataforge/names/Name;Lspace/kscience/dataforge/names/Name;)Lspace/kscience/visionforge/solid/SolidReference; + public static synthetic fun ref$default (Lspace/kscience/visionforge/MutableVisionContainer;Lspace/kscience/dataforge/names/Name;Lspace/kscience/dataforge/names/Name;ILjava/lang/Object;)Lspace/kscience/visionforge/solid/SolidReference; } -public final class space/kscience/visionforge/solid/Solids : space/kscience/visionforge/VisionPlugin { +public final class space/kscience/visionforge/solid/Solids : space/kscience/visionforge/VisionPlugin, space/kscience/visionforge/MutableVisionContainer { public static final field Companion Lspace/kscience/visionforge/solid/Solids$Companion; public fun (Lspace/kscience/dataforge/meta/Meta;)V public fun getTag ()Lspace/kscience/dataforge/context/PluginTag; + public synthetic fun setChild (Lspace/kscience/dataforge/names/Name;Lspace/kscience/visionforge/Vision;)V + public fun setChild (Lspace/kscience/dataforge/names/Name;Lspace/kscience/visionforge/solid/Solid;)V } public final class space/kscience/visionforge/solid/Solids$Companion : space/kscience/dataforge/context/PluginFactory { + public synthetic fun build (Lspace/kscience/dataforge/context/Context;Lspace/kscience/dataforge/meta/Meta;)Ljava/lang/Object; + public fun build (Lspace/kscience/dataforge/context/Context;Lspace/kscience/dataforge/meta/Meta;)Lspace/kscience/visionforge/solid/Solids; public final fun decodeFromString (Ljava/lang/String;)Lspace/kscience/visionforge/solid/Solid; public final fun encodeToString (Lspace/kscience/visionforge/solid/Solid;)Ljava/lang/String; public final fun getSerializersModuleForSolids ()Lkotlinx/serialization/modules/SerializersModule; public fun getTag ()Lspace/kscience/dataforge/context/PluginTag; - public fun getType ()Lkotlin/reflect/KClass; - public synthetic fun invoke (Lspace/kscience/dataforge/meta/Meta;Lspace/kscience/dataforge/context/Context;)Ljava/lang/Object; - public fun invoke (Lspace/kscience/dataforge/meta/Meta;Lspace/kscience/dataforge/context/Context;)Lspace/kscience/visionforge/solid/Solids; } public final class space/kscience/visionforge/solid/SolidsKt { - public static final fun solid (Lspace/kscience/visionforge/html/VisionOutput;Lkotlin/jvm/functions/Function1;)Lspace/kscience/visionforge/solid/SolidGroup; + public static final fun solid (Lspace/kscience/visionforge/html/VisionOutput;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)Lspace/kscience/visionforge/solid/SolidGroup; + public static final fun solid (Lspace/kscience/visionforge/html/VisionOutput;Lspace/kscience/visionforge/solid/specifications/Canvas3DOptions;Lkotlin/jvm/functions/Function1;)Lspace/kscience/visionforge/solid/SolidGroup; + public static synthetic fun solid$default (Lspace/kscience/visionforge/html/VisionOutput;Lspace/kscience/visionforge/solid/specifications/Canvas3DOptions;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lspace/kscience/visionforge/solid/SolidGroup; } -public final class space/kscience/visionforge/solid/Sphere : space/kscience/visionforge/solid/SolidBase, space/kscience/visionforge/VisionPropertyContainer, space/kscience/visionforge/solid/GeometrySolid { +public final class space/kscience/visionforge/solid/Sphere : space/kscience/visionforge/solid/SolidBase, space/kscience/visionforge/solid/GeometrySolid { public static final field Companion Lspace/kscience/visionforge/solid/Sphere$Companion; public fun (FFFFF)V public synthetic fun (FFFFFILkotlin/jvm/internal/DefaultConstructorMarker;)V - public synthetic fun (ILspace/kscience/dataforge/meta/MutableMeta;FFFFFLkotlinx/serialization/internal/SerializationConstructorMarker;)V public final fun getPhi ()F public final fun getPhiStart ()F public final fun getRadius ()F public final fun getTheta ()F public final fun getThetaStart ()F public fun toGeometry (Lspace/kscience/visionforge/solid/GeometryBuilder;)V - public static final fun write$Self (Lspace/kscience/visionforge/solid/Sphere;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V } public final class space/kscience/visionforge/solid/Sphere$$serializer : kotlinx/serialization/internal/GeneratedSerializer { public static final field INSTANCE Lspace/kscience/visionforge/solid/Sphere$$serializer; - public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; public fun childSerializers ()[Lkotlinx/serialization/KSerializer; public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lspace/kscience/visionforge/solid/Sphere; @@ -811,15 +926,14 @@ public final class space/kscience/visionforge/solid/Sphere$Companion { } public final class space/kscience/visionforge/solid/SphereKt { - public static final fun sphere (Lspace/kscience/visionforge/VisionContainerBuilder;Ljava/lang/Number;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lspace/kscience/visionforge/solid/Sphere; - public static synthetic fun sphere$default (Lspace/kscience/visionforge/VisionContainerBuilder;Ljava/lang/Number;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lspace/kscience/visionforge/solid/Sphere; + public static final fun sphere (Lspace/kscience/visionforge/MutableVisionContainer;Ljava/lang/Number;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lspace/kscience/visionforge/solid/Sphere; + public static synthetic fun sphere$default (Lspace/kscience/visionforge/MutableVisionContainer;Ljava/lang/Number;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lspace/kscience/visionforge/solid/Sphere; } public final class space/kscience/visionforge/solid/SphereLayer : space/kscience/visionforge/solid/SolidBase, space/kscience/visionforge/solid/GeometrySolid { public static final field Companion Lspace/kscience/visionforge/solid/SphereLayer$Companion; public fun (FFFFFF)V public synthetic fun (FFFFFFILkotlin/jvm/internal/DefaultConstructorMarker;)V - public synthetic fun (ILspace/kscience/dataforge/meta/MutableMeta;FFFFFFLkotlinx/serialization/internal/SerializationConstructorMarker;)V public final fun getInnerRadius ()F public final fun getOuterRadius ()F public final fun getPhi ()F @@ -827,12 +941,10 @@ public final class space/kscience/visionforge/solid/SphereLayer : space/kscience public final fun getTheta ()F public final fun getThetaStart ()F public fun toGeometry (Lspace/kscience/visionforge/solid/GeometryBuilder;)V - public static final fun write$Self (Lspace/kscience/visionforge/solid/SphereLayer;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V } public final class space/kscience/visionforge/solid/SphereLayer$$serializer : kotlinx/serialization/internal/GeneratedSerializer { public static final field INSTANCE Lspace/kscience/visionforge/solid/SphereLayer$$serializer; - public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor; public fun childSerializers ()[Lkotlinx/serialization/KSerializer; public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lspace/kscience/visionforge/solid/SphereLayer; @@ -847,14 +959,138 @@ public final class space/kscience/visionforge/solid/SphereLayer$Companion { } public final class space/kscience/visionforge/solid/SphereLayerKt { - public static final fun sphereLayer (Lspace/kscience/visionforge/VisionContainerBuilder;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lspace/kscience/visionforge/solid/SphereLayer; - public static synthetic fun sphereLayer$default (Lspace/kscience/visionforge/VisionContainerBuilder;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lspace/kscience/visionforge/solid/SphereLayer; + public static final fun sphereLayer (Lspace/kscience/visionforge/MutableVisionContainer;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lspace/kscience/visionforge/solid/SphereLayer; + public static synthetic fun sphereLayer$default (Lspace/kscience/visionforge/MutableVisionContainer;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lspace/kscience/visionforge/solid/SphereLayer; } -public final class space/kscience/visionforge/solid/specifications/Axes : space/kscience/dataforge/meta/Scheme { +public final class space/kscience/visionforge/solid/StlBinarySolid : space/kscience/visionforge/solid/StlSolid { + public static final field Companion Lspace/kscience/visionforge/solid/StlBinarySolid$Companion; + public fun ([B)V + public final fun getData ()[B +} + +public final class space/kscience/visionforge/solid/StlBinarySolid$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lspace/kscience/visionforge/solid/StlBinarySolid$$serializer; + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lspace/kscience/visionforge/solid/StlBinarySolid; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lspace/kscience/visionforge/solid/StlBinarySolid;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class space/kscience/visionforge/solid/StlBinarySolid$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public abstract class space/kscience/visionforge/solid/StlSolid : space/kscience/visionforge/solid/SolidBase { +} + +public final class space/kscience/visionforge/solid/StlSolidKt { + public static final fun stl (Lspace/kscience/visionforge/MutableVisionContainer;Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lspace/kscience/visionforge/solid/StlSolid; + public static synthetic fun stl$default (Lspace/kscience/visionforge/MutableVisionContainer;Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lspace/kscience/visionforge/solid/StlSolid; +} + +public final class space/kscience/visionforge/solid/StlUrlSolid : space/kscience/visionforge/solid/StlSolid { + public static final field Companion Lspace/kscience/visionforge/solid/StlUrlSolid$Companion; + public fun (Ljava/lang/String;)V + public final fun getUrl ()Ljava/lang/String; +} + +public final class space/kscience/visionforge/solid/StlUrlSolid$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lspace/kscience/visionforge/solid/StlUrlSolid$$serializer; + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lspace/kscience/visionforge/solid/StlUrlSolid; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lspace/kscience/visionforge/solid/StlUrlSolid;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class space/kscience/visionforge/solid/StlUrlSolid$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class space/kscience/visionforge/solid/Surface : space/kscience/visionforge/solid/SolidBase, space/kscience/visionforge/solid/GeometrySolid { + public static final field Companion Lspace/kscience/visionforge/solid/Surface$Companion; + public static final field TYPE Ljava/lang/String; + public fun (Ljava/util/List;)V + public final fun getLayers ()Ljava/util/List; + public fun toGeometry (Lspace/kscience/visionforge/solid/GeometryBuilder;)V +} + +public final class space/kscience/visionforge/solid/Surface$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lspace/kscience/visionforge/solid/Surface$$serializer; + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lspace/kscience/visionforge/solid/Surface; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lspace/kscience/visionforge/solid/Surface;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class space/kscience/visionforge/solid/Surface$Builder { + public fun ()V + public fun (Ljava/util/List;Lspace/kscience/dataforge/meta/MutableMeta;)V + public synthetic fun (Ljava/util/List;Lspace/kscience/dataforge/meta/MutableMeta;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun getLayers ()Ljava/util/List; + public final fun getProperties ()Lspace/kscience/dataforge/meta/MutableMeta; + public final fun layer (Ljava/lang/Number;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)V + public static synthetic fun layer$default (Lspace/kscience/visionforge/solid/Surface$Builder;Ljava/lang/Number;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)V + public final fun setLayers (Ljava/util/List;)V +} + +public final class space/kscience/visionforge/solid/Surface$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class space/kscience/visionforge/solid/Surface$Layer { + public static final field Companion Lspace/kscience/visionforge/solid/Surface$Layer$Companion; + public fun (FLjava/util/List;Ljava/util/List;)V + public final fun component1 ()F + public final fun component2 ()Ljava/util/List; + public final fun component3 ()Ljava/util/List; + public final fun copy (FLjava/util/List;Ljava/util/List;)Lspace/kscience/visionforge/solid/Surface$Layer; + public static synthetic fun copy$default (Lspace/kscience/visionforge/solid/Surface$Layer;FLjava/util/List;Ljava/util/List;ILjava/lang/Object;)Lspace/kscience/visionforge/solid/Surface$Layer; + public fun equals (Ljava/lang/Object;)Z + public final fun getCenter ()Lspace/kscience/visionforge/solid/Float32Vector3D; + public final fun getInner ()Ljava/util/List; + public final fun getOuter ()Ljava/util/List; + public final fun getSize ()I + public final fun getZ ()F + public fun hashCode ()I + public final fun innerPoints ()Ljava/util/List; + public final fun outerPoints ()Ljava/util/List; + public fun toString ()Ljava/lang/String; +} + +public final class space/kscience/visionforge/solid/Surface$Layer$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lspace/kscience/visionforge/solid/Surface$Layer$$serializer; + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lspace/kscience/visionforge/solid/Surface$Layer; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lspace/kscience/visionforge/solid/Surface$Layer;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class space/kscience/visionforge/solid/Surface$Layer$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class space/kscience/visionforge/solid/SurfaceKt { + public static final fun surface (Lspace/kscience/visionforge/MutableVisionContainer;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lspace/kscience/visionforge/solid/Surface; + public static synthetic fun surface$default (Lspace/kscience/visionforge/MutableVisionContainer;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lspace/kscience/visionforge/solid/Surface; +} + +public final class space/kscience/visionforge/solid/specifications/AxesScheme : space/kscience/dataforge/meta/Scheme { public static final field AXIS_SIZE D public static final field AXIS_WIDTH D - public static final field Companion Lspace/kscience/visionforge/solid/specifications/Axes$Companion; + public static final field Companion Lspace/kscience/visionforge/solid/specifications/AxesScheme$Companion; public fun ()V public final fun getSize ()D public final fun getVisible ()Z @@ -864,12 +1100,12 @@ public final class space/kscience/visionforge/solid/specifications/Axes : space/ public final fun setWidth (D)V } -public final class space/kscience/visionforge/solid/specifications/Axes$Companion : space/kscience/dataforge/meta/SchemeSpec { +public final class space/kscience/visionforge/solid/specifications/AxesScheme$Companion : space/kscience/dataforge/meta/SchemeSpec { public fun getDescriptor ()Lspace/kscience/dataforge/meta/descriptors/MetaDescriptor; } -public final class space/kscience/visionforge/solid/specifications/Camera : space/kscience/dataforge/meta/Scheme { - public static final field Companion Lspace/kscience/visionforge/solid/specifications/Camera$Companion; +public final class space/kscience/visionforge/solid/specifications/CameraScheme : space/kscience/dataforge/meta/Scheme { + public static final field Companion Lspace/kscience/visionforge/solid/specifications/CameraScheme$Companion; public static final field FAR_CLIP D public static final field FIELD_OF_VIEW I public static final field INITIAL_AZIMUTH D @@ -891,31 +1127,29 @@ public final class space/kscience/visionforge/solid/specifications/Camera : spac public final fun setNearClip (D)V } -public final class space/kscience/visionforge/solid/specifications/Camera$Companion : space/kscience/dataforge/meta/SchemeSpec { +public final class space/kscience/visionforge/solid/specifications/CameraScheme$Companion : space/kscience/dataforge/meta/SchemeSpec { public fun getDescriptor ()Lspace/kscience/dataforge/meta/descriptors/MetaDescriptor; } -public final class space/kscience/visionforge/solid/specifications/CameraKt { - public static final fun getZenith (Lspace/kscience/visionforge/solid/specifications/Camera;)D +public final class space/kscience/visionforge/solid/specifications/CameraSchemeKt { + public static final fun getZenith (Lspace/kscience/visionforge/solid/specifications/CameraScheme;)D } public final class space/kscience/visionforge/solid/specifications/Canvas3DOptions : space/kscience/dataforge/meta/Scheme { public static final field Companion Lspace/kscience/visionforge/solid/specifications/Canvas3DOptions$Companion; public fun ()V - public final fun getAxes ()Lspace/kscience/visionforge/solid/specifications/Axes; - public final fun getCamera ()Lspace/kscience/visionforge/solid/specifications/Camera; - public final fun getClipping ()Lspace/kscience/visionforge/solid/specifications/Clipping; - public final fun getControls ()Lspace/kscience/visionforge/solid/specifications/Controls; + public final fun getAxes ()Lspace/kscience/visionforge/solid/specifications/AxesScheme; + public final fun getCamera ()Lspace/kscience/visionforge/solid/specifications/CameraScheme; + public final fun getClipping ()Lspace/kscience/visionforge/solid/specifications/PointScheme; + public final fun getControls ()Lspace/kscience/visionforge/solid/specifications/ControlsScheme; public final fun getLayers ()Ljava/util/List; - public final fun getLight ()Lspace/kscience/visionforge/solid/specifications/Light; public final fun getOnSelect ()Lkotlin/jvm/functions/Function1; public final fun getSize ()Lspace/kscience/visionforge/solid/specifications/CanvasSize; - public final fun setAxes (Lspace/kscience/visionforge/solid/specifications/Axes;)V - public final fun setCamera (Lspace/kscience/visionforge/solid/specifications/Camera;)V - public final fun setClipping (Lspace/kscience/visionforge/solid/specifications/Clipping;)V - public final fun setControls (Lspace/kscience/visionforge/solid/specifications/Controls;)V + public final fun setAxes (Lspace/kscience/visionforge/solid/specifications/AxesScheme;)V + public final fun setCamera (Lspace/kscience/visionforge/solid/specifications/CameraScheme;)V + public final fun setClipping (Lspace/kscience/visionforge/solid/specifications/PointScheme;)V + public final fun setControls (Lspace/kscience/visionforge/solid/specifications/ControlsScheme;)V public final fun setLayers (Ljava/util/List;)V - public final fun setLight (Lspace/kscience/visionforge/solid/specifications/Light;)V public final fun setOnSelect (Lkotlin/jvm/functions/Function1;)V public final fun setSize (Lspace/kscience/visionforge/solid/specifications/CanvasSize;)V } @@ -950,8 +1184,21 @@ public final class space/kscience/visionforge/solid/specifications/CanvasSize$Co public fun getDescriptor ()Lspace/kscience/dataforge/meta/descriptors/MetaDescriptor; } -public final class space/kscience/visionforge/solid/specifications/Clipping : space/kscience/dataforge/meta/Scheme { - public static final field Companion Lspace/kscience/visionforge/solid/specifications/Clipping$Companion; +public final class space/kscience/visionforge/solid/specifications/Clipping : space/kscience/dataforge/meta/SchemeSpec { + public static final field INSTANCE Lspace/kscience/visionforge/solid/specifications/Clipping; + public fun getDescriptor ()Lspace/kscience/dataforge/meta/descriptors/MetaDescriptor; +} + +public final class space/kscience/visionforge/solid/specifications/ControlsScheme : space/kscience/dataforge/meta/Scheme { + public static final field Companion Lspace/kscience/visionforge/solid/specifications/ControlsScheme$Companion; + public fun ()V +} + +public final class space/kscience/visionforge/solid/specifications/ControlsScheme$Companion : space/kscience/dataforge/meta/SchemeSpec { +} + +public final class space/kscience/visionforge/solid/specifications/PointScheme : space/kscience/dataforge/meta/Scheme { + public static final field Companion Lspace/kscience/visionforge/solid/specifications/PointScheme$Companion; public fun ()V public final fun getX ()Ljava/lang/Double; public final fun getY ()Ljava/lang/Double; @@ -961,24 +1208,11 @@ public final class space/kscience/visionforge/solid/specifications/Clipping : sp public final fun setZ (Ljava/lang/Double;)V } -public final class space/kscience/visionforge/solid/specifications/Clipping$Companion : space/kscience/dataforge/meta/SchemeSpec { - public fun getDescriptor ()Lspace/kscience/dataforge/meta/descriptors/MetaDescriptor; +public final class space/kscience/visionforge/solid/specifications/PointScheme$Companion : space/kscience/dataforge/meta/SchemeSpec { } -public final class space/kscience/visionforge/solid/specifications/Controls : space/kscience/dataforge/meta/Scheme { - public static final field Companion Lspace/kscience/visionforge/solid/specifications/Controls$Companion; - public fun ()V -} - -public final class space/kscience/visionforge/solid/specifications/Controls$Companion : space/kscience/dataforge/meta/SchemeSpec { -} - -public final class space/kscience/visionforge/solid/specifications/Light : space/kscience/dataforge/meta/Scheme { - public static final field Companion Lspace/kscience/visionforge/solid/specifications/Light$Companion; - public fun ()V -} - -public final class space/kscience/visionforge/solid/specifications/Light$Companion : space/kscience/dataforge/meta/SchemeSpec { +public final class space/kscience/visionforge/solid/specifications/PointSchemeKt { + public static final fun invoke (Lspace/kscience/visionforge/solid/specifications/PointScheme;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;)V } public abstract class space/kscience/visionforge/solid/transform/VisualTreeTransform { diff --git a/visionforge-tables/README.md b/visionforge-tables/README.md index 6cdbd356..b02284f8 100644 --- a/visionforge-tables/README.md +++ b/visionforge-tables/README.md @@ -6,19 +6,8 @@ ## Artifact: -The Maven coordinates of this project are `space.kscience:visionforge-tables:0.2.0`. +The Maven coordinates of this project are `space.kscience:visionforge-tables:0.3.0-rc`. -**Gradle Groovy:** -```groovy -repositories { - maven { url 'https://repo.kotlin.link' } - mavenCentral() -} - -dependencies { - implementation 'space.kscience:visionforge-tables:0.2.0' -} -``` **Gradle Kotlin DSL:** ```kotlin repositories { @@ -27,6 +16,6 @@ repositories { } dependencies { - implementation("space.kscience:visionforge-tables:0.2.0") + implementation("space.kscience:visionforge-tables:0.3.0-rc") } ``` diff --git a/visionforge-threejs/README.md b/visionforge-threejs/README.md index 98c13b7a..3b26d996 100644 --- a/visionforge-threejs/README.md +++ b/visionforge-threejs/README.md @@ -6,19 +6,8 @@ ## Artifact: -The Maven coordinates of this project are `space.kscience:visionforge-threejs:0.2.0`. +The Maven coordinates of this project are `space.kscience:visionforge-threejs:0.3.0-rc`. -**Gradle Groovy:** -```groovy -repositories { - maven { url 'https://repo.kotlin.link' } - mavenCentral() -} - -dependencies { - implementation 'space.kscience:visionforge-threejs:0.2.0' -} -``` **Gradle Kotlin DSL:** ```kotlin repositories { @@ -27,6 +16,6 @@ repositories { } dependencies { - implementation("space.kscience:visionforge-threejs:0.2.0") + implementation("space.kscience:visionforge-threejs:0.3.0-rc") } ``` diff --git a/visionforge-threejs/visionforge-threejs-server/README.md b/visionforge-threejs/visionforge-threejs-server/README.md index 0b9d9e4e..16ac3520 100644 --- a/visionforge-threejs/visionforge-threejs-server/README.md +++ b/visionforge-threejs/visionforge-threejs-server/README.md @@ -6,19 +6,8 @@ ## Artifact: -The Maven coordinates of this project are `space.kscience:visionforge-threejs-server:0.2.0`. +The Maven coordinates of this project are `space.kscience:visionforge-threejs-server:0.3.0-rc`. -**Gradle Groovy:** -```groovy -repositories { - maven { url 'https://repo.kotlin.link' } - mavenCentral() -} - -dependencies { - implementation 'space.kscience:visionforge-threejs-server:0.2.0' -} -``` **Gradle Kotlin DSL:** ```kotlin repositories { @@ -27,6 +16,6 @@ repositories { } dependencies { - implementation("space.kscience:visionforge-threejs-server:0.2.0") + implementation("space.kscience:visionforge-threejs-server:0.3.0-rc") } ``` diff --git a/visionforge-threejs/visionforge-threejs-server/api/visionforge-threejs-server.api b/visionforge-threejs/visionforge-threejs-server/api/visionforge-threejs-server.api index d2d708d9..8d46c793 100644 --- a/visionforge-threejs/visionforge-threejs-server/api/visionforge-threejs-server.api +++ b/visionforge-threejs/visionforge-threejs-server/api/visionforge-threejs-server.api @@ -1,6 +1,6 @@ public final class space/kscience/visionforge/three/ServerExtensionsKt { - public static final fun getThreeJsHeader (Lspace/kscience/visionforge/html/Page$Companion;)Lkotlin/jvm/functions/Function1; - public static final fun makeThreeJsFile (Ljava/nio/file/Path;Ljava/lang/String;Lspace/kscience/visionforge/html/ResourceLocation;ZLkotlin/jvm/functions/Function1;)V - public static synthetic fun makeThreeJsFile$default (Ljava/nio/file/Path;Ljava/lang/String;Lspace/kscience/visionforge/html/ResourceLocation;ZLkotlin/jvm/functions/Function1;ILjava/lang/Object;)V + public static final fun getThreeJsHeader (Lspace/kscience/visionforge/html/VisionPage$Companion;)Lspace/kscience/visionforge/html/HtmlFragment; + public static final fun makeThreeJsFile (Ljava/nio/file/Path;Ljava/lang/String;Lspace/kscience/visionforge/html/ResourceLocation;ZLspace/kscience/visionforge/html/HtmlVisionFragment;)V + public static synthetic fun makeThreeJsFile$default (Ljava/nio/file/Path;Ljava/lang/String;Lspace/kscience/visionforge/html/ResourceLocation;ZLspace/kscience/visionforge/html/HtmlVisionFragment;ILjava/lang/Object;)V } From 4f6f4b92685c29e31e65f5f2792e8b4e1753261d Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Mon, 18 Dec 2023 09:41:05 +0300 Subject: [PATCH 17/41] Moving to compose --- CHANGELOG.md | 1 + build.gradle.kts | 13 +- demo/gdml/build.gradle.kts | 7 - .../visionforge/gdml/demo/GDMLAppComponent.kt | 76 ++--- .../visionforge/gdml/demo/GdmlJsDemoApp.kt | 61 ++-- demo/js-playground/build.gradle.kts | 9 - .../src/jsMain/kotlin/JsPlaygroundApp.kt | 98 +++--- .../src/jsMain/kotlin/gravityDemo.kt | 212 ++++++++----- .../src/jsMain/kotlin/markupComponent.kt | 55 ---- .../src/jsMain/kotlin/plotlyComponent.kt | 43 --- demo/muon-monitor/build.gradle.kts | 9 +- .../mipt/npm/muon/monitor/MMAppComponent.kt | 293 ++++-------------- .../ru/mipt/npm/muon/monitor/MMDemoApp.kt | 12 +- demo/playground/build.gradle.kts | 8 - .../src/jsMain/kotlin/playgroundMain.kt | 4 +- demo/sat-demo/build.gradle.kts | 5 + .../visionforge/solid/demo/ThreeDemoGrid.kt | 2 +- settings.gradle.kts | 2 +- .../visionforge/compose/ThreeCanvas.kt | 52 ---- .../compose/ThreeViewWithControls.kt | 169 ---------- .../ThreeWithControlsPlugin.kt | 18 +- .../build.gradle.kts | 9 +- .../visionforge/compose/MetaViewer.kt | 1 - .../visionforge/compose/NameCrumbs.kt | 0 .../visionforge/compose/PropertyEditor.kt | 0 .../kscience/visionforge/compose/Tabs.kt | 0 .../visionforge/compose/TreeStyles.kt | 0 .../visionforge/compose/VisionTree.kt | 0 .../kscience/visionforge/compose/bootstrap.kt | 0 .../visionforge/compose/composeVision.kt | 49 +++ .../space/kscience/visionforge/compose/css.kt | 0 .../kscience/visionforge/compose/layouts.kt | 0 .../visionforge/compose/valueChooser.kt | 4 +- visionforge-core/api/visionforge-core.api | 50 ++- .../kscience/visionforge/ControlVision.kt | 23 ++ .../kscience/visionforge/VisionClient.kt | 6 + .../kscience/visionforge/VisionManager.kt | 1 + .../kscience/visionforge/VisionProperties.kt | 6 +- .../kscience/visionforge/html/VisionOfHtml.kt | 18 +- .../visionforge/meta/VisionPropertyTest.kt | 4 +- .../kscience/visionforge/inputRenderers.kt | 80 ++--- .../build.gradle.kts | 12 +- .../src/jsMain/kotlin/commonJupyter.kt | 4 +- visionforge-solid/api/visionforge-solid.api | 22 +- .../solid/specifications/Canvas3DOptions.kt | 4 +- .../solid/specifications/Canvas3DUIScheme.kt | 13 + .../solid/specifications/ControlsScheme.kt | 9 - .../visionforge/solid/SolidPropertyTest.kt | 1 + visionforge-tables/build.gradle.kts | 14 +- .../visionforge/tables/TableVisionPlugin.kt | 9 +- visionforge-threejs/build.gradle.kts | 24 +- .../visionforge/solid/three/ThreeCanvas.kt | 2 +- .../visionforge/solid/three/ThreePlugin.kt | 39 +-- .../solid/three}/compose/ThreeControls.kt | 3 +- .../solid/three/compose/ThreeView.kt | 205 ++++++++++++ .../build.gradle.kts | 17 +- .../kscience/visionforge/three/jsMain.kt | 4 +- .../webpack.config.d/01.ring.js | 23 -- .../webpack.config.d/02.bundle.js | 10 - 59 files changed, 765 insertions(+), 1050 deletions(-) delete mode 100644 demo/js-playground/src/jsMain/kotlin/markupComponent.kt delete mode 100644 demo/js-playground/src/jsMain/kotlin/plotlyComponent.kt delete mode 100644 ui/compose/src/jsMain/kotlin/space/kscience/visionforge/compose/ThreeCanvas.kt delete mode 100644 ui/compose/src/jsMain/kotlin/space/kscience/visionforge/compose/ThreeViewWithControls.kt rename {ui/compose => visionforge-compose}/build.gradle.kts (76%) rename {ui/compose => visionforge-compose}/src/jsMain/kotlin/space/kscience/visionforge/compose/MetaViewer.kt (98%) rename {ui/compose => visionforge-compose}/src/jsMain/kotlin/space/kscience/visionforge/compose/NameCrumbs.kt (100%) rename {ui/compose => visionforge-compose}/src/jsMain/kotlin/space/kscience/visionforge/compose/PropertyEditor.kt (100%) rename {ui/compose => visionforge-compose}/src/jsMain/kotlin/space/kscience/visionforge/compose/Tabs.kt (100%) rename {ui/compose => visionforge-compose}/src/jsMain/kotlin/space/kscience/visionforge/compose/TreeStyles.kt (100%) rename {ui/compose => visionforge-compose}/src/jsMain/kotlin/space/kscience/visionforge/compose/VisionTree.kt (100%) rename {ui/compose => visionforge-compose}/src/jsMain/kotlin/space/kscience/visionforge/compose/bootstrap.kt (100%) create mode 100644 visionforge-compose/src/jsMain/kotlin/space/kscience/visionforge/compose/composeVision.kt rename {ui/compose => visionforge-compose}/src/jsMain/kotlin/space/kscience/visionforge/compose/css.kt (100%) rename {ui/compose => visionforge-compose}/src/jsMain/kotlin/space/kscience/visionforge/compose/layouts.kt (100%) rename {ui/compose => visionforge-compose}/src/jsMain/kotlin/space/kscience/visionforge/compose/valueChooser.kt (98%) create mode 100644 visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/specifications/Canvas3DUIScheme.kt delete mode 100644 visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/specifications/ControlsScheme.kt rename {ui/compose/src/jsMain/kotlin/space/kscience/visionforge => visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three}/compose/ThreeControls.kt (95%) create mode 100644 visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/compose/ThreeView.kt delete mode 100644 visionforge-threejs/visionforge-threejs-server/webpack.config.d/01.ring.js delete mode 100644 visionforge-threejs/visionforge-threejs-server/webpack.config.d/02.bundle.js diff --git a/CHANGELOG.md b/CHANGELOG.md index bf2c3478..22ecb805 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ - Context receivers flag - MeshLine for thick lines - Custom client-side events and thier processing in VisionServer +- Control/input visions ### Changed - Color accessor property is now `colorProperty`. Color uses non-nullable `invoke` instead of `set`. diff --git a/build.gradle.kts b/build.gradle.kts index 57e42d2b..3d1779e7 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,4 +1,3 @@ -import org.jetbrains.kotlin.gradle.dsl.KotlinJsCompile import space.kscience.gradle.useApache2Licence import space.kscience.gradle.useSPCTeam @@ -11,7 +10,7 @@ val dataforgeVersion by extra("0.7.1") allprojects { group = "space.kscience" - version = "0.3.0-RC" + version = "0.4.0-dev-1" } subprojects { @@ -31,11 +30,11 @@ subprojects { } } - tasks.withType{ - kotlinOptions{ - useEsClasses = true - } - } +// tasks.withType{ +// kotlinOptions{ +// useEsClasses = true +// } +// } } ksciencePublish { diff --git a/demo/gdml/build.gradle.kts b/demo/gdml/build.gradle.kts index 4cccf686..f715262b 100644 --- a/demo/gdml/build.gradle.kts +++ b/demo/gdml/build.gradle.kts @@ -7,14 +7,8 @@ group = "demo" kscience { jvm() js { - useCommonJs() browser { binaries.executable() - commonWebpackConfig { - cssSupport { - enabled.set(false) - } - } } } dependencies { @@ -26,7 +20,6 @@ kscience { implementation(spclibs.logback.classic) } jsMain { - implementation(projects.ui.ring) implementation(projects.visionforgeThreejs) implementation(npm("react-file-drop", "3.0.6")) } diff --git a/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GDMLAppComponent.kt b/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GDMLAppComponent.kt index 37c178f4..7a7aa3cc 100644 --- a/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GDMLAppComponent.kt +++ b/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GDMLAppComponent.kt @@ -1,46 +1,33 @@ package space.kscience.visionforge.gdml.demo +import androidx.compose.runtime.* import kotlinx.browser.window -import kotlinx.coroutines.CompletableDeferred -import kotlinx.coroutines.Deferred -import kotlinx.css.* +import org.jetbrains.compose.web.css.* +import org.jetbrains.compose.web.dom.Div +import org.jetbrains.compose.web.dom.H2 +import org.jetbrains.compose.web.dom.Text import org.w3c.files.File import org.w3c.files.FileReader import org.w3c.files.get -import react.Props -import react.dom.h2 -import react.fc -import react.useState import space.kscience.dataforge.names.Name import space.kscience.gdml.Gdml import space.kscience.gdml.decodeFromString import space.kscience.visionforge.Colors import space.kscience.visionforge.gdml.markLayers import space.kscience.visionforge.gdml.toVision -import space.kscience.visionforge.ring.ThreeCanvasWithControls -import space.kscience.visionforge.ring.tab import space.kscience.visionforge.setAsRoot import space.kscience.visionforge.solid.Solid import space.kscience.visionforge.solid.Solids import space.kscience.visionforge.solid.ambientLight import space.kscience.visionforge.solid.invoke -import styled.css -import styled.styledDiv +import space.kscience.visionforge.solid.three.compose.ThreeView -external interface GDMLAppProps : Props { - var solids: Solids - var vision: Solid? - var selected: Name? -} -@JsExport -val GDMLApp = fc("GDMLApp") { props -> - var deferredVision: Deferred by useState { - CompletableDeferred(props.vision) - } +@Composable +fun GDMLApp(solids: Solids, initialVision: Solid?, selected: Name? = null) { + var vision: Solid? by remember { mutableStateOf(initialVision) } - fun readFileAsync(file: File): Deferred { - val deferred = CompletableDeferred() + fun readFileAsync(file: File) { FileReader().apply { onload = { val data = result as String @@ -49,7 +36,7 @@ val GDMLApp = fc("GDMLApp") { props -> name.endsWith(".gdml") || name.endsWith(".xml") -> { val gdml = Gdml.decodeFromString(data) gdml.toVision().apply { - setAsRoot(props.solids.visionManager) + setAsRoot(solids.visionManager) console.info("Marking layers for file $name") markLayers() ambientLight { @@ -57,43 +44,38 @@ val GDMLApp = fc("GDMLApp") { props -> } } } - name.endsWith(".json") -> props.solids.visionManager.decodeFromString(data) + + name.endsWith(".json") -> solids.visionManager.decodeFromString(data) else -> { window.alert("File extension is not recognized: $name") error("File extension is not recognized: $name") } } - deferred.complete(parsedVision as? Solid ?: error("Parsed vision is not a solid")) + vision = parsedVision as? Solid ?: error("Parsed vision is not a solid") + Unit } readAsText(file) } - - return deferred } - styledDiv { - css { - height = 100.vh - 12.pt - width = 100.vw + Div({ + style { + height(100.vh - 12.pt) + width(100.vw) } - child(ThreeCanvasWithControls) { - attrs { - this.solids = props.solids - this.builderOfSolid = deferredVision - this.selected = props.selected - tab("Load") { - h2 { - +"Drag and drop .gdml or .json VisionForge files here" - } - fileDrop("(drag file here)") { files -> - val file = files?.get(0) - if (file != null) { - deferredVision = readFileAsync(file) - } + }) { + ThreeView(solids, vision, selected) { + Tab("Load") { + H2 { + Text("Drag and drop .gdml or .json VisionForge files here") + } + fileDrop("(drag file here)") { files -> + val file = files?.get(0) + if (file != null) { + readFileAsync(file) } } } - } } } diff --git a/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GdmlJsDemoApp.kt b/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GdmlJsDemoApp.kt index 7c6514bf..350c9de9 100644 --- a/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GdmlJsDemoApp.kt +++ b/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GdmlJsDemoApp.kt @@ -1,63 +1,58 @@ package space.kscience.visionforge.gdml.demo -import kotlinx.css.* +import org.jetbrains.compose.web.css.* +import org.jetbrains.compose.web.dom.Style +import org.jetbrains.compose.web.renderComposable import org.w3c.dom.Document import space.kscience.dataforge.context.Context import space.kscience.dataforge.context.request import space.kscience.gdml.GdmlShowCase import space.kscience.visionforge.Application import space.kscience.visionforge.Colors +import space.kscience.visionforge.compose.TreeStyles import space.kscience.visionforge.gdml.toVision -import space.kscience.visionforge.react.createRoot -import space.kscience.visionforge.react.render import space.kscience.visionforge.solid.Solids import space.kscience.visionforge.solid.ambientLight import space.kscience.visionforge.solid.invoke import space.kscience.visionforge.solid.three.ThreePlugin import space.kscience.visionforge.startApplication -import styled.injectGlobal private class GDMLDemoApp : Application { override fun start(document: Document, state: Map) { - val context = Context("gdml-demo"){ + val context = Context("gdml-demo") { plugin(ThreePlugin) } - injectGlobal { - html{ - height = 100.pct - } - - body{ - height = 100.pct - display = Display.flex - alignItems = Align.stretch - } - - "#application"{ - width = 100.pct - display = Display.flex - alignItems = Align.stretch - } - } - val element = document.getElementById("application") ?: error("Element with id 'application' not found on page") - createRoot(element).render { - child(GDMLApp) { - val vision = GdmlShowCase.cubes().toVision().apply { - ambientLight { - color(Colors.white) - } + val vision = GdmlShowCase.cubes().toVision().apply { + ambientLight { + color(Colors.white) + } + } + + renderComposable(element) { + Style(TreeStyles) + Style { + "html" { + height(100.percent) } - //println(context.plugins.fetch(VisionManager).encodeToString(vision)) - attrs { - this.solids = context.request(Solids) - this.vision = vision + + "body" { + height(100.percent) + display(DisplayStyle.Flex) + alignItems(AlignItems.Stretch) + } + + "#application" { + width(100.percent) + display(DisplayStyle.Flex) + alignItems(AlignItems.Stretch) } } + GDMLApp(context.request(Solids), vision) } } } diff --git a/demo/js-playground/build.gradle.kts b/demo/js-playground/build.gradle.kts index eca736e4..e1b39c62 100644 --- a/demo/js-playground/build.gradle.kts +++ b/demo/js-playground/build.gradle.kts @@ -9,14 +9,8 @@ kscience { kotlin { explicitApi = null js { - useCommonJs() browser { binaries.executable() - commonWebpackConfig { - cssSupport { - enabled.set(false) - } - } } } } @@ -29,7 +23,4 @@ kscience { implementation(projects.visionforge.visionforgeMarkdown) implementation(projects.visionforge.visionforgeThreejs) } - jsMain { - implementation(projects.ui.ring) - } } \ No newline at end of file diff --git a/demo/js-playground/src/jsMain/kotlin/JsPlaygroundApp.kt b/demo/js-playground/src/jsMain/kotlin/JsPlaygroundApp.kt index dd0d0b26..a612ab3e 100644 --- a/demo/js-playground/src/jsMain/kotlin/JsPlaygroundApp.kt +++ b/demo/js-playground/src/jsMain/kotlin/JsPlaygroundApp.kt @@ -1,7 +1,7 @@ -import kotlinx.css.* +import org.jetbrains.compose.web.css.* +import org.jetbrains.compose.web.dom.Div +import org.jetbrains.compose.web.renderComposable import org.w3c.dom.Document -import ringui.SmartTabs -import ringui.Tab import space.kscience.dataforge.context.Context import space.kscience.dataforge.context.request import space.kscience.plotly.models.Trace @@ -9,16 +9,12 @@ import space.kscience.plotly.scatter import space.kscience.visionforge.Application import space.kscience.visionforge.Colors import space.kscience.visionforge.JsVisionClient +import space.kscience.visionforge.compose.Tabs import space.kscience.visionforge.plotly.PlotlyPlugin -import space.kscience.visionforge.react.createRoot -import space.kscience.visionforge.react.render -import space.kscience.visionforge.ring.ThreeCanvasWithControls -import space.kscience.visionforge.ring.ThreeWithControlsPlugin -import space.kscience.visionforge.ring.solid import space.kscience.visionforge.solid.* +import space.kscience.visionforge.solid.three.ThreePlugin +import space.kscience.visionforge.solid.three.compose.ThreeView import space.kscience.visionforge.startApplication -import styled.css -import styled.styledDiv import kotlin.random.Random fun Trace.appendXYLatest(x: Number, y: Number, history: Int = 400, xErr: Number? = null, yErr: Number? = null) { @@ -33,28 +29,28 @@ private class JsPlaygroundApp : Application { override fun start(document: Document, state: Map) { val playgroundContext = Context { - plugin(ThreeWithControlsPlugin) - plugin(JsVisionClient) + plugin(ThreePlugin) plugin(PlotlyPlugin) } + val solids = playgroundContext.request(Solids) + val client = playgroundContext.request(JsVisionClient) + val element = document.getElementById("playground") ?: error("Element with id 'playground' not found on page") - createRoot(element).render { - styledDiv { - css { - padding = Padding(0.pt) - margin = Margin(0.pt) - height = 100.vh - width = 100.vw + renderComposable(element) { + Div({ + style { + padding(0.pt) + margin(0.pt) + height(100.vh) + width(100.vw) } - SmartTabs("gravity") { + }) { + Tabs { + active = "gravity" Tab("gravity") { - GravityDemo { - attrs { - this.solids = playgroundContext.request(Solids) - } - } + GravityDemo(solids, client) } // Tab("D0") { @@ -66,43 +62,34 @@ private class JsPlaygroundApp : Application { // } // } Tab("spheres") { - styledDiv { - css { - height = 100.vh - 50.pt + Div({ + style { + height(100.vh - 50.pt) } - child(ThreeCanvasWithControls) { - val random = Random(112233) - attrs { - solids = playgroundContext.request(Solids) - solid { - ambientLight { - color(Colors.white) - } - repeat(100) { - sphere(5, name = "sphere[$it]") { - x = random.nextDouble(-300.0, 300.0) - y = random.nextDouble(-300.0, 300.0) - z = random.nextDouble(-300.0, 300.0) - material { - color(random.nextInt()) - } - detail = 16 - } + }) { + ThreeView(solids, SolidGroup { + ambientLight { + color(Colors.white) + } + repeat(100) { + sphere(5, name = "sphere[$it]") { + x = Random.nextDouble(-300.0, 300.0) + y = Random.nextDouble(-300.0, 300.0) + z = Random.nextDouble(-300.0, 300.0) + material { + color(Random.nextInt()) } + detail = 16 } } - } + }) } } Tab("plotly") { - Plotly { - attrs { - plot = space.kscience.plotly.Plotly.plot { - scatter { - x(1, 2, 3) - y(5, 8, 7) - } - } + Plot(client) { + scatter { + x(1, 2, 3) + y(5, 8, 7) } } } @@ -110,6 +97,7 @@ private class JsPlaygroundApp : Application { } } } + } public fun main() { diff --git a/demo/js-playground/src/jsMain/kotlin/gravityDemo.kt b/demo/js-playground/src/jsMain/kotlin/gravityDemo.kt index a4bc9057..8e041513 100644 --- a/demo/js-playground/src/jsMain/kotlin/gravityDemo.kt +++ b/demo/js-playground/src/jsMain/kotlin/gravityDemo.kt @@ -1,111 +1,159 @@ +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.remember import kotlinx.coroutines.delay import kotlinx.coroutines.isActive -import kotlinx.coroutines.launch -import kotlinx.css.* -import react.Props -import react.fc +import org.jetbrains.compose.web.css.* +import org.jetbrains.compose.web.dom.AttrBuilderContext +import org.jetbrains.compose.web.dom.Div +import org.w3c.dom.HTMLDivElement +import space.kscience.dataforge.meta.Meta +import space.kscience.plotly.Plot import space.kscience.plotly.layout import space.kscience.plotly.models.Trace import space.kscience.visionforge.Colors +import space.kscience.visionforge.VisionClient +import space.kscience.visionforge.compose.FlexRow +import space.kscience.visionforge.compose.Vision +import space.kscience.visionforge.compose.zIndex import space.kscience.visionforge.markup.VisionOfMarkup -import space.kscience.visionforge.react.flexRow -import space.kscience.visionforge.ring.ThreeCanvasWithControls -import space.kscience.visionforge.ring.solid +import space.kscience.visionforge.plotly.asVision import space.kscience.visionforge.solid.* -import styled.css -import styled.styledDiv +import space.kscience.visionforge.solid.three.compose.ThreeView import kotlin.math.sqrt -external interface DemoProps : Props { - var solids: Solids -} +@Composable +fun Plot( + client: VisionClient, + meta: Meta = Meta.EMPTY, + attrs: AttrBuilderContext? = null, + block: Plot.() -> Unit, +) = Vision( + client = client, + attrs = attrs, + meta = meta, + vision = Plot().apply(block).asVision() +) -val GravityDemo = fc { props -> - val velocityTrace = Trace { - name = "velocity" - } - val energyTrace = Trace { - name = "energy" - } - val markup = VisionOfMarkup() +@Composable +fun Markup( + client: VisionClient, + markup: VisionOfMarkup, + meta: Meta = Meta.EMPTY, + attrs: AttrBuilderContext? = null, +) = Vision( + client = client, + attrs = attrs, + meta = meta, + vision = markup +) - styledDiv { - css { - height = 100.vh - 50.pt + +private val h = 100.0 + +@Composable +fun GravityDemo(solids: Solids, client: VisionClient) { + val velocityTrace = remember { + Trace { + name = "velocity" } - styledDiv { - css { - height = 50.vh + } + + val energyTrace = remember { + Trace { + name = "energy" + } + } + + val markup = remember { VisionOfMarkup() } + + val solid = remember { + SolidGroup { + pointLight(200, 200, 200, name = "light") { + color(Colors.white) } - child(ThreeCanvasWithControls) { - attrs { - solids = props.solids - solid { - pointLight(200, 200, 200, name = "light"){ - color(Colors.white) - } - ambientLight() + ambientLight() - sphere(5.0, "ball") { - detail = 16 - color("red") - val h = 100.0 - y = h - solids.context.launch { - val g = 10.0 - val dt = 0.1 - var time = 0.0 - var velocity = 0.0 - while (isActive) { - delay(20) - time += dt - velocity -= g * dt - val energy = g * y.toDouble() + velocity * velocity / 2 - y = y.toDouble() + velocity * dt + sphere(5.0, "ball") { + detail = 16 + color("red") + y = h - velocityTrace.appendXYLatest(time, y) - energyTrace.appendXYLatest(time, energy) - if (y.toDouble() <= 2.5) { - //conservation of energy - velocity = sqrt(2 * g * h) - } - - markup.content = """ - ## Bouncing sphere parameters - - **velocity** = $velocity - - **energy** = $energy - """.trimIndent() - } - } - } - - box(200, 5, 200, name = "floor") { - y = -2.5 - } - } + box(200, 5, 200, name = "floor") { + y = -2.5 } } } - flexRow { - css { - alignContent = Align.stretch - alignItems = Align.stretch - height = 50.vh - 50.pt + } + + LaunchedEffect(solid) { + val ball = solid["ball"]!! + val g = 10.0 + val dt = 0.1 + var time = 0.0 + var velocity = 0.0 + while (isActive) { + delay(20) + time += dt + velocity -= g * dt + val energy = g * ball.y.toDouble() + velocity * velocity / 2 + ball.y = ball.y.toDouble() + velocity * dt + + velocityTrace.appendXYLatest(time, ball.y) + energyTrace.appendXYLatest(time, energy) + + if (ball.y.toDouble() <= 2.5) { + //conservation of energy + velocity = sqrt(2 * g * h) } - plotly { + + markup.content = """ + ## Bouncing sphere parameters + + **velocity** = $velocity + + **energy** = $energy + """.trimIndent() + } + } + + Div({ + style { + height(100.vh - 50.pt) + } + }) { + Div({ + style { + height(50.vh) + } + }) { + ThreeView(solids, solid) + } + FlexRow({ + style { + alignContent(AlignContent.Stretch) + alignItems(AlignItems.Stretch) + height(50.vh - 50.pt) + } + }) { + Plot(client) { traces(velocityTrace, energyTrace) layout { xaxis.title = "time" } } - Markup { - attrs { - this.markup = markup + Markup(client, markup, attrs = { + style { + width(100.percent) + height(100.percent) + border(2.pt, LineStyle.Solid, Color.blue) + paddingLeft(8.pt) + backgroundColor(Color.white) + flex(1) + zIndex(10000) } - } + }) } } } \ No newline at end of file diff --git a/demo/js-playground/src/jsMain/kotlin/markupComponent.kt b/demo/js-playground/src/jsMain/kotlin/markupComponent.kt deleted file mode 100644 index a47c28cf..00000000 --- a/demo/js-playground/src/jsMain/kotlin/markupComponent.kt +++ /dev/null @@ -1,55 +0,0 @@ -import kotlinx.css.* -import kotlinx.dom.clear -import kotlinx.html.dom.append -import org.intellij.markdown.flavours.commonmark.CommonMarkFlavourDescriptor -import org.intellij.markdown.flavours.gfm.GFMFlavourDescriptor -import org.w3c.dom.Element -import org.w3c.dom.HTMLElement -import react.Props -import react.fc -import react.useEffect -import react.useRef -import space.kscience.visionforge.markup.VisionOfMarkup -import space.kscience.visionforge.markup.markdown -import space.kscience.visionforge.useProperty -import styled.css -import styled.styledDiv - -external interface MarkupProps : Props { - var markup: VisionOfMarkup? -} - -val Markup = fc("Markup") { props -> - val elementRef = useRef(null) - - useEffect(props.markup, elementRef) { - val element = elementRef.current as? HTMLElement ?: error("Markup element not found") - props.markup?.let { vision -> - val flavour = when (vision.format) { - VisionOfMarkup.COMMONMARK_FORMAT -> CommonMarkFlavourDescriptor() - VisionOfMarkup.GFM_FORMAT -> GFMFlavourDescriptor() - //TODO add new formats via plugins - else -> error("Format ${vision.format} not recognized") - } - vision.useProperty(VisionOfMarkup::content) { content: String? -> - element.clear() - element.append { - markdown(flavour) { content ?: "" } - } - } - } - } - - styledDiv { - css { - width = 100.pct - height = 100.pct - border= Border(2.pt, BorderStyle.solid, Color.blue) - padding = Padding(left = 8.pt) - backgroundColor = Color.white - flex = Flex(1.0) - zIndex = 10000 - } - ref = elementRef - } -} \ No newline at end of file diff --git a/demo/js-playground/src/jsMain/kotlin/plotlyComponent.kt b/demo/js-playground/src/jsMain/kotlin/plotlyComponent.kt deleted file mode 100644 index 80417dde..00000000 --- a/demo/js-playground/src/jsMain/kotlin/plotlyComponent.kt +++ /dev/null @@ -1,43 +0,0 @@ -import kotlinx.css.* -import org.w3c.dom.Element -import org.w3c.dom.HTMLElement -import react.* -import space.kscience.plotly.Plot -import space.kscience.plotly.PlotlyConfig -import space.kscience.plotly.plot -import styled.css -import styled.styledDiv - -external interface PlotlyProps : Props { - var plot: Plot? -} - - -val Plotly = fc("Plotly") { props -> - val elementRef = useRef(null) - - useEffect(props.plot, elementRef) { - val element = elementRef.current as? HTMLElement ?: error("Plotly element not found") - props.plot?.let { - element.plot(PlotlyConfig { - responsive = true - }, it) - } - } - - styledDiv { - css { - width = 100.pct - height = 100.pct - border = Border(2.pt, BorderStyle.solid, Color.blue) - flex = Flex(1.0) - } - ref = elementRef - } -} - -fun RBuilder.plotly(plotbuilder: Plot.() -> Unit) = Plotly { - attrs { - this.plot = Plot().apply(plotbuilder) - } -} \ No newline at end of file diff --git a/demo/muon-monitor/build.gradle.kts b/demo/muon-monitor/build.gradle.kts index d01b9dc9..f2b0e4dd 100644 --- a/demo/muon-monitor/build.gradle.kts +++ b/demo/muon-monitor/build.gradle.kts @@ -15,13 +15,7 @@ kscience { "muon-monitor.js", jvmConfig = { withJava() }, jsConfig = { useCommonJs() } - ) { - commonWebpackConfig { - cssSupport { - enabled.set(false) - } - } - } + ) commonMain { implementation(projects.visionforgeSolid) @@ -34,7 +28,6 @@ kscience { implementation("ch.qos.logback:logback-classic:1.2.11") } jsMain { - implementation(projects.ui.ring) implementation(projects.visionforgeThreejs) //implementation(devNpm("webpack-bundle-analyzer", "4.4.0")) } diff --git a/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMAppComponent.kt b/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMAppComponent.kt index 07dc7c7c..2ecf9472 100644 --- a/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMAppComponent.kt +++ b/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMAppComponent.kt @@ -1,281 +1,106 @@ package ru.mipt.npm.muon.monitor +import androidx.compose.runtime.Composable +import androidx.compose.runtime.mutableStateListOf +import androidx.compose.runtime.remember +import app.softwork.bootstrapcompose.Button import kotlinx.browser.window -import kotlinx.coroutines.CompletableDeferred -import kotlinx.coroutines.DelicateCoroutinesApi import kotlinx.coroutines.await import kotlinx.coroutines.launch -import kotlinx.css.* -import kotlinx.html.js.onClickFunction import kotlinx.serialization.json.Json +import org.jetbrains.compose.web.css.* +import org.jetbrains.compose.web.dom.Div +import org.jetbrains.compose.web.dom.P +import org.jetbrains.compose.web.dom.Span +import org.jetbrains.compose.web.dom.Text import org.w3c.fetch.RequestInit -import react.Props -import react.dom.attrs -import react.dom.button -import react.dom.p -import react.fc -import react.useMemo -import react.useState import space.kscience.dataforge.meta.invoke import space.kscience.dataforge.names.Name import space.kscience.visionforge.Colors -import space.kscience.visionforge.react.flexColumn -import space.kscience.visionforge.react.flexRow -import space.kscience.visionforge.ring.ThreeCanvasWithControls -import space.kscience.visionforge.ring.tab +import space.kscience.visionforge.compose.FlexColumn +import space.kscience.visionforge.compose.FlexRow import space.kscience.visionforge.solid.Solids import space.kscience.visionforge.solid.ambientLight import space.kscience.visionforge.solid.edges import space.kscience.visionforge.solid.invoke import space.kscience.visionforge.solid.specifications.Canvas3DOptions -import styled.css -import styled.styledDiv -import styled.styledSpan +import space.kscience.visionforge.solid.three.compose.ThreeView import kotlin.math.PI -external interface MMAppProps : Props { - var model: Model - var solids: Solids - var selected: Name? -} +@Composable +fun MMApp(solids: Solids, model: Model, selected: Name? = null) { -@OptIn(DelicateCoroutinesApi::class) -@JsExport -val MMApp = fc("Muon monitor") { props -> - - val mmOptions = useMemo { + val mmOptions = remember { Canvas3DOptions { camera { distance = 2100.0 latitude = PI / 6 azimuth = PI + PI / 6 } - } } - val root = useMemo(props.model) { - props.model.root.apply { + val root = remember(model) { + model.root.apply { edges() - ambientLight{ + ambientLight { color(Colors.white) } } } - var events: Set by useState(emptySet()) + val events = remember { mutableStateListOf() } - styledDiv { - css { - height = 100.vh - 12.pt + Div({ + style { + height(100.vh - 12.pt) } - child(ThreeCanvasWithControls) { - attrs { - this.solids = props.solids - this.builderOfSolid = CompletableDeferred(root) - this.selected = props.selected - this.options = mmOptions - tab("Events") { - flexColumn { - flexRow { - button { - +"Next" - attrs { - onClickFunction = { - solids.context.launch { - val event = window.fetch( - "http://localhost:8080/event", - RequestInit("GET") - ).then { response -> - if (response.ok) { - response.text() - } else { - error("Failed to get event") - } - }.then { body -> - Json.decodeFromString(Event.serializer(), body) - }.await() - events = events + event - props.model.displayEvent(event) - } + }) { + ThreeView(solids, root, selected, mmOptions) { + Tab("Events") { + + FlexColumn { + FlexRow { + Button("Next") { + solids.context.launch { + val event = window.fetch( + "http://localhost:8080/event", + RequestInit("GET") + ).then { response -> + if (response.ok) { + response.text() + } else { + error("Failed to get event") } - } - } - button { - +"Clear" - attrs { - onClickFunction = { - events = emptySet() - props.model.reset() - } - } + }.then { body -> + Json.decodeFromString(Event.serializer(), body) + }.await() + events.add(event) + model.displayEvent(event) } } + Button("Clear") { + events.clear() + model.reset() + } } - events.forEach { event -> - p { - styledSpan { - +event.id.toString() - } - +" : " - styledSpan { - css { - color = Color.blue - } - +event.hits.toString() + } + events.forEach { event -> + P { + Span { + Text(event.id.toString()) + } + Text(" : ") + Span({ + style { + color(Color.blue) } + }) { + Text(event.hits.toString()) } } } } - } } - -// var selected by useState { props.selected } -// -// val onSelect: (Name?) -> Unit = { -// selected = it -// } -// - -// -// gridRow { -// flexColumn { -// css { -// +"col-lg-3" -// +"order-lg-1" -// +"order-2" -// padding(0.px) -// overflowY = Overflow.auto -// height = 100.vh -// } -// //tree -// card("Object tree") { -// css { -// flex(1.0, 1.0, FlexBasis.auto) -// } -// visionTree(root, selected, onSelect) -// } -// } -// flexColumn { -// css { -// +"col-lg-6" -// +"order-lg-2" -// +"order-1" -// height = 100.vh -// } -// h1("mx-auto page-header") { -// +"Muon monitor demo" -// } -// //canvas -// -// child(ThreeCanvasComponent) { -// attrs { -// this.context = props.context -// this.solid = root -// this.selected = selected -// this.options = mmOptions -// } -// } -// } -// flexColumn { -// css { -// +"col-lg-3" -// +"order-3" -// padding(0.px) -// height = 100.vh -// } -// styledDiv { -// css { -// flex(0.0, 1.0, FlexBasis.zero) -// } -// //settings -// card("Canvas configuration") { -// canvasControls(mmOptions, root) -// } -// -// card("Events") { -// button { -// +"Next" -// attrs { -// onClickFunction = { -// GlobalScope.launch { -// val event = props.connection.get("http://localhost:8080/event") -// props.model.displayEvent(event) -// } -// } -// } -// } -// button { -// +"Clear" -// attrs { -// onClickFunction = { -// props.model.reset() -// } -// } -// } -// } -// } -// styledDiv { -// css { -// padding(0.px) -// } -// nav { -// attrs { -// attributes["aria-label"] = "breadcrumb" -// } -// ol("breadcrumb") { -// li("breadcrumb-item") { -// button(classes = "btn btn-link p-0") { -// +"World" -// attrs { -// onClickFunction = { -// selected = Name.EMPTY -// } -// } -// } -// } -// if (selected != null) { -// val tokens = ArrayList(selected?.length ?: 1) -// selected?.tokens?.forEach { token -> -// tokens.add(token) -// val fullName = Name(tokens.toList()) -// li("breadcrumb-item") { -// button(classes = "btn btn-link p-0") { -// +token.toString() -// attrs { -// onClickFunction = { -// console.log("Selected = $fullName") -// selected = fullName -// } -// } -// } -// } -// } -// } -// } -// } -// } -// styledDiv { -// css { -// overflowY = Overflow.auto -// } -// //properties -// card("Properties") { -// selected.let { selected -> -// val selectedObject: Vision? = when { -// selected == null -> null -// selected.isEmpty() -> root -// else -> root[selected] -// } -// if (selectedObject != null) { -// visionPropertyEditor(selectedObject, key = selected) -// } -// } -// } -// } -// } -// -// } } \ No newline at end of file diff --git a/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMDemoApp.kt b/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMDemoApp.kt index afc9ce80..0fc98ac5 100644 --- a/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMDemoApp.kt +++ b/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMDemoApp.kt @@ -1,12 +1,11 @@ package ru.mipt.npm.muon.monitor +import org.jetbrains.compose.web.renderComposable import org.w3c.dom.Document import space.kscience.dataforge.context.Context import space.kscience.dataforge.context.request import space.kscience.visionforge.Application import space.kscience.visionforge.VisionManager -import space.kscience.visionforge.react.createRoot -import space.kscience.visionforge.react.render import space.kscience.visionforge.solid.Solids import space.kscience.visionforge.solid.three.ThreePlugin import space.kscience.visionforge.startApplication @@ -24,13 +23,8 @@ private class MMDemoApp : Application { val model = Model(visionManager) val element = document.getElementById("app") ?: error("Element with id 'app' not found on page") - createRoot(element).render { - child(MMApp) { - attrs { - this.model = model - this.solids = context.request(Solids) - } - } + renderComposable(element) { + MMApp(context.request(Solids), model) } } } diff --git a/demo/playground/build.gradle.kts b/demo/playground/build.gradle.kts index c51f6691..22b109ac 100644 --- a/demo/playground/build.gradle.kts +++ b/demo/playground/build.gradle.kts @@ -14,17 +14,10 @@ repositories { kotlin { js(IR) { - useCommonJs() browser { webpackTask { mainOutputFileName.set("js/visionforge-playground.js") } - commonWebpackConfig { - sourceMaps = true - cssSupport{ - enabled.set(false) - } - } } binaries.executable() } @@ -57,7 +50,6 @@ kotlin { val jsMain by getting { dependencies { - implementation(projects.ui.ring) implementation(projects.visionforgeThreejs) compileOnly(npm("webpack-bundle-analyzer","4.5.0")) } diff --git a/demo/playground/src/jsMain/kotlin/playgroundMain.kt b/demo/playground/src/jsMain/kotlin/playgroundMain.kt index feff4de1..32a518ba 100644 --- a/demo/playground/src/jsMain/kotlin/playgroundMain.kt +++ b/demo/playground/src/jsMain/kotlin/playgroundMain.kt @@ -2,13 +2,13 @@ import space.kscience.dataforge.misc.DFExperimental import space.kscience.visionforge.jupyter.VFNotebookClient import space.kscience.visionforge.markup.MarkupPlugin import space.kscience.visionforge.plotly.PlotlyPlugin -import space.kscience.visionforge.ring.ThreeWithControlsPlugin import space.kscience.visionforge.runVisionClient +import space.kscience.visionforge.solid.three.ThreePlugin import space.kscience.visionforge.tables.TableVisionJsPlugin @DFExperimental fun main() = runVisionClient { - plugin(ThreeWithControlsPlugin) + plugin(ThreePlugin) plugin(PlotlyPlugin) plugin(MarkupPlugin) plugin(TableVisionJsPlugin) diff --git a/demo/sat-demo/build.gradle.kts b/demo/sat-demo/build.gradle.kts index 6cf37859..5e414f46 100644 --- a/demo/sat-demo/build.gradle.kts +++ b/demo/sat-demo/build.gradle.kts @@ -1,3 +1,6 @@ +import org.jetbrains.kotlin.gradle.dsl.ExplicitApiMode + + plugins { id("space.kscience.gradle.mpp") alias(spclibs.plugins.ktor) @@ -19,6 +22,8 @@ kscience { group = "center.sciprog" +kotlin.explicitApi = ExplicitApiMode.Disabled + application { mainClass.set("ru.mipt.npm.sat.SatServerKt") } diff --git a/demo/solid-showcase/src/jsMain/kotlin/space/kscience/visionforge/solid/demo/ThreeDemoGrid.kt b/demo/solid-showcase/src/jsMain/kotlin/space/kscience/visionforge/solid/demo/ThreeDemoGrid.kt index 50e7f174..8715f75d 100644 --- a/demo/solid-showcase/src/jsMain/kotlin/space/kscience/visionforge/solid/demo/ThreeDemoGrid.kt +++ b/demo/solid-showcase/src/jsMain/kotlin/space/kscience/visionforge/solid/demo/ThreeDemoGrid.kt @@ -72,7 +72,7 @@ class ThreeDemoGrid(element: Element) : VisionLayout { } } val element = document.getElementById("output-$name") ?: error("Element not found") - three.getOrCreateCanvas(element, canvasOptions) + ThreeCanvas(three, element, canvasOptions) }.render(vision) } } diff --git a/settings.gradle.kts b/settings.gradle.kts index 8611d0aa..b2a1b7aa 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -45,7 +45,7 @@ include( ":ui:ring", // ":ui:material", ":ui:bootstrap", - ":ui:compose", + ":visionforge-compose", ":visionforge-core", ":visionforge-solid", // ":visionforge-fx", diff --git a/ui/compose/src/jsMain/kotlin/space/kscience/visionforge/compose/ThreeCanvas.kt b/ui/compose/src/jsMain/kotlin/space/kscience/visionforge/compose/ThreeCanvas.kt deleted file mode 100644 index 9816b5c2..00000000 --- a/ui/compose/src/jsMain/kotlin/space/kscience/visionforge/compose/ThreeCanvas.kt +++ /dev/null @@ -1,52 +0,0 @@ -package space.kscience.visionforge.compose - -import androidx.compose.runtime.* -import kotlinx.dom.clear -import org.jetbrains.compose.web.css.* -import org.jetbrains.compose.web.dom.Div -import space.kscience.dataforge.context.Context -import space.kscience.dataforge.context.request -import space.kscience.dataforge.names.Name -import space.kscience.visionforge.solid.Solid -import space.kscience.visionforge.solid.specifications.Canvas3DOptions -import space.kscience.visionforge.solid.three.ThreeCanvas -import space.kscience.visionforge.solid.three.ThreePlugin - -@Composable -public fun ThreeCanvas( - context: Context, - options: Canvas3DOptions?, - solid: Solid?, - selected: Name?, -) { - - val three: ThreePlugin by derivedStateOf { context.request(ThreePlugin) } - - Div({ - style { - maxWidth(100.vw) - maxHeight(100.vh) - width(100.percent) - height(100.percent) - } - }) { - var canvas: ThreeCanvas? = null - DisposableEffect(options) { - canvas = ThreeCanvas(three, scopeElement, options ?: Canvas3DOptions()) - onDispose { - scopeElement.clear() - canvas = null - } - } - LaunchedEffect(solid) { - if (solid != null) { - canvas?.render(solid) - } else { - canvas?.clear() - } - } - LaunchedEffect(selected) { - canvas?.select(selected) - } - } -} \ No newline at end of file diff --git a/ui/compose/src/jsMain/kotlin/space/kscience/visionforge/compose/ThreeViewWithControls.kt b/ui/compose/src/jsMain/kotlin/space/kscience/visionforge/compose/ThreeViewWithControls.kt deleted file mode 100644 index 7a347110..00000000 --- a/ui/compose/src/jsMain/kotlin/space/kscience/visionforge/compose/ThreeViewWithControls.kt +++ /dev/null @@ -1,169 +0,0 @@ -@file:OptIn(ExperimentalComposeWebApi::class) - -package space.kscience.visionforge.compose - -import androidx.compose.runtime.* -import app.softwork.bootstrapcompose.Card -import kotlinx.coroutines.Deferred -import kotlinx.coroutines.launch -import org.jetbrains.compose.web.ExperimentalComposeWebApi -import org.jetbrains.compose.web.css.* -import org.jetbrains.compose.web.dom.* -import space.kscience.dataforge.meta.get -import space.kscience.dataforge.names.Name -import space.kscience.dataforge.names.isEmpty -import space.kscience.visionforge.* -import space.kscience.visionforge.solid.Solid -import space.kscience.visionforge.solid.SolidGroup -import space.kscience.visionforge.solid.Solids -import space.kscience.visionforge.solid.specifications.Canvas3DOptions - -@Composable -public fun ThreeCanvasWithControls( - solids: Solids, - builderOfSolid: Deferred, - initialSelected: Name?, - options: Canvas3DOptions?, - tabBuilder: @Composable TabsBuilder.() -> Unit = {}, -) { - var selected: Name? by remember { mutableStateOf(initialSelected) } - var solid: Solid? by remember { mutableStateOf(null) } - - LaunchedEffect(builderOfSolid) { - solids.context.launch { - solid = builderOfSolid.await() - //ensure that the solid is properly rooted - if (solid?.parent == null) { - solid?.setAsRoot(solids.context.visionManager) - } - } - } - - val optionsWithSelector = remember(options) { - (options ?: Canvas3DOptions()).apply { - this.onSelect = { - selected = it - } - } - } - - val selectedVision: Vision? = remember(builderOfSolid, selected) { - selected?.let { - when { - it.isEmpty() -> solid - else -> (solid as? SolidGroup)?.get(it) - } - } - } - - - FlexRow({ - style { - height(100.percent) - width(100.percent) - flexWrap(FlexWrap.Wrap) - alignItems(AlignItems.Stretch) - alignContent(AlignContent.Stretch) - } - }) { - FlexColumn({ - style { - height(100.percent) - minWidth(600.px) - flex(10, 1, 600.px) - position(Position.Relative) - } - }) { - if (solid == null) { - Div({ - style { - position(Position.Fixed) - width(100.percent) - height(100.percent) - zIndex(1000) - top(40.percent) - left(0.px) - opacity(0.5) - filter { - opacity(50.percent) - } - } - }) { - Div({ classes("d-flex", " justify-content-center") }) { - Div({ - classes("spinner-grow", "text-primary") - style { - width(3.cssRem) - height(3.cssRem) - zIndex(20) - } - attr("role", "status") - }) { - Span({ classes("sr-only") }) { Text("Loading 3D vision") } - } - } - } - } else { - ThreeCanvas(solids.context, optionsWithSelector, solid, selected) - } - - selectedVision?.let { vision -> - Div({ - style { - position(Position.Absolute) - top(5.px) - right(5.px) - width(450.px) - } - }) { - Card( - headerAttrs = { - // border = true - }, - header = { - NameCrumbs(selected) { selected = it } - } - ) { - PropertyEditor( - scope = solids.context, - meta = vision.properties.root(), - getPropertyState = { name -> - if (vision.properties.own?.get(name) != null) { - EditorPropertyState.Defined - } else if (vision.properties.root()[name] != null) { - // TODO differentiate - EditorPropertyState.Default() - } else { - EditorPropertyState.Undefined - } - }, - updates = vision.properties.changes, - rootDescriptor = vision.descriptor - ) - - } - - vision.styles.takeIf { it.isNotEmpty() }?.let { styles -> - P { - B { Text("Styles: ") } - Text(styles.joinToString(separator = ", ")) - } - } - } - } - } - } - FlexColumn({ - style { - paddingAll(4.px) - minWidth(400.px) - height(100.percent) - overflowY("auto") - flex(1, 10, 300.px) - } - }) { - ThreeControls(solid, optionsWithSelector, selected, onSelect = { selected = it }, tabBuilder = tabBuilder) - } -} - - diff --git a/ui/ring/src/jsMain/kotlin/space.kscience.visionforge.ring/ThreeWithControlsPlugin.kt b/ui/ring/src/jsMain/kotlin/space.kscience.visionforge.ring/ThreeWithControlsPlugin.kt index a2223692..bf557bb8 100644 --- a/ui/ring/src/jsMain/kotlin/space.kscience.visionforge.ring/ThreeWithControlsPlugin.kt +++ b/ui/ring/src/jsMain/kotlin/space.kscience.visionforge.ring/ThreeWithControlsPlugin.kt @@ -7,8 +7,6 @@ import space.kscience.dataforge.context.Context import space.kscience.dataforge.context.PluginFactory import space.kscience.dataforge.context.PluginTag import space.kscience.dataforge.meta.Meta -import space.kscience.dataforge.meta.boolean -import space.kscience.dataforge.meta.get import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.asName import space.kscience.visionforge.ElementVisionRenderer @@ -28,16 +26,12 @@ public class ThreeWithControlsPlugin : AbstractPlugin(), ElementVisionRenderer { if (vision is Solid) ElementVisionRenderer.DEFAULT_RATING * 2 else ElementVisionRenderer.ZERO_RATING override fun render(element: Element, client: VisionClient, name: Name, vision: Vision, meta: Meta) { - if (meta["controls.enabled"].boolean == false) { - three.render(element, client, name, vision, meta) - } else { - space.kscience.visionforge.react.createRoot(element).render { - child(ThreeCanvasWithControls) { - attrs { - this.solids = three.solids - this.options = Canvas3DOptions.read(meta) - this.builderOfSolid = context.async { vision as Solid } - } + space.kscience.visionforge.react.createRoot(element).render { + child(ThreeCanvasWithControls) { + attrs { + this.solids = three.solids + this.options = Canvas3DOptions.read(meta) + this.builderOfSolid = context.async { vision as Solid } } } } diff --git a/ui/compose/build.gradle.kts b/visionforge-compose/build.gradle.kts similarity index 76% rename from ui/compose/build.gradle.kts rename to visionforge-compose/build.gradle.kts index f77c8e26..f8388b5c 100644 --- a/ui/compose/build.gradle.kts +++ b/visionforge-compose/build.gradle.kts @@ -2,8 +2,6 @@ plugins { id("space.kscience.gradle.mpp") alias(spclibs.plugins.compose) -// id("org.jetbrains.compose") version "1.5.11" -// id("com.android.library") } kscience{ @@ -15,9 +13,9 @@ kscience{ kotlin { // android() sourceSets { - val commonMain by getting { - dependencies { - + commonMain{ + dependencies{ + api(projects.visionforgeCore) } } @@ -35,7 +33,6 @@ kotlin { api(compose.html.core) api("app.softwork:bootstrap-compose:0.1.15") api("app.softwork:bootstrap-compose-icons:0.1.15") - api(projects.visionforge.visionforgeThreejs) } } } diff --git a/ui/compose/src/jsMain/kotlin/space/kscience/visionforge/compose/MetaViewer.kt b/visionforge-compose/src/jsMain/kotlin/space/kscience/visionforge/compose/MetaViewer.kt similarity index 98% rename from ui/compose/src/jsMain/kotlin/space/kscience/visionforge/compose/MetaViewer.kt rename to visionforge-compose/src/jsMain/kotlin/space/kscience/visionforge/compose/MetaViewer.kt index 5aaf4140..f83d4da6 100644 --- a/ui/compose/src/jsMain/kotlin/space/kscience/visionforge/compose/MetaViewer.kt +++ b/visionforge-compose/src/jsMain/kotlin/space/kscience/visionforge/compose/MetaViewer.kt @@ -10,7 +10,6 @@ import org.jetbrains.compose.web.dom.Text import space.kscience.dataforge.meta.Meta import space.kscience.dataforge.meta.descriptors.MetaDescriptor import space.kscience.dataforge.meta.descriptors.get -import space.kscience.dataforge.meta.get import space.kscience.dataforge.meta.isLeaf import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.NameToken diff --git a/ui/compose/src/jsMain/kotlin/space/kscience/visionforge/compose/NameCrumbs.kt b/visionforge-compose/src/jsMain/kotlin/space/kscience/visionforge/compose/NameCrumbs.kt similarity index 100% rename from ui/compose/src/jsMain/kotlin/space/kscience/visionforge/compose/NameCrumbs.kt rename to visionforge-compose/src/jsMain/kotlin/space/kscience/visionforge/compose/NameCrumbs.kt diff --git a/ui/compose/src/jsMain/kotlin/space/kscience/visionforge/compose/PropertyEditor.kt b/visionforge-compose/src/jsMain/kotlin/space/kscience/visionforge/compose/PropertyEditor.kt similarity index 100% rename from ui/compose/src/jsMain/kotlin/space/kscience/visionforge/compose/PropertyEditor.kt rename to visionforge-compose/src/jsMain/kotlin/space/kscience/visionforge/compose/PropertyEditor.kt diff --git a/ui/compose/src/jsMain/kotlin/space/kscience/visionforge/compose/Tabs.kt b/visionforge-compose/src/jsMain/kotlin/space/kscience/visionforge/compose/Tabs.kt similarity index 100% rename from ui/compose/src/jsMain/kotlin/space/kscience/visionforge/compose/Tabs.kt rename to visionforge-compose/src/jsMain/kotlin/space/kscience/visionforge/compose/Tabs.kt diff --git a/ui/compose/src/jsMain/kotlin/space/kscience/visionforge/compose/TreeStyles.kt b/visionforge-compose/src/jsMain/kotlin/space/kscience/visionforge/compose/TreeStyles.kt similarity index 100% rename from ui/compose/src/jsMain/kotlin/space/kscience/visionforge/compose/TreeStyles.kt rename to visionforge-compose/src/jsMain/kotlin/space/kscience/visionforge/compose/TreeStyles.kt diff --git a/ui/compose/src/jsMain/kotlin/space/kscience/visionforge/compose/VisionTree.kt b/visionforge-compose/src/jsMain/kotlin/space/kscience/visionforge/compose/VisionTree.kt similarity index 100% rename from ui/compose/src/jsMain/kotlin/space/kscience/visionforge/compose/VisionTree.kt rename to visionforge-compose/src/jsMain/kotlin/space/kscience/visionforge/compose/VisionTree.kt diff --git a/ui/compose/src/jsMain/kotlin/space/kscience/visionforge/compose/bootstrap.kt b/visionforge-compose/src/jsMain/kotlin/space/kscience/visionforge/compose/bootstrap.kt similarity index 100% rename from ui/compose/src/jsMain/kotlin/space/kscience/visionforge/compose/bootstrap.kt rename to visionforge-compose/src/jsMain/kotlin/space/kscience/visionforge/compose/bootstrap.kt diff --git a/visionforge-compose/src/jsMain/kotlin/space/kscience/visionforge/compose/composeVision.kt b/visionforge-compose/src/jsMain/kotlin/space/kscience/visionforge/compose/composeVision.kt new file mode 100644 index 00000000..e9b22261 --- /dev/null +++ b/visionforge-compose/src/jsMain/kotlin/space/kscience/visionforge/compose/composeVision.kt @@ -0,0 +1,49 @@ +package space.kscience.visionforge.compose + +import androidx.compose.runtime.Composable +import androidx.compose.runtime.DisposableEffect +import androidx.compose.runtime.derivedStateOf +import androidx.compose.runtime.getValue +import kotlinx.dom.clear +import org.jetbrains.compose.web.dom.AttrBuilderContext +import org.jetbrains.compose.web.dom.Div +import org.w3c.dom.HTMLDivElement +import space.kscience.dataforge.context.gather +import space.kscience.dataforge.meta.Meta +import space.kscience.dataforge.names.Name +import space.kscience.dataforge.names.asName +import space.kscience.visionforge.ElementVisionRenderer +import space.kscience.visionforge.Vision +import space.kscience.visionforge.VisionClient + + +/** + * Render an Element vision via injected vision renderer inside compose-html + */ +@Composable +public fun Vision( + client: VisionClient, + vision: Vision, + name: Name = "@vision[${vision.hashCode().toString(16)}]".asName(), + meta: Meta = Meta.EMPTY, + attrs: AttrBuilderContext? = null, +): Unit = Div(attrs) { + + val renderer by derivedStateOf { + client.context.gather(ElementVisionRenderer.TYPE).values.mapNotNull { + val rating = it.rateVision(vision) + if (rating > 0) { + rating to it + } else { + null + } + }.maxBy { it.first }.second + } + + DisposableEffect(vision, name, renderer, meta) { + renderer.render(scopeElement, client, name, vision, meta) + onDispose { + scopeElement.clear() + } + } +} diff --git a/ui/compose/src/jsMain/kotlin/space/kscience/visionforge/compose/css.kt b/visionforge-compose/src/jsMain/kotlin/space/kscience/visionforge/compose/css.kt similarity index 100% rename from ui/compose/src/jsMain/kotlin/space/kscience/visionforge/compose/css.kt rename to visionforge-compose/src/jsMain/kotlin/space/kscience/visionforge/compose/css.kt diff --git a/ui/compose/src/jsMain/kotlin/space/kscience/visionforge/compose/layouts.kt b/visionforge-compose/src/jsMain/kotlin/space/kscience/visionforge/compose/layouts.kt similarity index 100% rename from ui/compose/src/jsMain/kotlin/space/kscience/visionforge/compose/layouts.kt rename to visionforge-compose/src/jsMain/kotlin/space/kscience/visionforge/compose/layouts.kt diff --git a/ui/compose/src/jsMain/kotlin/space/kscience/visionforge/compose/valueChooser.kt b/visionforge-compose/src/jsMain/kotlin/space/kscience/visionforge/compose/valueChooser.kt similarity index 98% rename from ui/compose/src/jsMain/kotlin/space/kscience/visionforge/compose/valueChooser.kt rename to visionforge-compose/src/jsMain/kotlin/space/kscience/visionforge/compose/valueChooser.kt index b6aefee7..cf1ad9f8 100644 --- a/ui/compose/src/jsMain/kotlin/space/kscience/visionforge/compose/valueChooser.kt +++ b/visionforge-compose/src/jsMain/kotlin/space/kscience/visionforge/compose/valueChooser.kt @@ -20,7 +20,6 @@ import space.kscience.dataforge.meta.descriptors.ValueRestriction import space.kscience.dataforge.meta.descriptors.allowedValues import space.kscience.visionforge.Colors import space.kscience.visionforge.widgetType -import three.math.Color @Composable @@ -151,7 +150,8 @@ public fun ColorValueChooser( value( value?.let { value -> if (value.type == ValueType.NUMBER) Colors.rgbToString(value.int) - else "#" + Color(value.string).getHexString() + else value.string + //else "#" + Color(value.string).getHexString() } ?: "#000000" ) onChange { diff --git a/visionforge-core/api/visionforge-core.api b/visionforge-core/api/visionforge-core.api index 0cd2b904..89e926ec 100644 --- a/visionforge-core/api/visionforge-core.api +++ b/visionforge-core/api/visionforge-core.api @@ -225,6 +225,8 @@ public abstract interface class space/kscience/visionforge/ControlVision : space public final class space/kscience/visionforge/ControlVisionKt { public static final fun VisionClickEvent (Lspace/kscience/dataforge/meta/Meta;Lspace/kscience/dataforge/names/Name;)Lspace/kscience/visionforge/VisionClickEvent; public static synthetic fun VisionClickEvent$default (Lspace/kscience/dataforge/meta/Meta;Lspace/kscience/dataforge/names/Name;ILjava/lang/Object;)Lspace/kscience/visionforge/VisionClickEvent; + public static final fun VisionInputEvent (Lspace/kscience/dataforge/meta/Value;Lspace/kscience/dataforge/names/Name;)Lspace/kscience/visionforge/VisionInputEvent; + public static synthetic fun VisionInputEvent$default (Lspace/kscience/dataforge/meta/Value;Lspace/kscience/dataforge/names/Name;ILjava/lang/Object;)Lspace/kscience/visionforge/VisionInputEvent; public static final fun VisionValueChangeEvent (Lspace/kscience/dataforge/meta/Value;Lspace/kscience/dataforge/names/Name;)Lspace/kscience/visionforge/VisionValueChangeEvent; public static synthetic fun VisionValueChangeEvent$default (Lspace/kscience/dataforge/meta/Value;Lspace/kscience/dataforge/names/Name;ILjava/lang/Object;)Lspace/kscience/visionforge/VisionValueChangeEvent; public static final fun onClick (Lspace/kscience/visionforge/ClickControl;Lkotlinx/coroutines/CoroutineScope;Lkotlin/jvm/functions/Function2;)Lkotlinx/coroutines/Job; @@ -495,6 +497,7 @@ public final class space/kscience/visionforge/VisionClientKt { public static final fun notifyPropertyChanged (Lspace/kscience/visionforge/VisionClient;Lspace/kscience/dataforge/names/Name;Ljava/lang/String;Ljava/lang/String;)V public static final fun notifyPropertyChanged (Lspace/kscience/visionforge/VisionClient;Lspace/kscience/dataforge/names/Name;Ljava/lang/String;Lspace/kscience/dataforge/meta/Meta;)V public static final fun notifyPropertyChanged (Lspace/kscience/visionforge/VisionClient;Lspace/kscience/dataforge/names/Name;Ljava/lang/String;Z)V + public static final fun sendEventAsync (Lspace/kscience/visionforge/VisionClient;Lspace/kscience/dataforge/names/Name;Lspace/kscience/visionforge/VisionEvent;)Lkotlinx/coroutines/Job; } public abstract interface class space/kscience/visionforge/VisionContainer { @@ -560,6 +563,30 @@ public final class space/kscience/visionforge/VisionGroupKt { public static synthetic fun group$default (Lspace/kscience/visionforge/MutableVisionContainer;Lspace/kscience/dataforge/names/Name;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lspace/kscience/visionforge/SimpleVisionGroup; } +public final class space/kscience/visionforge/VisionInputEvent : space/kscience/visionforge/VisionControlEvent { + public static final field Companion Lspace/kscience/visionforge/VisionInputEvent$Companion; + public fun (Lspace/kscience/dataforge/meta/Meta;)V + public fun getMeta ()Lspace/kscience/dataforge/meta/Meta; + public final fun getName ()Lspace/kscience/dataforge/names/Name; + public final fun getValue ()Lspace/kscience/dataforge/meta/Value; + public fun toString ()Ljava/lang/String; +} + +public final class space/kscience/visionforge/VisionInputEvent$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lspace/kscience/visionforge/VisionInputEvent$$serializer; + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lspace/kscience/visionforge/VisionInputEvent; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lspace/kscience/visionforge/VisionInputEvent;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class space/kscience/visionforge/VisionInputEvent$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + public final class space/kscience/visionforge/VisionKt { public static final fun getVisible (Lspace/kscience/visionforge/Vision;)Ljava/lang/Boolean; public static final fun onPropertyChange (Lspace/kscience/visionforge/Vision;Lkotlinx/coroutines/CoroutineScope;Lkotlin/jvm/functions/Function2;)Lkotlinx/coroutines/Job; @@ -649,8 +676,8 @@ public final class space/kscience/visionforge/VisionPropertiesKt { public static final fun get (Lspace/kscience/visionforge/VisionProperties;Ljava/lang/String;Ljava/lang/Boolean;Ljava/lang/Boolean;)Lspace/kscience/dataforge/meta/Meta; public static synthetic fun get$default (Lspace/kscience/visionforge/MutableVisionProperties;Ljava/lang/String;Ljava/lang/Boolean;Ljava/lang/Boolean;ILjava/lang/Object;)Lspace/kscience/dataforge/meta/MutableMeta; public static synthetic fun get$default (Lspace/kscience/visionforge/VisionProperties;Ljava/lang/String;Ljava/lang/Boolean;Ljava/lang/Boolean;ILjava/lang/Object;)Lspace/kscience/dataforge/meta/Meta; - public static final fun getValue (Lspace/kscience/visionforge/VisionProperties;Ljava/lang/String;Ljava/lang/Boolean;Ljava/lang/Boolean;)Lspace/kscience/dataforge/meta/Value; - public static synthetic fun getValue$default (Lspace/kscience/visionforge/VisionProperties;Ljava/lang/String;Ljava/lang/Boolean;Ljava/lang/Boolean;ILjava/lang/Object;)Lspace/kscience/dataforge/meta/Value; + public static final fun getValue (Lspace/kscience/visionforge/VisionProperties;Ljava/lang/String;ZLjava/lang/Boolean;)Lspace/kscience/dataforge/meta/Value; + public static synthetic fun getValue$default (Lspace/kscience/visionforge/VisionProperties;Ljava/lang/String;ZLjava/lang/Boolean;ILjava/lang/Object;)Lspace/kscience/dataforge/meta/Value; public static final fun invoke (Lspace/kscience/visionforge/MutableVisionProperties;Lkotlin/jvm/functions/Function1;)V public static final fun remove (Lspace/kscience/visionforge/MutableVisionProperties;Ljava/lang/String;)V public static final fun remove (Lspace/kscience/visionforge/MutableVisionProperties;Lspace/kscience/dataforge/names/Name;)V @@ -781,8 +808,8 @@ public abstract class space/kscience/visionforge/html/VisionOfHtml : space/kscie public static final field Companion Lspace/kscience/visionforge/html/VisionOfHtml$Companion; public fun ()V public synthetic fun (ILspace/kscience/dataforge/meta/MutableMeta;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V - public final fun getClasses ()Ljava/util/List; - public final fun setClasses (Ljava/util/List;)V + public final fun getClasses ()Ljava/util/Set; + public final fun setClasses (Ljava/util/Set;)V public static final synthetic fun write$Self (Lspace/kscience/visionforge/html/VisionOfHtml;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V } @@ -813,9 +840,16 @@ public final class space/kscience/visionforge/html/VisionOfHtmlButton$Companion } public abstract class space/kscience/visionforge/html/VisionOfHtmlControl : space/kscience/visionforge/html/VisionOfHtml, space/kscience/visionforge/ControlVision { + public static final field Companion Lspace/kscience/visionforge/html/VisionOfHtmlControl$Companion; public fun ()V + public synthetic fun (ILspace/kscience/dataforge/meta/MutableMeta;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V public fun dispatchControlEvent (Lspace/kscience/visionforge/VisionControlEvent;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; public fun getControlEventFlow ()Lkotlinx/coroutines/flow/SharedFlow; + public static final synthetic fun write$Self (Lspace/kscience/visionforge/html/VisionOfHtmlControl;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final class space/kscience/visionforge/html/VisionOfHtmlControl$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; } public final class space/kscience/visionforge/html/VisionOfHtmlForm : space/kscience/visionforge/html/VisionOfHtmlControl { @@ -849,11 +883,9 @@ public final class space/kscience/visionforge/html/VisionOfHtmlFormKt { public class space/kscience/visionforge/html/VisionOfHtmlInput : space/kscience/visionforge/html/VisionOfHtmlControl { public static final field Companion Lspace/kscience/visionforge/html/VisionOfHtmlInput$Companion; - public synthetic fun (ILjava/lang/String;Lspace/kscience/visionforge/html/InputFeedbackMode;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V - public fun (Ljava/lang/String;Lspace/kscience/visionforge/html/InputFeedbackMode;)V - public synthetic fun (Ljava/lang/String;Lspace/kscience/visionforge/html/InputFeedbackMode;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public synthetic fun (ILspace/kscience/dataforge/meta/MutableMeta;Ljava/lang/String;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V + public fun (Ljava/lang/String;)V public final fun getDisabled ()Z - public final fun getFeedbackMode ()Lspace/kscience/visionforge/html/InputFeedbackMode; public final fun getFieldName ()Ljava/lang/String; public final fun getInputType ()Ljava/lang/String; public final fun getValue ()Lspace/kscience/dataforge/meta/Value; @@ -891,6 +923,8 @@ public final class space/kscience/visionforge/html/VisionOfHtmlKt { public static synthetic fun htmlRangeField$default (Lspace/kscience/visionforge/html/VisionOutput;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lspace/kscience/visionforge/html/VisionOfRangeField; public static final fun htmlTextField (Lspace/kscience/visionforge/html/VisionOutput;Lkotlin/jvm/functions/Function1;)Lspace/kscience/visionforge/html/VisionOfTextField; public static synthetic fun htmlTextField$default (Lspace/kscience/visionforge/html/VisionOutput;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lspace/kscience/visionforge/html/VisionOfTextField; + public static final fun onInput (Lspace/kscience/visionforge/html/VisionOfHtmlInput;Lkotlinx/coroutines/CoroutineScope;Lkotlin/jvm/functions/Function2;)Lkotlinx/coroutines/Job; + public static synthetic fun onInput$default (Lspace/kscience/visionforge/html/VisionOfHtmlInput;Lkotlinx/coroutines/CoroutineScope;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)Lkotlinx/coroutines/Job; public static final fun onValueChange (Lspace/kscience/visionforge/html/VisionOfHtmlInput;Lkotlinx/coroutines/CoroutineScope;Lkotlin/jvm/functions/Function2;)Lkotlinx/coroutines/Job; public static synthetic fun onValueChange$default (Lspace/kscience/visionforge/html/VisionOfHtmlInput;Lkotlinx/coroutines/CoroutineScope;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)Lkotlinx/coroutines/Job; } diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/ControlVision.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/ControlVision.kt index dc27662f..627a2aa1 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/ControlVision.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/ControlVision.kt @@ -83,9 +83,32 @@ public class VisionValueChangeEvent(override val meta: Meta) : VisionControlEven override fun toString(): String = meta.toString() } + public fun VisionValueChangeEvent(value: Value?, name: Name? = null): VisionValueChangeEvent = VisionValueChangeEvent( Meta { this.value = value name?.let { set("name", it.toString()) } } ) + + +@Serializable +@SerialName("control.input") +public class VisionInputEvent(override val meta: Meta) : VisionControlEvent() { + + public val value: Value? get() = meta.value + + /** + * The name of a control that fired the event + */ + public val name: Name? get() = meta["name"]?.string?.parseAsName() + + override fun toString(): String = meta.toString() +} + +public fun VisionInputEvent(value: Value?, name: Name? = null): VisionInputEvent = VisionInputEvent( + Meta { + this.value = value + name?.let { set("name", it.toString()) } + } +) diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionClient.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionClient.kt index 7a62de7d..2d77dfd0 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionClient.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionClient.kt @@ -1,5 +1,7 @@ package space.kscience.visionforge +import kotlinx.coroutines.Job +import kotlinx.coroutines.launch import space.kscience.dataforge.context.Plugin import space.kscience.dataforge.meta.Meta import space.kscience.dataforge.names.Name @@ -16,6 +18,10 @@ public interface VisionClient: Plugin { public fun notifyPropertyChanged(visionName: Name, propertyName: Name, item: Meta?) } +public fun VisionClient.sendEventAsync(targetName: Name, event: VisionEvent): Job = context.launch { + sendEvent(targetName, event) +} + public fun VisionClient.notifyPropertyChanged(visionName: Name, propertyName: String, item: Meta?) { notifyPropertyChanged(visionName, propertyName.parseAsName(true), item) } diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionManager.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionManager.kt index 9b5a21ac..84ed8286 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionManager.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionManager.kt @@ -85,6 +85,7 @@ public class VisionManager(meta: Meta) : AbstractPlugin(meta), MutableVisionCont subclass(VisionMetaEvent.serializer()) subclass(VisionClickEvent.serializer()) subclass(VisionValueChangeEvent.serializer()) + subclass(VisionInputEvent.serializer()) } } diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionProperties.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionProperties.kt index 3c375c62..b7a66625 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionProperties.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionProperties.kt @@ -265,14 +265,14 @@ public abstract class AbstractVisionProperties( public fun VisionProperties.getValue( name: String, - inherit: Boolean? = null, + inherit: Boolean, includeStyles: Boolean? = null, ): Value? = getValue(name.parseAsName(), inherit, includeStyles) /** * Get [Vision] property using key as a String */ -public fun VisionProperties.get( +public operator fun VisionProperties.get( name: String, inherit: Boolean? = null, includeStyles: Boolean? = null, @@ -292,7 +292,7 @@ public fun MutableVisionProperties.root( /** * Get [Vision] property using key as a String */ -public fun MutableVisionProperties.get( +public operator fun MutableVisionProperties.get( name: String, inherit: Boolean? = null, includeStyles: Boolean? = null, diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionOfHtml.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionOfHtml.kt index 0738ddc6..2bd7b9de 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionOfHtml.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionOfHtml.kt @@ -12,15 +12,16 @@ import kotlinx.serialization.Serializable import kotlinx.serialization.Transient import space.kscience.dataforge.meta.* import space.kscience.dataforge.names.asName -import space.kscience.visionforge.AbstractVision -import space.kscience.visionforge.ControlVision -import space.kscience.visionforge.VisionControlEvent -import space.kscience.visionforge.VisionValueChangeEvent +import space.kscience.visionforge.* @Serializable public abstract class VisionOfHtml : AbstractVision() { - public var classes: List by properties.stringList(*emptyArray()) + public var classes: Set + get() = properties.get(::classes.name,false).stringList?.toSet() ?: emptySet() + set(value) { + properties[::classes.name] = value.map { it.asValue() } + } } @Serializable @@ -58,6 +59,7 @@ public enum class InputFeedbackMode { NONE } +@Serializable public abstract class VisionOfHtmlControl: VisionOfHtml(), ControlVision{ @Transient @@ -76,7 +78,6 @@ public abstract class VisionOfHtmlControl: VisionOfHtml(), ControlVision{ @SerialName("html.input") public open class VisionOfHtmlInput( public val inputType: String, - public val feedbackMode: InputFeedbackMode = InputFeedbackMode.ONCHANGE, ) : VisionOfHtmlControl() { public var value: Value? by properties.value() public var disabled: Boolean by properties.boolean { false } @@ -92,6 +93,11 @@ public fun VisionOfHtmlInput.onValueChange( callback: suspend VisionValueChangeEvent.() -> Unit, ): Job = controlEventFlow.filterIsInstance().onEach(callback).launchIn(scope) +public fun VisionOfHtmlInput.onInput( + scope: CoroutineScope = manager?.context ?: error("Coroutine context is not resolved for $this"), + callback: suspend VisionInputEvent.() -> Unit, +): Job = controlEventFlow.filterIsInstance().onEach(callback).launchIn(scope) + @Suppress("UnusedReceiverParameter") public inline fun VisionOutput.htmlInput( inputType: String, diff --git a/visionforge-core/src/commonTest/kotlin/space/kscience/visionforge/meta/VisionPropertyTest.kt b/visionforge-core/src/commonTest/kotlin/space/kscience/visionforge/meta/VisionPropertyTest.kt index b1ca970a..e8ebe406 100644 --- a/visionforge-core/src/commonTest/kotlin/space/kscience/visionforge/meta/VisionPropertyTest.kt +++ b/visionforge-core/src/commonTest/kotlin/space/kscience/visionforge/meta/VisionPropertyTest.kt @@ -40,7 +40,7 @@ internal class VisionPropertyTest { @Test fun testPropertyEdit() { val vision = manager.group() - vision.properties.get("fff.ddd").apply { + vision.properties["fff.ddd"].apply { value = 2.asValue() } assertEquals(2, vision.properties.getValue("fff.ddd")?.int) @@ -50,7 +50,7 @@ internal class VisionPropertyTest { @Test fun testPropertyUpdate() { val vision = manager.group() - vision.properties.get("fff").updateWith(TestScheme) { + vision.properties["fff"].updateWith(TestScheme) { ddd = 2 } assertEquals(2, vision.properties.getValue("fff.ddd")?.int) diff --git a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/inputRenderers.kt b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/inputRenderers.kt index 4112370a..3deb00da 100644 --- a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/inputRenderers.kt +++ b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/inputRenderers.kt @@ -1,18 +1,14 @@ package space.kscience.visionforge -import kotlinx.coroutines.launch import kotlinx.dom.clear import kotlinx.html.InputType import kotlinx.html.div import kotlinx.html.js.input import org.w3c.dom.HTMLElement import org.w3c.dom.HTMLInputElement -import org.w3c.dom.events.Event -import space.kscience.dataforge.meta.Value import space.kscience.dataforge.meta.asValue import space.kscience.dataforge.meta.double import space.kscience.dataforge.meta.string -import space.kscience.dataforge.names.Name import space.kscience.visionforge.html.* /** @@ -26,13 +22,6 @@ internal fun HTMLElement.subscribeToVision(vision: VisionOfHtml) { } } - -private fun VisionClient.sendInputEvent(name: Name, value: Value?) { - context.launch { - sendEvent(name, VisionValueChangeEvent(value, name)) - } -} - /** * Subscribes the HTML input element to a given vision. * @@ -62,16 +51,13 @@ internal val inputVisionRenderer: ElementVisionRenderer = ElementVisionRenderer< input { type = InputType.text }.also { htmlInputElement -> - val onEvent: (Event) -> Unit = { - client.sendInputEvent(name, htmlInputElement.value.asValue()) + + htmlInputElement.onchange = { + client.sendEventAsync(name, VisionValueChangeEvent(htmlInputElement.value.asValue(), name)) } - - when (vision.feedbackMode) { - InputFeedbackMode.ONCHANGE -> htmlInputElement.onchange = onEvent - - InputFeedbackMode.ONINPUT -> htmlInputElement.oninput = onEvent - InputFeedbackMode.NONE -> {} + htmlInputElement.oninput = { + client.sendEventAsync(name, VisionInputEvent(htmlInputElement.value.asValue(), name)) } htmlInputElement.subscribeToInput(vision) @@ -86,18 +72,16 @@ internal val checkboxVisionRenderer: ElementVisionRenderer = input { type = InputType.checkBox }.also { htmlInputElement -> - val onEvent: (Event) -> Unit = { - client.sendInputEvent(name, htmlInputElement.checked.asValue()) + + htmlInputElement.onchange = { + client.sendEventAsync(name, VisionValueChangeEvent(htmlInputElement.value.asValue(), name)) } - - when (vision.feedbackMode) { - InputFeedbackMode.ONCHANGE -> htmlInputElement.onchange = onEvent - - InputFeedbackMode.ONINPUT -> htmlInputElement.oninput = onEvent - InputFeedbackMode.NONE -> {} + htmlInputElement.oninput = { + client.sendEventAsync(name, VisionInputEvent(htmlInputElement.value.asValue(), name)) } + htmlInputElement.subscribeToInput(vision) vision.useProperty(VisionOfCheckbox::checked) { htmlInputElement.checked = it ?: false @@ -110,16 +94,13 @@ internal val textVisionRenderer: ElementVisionRenderer = input { type = InputType.text }.also { htmlInputElement -> - val onEvent: (Event) -> Unit = { - client.sendInputEvent(name, htmlInputElement.value.asValue()) + + htmlInputElement.onchange = { + client.sendEventAsync(name, VisionValueChangeEvent(htmlInputElement.value.asValue(), name)) } - - when (vision.feedbackMode) { - InputFeedbackMode.ONCHANGE -> htmlInputElement.onchange = onEvent - - InputFeedbackMode.ONINPUT -> htmlInputElement.oninput = onEvent - InputFeedbackMode.NONE -> {} + htmlInputElement.oninput = { + client.sendEventAsync(name, VisionInputEvent(htmlInputElement.value.asValue(), name)) } htmlInputElement.subscribeToInput(vision) @@ -135,18 +116,19 @@ internal val numberVisionRenderer: ElementVisionRenderer = type = InputType.number }.also { htmlInputElement -> - val onEvent: (Event) -> Unit = { + htmlInputElement.onchange = { htmlInputElement.value.toDoubleOrNull()?.let { - client.sendInputEvent(name, htmlInputElement.value.asValue()) + client.sendEventAsync(name, VisionValueChangeEvent(it.asValue(), name)) } } - when (vision.feedbackMode) { - InputFeedbackMode.ONCHANGE -> htmlInputElement.onchange = onEvent - - InputFeedbackMode.ONINPUT -> htmlInputElement.oninput = onEvent - InputFeedbackMode.NONE -> {} + htmlInputElement.oninput = { + htmlInputElement.value.toDoubleOrNull()?.let { + client.sendEventAsync(name, VisionInputEvent(it.asValue(), name)) + } } + + htmlInputElement.subscribeToInput(vision) vision.useProperty(VisionOfNumberField::value) { htmlInputElement.valueAsNumber = it?.double ?: 0.0 @@ -163,18 +145,18 @@ internal val rangeVisionRenderer: ElementVisionRenderer = step = vision.step.toString() }.also { htmlInputElement -> - val onEvent: (Event) -> Unit = { + htmlInputElement.onchange = { htmlInputElement.value.toDoubleOrNull()?.let { - client.sendInputEvent(name, htmlInputElement.value.asValue()) + client.sendEventAsync(name, VisionValueChangeEvent(it.asValue(), name)) } } - when (vision.feedbackMode) { - InputFeedbackMode.ONCHANGE -> htmlInputElement.onchange = onEvent - - InputFeedbackMode.ONINPUT -> htmlInputElement.oninput = onEvent - InputFeedbackMode.NONE -> {} + htmlInputElement.oninput = { + htmlInputElement.value.toDoubleOrNull()?.let { + client.sendEventAsync(name, VisionInputEvent(it.asValue(), name)) + } } + htmlInputElement.subscribeToInput(vision) vision.useProperty(VisionOfRangeField::value) { htmlInputElement.valueAsNumber = it?.double ?: 0.0 diff --git a/visionforge-jupyter/visionforge-jupyter-common/build.gradle.kts b/visionforge-jupyter/visionforge-jupyter-common/build.gradle.kts index e6fd162b..b9883d9b 100644 --- a/visionforge-jupyter/visionforge-jupyter-common/build.gradle.kts +++ b/visionforge-jupyter/visionforge-jupyter-common/build.gradle.kts @@ -7,16 +7,7 @@ description = "Jupyter api artifact including all common modules" kscience { fullStack( "js/visionforge-jupyter-common.js", - jsConfig = { useCommonJs() } - ) { - commonWebpackConfig { - sourceMaps = false - cssSupport { - enabled.set(false) - } - } - } - + ) dependencies { api(projects.visionforgeSolid) api(projects.visionforgePlotly) @@ -30,7 +21,6 @@ kscience { } jsMain { - implementation(projects.ui.ring) implementation(projects.visionforgeThreejs) } diff --git a/visionforge-jupyter/visionforge-jupyter-common/src/jsMain/kotlin/commonJupyter.kt b/visionforge-jupyter/visionforge-jupyter-common/src/jsMain/kotlin/commonJupyter.kt index e5fb4edd..ae0e29e2 100644 --- a/visionforge-jupyter/visionforge-jupyter-common/src/jsMain/kotlin/commonJupyter.kt +++ b/visionforge-jupyter/visionforge-jupyter-common/src/jsMain/kotlin/commonJupyter.kt @@ -3,12 +3,12 @@ package space.kscience.visionforge.gdml.jupyter import space.kscience.visionforge.jupyter.VFNotebookClient import space.kscience.visionforge.markup.MarkupPlugin import space.kscience.visionforge.plotly.PlotlyPlugin -import space.kscience.visionforge.ring.ThreeWithControlsPlugin import space.kscience.visionforge.runVisionClient +import space.kscience.visionforge.solid.three.ThreePlugin import space.kscience.visionforge.tables.TableVisionJsPlugin public fun main(): Unit = runVisionClient { - plugin(ThreeWithControlsPlugin) + plugin(ThreePlugin) plugin(PlotlyPlugin) plugin(MarkupPlugin) plugin(TableVisionJsPlugin) diff --git a/visionforge-solid/api/visionforge-solid.api b/visionforge-solid/api/visionforge-solid.api index a3dc7838..cfeecfe3 100644 --- a/visionforge-solid/api/visionforge-solid.api +++ b/visionforge-solid/api/visionforge-solid.api @@ -1141,14 +1141,14 @@ public final class space/kscience/visionforge/solid/specifications/Canvas3DOptio public final fun getAxes ()Lspace/kscience/visionforge/solid/specifications/AxesScheme; public final fun getCamera ()Lspace/kscience/visionforge/solid/specifications/CameraScheme; public final fun getClipping ()Lspace/kscience/visionforge/solid/specifications/PointScheme; - public final fun getControls ()Lspace/kscience/visionforge/solid/specifications/ControlsScheme; + public final fun getControls ()Lspace/kscience/visionforge/solid/specifications/Canvas3DUIScheme; public final fun getLayers ()Ljava/util/List; public final fun getOnSelect ()Lkotlin/jvm/functions/Function1; public final fun getSize ()Lspace/kscience/visionforge/solid/specifications/CanvasSize; public final fun setAxes (Lspace/kscience/visionforge/solid/specifications/AxesScheme;)V public final fun setCamera (Lspace/kscience/visionforge/solid/specifications/CameraScheme;)V public final fun setClipping (Lspace/kscience/visionforge/solid/specifications/PointScheme;)V - public final fun setControls (Lspace/kscience/visionforge/solid/specifications/ControlsScheme;)V + public final fun setControls (Lspace/kscience/visionforge/solid/specifications/Canvas3DUIScheme;)V public final fun setLayers (Ljava/util/List;)V public final fun setOnSelect (Lkotlin/jvm/functions/Function1;)V public final fun setSize (Lspace/kscience/visionforge/solid/specifications/CanvasSize;)V @@ -1163,6 +1163,16 @@ public final class space/kscience/visionforge/solid/specifications/Canvas3DOptio public static final fun computeWidth (Lspace/kscience/visionforge/solid/specifications/CanvasSize;Ljava/lang/Number;)I } +public final class space/kscience/visionforge/solid/specifications/Canvas3DUIScheme : space/kscience/dataforge/meta/Scheme { + public static final field Companion Lspace/kscience/visionforge/solid/specifications/Canvas3DUIScheme$Companion; + public fun ()V + public final fun getEnabled ()Z + public final fun setEnabled (Z)V +} + +public final class space/kscience/visionforge/solid/specifications/Canvas3DUIScheme$Companion : space/kscience/dataforge/meta/SchemeSpec { +} + public final class space/kscience/visionforge/solid/specifications/CanvasSize : space/kscience/dataforge/meta/Scheme { public static final field Companion Lspace/kscience/visionforge/solid/specifications/CanvasSize$Companion; public fun ()V @@ -1189,14 +1199,6 @@ public final class space/kscience/visionforge/solid/specifications/Clipping : sp public fun getDescriptor ()Lspace/kscience/dataforge/meta/descriptors/MetaDescriptor; } -public final class space/kscience/visionforge/solid/specifications/ControlsScheme : space/kscience/dataforge/meta/Scheme { - public static final field Companion Lspace/kscience/visionforge/solid/specifications/ControlsScheme$Companion; - public fun ()V -} - -public final class space/kscience/visionforge/solid/specifications/ControlsScheme$Companion : space/kscience/dataforge/meta/SchemeSpec { -} - public final class space/kscience/visionforge/solid/specifications/PointScheme : space/kscience/dataforge/meta/Scheme { public static final field Companion Lspace/kscience/visionforge/solid/specifications/PointScheme$Companion; public fun ()V diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/specifications/Canvas3DOptions.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/specifications/Canvas3DOptions.kt index b24c9b75..11f179ce 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/specifications/Canvas3DOptions.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/specifications/Canvas3DOptions.kt @@ -62,7 +62,7 @@ public class Canvas3DOptions : Scheme() { @Suppress("DEPRECATION") public var axes: AxesScheme by spec(AxesScheme) public var camera: CameraScheme by spec(CameraScheme) - public var controls: ControlsScheme by spec(ControlsScheme) + public var controls: Canvas3DUIScheme by spec(Canvas3DUIScheme) public var size: CanvasSize by spec(CanvasSize) @@ -92,7 +92,7 @@ public class Canvas3DOptions : Scheme() { hide() } - scheme(Canvas3DOptions::controls, ControlsScheme) { + scheme(Canvas3DOptions::controls, Canvas3DUIScheme) { hide() } diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/specifications/Canvas3DUIScheme.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/specifications/Canvas3DUIScheme.kt new file mode 100644 index 00000000..4424e2fc --- /dev/null +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/specifications/Canvas3DUIScheme.kt @@ -0,0 +1,13 @@ +package space.kscience.visionforge.solid.specifications + +import space.kscience.dataforge.meta.Scheme +import space.kscience.dataforge.meta.SchemeSpec +import space.kscience.dataforge.meta.boolean + + +public class Canvas3DUIScheme : Scheme() { + + public var enabled: Boolean by boolean{true} + + public companion object : SchemeSpec(::Canvas3DUIScheme) +} \ No newline at end of file diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/specifications/ControlsScheme.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/specifications/ControlsScheme.kt deleted file mode 100644 index 5e68f37c..00000000 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/specifications/ControlsScheme.kt +++ /dev/null @@ -1,9 +0,0 @@ -package space.kscience.visionforge.solid.specifications - -import space.kscience.dataforge.meta.Scheme -import space.kscience.dataforge.meta.SchemeSpec - - -public class ControlsScheme : Scheme() { - public companion object : SchemeSpec(::ControlsScheme) -} \ No newline at end of file diff --git a/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/SolidPropertyTest.kt b/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/SolidPropertyTest.kt index 4991c12d..7b559ab7 100644 --- a/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/SolidPropertyTest.kt +++ b/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/SolidPropertyTest.kt @@ -4,6 +4,7 @@ import kotlinx.coroutines.CompletableDeferred import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.delay import kotlinx.coroutines.test.runTest +import space.kscience.dataforge.meta.getValue import space.kscience.dataforge.meta.int import space.kscience.dataforge.meta.set import space.kscience.dataforge.meta.string diff --git a/visionforge-tables/build.gradle.kts b/visionforge-tables/build.gradle.kts index f4197864..9eb9f2cf 100644 --- a/visionforge-tables/build.gradle.kts +++ b/visionforge-tables/build.gradle.kts @@ -9,23 +9,17 @@ kscience { js { useCommonJs() binaries.library() - browser { - commonWebpackConfig { - cssSupport { - enabled.set(true) - } - } - } } - dependencies { + + useSerialization() + commonMain { api(projects.visionforgeCore) api("space.kscience:tables-kt:${tablesVersion}") } - dependencies(jsMain) { + jsMain { implementation(npm("tabulator-tables", "5.5.2")) implementation(npm("@types/tabulator-tables", "5.5.3")) } - useSerialization() } readme { diff --git a/visionforge-tables/src/commonMain/kotlin/space/kscience/visionforge/tables/TableVisionPlugin.kt b/visionforge-tables/src/commonMain/kotlin/space/kscience/visionforge/tables/TableVisionPlugin.kt index d6bc9b1d..4a8a06d1 100644 --- a/visionforge-tables/src/commonMain/kotlin/space/kscience/visionforge/tables/TableVisionPlugin.kt +++ b/visionforge-tables/src/commonMain/kotlin/space/kscience/visionforge/tables/TableVisionPlugin.kt @@ -13,12 +13,11 @@ import space.kscience.visionforge.VisionPlugin public class TableVisionPlugin : VisionPlugin() { override val tag: PluginTag get() = Companion.tag - override val visionSerializersModule: SerializersModule - get() = SerializersModule { - polymorphic(Vision::class) { - subclass(VisionOfTable.serializer()) - } + override val visionSerializersModule: SerializersModule = SerializersModule { + polymorphic(Vision::class) { + subclass(VisionOfTable.serializer()) } + } public companion object : PluginFactory { override val tag: PluginTag = PluginTag("vision.table", PluginTag.DATAFORGE_GROUP) diff --git a/visionforge-threejs/build.gradle.kts b/visionforge-threejs/build.gradle.kts index 41714618..6e522585 100644 --- a/visionforge-threejs/build.gradle.kts +++ b/visionforge-threejs/build.gradle.kts @@ -1,22 +1,26 @@ plugins { id("space.kscience.gradle.mpp") + alias(spclibs.plugins.compose) } -kotlin{ +kotlin { explicitApi = org.jetbrains.kotlin.gradle.dsl.ExplicitApiMode.Disabled } -kscience{ - js{ +kscience { + js { binaries.library() } - jsMain{ - dependencies { - api(projects.visionforgeSolid) - implementation(npm("three", "0.143.0")) - implementation(npm("three-csg-ts", "3.1.10")) - implementation(npm("three.meshline","1.4.0")) - } + + commonMain { + api(projects.visionforgeSolid) + api(projects.visionforgeCompose) + } + + jsMain { + implementation(npm("three", "0.143.0")) + implementation(npm("three-csg-ts", "3.1.13")) + implementation(npm("three.meshline", "1.4.0")) } } diff --git a/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/ThreeCanvas.kt b/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/ThreeCanvas.kt index b65d1fce..5723626a 100644 --- a/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/ThreeCanvas.kt +++ b/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/ThreeCanvas.kt @@ -236,7 +236,7 @@ public class ThreeCanvas( // } // } - private fun addControls(element: Node, controls: ControlsScheme) { + private fun addControls(element: Node, controls: Canvas3DUIScheme) { when (controls.meta["type"].string) { "trackball" -> TrackballControls(camera, element) else -> OrbitControls(camera, element) diff --git a/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/ThreePlugin.kt b/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/ThreePlugin.kt index 84552dd4..724c52a7 100644 --- a/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/ThreePlugin.kt +++ b/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/ThreePlugin.kt @@ -2,14 +2,15 @@ package space.kscience.visionforge.solid.three import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach +import org.jetbrains.compose.web.renderComposable import org.w3c.dom.Element -import org.w3c.dom.HTMLElement import space.kscience.dataforge.context.* import space.kscience.dataforge.meta.Meta import space.kscience.dataforge.names.* import space.kscience.visionforge.* import space.kscience.visionforge.solid.* import space.kscience.visionforge.solid.specifications.Canvas3DOptions +import space.kscience.visionforge.solid.three.compose.ThreeView import space.kscience.visionforge.solid.three.set import three.core.Object3D import kotlin.collections.set @@ -21,7 +22,7 @@ public class ThreePlugin : AbstractPlugin(), ElementVisionRenderer { public val solids: Solids by require(Solids) - public val client: VisionClient? get() = context.plugins.get() + public val client: VisionClient by require(JsVisionClient) private val objectFactories = HashMap, ThreeFactory<*>>() private val compositeFactory = ThreeCompositeFactory(this) @@ -123,15 +124,6 @@ public class ThreePlugin : AbstractPlugin(), ElementVisionRenderer { } } - private val canvasCache = HashMap() - - public fun getOrCreateCanvas( - element: Element, - options: Canvas3DOptions, - ): ThreeCanvas = canvasCache.getOrPut(element) { - ThreeCanvas(this, element, options) - } - override fun content(target: String): Map { return when (target) { ElementVisionRenderer.TYPE -> mapOf("three".asName() to this) @@ -142,20 +134,11 @@ public class ThreePlugin : AbstractPlugin(), ElementVisionRenderer { override fun rateVision(vision: Vision): Int = if (vision is Solid) ElementVisionRenderer.DEFAULT_RATING else ElementVisionRenderer.ZERO_RATING - internal fun renderSolid( - element: Element, - vision: Solid, - options: Canvas3DOptions, - ): ThreeCanvas = getOrCreateCanvas(element, options).apply { - render(vision) - } - override fun render(element: Element, client: VisionClient, name: Name, vision: Vision, meta: Meta) { - renderSolid( - element, - vision as? Solid ?: error("Solid expected but ${vision::class} found"), - Canvas3DOptions.read(meta) - ) + require(vision is Solid) { "Expected Solid but found ${vision::class}" } + renderComposable(element) { + ThreeView(solids, vision, null, Canvas3DOptions.read(meta)) + } } public companion object : PluginFactory { @@ -165,14 +148,6 @@ public class ThreePlugin : AbstractPlugin(), ElementVisionRenderer { } } -public fun ThreePlugin.render( - element: HTMLElement, - obj: Solid, - optionsBuilder: Canvas3DOptions.() -> Unit = {}, -): ThreeCanvas = renderSolid(element, obj, Canvas3DOptions(optionsBuilder)).apply { - options.apply(optionsBuilder) -} - internal operator fun Object3D.set(token: NameToken, object3D: Object3D) { object3D.name = token.toString() add(object3D) diff --git a/ui/compose/src/jsMain/kotlin/space/kscience/visionforge/compose/ThreeControls.kt b/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/compose/ThreeControls.kt similarity index 95% rename from ui/compose/src/jsMain/kotlin/space/kscience/visionforge/compose/ThreeControls.kt rename to visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/compose/ThreeControls.kt index c559b946..238aea55 100644 --- a/ui/compose/src/jsMain/kotlin/space/kscience/visionforge/compose/ThreeControls.kt +++ b/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/compose/ThreeControls.kt @@ -1,4 +1,4 @@ -package space.kscience.visionforge.compose +package space.kscience.visionforge.solid.three.compose import androidx.compose.runtime.Composable import org.jetbrains.compose.web.css.* @@ -9,6 +9,7 @@ import org.w3c.files.BlobPropertyBag import space.kscience.dataforge.context.Global import space.kscience.dataforge.names.Name import space.kscience.visionforge.Vision +import space.kscience.visionforge.compose.* import space.kscience.visionforge.encodeToString import space.kscience.visionforge.solid.specifications.Canvas3DOptions diff --git a/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/compose/ThreeView.kt b/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/compose/ThreeView.kt new file mode 100644 index 00000000..4b680b80 --- /dev/null +++ b/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/compose/ThreeView.kt @@ -0,0 +1,205 @@ +package space.kscience.visionforge.solid.three.compose + +import androidx.compose.runtime.* +import app.softwork.bootstrapcompose.Card +import kotlinx.dom.clear +import org.jetbrains.compose.web.ExperimentalComposeWebApi +import org.jetbrains.compose.web.css.* +import org.jetbrains.compose.web.dom.* +import space.kscience.dataforge.context.Context +import space.kscience.dataforge.context.request +import space.kscience.dataforge.names.Name +import space.kscience.dataforge.names.isEmpty +import space.kscience.visionforge.Vision +import space.kscience.visionforge.compose.* +import space.kscience.visionforge.root +import space.kscience.visionforge.solid.Solid +import space.kscience.visionforge.solid.SolidGroup +import space.kscience.visionforge.solid.Solids +import space.kscience.visionforge.solid.specifications.Canvas3DOptions +import space.kscience.visionforge.solid.three.ThreeCanvas +import space.kscience.visionforge.solid.three.ThreePlugin +import space.kscience.visionforge.styles + +@Composable +private fun SimpleThreeView( + context: Context, + options: Canvas3DOptions?, + solid: Solid?, + selected: Name?, +) { + + val three: ThreePlugin by derivedStateOf { context.request(ThreePlugin) } + + Div({ + style { + maxWidth(100.vw) + maxHeight(100.vh) + width(100.percent) + height(100.percent) + } + }) { + var canvas: ThreeCanvas? = null + DisposableEffect(options) { + canvas = ThreeCanvas(three, scopeElement, options ?: Canvas3DOptions()) + onDispose { + scopeElement.clear() + canvas = null + } + } + LaunchedEffect(solid) { + if (solid != null) { + canvas?.render(solid) + } else { + canvas?.clear() + } + } + LaunchedEffect(selected) { + canvas?.select(selected) + } + } +} + + +@Composable +public fun ThreeView( + solids: Solids, + solid: Solid?, + initialSelected: Name? = null, + options: Canvas3DOptions? = null, + sidebarTabs: @Composable TabsBuilder.() -> Unit = {}, +) { + var selected: Name? by remember { mutableStateOf(initialSelected) } + + val optionsSnapshot = remember(options) { + (options ?: Canvas3DOptions()).apply { + this.onSelect = { + selected = it + } + } + } + + val selectedVision: Vision? = remember(solid, selected) { + selected?.let { + when { + it.isEmpty() -> solid + else -> (solid as? SolidGroup)?.get(it) + } + } + } + + if (optionsSnapshot.controls.enabled) { + + + FlexRow({ + style { + height(100.percent) + width(100.percent) + flexWrap(FlexWrap.Wrap) + alignItems(AlignItems.Stretch) + alignContent(AlignContent.Stretch) + } + }) { + FlexColumn({ + style { + height(100.percent) + minWidth(600.px) + flex(10, 1, 600.px) + position(Position.Relative) + } + }) { + if (solid == null) { + Div({ + style { + position(Position.Fixed) + width(100.percent) + height(100.percent) + zIndex(1000) + top(40.percent) + left(0.px) + opacity(0.5) + + @OptIn(ExperimentalComposeWebApi::class) filter { + opacity(50.percent) + } + } + }) { + Div({ classes("d-flex", " justify-content-center") }) { + Div({ + classes("spinner-grow", "text-primary") + style { + width(3.cssRem) + height(3.cssRem) + zIndex(20) + } + attr("role", "status") + }) { + Span({ classes("sr-only") }) { Text("Loading 3D vision") } + } + } + } + } else { + SimpleThreeView(solids.context, optionsSnapshot, solid, selected) + } + + selectedVision?.let { vision -> + Div({ + style { + position(Position.Absolute) + top(5.px) + right(5.px) + width(450.px) + } + }) { + Card( + headerAttrs = { + // border = true + }, + header = { + NameCrumbs(selected) { selected = it } + } + ) { + PropertyEditor( + scope = solids.context, + meta = vision.properties.root(), + getPropertyState = { name -> + if (vision.properties.own?.get(name) != null) { + EditorPropertyState.Defined + } else if (vision.properties.root()[name] != null) { + // TODO differentiate + EditorPropertyState.Default() + } else { + EditorPropertyState.Undefined + } + }, + updates = vision.properties.changes, + rootDescriptor = vision.descriptor + ) + + } + + vision.styles.takeIf { it.isNotEmpty() }?.let { styles -> + P { + B { Text("Styles: ") } + Text(styles.joinToString(separator = ", ")) + } + } + } + } + } + } + FlexColumn({ + style { + paddingAll(4.px) + minWidth(400.px) + height(100.percent) + overflowY("auto") + flex(1, 10, 300.px) + } + }) { + ThreeControls(solid, optionsSnapshot, selected, onSelect = { selected = it }, tabBuilder = sidebarTabs) + } + } else { + SimpleThreeView(solids.context, optionsSnapshot, solid, selected) + } +} \ No newline at end of file diff --git a/visionforge-threejs/visionforge-threejs-server/build.gradle.kts b/visionforge-threejs/visionforge-threejs-server/build.gradle.kts index 059f3784..395fea38 100644 --- a/visionforge-threejs/visionforge-threejs-server/build.gradle.kts +++ b/visionforge-threejs/visionforge-threejs-server/build.gradle.kts @@ -1,29 +1,24 @@ plugins { id("space.kscience.gradle.mpp") + alias(spclibs.plugins.compose) } val ktorVersion: String by rootProject.extra kscience { - fullStack("js/visionforge-three.js") { - commonWebpackConfig { - cssSupport { - enabled.set(false) - } - } - } + fullStack("js/visionforge-three.js") - dependencies { + commonMain { api(projects.visionforgeSolid) + api(projects.visionforgeCompose) } - dependencies(jvmMain) { + jvmMain{ api(projects.visionforgeServer) } - dependencies(jsMain) { + jsMain{ api(projects.visionforgeThreejs) - api(projects.ui.ring) compileOnly(npm("webpack-bundle-analyzer","4.5.0")) } } \ No newline at end of file diff --git a/visionforge-threejs/visionforge-threejs-server/src/jsMain/kotlin/space/kscience/visionforge/three/jsMain.kt b/visionforge-threejs/visionforge-threejs-server/src/jsMain/kotlin/space/kscience/visionforge/three/jsMain.kt index d1635ddf..ed2908f5 100644 --- a/visionforge-threejs/visionforge-threejs-server/src/jsMain/kotlin/space/kscience/visionforge/three/jsMain.kt +++ b/visionforge-threejs/visionforge-threejs-server/src/jsMain/kotlin/space/kscience/visionforge/three/jsMain.kt @@ -1,11 +1,11 @@ package space.kscience.visionforge.three import space.kscience.dataforge.misc.DFExperimental -import space.kscience.visionforge.ring.ThreeWithControlsPlugin import space.kscience.visionforge.runVisionClient +import space.kscience.visionforge.solid.three.ThreePlugin @DFExperimental public fun main(): Unit = runVisionClient { - plugin(ThreeWithControlsPlugin) + plugin(ThreePlugin) } \ No newline at end of file diff --git a/visionforge-threejs/visionforge-threejs-server/webpack.config.d/01.ring.js b/visionforge-threejs/visionforge-threejs-server/webpack.config.d/01.ring.js deleted file mode 100644 index b3cc4770..00000000 --- a/visionforge-threejs/visionforge-threejs-server/webpack.config.d/01.ring.js +++ /dev/null @@ -1,23 +0,0 @@ -const ringConfig = require('@jetbrains/ring-ui/webpack.config').config; -const path = require('path'); - -config.module.rules.push(...ringConfig.module.rules) - -config.module.rules.push( - { - test: /\.css$/, - exclude: [ - path.resolve(__dirname, "../../node_modules/@jetbrains/ring-ui") - ], - use: [ - { - loader: 'style-loader', - options: {} - }, - { - loader: 'css-loader', - options: {} - } - ] - } -) \ No newline at end of file diff --git a/visionforge-threejs/visionforge-threejs-server/webpack.config.d/02.bundle.js b/visionforge-threejs/visionforge-threejs-server/webpack.config.d/02.bundle.js deleted file mode 100644 index 947253ca..00000000 --- a/visionforge-threejs/visionforge-threejs-server/webpack.config.d/02.bundle.js +++ /dev/null @@ -1,10 +0,0 @@ -const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin; - -module.exports = { - plugins: [ - new BundleAnalyzerPlugin({ - analyzerMode: "static", - reportFilename: "bundle-report.html" - }) - ] -} \ No newline at end of file From e36e4abb7f6fa2e6d08b47be3d5da5ff08d1e3f3 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Mon, 18 Dec 2023 09:59:43 +0300 Subject: [PATCH 18/41] Advanced backwards events --- build.gradle.kts | 2 +- visionforge-core/api/visionforge-core.api | 50 ++++++++++-- .../kscience/visionforge/ControlVision.kt | 23 ++++++ .../kscience/visionforge/VisionClient.kt | 6 ++ .../kscience/visionforge/VisionManager.kt | 1 + .../kscience/visionforge/VisionProperties.kt | 6 +- .../kscience/visionforge/html/VisionOfHtml.kt | 18 +++-- .../visionforge/meta/VisionPropertyTest.kt | 4 +- .../kscience/visionforge/inputRenderers.kt | 80 +++++++------------ .../visionforge/solid/SolidPropertyTest.kt | 1 + 10 files changed, 122 insertions(+), 69 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 57e42d2b..5e015498 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -11,7 +11,7 @@ val dataforgeVersion by extra("0.7.1") allprojects { group = "space.kscience" - version = "0.3.0-RC" + version = "0.3.0" } subprojects { diff --git a/visionforge-core/api/visionforge-core.api b/visionforge-core/api/visionforge-core.api index 0cd2b904..89e926ec 100644 --- a/visionforge-core/api/visionforge-core.api +++ b/visionforge-core/api/visionforge-core.api @@ -225,6 +225,8 @@ public abstract interface class space/kscience/visionforge/ControlVision : space public final class space/kscience/visionforge/ControlVisionKt { public static final fun VisionClickEvent (Lspace/kscience/dataforge/meta/Meta;Lspace/kscience/dataforge/names/Name;)Lspace/kscience/visionforge/VisionClickEvent; public static synthetic fun VisionClickEvent$default (Lspace/kscience/dataforge/meta/Meta;Lspace/kscience/dataforge/names/Name;ILjava/lang/Object;)Lspace/kscience/visionforge/VisionClickEvent; + public static final fun VisionInputEvent (Lspace/kscience/dataforge/meta/Value;Lspace/kscience/dataforge/names/Name;)Lspace/kscience/visionforge/VisionInputEvent; + public static synthetic fun VisionInputEvent$default (Lspace/kscience/dataforge/meta/Value;Lspace/kscience/dataforge/names/Name;ILjava/lang/Object;)Lspace/kscience/visionforge/VisionInputEvent; public static final fun VisionValueChangeEvent (Lspace/kscience/dataforge/meta/Value;Lspace/kscience/dataforge/names/Name;)Lspace/kscience/visionforge/VisionValueChangeEvent; public static synthetic fun VisionValueChangeEvent$default (Lspace/kscience/dataforge/meta/Value;Lspace/kscience/dataforge/names/Name;ILjava/lang/Object;)Lspace/kscience/visionforge/VisionValueChangeEvent; public static final fun onClick (Lspace/kscience/visionforge/ClickControl;Lkotlinx/coroutines/CoroutineScope;Lkotlin/jvm/functions/Function2;)Lkotlinx/coroutines/Job; @@ -495,6 +497,7 @@ public final class space/kscience/visionforge/VisionClientKt { public static final fun notifyPropertyChanged (Lspace/kscience/visionforge/VisionClient;Lspace/kscience/dataforge/names/Name;Ljava/lang/String;Ljava/lang/String;)V public static final fun notifyPropertyChanged (Lspace/kscience/visionforge/VisionClient;Lspace/kscience/dataforge/names/Name;Ljava/lang/String;Lspace/kscience/dataforge/meta/Meta;)V public static final fun notifyPropertyChanged (Lspace/kscience/visionforge/VisionClient;Lspace/kscience/dataforge/names/Name;Ljava/lang/String;Z)V + public static final fun sendEventAsync (Lspace/kscience/visionforge/VisionClient;Lspace/kscience/dataforge/names/Name;Lspace/kscience/visionforge/VisionEvent;)Lkotlinx/coroutines/Job; } public abstract interface class space/kscience/visionforge/VisionContainer { @@ -560,6 +563,30 @@ public final class space/kscience/visionforge/VisionGroupKt { public static synthetic fun group$default (Lspace/kscience/visionforge/MutableVisionContainer;Lspace/kscience/dataforge/names/Name;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lspace/kscience/visionforge/SimpleVisionGroup; } +public final class space/kscience/visionforge/VisionInputEvent : space/kscience/visionforge/VisionControlEvent { + public static final field Companion Lspace/kscience/visionforge/VisionInputEvent$Companion; + public fun (Lspace/kscience/dataforge/meta/Meta;)V + public fun getMeta ()Lspace/kscience/dataforge/meta/Meta; + public final fun getName ()Lspace/kscience/dataforge/names/Name; + public final fun getValue ()Lspace/kscience/dataforge/meta/Value; + public fun toString ()Ljava/lang/String; +} + +public final class space/kscience/visionforge/VisionInputEvent$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lspace/kscience/visionforge/VisionInputEvent$$serializer; + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lspace/kscience/visionforge/VisionInputEvent; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lspace/kscience/visionforge/VisionInputEvent;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class space/kscience/visionforge/VisionInputEvent$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + public final class space/kscience/visionforge/VisionKt { public static final fun getVisible (Lspace/kscience/visionforge/Vision;)Ljava/lang/Boolean; public static final fun onPropertyChange (Lspace/kscience/visionforge/Vision;Lkotlinx/coroutines/CoroutineScope;Lkotlin/jvm/functions/Function2;)Lkotlinx/coroutines/Job; @@ -649,8 +676,8 @@ public final class space/kscience/visionforge/VisionPropertiesKt { public static final fun get (Lspace/kscience/visionforge/VisionProperties;Ljava/lang/String;Ljava/lang/Boolean;Ljava/lang/Boolean;)Lspace/kscience/dataforge/meta/Meta; public static synthetic fun get$default (Lspace/kscience/visionforge/MutableVisionProperties;Ljava/lang/String;Ljava/lang/Boolean;Ljava/lang/Boolean;ILjava/lang/Object;)Lspace/kscience/dataforge/meta/MutableMeta; public static synthetic fun get$default (Lspace/kscience/visionforge/VisionProperties;Ljava/lang/String;Ljava/lang/Boolean;Ljava/lang/Boolean;ILjava/lang/Object;)Lspace/kscience/dataforge/meta/Meta; - public static final fun getValue (Lspace/kscience/visionforge/VisionProperties;Ljava/lang/String;Ljava/lang/Boolean;Ljava/lang/Boolean;)Lspace/kscience/dataforge/meta/Value; - public static synthetic fun getValue$default (Lspace/kscience/visionforge/VisionProperties;Ljava/lang/String;Ljava/lang/Boolean;Ljava/lang/Boolean;ILjava/lang/Object;)Lspace/kscience/dataforge/meta/Value; + public static final fun getValue (Lspace/kscience/visionforge/VisionProperties;Ljava/lang/String;ZLjava/lang/Boolean;)Lspace/kscience/dataforge/meta/Value; + public static synthetic fun getValue$default (Lspace/kscience/visionforge/VisionProperties;Ljava/lang/String;ZLjava/lang/Boolean;ILjava/lang/Object;)Lspace/kscience/dataforge/meta/Value; public static final fun invoke (Lspace/kscience/visionforge/MutableVisionProperties;Lkotlin/jvm/functions/Function1;)V public static final fun remove (Lspace/kscience/visionforge/MutableVisionProperties;Ljava/lang/String;)V public static final fun remove (Lspace/kscience/visionforge/MutableVisionProperties;Lspace/kscience/dataforge/names/Name;)V @@ -781,8 +808,8 @@ public abstract class space/kscience/visionforge/html/VisionOfHtml : space/kscie public static final field Companion Lspace/kscience/visionforge/html/VisionOfHtml$Companion; public fun ()V public synthetic fun (ILspace/kscience/dataforge/meta/MutableMeta;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V - public final fun getClasses ()Ljava/util/List; - public final fun setClasses (Ljava/util/List;)V + public final fun getClasses ()Ljava/util/Set; + public final fun setClasses (Ljava/util/Set;)V public static final synthetic fun write$Self (Lspace/kscience/visionforge/html/VisionOfHtml;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V } @@ -813,9 +840,16 @@ public final class space/kscience/visionforge/html/VisionOfHtmlButton$Companion } public abstract class space/kscience/visionforge/html/VisionOfHtmlControl : space/kscience/visionforge/html/VisionOfHtml, space/kscience/visionforge/ControlVision { + public static final field Companion Lspace/kscience/visionforge/html/VisionOfHtmlControl$Companion; public fun ()V + public synthetic fun (ILspace/kscience/dataforge/meta/MutableMeta;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V public fun dispatchControlEvent (Lspace/kscience/visionforge/VisionControlEvent;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; public fun getControlEventFlow ()Lkotlinx/coroutines/flow/SharedFlow; + public static final synthetic fun write$Self (Lspace/kscience/visionforge/html/VisionOfHtmlControl;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final class space/kscience/visionforge/html/VisionOfHtmlControl$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; } public final class space/kscience/visionforge/html/VisionOfHtmlForm : space/kscience/visionforge/html/VisionOfHtmlControl { @@ -849,11 +883,9 @@ public final class space/kscience/visionforge/html/VisionOfHtmlFormKt { public class space/kscience/visionforge/html/VisionOfHtmlInput : space/kscience/visionforge/html/VisionOfHtmlControl { public static final field Companion Lspace/kscience/visionforge/html/VisionOfHtmlInput$Companion; - public synthetic fun (ILjava/lang/String;Lspace/kscience/visionforge/html/InputFeedbackMode;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V - public fun (Ljava/lang/String;Lspace/kscience/visionforge/html/InputFeedbackMode;)V - public synthetic fun (Ljava/lang/String;Lspace/kscience/visionforge/html/InputFeedbackMode;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public synthetic fun (ILspace/kscience/dataforge/meta/MutableMeta;Ljava/lang/String;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V + public fun (Ljava/lang/String;)V public final fun getDisabled ()Z - public final fun getFeedbackMode ()Lspace/kscience/visionforge/html/InputFeedbackMode; public final fun getFieldName ()Ljava/lang/String; public final fun getInputType ()Ljava/lang/String; public final fun getValue ()Lspace/kscience/dataforge/meta/Value; @@ -891,6 +923,8 @@ public final class space/kscience/visionforge/html/VisionOfHtmlKt { public static synthetic fun htmlRangeField$default (Lspace/kscience/visionforge/html/VisionOutput;Ljava/lang/Number;Ljava/lang/Number;Ljava/lang/Number;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lspace/kscience/visionforge/html/VisionOfRangeField; public static final fun htmlTextField (Lspace/kscience/visionforge/html/VisionOutput;Lkotlin/jvm/functions/Function1;)Lspace/kscience/visionforge/html/VisionOfTextField; public static synthetic fun htmlTextField$default (Lspace/kscience/visionforge/html/VisionOutput;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lspace/kscience/visionforge/html/VisionOfTextField; + public static final fun onInput (Lspace/kscience/visionforge/html/VisionOfHtmlInput;Lkotlinx/coroutines/CoroutineScope;Lkotlin/jvm/functions/Function2;)Lkotlinx/coroutines/Job; + public static synthetic fun onInput$default (Lspace/kscience/visionforge/html/VisionOfHtmlInput;Lkotlinx/coroutines/CoroutineScope;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)Lkotlinx/coroutines/Job; public static final fun onValueChange (Lspace/kscience/visionforge/html/VisionOfHtmlInput;Lkotlinx/coroutines/CoroutineScope;Lkotlin/jvm/functions/Function2;)Lkotlinx/coroutines/Job; public static synthetic fun onValueChange$default (Lspace/kscience/visionforge/html/VisionOfHtmlInput;Lkotlinx/coroutines/CoroutineScope;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)Lkotlinx/coroutines/Job; } diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/ControlVision.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/ControlVision.kt index dc27662f..627a2aa1 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/ControlVision.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/ControlVision.kt @@ -83,9 +83,32 @@ public class VisionValueChangeEvent(override val meta: Meta) : VisionControlEven override fun toString(): String = meta.toString() } + public fun VisionValueChangeEvent(value: Value?, name: Name? = null): VisionValueChangeEvent = VisionValueChangeEvent( Meta { this.value = value name?.let { set("name", it.toString()) } } ) + + +@Serializable +@SerialName("control.input") +public class VisionInputEvent(override val meta: Meta) : VisionControlEvent() { + + public val value: Value? get() = meta.value + + /** + * The name of a control that fired the event + */ + public val name: Name? get() = meta["name"]?.string?.parseAsName() + + override fun toString(): String = meta.toString() +} + +public fun VisionInputEvent(value: Value?, name: Name? = null): VisionInputEvent = VisionInputEvent( + Meta { + this.value = value + name?.let { set("name", it.toString()) } + } +) diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionClient.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionClient.kt index 7a62de7d..2d77dfd0 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionClient.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionClient.kt @@ -1,5 +1,7 @@ package space.kscience.visionforge +import kotlinx.coroutines.Job +import kotlinx.coroutines.launch import space.kscience.dataforge.context.Plugin import space.kscience.dataforge.meta.Meta import space.kscience.dataforge.names.Name @@ -16,6 +18,10 @@ public interface VisionClient: Plugin { public fun notifyPropertyChanged(visionName: Name, propertyName: Name, item: Meta?) } +public fun VisionClient.sendEventAsync(targetName: Name, event: VisionEvent): Job = context.launch { + sendEvent(targetName, event) +} + public fun VisionClient.notifyPropertyChanged(visionName: Name, propertyName: String, item: Meta?) { notifyPropertyChanged(visionName, propertyName.parseAsName(true), item) } diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionManager.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionManager.kt index 9b5a21ac..84ed8286 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionManager.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionManager.kt @@ -85,6 +85,7 @@ public class VisionManager(meta: Meta) : AbstractPlugin(meta), MutableVisionCont subclass(VisionMetaEvent.serializer()) subclass(VisionClickEvent.serializer()) subclass(VisionValueChangeEvent.serializer()) + subclass(VisionInputEvent.serializer()) } } diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionProperties.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionProperties.kt index 3c375c62..b7a66625 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionProperties.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionProperties.kt @@ -265,14 +265,14 @@ public abstract class AbstractVisionProperties( public fun VisionProperties.getValue( name: String, - inherit: Boolean? = null, + inherit: Boolean, includeStyles: Boolean? = null, ): Value? = getValue(name.parseAsName(), inherit, includeStyles) /** * Get [Vision] property using key as a String */ -public fun VisionProperties.get( +public operator fun VisionProperties.get( name: String, inherit: Boolean? = null, includeStyles: Boolean? = null, @@ -292,7 +292,7 @@ public fun MutableVisionProperties.root( /** * Get [Vision] property using key as a String */ -public fun MutableVisionProperties.get( +public operator fun MutableVisionProperties.get( name: String, inherit: Boolean? = null, includeStyles: Boolean? = null, diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionOfHtml.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionOfHtml.kt index 0738ddc6..2bd7b9de 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionOfHtml.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionOfHtml.kt @@ -12,15 +12,16 @@ import kotlinx.serialization.Serializable import kotlinx.serialization.Transient import space.kscience.dataforge.meta.* import space.kscience.dataforge.names.asName -import space.kscience.visionforge.AbstractVision -import space.kscience.visionforge.ControlVision -import space.kscience.visionforge.VisionControlEvent -import space.kscience.visionforge.VisionValueChangeEvent +import space.kscience.visionforge.* @Serializable public abstract class VisionOfHtml : AbstractVision() { - public var classes: List by properties.stringList(*emptyArray()) + public var classes: Set + get() = properties.get(::classes.name,false).stringList?.toSet() ?: emptySet() + set(value) { + properties[::classes.name] = value.map { it.asValue() } + } } @Serializable @@ -58,6 +59,7 @@ public enum class InputFeedbackMode { NONE } +@Serializable public abstract class VisionOfHtmlControl: VisionOfHtml(), ControlVision{ @Transient @@ -76,7 +78,6 @@ public abstract class VisionOfHtmlControl: VisionOfHtml(), ControlVision{ @SerialName("html.input") public open class VisionOfHtmlInput( public val inputType: String, - public val feedbackMode: InputFeedbackMode = InputFeedbackMode.ONCHANGE, ) : VisionOfHtmlControl() { public var value: Value? by properties.value() public var disabled: Boolean by properties.boolean { false } @@ -92,6 +93,11 @@ public fun VisionOfHtmlInput.onValueChange( callback: suspend VisionValueChangeEvent.() -> Unit, ): Job = controlEventFlow.filterIsInstance().onEach(callback).launchIn(scope) +public fun VisionOfHtmlInput.onInput( + scope: CoroutineScope = manager?.context ?: error("Coroutine context is not resolved for $this"), + callback: suspend VisionInputEvent.() -> Unit, +): Job = controlEventFlow.filterIsInstance().onEach(callback).launchIn(scope) + @Suppress("UnusedReceiverParameter") public inline fun VisionOutput.htmlInput( inputType: String, diff --git a/visionforge-core/src/commonTest/kotlin/space/kscience/visionforge/meta/VisionPropertyTest.kt b/visionforge-core/src/commonTest/kotlin/space/kscience/visionforge/meta/VisionPropertyTest.kt index b1ca970a..e8ebe406 100644 --- a/visionforge-core/src/commonTest/kotlin/space/kscience/visionforge/meta/VisionPropertyTest.kt +++ b/visionforge-core/src/commonTest/kotlin/space/kscience/visionforge/meta/VisionPropertyTest.kt @@ -40,7 +40,7 @@ internal class VisionPropertyTest { @Test fun testPropertyEdit() { val vision = manager.group() - vision.properties.get("fff.ddd").apply { + vision.properties["fff.ddd"].apply { value = 2.asValue() } assertEquals(2, vision.properties.getValue("fff.ddd")?.int) @@ -50,7 +50,7 @@ internal class VisionPropertyTest { @Test fun testPropertyUpdate() { val vision = manager.group() - vision.properties.get("fff").updateWith(TestScheme) { + vision.properties["fff"].updateWith(TestScheme) { ddd = 2 } assertEquals(2, vision.properties.getValue("fff.ddd")?.int) diff --git a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/inputRenderers.kt b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/inputRenderers.kt index 4112370a..3deb00da 100644 --- a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/inputRenderers.kt +++ b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/inputRenderers.kt @@ -1,18 +1,14 @@ package space.kscience.visionforge -import kotlinx.coroutines.launch import kotlinx.dom.clear import kotlinx.html.InputType import kotlinx.html.div import kotlinx.html.js.input import org.w3c.dom.HTMLElement import org.w3c.dom.HTMLInputElement -import org.w3c.dom.events.Event -import space.kscience.dataforge.meta.Value import space.kscience.dataforge.meta.asValue import space.kscience.dataforge.meta.double import space.kscience.dataforge.meta.string -import space.kscience.dataforge.names.Name import space.kscience.visionforge.html.* /** @@ -26,13 +22,6 @@ internal fun HTMLElement.subscribeToVision(vision: VisionOfHtml) { } } - -private fun VisionClient.sendInputEvent(name: Name, value: Value?) { - context.launch { - sendEvent(name, VisionValueChangeEvent(value, name)) - } -} - /** * Subscribes the HTML input element to a given vision. * @@ -62,16 +51,13 @@ internal val inputVisionRenderer: ElementVisionRenderer = ElementVisionRenderer< input { type = InputType.text }.also { htmlInputElement -> - val onEvent: (Event) -> Unit = { - client.sendInputEvent(name, htmlInputElement.value.asValue()) + + htmlInputElement.onchange = { + client.sendEventAsync(name, VisionValueChangeEvent(htmlInputElement.value.asValue(), name)) } - - when (vision.feedbackMode) { - InputFeedbackMode.ONCHANGE -> htmlInputElement.onchange = onEvent - - InputFeedbackMode.ONINPUT -> htmlInputElement.oninput = onEvent - InputFeedbackMode.NONE -> {} + htmlInputElement.oninput = { + client.sendEventAsync(name, VisionInputEvent(htmlInputElement.value.asValue(), name)) } htmlInputElement.subscribeToInput(vision) @@ -86,18 +72,16 @@ internal val checkboxVisionRenderer: ElementVisionRenderer = input { type = InputType.checkBox }.also { htmlInputElement -> - val onEvent: (Event) -> Unit = { - client.sendInputEvent(name, htmlInputElement.checked.asValue()) + + htmlInputElement.onchange = { + client.sendEventAsync(name, VisionValueChangeEvent(htmlInputElement.value.asValue(), name)) } - - when (vision.feedbackMode) { - InputFeedbackMode.ONCHANGE -> htmlInputElement.onchange = onEvent - - InputFeedbackMode.ONINPUT -> htmlInputElement.oninput = onEvent - InputFeedbackMode.NONE -> {} + htmlInputElement.oninput = { + client.sendEventAsync(name, VisionInputEvent(htmlInputElement.value.asValue(), name)) } + htmlInputElement.subscribeToInput(vision) vision.useProperty(VisionOfCheckbox::checked) { htmlInputElement.checked = it ?: false @@ -110,16 +94,13 @@ internal val textVisionRenderer: ElementVisionRenderer = input { type = InputType.text }.also { htmlInputElement -> - val onEvent: (Event) -> Unit = { - client.sendInputEvent(name, htmlInputElement.value.asValue()) + + htmlInputElement.onchange = { + client.sendEventAsync(name, VisionValueChangeEvent(htmlInputElement.value.asValue(), name)) } - - when (vision.feedbackMode) { - InputFeedbackMode.ONCHANGE -> htmlInputElement.onchange = onEvent - - InputFeedbackMode.ONINPUT -> htmlInputElement.oninput = onEvent - InputFeedbackMode.NONE -> {} + htmlInputElement.oninput = { + client.sendEventAsync(name, VisionInputEvent(htmlInputElement.value.asValue(), name)) } htmlInputElement.subscribeToInput(vision) @@ -135,18 +116,19 @@ internal val numberVisionRenderer: ElementVisionRenderer = type = InputType.number }.also { htmlInputElement -> - val onEvent: (Event) -> Unit = { + htmlInputElement.onchange = { htmlInputElement.value.toDoubleOrNull()?.let { - client.sendInputEvent(name, htmlInputElement.value.asValue()) + client.sendEventAsync(name, VisionValueChangeEvent(it.asValue(), name)) } } - when (vision.feedbackMode) { - InputFeedbackMode.ONCHANGE -> htmlInputElement.onchange = onEvent - - InputFeedbackMode.ONINPUT -> htmlInputElement.oninput = onEvent - InputFeedbackMode.NONE -> {} + htmlInputElement.oninput = { + htmlInputElement.value.toDoubleOrNull()?.let { + client.sendEventAsync(name, VisionInputEvent(it.asValue(), name)) + } } + + htmlInputElement.subscribeToInput(vision) vision.useProperty(VisionOfNumberField::value) { htmlInputElement.valueAsNumber = it?.double ?: 0.0 @@ -163,18 +145,18 @@ internal val rangeVisionRenderer: ElementVisionRenderer = step = vision.step.toString() }.also { htmlInputElement -> - val onEvent: (Event) -> Unit = { + htmlInputElement.onchange = { htmlInputElement.value.toDoubleOrNull()?.let { - client.sendInputEvent(name, htmlInputElement.value.asValue()) + client.sendEventAsync(name, VisionValueChangeEvent(it.asValue(), name)) } } - when (vision.feedbackMode) { - InputFeedbackMode.ONCHANGE -> htmlInputElement.onchange = onEvent - - InputFeedbackMode.ONINPUT -> htmlInputElement.oninput = onEvent - InputFeedbackMode.NONE -> {} + htmlInputElement.oninput = { + htmlInputElement.value.toDoubleOrNull()?.let { + client.sendEventAsync(name, VisionInputEvent(it.asValue(), name)) + } } + htmlInputElement.subscribeToInput(vision) vision.useProperty(VisionOfRangeField::value) { htmlInputElement.valueAsNumber = it?.double ?: 0.0 diff --git a/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/SolidPropertyTest.kt b/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/SolidPropertyTest.kt index 4991c12d..7b559ab7 100644 --- a/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/SolidPropertyTest.kt +++ b/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/SolidPropertyTest.kt @@ -4,6 +4,7 @@ import kotlinx.coroutines.CompletableDeferred import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.delay import kotlinx.coroutines.test.runTest +import space.kscience.dataforge.meta.getValue import space.kscience.dataforge.meta.int import space.kscience.dataforge.meta.set import space.kscience.dataforge.meta.string From 2e2524450d910c65cb763caa50d510626c372f28 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Thu, 21 Dec 2023 09:28:45 +0300 Subject: [PATCH 19/41] update form builders --- .../src/jvmMain/kotlin/formServer.kt | 6 ++--- .../kscience/visionforge/ControlVision.kt | 3 ++- .../visionforge/html/VisionOfHtmlForm.kt | 26 ++++++++++++------- .../kscience/visionforge/formRenderers.kt | 12 ++++++--- 4 files changed, 30 insertions(+), 17 deletions(-) diff --git a/demo/playground/src/jvmMain/kotlin/formServer.kt b/demo/playground/src/jvmMain/kotlin/formServer.kt index 21d2d4a7..9a1dc0a2 100644 --- a/demo/playground/src/jvmMain/kotlin/formServer.kt +++ b/demo/playground/src/jvmMain/kotlin/formServer.kt @@ -10,7 +10,7 @@ import space.kscience.dataforge.context.request import space.kscience.visionforge.VisionManager import space.kscience.visionforge.html.VisionOfHtmlForm import space.kscience.visionforge.html.VisionPage -import space.kscience.visionforge.html.bindForm +import space.kscience.visionforge.html.bindToVision import space.kscience.visionforge.onPropertyChange import space.kscience.visionforge.server.close import space.kscience.visionforge.server.openInBrowser @@ -36,7 +36,7 @@ fun main() { visionManager, VisionPage.scriptHeader("js/visionforge-playground.js"), ) { - bindForm(form) { + form { label { htmlFor = "fname" +"First name:" @@ -66,9 +66,9 @@ fun main() { type = InputType.submit value = "Submit" } + vision(bindToVision(form)) } println(form.values) - vision(form) } }.start(false) diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/ControlVision.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/ControlVision.kt index 627a2aa1..546869bb 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/ControlVision.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/ControlVision.kt @@ -39,7 +39,8 @@ public interface ControlVision : Vision { @Serializable @SerialName("control.click") public class VisionClickEvent(override val meta: Meta) : VisionControlEvent() { - public val payload: Meta? by meta.node() + public val payload: Meta get() = meta[::payload.name] ?: Meta.EMPTY + public val name: Name? get() = meta["name"].string?.parseAsName() override fun toString(): String = meta.toString() diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionOfHtmlForm.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionOfHtmlForm.kt index c128ec6f..950a55aa 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionOfHtmlForm.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionOfHtmlForm.kt @@ -1,8 +1,8 @@ package space.kscience.visionforge.html +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Job import kotlinx.html.FORM -import kotlinx.html.TagConsumer -import kotlinx.html.form import kotlinx.html.id import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @@ -10,6 +10,7 @@ import space.kscience.dataforge.meta.Meta import space.kscience.dataforge.meta.node import space.kscience.dataforge.meta.string import space.kscience.visionforge.ClickControl +import space.kscience.visionforge.onClick /** * @param formId an id of the element in rendered DOM, this form is bound to @@ -18,18 +19,25 @@ import space.kscience.visionforge.ClickControl @SerialName("html.form") public class VisionOfHtmlForm( public val formId: String, -) : VisionOfHtmlControl() { +) : VisionOfHtmlControl(), ClickControl { public var values: Meta? by properties.node() } -public fun TagConsumer.bindForm( - visionOfForm: VisionOfHtmlForm, - builder: FORM.() -> Unit, -): R = form { - this.id = visionOfForm.formId - builder() +/** + * Create a [VisionOfHtmlForm] and bind this form to the id + */ +public fun FORM.bindToVision(id: String): VisionOfHtmlForm { + this.id = id + return VisionOfHtmlForm(id) } +public fun FORM.bindToVision(vision: VisionOfHtmlForm): VisionOfHtmlForm { + this.id = vision.formId + return vision +} + +public fun VisionOfHtmlForm.onSubmit(scope: CoroutineScope, block: (Meta?) -> Unit): Job = onClick(scope) { block(payload) } + @Serializable @SerialName("html.button") diff --git a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/formRenderers.kt b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/formRenderers.kt index 6a360af8..781fa677 100644 --- a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/formRenderers.kt +++ b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/formRenderers.kt @@ -15,8 +15,10 @@ import space.kscience.dataforge.names.Name import space.kscience.visionforge.html.VisionOfHtmlButton import space.kscience.visionforge.html.VisionOfHtmlForm - -internal fun FormData.toMeta(): Meta { +/** + * Convert form data to Meta + */ +public fun FormData.toMeta(): Meta { @Suppress("UNUSED_VARIABLE") val formData = this //val res = js("Object.fromEntries(formData);") val `object` = js("{}") @@ -67,8 +69,10 @@ internal val formVisionRenderer: ElementVisionRenderer = form.onsubmit = { event -> event.preventDefault() val formData = FormData(form).toMeta() - client.sendMetaEvent(name, formData) - console.info("Sent: ${formData.toMap()}") + client.context.launch { + client.sendEvent(name, VisionClickEvent(name = name, payload = formData)) + } + console.info("Sent form data: ${formData.toMap()}") false } } From 4fd5c634bb7984d81da49af7638827c733ce72c7 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Sun, 24 Dec 2023 19:45:05 +0300 Subject: [PATCH 20/41] Fix vision sharing between pages --- CHANGELOG.md | 42 ++++++++----- build.gradle.kts | 2 +- .../src/jsMain/kotlin/JsPlaygroundApp.kt | 3 +- .../src/jsMain/kotlin/gravityDemo.kt | 5 +- .../src/jsMain/kotlin/markupComponent.kt | 2 +- .../src/jvmMain/kotlin/formServer.kt | 6 +- demo/sat-demo/build.gradle.kts | 4 +- visionforge-core/api/visionforge-core.api | 29 +++++++-- .../visionforge/html/HtmlVisionRenderer.kt | 34 +++++----- .../visionforge/html/VisionOfHtmlForm.kt | 22 ++++--- .../src/jvmMain/kotlin/VisionForge.kt | 8 +-- .../visionforge/server/VisionServer.kt | 62 ++++++++++++------- 12 files changed, 135 insertions(+), 84 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bf2c3478..dc833937 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,12 +1,31 @@ # Changelog -## [Unreleased] +## Unreleased + ### Added + +### Changed +- **Breaking API** Move vision cache to upper level for renderers to avoid re-creating visions for page reload. +- **Breaking API** Forms refactor + +### Deprecated + +### Removed + +### Fixed + +### Security + +## 0.3.0 - 2023-12-23 + +### Added + - Context receivers flag - MeshLine for thick lines - Custom client-side events and thier processing in VisionServer ### Changed + - Color accessor property is now `colorProperty`. Color uses non-nullable `invoke` instead of `set`. - API update for server and pages - Edges moved to solids module for easier construction @@ -17,17 +36,14 @@ - Naming of Canvas3D options. - Lights are added to the scene instead of 3D options. -### Deprecated - -### Removed - ### Fixed + - Jupyter integration for IDEA and Jupyter lab. -### Security +## 0.2.0 -## [0.2.0] ### Added + - Server module - Change collector - Customizable accessors for colors @@ -38,8 +54,8 @@ - Markdown module - Tables module - ### Changed + - Vision does not implement ItemProvider anymore. Property changes are done via `getProperty`/`setProperty` and `property` delegate. - Point3D and Point2D are made separate classes instead of expect/actual (to split up different engines. - JavaFX support moved to a separate module @@ -54,16 +70,10 @@ - Property listeners are not triggered if there are no changes. - Feedback websocket connection in the client. - -### Deprecated - ### Removed + - Primary modules dependencies on UI - ### Fixed + - Version conflicts - - -### Security - diff --git a/build.gradle.kts b/build.gradle.kts index 5e015498..f35e8fe3 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -11,7 +11,7 @@ val dataforgeVersion by extra("0.7.1") allprojects { group = "space.kscience" - version = "0.3.0" + version = "0.3.1" } subprojects { diff --git a/demo/js-playground/src/jsMain/kotlin/JsPlaygroundApp.kt b/demo/js-playground/src/jsMain/kotlin/JsPlaygroundApp.kt index dd0d0b26..c0ee12c7 100644 --- a/demo/js-playground/src/jsMain/kotlin/JsPlaygroundApp.kt +++ b/demo/js-playground/src/jsMain/kotlin/JsPlaygroundApp.kt @@ -4,6 +4,7 @@ import ringui.SmartTabs import ringui.Tab import space.kscience.dataforge.context.Context import space.kscience.dataforge.context.request +import space.kscience.plotly.Plotly.plot import space.kscience.plotly.models.Trace import space.kscience.plotly.scatter import space.kscience.visionforge.Application @@ -97,7 +98,7 @@ private class JsPlaygroundApp : Application { Tab("plotly") { Plotly { attrs { - plot = space.kscience.plotly.Plotly.plot { + plot = plot { scatter { x(1, 2, 3) y(5, 8, 7) diff --git a/demo/js-playground/src/jsMain/kotlin/gravityDemo.kt b/demo/js-playground/src/jsMain/kotlin/gravityDemo.kt index a4bc9057..494874a6 100644 --- a/demo/js-playground/src/jsMain/kotlin/gravityDemo.kt +++ b/demo/js-playground/src/jsMain/kotlin/gravityDemo.kt @@ -11,6 +11,7 @@ import space.kscience.visionforge.markup.VisionOfMarkup import space.kscience.visionforge.react.flexRow import space.kscience.visionforge.ring.ThreeCanvasWithControls import space.kscience.visionforge.ring.solid +import space.kscience.visionforge.setAsRoot import space.kscience.visionforge.solid.* import styled.css import styled.styledDiv @@ -27,7 +28,9 @@ val GravityDemo = fc { props -> val energyTrace = Trace { name = "energy" } - val markup = VisionOfMarkup() + val markup = VisionOfMarkup().apply { + setAsRoot(props.solids.visionManager) + } styledDiv { css { diff --git a/demo/js-playground/src/jsMain/kotlin/markupComponent.kt b/demo/js-playground/src/jsMain/kotlin/markupComponent.kt index a47c28cf..0e2c3c9e 100644 --- a/demo/js-playground/src/jsMain/kotlin/markupComponent.kt +++ b/demo/js-playground/src/jsMain/kotlin/markupComponent.kt @@ -44,7 +44,7 @@ val Markup = fc("Markup") { props -> css { width = 100.pct height = 100.pct - border= Border(2.pt, BorderStyle.solid, Color.blue) + border = Border(2.pt, BorderStyle.solid, Color.blue) padding = Padding(left = 8.pt) backgroundColor = Color.white flex = Flex(1.0) diff --git a/demo/playground/src/jvmMain/kotlin/formServer.kt b/demo/playground/src/jvmMain/kotlin/formServer.kt index 9a1dc0a2..c0539d0a 100644 --- a/demo/playground/src/jvmMain/kotlin/formServer.kt +++ b/demo/playground/src/jvmMain/kotlin/formServer.kt @@ -10,7 +10,7 @@ import space.kscience.dataforge.context.request import space.kscience.visionforge.VisionManager import space.kscience.visionforge.html.VisionOfHtmlForm import space.kscience.visionforge.html.VisionPage -import space.kscience.visionforge.html.bindToVision +import space.kscience.visionforge.html.visionOfForm import space.kscience.visionforge.onPropertyChange import space.kscience.visionforge.server.close import space.kscience.visionforge.server.openInBrowser @@ -36,7 +36,7 @@ fun main() { visionManager, VisionPage.scriptHeader("js/visionforge-playground.js"), ) { - form { + visionOfForm(form) { label { htmlFor = "fname" +"First name:" @@ -66,8 +66,8 @@ fun main() { type = InputType.submit value = "Submit" } - vision(bindToVision(form)) } + vision(form) println(form.values) } diff --git a/demo/sat-demo/build.gradle.kts b/demo/sat-demo/build.gradle.kts index 6cf37859..42356e3d 100644 --- a/demo/sat-demo/build.gradle.kts +++ b/demo/sat-demo/build.gradle.kts @@ -9,7 +9,9 @@ kscience { // useSerialization { // json() // } - jvm() + jvm{ + withJava() + } jvmMain{ implementation("io.ktor:ktor-server-cio") implementation(projects.visionforgeThreejs.visionforgeThreejsServer) diff --git a/visionforge-core/api/visionforge-core.api b/visionforge-core/api/visionforge-core.api index 89e926ec..c36083e8 100644 --- a/visionforge-core/api/visionforge-core.api +++ b/visionforge-core/api/visionforge-core.api @@ -750,10 +750,10 @@ public abstract interface class space/kscience/visionforge/html/HtmlVisionFragme public final class space/kscience/visionforge/html/HtmlVisionRendererKt { public static final fun appendTo (Lspace/kscience/visionforge/html/HtmlVisionFragment;Lspace/kscience/visionforge/html/VisionTagConsumer;)V - public static final fun visionFragment (Lkotlinx/html/FlowContent;Lspace/kscience/visionforge/VisionManager;ZLjava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function2;Ljava/lang/String;Lspace/kscience/visionforge/html/HtmlVisionFragment;)V - public static final fun visionFragment (Lkotlinx/html/TagConsumer;Lspace/kscience/visionforge/VisionManager;ZLjava/lang/String;Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function2;Lspace/kscience/visionforge/html/HtmlVisionFragment;)V - public static synthetic fun visionFragment$default (Lkotlinx/html/FlowContent;Lspace/kscience/visionforge/VisionManager;ZLjava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function2;Ljava/lang/String;Lspace/kscience/visionforge/html/HtmlVisionFragment;ILjava/lang/Object;)V - public static synthetic fun visionFragment$default (Lkotlinx/html/TagConsumer;Lspace/kscience/visionforge/VisionManager;ZLjava/lang/String;Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function2;Lspace/kscience/visionforge/html/HtmlVisionFragment;ILjava/lang/Object;)V + public static final fun visionFragment (Lkotlinx/html/FlowContent;Lspace/kscience/visionforge/VisionManager;ZLjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/Map;Lspace/kscience/visionforge/html/HtmlVisionFragment;)V + public static final fun visionFragment (Lkotlinx/html/TagConsumer;Lspace/kscience/visionforge/VisionManager;ZLjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/Map;Lspace/kscience/visionforge/html/HtmlVisionFragment;)V + public static synthetic fun visionFragment$default (Lkotlinx/html/FlowContent;Lspace/kscience/visionforge/VisionManager;ZLjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/Map;Lspace/kscience/visionforge/html/HtmlVisionFragment;ILjava/lang/Object;)V + public static synthetic fun visionFragment$default (Lkotlinx/html/TagConsumer;Lspace/kscience/visionforge/VisionManager;ZLjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/Map;Lspace/kscience/visionforge/html/HtmlVisionFragment;ILjava/lang/Object;)V } public final class space/kscience/visionforge/html/InputFeedbackMode : java/lang/Enum { @@ -782,6 +782,21 @@ public final class space/kscience/visionforge/html/ResourceLocation : java/lang/ public abstract interface annotation class space/kscience/visionforge/html/VisionDSL : java/lang/annotation/Annotation { } +public final class space/kscience/visionforge/html/VisionDisplay { + public fun (Lspace/kscience/visionforge/VisionManager;Lspace/kscience/visionforge/Vision;Lspace/kscience/dataforge/meta/Meta;)V + public final fun component1 ()Lspace/kscience/visionforge/VisionManager; + public final fun component2 ()Lspace/kscience/visionforge/Vision; + public final fun component3 ()Lspace/kscience/dataforge/meta/Meta; + public final fun copy (Lspace/kscience/visionforge/VisionManager;Lspace/kscience/visionforge/Vision;Lspace/kscience/dataforge/meta/Meta;)Lspace/kscience/visionforge/html/VisionDisplay; + public static synthetic fun copy$default (Lspace/kscience/visionforge/html/VisionDisplay;Lspace/kscience/visionforge/VisionManager;Lspace/kscience/visionforge/Vision;Lspace/kscience/dataforge/meta/Meta;ILjava/lang/Object;)Lspace/kscience/visionforge/html/VisionDisplay; + public fun equals (Ljava/lang/Object;)Z + public final fun getMeta ()Lspace/kscience/dataforge/meta/Meta; + public final fun getVision ()Lspace/kscience/visionforge/Vision; + public final fun getVisionManager ()Lspace/kscience/visionforge/VisionManager; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + public final class space/kscience/visionforge/html/VisionOfCheckbox : space/kscience/visionforge/html/VisionOfHtmlInput { public static final field Companion Lspace/kscience/visionforge/html/VisionOfCheckbox$Companion; public fun ()V @@ -852,7 +867,7 @@ public final class space/kscience/visionforge/html/VisionOfHtmlControl$Companion public final fun serializer ()Lkotlinx/serialization/KSerializer; } -public final class space/kscience/visionforge/html/VisionOfHtmlForm : space/kscience/visionforge/html/VisionOfHtmlControl { +public final class space/kscience/visionforge/html/VisionOfHtmlForm : space/kscience/visionforge/html/VisionOfHtmlControl, space/kscience/visionforge/ClickControl { public static final field Companion Lspace/kscience/visionforge/html/VisionOfHtmlForm$Companion; public fun (Ljava/lang/String;)V public final fun getFormId ()Ljava/lang/String; @@ -876,9 +891,11 @@ public final class space/kscience/visionforge/html/VisionOfHtmlForm$Companion { } public final class space/kscience/visionforge/html/VisionOfHtmlFormKt { - public static final fun bindForm (Lkotlinx/html/TagConsumer;Lspace/kscience/visionforge/html/VisionOfHtmlForm;Lkotlin/jvm/functions/Function1;)Ljava/lang/Object; public static final fun button (Lspace/kscience/visionforge/html/VisionOutput;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lspace/kscience/visionforge/html/VisionOfHtmlButton; public static synthetic fun button$default (Lspace/kscience/visionforge/html/VisionOutput;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lspace/kscience/visionforge/html/VisionOfHtmlButton; + public static final fun onSubmit (Lspace/kscience/visionforge/html/VisionOfHtmlForm;Lkotlinx/coroutines/CoroutineScope;Lkotlin/jvm/functions/Function1;)Lkotlinx/coroutines/Job; + public static final fun visionOfForm (Lkotlinx/html/TagConsumer;Lspace/kscience/visionforge/html/VisionOfHtmlForm;Ljava/lang/String;Lkotlinx/html/FormEncType;Lkotlinx/html/FormMethod;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Ljava/lang/Object; + public static synthetic fun visionOfForm$default (Lkotlinx/html/TagConsumer;Lspace/kscience/visionforge/html/VisionOfHtmlForm;Ljava/lang/String;Lkotlinx/html/FormEncType;Lkotlinx/html/FormMethod;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Ljava/lang/Object; } public class space/kscience/visionforge/html/VisionOfHtmlInput : space/kscience/visionforge/html/VisionOfHtmlControl { diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/HtmlVisionRenderer.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/HtmlVisionRenderer.kt index d71e848a..801d23aa 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/HtmlVisionRenderer.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/HtmlVisionRenderer.kt @@ -8,19 +8,23 @@ import space.kscience.dataforge.names.asName import space.kscience.visionforge.Vision import space.kscience.visionforge.VisionManager -public fun interface HtmlVisionFragment{ +public fun interface HtmlVisionFragment { public fun VisionTagConsumer<*>.append() } public fun HtmlVisionFragment.appendTo(consumer: VisionTagConsumer<*>): Unit = consumer.append() +public data class VisionDisplay(val visionManager: VisionManager, val vision: Vision, val meta: Meta) + /** * Render a fragment in the given consumer and return a map of extracted visions - * @param context a context used to create a vision fragment + * @param visionManager a context plugin used to create a vision fragment * @param embedData embed Vision initial state in the HTML * @param fetchDataUrl fetch data after first render from given url * @param updatesUrl receive push updates from the server at given url * @param idPrefix a prefix to be used before vision ids + * @param displayCache external cache for Vision displays. It is required to avoid re-creating visions on page update + * @param fragment the fragment to render */ public fun TagConsumer<*>.visionFragment( visionManager: VisionManager, @@ -28,39 +32,31 @@ public fun TagConsumer<*>.visionFragment( fetchDataUrl: String? = null, updatesUrl: String? = null, idPrefix: String? = null, - onVisionRendered: (Name, Vision) -> Unit = { _, _ -> }, + displayCache: MutableMap = mutableMapOf(), fragment: HtmlVisionFragment, ) { - val collector: MutableMap> = mutableMapOf() - val consumer = object : VisionTagConsumer(this@visionFragment, visionManager, idPrefix) { override fun TagConsumer.vision(name: Name?, buildOutput: VisionOutput.() -> Vision): T { //Avoid re-creating cached visions val actualName = name ?: NameToken( DEFAULT_VISION_NAME, - buildOutput.hashCode().toUInt().toString() + buildOutput.hashCode().toString(16) ).asName() - val (output, vision) = collector.getOrPut(actualName) { + val display = displayCache.getOrPut(actualName) { val output = VisionOutput(context, actualName) val vision = output.buildOutput() - onVisionRendered(actualName, vision) - output to vision + VisionDisplay(output.visionManager, vision, output.meta) } - return addVision(actualName, output.visionManager, vision, output.meta) + return addVision(actualName, display.visionManager, display.vision, display.meta) } override fun DIV.renderVision(manager: VisionManager, name: Name, vision: Vision, outputMeta: Meta) { - val (_, actualVision) = collector.getOrPut(name) { - val output = VisionOutput(context, name) - onVisionRendered(name, vision) - output to vision - } - + displayCache[name] = VisionDisplay(manager, vision, outputMeta) // Toggle update mode updatesUrl?.let { @@ -76,7 +72,7 @@ public fun TagConsumer<*>.visionFragment( type = "text/json" attributes["class"] = OUTPUT_DATA_CLASS unsafe { - +"\n${manager.encodeToString(actualVision)}\n" + +"\n${manager.encodeToString(vision)}\n" } } } @@ -91,8 +87,8 @@ public fun FlowContent.visionFragment( embedData: Boolean = true, fetchDataUrl: String? = null, updatesUrl: String? = null, - onVisionRendered: (Name, Vision) -> Unit = { _, _ -> }, idPrefix: String? = null, + displayCache: MutableMap = mutableMapOf(), fragment: HtmlVisionFragment, ): Unit = consumer.visionFragment( visionManager = visionManager, @@ -100,6 +96,6 @@ public fun FlowContent.visionFragment( fetchDataUrl = fetchDataUrl, updatesUrl = updatesUrl, idPrefix = idPrefix, - onVisionRendered = onVisionRendered, + displayCache = displayCache, fragment = fragment ) \ No newline at end of file diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionOfHtmlForm.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionOfHtmlForm.kt index 950a55aa..baa7326a 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionOfHtmlForm.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionOfHtmlForm.kt @@ -2,8 +2,7 @@ package space.kscience.visionforge.html import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Job -import kotlinx.html.FORM -import kotlinx.html.id +import kotlinx.html.* import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable import space.kscience.dataforge.meta.Meta @@ -23,18 +22,23 @@ public class VisionOfHtmlForm( public var values: Meta? by properties.node() } + /** * Create a [VisionOfHtmlForm] and bind this form to the id */ -public fun FORM.bindToVision(id: String): VisionOfHtmlForm { - this.id = id - return VisionOfHtmlForm(id) +@HtmlTagMarker +public inline fun > C.visionOfForm( + vision: VisionOfHtmlForm, + action: String? = null, + encType: FormEncType? = null, + method: FormMethod? = null, + classes: String? = null, + crossinline block: FORM.() -> Unit = {}, +) : T = form(action, encType, method, classes){ + this.id = vision.formId + block() } -public fun FORM.bindToVision(vision: VisionOfHtmlForm): VisionOfHtmlForm { - this.id = vision.formId - return vision -} public fun VisionOfHtmlForm.onSubmit(scope: CoroutineScope, block: (Meta?) -> Unit): Job = onClick(scope) { block(payload) } diff --git a/visionforge-jupyter/src/jvmMain/kotlin/VisionForge.kt b/visionforge-jupyter/src/jvmMain/kotlin/VisionForge.kt index 49d5fe23..8cb2dcd5 100644 --- a/visionforge-jupyter/src/jvmMain/kotlin/VisionForge.kt +++ b/visionforge-jupyter/src/jvmMain/kotlin/VisionForge.kt @@ -17,9 +17,9 @@ import space.kscience.dataforge.context.info import space.kscience.dataforge.context.logger import space.kscience.dataforge.meta.* import space.kscience.dataforge.names.Name -import space.kscience.visionforge.Vision import space.kscience.visionforge.VisionManager import space.kscience.visionforge.html.HtmlVisionFragment +import space.kscience.visionforge.html.VisionDisplay import space.kscience.visionforge.html.visionFragment import space.kscience.visionforge.server.VisionRoute import space.kscience.visionforge.server.serveVisionData @@ -142,7 +142,7 @@ public class VisionForge( //server.serveVisionsFromFragment(consumer, "content-${counter++}", fragment) val cellRoute = "content-${counter++}" - val collector: MutableMap = mutableMapOf() + val cache: MutableMap = mutableMapOf() val url = engine.environment.connectors.first().let { url { @@ -153,13 +153,13 @@ public class VisionForge( } } - engine.application.serveVisionData(VisionRoute(cellRoute, visionManager), collector) + engine.application.serveVisionData(VisionRoute(cellRoute, visionManager), cache) visionFragment( visionManager, embedData = true, updatesUrl = url, - onVisionRendered = { name, vision -> collector[name] = vision }, + displayCache = cache, fragment = fragment ) } else { diff --git a/visionforge-server/src/jvmMain/kotlin/space/kscience/visionforge/server/VisionServer.kt b/visionforge-server/src/jvmMain/kotlin/space/kscience/visionforge/server/VisionServer.kt index d89bf1c0..bb14b39a 100644 --- a/visionforge-server/src/jvmMain/kotlin/space/kscience/visionforge/server/VisionServer.kt +++ b/visionforge-server/src/jvmMain/kotlin/space/kscience/visionforge/server/VisionServer.kt @@ -1,31 +1,50 @@ package space.kscience.visionforge.server -import io.ktor.http.* -import io.ktor.server.application.* -import io.ktor.server.engine.* -import io.ktor.server.html.* -import io.ktor.server.http.content.* -import io.ktor.server.plugins.* -import io.ktor.server.plugins.cors.routing.* -import io.ktor.server.request.* -import io.ktor.server.response.* +import io.ktor.http.ContentType +import io.ktor.http.HttpStatusCode +import io.ktor.http.URLProtocol +import io.ktor.http.path +import io.ktor.server.application.Application +import io.ktor.server.application.call +import io.ktor.server.application.install +import io.ktor.server.application.log +import io.ktor.server.engine.EngineConnectorConfig +import io.ktor.server.html.respondHtml +import io.ktor.server.plugins.cors.routing.CORS +import io.ktor.server.request.header +import io.ktor.server.request.host +import io.ktor.server.request.port +import io.ktor.server.response.header +import io.ktor.server.response.respond +import io.ktor.server.response.respondText import io.ktor.server.routing.* -import io.ktor.server.util.* -import io.ktor.server.websocket.* -import io.ktor.util.pipeline.* -import io.ktor.websocket.* +import io.ktor.server.util.getOrFail +import io.ktor.server.util.url +import io.ktor.server.websocket.WebSockets +import io.ktor.server.websocket.application +import io.ktor.server.websocket.webSocket +import io.ktor.websocket.Frame import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.collect import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.launch import kotlinx.coroutines.withContext -import kotlinx.html.* +import kotlinx.html.body +import kotlinx.html.head +import kotlinx.html.header +import kotlinx.html.meta import kotlinx.serialization.encodeToString import space.kscience.dataforge.context.Context import space.kscience.dataforge.context.ContextAware -import space.kscience.dataforge.meta.* +import space.kscience.dataforge.meta.Configurable +import space.kscience.dataforge.meta.ObservableMutableMeta +import space.kscience.dataforge.meta.enum +import space.kscience.dataforge.meta.long import space.kscience.dataforge.names.Name -import space.kscience.visionforge.* +import space.kscience.visionforge.Vision +import space.kscience.visionforge.VisionEvent +import space.kscience.visionforge.VisionManager +import space.kscience.visionforge.flowChanges import space.kscience.visionforge.html.* import kotlin.time.Duration.Companion.milliseconds @@ -72,7 +91,6 @@ public class VisionRoute( /** * Serve visions in a given [route] without providing a page template. - * [visions] could be changed during the service. * * @return a [Flow] of backward events, including vision change events */ @@ -137,8 +155,8 @@ public fun Application.serveVisionData( public fun Application.serveVisionData( configuration: VisionRoute, - data: Map, -): Unit = serveVisionData(configuration) { data[it] } + data: Map, +): Unit = serveVisionData(configuration) { data[it]?.vision } /** * Serve a page, potentially containing any number of visions at a given [route] with given [header]. @@ -154,10 +172,10 @@ public fun Application.visionPage( ) { require(WebSockets) - val collector: MutableMap = mutableMapOf() + val cache: MutableMap = mutableMapOf() //serve data - serveVisionData(configuration, collector) + serveVisionData(configuration, cache) //filled pages routing { @@ -193,7 +211,7 @@ public fun Application.visionPage( path(route, "ws") } } else null, - onVisionRendered = { name, vision -> collector[name] = vision }, + displayCache = cache, fragment = visionFragment ) } From 659b9c3525f933cc369cfa1d6e0f2bc5b1abd150 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Wed, 27 Dec 2023 12:01:55 +0300 Subject: [PATCH 21/41] More or less working muon monitor --- demo/gdml/src/jsMain/kotlin/drop/FileDrop.kt | 50 ------ .../visionforge/gdml/demo/FileDrop.kt | 87 +++++++++++ .../visionforge/gdml/demo/GDMLAppComponent.kt | 4 +- .../visionforge/gdml/demo/fileDrop.kt | 30 ---- demo/gdml/webpack.config.d/01.ring.js | 3 - .../js-playground/webpack.config.d/01.ring.js | 3 - demo/muon-monitor/build.gradle.kts | 14 +- .../mipt/npm/muon/monitor/MMAppComponent.kt | 55 ++++--- .../ru/mipt/npm/muon/monitor/MMDemoApp.kt | 6 +- demo/muon-monitor/webpack.config.d/01.ring.js | 3 - demo/playground/build.gradle.kts | 6 + demo/playground/webpack.config.d/01.ring.js | 23 --- settings.gradle.kts | 8 +- .../build.gradle.kts | 11 +- .../visionforge/compose/MetaViewer.kt | 0 .../visionforge/compose/NameCrumbs.kt | 0 .../visionforge/compose/PropertyEditor.kt | 0 .../kscience/visionforge/compose/Tabs.kt | 88 +++++++++++ .../visionforge/compose/TreeStyles.kt | 18 +-- .../visionforge/compose/VisionForgeStyles.kt | 7 + .../visionforge/compose/VisionTree.kt | 0 .../kscience/visionforge/compose/bootstrap.kt | 0 .../visionforge/compose/composeVision.kt | 0 .../space/kscience/visionforge/compose/css.kt | 0 .../kscience/visionforge/compose/layouts.kt | 0 .../visionforge/compose/valueChooser.kt | 0 .../kscience/visionforge/compose/Tabs.kt | 102 ------------ .../build.gradle.kts | 10 ++ .../webpack.config.d/01.ring.js | 24 --- .../solid/specifications/Canvas3DUIScheme.kt | 2 +- visionforge-tables/build.gradle.kts | 12 +- .../src/jsMain/kotlin/tabulator/Tabulator.kt | 1 + visionforge-threejs/build.gradle.kts | 2 +- .../visionforge/solid/three/ThreePlugin.kt | 1 + .../solid/three/compose/ThreeControls.kt | 14 +- .../solid/three/compose/ThreeView.kt | 146 ++++++++++-------- .../build.gradle.kts | 4 +- 37 files changed, 370 insertions(+), 364 deletions(-) delete mode 100644 demo/gdml/src/jsMain/kotlin/drop/FileDrop.kt create mode 100644 demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/FileDrop.kt delete mode 100644 demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/fileDrop.kt delete mode 100644 demo/gdml/webpack.config.d/01.ring.js delete mode 100644 demo/js-playground/webpack.config.d/01.ring.js delete mode 100644 demo/muon-monitor/webpack.config.d/01.ring.js delete mode 100644 demo/playground/webpack.config.d/01.ring.js rename {visionforge-compose => visionforge-compose-html}/build.gradle.kts (88%) rename {visionforge-compose => visionforge-compose-html}/src/jsMain/kotlin/space/kscience/visionforge/compose/MetaViewer.kt (100%) rename {visionforge-compose => visionforge-compose-html}/src/jsMain/kotlin/space/kscience/visionforge/compose/NameCrumbs.kt (100%) rename {visionforge-compose => visionforge-compose-html}/src/jsMain/kotlin/space/kscience/visionforge/compose/PropertyEditor.kt (100%) create mode 100644 visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/Tabs.kt rename {visionforge-compose => visionforge-compose-html}/src/jsMain/kotlin/space/kscience/visionforge/compose/TreeStyles.kt (89%) create mode 100644 visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/VisionForgeStyles.kt rename {visionforge-compose => visionforge-compose-html}/src/jsMain/kotlin/space/kscience/visionforge/compose/VisionTree.kt (100%) rename {visionforge-compose => visionforge-compose-html}/src/jsMain/kotlin/space/kscience/visionforge/compose/bootstrap.kt (100%) rename {visionforge-compose => visionforge-compose-html}/src/jsMain/kotlin/space/kscience/visionforge/compose/composeVision.kt (100%) rename {visionforge-compose => visionforge-compose-html}/src/jsMain/kotlin/space/kscience/visionforge/compose/css.kt (100%) rename {visionforge-compose => visionforge-compose-html}/src/jsMain/kotlin/space/kscience/visionforge/compose/layouts.kt (100%) rename {visionforge-compose => visionforge-compose-html}/src/jsMain/kotlin/space/kscience/visionforge/compose/valueChooser.kt (100%) delete mode 100644 visionforge-compose/src/jsMain/kotlin/space/kscience/visionforge/compose/Tabs.kt delete mode 100644 visionforge-jupyter/visionforge-jupyter-common/webpack.config.d/01.ring.js diff --git a/demo/gdml/src/jsMain/kotlin/drop/FileDrop.kt b/demo/gdml/src/jsMain/kotlin/drop/FileDrop.kt deleted file mode 100644 index 5116155b..00000000 --- a/demo/gdml/src/jsMain/kotlin/drop/FileDrop.kt +++ /dev/null @@ -1,50 +0,0 @@ -@file:JsModule("react-file-drop") -@file:JsNonModule - -package drop - -import org.w3c.dom.DragEvent -import org.w3c.files.FileList -import react.Component -import react.Props -import react.State - -sealed external class DropEffects { - @JsName("copy") - object Copy : DropEffects - - @JsName("move") - object Move : DropEffects - - @JsName("link") - object Link : DropEffects - - @JsName("none") - object None : DropEffects -} - -external interface FileDropProps : Props { - var className: String? - var targetClassName: String? - var draggingOverFrameClassName: String? - var draggingOverTargetClassName: String? - - // var frame?: Exclude | HTMLDocument; - var onFrameDragEnter: ((event: DragEvent) -> Unit)? - var onFrameDragLeave: ((event: DragEvent) -> Unit)? - var onFrameDrop: ((event: DragEvent) -> Unit)? - - // var onDragOver: ReactDragEventHandler? -// var onDragLeave: ReactDragEventHandler? - var onDrop: ((files: FileList?, event: dynamic) -> Unit)?//event:DragEvent) - var dropEffect: DropEffects? -} - -external interface FileDropState : State { - var draggingOverFrame: Boolean - var draggingOverTarget: Boolean -} - -external class FileDrop : Component { - override fun render(): dynamic -} \ No newline at end of file diff --git a/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/FileDrop.kt b/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/FileDrop.kt new file mode 100644 index 00000000..010f782b --- /dev/null +++ b/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/FileDrop.kt @@ -0,0 +1,87 @@ +@file:OptIn(ExperimentalComposeWebApi::class) + +package space.kscience.visionforge.gdml.demo + +import androidx.compose.runtime.* +import org.jetbrains.compose.web.ExperimentalComposeWebApi +import org.jetbrains.compose.web.attributes.InputType +import org.jetbrains.compose.web.attributes.name +import org.jetbrains.compose.web.css.* +import org.jetbrains.compose.web.dom.Div +import org.jetbrains.compose.web.dom.I +import org.jetbrains.compose.web.dom.Input +import org.jetbrains.compose.web.dom.Text +import org.w3c.files.FileList + + +//https://codepen.io/zahedkamal87/pen/PobNNwE +@Composable +fun FileDrop( + title: String = "Drop files or Click here to select files to upload.", + onFileDrop: (FileList) -> Unit, +) { + var dragOver by remember { mutableStateOf(false) } + + Div({ + id("dropzone") + style { + border( + width = 0.2.cssRem, + style = LineStyle.Dashed, + color = Color("#6583fe") + ) + padding(2.cssRem) + borderRadius(0.25.cssRem) + backgroundColor(Color("#fff")) + textAlign("center") + fontSize(1.5.cssRem) + transitions { + all { + delay(0.25.s) + timingFunction(AnimationTimingFunction.EaseInOut) + properties("background-color") + } + } + cursor("pointer") + } + listOf("drag", "dragstart", "dragend", "dragenter").forEach { + addEventListener(it) { event -> + event.preventDefault() + event.stopPropagation() + } + } + onDragOver { event -> + event.preventDefault() + event.stopPropagation() + dragOver = true + } + onDragLeave { event -> + event.preventDefault() + event.stopPropagation() + dragOver = false + } + onDrop { event -> + event.preventDefault() + event.stopPropagation() + dragOver = false + event.dataTransfer?.files?.let { + onFileDrop(it) + } + } + }) { + + I({ classes("bi", "bi-cloud-upload", "dropzone-icon") }) + Text(title) + Input(type = InputType.File, attrs = { + style { + display(DisplayStyle.None) + } + classes("dropzone-input") + name("files") + }) + } +} +// +//dropzone.addEventListener("click", function(e) { +// dropzone_input.click(); +//}); \ No newline at end of file diff --git a/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GDMLAppComponent.kt b/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GDMLAppComponent.kt index 7a7aa3cc..65a702e4 100644 --- a/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GDMLAppComponent.kt +++ b/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GDMLAppComponent.kt @@ -69,8 +69,8 @@ fun GDMLApp(solids: Solids, initialVision: Solid?, selected: Name? = null) { H2 { Text("Drag and drop .gdml or .json VisionForge files here") } - fileDrop("(drag file here)") { files -> - val file = files?.get(0) + FileDrop("(drag file here)") { files -> + val file = files[0] if (file != null) { readFileAsync(file) } diff --git a/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/fileDrop.kt b/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/fileDrop.kt deleted file mode 100644 index 2478c3af..00000000 --- a/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/fileDrop.kt +++ /dev/null @@ -1,30 +0,0 @@ -package space.kscience.visionforge.gdml.demo - -import drop.FileDrop -import kotlinx.css.* -import org.w3c.files.FileList -import react.RBuilder -import styled.css -import styled.styledDiv - -//TODO move styles to inline - -fun RBuilder.fileDrop(title: String, action: (files: FileList?) -> Unit) { - styledDiv { - css { - border = Border(style = BorderStyle.dashed, width = 1.px, color = Color.orange) - flexGrow = 0.0 - alignContent = Align.center - } - - child(FileDrop::class) { - attrs { - onDrop = { files, _ -> - console.info("loaded $files") - action(files) - } - } - +title - } - } -} \ No newline at end of file diff --git a/demo/gdml/webpack.config.d/01.ring.js b/demo/gdml/webpack.config.d/01.ring.js deleted file mode 100644 index 41da041c..00000000 --- a/demo/gdml/webpack.config.d/01.ring.js +++ /dev/null @@ -1,3 +0,0 @@ -const ringConfig = require('@jetbrains/ring-ui/webpack.config').config; - -config.module.rules.push(...ringConfig.module.rules) \ No newline at end of file diff --git a/demo/js-playground/webpack.config.d/01.ring.js b/demo/js-playground/webpack.config.d/01.ring.js deleted file mode 100644 index 41da041c..00000000 --- a/demo/js-playground/webpack.config.d/01.ring.js +++ /dev/null @@ -1,3 +0,0 @@ -const ringConfig = require('@jetbrains/ring-ui/webpack.config').config; - -config.module.rules.push(...ringConfig.module.rules) \ No newline at end of file diff --git a/demo/muon-monitor/build.gradle.kts b/demo/muon-monitor/build.gradle.kts index f2b0e4dd..a3bc26e8 100644 --- a/demo/muon-monitor/build.gradle.kts +++ b/demo/muon-monitor/build.gradle.kts @@ -1,5 +1,6 @@ plugins { id("space.kscience.gradle.mpp") + alias(spclibs.plugins.compose) application } @@ -14,11 +15,22 @@ kscience { fullStack( "muon-monitor.js", jvmConfig = { withJava() }, - jsConfig = { useCommonJs() } +// jsConfig = { useCommonJs() }, + browserConfig = { + webpackTask{ + cssSupport{ + enabled = true + } + scssSupport{ + enabled = true + } + } + } ) commonMain { implementation(projects.visionforgeSolid) + implementation(projects.visionforgeComposeHtml) } jvmMain { implementation("org.apache.commons:commons-math3:3.6.1") diff --git a/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMAppComponent.kt b/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMAppComponent.kt index 2ecf9472..13d92075 100644 --- a/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMAppComponent.kt +++ b/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMAppComponent.kt @@ -4,12 +4,13 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.mutableStateListOf import androidx.compose.runtime.remember import app.softwork.bootstrapcompose.Button +import app.softwork.bootstrapcompose.ButtonGroup +import app.softwork.bootstrapcompose.Container import kotlinx.browser.window import kotlinx.coroutines.await import kotlinx.coroutines.launch import kotlinx.serialization.json.Json import org.jetbrains.compose.web.css.* -import org.jetbrains.compose.web.dom.Div import org.jetbrains.compose.web.dom.P import org.jetbrains.compose.web.dom.Span import org.jetbrains.compose.web.dom.Text @@ -17,8 +18,6 @@ import org.w3c.fetch.RequestInit import space.kscience.dataforge.meta.invoke import space.kscience.dataforge.names.Name import space.kscience.visionforge.Colors -import space.kscience.visionforge.compose.FlexColumn -import space.kscience.visionforge.compose.FlexRow import space.kscience.visionforge.solid.Solids import space.kscience.visionforge.solid.ambientLight import space.kscience.visionforge.solid.edges @@ -51,16 +50,21 @@ fun MMApp(solids: Solids, model: Model, selected: Name? = null) { val events = remember { mutableStateListOf() } - Div({ - style { - height(100.vh - 12.pt) + Container(fluid = true, + attrs = { + style { + height(100.vh - 12.pt) + } } - }) { - ThreeView(solids, root, selected, mmOptions) { - Tab("Events") { - - FlexColumn { - FlexRow { + ) { + ThreeView( + solids = solids, + solid = root, + initialSelected = selected, + options = mmOptions, + sidebarTabs = { + Tab("Events") { + ButtonGroup { Button("Next") { solids.context.launch { val event = window.fetch( @@ -84,23 +88,24 @@ fun MMApp(solids: Solids, model: Model, selected: Name? = null) { model.reset() } } - } - events.forEach { event -> - P { - Span { - Text(event.id.toString()) - } - Text(" : ") - Span({ - style { - color(Color.blue) + + events.forEach { event -> + P { + Span { + Text(event.id.toString()) + } + Text(" : ") + Span({ + style { + color(Color.blue) + } + }) { + Text(event.hits.toString()) } - }) { - Text(event.hits.toString()) } } } } - } + ) } } \ No newline at end of file diff --git a/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMDemoApp.kt b/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMDemoApp.kt index 0fc98ac5..fa08b0ff 100644 --- a/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMDemoApp.kt +++ b/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMDemoApp.kt @@ -1,11 +1,13 @@ package ru.mipt.npm.muon.monitor +import org.jetbrains.compose.web.css.Style import org.jetbrains.compose.web.renderComposable import org.w3c.dom.Document import space.kscience.dataforge.context.Context import space.kscience.dataforge.context.request import space.kscience.visionforge.Application import space.kscience.visionforge.VisionManager +import space.kscience.visionforge.compose.VisionForgeStyles import space.kscience.visionforge.solid.Solids import space.kscience.visionforge.solid.three.ThreePlugin import space.kscience.visionforge.startApplication @@ -22,8 +24,8 @@ private class MMDemoApp : Application { val model = Model(visionManager) - val element = document.getElementById("app") ?: error("Element with id 'app' not found on page") - renderComposable(element) { + renderComposable("app") { + Style(VisionForgeStyles) MMApp(context.request(Solids), model) } } diff --git a/demo/muon-monitor/webpack.config.d/01.ring.js b/demo/muon-monitor/webpack.config.d/01.ring.js deleted file mode 100644 index 41da041c..00000000 --- a/demo/muon-monitor/webpack.config.d/01.ring.js +++ /dev/null @@ -1,3 +0,0 @@ -const ringConfig = require('@jetbrains/ring-ui/webpack.config').config; - -config.module.rules.push(...ringConfig.module.rules) \ No newline at end of file diff --git a/demo/playground/build.gradle.kts b/demo/playground/build.gradle.kts index 22b109ac..71004852 100644 --- a/demo/playground/build.gradle.kts +++ b/demo/playground/build.gradle.kts @@ -16,6 +16,12 @@ kotlin { js(IR) { browser { webpackTask { + cssSupport{ + enabled = true + } + scssSupport{ + enabled = true + } mainOutputFileName.set("js/visionforge-playground.js") } } diff --git a/demo/playground/webpack.config.d/01.ring.js b/demo/playground/webpack.config.d/01.ring.js deleted file mode 100644 index b3cc4770..00000000 --- a/demo/playground/webpack.config.d/01.ring.js +++ /dev/null @@ -1,23 +0,0 @@ -const ringConfig = require('@jetbrains/ring-ui/webpack.config').config; -const path = require('path'); - -config.module.rules.push(...ringConfig.module.rules) - -config.module.rules.push( - { - test: /\.css$/, - exclude: [ - path.resolve(__dirname, "../../node_modules/@jetbrains/ring-ui") - ], - use: [ - { - loader: 'style-loader', - options: {} - }, - { - loader: 'css-loader', - options: {} - } - ] - } -) \ No newline at end of file diff --git a/settings.gradle.kts b/settings.gradle.kts index b2a1b7aa..6ccab6fa 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -41,11 +41,11 @@ dependencyResolutionManagement { include( // ":ui", - ":ui:react", - ":ui:ring", +// ":ui:react", +// ":ui:ring", // ":ui:material", - ":ui:bootstrap", - ":visionforge-compose", +// ":ui:bootstrap", + ":visionforge-compose-html", ":visionforge-core", ":visionforge-solid", // ":visionforge-fx", diff --git a/visionforge-compose/build.gradle.kts b/visionforge-compose-html/build.gradle.kts similarity index 88% rename from visionforge-compose/build.gradle.kts rename to visionforge-compose-html/build.gradle.kts index f8388b5c..1885365f 100644 --- a/visionforge-compose/build.gradle.kts +++ b/visionforge-compose-html/build.gradle.kts @@ -1,10 +1,9 @@ - plugins { id("space.kscience.gradle.mpp") alias(spclibs.plugins.compose) } -kscience{ +kscience { jvm() js() // wasm() @@ -13,22 +12,22 @@ kscience{ kotlin { // android() sourceSets { - commonMain{ - dependencies{ + commonMain { + dependencies { api(projects.visionforgeCore) + api(compose.runtime) } } val jvmMain by getting { dependencies { - api(compose.runtime) api(compose.foundation) api(compose.material) api(compose.preview) } } - val jsMain by getting{ + val jsMain by getting { dependencies { api(compose.html.core) api("app.softwork:bootstrap-compose:0.1.15") diff --git a/visionforge-compose/src/jsMain/kotlin/space/kscience/visionforge/compose/MetaViewer.kt b/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/MetaViewer.kt similarity index 100% rename from visionforge-compose/src/jsMain/kotlin/space/kscience/visionforge/compose/MetaViewer.kt rename to visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/MetaViewer.kt diff --git a/visionforge-compose/src/jsMain/kotlin/space/kscience/visionforge/compose/NameCrumbs.kt b/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/NameCrumbs.kt similarity index 100% rename from visionforge-compose/src/jsMain/kotlin/space/kscience/visionforge/compose/NameCrumbs.kt rename to visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/NameCrumbs.kt diff --git a/visionforge-compose/src/jsMain/kotlin/space/kscience/visionforge/compose/PropertyEditor.kt b/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/PropertyEditor.kt similarity index 100% rename from visionforge-compose/src/jsMain/kotlin/space/kscience/visionforge/compose/PropertyEditor.kt rename to visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/PropertyEditor.kt diff --git a/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/Tabs.kt b/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/Tabs.kt new file mode 100644 index 00000000..ce953304 --- /dev/null +++ b/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/Tabs.kt @@ -0,0 +1,88 @@ +package space.kscience.visionforge.compose + +import androidx.compose.runtime.* +import app.softwork.bootstrapcompose.Card +import app.softwork.bootstrapcompose.NavbarLink +import app.softwork.bootstrapcompose.Styling +import org.jetbrains.compose.web.dom.* +import org.w3c.dom.HTMLAnchorElement +import org.w3c.dom.HTMLDivElement + + +public class ComposeTab( + public val key: String, + public val title: ContentBuilder, + public val disabled: Boolean, + public val content: ContentBuilder, +) + +@Composable +public fun Tabs( + tabs: List, + activeKey: String, + styling: (Styling.() -> Unit)? = null, + attrs: AttrBuilderContext? = null, +) { + var active by remember(activeKey) { mutableStateOf(activeKey) } + + val activeTab by derivedStateOf { tabs.find { it.key == active } } + + Card( + styling, + attrs, + header = { + Ul({ classes("nav", "nav-tabs", "card-header-tabs") }) { + tabs.forEach { tab -> + Li({ + classes("nav-item") + }) { + NavbarLink( + active = active == tab.key, + disabled = tab.disabled, + attrs = { + onClick { event -> + event.preventDefault() + active = tab.key + } + } + ) { + tab.title.invoke(this) + } + } + } + } + } + ) { + activeTab?.content?.invoke(this) + } +} + +public class TabsBuilder { + internal val tabs: MutableList = mutableListOf() + + @Composable + public fun Tab( + key: String, + label: ContentBuilder = { Text(key) }, + disabled: Boolean = false, + content: ContentBuilder, + ) { + tabs.add(ComposeTab(key, label, disabled, content)) + } + + public fun addTab(tab: ComposeTab) { + tabs.add(tab) + } +} + +@Composable +public fun Tabs( + activeKey: String? = null, + styling: (Styling.() -> Unit)? = null, + attrs: AttrBuilderContext? = null, + builder: @Composable TabsBuilder.() -> Unit, +) { + val result = TabsBuilder().apply { builder() } + + Tabs(result.tabs, activeKey ?: result.tabs.firstOrNull()?.key ?: "", styling, attrs) +} \ No newline at end of file diff --git a/visionforge-compose/src/jsMain/kotlin/space/kscience/visionforge/compose/TreeStyles.kt b/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/TreeStyles.kt similarity index 89% rename from visionforge-compose/src/jsMain/kotlin/space/kscience/visionforge/compose/TreeStyles.kt rename to visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/TreeStyles.kt index de9001ba..ab6b843a 100644 --- a/visionforge-compose/src/jsMain/kotlin/space/kscience/visionforge/compose/TreeStyles.kt +++ b/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/TreeStyles.kt @@ -5,7 +5,7 @@ import org.jetbrains.compose.web.css.* @OptIn(ExperimentalComposeWebApi::class) -public object TreeStyles : StyleSheet() { +public object TreeStyles : StyleSheet(VisionForgeStyles) { /** * Remove default bullets */ @@ -46,13 +46,11 @@ public object TreeStyles : StyleSheet() { public val treeItem: String by style { alignItems(AlignItems.Center) paddingLeft(10.px) - border { - left { - width(1.px) - color(Color.lightgray) - style = LineStyle.Dashed - } - } + property("border-left", CSSBorder().apply{ + width(1.px) + color(Color.lightgray) + style = LineStyle.Dashed + }) } public val treeLabel: String by style { @@ -75,7 +73,7 @@ public object TreeStyles : StyleSheet() { alignSelf(AlignSelf.Stretch) marginAll(1.px, 5.px) backgroundColor(Color.white) - border{ + border { style(LineStyle.Solid) } borderRadius(2.px) @@ -84,7 +82,7 @@ public object TreeStyles : StyleSheet() { cursor("pointer") disabled { cursor("auto") - border{ + border { style(LineStyle.Dashed) } color(Color.lightgray) diff --git a/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/VisionForgeStyles.kt b/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/VisionForgeStyles.kt new file mode 100644 index 00000000..06d1187c --- /dev/null +++ b/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/VisionForgeStyles.kt @@ -0,0 +1,7 @@ +package space.kscience.visionforge.compose + +import org.jetbrains.compose.web.css.StyleSheet + +public object VisionForgeStyles: StyleSheet() { + +} \ No newline at end of file diff --git a/visionforge-compose/src/jsMain/kotlin/space/kscience/visionforge/compose/VisionTree.kt b/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/VisionTree.kt similarity index 100% rename from visionforge-compose/src/jsMain/kotlin/space/kscience/visionforge/compose/VisionTree.kt rename to visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/VisionTree.kt diff --git a/visionforge-compose/src/jsMain/kotlin/space/kscience/visionforge/compose/bootstrap.kt b/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/bootstrap.kt similarity index 100% rename from visionforge-compose/src/jsMain/kotlin/space/kscience/visionforge/compose/bootstrap.kt rename to visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/bootstrap.kt diff --git a/visionforge-compose/src/jsMain/kotlin/space/kscience/visionforge/compose/composeVision.kt b/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/composeVision.kt similarity index 100% rename from visionforge-compose/src/jsMain/kotlin/space/kscience/visionforge/compose/composeVision.kt rename to visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/composeVision.kt diff --git a/visionforge-compose/src/jsMain/kotlin/space/kscience/visionforge/compose/css.kt b/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/css.kt similarity index 100% rename from visionforge-compose/src/jsMain/kotlin/space/kscience/visionforge/compose/css.kt rename to visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/css.kt diff --git a/visionforge-compose/src/jsMain/kotlin/space/kscience/visionforge/compose/layouts.kt b/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/layouts.kt similarity index 100% rename from visionforge-compose/src/jsMain/kotlin/space/kscience/visionforge/compose/layouts.kt rename to visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/layouts.kt diff --git a/visionforge-compose/src/jsMain/kotlin/space/kscience/visionforge/compose/valueChooser.kt b/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/valueChooser.kt similarity index 100% rename from visionforge-compose/src/jsMain/kotlin/space/kscience/visionforge/compose/valueChooser.kt rename to visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/valueChooser.kt diff --git a/visionforge-compose/src/jsMain/kotlin/space/kscience/visionforge/compose/Tabs.kt b/visionforge-compose/src/jsMain/kotlin/space/kscience/visionforge/compose/Tabs.kt deleted file mode 100644 index cae4e797..00000000 --- a/visionforge-compose/src/jsMain/kotlin/space/kscience/visionforge/compose/Tabs.kt +++ /dev/null @@ -1,102 +0,0 @@ -package space.kscience.visionforge.compose - -import androidx.compose.runtime.* -import org.jetbrains.compose.web.dom.* -import org.w3c.dom.HTMLDivElement -import org.w3c.dom.HTMLLIElement - - -public class ComposeTab( - public val key: String, - public val title: String, - public val content: ContentBuilder, - public val disabled: Boolean, - public val titleExt: ContentBuilder, -) - -@Composable -public fun Tabs(tabs: List, activeKey: String) { - var active by remember(activeKey) { mutableStateOf(activeKey) } - - Div({ classes("card", "text-center") }) { - Div({ classes("card-header") }) { - - Ul({ classes("nav", "nav-tabs", "card-header-tabs") }) { - tabs.forEach { tab -> - Li({ - classes("nav-item") - }) { - A(attrs = { - classes("nav-link") - if (active == tab.key) { - classes("active") - } - if (tab.disabled) { - classes("disabled") - } - onClick { - active = tab.key - } - }) { - Text(tab.title) - } - tab.titleExt.invoke(this) - } - } - } - } - tabs.find { it.key == active }?.let { tab -> - Div({ classes("card-body") }) { - tab.content.invoke(this) - } - } - } - - -} - -public class TabBuilder internal constructor(public val key: String) { - private var title: String = key - public var disabled: Boolean = false - private var content: ContentBuilder = {} - private var titleExt: ContentBuilder = {} - - @Composable - public fun Content(content: ContentBuilder) { - this.content = content - } - - @Composable - public fun Title(title: String, titleExt: ContentBuilder = {}) { - this.title = title - this.titleExt = titleExt - } - - internal fun build(): ComposeTab = ComposeTab( - key, - title, - content, - disabled, - titleExt - ) -} - -public class TabsBuilder { - public var active: String = "" - internal val tabs: MutableList = mutableListOf() - - @Composable - public fun Tab(key: String, builder: @Composable TabBuilder.() -> Unit) { - tabs.add(TabBuilder(key).apply { builder() }.build()) - } - - public fun addTab(tab: ComposeTab) { - tabs.add(tab) - } -} - -@Composable -public fun Tabs(builder: @Composable TabsBuilder.() -> Unit) { - val result = TabsBuilder().apply { builder() } - Tabs(result.tabs, result.active) -} \ No newline at end of file diff --git a/visionforge-jupyter/visionforge-jupyter-common/build.gradle.kts b/visionforge-jupyter/visionforge-jupyter-common/build.gradle.kts index b9883d9b..14984d77 100644 --- a/visionforge-jupyter/visionforge-jupyter-common/build.gradle.kts +++ b/visionforge-jupyter/visionforge-jupyter-common/build.gradle.kts @@ -7,6 +7,16 @@ description = "Jupyter api artifact including all common modules" kscience { fullStack( "js/visionforge-jupyter-common.js", + browserConfig = { + webpackTask { + cssSupport{ + enabled = true + } + scssSupport { + enabled = true + } + } + } ) dependencies { api(projects.visionforgeSolid) diff --git a/visionforge-jupyter/visionforge-jupyter-common/webpack.config.d/01.ring.js b/visionforge-jupyter/visionforge-jupyter-common/webpack.config.d/01.ring.js deleted file mode 100644 index cfb15cb8..00000000 --- a/visionforge-jupyter/visionforge-jupyter-common/webpack.config.d/01.ring.js +++ /dev/null @@ -1,24 +0,0 @@ -const ringConfig = require('@jetbrains/ring-ui/webpack.config').config; - -const path = require('path'); - -config.module.rules.push(...ringConfig.module.rules) - -config.module.rules.push( - { - test: /\.css$/, - exclude: [ - path.resolve(__dirname, "../../node_modules/@jetbrains/ring-ui") - ], - use: [ - { - loader: 'style-loader', - options: {} - }, - { - loader: 'css-loader', - options: {} - } - ] - } -) \ No newline at end of file diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/specifications/Canvas3DUIScheme.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/specifications/Canvas3DUIScheme.kt index 4424e2fc..5f85cc44 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/specifications/Canvas3DUIScheme.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/specifications/Canvas3DUIScheme.kt @@ -7,7 +7,7 @@ import space.kscience.dataforge.meta.boolean public class Canvas3DUIScheme : Scheme() { - public var enabled: Boolean by boolean{true} + public var enabled: Boolean by boolean { true } public companion object : SchemeSpec(::Canvas3DUIScheme) } \ No newline at end of file diff --git a/visionforge-tables/build.gradle.kts b/visionforge-tables/build.gradle.kts index 9eb9f2cf..23912afe 100644 --- a/visionforge-tables/build.gradle.kts +++ b/visionforge-tables/build.gradle.kts @@ -7,8 +7,14 @@ val tablesVersion = "0.3.0" kscience { jvm() js { - useCommonJs() binaries.library() + browser { + webpackTask{ + scssSupport { + enabled = true + } + } + } } useSerialization() @@ -17,8 +23,8 @@ kscience { api("space.kscience:tables-kt:${tablesVersion}") } jsMain { - implementation(npm("tabulator-tables", "5.5.2")) - implementation(npm("@types/tabulator-tables", "5.5.3")) + api(npm("tabulator-tables", "5.5.2")) + api(npm("@types/tabulator-tables", "5.5.3")) } } diff --git a/visionforge-tables/src/jsMain/kotlin/tabulator/Tabulator.kt b/visionforge-tables/src/jsMain/kotlin/tabulator/Tabulator.kt index f6efd32a..8908ee89 100644 --- a/visionforge-tables/src/jsMain/kotlin/tabulator/Tabulator.kt +++ b/visionforge-tables/src/jsMain/kotlin/tabulator/Tabulator.kt @@ -5,6 +5,7 @@ "NO_EXPLICIT_VISIBILITY_IN_API_MODE_WARNING") @file:JsModule("tabulator-tables") +@file:JsNonModule package tabulator diff --git a/visionforge-threejs/build.gradle.kts b/visionforge-threejs/build.gradle.kts index 6e522585..f385061c 100644 --- a/visionforge-threejs/build.gradle.kts +++ b/visionforge-threejs/build.gradle.kts @@ -14,7 +14,7 @@ kscience { commonMain { api(projects.visionforgeSolid) - api(projects.visionforgeCompose) + api(projects.visionforgeComposeHtml) } jsMain { diff --git a/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/ThreePlugin.kt b/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/ThreePlugin.kt index ac757183..e3a0f20b 100644 --- a/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/ThreePlugin.kt +++ b/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/ThreePlugin.kt @@ -4,6 +4,7 @@ import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach import org.jetbrains.compose.web.renderComposable import org.w3c.dom.Element +import org.w3c.dom.HTMLElement import space.kscience.dataforge.context.* import space.kscience.dataforge.meta.Meta import space.kscience.dataforge.names.* diff --git a/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/compose/ThreeControls.kt b/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/compose/ThreeControls.kt index 238aea55..e37cfd6b 100644 --- a/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/compose/ThreeControls.kt +++ b/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/compose/ThreeControls.kt @@ -1,6 +1,9 @@ package space.kscience.visionforge.solid.three.compose import androidx.compose.runtime.Composable +import app.softwork.bootstrapcompose.Column +import app.softwork.bootstrapcompose.Layout.Height +import app.softwork.bootstrapcompose.Row import org.jetbrains.compose.web.css.* import org.jetbrains.compose.web.dom.Button import org.jetbrains.compose.web.dom.Text @@ -18,8 +21,8 @@ internal fun CanvasControls( vision: Vision?, options: Canvas3DOptions, ) { - FlexColumn { - FlexRow({ + Column { + Row(attrs = { style { border { width(1.px) @@ -64,8 +67,11 @@ public fun ThreeControls( onSelect: (Name?) -> Unit, tabBuilder: @Composable TabsBuilder.() -> Unit = {}, ) { - Tabs { - active = "Tree" + Tabs( + styling = { + Layout.height = Height.Full + } + ) { vision?.let { vision -> Tab("Tree") { CardTitle("Vision tree") diff --git a/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/compose/ThreeView.kt b/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/compose/ThreeView.kt index 4b680b80..acd4882d 100644 --- a/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/compose/ThreeView.kt +++ b/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/compose/ThreeView.kt @@ -2,6 +2,10 @@ package space.kscience.visionforge.solid.three.compose import androidx.compose.runtime.* import app.softwork.bootstrapcompose.Card +import app.softwork.bootstrapcompose.Column +import app.softwork.bootstrapcompose.Layout.Height +import app.softwork.bootstrapcompose.Layout.Width +import app.softwork.bootstrapcompose.Row import kotlinx.dom.clear import org.jetbrains.compose.web.ExperimentalComposeWebApi import org.jetbrains.compose.web.css.* @@ -90,24 +94,27 @@ public fun ThreeView( if (optionsSnapshot.controls.enabled) { - - FlexRow({ - style { - height(100.percent) - width(100.percent) - flexWrap(FlexWrap.Wrap) - alignItems(AlignItems.Stretch) - alignContent(AlignContent.Stretch) - } - }) { - FlexColumn({ - style { - height(100.percent) - minWidth(600.px) - flex(10, 1, 600.px) - position(Position.Relative) + Row( + styling = { + Layout { + width = Width.Full + height = Height.Full } - }) { + } + ) { + Column( + styling = { + Layout { + height = Height.Full + } + }, + attrs = { + style { + position(Position.Relative) + minWidth(600.px) + } + } + ) { if (solid == null) { Div({ style { @@ -143,61 +150,68 @@ public fun ThreeView( } selectedVision?.let { vision -> - Div({ - style { - position(Position.Absolute) - top(5.px) - right(5.px) - width(450.px) + Card( + attrs = { + style { + position(Position.Absolute) + top(5.px) + right(5.px) + width(450.px) + } + }, + headerAttrs = { + // border = true + }, + header = { + NameCrumbs(selected) { selected = it } + }, + footer = { + vision.styles.takeIf { it.isNotEmpty() }?.let { styles -> + P { + B { Text("Styles: ") } + Text(styles.joinToString(separator = ", ")) + } + } } - }) { - Card( - headerAttrs = { - // border = true + ) { + PropertyEditor( + scope = solids.context, + meta = vision.properties.root(), + getPropertyState = { name -> + if (vision.properties.own?.get(name) != null) { + EditorPropertyState.Defined + } else if (vision.properties.root()[name] != null) { + // TODO differentiate + EditorPropertyState.Default() + } else { + EditorPropertyState.Undefined + } }, - header = { - NameCrumbs(selected) { selected = it } - } - ) { - PropertyEditor( - scope = solids.context, - meta = vision.properties.root(), - getPropertyState = { name -> - if (vision.properties.own?.get(name) != null) { - EditorPropertyState.Defined - } else if (vision.properties.root()[name] != null) { - // TODO differentiate - EditorPropertyState.Default() - } else { - EditorPropertyState.Undefined - } - }, - updates = vision.properties.changes, - rootDescriptor = vision.descriptor - ) - - } - - vision.styles.takeIf { it.isNotEmpty() }?.let { styles -> - P { - B { Text("Styles: ") } - Text(styles.joinToString(separator = ", ")) - } - } + updates = vision.properties.changes, + rootDescriptor = vision.descriptor + ) } } } - } - FlexColumn({ - style { - paddingAll(4.px) - minWidth(400.px) - height(100.percent) - overflowY("auto") - flex(1, 10, 300.px) + + Column( + auto = true, + styling = { + Layout { + height = Height.Full + } + }, + attrs = { + style { + paddingAll(4.px) + minWidth(400.px) + height(100.percent) + overflowY("auto") + } + } + ) { + ThreeControls(solid, optionsSnapshot, selected, onSelect = { selected = it }, tabBuilder = sidebarTabs) } - }) { - ThreeControls(solid, optionsSnapshot, selected, onSelect = { selected = it }, tabBuilder = sidebarTabs) } } else { SimpleThreeView(solids.context, optionsSnapshot, solid, selected) diff --git a/visionforge-threejs/visionforge-threejs-server/build.gradle.kts b/visionforge-threejs/visionforge-threejs-server/build.gradle.kts index 395fea38..f6c30385 100644 --- a/visionforge-threejs/visionforge-threejs-server/build.gradle.kts +++ b/visionforge-threejs/visionforge-threejs-server/build.gradle.kts @@ -10,7 +10,7 @@ kscience { commonMain { api(projects.visionforgeSolid) - api(projects.visionforgeCompose) + api(projects.visionforgeComposeHtml) } jvmMain{ @@ -19,6 +19,8 @@ kscience { jsMain{ api(projects.visionforgeThreejs) + implementation(npm("file-saver","2.0.5")) + implementation(npm("@types/file-saver", "2.0.7")) compileOnly(npm("webpack-bundle-analyzer","4.5.0")) } } \ No newline at end of file From 3f144a5dbd9dcc1247047099c0a73811f3ebd20f Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Wed, 27 Dec 2023 17:08:24 +0300 Subject: [PATCH 22/41] More or less working muon monitor --- .../kscience/visionforge/compose/NameCrumbs.kt | 13 +++++++++---- .../kscience/visionforge/compose/TreeStyles.kt | 6 +++--- .../visionforge/solid/three/compose/ThreeView.kt | 10 ++++------ 3 files changed, 16 insertions(+), 13 deletions(-) diff --git a/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/NameCrumbs.kt b/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/NameCrumbs.kt index 2becdbb6..29be7aca 100644 --- a/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/NameCrumbs.kt +++ b/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/NameCrumbs.kt @@ -11,9 +11,15 @@ import space.kscience.dataforge.names.length @Composable public fun NameCrumbs(name: Name?, link: (Name) -> Unit): Unit = Nav({ - attr("aria-label","breadcrumb") + attr("aria-label", "breadcrumb") }) { - Ol({classes("breadcrumb")}) { + Ol({ + classes("breadcrumb") + style { + property("--bs-breadcrumb-divider", "'.'") + property("--bs-breadcrumb-item-padding-x",".2rem") + } + }) { Li({ classes("breadcrumb-item") onClick { @@ -28,10 +34,9 @@ public fun NameCrumbs(name: Name?, link: (Name) -> Unit): Unit = Nav({ name.tokens.forEach { token -> tokens.add(token) val fullName = Name(tokens.toList()) - Text(".") Li({ classes("breadcrumb-item") - if(tokens.size == name.length) classes("active") + if (tokens.size == name.length) classes("active") onClick { link(fullName) } diff --git a/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/TreeStyles.kt b/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/TreeStyles.kt index ab6b843a..c97bdae2 100644 --- a/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/TreeStyles.kt +++ b/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/TreeStyles.kt @@ -22,7 +22,7 @@ public object TreeStyles : StyleSheet(VisionForgeStyles) { cursor("pointer") userSelect(UserSelect.none) /* Create the caret/arrow with a unicode, and style it */ - before { + (self + before) { content("\u25B6") color(Color.black) display(DisplayStyle.InlineBlock) @@ -34,7 +34,7 @@ public object TreeStyles : StyleSheet(VisionForgeStyles) { * Rotate the caret/arrow icon when clicked on (using JavaScript) */ public val treeCaretDown: String by style { - before { + (self + before) { content("\u25B6") color(Color.black) display(DisplayStyle.InlineBlock) @@ -80,7 +80,7 @@ public object TreeStyles : StyleSheet(VisionForgeStyles) { textAlign("center") textDecoration("none") cursor("pointer") - disabled { + (self + disabled) { cursor("auto") border { style(LineStyle.Dashed) diff --git a/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/compose/ThreeView.kt b/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/compose/ThreeView.kt index acd4882d..245953e0 100644 --- a/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/compose/ThreeView.kt +++ b/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/compose/ThreeView.kt @@ -33,8 +33,6 @@ private fun SimpleThreeView( selected: Name?, ) { - val three: ThreePlugin by derivedStateOf { context.request(ThreePlugin) } - Div({ style { maxWidth(100.vw) @@ -43,9 +41,9 @@ private fun SimpleThreeView( height(100.percent) } }) { - var canvas: ThreeCanvas? = null + var canvas: ThreeCanvas? by remember { mutableStateOf(null) } DisposableEffect(options) { - canvas = ThreeCanvas(three, scopeElement, options ?: Canvas3DOptions()) + canvas = ThreeCanvas(context.request(ThreePlugin), scopeElement, options ?: Canvas3DOptions()) onDispose { scopeElement.clear() canvas = null @@ -75,7 +73,7 @@ public fun ThreeView( ) { var selected: Name? by remember { mutableStateOf(initialSelected) } - val optionsSnapshot = remember(options) { + val optionsSnapshot by derivedStateOf { (options ?: Canvas3DOptions()).apply { this.onSelect = { selected = it @@ -83,7 +81,7 @@ public fun ThreeView( } } - val selectedVision: Vision? = remember(solid, selected) { + val selectedVision: Vision? by derivedStateOf { selected?.let { when { it.isEmpty() -> solid From b5a1296070d4e728f94a23d2768486e322e23034 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Wed, 27 Dec 2023 21:16:13 +0300 Subject: [PATCH 23/41] working muon monitor --- .../visionforge/compose/NameCrumbs.kt | 2 +- .../visionforge/compose/PropertyEditor.kt | 41 +++----- .../kscience/visionforge/compose/Tabs.kt | 6 ++ .../visionforge/compose/VisionTree.kt | 7 -- .../visionforge/compose/valueChooser.kt | 97 ++++++++----------- .../solid/three/compose/ThreeView.kt | 97 +++++++++---------- 6 files changed, 113 insertions(+), 137 deletions(-) diff --git a/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/NameCrumbs.kt b/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/NameCrumbs.kt index 29be7aca..2740b1e5 100644 --- a/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/NameCrumbs.kt +++ b/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/NameCrumbs.kt @@ -17,7 +17,7 @@ public fun NameCrumbs(name: Name?, link: (Name) -> Unit): Unit = Nav({ classes("breadcrumb") style { property("--bs-breadcrumb-divider", "'.'") - property("--bs-breadcrumb-item-padding-x",".2rem") + property("--bs-breadcrumb-item-padding-x",".1rem") } }) { Li({ diff --git a/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/PropertyEditor.kt b/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/PropertyEditor.kt index 0892b9af..cff16298 100644 --- a/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/PropertyEditor.kt +++ b/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/PropertyEditor.kt @@ -1,16 +1,16 @@ package space.kscience.visionforge.compose import androidx.compose.runtime.* +import app.softwork.bootstrapcompose.CloseButton import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.channels.awaitClose import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.callbackFlow import kotlinx.coroutines.launch -import org.jetbrains.compose.web.attributes.disabled import org.jetbrains.compose.web.css.AlignItems import org.jetbrains.compose.web.css.alignItems import org.jetbrains.compose.web.css.px import org.jetbrains.compose.web.css.width -import org.jetbrains.compose.web.dom.Button import org.jetbrains.compose.web.dom.Div import org.jetbrains.compose.web.dom.Span import org.jetbrains.compose.web.dom.Text @@ -35,13 +35,13 @@ public sealed class EditorPropertyState { } /** - * @param meta Root config object - always non-null - * @param rootDescriptor Full path to the displayed node in [meta]. Could be empty + * @param rootMeta Root config object - always non-null + * @param rootDescriptor Full path to the displayed node in [rootMeta]. Could be empty */ @Composable public fun PropertyEditor( scope: CoroutineScope, - meta: MutableMeta, + rootMeta: MutableMeta, getPropertyState: (Name) -> EditorPropertyState, updates: Flow, name: Name = Name.EMPTY, @@ -50,11 +50,11 @@ public fun PropertyEditor( ) { var expanded: Boolean by remember { mutableStateOf(initialExpanded ?: true) } val descriptor: MetaDescriptor? = remember(rootDescriptor, name) { rootDescriptor?.get(name) } - var property: MutableMeta by remember { mutableStateOf(meta.getOrCreate(name)) } + var property: MutableMeta by remember { mutableStateOf(rootMeta.getOrCreate(name)) } var editorPropertyState: EditorPropertyState by remember { mutableStateOf(getPropertyState(name)) } - val keys = remember(descriptor) { + val keys by derivedStateOf { buildSet { descriptor?.children?.filterNot { it.key.startsWith("@") || it.value.hidden @@ -68,11 +68,11 @@ public fun PropertyEditor( val token = name.lastOrNull()?.toString() ?: "Properties" fun update() { - property = meta.getOrCreate(name) + property = rootMeta.getOrCreate(name) editorPropertyState = getPropertyState(name) } - LaunchedEffect(meta) { + LaunchedEffect(rootMeta) { updates.collect { updatedName -> if (updatedName == name) { update() @@ -116,18 +116,9 @@ public fun PropertyEditor( } } - Button({ - classes(TreeStyles.propertyEditorButton) - if (editorPropertyState != EditorPropertyState.Defined) { - disabled() - } else { - onClick { - meta.remove(name) - update() - } - } - }) { - Text("\u00D7") + CloseButton(editorPropertyState != EditorPropertyState.Defined){ + rootMeta.remove(name) + update() } } } @@ -139,7 +130,7 @@ public fun PropertyEditor( Div({ classes(TreeStyles.treeItem) }) { - PropertyEditor(scope, meta, getPropertyState, updates, name + token, descriptor, expanded) + PropertyEditor(scope, rootMeta, getPropertyState, updates, name + token, rootDescriptor, expanded) } } } @@ -155,7 +146,7 @@ public fun PropertyEditor( ) { PropertyEditor( scope = scope, - meta = properties, + rootMeta = properties, getPropertyState = { name -> if (properties[name] != null) { EditorPropertyState.Defined @@ -172,9 +163,7 @@ public fun PropertyEditor( } } - invokeOnClose { - properties.removeListener(scope) - } + awaitClose { properties.removeListener(scope) } }, name = Name.EMPTY, rootDescriptor = descriptor, diff --git a/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/Tabs.kt b/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/Tabs.kt index ce953304..6073cdda 100644 --- a/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/Tabs.kt +++ b/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/Tabs.kt @@ -4,6 +4,7 @@ import androidx.compose.runtime.* import app.softwork.bootstrapcompose.Card import app.softwork.bootstrapcompose.NavbarLink import app.softwork.bootstrapcompose.Styling +import org.jetbrains.compose.web.css.overflowY import org.jetbrains.compose.web.dom.* import org.w3c.dom.HTMLAnchorElement import org.w3c.dom.HTMLDivElement @@ -51,6 +52,11 @@ public fun Tabs( } } } + }, + bodyAttrs = { + style { + overflowY("auto") + } } ) { activeTab?.content?.invoke(this) diff --git a/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/VisionTree.kt b/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/VisionTree.kt index 2de59f90..39a4d669 100644 --- a/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/VisionTree.kt +++ b/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/VisionTree.kt @@ -4,7 +4,6 @@ import androidx.compose.runtime.* import org.jetbrains.compose.web.css.Color import org.jetbrains.compose.web.css.color import org.jetbrains.compose.web.css.cursor -import org.jetbrains.compose.web.css.textDecorationLine import org.jetbrains.compose.web.dom.Div import org.jetbrains.compose.web.dom.Span import org.jetbrains.compose.web.dom.Text @@ -15,8 +14,6 @@ import space.kscience.dataforge.names.startsWith import space.kscience.visionforge.Vision import space.kscience.visionforge.VisionGroup import space.kscience.visionforge.asSequence -import space.kscience.visionforge.compose.TreeStyles.hover -import space.kscience.visionforge.compose.TreeStyles.invoke import space.kscience.visionforge.isEmpty @@ -35,10 +32,6 @@ private fun TreeLabel( style { color(Color("#069")) cursor("pointer") - hover.invoke { - textDecorationLine("underline") - } - } onClick { clickCallback(name) } }) { diff --git a/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/valueChooser.kt b/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/valueChooser.kt index cf1ad9f8..f0f2451c 100644 --- a/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/valueChooser.kt +++ b/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/valueChooser.kt @@ -4,14 +4,10 @@ package space.kscience.visionforge.compose import androidx.compose.runtime.* import org.jetbrains.compose.web.attributes.* -import org.jetbrains.compose.web.css.percent -import org.jetbrains.compose.web.css.px -import org.jetbrains.compose.web.css.width import org.jetbrains.compose.web.dom.Input import org.jetbrains.compose.web.dom.Option import org.jetbrains.compose.web.dom.Select import org.jetbrains.compose.web.dom.Text -import org.w3c.dom.HTMLInputElement import org.w3c.dom.HTMLOptionElement import org.w3c.dom.asList import space.kscience.dataforge.meta.* @@ -29,20 +25,16 @@ public fun StringValueChooser( value: Value?, onValueChange: (Value?) -> Unit, ) { - var stringValue by remember { mutableStateOf(value?.string ?: "") } + var stringValue by remember(value, descriptor) { mutableStateOf(value?.string ?: "") } Input(type = InputType.Text) { - style { - width(100.percent) - } + classes("w-100") value(stringValue) - onKeyDown { event -> - if (event.type == "keydown" && event.asDynamic().key == "Enter") { - stringValue = (event.target as HTMLInputElement).value - onValueChange(stringValue.asValue()) - } + onChange { event -> + stringValue = event.value } - onChange { - stringValue = it.target.value + onInput { event -> + stringValue = event.value + onValueChange(event.value.asValue()) } } } @@ -55,16 +47,18 @@ public fun BooleanValueChooser( value: Value?, onValueChange: (Value?) -> Unit, ) { + var innerValue by remember(value, descriptor) { + mutableStateOf( + value?.boolean ?: descriptor?.defaultValue?.boolean + ) + } Input(type = InputType.Checkbox) { - style { - width(100.percent) - } - //this.attributes["indeterminate"] = (props.item == null).toString() - checked(value?.boolean ?: false) + classes("w-100") + checked(innerValue ?: false) - onChange { - val newValue = it.target.checked - onValueChange(newValue.asValue()) + onInput { event -> + innerValue = event.value + onValueChange(event.value.asValue()) } } } @@ -76,25 +70,18 @@ public fun NumberValueChooser( value: Value?, onValueChange: (Value?) -> Unit, ) { - var innerValue by remember { mutableStateOf(value?.string ?: "") } + var innerValue by remember(value, descriptor) { mutableStateOf(value?.number) } Input(type = InputType.Number) { - style { - width(100.percent) + classes("w-100") + + value(innerValue ?: descriptor?.defaultValue?.number ?: 0.0) + + onChange { event -> + innerValue = event.value } - value(innerValue) - onKeyDown { event -> - if (event.type == "keydown" && event.asDynamic().key == "Enter") { - innerValue = (event.target as HTMLInputElement).value - val number = innerValue.toDoubleOrNull() - if (number == null) { - console.error("The input value $innerValue is not a number") - } else { - onValueChange(number.asValue()) - } - } - } - onChange { - innerValue = it.target.value + onInput { event -> + innerValue = event.value + onValueChange(event.value?.asValue()) } descriptor?.attributes?.get("step").number?.let { step(it) @@ -116,11 +103,10 @@ public fun ComboValueChooser( value: Value?, onValueChange: (Value?) -> Unit, ) { - var selected by remember { mutableStateOf(value?.string ?: "") } + var selected by remember(value, descriptor) { mutableStateOf(value?.string ?: "") } Select({ - style { - width(100.percent) - } + classes("w-100") + onChange { selected = it.target.value onValueChange(selected.asValue()) @@ -142,11 +128,11 @@ public fun ColorValueChooser( value: Value?, onValueChange: (Value?) -> Unit, ) { + var innerValue by remember { mutableStateOf(value?.string ?: descriptor?.defaultValue?.string) } + Input(type = InputType.Color) { - style { - width(100.percent) - marginAll(0.px) - } + classes("w-100") + value( value?.let { value -> if (value.type == ValueType.NUMBER) Colors.rgbToString(value.int) @@ -154,8 +140,12 @@ public fun ColorValueChooser( //else "#" + Color(value.string).getHexString() } ?: "#000000" ) - onChange { - onValueChange(it.target.value.asValue()) + onChange { event -> + innerValue = event.value + } + onInput { event -> + innerValue = event.value + onValueChange(event.value.asValue()) } } } @@ -194,7 +184,7 @@ public fun RangeValueChooser( value: Value?, onValueChange: (Value?) -> Unit, ) { - var innerValue by remember { mutableStateOf(value?.double) } + var innerValue by remember(value, descriptor) { mutableStateOf(value?.double) } var rangeDisabled: Boolean by remember { mutableStateOf(state != EditorPropertyState.Defined) } @@ -219,9 +209,8 @@ public fun RangeValueChooser( } Input(type = InputType.Range) { - style { - width(100.percent) - } + classes("w-100") + if (rangeDisabled) disabled() value(innerValue?.toString() ?: "") onChange { diff --git a/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/compose/ThreeView.kt b/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/compose/ThreeView.kt index 245953e0..f2e890b1 100644 --- a/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/compose/ThreeView.kt +++ b/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/compose/ThreeView.kt @@ -14,7 +14,6 @@ import space.kscience.dataforge.context.Context import space.kscience.dataforge.context.request import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.isEmpty -import space.kscience.visionforge.Vision import space.kscience.visionforge.compose.* import space.kscience.visionforge.root import space.kscience.visionforge.solid.Solid @@ -81,15 +80,6 @@ public fun ThreeView( } } - val selectedVision: Vision? by derivedStateOf { - selected?.let { - when { - it.isEmpty() -> solid - else -> (solid as? SolidGroup)?.get(it) - } - } - } - if (optionsSnapshot.controls.enabled) { Row( @@ -147,47 +137,57 @@ public fun ThreeView( SimpleThreeView(solids.context, optionsSnapshot, solid, selected) } - selectedVision?.let { vision -> - Card( - attrs = { - style { - position(Position.Absolute) - top(5.px) - right(5.px) - width(450.px) - } - }, - headerAttrs = { - // border = true - }, - header = { - NameCrumbs(selected) { selected = it } - }, - footer = { - vision.styles.takeIf { it.isNotEmpty() }?.let { styles -> - P { - B { Text("Styles: ") } - Text(styles.joinToString(separator = ", ")) - } - } + key(selected) { + selected?.let { + when { + it.isEmpty() -> solid + else -> (solid as? SolidGroup)?.get(it) } - ) { - PropertyEditor( - scope = solids.context, - meta = vision.properties.root(), - getPropertyState = { name -> - if (vision.properties.own?.get(name) != null) { - EditorPropertyState.Defined - } else if (vision.properties.root()[name] != null) { - // TODO differentiate - EditorPropertyState.Default() - } else { - EditorPropertyState.Undefined + }?.let { vision -> + Card( + attrs = { + style { + position(Position.Absolute) + top(5.px) + right(5.px) + width(450.px) + overflowY("auto") } }, - updates = vision.properties.changes, - rootDescriptor = vision.descriptor - ) + headerAttrs = { + style { + alignItems(AlignItems.Center) + } + }, + header = { + NameCrumbs(selected) { selected = it } + }, + footer = { + vision.styles.takeIf { it.isNotEmpty() }?.let { styles -> + P { + B { Text("Styles: ") } + Text(styles.joinToString(separator = ", ")) + } + } + } + ) { + PropertyEditor( + scope = solids.context, + rootMeta = vision.properties.root(), + getPropertyState = { name -> + if (vision.properties.own?.get(name) != null) { + EditorPropertyState.Defined + } else if (vision.properties.root()[name] != null) { + // TODO differentiate + EditorPropertyState.Default() + } else { + EditorPropertyState.Undefined + } + }, + updates = vision.properties.changes, + rootDescriptor = vision.descriptor + ) + } } } } @@ -204,7 +204,6 @@ public fun ThreeView( paddingAll(4.px) minWidth(400.px) height(100.percent) - overflowY("auto") } } ) { From 7871987df1abfc115ea424878735d4d6538bd10b Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Thu, 28 Dec 2023 10:20:02 +0300 Subject: [PATCH 24/41] Optimize UI --- .../visionforge/gdml/demo/FileDrop.kt | 4 +- .../mipt/npm/muon/monitor/MMAppComponent.kt | 6 +- .../visionforge/compose/NameCrumbs.kt | 15 ++-- .../kscience/visionforge/compose/Tabs.kt | 2 +- .../visionforge/compose/TreeStyles.kt | 2 +- .../visionforge/compose/valueChooser.kt | 61 ++++++------- .../solid/specifications/Canvas3DOptions.kt | 2 + .../solid/three/compose/ThreeControls.kt | 38 +++------ .../solid/three/compose/ThreeView.kt | 85 +++++++------------ 9 files changed, 85 insertions(+), 130 deletions(-) diff --git a/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/FileDrop.kt b/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/FileDrop.kt index 010f782b..d26ea42d 100644 --- a/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/FileDrop.kt +++ b/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/FileDrop.kt @@ -3,12 +3,12 @@ package space.kscience.visionforge.gdml.demo import androidx.compose.runtime.* +import app.softwork.bootstrapcompose.Icon import org.jetbrains.compose.web.ExperimentalComposeWebApi import org.jetbrains.compose.web.attributes.InputType import org.jetbrains.compose.web.attributes.name import org.jetbrains.compose.web.css.* import org.jetbrains.compose.web.dom.Div -import org.jetbrains.compose.web.dom.I import org.jetbrains.compose.web.dom.Input import org.jetbrains.compose.web.dom.Text import org.w3c.files.FileList @@ -70,7 +70,7 @@ fun FileDrop( } }) { - I({ classes("bi", "bi-cloud-upload", "dropzone-icon") }) + Icon("cloud-upload"){ classes("dropzone-icon") } Text(title) Input(type = InputType.File, attrs = { style { diff --git a/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMAppComponent.kt b/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMAppComponent.kt index 13d92075..09f3a46d 100644 --- a/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMAppComponent.kt +++ b/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMAppComponent.kt @@ -5,7 +5,9 @@ import androidx.compose.runtime.mutableStateListOf import androidx.compose.runtime.remember import app.softwork.bootstrapcompose.Button import app.softwork.bootstrapcompose.ButtonGroup +import app.softwork.bootstrapcompose.Color.Secondary import app.softwork.bootstrapcompose.Container +import app.softwork.bootstrapcompose.Layout.Width import kotlinx.browser.window import kotlinx.coroutines.await import kotlinx.coroutines.launch @@ -64,7 +66,7 @@ fun MMApp(solids: Solids, model: Model, selected: Name? = null) { options = mmOptions, sidebarTabs = { Tab("Events") { - ButtonGroup { + ButtonGroup({ Layout.width = Width.Full }) { Button("Next") { solids.context.launch { val event = window.fetch( @@ -83,7 +85,7 @@ fun MMApp(solids: Solids, model: Model, selected: Name? = null) { model.displayEvent(event) } } - Button("Clear") { + Button("Clear", color = Secondary) { events.clear() model.reset() } diff --git a/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/NameCrumbs.kt b/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/NameCrumbs.kt index 2740b1e5..12d78210 100644 --- a/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/NameCrumbs.kt +++ b/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/NameCrumbs.kt @@ -1,10 +1,7 @@ package space.kscience.visionforge.compose import androidx.compose.runtime.Composable -import org.jetbrains.compose.web.dom.Li -import org.jetbrains.compose.web.dom.Nav -import org.jetbrains.compose.web.dom.Ol -import org.jetbrains.compose.web.dom.Text +import org.jetbrains.compose.web.dom.* import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.NameToken import space.kscience.dataforge.names.length @@ -17,7 +14,7 @@ public fun NameCrumbs(name: Name?, link: (Name) -> Unit): Unit = Nav({ classes("breadcrumb") style { property("--bs-breadcrumb-divider", "'.'") - property("--bs-breadcrumb-item-padding-x",".1rem") + property("--bs-breadcrumb-item-padding-x", ".1rem") } }) { Li({ @@ -26,7 +23,9 @@ public fun NameCrumbs(name: Name?, link: (Name) -> Unit): Unit = Nav({ link(Name.EMPTY) } }) { - Text("\u2302") + A("#") { + Text("\u2302") + } } if (name != null) { @@ -41,7 +40,9 @@ public fun NameCrumbs(name: Name?, link: (Name) -> Unit): Unit = Nav({ link(fullName) } }) { - Text(token.toString()) + A("#") { + Text(token.toString()) + } } } } diff --git a/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/Tabs.kt b/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/Tabs.kt index 6073cdda..3e0db26a 100644 --- a/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/Tabs.kt +++ b/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/Tabs.kt @@ -69,7 +69,7 @@ public class TabsBuilder { @Composable public fun Tab( key: String, - label: ContentBuilder = { Text(key) }, + label: ContentBuilder = { A("#") { Text(key) } }, disabled: Boolean = false, content: ContentBuilder, ) { diff --git a/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/TreeStyles.kt b/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/TreeStyles.kt index c97bdae2..95a58aaf 100644 --- a/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/TreeStyles.kt +++ b/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/TreeStyles.kt @@ -10,7 +10,7 @@ public object TreeStyles : StyleSheet(VisionForgeStyles) { * Remove default bullets */ public val tree: String by style { - paddingLeft(5.px) + paddingLeft(10.px) marginLeft(0.px) listStyleType("none") } diff --git a/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/valueChooser.kt b/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/valueChooser.kt index f0f2451c..9b9a9905 100644 --- a/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/valueChooser.kt +++ b/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/valueChooser.kt @@ -3,16 +3,14 @@ package space.kscience.visionforge.compose import androidx.compose.runtime.* +import kotlinx.uuid.UUID +import kotlinx.uuid.generateUUID import org.jetbrains.compose.web.attributes.* -import org.jetbrains.compose.web.dom.Input -import org.jetbrains.compose.web.dom.Option -import org.jetbrains.compose.web.dom.Select -import org.jetbrains.compose.web.dom.Text +import org.jetbrains.compose.web.dom.* import org.w3c.dom.HTMLOptionElement import org.w3c.dom.asList import space.kscience.dataforge.meta.* import space.kscience.dataforge.meta.descriptors.MetaDescriptor -import space.kscience.dataforge.meta.descriptors.ValueRestriction import space.kscience.dataforge.meta.descriptors.allowedValues import space.kscience.visionforge.Colors import space.kscience.visionforge.widgetType @@ -47,20 +45,31 @@ public fun BooleanValueChooser( value: Value?, onValueChange: (Value?) -> Unit, ) { + val uid = remember { "checkbox[${UUID.generateUUID().toString(false)}]" } var innerValue by remember(value, descriptor) { mutableStateOf( value?.boolean ?: descriptor?.defaultValue?.boolean ) } + Input(type = InputType.Checkbox) { - classes("w-100") + classes("btn-check") checked(innerValue ?: false) + autoComplete(AutoComplete.off) + id(uid) onInput { event -> innerValue = event.value onValueChange(event.value.asValue()) } } + Label(uid, attrs = { classes("btn", "btn-sm", "btn-outline-secondary", "w-100") }) { + if (innerValue == true) { + Text("On") + } else { + Text("Off") + } + } } @Composable @@ -70,7 +79,7 @@ public fun NumberValueChooser( value: Value?, onValueChange: (Value?) -> Unit, ) { - var innerValue by remember(value, descriptor) { mutableStateOf(value?.number) } + var innerValue by remember(value, descriptor) { mutableStateOf(value?.number ?: descriptor?.defaultValue?.number) } Input(type = InputType.Number) { classes("w-100") @@ -159,6 +168,7 @@ public fun MultiSelectChooser( onValueChange: (Value?) -> Unit, ) { Select({ + classes("w-100","form-select") onChange { event -> val newSelected = event.target.selectedOptions.asList() .map { (it as HTMLOptionElement).value.asValue() } @@ -184,39 +194,18 @@ public fun RangeValueChooser( value: Value?, onValueChange: (Value?) -> Unit, ) { - var innerValue by remember(value, descriptor) { mutableStateOf(value?.double) } - var rangeDisabled: Boolean by remember { mutableStateOf(state != EditorPropertyState.Defined) } - - - FlexRow { - if (descriptor?.valueRestriction != ValueRestriction.REQUIRED) { - Input(type = InputType.Checkbox) { - if (!rangeDisabled) defaultChecked() - - onChange { - val checkBoxValue = it.target.checked - rangeDisabled = !checkBoxValue - onValueChange( - if (!checkBoxValue) { - null - } else { - innerValue?.asValue() - } - ) - } - } - } - } + var innerValue by remember(value, descriptor) { mutableStateOf(value?.number ?: descriptor?.defaultValue?.number) } Input(type = InputType.Range) { - classes("w-100") + classes("w-100", "form-range") - if (rangeDisabled) disabled() value(innerValue?.toString() ?: "") - onChange { - val newValue = it.target.value - onValueChange(newValue.toDoubleOrNull()?.asValue()) - innerValue = newValue.toDoubleOrNull() + onInput { event -> + innerValue = event.value + } + onChange { event -> + innerValue = event.value + onValueChange(innerValue?.asValue()) } descriptor?.attributes?.get("min").string?.let { min(it) diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/specifications/Canvas3DOptions.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/specifications/Canvas3DOptions.kt index 11f179ce..8a081d63 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/specifications/Canvas3DOptions.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/specifications/Canvas3DOptions.kt @@ -59,6 +59,8 @@ public class CanvasSize : Scheme() { } public class Canvas3DOptions : Scheme() { + public var canvasName: String by string("vision") + @Suppress("DEPRECATION") public var axes: AxesScheme by spec(AxesScheme) public var camera: CameraScheme by spec(CameraScheme) diff --git a/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/compose/ThreeControls.kt b/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/compose/ThreeControls.kt index e37cfd6b..2e03ec6a 100644 --- a/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/compose/ThreeControls.kt +++ b/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/compose/ThreeControls.kt @@ -1,12 +1,12 @@ package space.kscience.visionforge.solid.three.compose import androidx.compose.runtime.Composable +import app.softwork.bootstrapcompose.Button +import app.softwork.bootstrapcompose.Color.Info import app.softwork.bootstrapcompose.Column import app.softwork.bootstrapcompose.Layout.Height -import app.softwork.bootstrapcompose.Row -import org.jetbrains.compose.web.css.* -import org.jetbrains.compose.web.dom.Button -import org.jetbrains.compose.web.dom.Text +import app.softwork.bootstrapcompose.Layout.Width +import org.jetbrains.compose.web.dom.Hr import org.w3c.files.Blob import org.w3c.files.BlobPropertyBag import space.kscience.dataforge.context.Global @@ -22,32 +22,16 @@ internal fun CanvasControls( options: Canvas3DOptions, ) { Column { - Row(attrs = { - style { - border { - width(1.px) - style(LineStyle.Solid) - color(Color("blue")) - } - padding(4.px) - } - }) { - vision?.let { vision -> - Button({ - onClick { event -> - val json = vision.encodeToString() - event.stopPropagation(); - event.preventDefault(); + vision?.let { vision -> + Button("Export", color = Info, styling = { Layout.width = Width.Full }) { + val json = vision.encodeToString() - val fileSaver = kotlinext.js.require("file-saver") - val blob = Blob(arrayOf(json), BlobPropertyBag("text/json;charset=utf-8")) - fileSaver.saveAs(blob, "object.json") as Unit - } - }) { - Text("Export") - } + val fileSaver = kotlinext.js.require("file-saver") + val blob = Blob(arrayOf(json), BlobPropertyBag("text/json;charset=utf-8")) + fileSaver.saveAs(blob, "${options.canvasName}.json") as Unit } } + Hr() PropertyEditor( scope = vision?.manager?.context ?: Global, properties = options.meta, diff --git a/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/compose/ThreeView.kt b/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/compose/ThreeView.kt index f2e890b1..1c69ddb9 100644 --- a/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/compose/ThreeView.kt +++ b/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/compose/ThreeView.kt @@ -7,7 +7,6 @@ import app.softwork.bootstrapcompose.Layout.Height import app.softwork.bootstrapcompose.Layout.Width import app.softwork.bootstrapcompose.Row import kotlinx.dom.clear -import org.jetbrains.compose.web.ExperimentalComposeWebApi import org.jetbrains.compose.web.css.* import org.jetbrains.compose.web.dom.* import space.kscience.dataforge.context.Context @@ -104,32 +103,13 @@ public fun ThreeView( } ) { if (solid == null) { - Div({ - style { - position(Position.Fixed) - width(100.percent) - height(100.percent) - zIndex(1000) - top(40.percent) - left(0.px) - opacity(0.5) - - @OptIn(ExperimentalComposeWebApi::class) filter { - opacity(50.percent) - } - } - }) { - Div({ classes("d-flex", " justify-content-center") }) { - Div({ - classes("spinner-grow", "text-primary") - style { - width(3.cssRem) - height(3.cssRem) - zIndex(20) - } - attr("role", "status") - }) { - Span({ classes("sr-only") }) { Text("Loading 3D vision") } + Div({ classes("d-flex", "justify-content-center") }) { + Div({ + classes("spinner-border") + attr("role", "status") + }) { + Span({ classes("visually-hidden") }) { + Text("Loading...") } } } @@ -144,33 +124,17 @@ public fun ThreeView( else -> (solid as? SolidGroup)?.get(it) } }?.let { vision -> - Card( - attrs = { - style { - position(Position.Absolute) - top(5.px) - right(5.px) - width(450.px) - overflowY("auto") - } - }, - headerAttrs = { - style { - alignItems(AlignItems.Center) - } - }, - header = { - NameCrumbs(selected) { selected = it } - }, - footer = { - vision.styles.takeIf { it.isNotEmpty() }?.let { styles -> - P { - B { Text("Styles: ") } - Text(styles.joinToString(separator = ", ")) - } - } + Card(attrs = { + style { + position(Position.Absolute) + top(10.px) + right(10.px) + width(450.px) + overflowY("auto") } - ) { + }) { + NameCrumbs(selected) { selected = it } + Hr() PropertyEditor( scope = solids.context, rootMeta = vision.properties.root(), @@ -187,6 +151,13 @@ public fun ThreeView( updates = vision.properties.changes, rootDescriptor = vision.descriptor ) + vision.styles.takeIf { it.isNotEmpty() }?.let { styles -> + Hr() + P { + B { Text("Styles: ") } + Text(styles.joinToString(separator = ", ")) + } + } } } } @@ -207,7 +178,13 @@ public fun ThreeView( } } ) { - ThreeControls(solid, optionsSnapshot, selected, onSelect = { selected = it }, tabBuilder = sidebarTabs) + ThreeControls( + solid, + optionsSnapshot, + selected, + onSelect = { selected = it }, + tabBuilder = sidebarTabs + ) } } } else { From da0f4c0ff04a516221d518aeb44842043ea31902 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Sun, 31 Dec 2023 18:09:36 +0300 Subject: [PATCH 25/41] Optimize UI --- demo/gdml/build.gradle.kts | 21 ++++++++++---- .../visionforge/gdml/demo/FileDrop.kt | 5 ++-- .../visionforge/gdml/demo/GDMLAppComponent.kt | 4 +-- .../src/jsMain/kotlin/JsPlaygroundApp.kt | 3 +- .../kotlin/ru/mipt/npm/sat/satServer.kt | 9 +++++- .../visionforge/solid/demo/VariableBox.kt | 2 +- .../compose/ComposeVisionRenderer.kt | 28 +++++++++++++++++++ .../visionforge/compose/PropertyEditor.kt | 6 ++-- .../space/kscience/visionforge/Vision.kt | 4 +-- .../visionforge/html/VisionTagConsumer.kt | 16 ++++++----- .../space/kscience/visionforge/useProperty.kt | 6 ++-- .../solid/three/ThreeCompositeFactory.kt | 2 +- .../visionforge/solid/three/ThreePlugin.kt | 17 +++++------ .../build.gradle.kts | 22 +++++++++++---- 14 files changed, 101 insertions(+), 44 deletions(-) create mode 100644 visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/ComposeVisionRenderer.kt diff --git a/demo/gdml/build.gradle.kts b/demo/gdml/build.gradle.kts index f715262b..03093d23 100644 --- a/demo/gdml/build.gradle.kts +++ b/demo/gdml/build.gradle.kts @@ -1,27 +1,36 @@ plugins { id("space.kscience.gradle.mpp") + alias(spclibs.plugins.compose) } group = "demo" kscience { - jvm() +// jvm() js { browser { binaries.executable() + commonWebpackConfig{ + cssSupport{ + enabled = true + } + scssSupport{ + enabled = true + } + sourceMaps = true + } } } dependencies { implementation(projects.visionforgeSolid) implementation(projects.visionforgeGdml) } - jvmMain { -// implementation(project(":visionforge-fx")) - implementation(spclibs.logback.classic) - } +// jvmMain { +//// implementation(project(":visionforge-fx")) +// implementation(spclibs.logback.classic) +// } jsMain { implementation(projects.visionforgeThreejs) - implementation(npm("react-file-drop", "3.0.6")) } } diff --git a/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/FileDrop.kt b/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/FileDrop.kt index d26ea42d..3fdedb64 100644 --- a/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/FileDrop.kt +++ b/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/FileDrop.kt @@ -3,12 +3,12 @@ package space.kscience.visionforge.gdml.demo import androidx.compose.runtime.* +import app.softwork.bootstrapcompose.Container import app.softwork.bootstrapcompose.Icon import org.jetbrains.compose.web.ExperimentalComposeWebApi import org.jetbrains.compose.web.attributes.InputType import org.jetbrains.compose.web.attributes.name import org.jetbrains.compose.web.css.* -import org.jetbrains.compose.web.dom.Div import org.jetbrains.compose.web.dom.Input import org.jetbrains.compose.web.dom.Text import org.w3c.files.FileList @@ -22,7 +22,7 @@ fun FileDrop( ) { var dragOver by remember { mutableStateOf(false) } - Div({ + Container(attrs = { id("dropzone") style { border( @@ -69,7 +69,6 @@ fun FileDrop( } } }) { - Icon("cloud-upload"){ classes("dropzone-icon") } Text(title) Input(type = InputType.File, attrs = { diff --git a/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GDMLAppComponent.kt b/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GDMLAppComponent.kt index 65a702e4..c3016145 100644 --- a/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GDMLAppComponent.kt +++ b/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GDMLAppComponent.kt @@ -4,7 +4,7 @@ import androidx.compose.runtime.* import kotlinx.browser.window import org.jetbrains.compose.web.css.* import org.jetbrains.compose.web.dom.Div -import org.jetbrains.compose.web.dom.H2 +import org.jetbrains.compose.web.dom.P import org.jetbrains.compose.web.dom.Text import org.w3c.files.File import org.w3c.files.FileReader @@ -66,7 +66,7 @@ fun GDMLApp(solids: Solids, initialVision: Solid?, selected: Name? = null) { }) { ThreeView(solids, vision, selected) { Tab("Load") { - H2 { + P { Text("Drag and drop .gdml or .json VisionForge files here") } FileDrop("(drag file here)") { files -> diff --git a/demo/js-playground/src/jsMain/kotlin/JsPlaygroundApp.kt b/demo/js-playground/src/jsMain/kotlin/JsPlaygroundApp.kt index a612ab3e..3e53e866 100644 --- a/demo/js-playground/src/jsMain/kotlin/JsPlaygroundApp.kt +++ b/demo/js-playground/src/jsMain/kotlin/JsPlaygroundApp.kt @@ -47,8 +47,7 @@ private class JsPlaygroundApp : Application { width(100.vw) } }) { - Tabs { - active = "gravity" + Tabs("gravity") { Tab("gravity") { GravityDemo(solids, client) } diff --git a/demo/sat-demo/src/jvmMain/kotlin/ru/mipt/npm/sat/satServer.kt b/demo/sat-demo/src/jvmMain/kotlin/ru/mipt/npm/sat/satServer.kt index 9f2f7e59..af4fbca4 100644 --- a/demo/sat-demo/src/jvmMain/kotlin/ru/mipt/npm/sat/satServer.kt +++ b/demo/sat-demo/src/jvmMain/kotlin/ru/mipt/npm/sat/satServer.kt @@ -14,10 +14,12 @@ import space.kscience.dataforge.meta.Null import space.kscience.dataforge.names.Name import space.kscience.visionforge.Colors import space.kscience.visionforge.html.VisionPage +import space.kscience.visionforge.html.meta import space.kscience.visionforge.server.close import space.kscience.visionforge.server.openInBrowser import space.kscience.visionforge.server.visionPage import space.kscience.visionforge.solid.* +import space.kscience.visionforge.solid.specifications.Canvas3DOptions import space.kscience.visionforge.three.threeJsHeader import kotlin.random.Random @@ -47,7 +49,12 @@ fun main() { ) { div("flex-column") { h1 { +"Satellite detector demo" } - vision { sat } + vision { + meta(Canvas3DOptions { + controls.enabled = false + }) + sat + } } } diff --git a/demo/solid-showcase/src/jsMain/kotlin/space/kscience/visionforge/solid/demo/VariableBox.kt b/demo/solid-showcase/src/jsMain/kotlin/space/kscience/visionforge/solid/demo/VariableBox.kt index 701df81b..5787b6b3 100644 --- a/demo/solid-showcase/src/jsMain/kotlin/space/kscience/visionforge/solid/demo/VariableBox.kt +++ b/demo/solid-showcase/src/jsMain/kotlin/space/kscience/visionforge/solid/demo/VariableBox.kt @@ -46,7 +46,7 @@ internal class VariableBox(val xSize: Number, val ySize: Number) : ThreeJsVision mesh.scale.z = properties.getValue(VALUE)?.number?.toDouble() ?: 1.0 //add listener to object properties - onPropertyChange { name -> + onPropertyChange(three.context) { name -> when { name == VALUE -> { val value = properties.getValue(VALUE)?.int ?: 0 diff --git a/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/ComposeVisionRenderer.kt b/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/ComposeVisionRenderer.kt new file mode 100644 index 00000000..15eb93c1 --- /dev/null +++ b/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/ComposeVisionRenderer.kt @@ -0,0 +1,28 @@ +package space.kscience.visionforge.compose + +import androidx.compose.runtime.Composable +import org.jetbrains.compose.web.css.Style +import org.jetbrains.compose.web.dom.DOMScope +import org.jetbrains.compose.web.renderComposable +import org.w3c.dom.Element +import space.kscience.dataforge.meta.Meta +import space.kscience.dataforge.names.Name +import space.kscience.visionforge.ElementVisionRenderer +import space.kscience.visionforge.Vision +import space.kscience.visionforge.VisionClient + +/** + * An [ElementVisionRenderer] that could be used directly in Compose-html as well as a stand-alone renderer + */ +public interface ComposeVisionRenderer: ElementVisionRenderer { + + @Composable + public fun DOMScope.render(client: VisionClient, name: Name, vision: Vision, meta: Meta) + + override fun render(element: Element, client: VisionClient, name: Name, vision: Vision, meta: Meta) { + renderComposable(element) { + Style(VisionForgeStyles) + render(client, name, vision, meta) + } + } +} \ No newline at end of file diff --git a/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/PropertyEditor.kt b/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/PropertyEditor.kt index cff16298..81d0b944 100644 --- a/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/PropertyEditor.kt +++ b/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/PropertyEditor.kt @@ -28,9 +28,9 @@ import space.kscience.visionforge.hidden * The display state of a property */ public sealed class EditorPropertyState { - public object Defined : EditorPropertyState() - public class Default(public val source: String = "unknown") : EditorPropertyState() - public object Undefined : EditorPropertyState() + public data object Defined : EditorPropertyState() + public data class Default(public val source: String = "unknown") : EditorPropertyState() + public data object Undefined : EditorPropertyState() } diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/Vision.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/Vision.kt index ece71edd..886a1574 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/Vision.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/Vision.kt @@ -79,8 +79,8 @@ public var Vision.visible: Boolean? * Subscribe on property updates. The subscription is bound to the given scope and canceled when the scope is canceled */ public fun Vision.onPropertyChange( - scope: CoroutineScope? = manager?.context, + scope: CoroutineScope, callback: suspend (Name) -> Unit, ): Job = properties.changes.onEach { callback(it) -}.launchIn(scope ?: error("Orphan Vision can't observe properties")) \ No newline at end of file +}.launchIn(scope) \ No newline at end of file diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionTagConsumer.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionTagConsumer.kt index 99a8ea0d..19cfc80a 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionTagConsumer.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionTagConsumer.kt @@ -4,10 +4,7 @@ import kotlinx.html.* import space.kscience.dataforge.context.Context import space.kscience.dataforge.context.ContextAware import space.kscience.dataforge.context.PluginFactory -import space.kscience.dataforge.meta.Meta -import space.kscience.dataforge.meta.MetaSerializer -import space.kscience.dataforge.meta.MutableMeta -import space.kscience.dataforge.meta.isEmpty +import space.kscience.dataforge.meta.* import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.NameToken import space.kscience.dataforge.names.asName @@ -46,9 +43,14 @@ public class VisionOutput @PublishedApi internal constructor(override val contex newContext.visionManager } - public inline fun meta(block: MutableMeta.() -> Unit) { - this.meta = Meta(block) - } +} + +public inline fun VisionOutput.meta(block: MutableMeta.() -> Unit) { + this.meta = Meta(block) +} + +public fun VisionOutput.meta(metaRepr: MetaRepr) { + this.meta = metaRepr.toMeta() } /** diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/useProperty.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/useProperty.kt index 8ffb272a..c396714b 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/useProperty.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/useProperty.kt @@ -19,7 +19,7 @@ public fun Vision.useProperty( propertyName: Name, inherit: Boolean? = null, includeStyles: Boolean? = null, - scope: CoroutineScope? = manager?.context, + scope: CoroutineScope = manager?.context ?: error("Orphan Vision can't observe properties"), callback: (Meta) -> Unit, ): Job { //Pass initial value. @@ -28,14 +28,14 @@ public fun Vision.useProperty( if (name.startsWith(propertyName)) { callback(properties.get(propertyName, inherit, includeStyles)) } - }.launchIn(scope ?: error("Orphan Vision can't observe properties")) + }.launchIn(scope) } public fun Vision.useProperty( propertyName: String, inherit: Boolean? = null, includeStyles: Boolean? = null, - scope: CoroutineScope? = manager?.context, + scope: CoroutineScope = manager?.context ?: error("Orphan Vision can't observe properties"), callback: (Meta) -> Unit, ): Job = useProperty(propertyName.parseAsName(), inherit, includeStyles, scope, callback) diff --git a/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/ThreeCompositeFactory.kt b/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/ThreeCompositeFactory.kt index e6e9641c..1117ba37 100644 --- a/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/ThreeCompositeFactory.kt +++ b/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/ThreeCompositeFactory.kt @@ -52,7 +52,7 @@ public class ThreeCompositeFactory(public val three: ThreePlugin) : ThreeFactory applyProperties(vision) if (observe) { - vision.onPropertyChange { name -> + vision.onPropertyChange(three.context) { name -> when { //name.startsWith(WIREFRAME_KEY) -> mesh.applyWireFrame(obj) name.startsWith(EDGES_KEY) -> applyEdges(vision) diff --git a/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/ThreePlugin.kt b/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/ThreePlugin.kt index e3a0f20b..026c9b18 100644 --- a/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/ThreePlugin.kt +++ b/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/ThreePlugin.kt @@ -1,14 +1,16 @@ package space.kscience.visionforge.solid.three +import androidx.compose.runtime.Composable import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach -import org.jetbrains.compose.web.renderComposable +import org.jetbrains.compose.web.dom.DOMScope import org.w3c.dom.Element import org.w3c.dom.HTMLElement import space.kscience.dataforge.context.* import space.kscience.dataforge.meta.Meta import space.kscience.dataforge.names.* import space.kscience.visionforge.* +import space.kscience.visionforge.compose.ComposeVisionRenderer import space.kscience.visionforge.solid.* import space.kscience.visionforge.solid.specifications.Canvas3DOptions import space.kscience.visionforge.solid.three.compose.ThreeView @@ -21,7 +23,7 @@ import three.objects.Group as ThreeGroup /** * A plugin that handles Three Object3D representation of Visions. */ -public class ThreePlugin : AbstractPlugin(), ElementVisionRenderer { +public class ThreePlugin : AbstractPlugin(), ComposeVisionRenderer { override val tag: PluginTag get() = Companion.tag public val solids: Solids by require(Solids) @@ -75,7 +77,7 @@ public class ThreePlugin : AbstractPlugin(), ElementVisionRenderer { // disable tracking changes for statics group[token] = object3D } catch (ex: Throwable) { - logger.error(ex) { "Failed to render $child" } + logger.error(ex) { "Failed to render vision with token $token and type ${child::class}" } } } } @@ -115,7 +117,7 @@ public class ThreePlugin : AbstractPlugin(), ElementVisionRenderer { val object3D = buildObject3D(child) set(childName, object3D) } catch (ex: Throwable) { - logger.error(ex) { "Failed to render $child" } + logger.error(ex) { "Failed to render vision with name $childName" } } } }.launchIn(context) @@ -185,11 +187,10 @@ public class ThreePlugin : AbstractPlugin(), ElementVisionRenderer { render(vision) } - override fun render(element: Element, client: VisionClient, name: Name, vision: Vision, meta: Meta) { + @Composable + override fun DOMScope.render(client: VisionClient, name: Name, vision: Vision, meta: Meta) { require(vision is Solid) { "Expected Solid but found ${vision::class}" } - renderComposable(element) { - ThreeView(solids, vision, null, Canvas3DOptions.read(meta)) - } + ThreeView(solids, vision, null, Canvas3DOptions.read(meta)) } public companion object : PluginFactory { diff --git a/visionforge-threejs/visionforge-threejs-server/build.gradle.kts b/visionforge-threejs/visionforge-threejs-server/build.gradle.kts index f6c30385..df821866 100644 --- a/visionforge-threejs/visionforge-threejs-server/build.gradle.kts +++ b/visionforge-threejs/visionforge-threejs-server/build.gradle.kts @@ -6,21 +6,33 @@ plugins { val ktorVersion: String by rootProject.extra kscience { - fullStack("js/visionforge-three.js") + fullStack( + bundleName = "js/visionforge-three.js", + browserConfig = { + webpackTask { + cssSupport { + enabled = true + } + scssSupport { + enabled = true + } + } + } + ) commonMain { api(projects.visionforgeSolid) api(projects.visionforgeComposeHtml) } - jvmMain{ + jvmMain { api(projects.visionforgeServer) } - jsMain{ + jsMain { api(projects.visionforgeThreejs) - implementation(npm("file-saver","2.0.5")) + implementation(npm("file-saver", "2.0.5")) implementation(npm("@types/file-saver", "2.0.7")) - compileOnly(npm("webpack-bundle-analyzer","4.5.0")) + compileOnly(npm("webpack-bundle-analyzer", "4.5.0")) } } \ No newline at end of file From 15ac3545b56a0cc06f3b68965a07fdf643b1767b Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Sun, 31 Dec 2023 20:12:40 +0300 Subject: [PATCH 26/41] Fix clipping controls for ThreeCanvas --- .../space/kscience/visionforge/compose/PropertyEditor.kt | 4 ++-- .../kscience/visionforge/solid/three/ThreeCanvas.kt | 9 ++++----- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/PropertyEditor.kt b/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/PropertyEditor.kt index 81d0b944..68899508 100644 --- a/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/PropertyEditor.kt +++ b/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/PropertyEditor.kt @@ -116,7 +116,7 @@ public fun PropertyEditor( } } - CloseButton(editorPropertyState != EditorPropertyState.Defined){ + CloseButton(editorPropertyState != EditorPropertyState.Defined) { rootMeta.remove(name) update() } @@ -163,7 +163,7 @@ public fun PropertyEditor( } } - awaitClose { properties.removeListener(scope) } + awaitClose { properties.removeListener(scope) } }, name = Name.EMPTY, rootDescriptor = descriptor, diff --git a/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/ThreeCanvas.kt b/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/ThreeCanvas.kt index 5723626a..dac32e08 100644 --- a/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/ThreeCanvas.kt +++ b/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/ThreeCanvas.kt @@ -155,9 +155,10 @@ public class ThreeCanvas( } //Clipping planes - options.useProperty(Canvas3DOptions::clipping) { clipping -> - if (!clipping.meta.isEmpty()) { - renderer.localClippingEnabled = true + options.useProperty(Canvas3DOptions::clipping) { clipping: PointScheme -> + if (clipping.meta.isEmpty()) { + renderer.clippingPlanes = emptyArray() + } else { boundingBox?.let { boundingBox -> val xClippingPlane = clipping.x?.let { val absoluteValue = boundingBox.min.x + (boundingBox.max.x - boundingBox.min.x) * it @@ -175,8 +176,6 @@ public class ThreeCanvas( renderer.clippingPlanes = listOfNotNull(xClippingPlane, yClippingPlane, zClippingPlane).toTypedArray() } - } else { - renderer.localClippingEnabled = false } } From 30f6d5174501b5eb4f8c3f993ff030b7fa845f8a Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Mon, 1 Jan 2024 14:07:08 +0300 Subject: [PATCH 27/41] Property editor minor refactoring --- .../compose/ComposeVisionRenderer.kt | 2 ++ .../visionforge/compose/PropertyEditor.kt | 17 ++++++---- .../kscience/visionforge/VisionProperties.kt | 34 +++---------------- 3 files changed, 17 insertions(+), 36 deletions(-) diff --git a/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/ComposeVisionRenderer.kt b/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/ComposeVisionRenderer.kt index 15eb93c1..32d9d129 100644 --- a/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/ComposeVisionRenderer.kt +++ b/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/ComposeVisionRenderer.kt @@ -25,4 +25,6 @@ public interface ComposeVisionRenderer: ElementVisionRenderer { render(client, name, vision, meta) } } + + public companion object } \ No newline at end of file diff --git a/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/PropertyEditor.kt b/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/PropertyEditor.kt index 68899508..82277701 100644 --- a/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/PropertyEditor.kt +++ b/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/PropertyEditor.kt @@ -49,8 +49,8 @@ public fun PropertyEditor( initialExpanded: Boolean? = null, ) { var expanded: Boolean by remember { mutableStateOf(initialExpanded ?: true) } - val descriptor: MetaDescriptor? = remember(rootDescriptor, name) { rootDescriptor?.get(name) } - var property: MutableMeta by remember { mutableStateOf(rootMeta.getOrCreate(name)) } + val descriptor: MetaDescriptor? by derivedStateOf { rootDescriptor?.get(name) } + var displayedValue by remember { mutableStateOf(rootMeta.getValue(name)) } var editorPropertyState: EditorPropertyState by remember { mutableStateOf(getPropertyState(name)) } @@ -68,13 +68,13 @@ public fun PropertyEditor( val token = name.lastOrNull()?.toString() ?: "Properties" fun update() { - property = rootMeta.getOrCreate(name) + displayedValue = rootMeta.getValue(name) editorPropertyState = getPropertyState(name) } LaunchedEffect(rootMeta) { updates.collect { updatedName -> - if (updatedName == name) { + if (name.startsWith(updatedName)) { update() } } @@ -85,6 +85,7 @@ public fun PropertyEditor( alignItems(AlignItems.Center) } }) { + //if node has children if (keys.isNotEmpty()) { Span({ classes(TreeStyles.treeCaret) @@ -110,12 +111,14 @@ public fun PropertyEditor( marginAll(1.px, 5.px) } }) { - ValueChooser(descriptor, editorPropertyState, property.value) { - property.value = it - editorPropertyState = getPropertyState(name) + ValueChooser(descriptor, editorPropertyState, displayedValue) { + rootMeta.setValue(name, it) + update() } } + } + if (!name.isEmpty()) { CloseButton(editorPropertyState != EditorPropertyState.Defined) { rootMeta.remove(name) update() diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionProperties.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionProperties.kt index b7a66625..d607f706 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionProperties.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionProperties.kt @@ -1,11 +1,9 @@ package space.kscience.visionforge -import kotlinx.coroutines.DelicateCoroutinesApi -import kotlinx.coroutines.GlobalScope +import kotlinx.coroutines.channels.BufferOverflow import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.SharedFlow -import kotlinx.coroutines.launch import kotlinx.serialization.Transient import space.kscience.dataforge.meta.* import space.kscience.dataforge.meta.descriptors.MetaDescriptor @@ -233,15 +231,12 @@ public abstract class AbstractVisionProperties( } @Transient - protected val changesInternal: MutableSharedFlow = MutableSharedFlow() + protected val changesInternal: MutableSharedFlow = MutableSharedFlow(500, onBufferOverflow = BufferOverflow.DROP_OLDEST) override val changes: SharedFlow get() = changesInternal override fun invalidate(propertyName: Name) { //send update signal - @OptIn(DelicateCoroutinesApi::class) - (vision.manager?.context ?: GlobalScope).launch { - changesInternal.emit(propertyName) - } + changesInternal.tryEmit(propertyName) //notify children if there are any if (vision is VisionGroup) { @@ -280,8 +275,8 @@ public operator fun VisionProperties.get( /** * The root property node with given inheritance and style flags - * @param inherit - inherit properties from the [Vision] parent. If null, infer from descriptor - * @param includeStyles - include style information. If null, infer from descriptor + * @param inherit inherit properties from the [Vision] parent. If null, infer from descriptor + * @param includeStyles include style information. If null, infer from descriptor */ public fun MutableVisionProperties.root( inherit: Boolean? = null, @@ -297,22 +292,3 @@ public operator fun MutableVisionProperties.get( inherit: Boolean? = null, includeStyles: Boolean? = null, ): MutableMeta = get(name.parseAsName(), inherit, includeStyles) - -// -//public operator fun MutableVisionProperties.set(name: Name, value: Number): Unit = -// setValue(name, value.asValue()) -// -//public operator fun MutableVisionProperties.set(name: String, value: Number): Unit = -// set(name.parseAsName(), value) -// -//public operator fun MutableVisionProperties.set(name: Name, value: Boolean): Unit = -// setValue(name, value.asValue()) -// -//public operator fun MutableVisionProperties.set(name: String, value: Boolean): Unit = -// set(name.parseAsName(), value) -// -//public operator fun MutableVisionProperties.set(name: Name, value: String): Unit = -// setValue(name, value.asValue()) -// -//public operator fun MutableVisionProperties.set(name: String, value: String): Unit = -// set(name.parseAsName(), value) \ No newline at end of file From 067ed4aa3d5a4d8287d5a779b414bfe048289cdf Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Mon, 1 Jan 2024 14:37:22 +0300 Subject: [PATCH 28/41] Property editor minor refactoring --- .../kscience/visionforge/compose/PropertyEditor.kt | 13 ++++++++----- .../visionforge/solid/three/compose/ThreeView.kt | 1 + 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/PropertyEditor.kt b/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/PropertyEditor.kt index 82277701..89bae724 100644 --- a/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/PropertyEditor.kt +++ b/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/PropertyEditor.kt @@ -31,7 +31,6 @@ public sealed class EditorPropertyState { public data object Defined : EditorPropertyState() public data class Default(public val source: String = "unknown") : EditorPropertyState() public data object Undefined : EditorPropertyState() - } /** @@ -44,8 +43,8 @@ public fun PropertyEditor( rootMeta: MutableMeta, getPropertyState: (Name) -> EditorPropertyState, updates: Flow, - name: Name = Name.EMPTY, - rootDescriptor: MetaDescriptor? = null, + name: Name, + rootDescriptor: MetaDescriptor?, initialExpanded: Boolean? = null, ) { var expanded: Boolean by remember { mutableStateOf(initialExpanded ?: true) } @@ -97,8 +96,12 @@ public fun PropertyEditor( } Span({ classes(TreeStyles.treeLabel) - if (editorPropertyState != EditorPropertyState.Defined) { - classes(TreeStyles.treeLabelInactive) + when (editorPropertyState) { + is EditorPropertyState.Default, EditorPropertyState.Undefined -> { + classes(TreeStyles.treeLabelInactive) + } + + EditorPropertyState.Defined -> {} } }) { Text(token) diff --git a/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/compose/ThreeView.kt b/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/compose/ThreeView.kt index 1c69ddb9..21a61ebd 100644 --- a/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/compose/ThreeView.kt +++ b/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/compose/ThreeView.kt @@ -148,6 +148,7 @@ public fun ThreeView( EditorPropertyState.Undefined } }, + name = Name.EMPTY, updates = vision.properties.changes, rootDescriptor = vision.descriptor ) From 58d7bd93838aeaa957450562b62590690c4931bc Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Mon, 1 Jan 2024 15:54:29 +0300 Subject: [PATCH 29/41] Adjust materials for 3D --- demo/solid-showcase/build.gradle.kts | 10 +++++++ .../kscience/visionforge/solid/demo/demo.kt | 26 ++++++++++++++---- .../jsMain/resources/Menger_sponge_sample.stl | Bin 0 -> 105684 bytes .../space/kscience/visionforge/solid/Solid.kt | 6 +++- .../visionforge/solid/SolidMaterial.kt | 6 ++-- .../visionforge/solid/three/ThreeMaterials.kt | 19 +++++++++---- .../visionforge/solid/three/ThreePlugin.kt | 9 +++--- .../solid/three/ThreeStlFactory.kt | 5 +++- 8 files changed, 62 insertions(+), 19 deletions(-) create mode 100644 demo/solid-showcase/src/jsMain/resources/Menger_sponge_sample.stl diff --git a/demo/solid-showcase/build.gradle.kts b/demo/solid-showcase/build.gradle.kts index 05a02260..f4a9820d 100644 --- a/demo/solid-showcase/build.gradle.kts +++ b/demo/solid-showcase/build.gradle.kts @@ -8,6 +8,16 @@ kscience { jvm() js{ binaries.executable() + browser{ + commonWebpackConfig{ + cssSupport{ + enabled = true + } + scssSupport{ + enabled = true + } + } + } } dependencies { implementation(projects.visionforgeSolid) diff --git a/demo/solid-showcase/src/commonMain/kotlin/space/kscience/visionforge/solid/demo/demo.kt b/demo/solid-showcase/src/commonMain/kotlin/space/kscience/visionforge/solid/demo/demo.kt index 9e2ecedb..698cc846 100644 --- a/demo/solid-showcase/src/commonMain/kotlin/space/kscience/visionforge/solid/demo/demo.kt +++ b/demo/solid-showcase/src/commonMain/kotlin/space/kscience/visionforge/solid/demo/demo.kt @@ -24,6 +24,11 @@ fun VisionLayout.demo(name: String, title: String = name, block: SolidGro block() ambientLight { color(Colors.white) + intensity = 0.5 + } + pointLight(0, 0, 1000) { + color(Colors.white) + intensity = 10.0 } } render(Name.parse(name), vision, meta) @@ -111,7 +116,7 @@ fun VisionLayout.showcase() { GlobalScope.launch(Dispatchers.Main) { while (isActive) { delay(100) - rotate((PI/20).radians,Euclidean3DSpace.yAxis) + rotate((PI / 20).radians, Euclidean3DSpace.yAxis) } } color(Colors.red) @@ -122,13 +127,16 @@ fun VisionLayout.showcase() { demo("extrude", "extruded shape") { extruded { shape { - polygon(8, 50) + polygon(32, 50) } for (i in 0..100) { layer(i * 5, 20 * sin(2 * PI / 100 * i), 20 * cos(2 * PI / 100 * i)) } - color(Colors.teal) - rotationX = -PI / 2 + rotationY = -PI / 2 + material { + type = "lambert" + color(Colors.teal) + } } } @@ -161,7 +169,15 @@ fun VisionLayout.showcase() { } demo("STL", "STL loaded from URL") { - stl("https://ozeki.hu/attachments/116/Menger_sponge_sample.stl") + stl("Menger_sponge_sample.stl") { + scale(100f) + material { + type = "phong" + color("red") + specularColor("blue") + } + } + //stl("https://ozeki.hu/attachments/116/Menger_sponge_sample.stl") } } diff --git a/demo/solid-showcase/src/jsMain/resources/Menger_sponge_sample.stl b/demo/solid-showcase/src/jsMain/resources/Menger_sponge_sample.stl new file mode 100644 index 0000000000000000000000000000000000000000..dfebb0a31ff36a722647c049566499b50a3f1869 GIT binary patch literal 105684 zcmb8YO^$8LvZZy3lxP8kSA+s7M1h~e*^xp**$c_KC)j{Yd;X z^Ur;_`-+>HA+7MSrj234%-rXU6|v8K?|=Ni{`Y_NPyfe1{>y*(pa1D!{jdMJ?g)5!THALjkS!wl^=JPw6b$+|O`y?eP?s#!N~O)Jhwv-BX=8K+`a z)>o|^M&egtzK)!8Q;mZaiU0Qf|NfhQ^Osd5?pfW6oh!R--0IoKn8hD|SdF!lO^=OJ z(S9c@)jwDD$*bAj^V#{1IREZ}ES+goa-0$sM8Ps$>Ecuvaiuq~nY!=Y{lD+t$PTzq zGOxK=d42TwQsHVJD!9I@>ieW~b!49_GpNYgn&m#@k+>`CI`wJ~YbIx6&(%3y7`$Y| zvZ~JtqRC2i`&my;@n-39Dsn$Ma_%+PRGhQoDmn4AI#T{1y$To|$x0fx+G<#3S~n{db;pgH&$$I8i{v8T3SXq@t&0gjLM0 zkpcC)gBcO0y0f&)xgVYsREb{&S75o`IIF^GPZ5PGF>$b+x1z7SyN8#4D)y{W1x_}& z6?t}VmerU^kFJUw-Cf>6jXx{6YGl{l6EV}_@ufmGEU@0Jry?U@GPsIWoU_u4RUh%G zFkiA#4OYRrJCub|?0PD^%Br7OwTkY8t9bDetF(qwK|UkmRD)Hpo+l6w^8bB>m8kBV zXQs}rla;XYvIlW{dTvo=1dNBO?c4d!S;4YGl&X78MMlJ_?y9EZixrktI4iD+Uqwb# zo58gmdWwJik+q9it+21ns%kGYB4$Bp}z%XK7_d|8puTGY$8F&w-%2#1T)!mEPyFPQm603AQ z6<*CX)o)cji@$yU_y5oT_Zti&F}{ENk*_w*wOL|4J}bDoBiloD zdp9d5Q0{+nefE)f^mi*Jt2)2^MukH?u72^IFW4#q{|TPz4+BId2t0Uc0VyAnaD-~3t$2s*e z-MM?8Pa+CSFzpQp#d zo$2me1#CU6sugr>_ZbmWiE68o-zV?(P=V@HaOyKJ{cYBo;m@7_M!}AaybJUGoi0~9 zlBaKZ40V6m{mx58dWbtyD$Yo&^-~SM@4u<^yp9f+U*f9jRP0%R|5AF?-qbx%+skDn+oy6qh>jm=z~bC+i*g z>b@gyV$ZHUpj&xIuGPoFt?vBpNh^q0VPZWh_uWV39c)hf!iPuo!UU~MJQOuuu7kTK z-hrsZh!`K$;HCId0h3&?Zu}}_5rNGsaaM&xe+suM)%KyERkgyrvQjNp(Vg4jQ2Z$# zRn^|00G|pxjEGYWUW#K@9Nn% zjMTZBRo1x@p9=Gi+81k7vee+EIA(=n=B($H_*G;ida83Z=eABeUi%Z6mB12{Ej?Pn zRU`HUEB%UDJ%Gq*R6G>F!PEe*C-tE)B8ydZUn4gxzTYg>R4RtY*WN)Rvh?7(9?eE4 zi*CX6bm2OQr(&||wBLTHtD>WG6;z;y{e4!x~EAqDqSVqLG zs#)!T^>1IY%&P~h_*7&BeEX5<{0t{+c-0>8KJid|m@X_LsuQDr&y@;#(gRF|t)OGO z$%q&au$knt_9sar$x8L9$Oy_gtLn*2mHVg)RlY`5b=OWsPxnw5K?P1V*s8jF8RmtN z_*G;+)m#&!u0FnXBEoA#s@v(2_=94yeup}7pOT|<6|8!&>itgFNU&_?rxSxMquRdo-;dhz&xM^*Qe;m$kW|Ki%rP|w8k{xBko-30Rj zcNgAORx+ZMcQO}#6`4zQo)|Li$-kyRUTLI%{>B05Gqw1UNsu#ccsy@K4LRLr4xv9>I#8uhwY{gg?9;&M4-H(pE zJ++$5fZ_@vhbMK)+Ye@`)|nR#Scuc8_VxI zDDTH{v+CYjop>m_k8gc+??`(jZnfW0;ZD7<#Kgh8~rjuXPqzlHl$-U?V9=_w>` z^{v2TRI&0V{;a^mN>C?mHJ#Z#9jXw+0;2|3=ZC_GEIhzwGJDVKW~rvvja%b{GtyWO z6yU1rTPJgMZ~g|~drnoWk3+E|uU}57yw*&J*zM~V6^$CtN~m46SbldtuhvsWJl66f z8~9XEi4pPW>z8WqQj``JFLJ@U@vD$UM0H{^>A|}HzI%J9eia!3+Y{bmJr@=`u|j7xGh7OD$)ZxQ-e9ZR`$3eG!8%{nx%gDzVMLs2unN}w_uZkYN(Q5zcBsXt zA|raJ)?3Bd$6%KSEWB0k&huQ|tW<;bVC_ApURjCB^eSep6&cZ*8!WKu!{ewOH7xrO zp9*uyvM0TF=k$Pf=BYgw4|aLO0qe1+Yh>m>)FaE-b0>>d7TtoWGO-?=Uj-~8suQC= ztIFENdQk1FFmJN(Pz_!lg-{H3<$`tNS0Rgt>cnqVx)TwP`qvb|tEz8jMTf~sb$Y<> zzxAoGLe+y^ne=FdwaZGixR_NDNQK?PXI~ajWfw2~Z7Jd0An4oQkpMW6EbGsTRL|T%Fgy zAkR$Wufac@-5F`WX64+*m3z-iG5aVFdt$AsZbj{fEId?OmD5`H$Ker*->)L`5@ia_ zDqNY&-_@yLwG!5;o^#t8CeXQpb@bHN+f`jx68l_#oj22u=c@h{X0qzEi#;Xpe#AXd z9pNvfinv3R5kcb?xm@d*|&LJ|1;{c;D&q&TYHw{RmcdYgKDj zV^94$cW^L%!KPv`E6nqmxFfCZcxEztf41Ja$gSF*&g{H9Bd3Szx2iF#bxL44U2ykw zI(1bY$=VycALl7C7b-oh_OrsOWU;Ddby7Xyo28n{H*Sr4l9Amz@9ePh@q@Fm`JQN2eV=MY+M}N|X zMMQOCuIa&gvh?6O*h;s8)1DFX$x6Si7`f{6pq=UgTLtS@#B|rQHq~Mk=d6h8k(g_z zLKdr)Bu1@*bQJtdrD@KIIe8qW26os}&7D(+nA0XEa&QRj+WF!TVcVBHF)n-OrT#VXEO zk>6P{QPuBsGa^nkSdaeO3@kd7m6)ndMb3&ydSs@Iq)#=jbBCPQf(iqcYctH^sqYDS7F38)nF8U z_1{QjvQi1F6@q2=e_@jmb7uw>`*f*@Zr5{V_^l`0qo{~#PNLZ9KKDl{sDQk%Ca%*% zACICUvOMismEAA*!y^>G!LrM1xf8MWz?JDxd|64EW9Q@ zo<3ab`gM`TI&qzRF_}v7rDFC`&sQ<)#C66#Dk>t2{HnobFQt_n9-*iTPetancGih2 z)1g@VfznD?Re(=LMkYRbQgNQdarKvH2^>3E`(GVD(@j>Y!Mm#Xv~+l=_nL z;#BML_5m9|`j~6=0sh=avQiDUs(w<#q+S(cEsv=xycJ__zcK<&wYaJZr~X7S*k7EE z!Q#GK7|&M$t0S#W-0EEy6YjjQn51eatVe4&?PuilQ2kal^6;5$)t=a@_Sv;6yG5P2 z)lAi1sLJ_>VS%^ztuP`B57kyxy-c5;m3i??{3^~|?+&8=Jgcs>6^TD9tYk2w+s4^* z_d->4PQ(h+<5Y}2U%MtN)#A4g_hYE)w7Y}jI`_@zvpXZ*d9!kES=+3=6yi@i`1el< z9;&U1Uiez~$Ker*-><@ncI4?}_SgB#W9>oI&NI=ePn?Pm6RjtM-mUKX)paF3zruV% zS{_6B;UuzC9cgvqR{I^7>0Syk@rn5i*B+A9m)Q z>dD%f4u$Sn)iJA)Wp#jZPcd++3m0?L?^nCK&zzRTo~!ej$kjMk^DJd1v-6~;TNO+p zao&S!)~t@a`l*I}R^@)^$9{-EpG0!mE$YOr9{M$7YlkI<1>WAb!icO?w_o?&z1%F- z^s#X&&dA<_%=CFyU1{%4;-Rdb&*?I&j$|c`TisRl=MvqCfamV5{WulrE~Z=6VjX%< zrbj(-#w3}~f!lM=sydQ2dnrZY+>f4_9faGqcSo(FIHyS3OZCV*24Co zg6mts&%uo7p_-~van4FVJQ9yA)1!aR?!Sc-(JwLTUDbH^ovcwoO&0~2s=!;plOZFh zWo4$VuwGbV`%rOKm9rwEhiWtF(I3mjFPtiGr zg-1`9V$@r+GBUd@R%Wt~tBd`J`P4H}4-}~J2J3OoYOoi}OenyuplgtM zla*?)9(_llpk7&t@i-MD@0t}6)Uv>;509gEx`kzh;;pzNdT`xYfl=81{#zgU#*5$E z>Ujm`<#bPl5m{qhYVc8&o&UaBsoo0qBqOtPs`2brrs|`144^JLu> zb{GBq%w>hBtxAvP^GwVL7*+bI*q;DYj8*k|u8jWH^XgGlMD_4l=ZZ{Jbarm8*++TU z(~pXE7cpr(RD-+g{=T0KH)|@^X;;<1yPEeyAFK1FI8L0EQ2SI@PqJCpPUS?8o>u4I z>Z~NyiPuTI74@`K4NL4!y!#QSub$`5>PJO=vXGT(tFnu|A2%!2vRU_jps@D9?@xoZ zAJpr9fTucsMzzx!(IeE=Usbc7DC8Y4PF|fp)}dT};8($EPgbhIT@T-RQd7xfEDsgl zH(L?2%6o8OGog6zS|Nz1%F- zcU8OljEKpbnLhVn?SnaX>^x(yf=ZH=YCG>r8y1mWM zb9Y7`R;uN*b}sYsKJidhrmf&UH`lD9dIIa+cx&kAoao(?igUWK+~>hK@Q4jR@`g`U z(vf{C?P=}#sHVSgB`*pwEb#Uo`a@wvR;s~f@1KKqezQ`&6_Z`=o$KslsH$2NZ|CIf z>;2aQvD{NJu8zLAmM1*-sq3=)Vt(NC9?D&@ARCR zQgKGkKFnlpbi zS>yfcW8+keJmKD04-{bQIrrS!sU-2M=quK{PYm9w@#r3`4tMW!Sc!X9w_@jdd-6Un zpE==n_ukgSYW3KPGm^FMOkF*>Kqy9@nj-mbygP8;Wf4)GxNFcQBj8knM{j(dTRVuZ zSw_g0mX-EFyT^ zxUaQ_?VlYt}QQ6hu=kmVfRCbz3_pLv@~#R%Aq+ zYVh(H6Wu@6$kow)UWs2tM(`N(a~g%SDjfEHpiDJ*WGFREzxGZ|#$u(PY}WJnF?$*P z)hFfp9T$8mV2xKjW$;Nn-j}*_tCPh#Usb!ft4pVhfboDOW;J`?A1Wq;Jt+^W1?y3j zjT-x}wMJ0gm}|vePB&}hth`(Y+rge#MpVNRXI1T$3Tij6edqz3uimMlDtGhhp}M*K zeVx;)T@NbJ`>CoXNiJFVfvrl#**UDqsQDzutLwKm-C5_We8s5cwlWn&sgP^ar|_xB zhWdx7JW@@G`vRJJu zaaZNfCseYCfbmG&@y_2fuwGbVJy5?2^Cm0RU^_VX1BJ6n{3>J-fysOl_qEx_nDy=) zrRv15LKYD{5_kOE$J)hTgX^yXj~!`@ zhiWhm`^<-ezYy9-;?du&$Zl`HQPofnMePM>?pDnwFn@Ek+7F7EH(9?!T~(FOF)LOLh@!b?TsHQnlZdL6qq`xtrG z{*O#DS);=>T|HPEr{c`DCz_eypXX}Nq&^F+`(voShQ~OGcjr6Ovuak(ZFn5#N(GgG z-T&=9JPw5s6kt45w_kT&)%m1ZdG(;zja77Y8QHb#M}=?avy$3#@{URt{=DbYz4m$b zv~a8M&Q(x}9^mbLPuGYnDp74!-Fxrk>il4(dQWOj@Ho5K$51i#(G$$ATOMPIT>slT zSK!{k`&{ivtDBXXI=^RY=cRT%#H~)n8ELg1s^Nd^qjqhw5|93F#m<$rFFe#R_|BJA zjVb;PeC!RpQ!$t|cN7z+x~eKw?a9qjP30TI=Zfo&ELM5U>)T`Yvi75Dr(#dy#Ft{^ z8D8hfUcg?g~= ze^Df&+CEUf3iHYu`Kxo(VmGmsT^#B^KoTu6~@lf#JMEylY z;Qk~Ao3D(B=ejaAlO9qbYpnm_Plh^)C{hh3bLR)q`OI6pMo)Ck^@-~wo(dzdrh56I zE{|tc&S$FmuWOvu2ZdDytEQ_r9(;v1p{V(wpck&swNCr~?2{2OdjPh=?&8C&ie=uxuHEGQsmO>}57^-9 zy3Q>K)_B!Z20ZV(>KsgU=O-CiL{ukcXUpR_SLTAL$5fT~kJGJvrb5`NS@G~||IHG2 zSzxQRs;$U~eW=E-75PbD*2w=$b>gA;Fx}bhpQ>SrQNNw5un$<^p{g@R59hfuA`1`I zR<$~3zuo79m1^1L#c5k-)Y|RCYKwX7IaQ+M1s;lHZ+`52u~OYxx~_enXWkpX3M*ly z4=WT?VRzg*HY@#7L9W?D?I0ei#g+RzR7dC3?G(VRB5x{or2S^@$kcVV zhT2t#=Oq4)0!Fg%P;FJ6pU+uDQh^`useI$;;fi!0>DTJJ^O->A~T7_b=*RDKZgbHCN=Di+W6$%(c zz;msh#HYf%M8T;Rt2p~$K6)hX?$LNx$s(d(;-0iF}<(PEj2Yv5M&Pv-p;O;)N~)tYlwDDdl? z8*fFP-I;&&1Z%vO+CEtO?5fZMMfP_pGD6;&e|hl!P^?_|=rKJ%SG97<>YS|>cl|n% zcb<^)81KolFz;UlSLdtLiL;O1j}iTbL1cLGmxBZI-g;Ugi^zDDI&pebb(NPs=v=jP z>-?UpcIufJ!6Vh;zu)*Oi0F~n z>US?FI?w5$`c-5EoNDpPKW6mDAN|+A`gHj%9?b7qEg6cpPfA9_qmrct>%rQ0ROe|{ z;%46pD^V?LPGsb7#lEjlke8R337DxT@%7{4CT_sH2ZWhlE4pzIRnd#Co7U zJibucp|!(EycPCBRb1tzI`OXR?!&xXM`?w48!O_*GbitWJ zRAdBv_mql0DO{0>-;LS-_Q-p%^SpPG>Z7XTe$&Hq)pOFLb>|r+r!27EaL?1OyB?^( ztexRj7?I_ydaX zZVw`QB<7kPtoy%L%DgIFPlZ=q&F|E?u43)S_%|(ZotVOOj)H4@R?XT!2a}a*dEEow z$pw2V>c0$1{83S?nYYx5QQJrPRK0z*`$*jRKinVLd3Bo}t=cZNA32}wqbhu=T2CJ$ zInjYvCLPZGVCQ79YpOr)VAYR`G!@lH;*W}A&Ag>foK@k_PaixcE7jF` zdMw3?*ll_|3Z`3%tbO9D@TqF;hb$^pEv6d2_I|W;pDVDtDQS>uQVpMCUrC9qx z6;t8A|CgeB*k`w&*5oq6tZqyuJy?4`f|cs0s-;*FJghza4v*RoXJUm;0q>`(+7Bao zI0ZB5aqb6EJXpz~x_fNRQdI59N;PP zwd{Y*uqqUIz(~9m!=p~SEF!8C@2c)T%uBT+3-{o99(PrDAIVDf_Gn%Gc2}nXg%zr% zI9V{c})kF2+ z@udQl9$?fcI@{Lttc>WPnpMTFP1eX?`;0nqS4N%s=uSj+V$^b3dx|i4*@u{lz^4M1 zk=w&ehhohNcRj#X3qBPY(L*)fTQTmBFSM|@I-|dCoKxEOVCU&6+?Y&9RW(srV=WKz zf_qMTCs3XddvfY#YNk%I$Y)Q9t!g{TBBDBRS4RGPmT(o8wd=vU6;92($x1c2JGl1) zg|kY$6~m);P!^H9CuX&)x;==hPP`Sj2N69Iqjo1)`5=P~crd>@xBoQ{n%KcnXGdhE8mtFv|EzGw@JOupsjw1qr3YB`{uzkYywolp%))qp z;q`v2Frr_o!SMJxXC+Iu73%TMiioUKA0D2>>d@N9TD9BLR>VoHi4t)>iFZ|ZAA0ol z^=}B@iw%*4BGII{hB(I=f&x*ALv) zw8!UDl4`KrQj)vw{+p%8tH=mydV&SE+QZ|h7qxw;un$$e2g$+%mfkAfSq)~fP&-|x zULDuOK;}wTs=-!N$~CK-Wu{k=5oZO<&L73<(5mc11=o+NRxToXs2=%i3MyI)YvwDz z8;|$%l;k})RkhDIc0ZO+%}N$iNK8-T{dE#y8G)Txb?w9I-@LesnW&kZ?w(ji#Hj}F z9zZvXs>o}FdYsS1o23WW!ONr2?2bF>>0|m##l0WoQk{5L<$00i$>4qBt++jis7`F= z-HWrzykOO@A|qhtqguT3k4Wu@zmxGyEKKKk59K*s6)PfZcr7(}dDNU?jZS^y_`5S6 zg+D4*MD_GonehDpki2IQq;6t(YBWs_yDtxM1 z`ytDT4!`o=iuj~Ip7#BGi;n zGBfQ@7-+3zPV{(Q;YUyKx(5|TRA=X8g13F_5SCa!GH-=G=1o?rt*SiA%??pGtHfI| zJW3&pi0Z_Su@!rEnxwG?`Ay>gGM z{iVWg$GXlgxRsq}D~zayB_@;ES^Mm&fSH&+^ib7j)`)raP%XPW);{B|2N*R9@Ttg% z9;)$H@t$_3s5sLpG8Ms5$i505n~-1W#lo~oX1 z@l!2skNBit&vPd_eClUAeqdIs+V`Ll`na+Cu~aoHS>#Jh=UkJ`+ULrMlZKUk%~U6A zbXiltBe7MTrvw%e)rnDe_I#F56)dU&>mjzD_Azg=QVm`nh3pUo9`+&L3U@yvs$q$b zJ`N901|EsG;`Xo)tI|W>>VC~9^MZd?WCT2V_*N}m`A4LGKd1Y_`W^~CC;0QW&h4nS zc*jq*6`_Y)O(s29>m=3*(WB?T{a%HYsMZ5N)s_28Clo}eS4_ud0>29KCM(subL%sg zEY(yc?t0?1uZXNvA0E{UEc&pj8*fECeOBkHVTsA)l-3e-c{(?PUg+KR^tW>8* zPuW?aa6eQJHfMX>FZ-+i%3)+OtCGyrxm6JvosPNnSpw6!e&APuN3v4wPV3NTm%KMi zk5`cq`oIqs*i7c{>Qq=2EU*gjsmO>Ps_n0HtHXo5BUkOi$pWk0WAFw_okU(Ds*kaTnivvwxF7qkFPaoqgdN;2S17xk(FxjQhb46jZWQjK4l#EqoPbY!RXFs0K;DT{z50Xc z*X~wzOkw%SW?i47Y9`Do`Y6RyRqbH1oG5Cs9_M}x)!L82tTToJ{3vQal9g)kQXKm+ z71c-LkBVZ=ywz>utO~EaACr~p>O4J`VnsYx>G3F-ZYi?%iL1h=s@yXLAH|Bu@>H5>Db{{)zGhzj8g*dQkD^#JZ~eqcOePhqy&q#;eI&lC zT8iwvdb%?m9O5Ed^PEbU&s6+* zfOeU*h-TN_FsjjJ~$5O0_vr3OgvG(IbA64N~Rox%aZO*N{w<3Nza|hMW z4_01dAGkm2jsn~H-ocy2L{x)S?9NAbb#`GT=KZV4Tvh@Lth#gSB#SA^N^BpyHd%MK znW?kivqE8odd$97=jW`Fm1?WnpUSKX#mwpFtD4(ZjCqWS)~BTvQ4LE>rq6xoF?-=> z)ZclE-mFw_k9O+6y{WK|v6jbR*S*&)nd3m@8IZqJ-fhiPlXZv@?0^uqpF&s z3aUsv$=Xp<73x;RC;fV!GeubVCeA(I z_aH1Hc-$EEQPsiH12ve=!KWf4_H_H9*g9EGbi~%rU2s?B(+#b)6H%R*Oz@7s4pzOe ztWdvk?b!3K%)H4;HF$Z9Iqa%XIIF~4L02eb5xIME3h>V7E|H8yQ8AV<7Y)iz^NANv8MZ*?s*MG;Zfo81h>L{x8r1`8mtFvozcH0yF3!Zeic?S zqcvf%>dHN9+rM)XMa@dbW&*zoawaR)U=)0vvy!EHtW}{N$7x>?S*boe$_*A*t?I^G z5l^4$mWb-ayQ;enJ%*~DSysr|>%Q+jCn77==~44qb4THRsO}#0Xs6C=L=V+g*tuKL zdyX?vJiuhoud|UO6{8 zI9pdn#Hr3c_A`+@vcSBoP>=JOc(YP{cvNL}h{~Q4Z-w2wH~a!A4IGq@myKhZ^iXXk73Y2s zb)r zJc@fh*+*6QR8>>#tLH>>(%r@QsrC)xJl!vMkn6eUdk2k>_g3@1J^FihP9B+wy>=?R z%9tW<-k>ijzcS5c7j##`a; z%Oc`@67Q<+KJ*|1*{s&g)OGH8vQoW0(7+<6d96@&_ptBtR#>~NREvvQ=N6>GZmA-1 zt46*iMuj#_t(B_VewK8hRrIQb^pzhhM9`Q-P zp0z~rfStInwWenvieWXfS!7V1cq?uX zBB~S1TisXQ&U1RGeia!3r&_%7e}j4!OxpkLX8+$ zHLF~itg4jN?d_q0OyESMTuX9EF$Aoio{tJ4tv*Nr5Zfr ztEyIH1P@v12XlW`L_z*J)xzUiRXBZ@M^BerM#QNGw?}_JpC9;jr+u%G=~ZM^=>b-K zcreXXl^$cQKIXohRl%-YvZw@%TCB%DS43vCSmYk>7d{mk5vLlgf_2YI*37@EdKK17 zWW1^pvFghGwVnL$JLs!1or9^NalccOk;X9LOy$7+^HQz&RAfY~$6S{O%055a zJu69XUG7}z0p6LK**aNFR950v`I7*REF$1p>B6YtQKMhy9-wSi_t7{%@3y*5%gEI% zRN(1b9^^mwLl)QVL%gaf?O=Wx5vRIwYq}R$T($NazlxE6)vFqoxHG}BHWlf?DQ`~y z8$R4qG2YkHSyrm`DAk-=PgIs_suEjIPd6jtRO{hhyr%@lP*&$tS+$%BBY4238gakx z4p(*cG=Rl*J;1O(D|Vz=scvj`-VOHSp`!Ee4*aRJ^P-k@W(p5x9`)`%RCERv+$R|U z!)R7!%5G$FmcYy^aZmnMaCJ_#JQDY*q;@LGJVVL8epD z&#j#owX8GK-N&rEDgmRis>Zhh=VXoeQa8T)xII+NeujE~?Gp~m+QmClI?0-q)u(~P ztB>V`!fsW=5_e_8<0~p#3a+D`^~XNl3K+@4Lv`cM@4dC}30SJ{s?f9|BjV1RneM8x zb}%pf8s7>kNtQivt+5qR+qn9R_v5c!{tNPfJ5&CwMM2#}R3|1AnfdC@hwIpz{%IiA zPw(cdFmJN(Pz~PsL80(p#pxq)Rpsurf0VWRz?UMr{dh{K(4RD2omH{wm$()7fJWBc zE!W}o+S#93RUfi`R%AqsUrri_pHInPt`h?uS;k4c?++t*FkM*U;aAf=&y|X?*0Tf_ zc%Kq}#&-AnH{oRAp&Bf=`XT4aB?~oGjrY~lsmKV}N;1>i`Rum#oV+L_(>Nvfbf@Kk?L7zx%fh1K~t=w_*=5AmtUNZ|6AikcOwXFsa;*;C?6K~R@L33uqxH|f%;XLS5~UUXXoMJ zzgX6;#T51q9?1R& z=u?7XL~GZ?qpCVrTnC>Dav2ei+W%4wUWzfvo)uTg1?$GILKYD`SQBSeIMi>Ct18v@ zf$~+DSC&25M=H))jYypg6eD+?7%|oGweLYAW3|GiCR6k20R(GyTj%P=uOhn5C+EUc zs0Zu*`>uW9A*R~&XhqDV^2)MW72QL-^>6g#p8GS;5*(jb`5CS!V5C{8Zai~;>p?DA z=A~M3^LPi!h&a`HH2YH2t_@Yq2ld2tf1C;ABhQ*5mBCbzHz*@wr+`8a^B=SNjbh$W3-?LPPcpKI zfXAy&zIb^2rWQK%tN)VHxf(ZXPyNT~j$G#*Oog4v?Cq7gwujYPRcqMEjGVP+rn~dO zTzfDpsr{I98~enZtt>n~-nFBTaboUswR5ex)w$BUJdWw^$f~_g%+6#*RF_pTyUj|q zik`rZpvI50bY|*(P}hIobI)1b^XWHs_J_`E&tavyacA$dg?r|`@vERhuJTfy*i-WJ z4#KwciAS|e)xOP3u9#2au{WP)<$Uyjv-jp!?8su(+_I|jnU$R^)lp$pwG|l&Tpm+B zaDP4fF>>{!nN{FRkr6zsJ@8Q9rzGbC9*NBLCe84>G&x-+&*R|X4ra#=~@S0Rg4b>g?G&as}2wKq)03Uf+*uV+MT zRZhWKRrhP|vd@qZH5e*uhhQd$Lm9z3onR?JCAv z>ZvNc`PQDS+mB4$vAUUi?Kx^PaXn}C_K~c?ECp(?*~`lr9Udz1con)6p<7vY{wR)m zQBz4y1bkFgd6R`l_M~F#$U7>i-%!O=0w$AHoeCqe=DIRjRiE~orTSCn`~J9DdT<@A zNA1U|*KX+vjEDGCWCToJ)nXN0RnOx598D!%&Gqydx%xNZk+bTRg;!=;9@P=75iJF* z8>2oIvStsZNZh_^=n#cfsfLx_o9|4lr1N!8nW+{1iEsZlG4q$7neYbdu}_H+JyP9X zX#6>4z2utA$}8Rq-7=z@Yhro3G9y!2(-l)KST?Iy&YuS9@hH}Q;68I#A9_Dk9reP( zSGCxx_SqfGZ%-c><$M)B6&Vqy8mxk~Yah(YMIVE4JXgqaD!7uYREt}Y=ZeUj6ZNlI ziS^j$%E(wtk!r9C);`%(B`YzRUIkZ-qz72_;ZggH!nwf$s{o&hjDS-uuKGh)ds2Ho zeZEn4?)|(6%NH>YkCAQjrmHsvEoCC}pwE*V_N_e)fcO`|Q6= z(5>pkea+{{tPbXy4|pnTB8|ISU3xyra=NG+&)l=JcebbG* zb3Nb;)jEl%Vn>?gJ*c<2S-Znj=s{KDt>Dhe2sqUn-<=bgbywcRWT|QfqrbRU(Q4(%5r_y7ABt=l-%@R$j0YFONe3 zi-_vPTqF0ngDSYLhkbljjGVOxvbvI1H|`GXcpsz zs#acDOj0#?_7Mv1!HnDlmx`$Um=)K}-~G(_BC1Pmt3+~ zRf}6eMW9)GJ$=Mubqe*A(BtR3mWikatLRfQyZt3=RI)Iq{Zz;@GJ7gkW;#5+bfUN9`M3h-9stYlFMI5VN>yQ#JPf1!{Hxjqzi2ZN`wIzJUVvVMbH>dv(5S|{#z zdWgw%D*D9lytDIS%|2$P)X8GHvJ#JL-A8?=I$1=(_9R9P@9aG118!DV`&mKWWZ_5F zoe39xaL>FqZgna$mugtz&sE)d=RVXF8e5TGTuqie?M%(&J2UHV1Og!%u-r36;dG4;6DcHIn9wW=BB-N?N zh_$1b`1Kgo<%!#UsIYTg`V)ZN>d~ysgsU1^?AFA`(`TK;Tai!dx}!1^*`Mi_V)j%X z_SYxogQCurtT?+flRXT^n&Qjq&h10Z-YFv19{BZG`{4;^()ZlV&${;`SVvEvJ0Dkn z(GwZKqq@TGZ0Fui`(&VimFmW_c~aBu?V)0;Rosy|tMWKArIRctieKUpuM>5iM7vcD zON{#MT*dINo|@HD_^hDAWOXGu>F(Uh-sz>E$SXzKn?V_<0ANk9~~y{Pe8dY|OjZ zlZa%uIR)7~sn1-^A}aT`aI_*k@HEx@H5*If1R}R2b1?`mXtv$LfZt3Nap2 zRo<_{s${XMW<|kQpAG<`_*7&>4_H&ZJ3r19Q*;Lh<|oeb z`0-rvX;Rj4*Lq6!Q*^qQLJZ5QepFOdvhY)FRd&CgSBFO^szTYU`>!8A^ii1(h3;9^ zF)RB}wWmnL{Q%pOiubg`K*1|9@4J3oWVy0~iBZe#-_MP*W^SQY*lCHSrKZhGgEo2Zj7>uW6#$P{{54fYOtMmWn8fmv3+D!yL;!8EIrJ$*&r33 z65b~!)2o1$9*I3ysE)rt)_J9x+v8NEyO`R+P9YUN;Tfr?4Al(9f!nidYK1H!suOdq z`BUXdtS4uxXZQ7qV=LlQctyxJ@-Iw@fdVqP^)8TPM^iYi-xE1{wasMq` zKk_EVSC4a6M64un?gz?s*VePoK3I8C6{{ZoWXOnpa4r3|!g|Riwht9&Rdk;bJye@X zkG=<~VC1c*ni%EGR8NUhkrDC8UH6NbRGfdal*KB36{Ftun+dG+0INPcJWEyYoOCHw zux4Fc3!O6 z$9i7vpPaH-WhL&OMpt!0@RCIYOeKlA2Jh^g4xJCUSzYaC1$mQ|>c+U}12gm9_*I~^ zD%G&W?QMR&?z|oEKIERA(?_y8Z+q*}*^?#44{TL^T|UpmjDT-H6+iFb@Hn0fBg42~ zhVI_;e2Ugt(%b2tos+k7Rk!6qHT3kO;y5L#wkmsH_s8K8imFhy{j@tQYY#j#Z4Lco zy}OU8o;{@^BYJeVnd!rHbD!&3YbI9fZ>Nmt!78TeQq=d>bnP%^PxE=+RsE=_s-|My zwd`zX>fGh^J>6&I@tf*YWL|4$Ju`*E+Ow)-R`#K0-8soh^~9&H?&ta$&UH>m?BLq- z_p~R=lgQfGns`#v;f|bs`@T^zs`#c7BhH5mXQpPhP8O@I#Ood$xwnFxL{ul{8qBkE z6tNpCl=cjveZaY)g;}hs)skTBrs-rjQ0&dHUmR5$KE z`u8Z9si0e~!4%7{UXBQ?RByaB{kM$S={IZQ>9KaZJc?z6HL>chMj!Kzik8Q?wlaZV z1$mQ|YOvXR!jnz?kH@&iWG)3)ji`ntCevHhV0?`|C=W1-%=9Yskda3(0gsRo<9XK=GrTVZ>&rWF|x>w)_4s9s<(QF7sT<5wYzi0Z^g zRfor5*LlSw@vG2-h#rYici(&h2ch6aCFAvAcC!_@gJcm=otR82SWi}}!L!Oskr6y( zrQhK}{lyyV(T57IpNfp=p&Gwb>^o{Q{~FPn6%!SY*z!1MMFi!1EsXl8YDG|FUNBX0 z{ZwRx{IaGOo>S4kY4;AIVsBXItGvZ}{Cr2H8r+IJSK}(V%j3pdK?E(%jr+vhm`qm1 zda_atp6@S3MwpK*uzrU}F{bM1L&b=l9?ZLP5zzxYvygEqdTK@nd$Bkfs`Heb`;n|v zgY9FVT{=X8-;G~|EF$Aoio{vfxgW4no&8x=D>8xy@6!WZ%;D}=|AmnKr-!L3JStju zZFk+8_33`GQr+0>yqi@F&+Q?`<5i3+b>9&|E$hsbI$3lmEAhBCs=XCYKh2N<8uWOjc) z-;rdcT1D%31f?F}ok>MM-?QG`hl;UQ=V}&XP4wBIbi-_vP zpHInTjx1eev%0^}3adf^#zS>u`_BD%S*cc$`+?%_V^@n~s0QYJKd-=pxvFY>E6A0s zR5$MY?E^dW-uP9(n6K*N##Ut)edowZHF)}up7vLFYlJoN&NR@{$#S}|5|8-cvUB>( zoHZ-eu*AKy?WU$Xhc&DCa7y}4+6wY@u64gGb!Td>y__u7tm2isddY}*tmQG^7Z26B z=T_yc?5WkWs;|BF=_4mhSmK{&l^))Ms6O9=JJM4~wH|LD=B28{ufh(AWbNWr)tcD2 zQh$LOf8DCT-w$Q|djZ$Mt;lng5!JB7Wa^oYYRYHk!KXeO!qiWEDl(UNtV<29IeqG* z{#9Z2k+`bz6!w3~k=^2RRW<(B*c0vQV553rfY?AQ94 zUA4=~KESeB`?DvxWTE<4)o~BPqHA8Wl7)x*!*r)d?fLXrm@J?FszxsRfCbjO>$jVX zh*ND<^7r3GZ&s>hm)CbjtOm7H(BnMqIb9|`Saq)E^v4tKK37J}JJvc^X0odOIS9+V zRCr_5r$Ux_(@%AGtPYRd!O5!5e^wX?b#-p0@;L4f6;^of&8sjM3g;8*b=vo{Bw4DX z!aBRV`-}vxyVguj>DiAuyUyxkRn>h)@Nf!&M^*PJ!5xOI#Gg;1mB73^?=0QP*#{9T zOsvP=6Inz$U;oRTxYy}X&y(n(evg7N)HPl4nrQ8H_t(9_G!OasRl2PV^*l_ zBk`+{MI?G!7_}a(`|s^mGUu~;N{?1#=XQJh>9J=uRdq7JLs92Sd@9ImL_BI=YVcC5 zS$U_Tyz#4$MFbBNiK$Qz);?EOrP@C9I~C@Ym1?nyb5=u9djM-xRp&~4Dq=p1m1^)( z9J3-XIcMh!zY1AIqNjz)qzCK%d%Km)`K+GOqZN4Y(j&3zVpb0zu2K!VCLZdsYyC;8 zaejt7Bh5;6iCd z{@Ky>^{kwa9x;&*irL4A`8@6*rvS#v(HvJWTHe4;9i zgt}(6)%Pjck#)w#3126sPP_SW$;g^j&249z)!egM)1`Z71#bSxeVnUgaZ2=VEF10J zE$`VI*6B0uoBSk`5iqq6zk2S@KE~eQ$oKwQKW|5_#_s=C{4m{-YfX2l@iVu-hpc@r z1(jtV?YA}WlX_Q@neNVKx3vdzJ_`?zG3k4{vywWy(_`V@!Mk%6&Z=2!3ct$Zn66bh ztFB~Cx~l5l>4*HchYBlfc7Nw=t(mOaQJk4zZ5_BydF>i_D2}~x=hUov7pwO;P3y(g=BZsTMa=7uYyw6?(b83L~zmZXfgOE|b-n!4z-4eHbx!W&poc zp-{z|-r!f!dG>Tu-5GXW`)_17%gSCwM(hKYoj;0WpHVlXcUHV>%2|o;p6q;gk2_bb z?#3N&m!6tAiKtH8@%&k|_pIGZ)|L@*s=;>NPtluYUMdrxij0W$Kyi4K8!W2a z(G$OlzS7fG%{4KZR#k_G`_NPA40@jmJ;;@L#hpQodE0sC<@(QxjDS-u)?uF#D&qy? z#+|V>t&l}Tc4DsS!P>Kzp<1Qusqm_6s>QAF{L0ji_ldjv)|`E0MTt=#RekFLOQx8r zz^8&MMo=f_{iCQWu(Ecr-cMCWL=V+wva0iwjMY$u`NgNgT9cLP_G!&NSJvHKb`RoL zkr8}Q!xHyuU3O@_s;yA(&EHq{G*c~Z1-}=7xO%_L#C5P9=MyejZw54Zb~{hsD>rVR zcG+ha77^!@xHDMSc=w&G&ev+Nugyo{RaVr#&rFA6F|4esIGo+_@Ox{U z+2?2PB%FO(ZpDr?E7gsMqV^jPoVl7EC+@0m1y}7szsyADeOACK#IV77zlt5nZZi`a zeaL4;x5xHQg)CLF&P?W4DO+{NyF$5V=k$>*JKvc)H{VfauI`p=R@IzTWCVQssW|sM zyEOyr&M*E7gt7-p`ZFwP%Fa_EUj#Mr7dmRCRPN zLv?22T6KOXWa{C2GnJxrUEQwC+^kmB*zYQKuAV|yl9`%W&)#n(71Xur;-8kV>- z`E!;D5Xl!Ae80U18vD>+nM>xqC;R7YYwk1jX-~R#UCt`-d8aUQ&&paM%gSN+r>ot4@cvcEB7%o3aj(r<)fG#I8CdtVTd^bO+_vgdADKI`RiWvVXq1Rv Wi8pWiWWBxruvEW_jNG|*?EeQTFd;zz literal 0 HcmV?d00001 diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solid.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solid.kt index aab583a0..db2c0948 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solid.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solid.kt @@ -203,6 +203,10 @@ public var Solid.position: Float32Vector3D? by float32Vector(POSITION_KEY, 0f) public var Solid.rotation: Float32Vector3D? by float32Vector(ROTATION_KEY, 0f) public var Solid.scale: Float32Vector3D? by float32Vector(SCALE_KEY, 1f) +public fun Solid.scale(scaleFactor: Number) { + scale = Float32Vector3D(scaleFactor, scaleFactor, scaleFactor) +} + public var Solid.x: Number by float32(X_POSITION_KEY, 0f) public var Solid.y: Number by float32(Y_POSITION_KEY, 0f) public var Solid.z: Number by float32(Z_POSITION_KEY, 0f) @@ -255,5 +259,5 @@ public var Solid.scaleZ: Number by float32(Z_SCALE_KEY, 1f) * Add rotation with given [angle] relative to given [axis] */ public fun Solid.rotate(angle: Angle, axis: DoubleVector3D): Unit = with(QuaternionField) { - quaternion = Quaternion.fromRotation(angle, axis)*quaternion + quaternion = Quaternion.fromRotation(angle, axis) * quaternion } \ No newline at end of file diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidMaterial.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidMaterial.kt index c411cf4c..e45c18dd 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidMaterial.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidMaterial.kt @@ -18,6 +18,8 @@ import space.kscience.visionforge.solid.SolidMaterial.Companion.MATERIAL_OPACITY @VisionBuilder public class SolidMaterial : Scheme() { + public var type: String by string("default", key = TYPE_KEY) + /** * Primary web-color for the material */ @@ -65,9 +67,9 @@ public class SolidMaterial : Scheme() { MetaDescriptor { inherited = true - value(TYPE_KEY, ValueType.STRING){ + value(TYPE_KEY, ValueType.STRING) { inherited = true - allowedValues = listOf("default".asValue(), "simple".asValue()) + allowedValues = listOf("default", "basic", "lambert", "phong").map { it.asValue() } default("default") } diff --git a/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/ThreeMaterials.kt b/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/ThreeMaterials.kt index 8e1b2e3f..34cbbde0 100644 --- a/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/ThreeMaterials.kt +++ b/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/ThreeMaterials.kt @@ -10,10 +10,7 @@ import space.kscience.visionforge.getStyleNodes import space.kscience.visionforge.solid.ColorAccessor import space.kscience.visionforge.solid.SolidMaterial import space.kscience.visionforge.solid.SolidReference -import three.materials.LineBasicMaterial -import three.materials.Material -import three.materials.MeshBasicMaterial -import three.materials.MeshStandardMaterial +import three.materials.* import three.math.Color import three.objects.Mesh @@ -56,11 +53,23 @@ public object ThreeMaterials { } internal fun buildMaterial(meta: Meta): Material = when (meta[SolidMaterial.TYPE_KEY]?.string) { - "simple" -> MeshBasicMaterial().apply { + "basic" -> MeshBasicMaterial().apply { color = meta[SolidMaterial.COLOR_KEY]?.threeColor() ?: DEFAULT_COLOR wireframe = meta[SolidMaterial.WIREFRAME_KEY].boolean ?: false } + "lambert" -> MeshLambertMaterial().apply { + color = meta[SolidMaterial.COLOR_KEY]?.threeColor() ?: DEFAULT_COLOR + emissive = meta[SolidMaterial.EMISSIVE_COLOR_KEY]?.threeColor() ?: DEFAULT_EMISSIVE_COLOR + wireframe = meta[SolidMaterial.WIREFRAME_KEY].boolean ?: false + } + + "phong" -> MeshPhongMaterial().apply { + color = meta[SolidMaterial.COLOR_KEY]?.threeColor() ?: DEFAULT_COLOR + emissive = meta[SolidMaterial.EMISSIVE_COLOR_KEY]?.threeColor() ?: DEFAULT_EMISSIVE_COLOR + wireframe = meta[SolidMaterial.WIREFRAME_KEY].boolean ?: false + } + else -> MeshStandardMaterial().apply { color = meta[SolidMaterial.COLOR_KEY]?.threeColor() ?: DEFAULT_COLOR emissive = meta[SolidMaterial.EMISSIVE_COLOR_KEY]?.threeColor() ?: DEFAULT_EMISSIVE_COLOR diff --git a/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/ThreePlugin.kt b/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/ThreePlugin.kt index 026c9b18..b00f3c31 100644 --- a/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/ThreePlugin.kt +++ b/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/ThreePlugin.kt @@ -44,16 +44,15 @@ public class ThreePlugin : AbstractPlugin(), ComposeVisionRenderer { objectFactories[SolidLabel::class] = ThreeCanvasLabelFactory objectFactories[AmbientLightSource::class] = ThreeAmbientLightFactory objectFactories[PointLightSource::class] = ThreePointLightFactory - objectFactories[StlSolid::class] = ThreeStlFactory + objectFactories[StlUrlSolid::class] = ThreeStlFactory + objectFactories[StlBinarySolid::class] = ThreeStlFactory objectFactories[AxesSolid::class] = ThreeAxesFactory } @Suppress("UNCHECKED_CAST") - private fun findObjectFactory(type: KClass): ThreeFactory? { - return (objectFactories[type] - ?: context.gather>(ThreeFactory.TYPE).values.find { it.type == type }) + private fun findObjectFactory(type: KClass): ThreeFactory? = + (objectFactories[type] ?: context.gather>(ThreeFactory.TYPE).values.find { it.type == type }) as ThreeFactory? - } /** * Build an Object3D representation of the given [Solid]. diff --git a/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/ThreeStlFactory.kt b/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/ThreeStlFactory.kt index e3fb676f..d8ba0a3a 100644 --- a/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/ThreeStlFactory.kt +++ b/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/ThreeStlFactory.kt @@ -16,7 +16,9 @@ fun ArrayBuffer.toByteArray(): ByteArray = Int8Array(this).unsafeCast public object ThreeStlFactory : ThreeMeshFactory(StlSolid::class) { private val loader = STLLoader().apply { - requestHeader = listOf("Access-Control-Allow-Origin: *") + requestHeader = listOf( + "Access-Control-Allow-Origin: *", + ) } override suspend fun buildGeometry(obj: StlSolid): BufferGeometry = when (obj) { @@ -25,6 +27,7 @@ public object ThreeStlFactory : ThreeMeshFactory(StlSolid::class) { loader.load( url = obj.url, onLoad = { + console.info("Loaded STL from ${obj.url}") continuation.resume(it) }, onError = { From 1022b74d237c7c0c43a4bf43ac31fe2a4761b947 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Mon, 1 Jan 2024 16:04:20 +0300 Subject: [PATCH 30/41] Add .kotlin to gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 6d07da58..64e7ca54 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,7 @@ *.iws out/ .gradle +.kotlin build/ data/ From 629923c03a0e38d92e74672779c726f82f625465 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Sat, 3 Feb 2024 20:02:07 +0300 Subject: [PATCH 31/41] merging compose branch --- .space.kts | 4 ---- .../src/jvmMain/kotlin/controlVision.kt | 16 ++++++++++++++-- .../kscience/visionforge/html/VisionOfHtml.kt | 2 +- 3 files changed, 15 insertions(+), 7 deletions(-) delete mode 100644 .space.kts diff --git a/.space.kts b/.space.kts deleted file mode 100644 index 45b2ed53..00000000 --- a/.space.kts +++ /dev/null @@ -1,4 +0,0 @@ -job("Build") { - gradlew("openjdk:11", "build") -} - diff --git a/demo/playground/src/jvmMain/kotlin/controlVision.kt b/demo/playground/src/jvmMain/kotlin/controlVision.kt index f7a9c753..5cd1c2d2 100644 --- a/demo/playground/src/jvmMain/kotlin/controlVision.kt +++ b/demo/playground/src/jvmMain/kotlin/controlVision.kt @@ -1,9 +1,14 @@ package space.kscience.visionforge.examples +import kotlinx.coroutines.delay +import kotlinx.coroutines.isActive +import kotlinx.coroutines.launch +import kotlinx.html.h2 import kotlinx.html.p import space.kscience.visionforge.VisionControlEvent import space.kscience.visionforge.html.* import space.kscience.visionforge.onClick +import kotlin.time.Duration.Companion.seconds fun main() = serve { @@ -25,6 +30,7 @@ fun main() = serve { } } } + h2 { +"Control elements" } vision { htmlCheckBox { @@ -41,13 +47,19 @@ fun main() = serve { onValueChange(context) { pushEvent(this) } + context.launch { + while (isActive) { + delay(1.seconds) + numberValue = ((numberValue?.toInt() ?: 0) + 1) % 10 + } + } } } vision { - button("Click me"){ - onClick(context){ + button("Click me") { + onClick(context) { pushEvent(this) } } diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionOfHtml.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionOfHtml.kt index 2bd7b9de..b496cf07 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionOfHtml.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionOfHtml.kt @@ -18,7 +18,7 @@ import space.kscience.visionforge.* @Serializable public abstract class VisionOfHtml : AbstractVision() { public var classes: Set - get() = properties.get(::classes.name,false).stringList?.toSet() ?: emptySet() + get() = properties[::classes.name, false].stringList?.toSet() ?: emptySet() set(value) { properties[::classes.name] = value.map { it.asValue() } } From 30ad680688dea763a2e0ab7898d9218b7481f1b8 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Wed, 7 Feb 2024 18:11:49 +0300 Subject: [PATCH 32/41] Use context instead of specialized plugins in JS rendering --- build.gradle.kts | 4 +- demo/gdml/build.gradle.kts | 24 ---- .../visionforge/gdml/demo/GDMLAppComponent.kt | 12 +- .../visionforge/gdml/demo/GdmlJsDemoApp.kt | 11 +- demo/js-playground/build.gradle.kts | 11 +- .../src/jsMain/kotlin/JsPlaygroundApp.kt | 26 +++-- .../src/jsMain/kotlin/gravityDemo.kt | 53 +++++---- .../mipt/npm/muon/monitor/MMAppComponent.kt | 8 +- .../ru/mipt/npm/muon/monitor/MMDemoApp.kt | 3 +- .../src/jvmMain/kotlin/allThingsDemo.kt | 13 +-- .../src/jvmMain/kotlin/markdownVision.kt | 19 ++++ .../kscience/visionforge/solid/demo/demo.kt | 6 +- gradle.properties | 2 +- .../visionforge/compose/MetaViewer.kt | 2 +- .../visionforge/compose/PropertyEditor.kt | 2 +- .../visionforge/compose/composeVision.kt | 15 ++- .../kscience/visionforge/StyleReference.kt | 4 +- .../kscience/visionforge/VisionProperties.kt | 2 +- .../src/jvmMain/kotlin/VisionForge.kt | 2 +- .../visionforge/markup/MarkupPlugin.kt | 4 +- visionforge-plotly/build.gradle.kts | 2 +- .../visionforge/plotly/VisionOfPlotlyTest.kt | 106 ++++++++++++++++-- .../solid/specifications/AxesScheme.kt | 35 ------ .../solid/specifications/Canvas3DOptions.kt | 16 ++- .../visionforge/solid/DescriptorTest.kt | 21 ---- visionforge-tables/build.gradle.kts | 2 +- .../visionforge/tables/VisionOfTable.kt | 2 +- .../visionforge/tables/TableVisionJsPlugin.kt | 2 +- .../visionforge/solid/three/ThreeCanvas.kt | 10 +- .../solid/three/ThreeLabelFactory.kt | 4 +- .../visionforge/solid/three/ThreePlugin.kt | 2 +- .../solid/three/compose/ThreeView.kt | 9 +- 32 files changed, 232 insertions(+), 202 deletions(-) create mode 100644 demo/playground/src/jvmMain/kotlin/markdownVision.kt delete mode 100644 visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/specifications/AxesScheme.kt delete mode 100644 visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/DescriptorTest.kt diff --git a/build.gradle.kts b/build.gradle.kts index 3d1779e7..0888408f 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -6,11 +6,11 @@ plugins { // id("org.jetbrains.kotlinx.kover") version "0.5.0" } -val dataforgeVersion by extra("0.7.1") +val dataforgeVersion by extra("0.8.0") allprojects { group = "space.kscience" - version = "0.4.0-dev-1" + version = "0.4.0-dev-2" } subprojects { diff --git a/demo/gdml/build.gradle.kts b/demo/gdml/build.gradle.kts index 03093d23..48a3298e 100644 --- a/demo/gdml/build.gradle.kts +++ b/demo/gdml/build.gradle.kts @@ -38,30 +38,6 @@ kotlin { explicitApi = null } -//kotlin { -// -// sourceSets { -// commonMain { -// dependencies { -// implementation(project(":visionforge-solid")) -// implementation(project(":visionforge-gdml")) -// } -// } -// jvmMain { -// dependencies { -//// implementation(project(":visionforge-fx")) -// implementation("ch.qos.logback:logback-classic:1.2.11") -// } -// } -// jsMain { -// dependencies { -// implementation(project(":ui:ring")) -// implementation(project(":visionforge-threejs")) -// implementation(npm("react-file-drop", "3.0.6")) -// } -// } -// } -//} //val convertGdmlToJson by tasks.creating(JavaExec::class) { // group = "application" diff --git a/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GDMLAppComponent.kt b/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GDMLAppComponent.kt index c3016145..56c408e6 100644 --- a/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GDMLAppComponent.kt +++ b/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GDMLAppComponent.kt @@ -9,6 +9,7 @@ import org.jetbrains.compose.web.dom.Text import org.w3c.files.File import org.w3c.files.FileReader import org.w3c.files.get +import space.kscience.dataforge.context.Context import space.kscience.dataforge.names.Name import space.kscience.gdml.Gdml import space.kscience.gdml.decodeFromString @@ -17,17 +18,18 @@ import space.kscience.visionforge.gdml.markLayers import space.kscience.visionforge.gdml.toVision import space.kscience.visionforge.setAsRoot import space.kscience.visionforge.solid.Solid -import space.kscience.visionforge.solid.Solids import space.kscience.visionforge.solid.ambientLight import space.kscience.visionforge.solid.invoke import space.kscience.visionforge.solid.three.compose.ThreeView +import space.kscience.visionforge.visionManager @Composable -fun GDMLApp(solids: Solids, initialVision: Solid?, selected: Name? = null) { +fun GDMLApp(context: Context, initialVision: Solid?, selected: Name? = null) { var vision: Solid? by remember { mutableStateOf(initialVision) } fun readFileAsync(file: File) { + val visionManager = context.visionManager FileReader().apply { onload = { val data = result as String @@ -36,7 +38,7 @@ fun GDMLApp(solids: Solids, initialVision: Solid?, selected: Name? = null) { name.endsWith(".gdml") || name.endsWith(".xml") -> { val gdml = Gdml.decodeFromString(data) gdml.toVision().apply { - setAsRoot(solids.visionManager) + setAsRoot(visionManager) console.info("Marking layers for file $name") markLayers() ambientLight { @@ -45,7 +47,7 @@ fun GDMLApp(solids: Solids, initialVision: Solid?, selected: Name? = null) { } } - name.endsWith(".json") -> solids.visionManager.decodeFromString(data) + name.endsWith(".json") -> visionManager.decodeFromString(data) else -> { window.alert("File extension is not recognized: $name") error("File extension is not recognized: $name") @@ -64,7 +66,7 @@ fun GDMLApp(solids: Solids, initialVision: Solid?, selected: Name? = null) { width(100.vw) } }) { - ThreeView(solids, vision, selected) { + ThreeView(context, vision, selected) { Tab("Load") { P { Text("Drag and drop .gdml or .json VisionForge files here") diff --git a/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GdmlJsDemoApp.kt b/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GdmlJsDemoApp.kt index 350c9de9..e60f1dec 100644 --- a/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GdmlJsDemoApp.kt +++ b/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GdmlJsDemoApp.kt @@ -5,13 +5,11 @@ import org.jetbrains.compose.web.dom.Style import org.jetbrains.compose.web.renderComposable import org.w3c.dom.Document import space.kscience.dataforge.context.Context -import space.kscience.dataforge.context.request import space.kscience.gdml.GdmlShowCase import space.kscience.visionforge.Application import space.kscience.visionforge.Colors import space.kscience.visionforge.compose.TreeStyles import space.kscience.visionforge.gdml.toVision -import space.kscience.visionforge.solid.Solids import space.kscience.visionforge.solid.ambientLight import space.kscience.visionforge.solid.invoke import space.kscience.visionforge.solid.three.ThreePlugin @@ -20,10 +18,11 @@ import space.kscience.visionforge.startApplication private class GDMLDemoApp : Application { + val context = Context("gdml-demo") { + plugin(ThreePlugin) + } + override fun start(document: Document, state: Map) { - val context = Context("gdml-demo") { - plugin(ThreePlugin) - } val element = document.getElementById("application") ?: error("Element with id 'application' not found on page") @@ -52,7 +51,7 @@ private class GDMLDemoApp : Application { alignItems(AlignItems.Stretch) } } - GDMLApp(context.request(Solids), vision) + GDMLApp(context, vision) } } } diff --git a/demo/js-playground/build.gradle.kts b/demo/js-playground/build.gradle.kts index e1b39c62..86067e7a 100644 --- a/demo/js-playground/build.gradle.kts +++ b/demo/js-playground/build.gradle.kts @@ -1,5 +1,6 @@ plugins { id("space.kscience.gradle.mpp") + alias(spclibs.plugins.compose) } kscience { @@ -11,12 +12,20 @@ kotlin { js { browser { binaries.executable() + commonWebpackConfig{ + cssSupport{ + enabled = true + } + scssSupport{ + enabled = true + } + sourceMaps = true + } } } } kscience { - dependencies { implementation(projects.visionforge.visionforgeGdml) implementation(projects.visionforge.visionforgePlotly) diff --git a/demo/js-playground/src/jsMain/kotlin/JsPlaygroundApp.kt b/demo/js-playground/src/jsMain/kotlin/JsPlaygroundApp.kt index 3e53e866..8516736c 100644 --- a/demo/js-playground/src/jsMain/kotlin/JsPlaygroundApp.kt +++ b/demo/js-playground/src/jsMain/kotlin/JsPlaygroundApp.kt @@ -3,13 +3,13 @@ import org.jetbrains.compose.web.dom.Div import org.jetbrains.compose.web.renderComposable import org.w3c.dom.Document import space.kscience.dataforge.context.Context -import space.kscience.dataforge.context.request import space.kscience.plotly.models.Trace import space.kscience.plotly.scatter import space.kscience.visionforge.Application import space.kscience.visionforge.Colors -import space.kscience.visionforge.JsVisionClient import space.kscience.visionforge.compose.Tabs +import space.kscience.visionforge.compose.TreeStyles +import space.kscience.visionforge.markup.MarkupPlugin import space.kscience.visionforge.plotly.PlotlyPlugin import space.kscience.visionforge.solid.* import space.kscience.visionforge.solid.three.ThreePlugin @@ -26,19 +26,21 @@ fun Trace.appendXYLatest(x: Number, y: Number, history: Int = 400, xErr: Number? private class JsPlaygroundApp : Application { + val playgroundContext = Context { + plugin(ThreePlugin) + plugin(PlotlyPlugin) + plugin(MarkupPlugin) + } + override fun start(document: Document, state: Map) { - val playgroundContext = Context { - plugin(ThreePlugin) - plugin(PlotlyPlugin) - } - - val solids = playgroundContext.request(Solids) - val client = playgroundContext.request(JsVisionClient) +// val solids = playgroundContext.request(Solids) +// val client = playgroundContext.request(JsVisionClient) val element = document.getElementById("playground") ?: error("Element with id 'playground' not found on page") renderComposable(element) { + Style(TreeStyles) Div({ style { padding(0.pt) @@ -49,7 +51,7 @@ private class JsPlaygroundApp : Application { }) { Tabs("gravity") { Tab("gravity") { - GravityDemo(solids, client) + GravityDemo(playgroundContext) } // Tab("D0") { @@ -66,7 +68,7 @@ private class JsPlaygroundApp : Application { height(100.vh - 50.pt) } }) { - ThreeView(solids, SolidGroup { + ThreeView(playgroundContext, SolidGroup { ambientLight { color(Colors.white) } @@ -85,7 +87,7 @@ private class JsPlaygroundApp : Application { } } Tab("plotly") { - Plot(client) { + Plot(playgroundContext) { scatter { x(1, 2, 3) y(5, 8, 7) diff --git a/demo/js-playground/src/jsMain/kotlin/gravityDemo.kt b/demo/js-playground/src/jsMain/kotlin/gravityDemo.kt index 8e041513..5cff2864 100644 --- a/demo/js-playground/src/jsMain/kotlin/gravityDemo.kt +++ b/demo/js-playground/src/jsMain/kotlin/gravityDemo.kt @@ -1,19 +1,20 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.remember +import app.softwork.bootstrapcompose.Column +import app.softwork.bootstrapcompose.Row import kotlinx.coroutines.delay import kotlinx.coroutines.isActive import org.jetbrains.compose.web.css.* import org.jetbrains.compose.web.dom.AttrBuilderContext import org.jetbrains.compose.web.dom.Div import org.w3c.dom.HTMLDivElement +import space.kscience.dataforge.context.Context import space.kscience.dataforge.meta.Meta import space.kscience.plotly.Plot import space.kscience.plotly.layout import space.kscience.plotly.models.Trace import space.kscience.visionforge.Colors -import space.kscience.visionforge.VisionClient -import space.kscience.visionforge.compose.FlexRow import space.kscience.visionforge.compose.Vision import space.kscience.visionforge.compose.zIndex import space.kscience.visionforge.markup.VisionOfMarkup @@ -24,12 +25,12 @@ import kotlin.math.sqrt @Composable fun Plot( - client: VisionClient, + context: Context, meta: Meta = Meta.EMPTY, attrs: AttrBuilderContext? = null, block: Plot.() -> Unit, ) = Vision( - client = client, + context = context, attrs = attrs, meta = meta, vision = Plot().apply(block).asVision() @@ -37,12 +38,12 @@ fun Plot( @Composable fun Markup( - client: VisionClient, + context: Context, markup: VisionOfMarkup, meta: Meta = Meta.EMPTY, attrs: AttrBuilderContext? = null, ) = Vision( - client = client, + context = context, attrs = attrs, meta = meta, vision = markup @@ -52,7 +53,7 @@ fun Markup( private val h = 100.0 @Composable -fun GravityDemo(solids: Solids, client: VisionClient) { +fun GravityDemo(context: Context) { val velocityTrace = remember { Trace { name = "velocity" @@ -128,32 +129,36 @@ fun GravityDemo(solids: Solids, client: VisionClient) { height(50.vh) } }) { - ThreeView(solids, solid) + ThreeView(context, solid) } - FlexRow({ + Row(attrs = { style { alignContent(AlignContent.Stretch) alignItems(AlignItems.Stretch) height(50.vh - 50.pt) } }) { - Plot(client) { - traces(velocityTrace, energyTrace) - layout { - xaxis.title = "time" + Column { + Plot(context) { + traces(velocityTrace, energyTrace) + layout { + xaxis.title = "time" + } } } - Markup(client, markup, attrs = { - style { - width(100.percent) - height(100.percent) - border(2.pt, LineStyle.Solid, Color.blue) - paddingLeft(8.pt) - backgroundColor(Color.white) - flex(1) - zIndex(10000) - } - }) + Column { + Markup(context, markup, attrs = { + style { + width(100.percent) + height(100.percent) + border(2.pt, LineStyle.Solid, Color.blue) + paddingLeft(8.pt) + backgroundColor(Color.white) + flex(1) + zIndex(10000) + } + }) + } } } } \ No newline at end of file diff --git a/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMAppComponent.kt b/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMAppComponent.kt index 09f3a46d..63924c42 100644 --- a/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMAppComponent.kt +++ b/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMAppComponent.kt @@ -17,10 +17,10 @@ import org.jetbrains.compose.web.dom.P import org.jetbrains.compose.web.dom.Span import org.jetbrains.compose.web.dom.Text import org.w3c.fetch.RequestInit +import space.kscience.dataforge.context.Context import space.kscience.dataforge.meta.invoke import space.kscience.dataforge.names.Name import space.kscience.visionforge.Colors -import space.kscience.visionforge.solid.Solids import space.kscience.visionforge.solid.ambientLight import space.kscience.visionforge.solid.edges import space.kscience.visionforge.solid.invoke @@ -29,7 +29,7 @@ import space.kscience.visionforge.solid.three.compose.ThreeView import kotlin.math.PI @Composable -fun MMApp(solids: Solids, model: Model, selected: Name? = null) { +fun MMApp(context: Context, model: Model, selected: Name? = null) { val mmOptions = remember { Canvas3DOptions { @@ -60,7 +60,7 @@ fun MMApp(solids: Solids, model: Model, selected: Name? = null) { } ) { ThreeView( - solids = solids, + context, solid = root, initialSelected = selected, options = mmOptions, @@ -68,7 +68,7 @@ fun MMApp(solids: Solids, model: Model, selected: Name? = null) { Tab("Events") { ButtonGroup({ Layout.width = Width.Full }) { Button("Next") { - solids.context.launch { + context.launch { val event = window.fetch( "http://localhost:8080/event", RequestInit("GET") diff --git a/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMDemoApp.kt b/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMDemoApp.kt index fa08b0ff..d26bc052 100644 --- a/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMDemoApp.kt +++ b/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMDemoApp.kt @@ -8,7 +8,6 @@ import space.kscience.dataforge.context.request import space.kscience.visionforge.Application import space.kscience.visionforge.VisionManager import space.kscience.visionforge.compose.VisionForgeStyles -import space.kscience.visionforge.solid.Solids import space.kscience.visionforge.solid.three.ThreePlugin import space.kscience.visionforge.startApplication @@ -26,7 +25,7 @@ private class MMDemoApp : Application { renderComposable("app") { Style(VisionForgeStyles) - MMApp(context.request(Solids), model) + MMApp(context, model) } } } diff --git a/demo/playground/src/jvmMain/kotlin/allThingsDemo.kt b/demo/playground/src/jvmMain/kotlin/allThingsDemo.kt index 5b272b72..9227f014 100644 --- a/demo/playground/src/jvmMain/kotlin/allThingsDemo.kt +++ b/demo/playground/src/jvmMain/kotlin/allThingsDemo.kt @@ -2,7 +2,6 @@ package space.kscience.visionforge.examples import kotlinx.html.h2 import space.kscience.dataforge.meta.ValueType -import space.kscience.dataforge.meta.invoke import space.kscience.plotly.layout import space.kscience.plotly.models.ScatterMode import space.kscience.plotly.models.TextPosition @@ -11,9 +10,9 @@ import space.kscience.tables.ColumnHeader import space.kscience.visionforge.html.ResourceLocation import space.kscience.visionforge.markup.markdown import space.kscience.visionforge.plotly.plotly +import space.kscience.visionforge.solid.axes import space.kscience.visionforge.solid.box import space.kscience.visionforge.solid.solid -import space.kscience.visionforge.solid.specifications.Canvas3DOptions import space.kscience.visionforge.solid.z import space.kscience.visionforge.tables.columnTable import kotlin.io.path.Path @@ -34,14 +33,8 @@ fun main() = makeVisionFile( h2 { +"3D visualization with Three-js" } vision("3D") { - solid( - Canvas3DOptions { - axes { - size = 200.0 - visible = true - } - } - ) { + solid { + axes(200) box(100, 100, 100, name = "aBox") { z = 50.0 } diff --git a/demo/playground/src/jvmMain/kotlin/markdownVision.kt b/demo/playground/src/jvmMain/kotlin/markdownVision.kt new file mode 100644 index 00000000..63edbcb6 --- /dev/null +++ b/demo/playground/src/jvmMain/kotlin/markdownVision.kt @@ -0,0 +1,19 @@ +package space.kscience.visionforge.examples + +import space.kscience.visionforge.html.ResourceLocation +import space.kscience.visionforge.markup.markdown + +fun main() = makeVisionFile(resourceLocation = ResourceLocation.SYSTEM) { + vision { + markdown{ + content = """ + # h1 Heading 8-) + ## h2 Heading + ### h3 Heading + #### h4 Heading + ##### h5 Heading + ###### h6 Heading + """.trimIndent() + } + } +} \ No newline at end of file diff --git a/demo/solid-showcase/src/commonMain/kotlin/space/kscience/visionforge/solid/demo/demo.kt b/demo/solid-showcase/src/commonMain/kotlin/space/kscience/visionforge/solid/demo/demo.kt index 698cc846..52a524e1 100644 --- a/demo/solid-showcase/src/commonMain/kotlin/space/kscience/visionforge/solid/demo/demo.kt +++ b/demo/solid-showcase/src/commonMain/kotlin/space/kscience/visionforge/solid/demo/demo.kt @@ -38,10 +38,6 @@ val canvasOptions = Canvas3DOptions { size { minSize = 400 } - axes { - size = 500.0 - visible = true - } camera { distance = 600.0 latitude = PI / 6 @@ -52,6 +48,8 @@ val canvasOptions = Canvas3DOptions { fun VisionLayout.showcase() { demo("shapes", "Basic shapes") { ambientLight() + axes(size = 500.0) + box(100.0, 100.0, 100.0) { z = -110.0 color("teal") diff --git a/gradle.properties b/gradle.properties index 4e33feb5..23061828 100644 --- a/gradle.properties +++ b/gradle.properties @@ -8,6 +8,6 @@ org.gradle.jvmargs=-Xmx4G org.jetbrains.compose.experimental.jscanvas.enabled=true -toolsVersion=0.15.2-kotlin-1.9.21 +toolsVersion=0.15.2-kotlin-1.9.22 #kotlin.experimental.tryK2=true #kscience.wasm.disabled=true diff --git a/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/MetaViewer.kt b/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/MetaViewer.kt index f83d4da6..5c93cd15 100644 --- a/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/MetaViewer.kt +++ b/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/MetaViewer.kt @@ -63,7 +63,7 @@ private fun MetaViewerItem(root: Meta, name: Name, rootDescriptor: MetaDescripto classes(TreeStyles.tree) }) { val keys = buildSet { - descriptorItem?.children?.keys?.forEach { + descriptorItem?.nodes?.keys?.forEach { add(NameToken(it)) } actualMeta!!.items.keys.let { addAll(it) } diff --git a/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/PropertyEditor.kt b/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/PropertyEditor.kt index 89bae724..452750df 100644 --- a/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/PropertyEditor.kt +++ b/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/PropertyEditor.kt @@ -55,7 +55,7 @@ public fun PropertyEditor( val keys by derivedStateOf { buildSet { - descriptor?.children?.filterNot { + descriptor?.nodes?.filterNot { it.key.startsWith("@") || it.value.hidden }?.forEach { add(NameToken(it.key)) diff --git a/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/composeVision.kt b/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/composeVision.kt index e9b22261..ffb3da5f 100644 --- a/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/composeVision.kt +++ b/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/composeVision.kt @@ -8,13 +8,13 @@ import kotlinx.dom.clear import org.jetbrains.compose.web.dom.AttrBuilderContext import org.jetbrains.compose.web.dom.Div import org.w3c.dom.HTMLDivElement +import space.kscience.dataforge.context.Context import space.kscience.dataforge.context.gather +import space.kscience.dataforge.context.request import space.kscience.dataforge.meta.Meta import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.asName -import space.kscience.visionforge.ElementVisionRenderer -import space.kscience.visionforge.Vision -import space.kscience.visionforge.VisionClient +import space.kscience.visionforge.* /** @@ -22,13 +22,20 @@ import space.kscience.visionforge.VisionClient */ @Composable public fun Vision( - client: VisionClient, + context: Context, vision: Vision, name: Name = "@vision[${vision.hashCode().toString(16)}]".asName(), meta: Meta = Meta.EMPTY, attrs: AttrBuilderContext? = null, ): Unit = Div(attrs) { + val client: VisionClient = context.request(JsVisionClient) + + // set vision root if necessary + if (vision.manager == null) { + vision.setAsRoot(client.visionManager) + } + val renderer by derivedStateOf { client.context.gather(ElementVisionRenderer.TYPE).values.mapNotNull { val rating = it.rateVision(vision) diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/StyleReference.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/StyleReference.kt index 62d898b8..b26e3a36 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/StyleReference.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/StyleReference.kt @@ -3,7 +3,7 @@ package space.kscience.visionforge import space.kscience.dataforge.meta.Meta import space.kscience.dataforge.meta.MutableMeta import space.kscience.dataforge.meta.Scheme -import space.kscience.dataforge.meta.Specification +import space.kscience.dataforge.meta.SchemeSpec import kotlin.properties.ReadOnlyProperty /** @@ -36,7 +36,7 @@ public fun Vision.style( @VisionBuilder public fun Vision.style( - spec: Specification, + spec: SchemeSpec, styleKey: String? = null, builder: T.() -> Unit, ): ReadOnlyProperty = ReadOnlyProperty { _, property -> diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionProperties.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionProperties.kt index d607f706..74bbb504 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionProperties.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionProperties.kt @@ -113,7 +113,7 @@ private class VisionPropertiesItem( override val items: Map get() { val metaKeys = properties.own?.get(nodeName)?.items?.keys ?: emptySet() - val descriptorKeys = descriptor?.children?.map { NameToken(it.key) } ?: emptySet() + val descriptorKeys = descriptor?.nodes?.map { NameToken(it.key) } ?: emptySet() val defaultKeys = default?.get(nodeName)?.items?.keys ?: emptySet() val inheritFlag = descriptor?.inherited ?: inherit val stylesFlag = descriptor?.usesStyles ?: useStyles diff --git a/visionforge-jupyter/src/jvmMain/kotlin/VisionForge.kt b/visionforge-jupyter/src/jvmMain/kotlin/VisionForge.kt index 8cb2dcd5..5ac2c37b 100644 --- a/visionforge-jupyter/src/jvmMain/kotlin/VisionForge.kt +++ b/visionforge-jupyter/src/jvmMain/kotlin/VisionForge.kt @@ -55,7 +55,7 @@ public class VisionForge( override val context: Context get() = visionManager.context - public val configuration: ObservableMutableMeta = meta.toMutableMeta() + public val configuration: ObservableMutableMeta = meta.toMutableMeta().asObservable() private var counter = 0 diff --git a/visionforge-markdown/src/jsMain/kotlin/space/kscience/visionforge/markup/MarkupPlugin.kt b/visionforge-markdown/src/jsMain/kotlin/space/kscience/visionforge/markup/MarkupPlugin.kt index 0d5e0431..4f3122c3 100644 --- a/visionforge-markdown/src/jsMain/kotlin/space/kscience/visionforge/markup/MarkupPlugin.kt +++ b/visionforge-markdown/src/jsMain/kotlin/space/kscience/visionforge/markup/MarkupPlugin.kt @@ -34,7 +34,7 @@ public actual class MarkupPlugin : VisionPlugin(), ElementVisionRenderer { COMMONMARK_FORMAT -> CommonMarkFlavourDescriptor() GFM_FORMAT -> GFMFlavourDescriptor() //TODO add new formats via plugins - else-> error("Format ${vision.format} not recognized") + else -> error("Format ${vision.format} not recognized") } vision.useProperty(VisionOfMarkup::content) { div.clear() @@ -53,7 +53,7 @@ public actual class MarkupPlugin : VisionPlugin(), ElementVisionRenderer { public actual companion object : PluginFactory { override val tag: PluginTag = PluginTag("vision.markup.js", PluginTag.DATAFORGE_GROUP) - override fun build(context: Context, meta: Meta): MarkupPlugin = MarkupPlugin() + override fun build(context: Context, meta: Meta): MarkupPlugin = MarkupPlugin() } } \ No newline at end of file diff --git a/visionforge-plotly/build.gradle.kts b/visionforge-plotly/build.gradle.kts index c4df8593..81e5f60a 100644 --- a/visionforge-plotly/build.gradle.kts +++ b/visionforge-plotly/build.gradle.kts @@ -2,7 +2,7 @@ plugins { id("space.kscience.gradle.mpp") } -val plotlyVersion = "0.6.1" +val plotlyVersion = "0.7.0" kscience { jvm() diff --git a/visionforge-plotly/src/commonTest/kotlin/space/kscience/visionforge/plotly/VisionOfPlotlyTest.kt b/visionforge-plotly/src/commonTest/kotlin/space/kscience/visionforge/plotly/VisionOfPlotlyTest.kt index 7634e73d..2b2d4328 100644 --- a/visionforge-plotly/src/commonTest/kotlin/space/kscience/visionforge/plotly/VisionOfPlotlyTest.kt +++ b/visionforge-plotly/src/commonTest/kotlin/space/kscience/visionforge/plotly/VisionOfPlotlyTest.kt @@ -1,22 +1,110 @@ package space.kscience.visionforge.plotly +import space.kscience.dataforge.context.Context +import space.kscience.dataforge.meta.Value import space.kscience.plotly.Plotly -import space.kscience.plotly.scatter +import space.kscience.plotly.layout +import space.kscience.plotly.models.* +import space.kscience.visionforge.visionManager import kotlin.test.Test -import kotlin.test.assertTrue +import kotlin.test.assertEquals class VisionOfPlotlyTest { @Test - fun conversion(){ + fun conversion() { + val trace1 = Violin { + text("sample length: 32") + marker { + line { + width = 2 + color("#bebada") + } + symbol = Symbol.valueOf("line-ns") + } + orientation = Orientation.h + hoveron = ViolinHoveron.`points+kde` + meanline { + visible = true + } + legendgroup = "F" + scalegroup = "F" + points = ViolinPoints.all + pointpos = 1.2 + jitter = 0 + box { + visible = true + } + scalemode = ViolinScaleMode.count + showlegend = false + side = ViolinSide.positive + y0 = Value.of(0) + line { + color("#bebada") + } + name = "F" + + x(10.07, 34.83, 10.65, 12.43, 24.08, 13.42, 12.48, 29.8, 14.52, 11.38, + 20.27, 11.17, 12.26, 18.26, 8.51, 10.33, 14.15, 13.16, 17.47, 27.05, 16.43, + 8.35, 18.64, 11.87, 19.81, 43.11, 13.0, 12.74, 13.0, 16.4, 16.47, 18.78) + } + + val trace2 = Violin { + text("sample length: 30") + marker { + line { + width = 2 + color("#8dd3c7") + } + symbol = Symbol.valueOf("line-ns") + } + orientation = Orientation.h + hoveron = ViolinHoveron.`points+kde` + meanline { + visible = true + } + legendgroup = "M" + scalegroup = "M" + points = ViolinPoints.all + pointpos = -1.2 + jitter = 0 + box { + visible = true + } + scalemode = ViolinScaleMode.count + showlegend = false + side = ViolinSide.negative + y0 = Value.of(0) + + line { + color("#8dd3c7") + } + name = "M" + + x(27.2, 22.76, 17.29, 19.44, 16.66, 32.68, 15.98, 13.03, 18.28, 24.71, + 21.16, 11.69, 14.26, 15.95, 8.52, 22.82, 19.08, 16.0, 34.3, 41.19, 9.78, + 7.51, 28.44, 15.48, 16.58, 7.56, 10.34, 13.51, 18.71, 20.53) + } + val plot = Plotly.plot { - scatter { - x(1,2,3) - y(1,2,3) + traces(trace1, trace2) + layout { + width = 800 + height = 800 + title = "Advanced Violin Plot" } } val vision = VisionOfPlotly(plot) -// println(vision.plot.toJsonString()) -// println(vision.plot.data.toJsonString()) - assertTrue { vision.plot.data.first().x.doubles.size == 3} + val context = Context { + plugin(PlotlyPlugin) + } + val serialized = context.visionManager.encodeToString(vision) + + val deserialized: VisionOfPlotly = context.visionManager.decodeFromString(serialized) as VisionOfPlotly + + println(deserialized.plot.meta) + + assertEquals(62, deserialized.plot.data.sumOf { it.x.doubles.size}) + + assertEquals("Advanced Violin Plot", deserialized.plot.layout.title) } } \ No newline at end of file diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/specifications/AxesScheme.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/specifications/AxesScheme.kt deleted file mode 100644 index 0ed9126e..00000000 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/specifications/AxesScheme.kt +++ /dev/null @@ -1,35 +0,0 @@ -package space.kscience.visionforge.solid.specifications - -import space.kscience.dataforge.meta.Scheme -import space.kscience.dataforge.meta.SchemeSpec -import space.kscience.dataforge.meta.boolean -import space.kscience.dataforge.meta.descriptors.MetaDescriptor -import space.kscience.dataforge.meta.descriptors.value -import space.kscience.dataforge.meta.double - -@Deprecated("Use separate axes object instead") -public class AxesScheme : Scheme() { - public var visible: Boolean by boolean(false) - public var size: Double by double(AXIS_SIZE) - public var width: Double by double(AXIS_WIDTH) - - @Suppress("DEPRECATION") - public companion object : SchemeSpec(::AxesScheme) { - public const val AXIS_SIZE: Double = 1000.0 - public const val AXIS_WIDTH: Double = 3.0 - - override val descriptor: MetaDescriptor by lazy { - MetaDescriptor { - value(AxesScheme::visible){ - default(false) - } - value(AxesScheme::size){ - default(AXIS_SIZE) - } - value(AxesScheme::width){ - default(AXIS_WIDTH) - } - } - } - } -} \ No newline at end of file diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/specifications/Canvas3DOptions.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/specifications/Canvas3DOptions.kt index 8a081d63..19e93b0f 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/specifications/Canvas3DOptions.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/specifications/Canvas3DOptions.kt @@ -1,3 +1,5 @@ +@file:OptIn(DFExperimental::class) + package space.kscience.visionforge.solid.specifications import space.kscience.dataforge.meta.* @@ -5,6 +7,7 @@ import space.kscience.dataforge.meta.descriptors.MetaDescriptor import space.kscience.dataforge.meta.descriptors.scheme import space.kscience.dataforge.meta.descriptors.value import space.kscience.dataforge.meta.set +import space.kscience.dataforge.misc.DFExperimental import space.kscience.dataforge.names.Name import space.kscience.visionforge.hide import space.kscience.visionforge.widgetType @@ -61,16 +64,14 @@ public class CanvasSize : Scheme() { public class Canvas3DOptions : Scheme() { public var canvasName: String by string("vision") - @Suppress("DEPRECATION") - public var axes: AxesScheme by spec(AxesScheme) - public var camera: CameraScheme by spec(CameraScheme) - public var controls: Canvas3DUIScheme by spec(Canvas3DUIScheme) + public var camera: CameraScheme by scheme(CameraScheme) + public var controls: Canvas3DUIScheme by scheme(Canvas3DUIScheme) - public var size: CanvasSize by spec(CanvasSize) + public var size: CanvasSize by scheme(CanvasSize) public var layers: List by numberList(0) - public var clipping: PointScheme by spec(Clipping) + public var clipping: PointScheme by scheme(Clipping) public var onSelect: ((Name?) -> Unit)? = null @@ -78,9 +79,6 @@ public class Canvas3DOptions : Scheme() { public companion object : SchemeSpec(::Canvas3DOptions) { override val descriptor: MetaDescriptor by lazy { MetaDescriptor { - @Suppress("DEPRECATION") - scheme(Canvas3DOptions::axes, AxesScheme) - value(Canvas3DOptions::layers) { multiple = true default(listOf(0)) diff --git a/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/DescriptorTest.kt b/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/DescriptorTest.kt deleted file mode 100644 index 87527802..00000000 --- a/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/DescriptorTest.kt +++ /dev/null @@ -1,21 +0,0 @@ -package space.kscience.visionforge.solid - -import space.kscience.dataforge.meta.ValueType -import space.kscience.dataforge.meta.descriptors.get -import space.kscience.visionforge.solid.specifications.Canvas3DOptions -import kotlin.test.Test -import kotlin.test.assertNotNull -import kotlin.test.assertTrue - -class DescriptorTest { - @Test - fun canvasDescriptor() { - val descriptor = Canvas3DOptions.descriptor - //println(descriptor.config) - val axesSize = descriptor["axes.size"] - assertNotNull(axesSize) - assertTrue { - ValueType.NUMBER in axesSize.valueTypes!! - } - } -} \ No newline at end of file diff --git a/visionforge-tables/build.gradle.kts b/visionforge-tables/build.gradle.kts index 23912afe..ccc0341a 100644 --- a/visionforge-tables/build.gradle.kts +++ b/visionforge-tables/build.gradle.kts @@ -2,7 +2,7 @@ plugins { id("space.kscience.gradle.mpp") } -val tablesVersion = "0.3.0" +val tablesVersion = "0.4.0" kscience { jvm() diff --git a/visionforge-tables/src/commonMain/kotlin/space/kscience/visionforge/tables/VisionOfTable.kt b/visionforge-tables/src/commonMain/kotlin/space/kscience/visionforge/tables/VisionOfTable.kt index 3e4f9da8..a691bd85 100644 --- a/visionforge-tables/src/commonMain/kotlin/space/kscience/visionforge/tables/VisionOfTable.kt +++ b/visionforge-tables/src/commonMain/kotlin/space/kscience/visionforge/tables/VisionOfTable.kt @@ -70,7 +70,7 @@ public fun Table.toVision( } else { Meta { headers.forEach { - it.name put converter(row[it.name]) + it.name put converter(row.getOrNull(it.name)) } } } diff --git a/visionforge-tables/src/jsMain/kotlin/space/kscience/visionforge/tables/TableVisionJsPlugin.kt b/visionforge-tables/src/jsMain/kotlin/space/kscience/visionforge/tables/TableVisionJsPlugin.kt index 18170686..f9ef25c3 100644 --- a/visionforge-tables/src/jsMain/kotlin/space/kscience/visionforge/tables/TableVisionJsPlugin.kt +++ b/visionforge-tables/src/jsMain/kotlin/space/kscience/visionforge/tables/TableVisionJsPlugin.kt @@ -1,6 +1,6 @@ package space.kscience.visionforge.tables -import js.core.jso +import js.objects.jso import org.w3c.dom.Element import org.w3c.dom.HTMLElement import space.kscience.dataforge.context.AbstractPlugin diff --git a/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/ThreeCanvas.kt b/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/ThreeCanvas.kt index dac32e08..786a0cc1 100644 --- a/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/ThreeCanvas.kt +++ b/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/ThreeCanvas.kt @@ -20,7 +20,6 @@ import three.core.Raycaster import three.external.controls.OrbitControls import three.external.controls.TrackballControls import three.geometries.EdgesGeometry -import three.helpers.AxesHelper import three.materials.Material import three.math.* import three.meshline.MeshLine @@ -50,14 +49,7 @@ public class ThreeCanvas( private val raycaster = Raycaster() private val mousePosition: Vector2 = Vector2() - private val scene: Scene = Scene().apply { - options.useProperty(Canvas3DOptions::axes, this) { - getObjectByName(AXES_NAME)?.let { remove(it) } - val axesObject = AxesHelper(axes.size.toInt()).apply { visible = axes.visible } - axesObject.name = AXES_NAME - add(axesObject) - } - } + private val scene: Scene = Scene() private fun buildCamera(spec: CameraScheme) = PerspectiveCamera( diff --git a/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/ThreeLabelFactory.kt b/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/ThreeLabelFactory.kt index 45068a3a..3ca87d48 100644 --- a/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/ThreeLabelFactory.kt +++ b/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/ThreeLabelFactory.kt @@ -1,7 +1,7 @@ package space.kscience.visionforge.solid.three -import js.core.jso +import js.objects.jso import space.kscience.dataforge.context.logger import space.kscience.dataforge.context.warn import space.kscience.visionforge.onPropertyChange @@ -27,7 +27,7 @@ public object ThreeLabelFactory : ThreeFactory { return Mesh(textGeo, ThreeMaterials.DEFAULT).apply { setMaterial(vision) updatePosition(vision) - if(observe) { + if (observe) { vision.onPropertyChange(three.context) { //TODO three.logger.warn { "Label parameter change not implemented" } diff --git a/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/ThreePlugin.kt b/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/ThreePlugin.kt index b00f3c31..7f7cc29b 100644 --- a/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/ThreePlugin.kt +++ b/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/ThreePlugin.kt @@ -189,7 +189,7 @@ public class ThreePlugin : AbstractPlugin(), ComposeVisionRenderer { @Composable override fun DOMScope.render(client: VisionClient, name: Name, vision: Vision, meta: Meta) { require(vision is Solid) { "Expected Solid but found ${vision::class}" } - ThreeView(solids, vision, null, Canvas3DOptions.read(meta)) + ThreeView(context, vision, null, Canvas3DOptions.read(meta)) } public companion object : PluginFactory { diff --git a/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/compose/ThreeView.kt b/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/compose/ThreeView.kt index 21a61ebd..2ea1d930 100644 --- a/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/compose/ThreeView.kt +++ b/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/compose/ThreeView.kt @@ -17,7 +17,6 @@ import space.kscience.visionforge.compose.* import space.kscience.visionforge.root import space.kscience.visionforge.solid.Solid import space.kscience.visionforge.solid.SolidGroup -import space.kscience.visionforge.solid.Solids import space.kscience.visionforge.solid.specifications.Canvas3DOptions import space.kscience.visionforge.solid.three.ThreeCanvas import space.kscience.visionforge.solid.three.ThreePlugin @@ -63,7 +62,7 @@ private fun SimpleThreeView( @Composable public fun ThreeView( - solids: Solids, + context: Context, solid: Solid?, initialSelected: Name? = null, options: Canvas3DOptions? = null, @@ -114,7 +113,7 @@ public fun ThreeView( } } } else { - SimpleThreeView(solids.context, optionsSnapshot, solid, selected) + SimpleThreeView(context, optionsSnapshot, solid, selected) } key(selected) { @@ -136,7 +135,7 @@ public fun ThreeView( NameCrumbs(selected) { selected = it } Hr() PropertyEditor( - scope = solids.context, + scope = context, rootMeta = vision.properties.root(), getPropertyState = { name -> if (vision.properties.own?.get(name) != null) { @@ -189,6 +188,6 @@ public fun ThreeView( } } } else { - SimpleThreeView(solids.context, optionsSnapshot, solid, selected) + SimpleThreeView(context, optionsSnapshot, solid, selected) } } \ No newline at end of file From cbf3f4941abe44f8e91d48aca3d450dc7d912030 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Mon, 12 Feb 2024 10:16:01 +0300 Subject: [PATCH 33/41] Fixed all tests --- build.gradle.kts | 4 +- .../kotlin/ru/mipt/npm/root/dRootToSolid.kt | 7 +- .../src/jvmMain/kotlin/controlVision.kt | 4 +- .../kscience/visionforge/AbstractVision.kt | 16 ++--- .../kscience/visionforge/ControlVision.kt | 24 +++---- .../space/kscience/visionforge/StyleSheet.kt | 6 +- .../space/kscience/visionforge/Vision.kt | 16 +---- .../kscience/visionforge/VisionChange.kt | 4 +- .../kscience/visionforge/VisionManager.kt | 2 +- .../kscience/visionforge/VisionProperties.kt | 68 ++++++++++--------- .../kscience/visionforge/flowProperty.kt | 4 +- .../visionforge/html/VisionOfHtmlForm.kt | 10 +-- .../space/kscience/visionforge/useProperty.kt | 53 +++++++++------ .../kscience/visionforge/html/HtmlTagTest.kt | 2 +- .../visionforge/meta/VisionPropertyTest.kt | 38 +++++++---- .../visionforge/ElementVisionRenderer.kt | 13 +--- .../kscience/visionforge/JsVisionClient.kt | 5 +- .../kscience/visionforge/formRenderers.kt | 4 +- .../visionforge/plotly/VisionOfPlotly.kt | 35 +++------- .../kscience/visionforge/solid/Composite.kt | 3 +- .../space/kscience/visionforge/solid/Solid.kt | 2 +- .../visionforge/solid/SolidReference.kt | 27 ++++---- .../visionforge/solid/SolidPropertyTest.kt | 24 ++----- .../visionforge/solid/three/ThreeMaterials.kt | 2 +- .../visionforge/solid/three/ThreePlugin.kt | 3 +- .../solid/three/compose/ThreeView.kt | 4 +- 26 files changed, 171 insertions(+), 209 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 0888408f..debd7323 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -3,14 +3,14 @@ import space.kscience.gradle.useSPCTeam plugins { id("space.kscience.gradle.project") -// id("org.jetbrains.kotlinx.kover") version "0.5.0" + id("org.jetbrains.kotlinx.kover") version "0.5.0" } val dataforgeVersion by extra("0.8.0") allprojects { group = "space.kscience" - version = "0.4.0-dev-2" + version = "0.4.0-dev-3" } subprojects { diff --git a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/dRootToSolid.kt b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/dRootToSolid.kt index 2c501fd7..e6536d6f 100644 --- a/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/dRootToSolid.kt +++ b/cern-root-loader/src/commonMain/kotlin/ru/mipt/npm/root/dRootToSolid.kt @@ -1,9 +1,6 @@ package ru.mipt.npm.root -import space.kscience.dataforge.meta.Meta -import space.kscience.dataforge.meta.double -import space.kscience.dataforge.meta.int -import space.kscience.dataforge.meta.set +import space.kscience.dataforge.meta.* import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.parseAsName import space.kscience.dataforge.names.plus @@ -365,7 +362,7 @@ private fun buildVolume(volume: DGeoVolume, context: RootToSolidContext): Solid? } return if (group.children.isEmpty()) { null - } else if (group.items.size == 1 && group.properties.own == null) { + } else if (group.items.size == 1 && group.properties.own.isEmpty()) { group.items.values.first().apply { parent = null } } else { group diff --git a/demo/playground/src/jvmMain/kotlin/controlVision.kt b/demo/playground/src/jvmMain/kotlin/controlVision.kt index 5cd1c2d2..a0383ea2 100644 --- a/demo/playground/src/jvmMain/kotlin/controlVision.kt +++ b/demo/playground/src/jvmMain/kotlin/controlVision.kt @@ -7,7 +7,7 @@ import kotlinx.html.h2 import kotlinx.html.p import space.kscience.visionforge.VisionControlEvent import space.kscience.visionforge.html.* -import space.kscience.visionforge.onClick +import space.kscience.visionforge.onSubmit import kotlin.time.Duration.Companion.seconds @@ -59,7 +59,7 @@ fun main() = serve { vision { button("Click me") { - onClick(context) { + onSubmit(context) { pushEvent(this) } } diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/AbstractVision.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/AbstractVision.kt index 0cba6a37..655a7684 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/AbstractVision.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/AbstractVision.kt @@ -1,8 +1,6 @@ package space.kscience.visionforge -import kotlinx.serialization.SerialName -import kotlinx.serialization.Serializable -import kotlinx.serialization.Transient +import kotlinx.serialization.* import space.kscience.dataforge.meta.MutableMeta import space.kscience.dataforge.meta.descriptors.MetaDescriptor @@ -14,16 +12,12 @@ public abstract class AbstractVision : Vision { override var parent: Vision? = null @SerialName("properties") - protected var propertiesInternal: MutableMeta? = null + @OptIn(ExperimentalSerializationApi::class) + @EncodeDefault(EncodeDefault.Mode.NEVER) + protected var propertiesInternal: MutableMeta = MutableMeta() final override val properties: MutableVisionProperties by lazy { - object : AbstractVisionProperties(this) { - override var properties: MutableMeta? - get() = propertiesInternal - set(value) { - propertiesInternal = value - } - } + AbstractVisionProperties(this, propertiesInternal) } override val descriptor: MetaDescriptor? get() = null diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/ControlVision.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/ControlVision.kt index 546869bb..36dfe003 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/ControlVision.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/ControlVision.kt @@ -34,11 +34,11 @@ public interface ControlVision : Vision { /** - * @param payload The optional payload associated with the click event. + * An event for submitting changes */ @Serializable -@SerialName("control.click") -public class VisionClickEvent(override val meta: Meta) : VisionControlEvent() { +@SerialName("control.submit") +public class VisionSubmitEvent(override val meta: Meta) : VisionControlEvent() { public val payload: Meta get() = meta[::payload.name] ?: Meta.EMPTY public val name: Name? get() = meta["name"].string?.parseAsName() @@ -46,28 +46,28 @@ public class VisionClickEvent(override val meta: Meta) : VisionControlEvent() { override fun toString(): String = meta.toString() } -public fun VisionClickEvent(payload: Meta = Meta.EMPTY, name: Name? = null): VisionClickEvent = VisionClickEvent( +public fun VisionSubmitEvent(payload: Meta = Meta.EMPTY, name: Name? = null): VisionSubmitEvent = VisionSubmitEvent( Meta { - VisionClickEvent::payload.name put payload - VisionClickEvent::name.name put name.toString() + VisionSubmitEvent::payload.name put payload + VisionSubmitEvent::name.name put name.toString() } ) -public interface ClickControl : ControlVision { +public interface DataControl : ControlVision { /** - * Create and dispatch a click event + * Create and dispatch submit event */ - public suspend fun click(builder: MutableMeta.() -> Unit = {}) { - dispatchControlEvent(VisionClickEvent(Meta(builder))) + public suspend fun submit(builder: MutableMeta.() -> Unit = {}) { + dispatchControlEvent(VisionSubmitEvent(Meta(builder))) } } /** * Register listener */ -public fun ClickControl.onClick(scope: CoroutineScope, block: suspend VisionClickEvent.() -> Unit): Job = - controlEventFlow.filterIsInstance().onEach(block).launchIn(scope) +public fun DataControl.onSubmit(scope: CoroutineScope, block: suspend VisionSubmitEvent.() -> Unit): Job = + controlEventFlow.filterIsInstance().onEach(block).launchIn(scope) @Serializable diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/StyleSheet.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/StyleSheet.kt index ed893162..cff29e61 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/StyleSheet.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/StyleSheet.kt @@ -67,7 +67,7 @@ internal fun Vision.styleChanged(key: String, oldStyle: Meta?, newStyle: Meta?) * List of names of styles applied to this object. Order matters. Not inherited. */ public var Vision.styles: List - get() = properties.own?.getValue(Vision.STYLE_KEY)?.stringList ?: emptyList() + get() = properties.own[Vision.STYLE_KEY]?.stringList ?: emptyList() set(value) { properties.setValue(Vision.STYLE_KEY, value.map { it.asValue() }.asValue()) } @@ -83,7 +83,7 @@ public val Vision.styleSheet: StyleSheet get() = StyleSheet(this) * The style with given name does not necessary exist at the moment. */ public fun Vision.useStyle(name: String, notify: Boolean = true) { - val newStyle = properties.own?.get(Vision.STYLE_KEY)?.value?.list?.plus(name.asValue()) ?: listOf(name.asValue()) + val newStyle = properties.own[Vision.STYLE_KEY]?.value?.list?.plus(name.asValue()) ?: listOf(name.asValue()) properties.setValue(Vision.STYLE_KEY, newStyle.asValue(), notify) } @@ -92,7 +92,7 @@ public fun Vision.useStyle(name: String, notify: Boolean = true) { * Resolve a style with given name for given [Vision]. The style is not necessarily applied to this [Vision]. */ public fun Vision.getStyle(name: String): Meta? = - properties.own?.get(StyleSheet.STYLESHEET_KEY + name) ?: parent?.getStyle(name) + properties.own[StyleSheet.STYLESHEET_KEY + name] ?: parent?.getStyle(name) /** * Resolve a property from all styles diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/Vision.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/Vision.kt index 886a1574..4062b356 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/Vision.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/Vision.kt @@ -1,9 +1,5 @@ package space.kscience.visionforge -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.Job -import kotlinx.coroutines.flow.launchIn -import kotlinx.coroutines.flow.onEach import space.kscience.dataforge.context.logger import space.kscience.dataforge.context.warn import space.kscience.dataforge.meta.asValue @@ -73,14 +69,4 @@ public var Vision.visible: Boolean? get() = properties.getValue(Vision.VISIBLE_KEY)?.boolean set(value) { properties.setValue(Vision.VISIBLE_KEY, value?.asValue()) - } - -/** - * Subscribe on property updates. The subscription is bound to the given scope and canceled when the scope is canceled - */ -public fun Vision.onPropertyChange( - scope: CoroutineScope, - callback: suspend (Name) -> Unit, -): Job = properties.changes.onEach { - callback(it) -}.launchIn(scope) \ No newline at end of file + } \ No newline at end of file diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionChange.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionChange.kt index 87bff794..00386948 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionChange.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionChange.kt @@ -147,8 +147,8 @@ private fun CoroutineScope.collectChange( ) { //Collect properties change - source.properties.changes.onEach { propertyName -> - val newItem = source.properties.own?.get(propertyName) + source.properties.flowChanges().onEach { propertyName -> + val newItem = source.properties.own[propertyName] collector.propertyChanged(name, propertyName, newItem) }.launchIn(this) diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionManager.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionManager.kt index 84ed8286..2bee6a4f 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionManager.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionManager.kt @@ -83,7 +83,7 @@ public class VisionManager(meta: Meta) : AbstractPlugin(meta), MutableVisionCont polymorphic(VisionEvent::class) { subclass(VisionChange.serializer()) subclass(VisionMetaEvent.serializer()) - subclass(VisionClickEvent.serializer()) + subclass(VisionSubmitEvent.serializer()) subclass(VisionValueChangeEvent.serializer()) subclass(VisionInputEvent.serializer()) } diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionProperties.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionProperties.kt index 74bbb504..752b7bd3 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionProperties.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionProperties.kt @@ -1,9 +1,8 @@ package space.kscience.visionforge -import kotlinx.coroutines.channels.BufferOverflow import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableSharedFlow -import kotlinx.coroutines.flow.SharedFlow +import kotlinx.coroutines.launch import kotlinx.serialization.Transient import space.kscience.dataforge.meta.* import space.kscience.dataforge.meta.descriptors.MetaDescriptor @@ -15,7 +14,7 @@ public interface VisionProperties : MetaProvider { /** * Raw Visions own properties without styles, defaults, etc. */ - public val own: Meta? + public val own: Meta public val descriptor: MetaDescriptor? @@ -41,7 +40,7 @@ public interface VisionProperties : MetaProvider { override fun get(name: Name): Meta? = get(name, null, null) - public val changes: Flow + public fun flowChanges(): Flow /** * Notify all listeners that a property has been changed and should be invalidated. @@ -112,7 +111,7 @@ private class VisionPropertiesItem( override val items: Map get() { - val metaKeys = properties.own?.get(nodeName)?.items?.keys ?: emptySet() + val metaKeys = properties.own[nodeName]?.items?.keys ?: emptySet() val descriptorKeys = descriptor?.nodes?.map { NameToken(it.key) } ?: emptySet() val defaultKeys = default?.get(nodeName)?.items?.keys ?: emptySet() val inheritFlag = descriptor?.inherited ?: inherit @@ -158,25 +157,12 @@ private class VisionPropertiesItem( /** * A base implementation of [MutableVisionProperties] */ -public abstract class AbstractVisionProperties( +public open class AbstractVisionProperties( public val vision: Vision, + final override val own: MutableMeta, ) : MutableVisionProperties { override val descriptor: MetaDescriptor? get() = vision.descriptor - protected abstract var properties: MutableMeta? - - override val own: Meta? get() = properties - - @JvmSynchronized - protected fun getOrCreateProperties(): MutableMeta { - if (properties == null) { - //TODO check performance issues - val newProperties = MutableMeta() - properties = newProperties - } - return properties!! - } - private val descriptorCache = HashMap() override fun getValue( @@ -184,7 +170,7 @@ public abstract class AbstractVisionProperties( inherit: Boolean?, includeStyles: Boolean?, ): Value? { - own?.get(name)?.value?.let { return it } + own[name]?.value?.let { return it } val descriptor = descriptor?.let { descriptor -> descriptorCache.getOrPut(name) { descriptor[name] } } val stylesFlag = includeStyles ?: descriptor?.usesStyles ?: true @@ -202,14 +188,26 @@ public abstract class AbstractVisionProperties( override fun set(name: Name, node: Meta?, notify: Boolean) { //ignore if the value is the same as existing - if (own?.get(name) == node) return + if (own[name] == node) return if (name.isEmpty()) { - properties = node?.asMutableMeta() + if (node == null) { + own.items.keys.forEach { + remove(it.asName()) + } + } else { + (own.items.keys - node.items.keys).forEach { + remove(it.asName()) + } + node.items.forEach { (token, item) -> + set(token, item) + } + } + } else if (node == null) { - properties?.set(name, node) + own[name] = node } else { - getOrCreateProperties()[name] = node + own[name] = node } if (notify) { invalidate(name) @@ -218,12 +216,12 @@ public abstract class AbstractVisionProperties( override fun setValue(name: Name, value: Value?, notify: Boolean) { //ignore if the value is the same as existing - if (own?.getValue(name) == value) return + if (own.getValue(name) == value) return if (value == null) { - properties?.get(name)?.value = null + own[name]?.value = null } else { - getOrCreateProperties().setValue(name, value) + own.setValue(name, value) } if (notify) { invalidate(name) @@ -231,12 +229,20 @@ public abstract class AbstractVisionProperties( } @Transient - protected val changesInternal: MutableSharedFlow = MutableSharedFlow(500, onBufferOverflow = BufferOverflow.DROP_OLDEST) - override val changes: SharedFlow get() = changesInternal + protected val changesInternal: MutableSharedFlow = MutableSharedFlow() + + override fun flowChanges(): Flow = changesInternal override fun invalidate(propertyName: Name) { //send update signal - changesInternal.tryEmit(propertyName) + val manager = vision.manager + if (manager != null) { + manager.context.launch { + changesInternal.emit(propertyName) + } + } else { + changesInternal.tryEmit(propertyName) + } //notify children if there are any if (vision is VisionGroup) { diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/flowProperty.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/flowProperty.kt index 60c39c20..8d1bbb72 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/flowProperty.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/flowProperty.kt @@ -18,7 +18,7 @@ public fun Vision.flowProperty( ): Flow = flow { //Pass initial value. emit(properties.get(propertyName, inherit, includeStyles)) - properties.changes.collect { name -> + properties.flowChanges().collect { name -> if (name.startsWith(propertyName)) { emit(properties.get(propertyName, inherit, includeStyles)) } @@ -41,7 +41,7 @@ public fun Vision.flowPropertyValue( ): Flow = flow { //Pass initial value. emit(properties.getValue(propertyName, inherit, includeStyles)) - properties.changes.collect { name -> + properties.flowChanges().collect { name -> if (name.startsWith(propertyName)) { emit(properties.getValue(propertyName, inherit, includeStyles)) } diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionOfHtmlForm.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionOfHtmlForm.kt index baa7326a..3f6d46ca 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionOfHtmlForm.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionOfHtmlForm.kt @@ -8,8 +8,8 @@ import kotlinx.serialization.Serializable import space.kscience.dataforge.meta.Meta import space.kscience.dataforge.meta.node import space.kscience.dataforge.meta.string -import space.kscience.visionforge.ClickControl -import space.kscience.visionforge.onClick +import space.kscience.visionforge.DataControl +import space.kscience.visionforge.onSubmit /** * @param formId an id of the element in rendered DOM, this form is bound to @@ -18,7 +18,7 @@ import space.kscience.visionforge.onClick @SerialName("html.form") public class VisionOfHtmlForm( public val formId: String, -) : VisionOfHtmlControl(), ClickControl { +) : VisionOfHtmlControl(), DataControl { public var values: Meta? by properties.node() } @@ -40,12 +40,12 @@ public inline fun > C.visionOfForm( } -public fun VisionOfHtmlForm.onSubmit(scope: CoroutineScope, block: (Meta?) -> Unit): Job = onClick(scope) { block(payload) } +public fun VisionOfHtmlForm.onFormSubmit(scope: CoroutineScope, block: (Meta?) -> Unit): Job = onSubmit(scope) { block(payload) } @Serializable @SerialName("html.button") -public class VisionOfHtmlButton : VisionOfHtmlControl(), ClickControl { +public class VisionOfHtmlButton : VisionOfHtmlControl(), DataControl { public var label: String? by properties.string() } diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/useProperty.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/useProperty.kt index c396714b..07ed4bd9 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/useProperty.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/useProperty.kt @@ -2,6 +2,7 @@ package space.kscience.visionforge import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Job +import kotlinx.coroutines.flow.filter import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach import space.kscience.dataforge.meta.Meta @@ -19,12 +20,12 @@ public fun Vision.useProperty( propertyName: Name, inherit: Boolean? = null, includeStyles: Boolean? = null, - scope: CoroutineScope = manager?.context ?: error("Orphan Vision can't observe properties"), + scope: CoroutineScope = manager?.context ?: error("Orphan Vision can't observe properties. Use explicit scope."), callback: (Meta) -> Unit, ): Job { //Pass initial value. callback(properties.get(propertyName, inherit, includeStyles)) - return properties.changes.onEach { name -> + return properties.flowChanges().onEach { name -> if (name.startsWith(propertyName)) { callback(properties.get(propertyName, inherit, includeStyles)) } @@ -35,33 +36,41 @@ public fun Vision.useProperty( propertyName: String, inherit: Boolean? = null, includeStyles: Boolean? = null, - scope: CoroutineScope = manager?.context ?: error("Orphan Vision can't observe properties"), + scope: CoroutineScope = manager?.context ?: error("Orphan Vision can't observe properties. Use explicit scope."), callback: (Meta) -> Unit, ): Job = useProperty(propertyName.parseAsName(), inherit, includeStyles, scope, callback) +public fun V.useProperty( + property: KProperty1, + scope: CoroutineScope = manager?.context ?: error("Orphan Vision can't observe properties. Use explicit scope."), + callback: V.(T) -> Unit, +): Job { + //Pass initial value. + callback(property.get(this)) + return properties.flowChanges().onEach { name -> + if (name.startsWith(property.name.asName())) { + callback(property.get(this@useProperty)) + } + }.launchIn(scope) +} + +/** + * Subscribe on property updates. The subscription is bound to the given scope and canceled when the scope is canceled + */ +public fun Vision.onPropertyChange( + scope: CoroutineScope = manager?.context ?: error("Orphan Vision can't observe properties. Use explicit scope."), + callback: suspend (Name) -> Unit, +): Job = properties.flowChanges().onEach { + callback(it) +}.launchIn(scope) + /** * Observe changes to the specific property without passing the initial value. */ public fun V.onPropertyChange( property: KProperty1, - scope: CoroutineScope = manager?.context ?: error("Orphan Vision can't observe properties"), + scope: CoroutineScope = manager?.context ?: error("Orphan Vision can't observe properties. Use explicit scope."), callback: suspend V.(T) -> Unit, -): Job = properties.changes.onEach { name -> - if (name.startsWith(property.name.asName())) { - callback(property.get(this)) - } -}.launchIn(scope) - -public fun V.useProperty( - property: KProperty1, - scope: CoroutineScope = manager?.context ?: error("Orphan Vision can't observe properties"), - callback: V.(T) -> Unit, -): Job { - //Pass initial value. +): Job = properties.flowChanges().filter { it.startsWith(property.name.asName()) }.onEach { callback(property.get(this)) - return properties.changes.onEach { name -> - if (name.startsWith(property.name.asName())) { - callback(property.get(this@useProperty)) - } - }.launchIn(scope) -} \ No newline at end of file +}.launchIn(scope) \ No newline at end of file diff --git a/visionforge-core/src/commonTest/kotlin/space/kscience/visionforge/html/HtmlTagTest.kt b/visionforge-core/src/commonTest/kotlin/space/kscience/visionforge/html/HtmlTagTest.kt index 20868b96..b4cb115d 100644 --- a/visionforge-core/src/commonTest/kotlin/space/kscience/visionforge/html/HtmlTagTest.kt +++ b/visionforge-core/src/commonTest/kotlin/space/kscience/visionforge/html/HtmlTagTest.kt @@ -55,7 +55,7 @@ class HtmlTagTest { div { h2 { +"Properties" } ul { - vision.properties.own?.items?.forEach { + vision.properties.own.items.forEach { li { a { +it.key.toString() } p { +it.value.toString() } diff --git a/visionforge-core/src/commonTest/kotlin/space/kscience/visionforge/meta/VisionPropertyTest.kt b/visionforge-core/src/commonTest/kotlin/space/kscience/visionforge/meta/VisionPropertyTest.kt index e8ebe406..8b800add 100644 --- a/visionforge-core/src/commonTest/kotlin/space/kscience/visionforge/meta/VisionPropertyTest.kt +++ b/visionforge-core/src/commonTest/kotlin/space/kscience/visionforge/meta/VisionPropertyTest.kt @@ -1,11 +1,10 @@ package space.kscience.visionforge.meta import kotlinx.coroutines.CompletableDeferred -import kotlinx.coroutines.delay +import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.map -import kotlinx.coroutines.flow.take -import kotlinx.coroutines.flow.toList -import kotlinx.coroutines.launch +import kotlinx.coroutines.flow.onEach +import kotlinx.coroutines.sync.Semaphore import kotlinx.coroutines.test.runTest import space.kscience.dataforge.context.Global import space.kscience.dataforge.context.request @@ -92,7 +91,7 @@ internal class VisionPropertyTest { } @Test - fun testChildrenPropertyFlow() = runTest(timeout = 200.milliseconds) { + fun testChildrenPropertyFlow() = runTest(timeout = 500.milliseconds) { val group = Global.request(VisionManager).group { properties { @@ -109,17 +108,32 @@ internal class VisionPropertyTest { val child = group.children["child"]!! - launch { - val list = child.flowPropertyValue("test", inherit = true).take(3).map { it?.int }.toList() - assertEquals(22, list.first()) - //assertEquals(11, list[1]) //a race - assertEquals(33, list.last()) + val semaphore = Semaphore(1, 1) + + val changesFlow = child.flowPropertyValue("test", inherit = true).map { + semaphore.release() + it!!.int } - //wait for subscription to be created - delay(5) + val collectedValues = ArrayList(5) + val collectorJob = changesFlow.onEach { + collectedValues.add(it) + }.launchIn(this) + + assertEquals(22, child.properties["test", true].int) + + semaphore.acquire() child.properties.remove("test") + + assertEquals(11, child.properties["test", true].int) + + semaphore.acquire() group.properties["test"] = 33 + assertEquals(33, child.properties["test", true].int) + + semaphore.acquire() + collectorJob.cancel() + assertEquals(listOf(22, 11, 33), collectedValues) } } \ No newline at end of file diff --git a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/ElementVisionRenderer.kt b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/ElementVisionRenderer.kt index f67172e5..dc0c7941 100644 --- a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/ElementVisionRenderer.kt +++ b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/ElementVisionRenderer.kt @@ -3,17 +3,11 @@ package space.kscience.visionforge import kotlinx.dom.clear import kotlinx.html.TagConsumer import kotlinx.html.dom.append -import kotlinx.serialization.ExperimentalSerializationApi -import kotlinx.serialization.InternalSerializationApi -import kotlinx.serialization.serializerOrNull import org.w3c.dom.Element import org.w3c.dom.HTMLElement import space.kscience.dataforge.meta.Meta import space.kscience.dataforge.misc.DfType -import space.kscience.dataforge.misc.Named import space.kscience.dataforge.names.Name -import space.kscience.dataforge.names.asName -import space.kscience.dataforge.names.parseAsName import kotlin.reflect.KClass import kotlin.reflect.cast @@ -21,7 +15,7 @@ import kotlin.reflect.cast * A browser renderer for a [Vision]. */ @DfType(ElementVisionRenderer.TYPE) -public interface ElementVisionRenderer : Named { +public interface ElementVisionRenderer { /** * Give a [vision] integer rating based on this renderer capabilities. [ZERO_RATING] or negative values means that this renderer @@ -58,11 +52,6 @@ public class SingleTypeVisionRenderer( private val renderFunction: TagConsumer.(name: Name, client: VisionClient, vision: T, meta: Meta) -> Unit, ) : ElementVisionRenderer { - @OptIn(InternalSerializationApi::class, ExperimentalSerializationApi::class) - override val name: Name - get() = kClass.serializerOrNull()?.descriptor?.serialName?.parseAsName() - ?: kClass.toString().asName() - override fun rateVision(vision: Vision): Int = if (vision::class == kClass) acceptRating else ElementVisionRenderer.ZERO_RATING diff --git a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/JsVisionClient.kt b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/JsVisionClient.kt index 45af671c..db88bea4 100644 --- a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/JsVisionClient.kt +++ b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/JsVisionClient.kt @@ -21,6 +21,7 @@ import space.kscience.dataforge.meta.MetaSerializer import space.kscience.dataforge.meta.get import space.kscience.dataforge.meta.int import space.kscience.dataforge.names.Name +import space.kscience.dataforge.names.asName import space.kscience.dataforge.names.parseAsName import space.kscience.visionforge.html.VisionTagConsumer import space.kscience.visionforge.html.VisionTagConsumer.Companion.OUTPUT_CONNECT_ATTRIBUTE @@ -262,7 +263,7 @@ public class JsVisionClient : AbstractPlugin(), VisionClient { rangeVisionRenderer, formVisionRenderer, buttonVisionRenderer - ).associateByName() + ).associateBy { it.toString().asName() } } else super.content(target) public companion object : PluginFactory { @@ -321,7 +322,7 @@ public class VisionClientApplication(public val context: Context) : Application client.renderers.joinToString( prefix = "\n\t", separator = "\n\t" - ) { it.name.toString() } + ) { it.toString() } }" } val element = document.body ?: error("Document does not have a body") diff --git a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/formRenderers.kt b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/formRenderers.kt index 781fa677..67c5b95e 100644 --- a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/formRenderers.kt +++ b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/formRenderers.kt @@ -70,7 +70,7 @@ internal val formVisionRenderer: ElementVisionRenderer = event.preventDefault() val formData = FormData(form).toMeta() client.context.launch { - client.sendEvent(name, VisionClickEvent(name = name, payload = formData)) + client.sendEvent(name, VisionSubmitEvent(name = name, payload = formData)) } console.info("Sent form data: ${formData.toMap()}") false @@ -83,7 +83,7 @@ internal val buttonVisionRenderer: ElementVisionRenderer = button.subscribeToVision(vision) button.onclick = { client.context.launch { - client.sendEvent(name, VisionClickEvent(name = name)) + client.sendEvent(name, VisionSubmitEvent(name = name)) } } vision.useProperty(VisionOfHtmlButton::label) { diff --git a/visionforge-plotly/src/commonMain/kotlin/space/kscience/visionforge/plotly/VisionOfPlotly.kt b/visionforge-plotly/src/commonMain/kotlin/space/kscience/visionforge/plotly/VisionOfPlotly.kt index 19d98171..0e2a3206 100644 --- a/visionforge-plotly/src/commonMain/kotlin/space/kscience/visionforge/plotly/VisionOfPlotly.kt +++ b/visionforge-plotly/src/commonMain/kotlin/space/kscience/visionforge/plotly/VisionOfPlotly.kt @@ -8,12 +8,16 @@ import kotlinx.coroutines.launch import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable import kotlinx.serialization.Transient -import space.kscience.dataforge.meta.* +import space.kscience.dataforge.meta.MutableMeta +import space.kscience.dataforge.meta.MutableMetaSerializer +import space.kscience.dataforge.meta.ObservableMeta +import space.kscience.dataforge.meta.asObservable import space.kscience.dataforge.meta.descriptors.MetaDescriptor import space.kscience.dataforge.names.Name import space.kscience.plotly.Plot import space.kscience.plotly.Plotly import space.kscience.plotly.PlotlyConfig +import space.kscience.visionforge.AbstractVisionProperties import space.kscience.visionforge.MutableVisionProperties import space.kscience.visionforge.Vision import space.kscience.visionforge.VisionBuilder @@ -32,32 +36,9 @@ public class VisionOfPlotly private constructor( override var parent: Vision? = null @Transient - override val properties: MutableVisionProperties = object : MutableVisionProperties { - override fun set(name: Name, node: Meta?, notify: Boolean) { - meta[name] = node - } + override val properties: MutableVisionProperties = object : AbstractVisionProperties(this, meta) { - override fun setValue(name: Name, value: Value?, notify: Boolean) { - meta.setValue(name, value) - } - - override val own: Meta get() = meta - - override val descriptor: MetaDescriptor? get() = this@VisionOfPlotly.descriptor - - override fun get( - name: Name, - inherit: Boolean?, - includeStyles: Boolean?, - ): MutableMeta = meta[name] ?: MutableMeta() - - override fun getValue( - name: Name, - inherit: Boolean?, - includeStyles: Boolean?, - ): Value? = meta.getValue(name) - - override val changes: Flow = if (meta is ObservableMeta) { + override fun flowChanges(): Flow = if (meta is ObservableMeta) { callbackFlow { meta.onChange(this) { launch { @@ -78,7 +59,7 @@ public class VisionOfPlotly private constructor( } - override val descriptor: MetaDescriptor? = null // TODO add descriptor for Plot + override val descriptor: MetaDescriptor = Plot.descriptor } public fun Plot.asVision(): VisionOfPlotly = VisionOfPlotly(this) diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Composite.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Composite.kt index 3ae6a681..76556860 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Composite.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Composite.kt @@ -2,6 +2,7 @@ package space.kscience.visionforge.solid import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable +import space.kscience.dataforge.meta.isEmpty import space.kscience.dataforge.names.Name import space.kscience.visionforge.MutableVisionContainer import space.kscience.visionforge.VisionBuilder @@ -55,7 +56,7 @@ public fun SolidGroup.smartComposite( @VisionBuilder builder: SolidGroup.() -> Unit, ): Solid = if (type == CompositeType.GROUP) { val group = SolidGroup().apply(builder) - if (name == null && group.properties.own == null) { + if (name == null && group.properties.own.isEmpty()) { //append directly to group if no properties are defined group.items.forEach { (_, value) -> value.parent = null diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solid.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solid.kt index db2c0948..c1e16daa 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solid.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Solid.kt @@ -177,7 +177,7 @@ internal fun float32Vector( ): ReadWriteProperty = object : ReadWriteProperty { override fun getValue(thisRef: Solid, property: KProperty<*>): Float32Vector3D? { - val item = thisRef.properties.own?.get(name) ?: return null + val item = thisRef.properties.own[name] ?: return null //using dynamic property accessor because values could change return object : Float32Vector3D { override val x: Float get() = item[X_KEY]?.float ?: defaultX diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidReference.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidReference.kt index b832865c..ec13823e 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidReference.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidReference.kt @@ -6,9 +6,7 @@ import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.emptyFlow import kotlinx.coroutines.flow.filter import kotlinx.coroutines.launch -import kotlinx.serialization.SerialName -import kotlinx.serialization.Serializable -import kotlinx.serialization.Transient +import kotlinx.serialization.* import space.kscience.dataforge.meta.* import space.kscience.dataforge.meta.descriptors.MetaDescriptor import space.kscience.dataforge.meta.descriptors.get @@ -51,21 +49,19 @@ public class SolidReference( } override val descriptor: MetaDescriptor get() = prototype.descriptor + @SerialName("properties") - private var propertiesInternal: MutableMeta? = null + @OptIn(ExperimentalSerializationApi::class) + @EncodeDefault(EncodeDefault.Mode.NEVER) + private val propertiesInternal: MutableMeta = MutableMeta() override val properties: MutableVisionProperties by lazy { - object : AbstractVisionProperties(this) { - override var properties: MutableMeta? - get() = propertiesInternal - set(value) { - propertiesInternal = value - } + object : AbstractVisionProperties(this, propertiesInternal) { override fun getValue(name: Name, inherit: Boolean?, includeStyles: Boolean?): Value? { if (name == Vision.STYLE_KEY) { return buildList { - properties?.getValue(Vision.STYLE_KEY)?.list?.forEach { + own.getValue(Vision.STYLE_KEY)?.list?.forEach { add(it) } prototype.styles.forEach { @@ -74,18 +70,18 @@ public class SolidReference( }.distinct().asValue() } //1. resolve own properties - properties?.getValue(name)?.let { return it } + own.getValue(name)?.let { return it } val descriptor = descriptor?.get(name) val inheritFlag = inherit ?: descriptor?.inherited ?: false val stylesFlag = includeStyles ?: descriptor?.usesStyles ?: true //2. Resolve prototype onw properties - prototype.properties.own?.getValue(name)?.let { return it } + prototype.properties.own.getValue(name)?.let { return it } if (stylesFlag) { //3. own styles - own?.getValue(Vision.STYLE_KEY)?.list?.forEach { styleName -> + own.getValue(Vision.STYLE_KEY)?.list?.forEach { styleName -> getStyle(styleName.string)?.getValue(name)?.let { return it } } //4. prototype styles @@ -178,7 +174,8 @@ internal class SolidReferenceChild( own.setValue(name, value) } - override val changes: Flow get() = owner.properties.changes.filter { it.startsWith(childToken(childName)) } + override fun flowChanges(): Flow = + owner.properties.flowChanges().filter { it.startsWith(childToken(childName)) } override fun invalidate(propertyName: Name) { owner.properties.invalidate(childPropertyName(childName, propertyName)) diff --git a/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/SolidPropertyTest.kt b/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/SolidPropertyTest.kt index 7b559ab7..a68e7daf 100644 --- a/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/SolidPropertyTest.kt +++ b/visionforge-solid/src/commonTest/kotlin/space/kscience/visionforge/solid/SolidPropertyTest.kt @@ -1,18 +1,17 @@ package space.kscience.visionforge.solid -import kotlinx.coroutines.CompletableDeferred import kotlinx.coroutines.ExperimentalCoroutinesApi -import kotlinx.coroutines.delay -import kotlinx.coroutines.test.runTest import space.kscience.dataforge.meta.getValue import space.kscience.dataforge.meta.int import space.kscience.dataforge.meta.set import space.kscience.dataforge.meta.string import space.kscience.dataforge.names.asName -import space.kscience.visionforge.* +import space.kscience.visionforge.getValue +import space.kscience.visionforge.styleSheet +import space.kscience.visionforge.styles +import space.kscience.visionforge.useStyle import kotlin.test.Test import kotlin.test.assertEquals -import kotlin.time.Duration.Companion.milliseconds @OptIn(ExperimentalCoroutinesApi::class) @Suppress("UNUSED_VARIABLE") @@ -29,25 +28,14 @@ class SolidPropertyTest { } @Test - fun testColorUpdate() = runTest(timeout = 200.milliseconds) { + fun testColorUpdate() { val box = Box(10.0f, 10.0f, 10.0f) - val c = CompletableDeferred() - - - val subscription = box.onPropertyChange(this) { key -> - if (key == SolidMaterial.MATERIAL_COLOR_KEY) { - c.complete(box.color.string) - } - } - delay(5) - box.material { color("pink") } - assertEquals("pink", c.await()) - subscription.cancel() + assertEquals("pink", box.properties[SolidMaterial.MATERIAL_COLOR_KEY].string) } @Test diff --git a/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/ThreeMaterials.kt b/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/ThreeMaterials.kt index 34cbbde0..3c860111 100644 --- a/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/ThreeMaterials.kt +++ b/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/ThreeMaterials.kt @@ -133,7 +133,7 @@ internal var Material.cached: Boolean public fun Mesh.setMaterial(vision: Vision) { if ( - vision.properties.own?.get(SolidMaterial.MATERIAL_KEY) == null + vision.properties.own[SolidMaterial.MATERIAL_KEY] == null && vision.getStyleNodes(SolidMaterial.MATERIAL_KEY).isEmpty() ) { //if this is a reference, use material of the prototype diff --git a/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/ThreePlugin.kt b/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/ThreePlugin.kt index 7f7cc29b..5d3fbdc3 100644 --- a/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/ThreePlugin.kt +++ b/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/ThreePlugin.kt @@ -14,7 +14,6 @@ import space.kscience.visionforge.compose.ComposeVisionRenderer import space.kscience.visionforge.solid.* import space.kscience.visionforge.solid.specifications.Canvas3DOptions import space.kscience.visionforge.solid.three.compose.ThreeView -import space.kscience.visionforge.solid.three.set import three.core.Object3D import kotlin.collections.set import kotlin.reflect.KClass @@ -85,7 +84,7 @@ public class ThreePlugin : AbstractPlugin(), ComposeVisionRenderer { updatePosition(vision) //obj.onChildrenChange() if (observe) { - vision.properties.changes.onEach { name -> + vision.properties.flowChanges().onEach { name -> if ( name.startsWith(Solid.POSITION_KEY) || name.startsWith(Solid.ROTATION_KEY) || diff --git a/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/compose/ThreeView.kt b/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/compose/ThreeView.kt index 2ea1d930..a9ba1146 100644 --- a/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/compose/ThreeView.kt +++ b/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/compose/ThreeView.kt @@ -138,7 +138,7 @@ public fun ThreeView( scope = context, rootMeta = vision.properties.root(), getPropertyState = { name -> - if (vision.properties.own?.get(name) != null) { + if (vision.properties.own[name] != null) { EditorPropertyState.Defined } else if (vision.properties.root()[name] != null) { // TODO differentiate @@ -148,7 +148,7 @@ public fun ThreeView( } }, name = Name.EMPTY, - updates = vision.properties.changes, + updates = vision.properties.flowChanges(), rootDescriptor = vision.descriptor ) vision.styles.takeIf { it.isNotEmpty() }?.let { styles -> From 38d6a9c4192f67d2e708d890857905a8ce75d5f5 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Mon, 12 Feb 2024 16:44:15 +0300 Subject: [PATCH 34/41] rename modules --- .../visionforge/gdml/demo/GdmlJsDemoApp.kt | 2 +- .../src/jsMain/kotlin/JsPlaygroundApp.kt | 4 +- .../src/jsMain/kotlin/gravityDemo.kt | 4 +- .../ru/mipt/npm/muon/monitor/MMDemoApp.kt | 2 +- settings.gradle.kts | 8 +- ui/README.md | 4 - ui/bootstrap/README.md | 4 - ui/bootstrap/build.gradle.kts | 19 -- .../visionforge/bootstrap/bootstrap.kt | 121 -------- .../visionforge/bootstrap/outputConfig.kt | 77 ----- .../visionforge/bootstrap/reactBootstrap.kt | 181 ------------ .../visionforge/bootstrap/tabComponent.kt | 86 ------ .../visionforge/bootstrap/threeControls.kt | 80 ----- .../bootstrap/visionPropertyEditor.kt | 71 ----- .../jsMain/resources/css/custom-bootstrap.css | 56 ---- ui/react/README.md | 4 - ui/react/build.gradle.kts | 16 - .../kscience/visionforge/react/MetaViewer.kt | 149 ---------- .../visionforge/react/MultiSelectChooser.kt | 38 --- .../visionforge/react/PropertyEditor.kt | 277 ------------------ .../visionforge/react/RangeValueChooser.kt | 78 ----- .../visionforge/react/ThreeCanvasComponent.kt | 55 ---- .../kscience/visionforge/react/TreeStyles.kt | 69 ----- .../kscience/visionforge/react/VisionTree.kt | 126 -------- .../kscience/visionforge/react/createRoot.kt | 17 -- .../space/kscience/visionforge/react/ext.kt | 10 - .../kscience/visionforge/react/layout.kt | 31 -- .../visionforge/react/valueChooser.kt | 175 ----------- ui/ring/README.md | 4 - ui/ring/build.gradle.kts | 25 -- ui/ring/src/jsMain/kotlin/ringui/Loader.kt | 20 -- .../src/jsMain/kotlin/ringui/LoaderScreen.kt | 16 - .../ThreeViewWithControls.kt | 212 -------------- .../ThreeWithControlsPlugin.kt | 52 ---- .../ringPropertyEditor.kt | 88 ------ .../ringThreeControls.kt | 131 --------- ui/ring/webpack.config.d/01.ring.js | 3 - .../ComposeVisionRenderer.kt | 2 +- .../{compose => html}/MetaViewer.kt | 2 +- .../{compose => html}/NameCrumbs.kt | 2 +- .../{compose => html}/PropertyEditor.kt | 2 +- .../visionforge/{compose => html}/Tabs.kt | 2 +- .../{compose => html}/TreeStyles.kt | 2 +- .../{compose => html}/VisionForgeStyles.kt | 2 +- .../{compose => html}/VisionTree.kt | 2 +- .../{compose => html}/bootstrap.kt | 2 +- .../{compose => html}/composeVision.kt | 2 +- .../visionforge/{compose => html}/css.kt | 2 +- .../visionforge/{compose => html}/layouts.kt | 2 +- .../{compose => html}/valueChooser.kt | 2 +- visionforge-compose-mpp/build.gradle.kts | 24 ++ .../visionforge/solid/three/ThreePlugin.kt | 2 +- .../solid/three/compose/ThreeControls.kt | 2 +- .../solid/three/compose/ThreeView.kt | 2 +- 54 files changed, 48 insertions(+), 2323 deletions(-) delete mode 100644 ui/README.md delete mode 100644 ui/bootstrap/README.md delete mode 100644 ui/bootstrap/build.gradle.kts delete mode 100644 ui/bootstrap/src/jsMain/kotlin/space/kscience/visionforge/bootstrap/bootstrap.kt delete mode 100644 ui/bootstrap/src/jsMain/kotlin/space/kscience/visionforge/bootstrap/outputConfig.kt delete mode 100644 ui/bootstrap/src/jsMain/kotlin/space/kscience/visionforge/bootstrap/reactBootstrap.kt delete mode 100644 ui/bootstrap/src/jsMain/kotlin/space/kscience/visionforge/bootstrap/tabComponent.kt delete mode 100644 ui/bootstrap/src/jsMain/kotlin/space/kscience/visionforge/bootstrap/threeControls.kt delete mode 100644 ui/bootstrap/src/jsMain/kotlin/space/kscience/visionforge/bootstrap/visionPropertyEditor.kt delete mode 100644 ui/bootstrap/src/jsMain/resources/css/custom-bootstrap.css delete mode 100644 ui/react/README.md delete mode 100644 ui/react/build.gradle.kts delete mode 100644 ui/react/src/jsMain/kotlin/space/kscience/visionforge/react/MetaViewer.kt delete mode 100644 ui/react/src/jsMain/kotlin/space/kscience/visionforge/react/MultiSelectChooser.kt delete mode 100644 ui/react/src/jsMain/kotlin/space/kscience/visionforge/react/PropertyEditor.kt delete mode 100644 ui/react/src/jsMain/kotlin/space/kscience/visionforge/react/RangeValueChooser.kt delete mode 100644 ui/react/src/jsMain/kotlin/space/kscience/visionforge/react/ThreeCanvasComponent.kt delete mode 100644 ui/react/src/jsMain/kotlin/space/kscience/visionforge/react/TreeStyles.kt delete mode 100644 ui/react/src/jsMain/kotlin/space/kscience/visionforge/react/VisionTree.kt delete mode 100644 ui/react/src/jsMain/kotlin/space/kscience/visionforge/react/createRoot.kt delete mode 100644 ui/react/src/jsMain/kotlin/space/kscience/visionforge/react/ext.kt delete mode 100644 ui/react/src/jsMain/kotlin/space/kscience/visionforge/react/layout.kt delete mode 100644 ui/react/src/jsMain/kotlin/space/kscience/visionforge/react/valueChooser.kt delete mode 100644 ui/ring/README.md delete mode 100644 ui/ring/build.gradle.kts delete mode 100644 ui/ring/src/jsMain/kotlin/ringui/Loader.kt delete mode 100644 ui/ring/src/jsMain/kotlin/ringui/LoaderScreen.kt delete mode 100644 ui/ring/src/jsMain/kotlin/space.kscience.visionforge.ring/ThreeViewWithControls.kt delete mode 100644 ui/ring/src/jsMain/kotlin/space.kscience.visionforge.ring/ThreeWithControlsPlugin.kt delete mode 100644 ui/ring/src/jsMain/kotlin/space.kscience.visionforge.ring/ringPropertyEditor.kt delete mode 100644 ui/ring/src/jsMain/kotlin/space.kscience.visionforge.ring/ringThreeControls.kt delete mode 100644 ui/ring/webpack.config.d/01.ring.js rename visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/{compose => html}/ComposeVisionRenderer.kt (95%) rename visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/{compose => html}/MetaViewer.kt (98%) rename visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/{compose => html}/NameCrumbs.kt (96%) rename visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/{compose => html}/PropertyEditor.kt (99%) rename visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/{compose => html}/Tabs.kt (98%) rename visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/{compose => html}/TreeStyles.kt (98%) rename visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/{compose => html}/VisionForgeStyles.kt (69%) rename visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/{compose => html}/VisionTree.kt (98%) rename visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/{compose => html}/bootstrap.kt (74%) rename visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/{compose => html}/composeVision.kt (97%) rename visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/{compose => html}/css.kt (95%) rename visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/{compose => html}/layouts.kt (96%) rename visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/{compose => html}/valueChooser.kt (99%) create mode 100644 visionforge-compose-mpp/build.gradle.kts diff --git a/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GdmlJsDemoApp.kt b/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GdmlJsDemoApp.kt index e60f1dec..5add1d6f 100644 --- a/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GdmlJsDemoApp.kt +++ b/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GdmlJsDemoApp.kt @@ -8,8 +8,8 @@ import space.kscience.dataforge.context.Context import space.kscience.gdml.GdmlShowCase import space.kscience.visionforge.Application import space.kscience.visionforge.Colors -import space.kscience.visionforge.compose.TreeStyles import space.kscience.visionforge.gdml.toVision +import space.kscience.visionforge.html.TreeStyles import space.kscience.visionforge.solid.ambientLight import space.kscience.visionforge.solid.invoke import space.kscience.visionforge.solid.three.ThreePlugin diff --git a/demo/js-playground/src/jsMain/kotlin/JsPlaygroundApp.kt b/demo/js-playground/src/jsMain/kotlin/JsPlaygroundApp.kt index 8516736c..71de963a 100644 --- a/demo/js-playground/src/jsMain/kotlin/JsPlaygroundApp.kt +++ b/demo/js-playground/src/jsMain/kotlin/JsPlaygroundApp.kt @@ -7,8 +7,8 @@ import space.kscience.plotly.models.Trace import space.kscience.plotly.scatter import space.kscience.visionforge.Application import space.kscience.visionforge.Colors -import space.kscience.visionforge.compose.Tabs -import space.kscience.visionforge.compose.TreeStyles +import space.kscience.visionforge.html.Tabs +import space.kscience.visionforge.html.TreeStyles import space.kscience.visionforge.markup.MarkupPlugin import space.kscience.visionforge.plotly.PlotlyPlugin import space.kscience.visionforge.solid.* diff --git a/demo/js-playground/src/jsMain/kotlin/gravityDemo.kt b/demo/js-playground/src/jsMain/kotlin/gravityDemo.kt index 5cff2864..9a5089fa 100644 --- a/demo/js-playground/src/jsMain/kotlin/gravityDemo.kt +++ b/demo/js-playground/src/jsMain/kotlin/gravityDemo.kt @@ -15,8 +15,8 @@ import space.kscience.plotly.Plot import space.kscience.plotly.layout import space.kscience.plotly.models.Trace import space.kscience.visionforge.Colors -import space.kscience.visionforge.compose.Vision -import space.kscience.visionforge.compose.zIndex +import space.kscience.visionforge.html.Vision +import space.kscience.visionforge.html.zIndex import space.kscience.visionforge.markup.VisionOfMarkup import space.kscience.visionforge.plotly.asVision import space.kscience.visionforge.solid.* diff --git a/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMDemoApp.kt b/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMDemoApp.kt index d26bc052..d117d91d 100644 --- a/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMDemoApp.kt +++ b/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMDemoApp.kt @@ -7,7 +7,7 @@ import space.kscience.dataforge.context.Context import space.kscience.dataforge.context.request import space.kscience.visionforge.Application import space.kscience.visionforge.VisionManager -import space.kscience.visionforge.compose.VisionForgeStyles +import space.kscience.visionforge.html.VisionForgeStyles import space.kscience.visionforge.solid.three.ThreePlugin import space.kscience.visionforge.startApplication diff --git a/settings.gradle.kts b/settings.gradle.kts index 6ccab6fa..8f4e56b3 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -40,13 +40,9 @@ dependencyResolutionManagement { } include( -// ":ui", -// ":ui:react", -// ":ui:ring", -// ":ui:material", -// ":ui:bootstrap", - ":visionforge-compose-html", ":visionforge-core", + ":visionforge-compose-html", + ":visionforge-compose-mpp", ":visionforge-solid", // ":visionforge-fx", ":visionforge-threejs", diff --git a/ui/README.md b/ui/README.md deleted file mode 100644 index ec08d176..00000000 --- a/ui/README.md +++ /dev/null @@ -1,4 +0,0 @@ -# Module ui - - - diff --git a/ui/bootstrap/README.md b/ui/bootstrap/README.md deleted file mode 100644 index 0cc57002..00000000 --- a/ui/bootstrap/README.md +++ /dev/null @@ -1,4 +0,0 @@ -# Module bootstrap - - - diff --git a/ui/bootstrap/build.gradle.kts b/ui/bootstrap/build.gradle.kts deleted file mode 100644 index f50ae119..00000000 --- a/ui/bootstrap/build.gradle.kts +++ /dev/null @@ -1,19 +0,0 @@ -plugins { - id("space.kscience.gradle.mpp") -} - -val dataforgeVersion: String by rootProject.extra - -kscience{ - js() - jsMain{ - dependencies { - api(project(":visionforge-solid")) - api(project(":ui:react")) - implementation(npm("file-saver", "2.0.2")) - implementation(npm("bootstrap","4.6.0")) - implementation(npm("jquery","3.5.1")) - implementation(npm("popper.js","1.16.1")) - } - } -} \ No newline at end of file diff --git a/ui/bootstrap/src/jsMain/kotlin/space/kscience/visionforge/bootstrap/bootstrap.kt b/ui/bootstrap/src/jsMain/kotlin/space/kscience/visionforge/bootstrap/bootstrap.kt deleted file mode 100644 index c0171cb7..00000000 --- a/ui/bootstrap/src/jsMain/kotlin/space/kscience/visionforge/bootstrap/bootstrap.kt +++ /dev/null @@ -1,121 +0,0 @@ -package space.kscience.visionforge.bootstrap - -public fun useBootstrap(){ - kotlinext.js.require("bootstrap/dist/css/bootstrap.min.css") - kotlinext.js.require("bootstrap") -} - -//public inline fun TagConsumer.card(title: String, crossinline block: TagConsumer.() -> Unit) { -// div("card w-100") { -// div("card-body") { -// h3(classes = "card-title") { +title } -// block() -// } -// } -//} - -//public typealias SectionsBuilder = MutableList Unit>> -// -//public fun SectionsBuilder.entry(title: String, builder: DIV.() -> Unit) { -// add(title to builder) -//} - - -//public fun TagConsumer.accordion(id: String, elements: List Unit>>) { -// div("container-fluid") { -// div("accordion") { -// this.id = id -// elements.forEachIndexed { index, (title, builder) -> -// val headerID = "${id}-${index}-heading" -// val collapseID = "${id}-${index}-collapse" -// div("card") { -// div("card-header") { -// this.id = headerID -// h5("mb-0") { -// button(classes = "btn btn-link collapsed", type = ButtonType.button) { -// attributes["data-toggle"] = "collapse" -// attributes["data-target"] = "#$collapseID" -// attributes["aria-expanded"] = "false" -// attributes["aria-controls"] = collapseID -// +title -// } -// } -// } -// div("collapse") { -// this.id = collapseID -// attributes["aria-labelledby"] = headerID -// attributes["data-parent"] = "#$id" -// div("card-body", block = builder) -// } -// } -// } -// } -// } -//} - - -//public fun TagConsumer.accordion(id: String, builder: AccordionBuilder.() -> Unit) { -// val list = ArrayList Unit>>().apply(builder) -// accordion(id, list) -//} - -//public fun Element.displayCanvasControls(canvas: ThreeCanvas, block: TagConsumer.() -> Unit = {}) { -// clear() -// append { -// accordion("controls") { -// entry("Settings") { -// div("row") { -// div("col-2") { -// label("checkbox-inline") { -// input(type = InputType.checkBox) { -// checked = canvas.axes.visible -// onChangeFunction = { -// canvas.axes.visible = checked -// } -// } -// +"Axes" -// } -// } -// div("col-1") { -// button { -// +"Export" -// onClickFunction = { -// val json = (canvas.content as? SolidGroup)?.let { group -> -// val visionManager = canvas.context.plugins.fetch(SolidManager).visionManager -// visionManager.encodeToString(group) -// } -// if (json != null) { -// saveData(it, "object.json", "text/json") { -// json -// } -// } -// } -// } -// } -// } -// } -// entry("Layers") { -// div("row") { -// (0..11).forEach { layer -> -// div("col-1") { -// label { +layer.toString() } -// input(type = InputType.checkBox) { -// if (layer == 0) { -// checked = true -// } -// onChangeFunction = { -// if (checked) { -// canvas.camera.layers.enable(layer) -// } else { -// canvas.camera.layers.disable(layer) -// } -// } -// } -// } -// } -// } -// } -// } -// block() -// } -//} \ No newline at end of file diff --git a/ui/bootstrap/src/jsMain/kotlin/space/kscience/visionforge/bootstrap/outputConfig.kt b/ui/bootstrap/src/jsMain/kotlin/space/kscience/visionforge/bootstrap/outputConfig.kt deleted file mode 100644 index f42235a8..00000000 --- a/ui/bootstrap/src/jsMain/kotlin/space/kscience/visionforge/bootstrap/outputConfig.kt +++ /dev/null @@ -1,77 +0,0 @@ -package space.kscience.visionforge.bootstrap - -import kotlinx.coroutines.DelicateCoroutinesApi -import kotlinx.coroutines.GlobalScope -import kotlinx.css.* -import kotlinx.html.js.onClickFunction -import org.w3c.dom.events.Event -import org.w3c.files.Blob -import org.w3c.files.BlobPropertyBag -import react.FC -import react.Props -import react.RBuilder -import react.dom.attrs -import react.dom.button -import react.fc -import space.kscience.visionforge.Vision -import space.kscience.visionforge.encodeToString -import space.kscience.visionforge.react.flexColumn -import space.kscience.visionforge.react.flexRow -import space.kscience.visionforge.react.propertyEditor -import space.kscience.visionforge.solid.specifications.Canvas3DOptions -import styled.css - -private fun saveData(event: Event, fileName: String, mimeType: String = "text/plain", dataBuilder: () -> String) { - event.stopPropagation(); - event.preventDefault(); - - val fileSaver = kotlinext.js.require("file-saver") - val blob = Blob(arrayOf(dataBuilder()), BlobPropertyBag("$mimeType;charset=utf-8")) - fileSaver.saveAs(blob, fileName) -} - -public fun RBuilder.canvasControls(canvasOptions: Canvas3DOptions, vision: Vision?) { - child(CanvasControls) { - attrs { - this.canvasOptions = canvasOptions - this.vision = vision - } - } -} - -public external interface CanvasControlsProps : Props { - public var canvasOptions: Canvas3DOptions - public var vision: Vision? -} - - -public val CanvasControls: FC = fc("CanvasControls") { props -> - flexColumn { - flexRow { - css { - border = Border(1.px, BorderStyle.solid, Color.blue) - padding = Padding(4.px) - } - props.vision?.let { vision -> - button { - +"Export" - attrs { - onClickFunction = { - val json = vision.encodeToString() - saveData(it, "object.json", "text/json") { - json - } - } - } - } - } - } - @OptIn(DelicateCoroutinesApi::class) - propertyEditor( - scope = props.vision?.manager?.context ?: GlobalScope, - properties = props.canvasOptions.meta, - descriptor = Canvas3DOptions.descriptor, - expanded = false - ) - } -} \ No newline at end of file diff --git a/ui/bootstrap/src/jsMain/kotlin/space/kscience/visionforge/bootstrap/reactBootstrap.kt b/ui/bootstrap/src/jsMain/kotlin/space/kscience/visionforge/bootstrap/reactBootstrap.kt deleted file mode 100644 index b37637fe..00000000 --- a/ui/bootstrap/src/jsMain/kotlin/space/kscience/visionforge/bootstrap/reactBootstrap.kt +++ /dev/null @@ -1,181 +0,0 @@ -package space.kscience.visionforge.bootstrap - -import kotlinx.html.ButtonType -import kotlinx.html.DIV -import kotlinx.html.id -import kotlinx.html.js.onClickFunction -import react.RBuilder -import react.dom.* -import space.kscience.dataforge.names.Name -import space.kscience.dataforge.names.NameToken -import space.kscience.dataforge.names.length -import styled.StyledDOMBuilder -import styled.css -import styled.styledDiv -import styled.styledNav - - -public inline fun RBuilder.card(title: String, crossinline block: StyledDOMBuilder
.() -> Unit): Unit = - styledDiv { - css { - +"card" - +"w-100" - } - styledDiv { - css { - +"card-body" - } - h3(classes = "card-title") { - +title - } - block() - } - } - -public fun RBuilder.accordion( - id: String, - elements: List.() -> Unit>>, -): Unit = styledDiv { - css { - +"accordion" - //+"p-1" - } - attrs { - this.id = id - } - elements.forEachIndexed { index, (title, builder) -> - val headerID = "${id}-${index}-heading" - val collapseID = "${id}-${index}-collapse" - div("card p-0 m-0") { - div("card-header") { - attrs { - this.id = headerID - } - h5("mb-0") { - button(classes = "btn btn-link collapsed", type = ButtonType.button) { - attrs { - attributes["data-toggle"] = "collapse" - attributes["data-target"] = "#$collapseID" - attributes["aria-expanded"] = "false" - attributes["aria-controls"] = collapseID - } - +title - } - } - } - div("collapse") { - attrs { - this.id = collapseID - attributes["aria-labelledby"] = headerID - attributes["data-parent"] = "#$id" - } - styledDiv { - css { - +"card-body" - } - builder() - } - } - } - } -} - - -public fun RBuilder.nameCrumbs(name: Name?, rootTitle: String, link: (Name) -> Unit): Unit = styledNav { - css { - +"p-0" - } - attrs { - attributes["aria-label"] = "breadcrumb" - } - ol("breadcrumb") { - li("breadcrumb-item") { - button(classes = "btn btn-link p-0") { - +rootTitle - attrs { - onClickFunction = { - link(Name.EMPTY) - } - } - } - } - if (name != null) { - val tokens = ArrayList(name.length) - name.tokens.forEach { token -> - tokens.add(token) - val fullName = Name(tokens.toList()) - li("breadcrumb-item") { - button(classes = "btn btn-link p-0") { - +token.toString() - attrs { - onClickFunction = { - console.log("Selected = $fullName") - link(fullName) - } - } - } - } - } - } - } -} - -public typealias RSectionsBuilder = MutableList.() -> Unit>> - -public fun RSectionsBuilder.entry(title: String, builder: StyledDOMBuilder
.() -> Unit) { - add(title to builder) -} - -public fun RBuilder.accordion(id: String, builder: RSectionsBuilder.() -> Unit): Unit { - val list = ArrayList.() -> Unit>>().apply(builder) - accordion(id, list) -} - -public enum class ContainerSize(public val suffix: String) { - DEFAULT(""), - SM("-sm"), - MD("-md"), - LG("-lg"), - XL("-xl"), - FLUID("-fluid") -} - -public inline fun RBuilder.container( - size: ContainerSize = ContainerSize.FLUID, - block: StyledDOMBuilder
.() -> Unit, -): Unit = styledDiv { - css { - classes.add("container${size.suffix}") - } - block() -} - - -public enum class GridMaxSize(public val suffix: String) { - NONE(""), - SM("-sm"), - MD("-md"), - LG("-lg"), - XL("-xl") -} - -public inline fun RBuilder.gridColumn( - weight: Int? = null, - maxSize: GridMaxSize = GridMaxSize.NONE, - block: StyledDOMBuilder
.() -> Unit, -): Unit = styledDiv { - val weightSuffix = weight?.let { "-$it" } ?: "" - css { - classes.add("col${maxSize.suffix}$weightSuffix") - } - block() -} - -public inline fun RBuilder.gridRow( - block: StyledDOMBuilder
.() -> Unit, -): Unit = styledDiv { - css { - classes.add("row") - } - block() -} \ No newline at end of file diff --git a/ui/bootstrap/src/jsMain/kotlin/space/kscience/visionforge/bootstrap/tabComponent.kt b/ui/bootstrap/src/jsMain/kotlin/space/kscience/visionforge/bootstrap/tabComponent.kt deleted file mode 100644 index 23b5071b..00000000 --- a/ui/bootstrap/src/jsMain/kotlin/space/kscience/visionforge/bootstrap/tabComponent.kt +++ /dev/null @@ -1,86 +0,0 @@ -package space.kscience.visionforge.bootstrap - -import kotlinx.html.DIV -import kotlinx.html.classes -import kotlinx.html.js.onClickFunction -import react.* -import react.dom.attrs -import react.dom.button -import react.dom.li -import react.dom.ul -import space.kscience.visionforge.react.flexColumn -import styled.StyledDOMBuilder -import styled.styledDiv - -public external interface TabProps : PropsWithChildren { - public var id: String - public var title: String? -} - -@JsExport -public val Tab: FC = fc { props -> - props.children() -} - -public external interface TabPaneProps : PropsWithChildren { - public var activeTab: String? -} - -@JsExport -public val TabPane: FC = fc("TabPane") { props -> - var activeTab: String? by useState(props.activeTab) - - val children: Array?> = Children.map(props.children) { - it.asElementOrNull() - } ?: emptyArray() - - val childrenProps = children.mapNotNull { - it?.props?.unsafeCast() - } - - flexColumn { - ul("nav nav-tabs") { - childrenProps.forEach { cp -> - li("nav-item") { - button(classes = "nav-link") { - +(cp.title ?: cp.id) - attrs { - if (cp.id == activeTab) { - classes = classes + "active" - } - onClickFunction = { - activeTab = cp.id - } - } - } - } - } - } - children.find { (it?.props?.unsafeCast())?.id == activeTab }?.let { - child(it) - } - } -} - -public class TabBuilder(internal val parentBuilder: RBuilder) { - public fun tab(id: String, title: String? = null, builder: StyledDOMBuilder
.() -> Unit) { - parentBuilder.child(Tab) { - attrs { - this.id = id - this.title = title - } - styledDiv { - builder() - } - } - } -} - -public inline fun RBuilder.tabPane(activeTab: String? = null, crossinline builder: TabBuilder.() -> Unit) { - child(TabPane) { - attrs { - this.activeTab = activeTab - } - TabBuilder(this).builder() - } -} diff --git a/ui/bootstrap/src/jsMain/kotlin/space/kscience/visionforge/bootstrap/threeControls.kt b/ui/bootstrap/src/jsMain/kotlin/space/kscience/visionforge/bootstrap/threeControls.kt deleted file mode 100644 index 0d5578a7..00000000 --- a/ui/bootstrap/src/jsMain/kotlin/space/kscience/visionforge/bootstrap/threeControls.kt +++ /dev/null @@ -1,80 +0,0 @@ -package space.kscience.visionforge.bootstrap - -import kotlinx.css.* -import react.FC -import react.PropsWithChildren -import react.RBuilder -import react.dom.h2 -import react.fc -import space.kscience.dataforge.names.Name -import space.kscience.dataforge.names.isEmpty -import space.kscience.visionforge.Vision -import space.kscience.visionforge.react.visionTree -import space.kscience.visionforge.solid.SolidGroup -import space.kscience.visionforge.solid.specifications.Canvas3DOptions -import styled.css -import styled.styledDiv - -public external interface ThreeControlsProps : PropsWithChildren { - public var canvasOptions: Canvas3DOptions - public var vision: Vision? - public var selected: Name? - public var onSelect: (Name) -> Unit -} - -@JsExport -public val ThreeControls: FC = fc { props -> - tabPane(if (props.selected != null) "Properties" else null) { - tab("Canvas") { - card("Canvas configuration") { - canvasControls(props.canvasOptions, props.vision) - } - } - tab("Tree") { - css { - border = Border(1.px, BorderStyle.solid, Color.lightGray) - padding = Padding(10.px) - } - h2 { +"Object tree" } - styledDiv { - css { - flex = Flex(1.0, 1.0, FlexBasis.inherit) - } - props.vision?.let { - visionTree(it, props.selected, props.onSelect) - } - } - } - tab("Properties") { - props.selected.let { selected -> - val selectedObject: Vision? = when { - selected == null -> null - selected.isEmpty() -> props.vision - else -> (props.vision as? SolidGroup)?.get(selected) - } - if (selectedObject != null) { - visionPropertyEditor(selectedObject, key = selected) - } - } - } - this.parentBuilder.run { - props.children() - } - } -} - -public fun RBuilder.threeControls( - canvasOptions: Canvas3DOptions, - vision: Vision?, - selected: Name?, - onSelect: (Name) -> Unit = {}, - builder: TabBuilder.() -> Unit = {}, -): Unit = child(ThreeControls) { - attrs { - this.canvasOptions = canvasOptions - this.vision = vision - this.selected = selected - this.onSelect = onSelect - } - TabBuilder(this).builder() -} \ No newline at end of file diff --git a/ui/bootstrap/src/jsMain/kotlin/space/kscience/visionforge/bootstrap/visionPropertyEditor.kt b/ui/bootstrap/src/jsMain/kotlin/space/kscience/visionforge/bootstrap/visionPropertyEditor.kt deleted file mode 100644 index 8264ae43..00000000 --- a/ui/bootstrap/src/jsMain/kotlin/space/kscience/visionforge/bootstrap/visionPropertyEditor.kt +++ /dev/null @@ -1,71 +0,0 @@ -package space.kscience.visionforge.bootstrap - -import org.w3c.dom.Element -import react.RBuilder -import space.kscience.dataforge.meta.descriptors.MetaDescriptor -import space.kscience.dataforge.meta.isEmpty -import space.kscience.visionforge.Vision -import space.kscience.visionforge.getStyle -import space.kscience.visionforge.react.EditorPropertyState -import space.kscience.visionforge.react.PropertyEditor -import space.kscience.visionforge.react.metaViewer -import space.kscience.visionforge.react.render -import space.kscience.visionforge.root -import space.kscience.visionforge.solid.SolidReference -import space.kscience.visionforge.styles - -public fun RBuilder.visionPropertyEditor( - vision: Vision, - descriptor: MetaDescriptor? = vision.descriptor, - key: Any? = null, -) { - - card("Properties") { - child(PropertyEditor) { - attrs { - this.key = key?.toString() - this.meta = vision.properties.root() - this.updates = vision.properties.changes - this.descriptor = descriptor - this.scope = vision.manager?.context ?: error("Orphan vision could not be observed") - this.getPropertyState = { name -> - val ownMeta = vision.properties.own?.get(name) - if (ownMeta != null && !ownMeta.isEmpty()) { - EditorPropertyState.Defined - } else if (vision.properties.root().getValue(name) != null) { - // TODO differentiate - EditorPropertyState.Default() - } else { - EditorPropertyState.Undefined - } - } - } - } - } - val styles = if (vision is SolidReference) { - (vision.styles + vision.prototype.styles).distinct() - } else { - vision.styles - } - if (styles.isNotEmpty()) { - card("Styles") { - accordion("styles") { - styles.forEach { styleName -> - val style = vision.getStyle(styleName) - if (style != null) { - entry(styleName) { - metaViewer(style) - } - } - } - } - } - } -} - -public fun Element.visionPropertyEditor( - item: Vision, - descriptor: MetaDescriptor? = item.descriptor, -): Unit = space.kscience.visionforge.react.createRoot(this).render { - visionPropertyEditor(item, descriptor = descriptor) -} \ No newline at end of file diff --git a/ui/bootstrap/src/jsMain/resources/css/custom-bootstrap.css b/ui/bootstrap/src/jsMain/resources/css/custom-bootstrap.css deleted file mode 100644 index ecb7ee5f..00000000 --- a/ui/bootstrap/src/jsMain/resources/css/custom-bootstrap.css +++ /dev/null @@ -1,56 +0,0 @@ -/*full height*/ -html, body { - height: 100%; - width: 100%; -} - -.container-fluid { height: inherit; } - -/* Remove default bullets */ -ul, .tree { - list-style-type: none; -} - -/* Style the caret/arrow */ -.tree-caret { - cursor: pointer; - user-select: none; /* Prevent text selection */ -} - -/* Create the caret/arrow with a unicode, and style it */ -.tree-caret::before { - content: "\25B6"; - color: black; - display: inline-block; - margin-right: 6px; -} - -.tree-leaf{ - user-select: none; - display: inline-block; -} - -.tree-leaf::before { - content: "\25C6"; - color: black; - display: inline-block; - margin-right: 6px; -} - - -/* Rotate the caret/arrow icon when clicked on (using JavaScript) */ -.tree-caret-down::before { - transform: rotate(90deg); -} - -.tree-label-inactive { - color: lightgrey; -} - -.tree-label-selected{ - background-color: lightblue; -} - -.no-padding{ - padding: 0; -} \ No newline at end of file diff --git a/ui/react/README.md b/ui/react/README.md deleted file mode 100644 index 9f862213..00000000 --- a/ui/react/README.md +++ /dev/null @@ -1,4 +0,0 @@ -# Module react - - - diff --git a/ui/react/build.gradle.kts b/ui/react/build.gradle.kts deleted file mode 100644 index 1770feeb..00000000 --- a/ui/react/build.gradle.kts +++ /dev/null @@ -1,16 +0,0 @@ -plugins { - id("space.kscience.gradle.mpp") -} - -kscience { - js() - jsMain { - dependencies { - api(projects.visionforgeSolid) - api("org.jetbrains.kotlin-wrappers:kotlin-styled") - api("org.jetbrains.kotlin-wrappers:kotlin-react-dom") -// implementation(npm("react-select","4.3.0")) - api(projects.visionforgeThreejs) - } - } -} \ No newline at end of file diff --git a/ui/react/src/jsMain/kotlin/space/kscience/visionforge/react/MetaViewer.kt b/ui/react/src/jsMain/kotlin/space/kscience/visionforge/react/MetaViewer.kt deleted file mode 100644 index 651c9d31..00000000 --- a/ui/react/src/jsMain/kotlin/space/kscience/visionforge/react/MetaViewer.kt +++ /dev/null @@ -1,149 +0,0 @@ -package space.kscience.visionforge.react - -import kotlinx.css.Align -import kotlinx.css.alignItems -import kotlinx.html.js.onClickFunction -import org.w3c.dom.events.Event -import react.* -import react.dom.a -import react.dom.attrs -import space.kscience.dataforge.meta.Meta -import space.kscience.dataforge.meta.descriptors.MetaDescriptor -import space.kscience.dataforge.meta.descriptors.get -import space.kscience.dataforge.meta.get -import space.kscience.dataforge.meta.isLeaf -import space.kscience.dataforge.names.Name -import space.kscience.dataforge.names.NameToken -import space.kscience.dataforge.names.lastOrNull -import space.kscience.dataforge.names.plus -import styled.css -import styled.styledDiv -import styled.styledSpan - -public external interface MetaViewerProps : Props { - /** - * Root meta - */ - public var root: Meta - - /** - * The title of root node - */ - public var rootName: String? - - /** - * Full path to the displayed node in [root]. Could be empty - */ - public var name: Name - - /** - * Root descriptor - */ - public var descriptor: MetaDescriptor? -} - -private val MetaViewerItem: FC = fc("MetaViewerItem") { props -> - metaViewerItem(props) -} - -private fun RBuilder.metaViewerItem(props: MetaViewerProps) { - var expanded: Boolean by useState { true } - val item = props.root[props.name] - val descriptorItem: MetaDescriptor? = props.descriptor?.get(props.name) - val actualValue = item?.value ?: descriptorItem?.defaultValue - val actualMeta = item ?: descriptorItem?.defaultNode - - val token = props.name.lastOrNull()?.toString() ?: props.rootName ?: "" - - val expanderClick: (Event) -> Unit = { - expanded = !expanded - } - - flexRow { - css { - alignItems = Align.center - } - if (actualMeta?.isLeaf == false) { - styledSpan { - css { - +TreeStyles.treeCaret - if (expanded) { - +TreeStyles.treeCaredDown - } - } - attrs { - onClickFunction = expanderClick - } - } - } - - styledSpan { - css { - +TreeStyles.treeLabel - if (item == null) { - +TreeStyles.treeLabelInactive - } - } - +token - } - styledDiv { - a { - +actualValue.toString() - } - } - } - if (expanded) { - flexColumn { - css { - +TreeStyles.tree - } - val keys = buildSet { - descriptorItem?.children?.keys?.forEach { - add(NameToken(it)) - } - actualMeta!!.items.keys.let { addAll(it) } - } - - keys.filter { !it.body.startsWith("@") }.forEach { token -> - styledDiv { - css { - +TreeStyles.treeItem - } - child(MetaViewerItem) { - attrs { - this.key = props.name.toString() - this.root = props.root - this.name = props.name + token - this.descriptor = props.descriptor - } - } - //configEditor(props.root, props.name + token, props.descriptor, props.default) - } - } - } - } - - -} - -@JsExport -public val MetaViewer: FC = fc("MetaViewer") { props -> - child(MetaViewerItem) { - attrs { - this.key = "" - this.root = props.root - this.name = Name.EMPTY - this.descriptor = props.descriptor - } - } -} - -public fun RBuilder.metaViewer(meta: Meta, descriptor: MetaDescriptor? = null, key: Any? = null) { - child(MetaViewer) { - attrs { - this.key = key?.toString() ?: "" - this.root = meta - this.descriptor = descriptor - } - } -} diff --git a/ui/react/src/jsMain/kotlin/space/kscience/visionforge/react/MultiSelectChooser.kt b/ui/react/src/jsMain/kotlin/space/kscience/visionforge/react/MultiSelectChooser.kt deleted file mode 100644 index fc635d21..00000000 --- a/ui/react/src/jsMain/kotlin/space/kscience/visionforge/react/MultiSelectChooser.kt +++ /dev/null @@ -1,38 +0,0 @@ -package space.kscience.visionforge.react - -import kotlinx.html.js.onChangeFunction -import org.w3c.dom.HTMLOptionElement -import org.w3c.dom.HTMLSelectElement -import org.w3c.dom.asList -import org.w3c.dom.events.Event -import react.FC -import react.dom.attrs -import react.dom.option -import react.dom.select -import react.fc -import space.kscience.dataforge.meta.asValue -import space.kscience.dataforge.meta.descriptors.allowedValues -import space.kscience.dataforge.meta.string - -@JsExport -public val MultiSelectChooser: FC = fc("MultiSelectChooser") { props -> - val onChange: (Event) -> Unit = { event: Event -> - val newSelected = (event.target as HTMLSelectElement).selectedOptions.asList() - .map { (it as HTMLOptionElement).value.asValue() } - props.onValueChange(newSelected.asValue()) - } - - select { - attrs { - multiple = true - values = (props.value?.list ?: emptyList()).mapTo(HashSet()) { it.string } - onChangeFunction = onChange - } - props.descriptor?.allowedValues?.forEach { optionValue -> - option { - +optionValue.string - } - } - - } -} \ No newline at end of file diff --git a/ui/react/src/jsMain/kotlin/space/kscience/visionforge/react/PropertyEditor.kt b/ui/react/src/jsMain/kotlin/space/kscience/visionforge/react/PropertyEditor.kt deleted file mode 100644 index b13e7304..00000000 --- a/ui/react/src/jsMain/kotlin/space/kscience/visionforge/react/PropertyEditor.kt +++ /dev/null @@ -1,277 +0,0 @@ -package space.kscience.visionforge.react - -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.ExperimentalCoroutinesApi -import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.callbackFlow -import kotlinx.coroutines.flow.launchIn -import kotlinx.coroutines.flow.onEach -import kotlinx.coroutines.launch -import kotlinx.css.* -import kotlinx.css.properties.TextDecoration -import kotlinx.html.js.onClickFunction -import org.w3c.dom.events.Event -import react.* -import react.dom.attrs -import space.kscience.dataforge.meta.MutableMeta -import space.kscience.dataforge.meta.ObservableMutableMeta -import space.kscience.dataforge.meta.descriptors.MetaDescriptor -import space.kscience.dataforge.meta.descriptors.ValueRestriction -import space.kscience.dataforge.meta.descriptors.get -import space.kscience.dataforge.meta.remove -import space.kscience.dataforge.names.* -import space.kscience.visionforge.hidden -import styled.css -import styled.styledButton -import styled.styledDiv -import styled.styledSpan - -/** - * The display state of a property - */ -public sealed class EditorPropertyState { - public object Defined : EditorPropertyState() - public class Default(public val source: String = "unknown") : EditorPropertyState() - - public object Undefined : EditorPropertyState() - -} - - -public external interface PropertyEditorProps : Props { - - /** - * Root config object - always non-null - */ - public var meta: MutableMeta - - public var getPropertyState: (Name) -> EditorPropertyState - - public var scope: CoroutineScope - - public var updates: Flow - - /** - * Full path to the displayed node in [meta]. Could be empty - */ - public var name: Name - - /** - * Root descriptor - */ - public var descriptor: MetaDescriptor? - - /** - * Initial expanded state - */ - public var expanded: Boolean? -} - -private val PropertyEditorItem: FC = fc("PropertyEditorItem") { props -> - propertyEditorItem(props) -} - -private fun RBuilder.propertyEditorItem(props: PropertyEditorProps) { - var expanded: Boolean by useState { props.expanded ?: true } - val descriptor: MetaDescriptor? = useMemo(props.descriptor, props.name) { props.descriptor?.get(props.name) } - var property: MutableMeta by useState { props.meta.getOrCreate(props.name) } - var editorPropertyState: EditorPropertyState by useState { props.getPropertyState(props.name) } - - - val keys = useMemo(descriptor) { - buildSet { - descriptor?.children?.filterNot { - it.key.startsWith("@") || it.value.hidden - }?.forEach { - add(NameToken(it.key)) - } - //ownProperty?.items?.keys?.filterNot { it.body.startsWith("@") }?.let { addAll(it) } - } - } - - val token = props.name.lastOrNull()?.toString() ?: "Properties" - - fun update() { - property = props.meta.getOrCreate(props.name) - editorPropertyState = props.getPropertyState(props.name) - } - - useEffect(props.meta) { - val job = props.updates.onEach { updatedName -> - if (updatedName == props.name) { - update() - } - }.launchIn(props.scope) - - cleanup { - job.cancel() - } - } - - val expanderClick: (Event) -> Unit = { - expanded = !expanded - } - - val removeClick: (Event) -> Unit = { - props.meta.remove(props.name) - update() - } - - - - flexRow { - css { - alignItems = Align.center - } - if (keys.isNotEmpty()) { - styledSpan { - css { - +TreeStyles.treeCaret - if (expanded) { - +TreeStyles.treeCaredDown - } - } - attrs { - onClickFunction = expanderClick - } - } - } - styledSpan { - css { - +TreeStyles.treeLabel - if (editorPropertyState != EditorPropertyState.Defined) { - +TreeStyles.treeLabelInactive - } - } - +token - } - if (!props.name.isEmpty() && descriptor?.valueRestriction != ValueRestriction.ABSENT) { - styledDiv { - css { - //+TreeStyles.resizeableInput - width = 160.px - margin = Margin(1.px, 5.px) - } - ValueChooser { - attrs { - this.descriptor = descriptor - this.state = editorPropertyState - this.value = property.value - this.onValueChange = { - property.value = it - editorPropertyState = props.getPropertyState(props.name) - } - } - } - } - - styledButton { - css { - width = 24.px - alignSelf = Align.stretch - margin = Margin(1.px, 5.px) - backgroundColor = Color.white - borderStyle = BorderStyle.solid - borderRadius = 2.px - textAlign = TextAlign.center - textDecoration = TextDecoration.none - cursor = Cursor.pointer - disabled { - cursor = Cursor.auto - borderStyle = BorderStyle.dashed - color = Color.lightGray - } - } - +"\u00D7" - attrs { - if (editorPropertyState != EditorPropertyState.Defined) { - disabled = true - } else { - onClickFunction = removeClick - } - } - } - } - } - if (expanded) { - flexColumn { - css { - +TreeStyles.tree - } - keys.forEach { token -> - styledDiv { - css { - +TreeStyles.treeItem - } - child(PropertyEditorItem) { - attrs { - this.key = props.name.toString() - this.meta = props.meta - this.name = props.name + token - this.descriptor = props.descriptor - this.scope = props.scope - this.getPropertyState = { props.getPropertyState(props.name + token) } - this.updates = props.updates - } - } - //configEditor(props.root, props.name + token, props.descriptor, props.default) - } - } - } - } -} - -@JsExport -public val PropertyEditor: FC = fc("PropertyEditor") { props -> - child(PropertyEditorItem) { - attrs { - this.key = "" - this.meta = props.meta - this.name = Name.EMPTY - this.descriptor = props.descriptor - this.expanded = props.expanded - this.scope = props.scope - this.getPropertyState = props.getPropertyState - this.updates = props.updates - } - } -} - -@OptIn(ExperimentalCoroutinesApi::class) -public fun RBuilder.propertyEditor( - scope: CoroutineScope, - properties: ObservableMutableMeta, - descriptor: MetaDescriptor? = null, - key: Any? = null, - expanded: Boolean? = null, -) { - child(PropertyEditor) { - attrs { - this.meta = properties - this.descriptor = descriptor - this.key = key?.toString() ?: "" - this.expanded = expanded - this.scope = scope - this.getPropertyState = { name -> - if (properties[name] != null) { - EditorPropertyState.Defined - } else if (descriptor?.get(name)?.defaultValue != null) { - EditorPropertyState.Default("descriptor") - } else { - EditorPropertyState.Undefined - } - } - this.updates = callbackFlow { - properties.onChange(scope) { name -> - scope.launch { - send(name) - } - } - - invokeOnClose { - properties.removeListener(scope) - } - } - } - } -} \ No newline at end of file diff --git a/ui/react/src/jsMain/kotlin/space/kscience/visionforge/react/RangeValueChooser.kt b/ui/react/src/jsMain/kotlin/space/kscience/visionforge/react/RangeValueChooser.kt deleted file mode 100644 index bec34fc1..00000000 --- a/ui/react/src/jsMain/kotlin/space/kscience/visionforge/react/RangeValueChooser.kt +++ /dev/null @@ -1,78 +0,0 @@ -package space.kscience.visionforge.react - -import kotlinx.css.pct -import kotlinx.css.width -import kotlinx.html.InputType -import kotlinx.html.js.onChangeFunction -import kotlinx.html.js.onInputFunction -import org.w3c.dom.HTMLInputElement -import org.w3c.dom.events.Event -import react.FC -import react.dom.attrs -import react.fc -import react.useState -import space.kscience.dataforge.meta.asValue -import space.kscience.dataforge.meta.descriptors.ValueRestriction -import space.kscience.dataforge.meta.double -import space.kscience.dataforge.meta.get -import space.kscience.dataforge.meta.string -import styled.css -import styled.styledInput - -@JsExport -public val RangeValueChooser: FC = fc("RangeValueChooser") { props -> - var innerValue by useState(props.value?.double) - var rangeDisabled: Boolean by useState(props.state != EditorPropertyState.Defined) - - val handleDisable: (Event) -> Unit = { - val checkBoxValue = (it.target as HTMLInputElement).checked - rangeDisabled = !checkBoxValue - props.onValueChange( - if (!checkBoxValue) { - null - } else { - innerValue?.asValue() - } - ) - } - - val handleChange: (Event) -> Unit = { - val newValue = (it.target as HTMLInputElement).value - props.onValueChange(newValue.toDoubleOrNull()?.asValue()) - innerValue = newValue.toDoubleOrNull() - } - - flexRow { - if (props.descriptor?.valueRestriction != ValueRestriction.REQUIRED) { - styledInput(type = InputType.checkBox) { - attrs { - defaultChecked = rangeDisabled.not() - onChangeFunction = handleDisable - } - } - } - - styledInput(type = InputType.range) { - css { - width = 100.pct - } - attrs { - disabled = rangeDisabled - value = innerValue?.toString() ?: "" -// onChangeFunction = handleChange - onInputFunction = handleChange - val minValue = props.descriptor?.attributes?.get("min").string - minValue?.let { - min = it - } - val maxValue = props.descriptor?.attributes?.get("max").string - maxValue?.let { - max = it - } - props.descriptor?.attributes?.get("step").string?.let { - step = it - } - } - } - } -} \ No newline at end of file diff --git a/ui/react/src/jsMain/kotlin/space/kscience/visionforge/react/ThreeCanvasComponent.kt b/ui/react/src/jsMain/kotlin/space/kscience/visionforge/react/ThreeCanvasComponent.kt deleted file mode 100644 index 8cfa515d..00000000 --- a/ui/react/src/jsMain/kotlin/space/kscience/visionforge/react/ThreeCanvasComponent.kt +++ /dev/null @@ -1,55 +0,0 @@ -package space.kscience.visionforge.react - -import kotlinx.css.* -import org.w3c.dom.Element -import react.* -import space.kscience.dataforge.context.Context -import space.kscience.dataforge.context.request -import space.kscience.dataforge.names.Name -import space.kscience.visionforge.solid.Solid -import space.kscience.visionforge.solid.specifications.Canvas3DOptions -import space.kscience.visionforge.solid.three.ThreeCanvas -import space.kscience.visionforge.solid.three.ThreePlugin -import styled.css -import styled.styledDiv - -public external interface ThreeCanvasProps : Props { - public var context: Context - public var options: Canvas3DOptions? - public var solid: Solid? - public var selected: Name? -} - -public val ThreeCanvasComponent: FC = fc("ThreeCanvasComponent") { props -> - val elementRef = useRef(null) - var canvas by useState(null) - - val three: ThreePlugin = useMemo(props.context) { props.context.request(ThreePlugin) } - - useEffect(props.solid, props.options, elementRef) { - if (canvas == null) { - val element = elementRef.current ?: error("Canvas element not found") - canvas = ThreeCanvas(three, element, props.options ?: Canvas3DOptions()) - } - } - - useEffect(canvas, props.solid) { - props.solid?.let { obj -> - canvas?.render(obj) - } - } - - useEffect(canvas, props.selected) { - canvas?.select(props.selected) - } - - styledDiv { - css { - maxWidth = 100.vw - maxHeight = 100.vh - width = 100.pct - height = 100.pct - } - ref = elementRef - } -} \ No newline at end of file diff --git a/ui/react/src/jsMain/kotlin/space/kscience/visionforge/react/TreeStyles.kt b/ui/react/src/jsMain/kotlin/space/kscience/visionforge/react/TreeStyles.kt deleted file mode 100644 index 109d0256..00000000 --- a/ui/react/src/jsMain/kotlin/space/kscience/visionforge/react/TreeStyles.kt +++ /dev/null @@ -1,69 +0,0 @@ -package space.kscience.visionforge.react - -import kotlinx.css.* -import kotlinx.css.properties.deg -import kotlinx.css.properties.rotate -import styled.StyleSheet - -public object TreeStyles : StyleSheet("treeStyles", true) { - /** - * Remove default bullets - */ - public val tree: RuleSet by css { - paddingLeft = 5.px - marginLeft = 0.px - listStyleType = ListStyleType.none - } - - /** - * Style the caret/arrow - */ - public val treeCaret: RuleSet by css { - cursor = Cursor.pointer - userSelect = UserSelect.none - /* Create the caret/arrow with a unicode, and style it */ - before { - content = "\u25B6".quoted - color = Color.black - display = Display.inlineBlock - marginRight = 6.px - } - } - - /** - * Rotate the caret/arrow icon when clicked on (using JavaScript) - */ - public val treeCaredDown:RuleSet by css { - before { - content = "\u25B6".quoted - color = Color.black - display = Display.inlineBlock - marginRight = 6.px - transform.rotate(90.deg) - } - } - - public val treeItem:RuleSet by css { - alignItems = Align.center - paddingLeft = 10.px - borderLeftStyle = BorderStyle.dashed - borderLeftWidth = 1.px - borderLeftColor = Color.lightGray - } - - public val treeLabel:RuleSet by css { - border = Border.none - padding = Padding(left = 4.pt, right = 4.pt, top = 0.pt, bottom = 0.pt) - textAlign = TextAlign.left - flex = Flex(1.0) - } - - public val treeLabelInactive: RuleSet by css { - color = Color.lightGray - } - - public val treeLabelSelected:RuleSet by css { - backgroundColor = Color.lightBlue - } - -} \ No newline at end of file diff --git a/ui/react/src/jsMain/kotlin/space/kscience/visionforge/react/VisionTree.kt b/ui/react/src/jsMain/kotlin/space/kscience/visionforge/react/VisionTree.kt deleted file mode 100644 index 6212a456..00000000 --- a/ui/react/src/jsMain/kotlin/space/kscience/visionforge/react/VisionTree.kt +++ /dev/null @@ -1,126 +0,0 @@ -package space.kscience.visionforge.react - -import kotlinx.css.* -import kotlinx.css.properties.TextDecoration -import kotlinx.css.properties.TextDecorationLine -import kotlinx.html.js.onClickFunction -import org.w3c.dom.events.Event -import react.* -import react.dom.attrs -import space.kscience.dataforge.names.Name -import space.kscience.dataforge.names.lastOrNull -import space.kscience.dataforge.names.plus -import space.kscience.dataforge.names.startsWith -import space.kscience.visionforge.Vision -import space.kscience.visionforge.VisionGroup -import space.kscience.visionforge.asSequence -import space.kscience.visionforge.isEmpty -import styled.css -import styled.styledDiv -import styled.styledSpan - -public external interface ObjectTreeProps : Props { - public var name: Name - public var selected: Name? - public var obj: Vision - public var clickCallback: (Name) -> Unit -} - -private val TreeLabel = fc { props -> - val token = useMemo(props.name) { props.name.lastOrNull()?.toString() ?: "World" } - styledSpan { - css { - +TreeStyles.treeLabel - color = Color("#069") - cursor = Cursor.pointer - hover { - textDecoration = TextDecoration(setOf(TextDecorationLine.underline)) - } - if (props.name == props.selected) { - +TreeStyles.treeLabelSelected - } - } - +token - attrs { - onClickFunction = { props.clickCallback(props.name) } - } - } -} - -private fun RBuilder.visionTree(props: ObjectTreeProps): Unit { - var expanded: Boolean by useState { props.selected?.startsWith(props.name) ?: false } - - val onClick: (Event) -> Unit = { - expanded = !expanded - } - - val obj = props.obj - - //display as node if any child is visible - if (obj is VisionGroup) { - flexRow { - if (obj.children.keys.any { !it.body.startsWith("@") }) { - styledSpan { - css { - +TreeStyles.treeCaret - if (expanded) { - +TreeStyles.treeCaredDown - } - } - attrs { - onClickFunction = onClick - } - } - } - child(TreeLabel, props = props) - } - if (expanded) { - flexColumn { - css { - +TreeStyles.tree - } - obj.children.asSequence() - .filter { !it.first.toString().startsWith("@") } // ignore statics and other hidden children - .sortedBy { (it.second as? VisionGroup)?.children?.isEmpty() ?: true } // ignore empty groups - .forEach { (childToken, child) -> - styledDiv { - css { - +TreeStyles.treeItem - } - child(ObjectTree) { - attrs { - this.name = props.name + childToken - this.obj = child - this.selected = props.selected - this.clickCallback = props.clickCallback - } - } - } - } - } - } - } else { - child(TreeLabel, props = props) - } -} - -@JsExport -public val ObjectTree: FC = fc("ObjectTree") { props -> - visionTree(props) -} - -public fun RBuilder.visionTree( - vision: Vision, - selected: Name? = null, - clickCallback: (Name) -> Unit = {}, -) { - child(ObjectTree) { - attrs { - this.name = Name.EMPTY - this.obj = vision - this.selected = selected - this.clickCallback = clickCallback - } - } -} - diff --git a/ui/react/src/jsMain/kotlin/space/kscience/visionforge/react/createRoot.kt b/ui/react/src/jsMain/kotlin/space/kscience/visionforge/react/createRoot.kt deleted file mode 100644 index fec86770..00000000 --- a/ui/react/src/jsMain/kotlin/space/kscience/visionforge/react/createRoot.kt +++ /dev/null @@ -1,17 +0,0 @@ - -@file:JsModule("react-dom/client") -@file:JsNonModule - -package space.kscience.visionforge.react - -import org.w3c.dom.Element -import react.dom.client.Root -import react.dom.client.RootOptions - -/** - * Compatibility method to work with old browser API - */ -public external fun createRoot( - container: Element, - options: RootOptions = definedExternally, -): Root diff --git a/ui/react/src/jsMain/kotlin/space/kscience/visionforge/react/ext.kt b/ui/react/src/jsMain/kotlin/space/kscience/visionforge/react/ext.kt deleted file mode 100644 index ae47fa65..00000000 --- a/ui/react/src/jsMain/kotlin/space/kscience/visionforge/react/ext.kt +++ /dev/null @@ -1,10 +0,0 @@ -package space.kscience.visionforge.react - -import react.Props -import react.RBuilder -import react.createElement -import react.dom.client.Root - -public fun Root.render(block: RBuilder.() -> Unit) { - render(createElement(block)) -} \ No newline at end of file diff --git a/ui/react/src/jsMain/kotlin/space/kscience/visionforge/react/layout.kt b/ui/react/src/jsMain/kotlin/space/kscience/visionforge/react/layout.kt deleted file mode 100644 index 11a13561..00000000 --- a/ui/react/src/jsMain/kotlin/space/kscience/visionforge/react/layout.kt +++ /dev/null @@ -1,31 +0,0 @@ -package space.kscience.visionforge.react - -import kotlinx.css.Display -import kotlinx.css.FlexDirection -import kotlinx.css.display -import kotlinx.css.flexDirection -import kotlinx.html.DIV -import react.RBuilder -import styled.StyledDOMBuilder -import styled.css -import styled.styledDiv - -public inline fun RBuilder.flexColumn( - block: StyledDOMBuilder
.() -> Unit -): Unit = styledDiv { - css { - display = Display.flex - flexDirection = FlexDirection.column - } - block() -} - -public inline fun RBuilder.flexRow( - block: StyledDOMBuilder
.() -> Unit -): Unit = styledDiv { - css { - display = Display.flex - flexDirection = FlexDirection.row - } - block() -} \ No newline at end of file diff --git a/ui/react/src/jsMain/kotlin/space/kscience/visionforge/react/valueChooser.kt b/ui/react/src/jsMain/kotlin/space/kscience/visionforge/react/valueChooser.kt deleted file mode 100644 index 5d0c7c3d..00000000 --- a/ui/react/src/jsMain/kotlin/space/kscience/visionforge/react/valueChooser.kt +++ /dev/null @@ -1,175 +0,0 @@ -package space.kscience.visionforge.react - -import kotlinx.css.* -import kotlinx.html.InputType -import kotlinx.html.js.onChangeFunction -import kotlinx.html.js.onKeyDownFunction -import org.w3c.dom.HTMLInputElement -import org.w3c.dom.HTMLSelectElement -import org.w3c.dom.events.Event -import react.FC -import react.Props -import react.dom.attrs -import react.dom.option -import react.fc -import react.useState -import space.kscience.dataforge.meta.* -import space.kscience.dataforge.meta.descriptors.MetaDescriptor -import space.kscience.dataforge.meta.descriptors.allowedValues -import space.kscience.visionforge.Colors -import space.kscience.visionforge.widgetType -import styled.css -import styled.styledInput -import styled.styledSelect -import three.math.Color - -public external interface ValueChooserProps : Props { - public var descriptor: MetaDescriptor? - public var state: EditorPropertyState - public var value: Value? - public var onValueChange: (Value?) -> Unit -} - -@JsExport -public val StringValueChooser: FC = fc("StringValueChooser") { props -> - var value by useState(props.value?.string ?: "") - val keyDown: (Event) -> Unit = { event -> - if (event.type == "keydown" && event.asDynamic().key == "Enter") { - value = (event.target as HTMLInputElement).value - props.onValueChange(value.asValue()) - } - } - val handleChange: (Event) -> Unit = { - value = (it.target as HTMLInputElement).value - } - styledInput(type = InputType.text) { - css { - width = 100.pct - } - attrs { - this.value = value - onKeyDownFunction = keyDown - onChangeFunction = handleChange - } - } -} - -@JsExport -public val BooleanValueChooser: FC = fc("BooleanValueChooser") { props -> - val handleChange: (Event) -> Unit = { - val newValue = (it.target as HTMLInputElement).checked - props.onValueChange(newValue.asValue()) - } - styledInput(type = InputType.checkBox) { - css { - width = 100.pct - } - attrs { - //this.attributes["indeterminate"] = (props.item == null).toString() - checked = props.value?.boolean ?: false - onChangeFunction = handleChange - } - } -} - -@JsExport -public val NumberValueChooser: FC = fc("NumberValueChooser") { props -> - var innerValue by useState(props.value?.string ?: "") - val keyDown: (Event) -> Unit = { event -> - if (event.type == "keydown" && event.asDynamic().key == "Enter") { - innerValue = (event.target as HTMLInputElement).value - val number = innerValue.toDoubleOrNull() - if (number == null) { - console.error("The input value $innerValue is not a number") - } else { - props.onValueChange(number.asValue()) - } - } - } - val handleChange: (Event) -> Unit = { - innerValue = (it.target as HTMLInputElement).value - } - styledInput(type = InputType.number) { - css { - width = 100.pct - } - attrs { - value = innerValue - onKeyDownFunction = keyDown - onChangeFunction = handleChange - props.descriptor?.attributes?.get("step").string?.let { - step = it - } - props.descriptor?.attributes?.get("min").string?.let { - min = it - } - props.descriptor?.attributes?.get("max").string?.let { - max = it - } - } - } -} - -@JsExport -public val ComboValueChooser: FC = fc("ComboValueChooser") { props -> - var selected by useState(props.value?.string ?: "") - val handleChange: (Event) -> Unit = { - selected = (it.target as HTMLSelectElement).value - props.onValueChange(selected.asValue()) - } - styledSelect { - css { - width = 100.pct - } - props.descriptor?.allowedValues?.forEach { - option { - +it.string - } - } - attrs { - this.value = props.value?.string ?: "" - multiple = false - onChangeFunction = handleChange - } - } -} - -@JsExport -public val ColorValueChooser: FC = fc("ColorValueChooser") { props -> - val handleChange: (Event) -> Unit = { - props.onValueChange((it.target as HTMLInputElement).value.asValue()) - } - styledInput(type = InputType.color) { - css { - width = 100.pct - margin = Margin(0.px) - } - attrs { - this.value = props.value?.let { value -> - if (value.type == ValueType.NUMBER) Colors.rgbToString(value.int) - else "#" + Color(value.string).getHexString() - } ?: "#000000" - onChangeFunction = handleChange - } - } -} - -@JsExport -public val ValueChooser: FC = fc("ValueChooser") { props -> - val rawInput by useState(false) - - val descriptor = props.descriptor - val type = descriptor?.valueTypes?.firstOrNull() - - when { - rawInput -> child(StringValueChooser, props) - descriptor?.widgetType == "color" -> child(ColorValueChooser, props) - descriptor?.widgetType == "multiSelect" -> child(MultiSelectChooser, props) - descriptor?.widgetType == "range" -> child(RangeValueChooser, props) - type == ValueType.BOOLEAN -> child(BooleanValueChooser, props) - type == ValueType.NUMBER -> child(NumberValueChooser, props) - descriptor?.allowedValues?.isNotEmpty() ?: false -> child(ComboValueChooser, props) - //TODO handle lists - else -> child(StringValueChooser, props) - } -} diff --git a/ui/ring/README.md b/ui/ring/README.md deleted file mode 100644 index 6cdcbb60..00000000 --- a/ui/ring/README.md +++ /dev/null @@ -1,4 +0,0 @@ -# Module ring - - - diff --git a/ui/ring/build.gradle.kts b/ui/ring/build.gradle.kts deleted file mode 100644 index d1f2ff72..00000000 --- a/ui/ring/build.gradle.kts +++ /dev/null @@ -1,25 +0,0 @@ -plugins { - id("space.kscience.gradle.mpp") -} - -val dataforgeVersion: String by rootProject.extra - -kscience{ - js{ - useCommonJs() - browser { - commonWebpackConfig { - cssSupport{ - enabled.set(false) - } - } - } - } - jsMain{ - api(projects.ui.react) - api("org.jetbrains.kotlin-wrappers:kotlin-ring-ui") - - implementation(npm("core-js","3.12.1")) - implementation(npm("file-saver", "2.0.2")) - } -} \ No newline at end of file diff --git a/ui/ring/src/jsMain/kotlin/ringui/Loader.kt b/ui/ring/src/jsMain/kotlin/ringui/Loader.kt deleted file mode 100644 index b7bc63a9..00000000 --- a/ui/ring/src/jsMain/kotlin/ringui/Loader.kt +++ /dev/null @@ -1,20 +0,0 @@ -@file:JsModule("@jetbrains/ring-ui/components/loader/loader") -@file:JsNonModule - -package ringui - -import react.ComponentClass -import react.PropsWithClassName - - -// https://github.com/JetBrains/ring-ui/blob/master/components/loader/loader.js -public external interface LoaderProps : PropsWithClassName { - public var size: Number - public var colors: Array - public var message: String - public var stop: Boolean - public var deterministic: Boolean -} - -@JsName("default") -public external val Loader: ComponentClass \ No newline at end of file diff --git a/ui/ring/src/jsMain/kotlin/ringui/LoaderScreen.kt b/ui/ring/src/jsMain/kotlin/ringui/LoaderScreen.kt deleted file mode 100644 index d662ee2b..00000000 --- a/ui/ring/src/jsMain/kotlin/ringui/LoaderScreen.kt +++ /dev/null @@ -1,16 +0,0 @@ -@file:JsModule("@jetbrains/ring-ui/components/loader-screen/loader-screen") -@file:JsNonModule - -package ringui - -import react.ComponentClass -import react.PropsWithClassName - -// https://github.com/JetBrains/ring-ui/blob/master/components/loader-screen/loader-screen.js -public external interface LoaderScreenProps : PropsWithClassName { - public var containerClassName: String - public var message: String -} - -@JsName("default") -public external val LoaderScreen: ComponentClass \ No newline at end of file diff --git a/ui/ring/src/jsMain/kotlin/space.kscience.visionforge.ring/ThreeViewWithControls.kt b/ui/ring/src/jsMain/kotlin/space.kscience.visionforge.ring/ThreeViewWithControls.kt deleted file mode 100644 index 6ae2ec62..00000000 --- a/ui/ring/src/jsMain/kotlin/space.kscience.visionforge.ring/ThreeViewWithControls.kt +++ /dev/null @@ -1,212 +0,0 @@ -package space.kscience.visionforge.ring - -import kotlinx.coroutines.Deferred -import kotlinx.coroutines.async -import kotlinx.coroutines.launch -import kotlinx.css.* -import react.* -import react.dom.b -import react.dom.div -import react.dom.p -import react.dom.span -import ringui.* -import space.kscience.dataforge.meta.get -import space.kscience.dataforge.names.Name -import space.kscience.dataforge.names.NameToken -import space.kscience.dataforge.names.isEmpty -import space.kscience.dataforge.names.length -import space.kscience.visionforge.* -import space.kscience.visionforge.react.* -import space.kscience.visionforge.solid.Solid -import space.kscience.visionforge.solid.SolidGroup -import space.kscience.visionforge.solid.Solids -import space.kscience.visionforge.solid.solidGroup -import space.kscience.visionforge.solid.specifications.Canvas3DOptions -import styled.css -import styled.styledDiv - -public external interface ThreeCanvasWithControlsProps : Props { - public var solids: Solids - public var builderOfSolid: Deferred - public var selected: Name? - public var options: Canvas3DOptions? - public var additionalTabs: Map Unit>? -} - -private val ThreeCanvasWithControlsProps.context get() = solids.context - -public fun ThreeCanvasWithControlsProps.solid(block: SolidGroup.() -> Unit) { - builderOfSolid = context.async { - solids.solidGroup(null, block) - } -} - -public fun ThreeCanvasWithControlsProps.options(block: Canvas3DOptions.() -> Unit) { - options = Canvas3DOptions(block) -} - -public fun ThreeCanvasWithControlsProps.tab(title: String, block: RBuilder.() -> Unit) { - additionalTabs = (additionalTabs ?: emptyMap()) + (title to block) -} - - -public fun RBuilder.nameCrumbs(name: Name?, link: (Name) -> Unit): Unit = styledDiv { - div { - Link { - attrs { - onClick = { - link(Name.EMPTY) - } - } - +"\u2302" - } - - if (name != null) { - val tokens = ArrayList(name.length) - name.tokens.forEach { token -> - tokens.add(token) - val fullName = Name(tokens.toList()) - span { +"." } - Link { - +token.toString() - attrs { - onClick = { - console.log("Selected = $fullName") - link(fullName) - } - } - } - } - } - } - -} - -@JsExport -public val ThreeCanvasWithControls: FC = fc("ThreeViewWithControls") { props -> - var selected: Name? by useState { props.selected } - var solid: Solid? by useState(null) - - useEffect { - props.context.launch { - solid = props.builderOfSolid.await() - //ensure that the solid is properly rooted - if (solid?.parent == null) { - solid?.setAsRoot(props.context.visionManager) - } - } - } - - val onSelect: (Name?) -> Unit = { - selected = it - } - - val options = useMemo(props.options) { - (props.options ?: Canvas3DOptions()).apply { - this.onSelect = onSelect - } - } - - val selectedVision: Vision? = useMemo(props.builderOfSolid, selected) { - selected?.let { - when { - it.isEmpty() -> solid - else -> (solid as? SolidGroup)?.get(it) - } - } - } - - - flexRow { - css { - height = 100.pct - width = 100.pct - flexWrap = FlexWrap.wrap - alignItems = Align.stretch - alignContent = Align.stretch - } - - flexColumn { - css { - height = 100.pct - minWidth = 600.px - flex = Flex(10.0, 1.0, FlexBasis("600px")) - position = Position.relative - } - - if (solid == null) { - LoaderScreen { - attrs { - message = "Loading Three vision" - } - } - } else { - child(ThreeCanvasComponent) { - attrs { - this.context = props.context - this.solid = solid - this.selected = selected - this.options = options - } - } - } - - selectedVision?.let { vision -> - styledDiv { - css { - position = Position.absolute - top = 5.px - right = 5.px - width = 450.px - } - Island { - IslandHeader { - attrs { - border = true - } - nameCrumbs(selected) { selected = it } - } - IslandContent { - child(PropertyEditor) { - attrs { - this.key = selected.toString() - this.meta = vision.properties.root() - this.updates = vision.properties.changes - this.descriptor = vision.descriptor - this.scope = props.context - this.getPropertyState = { name -> - if (vision.properties.own?.get(name) != null) { - EditorPropertyState.Defined - } else if (vision.properties.root()[name] != null) { - // TODO differentiate - EditorPropertyState.Default() - } else { - EditorPropertyState.Undefined - } - } - } - } - vision.styles.takeIf { it.isNotEmpty() }?.let { styles -> - p { - b { +"Styles: " } - +styles.joinToString(separator = ", ") - } - } - } - } - } - } - } - flexColumn { - css { - padding = Padding(4.px) - minWidth = 400.px - height = 100.pct - overflowY = Overflow.auto - flex = Flex(1.0, 10.0, FlexBasis("300px")) - } - ringThreeControls(options, solid, selected, onSelect, additionalTabs = props.additionalTabs) - } - } -} - diff --git a/ui/ring/src/jsMain/kotlin/space.kscience.visionforge.ring/ThreeWithControlsPlugin.kt b/ui/ring/src/jsMain/kotlin/space.kscience.visionforge.ring/ThreeWithControlsPlugin.kt deleted file mode 100644 index bf557bb8..00000000 --- a/ui/ring/src/jsMain/kotlin/space.kscience.visionforge.ring/ThreeWithControlsPlugin.kt +++ /dev/null @@ -1,52 +0,0 @@ -package space.kscience.visionforge.ring - -import kotlinx.coroutines.async -import org.w3c.dom.Element -import space.kscience.dataforge.context.AbstractPlugin -import space.kscience.dataforge.context.Context -import space.kscience.dataforge.context.PluginFactory -import space.kscience.dataforge.context.PluginTag -import space.kscience.dataforge.meta.Meta -import space.kscience.dataforge.names.Name -import space.kscience.dataforge.names.asName -import space.kscience.visionforge.ElementVisionRenderer -import space.kscience.visionforge.Vision -import space.kscience.visionforge.VisionClient -import space.kscience.visionforge.react.render -import space.kscience.visionforge.solid.Solid -import space.kscience.visionforge.solid.specifications.Canvas3DOptions -import space.kscience.visionforge.solid.three.ThreePlugin - -public class ThreeWithControlsPlugin : AbstractPlugin(), ElementVisionRenderer { - public val three: ThreePlugin by require(ThreePlugin) - - override val tag: PluginTag get() = Companion.tag - - override fun rateVision(vision: Vision): Int = - if (vision is Solid) ElementVisionRenderer.DEFAULT_RATING * 2 else ElementVisionRenderer.ZERO_RATING - - override fun render(element: Element, client: VisionClient, name: Name, vision: Vision, meta: Meta) { - space.kscience.visionforge.react.createRoot(element).render { - child(ThreeCanvasWithControls) { - attrs { - this.solids = three.solids - this.options = Canvas3DOptions.read(meta) - this.builderOfSolid = context.async { vision as Solid } - } - } - } - } - - override fun content(target: String): Map { - return when (target) { - ElementVisionRenderer.TYPE -> mapOf("three.withControls".asName() to this) - else -> super.content(target) - } - } - - public companion object : PluginFactory { - override val tag: PluginTag = PluginTag("vision.threejs.withControls", PluginTag.DATAFORGE_GROUP) - - override fun build(context: Context, meta: Meta): ThreeWithControlsPlugin = ThreeWithControlsPlugin() - } -} \ No newline at end of file diff --git a/ui/ring/src/jsMain/kotlin/space.kscience.visionforge.ring/ringPropertyEditor.kt b/ui/ring/src/jsMain/kotlin/space.kscience.visionforge.ring/ringPropertyEditor.kt deleted file mode 100644 index 83529d28..00000000 --- a/ui/ring/src/jsMain/kotlin/space.kscience.visionforge.ring/ringPropertyEditor.kt +++ /dev/null @@ -1,88 +0,0 @@ -package space.kscience.visionforge.ring - -import org.w3c.dom.Element -import react.RBuilder -import react.dom.p -import ringui.Island -import ringui.SmartTabs -import ringui.Tab -import space.kscience.dataforge.meta.descriptors.MetaDescriptor -import space.kscience.dataforge.meta.get -import space.kscience.visionforge.Vision -import space.kscience.visionforge.getStyle -import space.kscience.visionforge.react.* -import space.kscience.visionforge.root -import space.kscience.visionforge.solid.SolidReference -import space.kscience.visionforge.styles - -public fun RBuilder.ringPropertyEditor( - vision: Vision, - descriptor: MetaDescriptor? = vision.descriptor, - key: Any? = null, -) { - val styles = if (vision is SolidReference) { - (vision.styles + vision.prototype.styles).distinct() - } else { - vision.styles - } - - flexColumn { - Island("Properties") { - child(PropertyEditor) { - attrs { - this.key = key?.toString() - this.meta = vision.properties.root() - this.updates = vision.properties.changes - this.descriptor = descriptor - this.scope = vision.manager?.context ?: error("Orphan vision could not be observed") - this.getPropertyState = {name-> - if(vision.properties.own?.get(name)!= null){ - EditorPropertyState.Defined - } else if(vision.properties.root()[name] != null){ - // TODO differentiate - EditorPropertyState.Default() - } else { - EditorPropertyState.Undefined - } - } - } - } - } - - if (styles.isNotEmpty()) { - Island("Styles") { - if (styles.size == 1) { - val styleName = styles.first() - p { - +styleName - } - val style = vision.getStyle(styleName) - if (style != null) { - Tab(styleName, id = styleName) { - metaViewer(style) - } - } - } else { - SmartTabs { - styles.forEach { styleName -> - val style = vision.getStyle(styleName) - if (style != null) { - Tab(styleName, id = styleName) { - metaViewer(style) - } - } - } - } - } - } - } - } -} - - -public fun Element.ringPropertyEditor( - item: Vision, - descriptor: MetaDescriptor? = item.descriptor, -): Unit = createRoot(this).render { - ringPropertyEditor(item, descriptor = descriptor) -} \ No newline at end of file diff --git a/ui/ring/src/jsMain/kotlin/space.kscience.visionforge.ring/ringThreeControls.kt b/ui/ring/src/jsMain/kotlin/space.kscience.visionforge.ring/ringThreeControls.kt deleted file mode 100644 index 6cdc0707..00000000 --- a/ui/ring/src/jsMain/kotlin/space.kscience.visionforge.ring/ringThreeControls.kt +++ /dev/null @@ -1,131 +0,0 @@ -package space.kscience.visionforge.ring - -import kotlinx.coroutines.DelicateCoroutinesApi -import kotlinx.coroutines.GlobalScope -import kotlinx.css.* -import kotlinx.html.js.onClickFunction -import org.w3c.dom.events.Event -import org.w3c.files.Blob -import org.w3c.files.BlobPropertyBag -import react.FC -import react.Props -import react.RBuilder -import react.dom.attrs -import react.dom.button -import react.fc -import ringui.Island -import ringui.SmartTabs -import ringui.Tab -import space.kscience.dataforge.names.Name -import space.kscience.visionforge.Vision -import space.kscience.visionforge.encodeToString -import space.kscience.visionforge.react.flexColumn -import space.kscience.visionforge.react.flexRow -import space.kscience.visionforge.react.propertyEditor -import space.kscience.visionforge.react.visionTree -import space.kscience.visionforge.solid.specifications.Canvas3DOptions -import styled.css - -internal fun saveData(event: Event, fileName: String, mimeType: String = "text/plain", dataBuilder: () -> String) { - event.stopPropagation(); - event.preventDefault(); - - val fileSaver = kotlinext.js.require("file-saver") - val blob = Blob(arrayOf(dataBuilder()), BlobPropertyBag("$mimeType;charset=utf-8")) - fileSaver.saveAs(blob, fileName) -} - -internal fun RBuilder.canvasControls(options: Canvas3DOptions, vision: Vision?): Unit { - child(CanvasControls) { - attrs { - this.options = options - this.vision = vision - } - } -} - -internal external interface CanvasControlsProps : Props { - public var options: Canvas3DOptions - public var vision: Vision? -} - -@OptIn(DelicateCoroutinesApi::class) -internal val CanvasControls: FC = fc("CanvasControls") { props -> - flexColumn { - flexRow { - css { - border = Border(1.px, BorderStyle.solid, Color.blue) - padding = Padding(4.px) - } - props.vision?.let { vision -> - button { - +"Export" - attrs { - onClickFunction = { - val json = vision.encodeToString() - saveData(it, "object.json", "text/json") { - json - } - - } - } - } - } - } - propertyEditor( - scope = props.vision?.manager?.context ?: GlobalScope, - properties = props.options.meta, - descriptor = Canvas3DOptions.descriptor, - expanded = false - ) - - } -} - - -public external interface ThreeControlsProps : Props { - public var canvasOptions: Canvas3DOptions - public var vision: Vision? - public var selected: Name? - public var onSelect: (Name?) -> Unit - public var additionalTabs: Map Unit> -} - -@JsExport -public val ThreeControls: FC = fc { props -> - SmartTabs("Tree") { - props.vision?.let { - Tab("Tree") { - Island("Vision tree") { - visionTree(it, props.selected, props.onSelect) - } - } - } - Tab("Settings") { - Island("Canvas configuration") { - canvasControls(props.canvasOptions, props.vision) - } - } - props.additionalTabs.forEach { (name, handler) -> - Tab(name) { - handler() - } - } - } -} - -public fun RBuilder.ringThreeControls( - canvasOptions: Canvas3DOptions, - vision: Vision?, - selected: Name?, - onSelect: (Name?) -> Unit = {}, - additionalTabs: Map Unit>? = null -): Unit = child(ThreeControls) { - attrs { - this.canvasOptions = canvasOptions - this.vision = vision - this.selected = selected - this.onSelect = onSelect - this.additionalTabs = additionalTabs ?: emptyMap() - } -} \ No newline at end of file diff --git a/ui/ring/webpack.config.d/01.ring.js b/ui/ring/webpack.config.d/01.ring.js deleted file mode 100644 index 41da041c..00000000 --- a/ui/ring/webpack.config.d/01.ring.js +++ /dev/null @@ -1,3 +0,0 @@ -const ringConfig = require('@jetbrains/ring-ui/webpack.config').config; - -config.module.rules.push(...ringConfig.module.rules) \ No newline at end of file diff --git a/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/ComposeVisionRenderer.kt b/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/html/ComposeVisionRenderer.kt similarity index 95% rename from visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/ComposeVisionRenderer.kt rename to visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/html/ComposeVisionRenderer.kt index 32d9d129..91cb87be 100644 --- a/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/ComposeVisionRenderer.kt +++ b/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/html/ComposeVisionRenderer.kt @@ -1,4 +1,4 @@ -package space.kscience.visionforge.compose +package space.kscience.visionforge.html import androidx.compose.runtime.Composable import org.jetbrains.compose.web.css.Style diff --git a/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/MetaViewer.kt b/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/html/MetaViewer.kt similarity index 98% rename from visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/MetaViewer.kt rename to visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/html/MetaViewer.kt index 5c93cd15..3f85fd9f 100644 --- a/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/MetaViewer.kt +++ b/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/html/MetaViewer.kt @@ -1,4 +1,4 @@ -package space.kscience.visionforge.compose +package space.kscience.visionforge.html import androidx.compose.runtime.* import org.jetbrains.compose.web.css.AlignItems diff --git a/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/NameCrumbs.kt b/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/html/NameCrumbs.kt similarity index 96% rename from visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/NameCrumbs.kt rename to visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/html/NameCrumbs.kt index 12d78210..787a45fa 100644 --- a/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/NameCrumbs.kt +++ b/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/html/NameCrumbs.kt @@ -1,4 +1,4 @@ -package space.kscience.visionforge.compose +package space.kscience.visionforge.html import androidx.compose.runtime.Composable import org.jetbrains.compose.web.dom.* diff --git a/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/PropertyEditor.kt b/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/html/PropertyEditor.kt similarity index 99% rename from visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/PropertyEditor.kt rename to visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/html/PropertyEditor.kt index 452750df..cfea11e0 100644 --- a/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/PropertyEditor.kt +++ b/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/html/PropertyEditor.kt @@ -1,4 +1,4 @@ -package space.kscience.visionforge.compose +package space.kscience.visionforge.html import androidx.compose.runtime.* import app.softwork.bootstrapcompose.CloseButton diff --git a/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/Tabs.kt b/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/html/Tabs.kt similarity index 98% rename from visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/Tabs.kt rename to visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/html/Tabs.kt index 3e0db26a..36504cf4 100644 --- a/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/Tabs.kt +++ b/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/html/Tabs.kt @@ -1,4 +1,4 @@ -package space.kscience.visionforge.compose +package space.kscience.visionforge.html import androidx.compose.runtime.* import app.softwork.bootstrapcompose.Card diff --git a/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/TreeStyles.kt b/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/html/TreeStyles.kt similarity index 98% rename from visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/TreeStyles.kt rename to visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/html/TreeStyles.kt index 95a58aaf..d9469dff 100644 --- a/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/TreeStyles.kt +++ b/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/html/TreeStyles.kt @@ -1,4 +1,4 @@ -package space.kscience.visionforge.compose +package space.kscience.visionforge.html import org.jetbrains.compose.web.ExperimentalComposeWebApi import org.jetbrains.compose.web.css.* diff --git a/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/VisionForgeStyles.kt b/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/html/VisionForgeStyles.kt similarity index 69% rename from visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/VisionForgeStyles.kt rename to visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/html/VisionForgeStyles.kt index 06d1187c..82a3a608 100644 --- a/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/VisionForgeStyles.kt +++ b/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/html/VisionForgeStyles.kt @@ -1,4 +1,4 @@ -package space.kscience.visionforge.compose +package space.kscience.visionforge.html import org.jetbrains.compose.web.css.StyleSheet diff --git a/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/VisionTree.kt b/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/html/VisionTree.kt similarity index 98% rename from visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/VisionTree.kt rename to visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/html/VisionTree.kt index 39a4d669..b714fb71 100644 --- a/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/VisionTree.kt +++ b/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/html/VisionTree.kt @@ -1,4 +1,4 @@ -package space.kscience.visionforge.compose +package space.kscience.visionforge.html import androidx.compose.runtime.* import org.jetbrains.compose.web.css.Color diff --git a/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/bootstrap.kt b/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/html/bootstrap.kt similarity index 74% rename from visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/bootstrap.kt rename to visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/html/bootstrap.kt index 8b0ee5b5..ce27653b 100644 --- a/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/bootstrap.kt +++ b/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/html/bootstrap.kt @@ -1,4 +1,4 @@ -package space.kscience.visionforge.compose +package space.kscience.visionforge.html import androidx.compose.runtime.Composable import org.jetbrains.compose.web.dom.H5 diff --git a/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/composeVision.kt b/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/html/composeVision.kt similarity index 97% rename from visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/composeVision.kt rename to visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/html/composeVision.kt index ffb3da5f..9344f3ce 100644 --- a/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/composeVision.kt +++ b/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/html/composeVision.kt @@ -1,4 +1,4 @@ -package space.kscience.visionforge.compose +package space.kscience.visionforge.html import androidx.compose.runtime.Composable import androidx.compose.runtime.DisposableEffect diff --git a/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/css.kt b/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/html/css.kt similarity index 95% rename from visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/css.kt rename to visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/html/css.kt index 0bf8f7c2..9ae652cf 100644 --- a/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/css.kt +++ b/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/html/css.kt @@ -1,4 +1,4 @@ -package space.kscience.visionforge.compose +package space.kscience.visionforge.html import org.jetbrains.compose.web.css.* import org.jetbrains.compose.web.css.keywords.CSSAutoKeyword diff --git a/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/layouts.kt b/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/html/layouts.kt similarity index 96% rename from visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/layouts.kt rename to visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/html/layouts.kt index 882f1f1c..ecdfbb1c 100644 --- a/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/layouts.kt +++ b/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/html/layouts.kt @@ -1,4 +1,4 @@ -package space.kscience.visionforge.compose +package space.kscience.visionforge.html import androidx.compose.runtime.Composable import org.jetbrains.compose.web.css.DisplayStyle diff --git a/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/valueChooser.kt b/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/html/valueChooser.kt similarity index 99% rename from visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/valueChooser.kt rename to visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/html/valueChooser.kt index 9b9a9905..fdec8c3f 100644 --- a/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/valueChooser.kt +++ b/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/html/valueChooser.kt @@ -1,6 +1,6 @@ @file:Suppress("UNUSED_PARAMETER") -package space.kscience.visionforge.compose +package space.kscience.visionforge.html import androidx.compose.runtime.* import kotlinx.uuid.UUID diff --git a/visionforge-compose-mpp/build.gradle.kts b/visionforge-compose-mpp/build.gradle.kts new file mode 100644 index 00000000..0dc2b6d9 --- /dev/null +++ b/visionforge-compose-mpp/build.gradle.kts @@ -0,0 +1,24 @@ +plugins { + id("space.kscience.gradle.mpp") + alias(spclibs.plugins.compose) +} + +kscience { + jvm() + wasm() +} + +kotlin { +// android() + sourceSets { + commonMain { + dependencies { + api(projects.visionforgeCore) + api(compose.runtime) + api(compose.foundation) + api(compose.material) + api(compose.preview) + } + } + } +} \ No newline at end of file diff --git a/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/ThreePlugin.kt b/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/ThreePlugin.kt index 5d3fbdc3..5691d1f7 100644 --- a/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/ThreePlugin.kt +++ b/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/ThreePlugin.kt @@ -10,7 +10,7 @@ import space.kscience.dataforge.context.* import space.kscience.dataforge.meta.Meta import space.kscience.dataforge.names.* import space.kscience.visionforge.* -import space.kscience.visionforge.compose.ComposeVisionRenderer +import space.kscience.visionforge.html.ComposeVisionRenderer import space.kscience.visionforge.solid.* import space.kscience.visionforge.solid.specifications.Canvas3DOptions import space.kscience.visionforge.solid.three.compose.ThreeView diff --git a/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/compose/ThreeControls.kt b/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/compose/ThreeControls.kt index 2e03ec6a..63e95760 100644 --- a/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/compose/ThreeControls.kt +++ b/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/compose/ThreeControls.kt @@ -12,8 +12,8 @@ import org.w3c.files.BlobPropertyBag import space.kscience.dataforge.context.Global import space.kscience.dataforge.names.Name import space.kscience.visionforge.Vision -import space.kscience.visionforge.compose.* import space.kscience.visionforge.encodeToString +import space.kscience.visionforge.html.* import space.kscience.visionforge.solid.specifications.Canvas3DOptions @Composable diff --git a/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/compose/ThreeView.kt b/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/compose/ThreeView.kt index a9ba1146..b3dd1347 100644 --- a/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/compose/ThreeView.kt +++ b/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/compose/ThreeView.kt @@ -13,7 +13,7 @@ import space.kscience.dataforge.context.Context import space.kscience.dataforge.context.request import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.isEmpty -import space.kscience.visionforge.compose.* +import space.kscience.visionforge.html.* import space.kscience.visionforge.root import space.kscience.visionforge.solid.Solid import space.kscience.visionforge.solid.SolidGroup From d90c1edc6ca4da32f0867269ba37db96a434f686 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Mon, 12 Feb 2024 20:04:10 +0300 Subject: [PATCH 35/41] refactor compose-html --- demo/muon-monitor/build.gradle.kts | 6 ++-- visionforge-compose-html/build.gradle.kts | 22 ++++++------- ...nderer.kt => ComposeHtmlVisionRenderer.kt} | 9 +++-- ...{composeVision.kt => composeHtmlVision.kt} | 2 +- visionforge-compose-mpp/build.gradle.kts | 6 +++- .../compose/ComposeVisionRenderer.kt | 15 +++++++++ .../visionforge/compose/composeVision.kt | 24 ++++++++++++++ visionforge-core/build.gradle.kts | 2 +- .../kscience/visionforge/ControlVision.kt | 32 +++++++++++++++--- .../kscience/visionforge/html/VisionOfHtml.kt | 27 ++++----------- .../visionforge/html/VisionOfHtmlForm.kt | 5 +-- .../visionforge/ElementVisionRenderer.kt | 8 ++--- .../kscience/visionforge/JsVisionClient.kt | 8 ++++- .../kscience/visionforge/formRenderers.kt | 12 +++---- .../kscience/visionforge/inputRenderers.kt | 33 ++++++++++--------- .../visionforge/markup/MarkupPlugin.kt | 2 +- .../kscience/visionforge/plotly/plotlyJs.kt | 7 ++-- .../visionforge/tables/TableVisionJsPlugin.kt | 3 +- visionforge-threejs/build.gradle.kts | 2 +- .../visionforge/solid/three/ThreePlugin.kt | 6 ++-- .../build.gradle.kts | 2 +- 21 files changed, 144 insertions(+), 89 deletions(-) rename visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/html/{ComposeVisionRenderer.kt => ComposeHtmlVisionRenderer.kt} (65%) rename visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/html/{composeVision.kt => composeHtmlVision.kt} (96%) create mode 100644 visionforge-compose-mpp/src/commonMain/kotlin/space/kscience/visionforge/compose/ComposeVisionRenderer.kt create mode 100644 visionforge-compose-mpp/src/commonMain/kotlin/space/kscience/visionforge/compose/composeVision.kt diff --git a/demo/muon-monitor/build.gradle.kts b/demo/muon-monitor/build.gradle.kts index a3bc26e8..66673306 100644 --- a/demo/muon-monitor/build.gradle.kts +++ b/demo/muon-monitor/build.gradle.kts @@ -30,7 +30,6 @@ kscience { commonMain { implementation(projects.visionforgeSolid) - implementation(projects.visionforgeComposeHtml) } jvmMain { implementation("org.apache.commons:commons-math3:3.6.1") @@ -40,12 +39,15 @@ kscience { implementation("ch.qos.logback:logback-classic:1.2.11") } jsMain { +// implementation(projects.visionforgeComposeHtml) implementation(projects.visionforgeThreejs) //implementation(devNpm("webpack-bundle-analyzer", "4.4.0")) } } +kotlin{ + explicitApi = null +} -kotlin.explicitApi = null application { mainClass.set("ru.mipt.npm.muon.monitor.server.MMServerKt") diff --git a/visionforge-compose-html/build.gradle.kts b/visionforge-compose-html/build.gradle.kts index 1885365f..efcad990 100644 --- a/visionforge-compose-html/build.gradle.kts +++ b/visionforge-compose-html/build.gradle.kts @@ -4,9 +4,8 @@ plugins { } kscience { - jvm() js() -// wasm() + jvm() } kotlin { @@ -15,23 +14,22 @@ kotlin { commonMain { dependencies { api(projects.visionforgeCore) + } + } + jvmMain{ + //need this to placate compose compiler in MPP applications + dependencies{ api(compose.runtime) } } - val jvmMain by getting { + jsMain{ dependencies { - api(compose.foundation) - api(compose.material) - api(compose.preview) - } - } - - val jsMain by getting { - dependencies { - api(compose.html.core) api("app.softwork:bootstrap-compose:0.1.15") api("app.softwork:bootstrap-compose-icons:0.1.15") + + api(compose.runtime) + api(compose.html.core) } } } diff --git a/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/html/ComposeVisionRenderer.kt b/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/html/ComposeHtmlVisionRenderer.kt similarity index 65% rename from visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/html/ComposeVisionRenderer.kt rename to visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/html/ComposeHtmlVisionRenderer.kt index 91cb87be..f2b6db2f 100644 --- a/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/html/ComposeVisionRenderer.kt +++ b/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/html/ComposeHtmlVisionRenderer.kt @@ -9,20 +9,19 @@ import space.kscience.dataforge.meta.Meta import space.kscience.dataforge.names.Name import space.kscience.visionforge.ElementVisionRenderer import space.kscience.visionforge.Vision -import space.kscience.visionforge.VisionClient /** * An [ElementVisionRenderer] that could be used directly in Compose-html as well as a stand-alone renderer */ -public interface ComposeVisionRenderer: ElementVisionRenderer { +public interface ComposeHtmlVisionRenderer : ElementVisionRenderer { @Composable - public fun DOMScope.render(client: VisionClient, name: Name, vision: Vision, meta: Meta) + public fun DOMScope.render(name: Name, vision: Vision, meta: Meta) - override fun render(element: Element, client: VisionClient, name: Name, vision: Vision, meta: Meta) { + override fun render(element: Element, name: Name, vision: Vision, meta: Meta) { renderComposable(element) { Style(VisionForgeStyles) - render(client, name, vision, meta) + render(name, vision, meta) } } diff --git a/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/html/composeVision.kt b/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/html/composeHtmlVision.kt similarity index 96% rename from visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/html/composeVision.kt rename to visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/html/composeHtmlVision.kt index 9344f3ce..9c8b6c8c 100644 --- a/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/html/composeVision.kt +++ b/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/html/composeHtmlVision.kt @@ -48,7 +48,7 @@ public fun Vision( } DisposableEffect(vision, name, renderer, meta) { - renderer.render(scopeElement, client, name, vision, meta) + renderer.render(scopeElement, name, vision, meta) onDispose { scopeElement.clear() } diff --git a/visionforge-compose-mpp/build.gradle.kts b/visionforge-compose-mpp/build.gradle.kts index 0dc2b6d9..e4a447cd 100644 --- a/visionforge-compose-mpp/build.gradle.kts +++ b/visionforge-compose-mpp/build.gradle.kts @@ -5,7 +5,7 @@ plugins { kscience { jvm() - wasm() +// wasm() } kotlin { @@ -16,6 +16,10 @@ kotlin { api(projects.visionforgeCore) api(compose.runtime) api(compose.foundation) + } + } + jvmMain{ + dependencies{ api(compose.material) api(compose.preview) } diff --git a/visionforge-compose-mpp/src/commonMain/kotlin/space/kscience/visionforge/compose/ComposeVisionRenderer.kt b/visionforge-compose-mpp/src/commonMain/kotlin/space/kscience/visionforge/compose/ComposeVisionRenderer.kt new file mode 100644 index 00000000..81450070 --- /dev/null +++ b/visionforge-compose-mpp/src/commonMain/kotlin/space/kscience/visionforge/compose/ComposeVisionRenderer.kt @@ -0,0 +1,15 @@ +package space.kscience.visionforge.compose + +import androidx.compose.runtime.Composable +import space.kscience.dataforge.meta.Meta +import space.kscience.dataforge.names.Name +import space.kscience.visionforge.Vision +import space.kscience.visionforge.VisionClient + +public interface ComposeVisionRenderer { + public fun rateVision(vision: Vision): Int + @Composable + public fun render(client: VisionClient, name: Name, vision: Vision, meta: Meta) + + public companion object +} \ No newline at end of file diff --git a/visionforge-compose-mpp/src/commonMain/kotlin/space/kscience/visionforge/compose/composeVision.kt b/visionforge-compose-mpp/src/commonMain/kotlin/space/kscience/visionforge/compose/composeVision.kt new file mode 100644 index 00000000..2a7d3d97 --- /dev/null +++ b/visionforge-compose-mpp/src/commonMain/kotlin/space/kscience/visionforge/compose/composeVision.kt @@ -0,0 +1,24 @@ +package space.kscience.visionforge.compose + +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import space.kscience.dataforge.context.Context +import space.kscience.dataforge.meta.Meta +import space.kscience.dataforge.names.Name +import space.kscience.dataforge.names.asName +import space.kscience.visionforge.Vision + + +/** + * Render an Element vision via injected vision renderer inside compose-html + */ +@Composable +public fun Vision( + context: Context, + vision: Vision, + name: Name = "@vision[${vision.hashCode().toString(16)}]".asName(), + meta: Meta = Meta.EMPTY, + modifier: Modifier = Modifier, +) { + +} diff --git a/visionforge-core/build.gradle.kts b/visionforge-core/build.gradle.kts index bc7103b9..554ac33c 100644 --- a/visionforge-core/build.gradle.kts +++ b/visionforge-core/build.gradle.kts @@ -8,7 +8,7 @@ kscience { jvm() js() native() -// wasm() + wasm() useCoroutines() commonMain { api("space.kscience:dataforge-context:$dataforgeVersion") diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/ControlVision.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/ControlVision.kt index 36dfe003..f9ced040 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/ControlVision.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/ControlVision.kt @@ -2,12 +2,11 @@ package space.kscience.visionforge import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Job -import kotlinx.coroutines.flow.SharedFlow -import kotlinx.coroutines.flow.filterIsInstance -import kotlinx.coroutines.flow.launchIn -import kotlinx.coroutines.flow.onEach +import kotlinx.coroutines.flow.* +import kotlinx.coroutines.launch import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable +import kotlinx.serialization.Transient import space.kscience.dataforge.meta.* import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.parseAsName @@ -23,6 +22,9 @@ public abstract class VisionControlEvent : VisionEvent, MetaRepr { public interface ControlVision : Vision { public val controlEventFlow: SharedFlow + /** + * Fire a [VisionControlEvent] on this [ControlVision] + */ public suspend fun dispatchControlEvent(event: VisionControlEvent) override suspend fun receiveEvent(event: VisionEvent) { @@ -32,6 +34,28 @@ public interface ControlVision : Vision { } } +public fun ControlVision.asyncControlEvent( + event: VisionControlEvent, + scope: CoroutineScope = manager?.context ?: error("Can't fire asynchronous event for an orphan vision. Provide a scope."), +) { + scope.launch { dispatchControlEvent(event) } +} + + +@Serializable +public abstract class AbstractControlVision : AbstractVision(), ControlVision { + + @Transient + private val mutableControlEventFlow = MutableSharedFlow() + + override val controlEventFlow: SharedFlow + get() = mutableControlEventFlow + + override suspend fun dispatchControlEvent(event: VisionControlEvent) { + mutableControlEventFlow.emit(event) + } +} + /** * An event for submitting changes diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionOfHtml.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionOfHtml.kt index b496cf07..30932c37 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionOfHtml.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionOfHtml.kt @@ -2,21 +2,21 @@ package space.kscience.visionforge.html import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Job -import kotlinx.coroutines.flow.* +import kotlinx.coroutines.flow.filterIsInstance +import kotlinx.coroutines.flow.launchIn +import kotlinx.coroutines.flow.onEach import kotlinx.html.DIV import kotlinx.html.InputType import kotlinx.html.div import kotlinx.html.stream.createHTML import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable -import kotlinx.serialization.Transient import space.kscience.dataforge.meta.* import space.kscience.dataforge.names.asName import space.kscience.visionforge.* -@Serializable -public abstract class VisionOfHtml : AbstractVision() { +public interface VisionOfHtml : Vision { public var classes: Set get() = properties[::classes.name, false].stringList?.toSet() ?: emptySet() set(value) { @@ -26,7 +26,7 @@ public abstract class VisionOfHtml : AbstractVision() { @Serializable @SerialName("html.plain") -public class VisionOfPlainHtml : VisionOfHtml() { +public class VisionOfPlainHtml : AbstractVision(), VisionOfHtml { public var content: String? by properties.string() } @@ -59,26 +59,11 @@ public enum class InputFeedbackMode { NONE } -@Serializable -public abstract class VisionOfHtmlControl: VisionOfHtml(), ControlVision{ - - @Transient - private val mutableControlEventFlow = MutableSharedFlow() - - override val controlEventFlow: SharedFlow - get() = mutableControlEventFlow - - override suspend fun dispatchControlEvent(event: VisionControlEvent) { - mutableControlEventFlow.emit(event) - } -} - - @Serializable @SerialName("html.input") public open class VisionOfHtmlInput( public val inputType: String, -) : VisionOfHtmlControl() { +) : AbstractControlVision(), VisionOfHtml { public var value: Value? by properties.value() public var disabled: Boolean by properties.boolean { false } public var fieldName: String? by properties.string() diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionOfHtmlForm.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionOfHtmlForm.kt index 3f6d46ca..994a1d3a 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionOfHtmlForm.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionOfHtmlForm.kt @@ -8,6 +8,7 @@ import kotlinx.serialization.Serializable import space.kscience.dataforge.meta.Meta import space.kscience.dataforge.meta.node import space.kscience.dataforge.meta.string +import space.kscience.visionforge.AbstractControlVision import space.kscience.visionforge.DataControl import space.kscience.visionforge.onSubmit @@ -18,7 +19,7 @@ import space.kscience.visionforge.onSubmit @SerialName("html.form") public class VisionOfHtmlForm( public val formId: String, -) : VisionOfHtmlControl(), DataControl { +) : AbstractControlVision(), DataControl, VisionOfHtml { public var values: Meta? by properties.node() } @@ -45,7 +46,7 @@ public fun VisionOfHtmlForm.onFormSubmit(scope: CoroutineScope, block: (Meta?) - @Serializable @SerialName("html.button") -public class VisionOfHtmlButton : VisionOfHtmlControl(), DataControl { +public class VisionOfHtmlButton : AbstractControlVision(), DataControl, VisionOfHtml { public var label: String? by properties.string() } diff --git a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/ElementVisionRenderer.kt b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/ElementVisionRenderer.kt index dc0c7941..305fa70b 100644 --- a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/ElementVisionRenderer.kt +++ b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/ElementVisionRenderer.kt @@ -30,7 +30,6 @@ public interface ElementVisionRenderer { */ public fun render( element: Element, - client: VisionClient, name: Name, vision: Vision, meta: Meta = Meta.EMPTY, @@ -49,7 +48,7 @@ public interface ElementVisionRenderer { public class SingleTypeVisionRenderer( public val kClass: KClass, private val acceptRating: Int = ElementVisionRenderer.DEFAULT_RATING, - private val renderFunction: TagConsumer.(name: Name, client: VisionClient, vision: T, meta: Meta) -> Unit, + private val renderFunction: TagConsumer.(name: Name, vision: T, meta: Meta) -> Unit, ) : ElementVisionRenderer { override fun rateVision(vision: Vision): Int = @@ -57,19 +56,18 @@ public class SingleTypeVisionRenderer( override fun render( element: Element, - client: VisionClient, name: Name, vision: Vision, meta: Meta, ) { element.clear() element.append { - renderFunction(name, client, kClass.cast(vision), meta) + renderFunction(name, kClass.cast(vision), meta) } } } public inline fun ElementVisionRenderer( acceptRating: Int = ElementVisionRenderer.DEFAULT_RATING, - noinline renderFunction: TagConsumer.(name: Name, client: VisionClient, vision: T, meta: Meta) -> Unit, + noinline renderFunction: TagConsumer.(name: Name, vision: T, meta: Meta) -> Unit, ): ElementVisionRenderer = SingleTypeVisionRenderer(T::class, acceptRating, renderFunction) diff --git a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/JsVisionClient.kt b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/JsVisionClient.kt index db88bea4..946de13c 100644 --- a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/JsVisionClient.kt +++ b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/JsVisionClient.kt @@ -96,7 +96,13 @@ public class JsVisionClient : AbstractPlugin(), VisionClient { vision.setAsRoot(visionManager) val renderer: ElementVisionRenderer = findRendererFor(vision) ?: error("Could not find renderer for ${vision::class}") - renderer.render(element, this, name, vision, outputMeta) + //subscribe to a backwards events propagation for control visions + if(vision is ControlVision){ + vision.controlEventFlow.onEach { + sendEvent(name,it) + }.launchIn(context) + } + renderer.render(element, name, vision, outputMeta) } private fun startVisionUpdate(element: Element, visionName: Name, vision: Vision, outputMeta: Meta) { diff --git a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/formRenderers.kt b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/formRenderers.kt index 67c5b95e..f82850cf 100644 --- a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/formRenderers.kt +++ b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/formRenderers.kt @@ -49,7 +49,7 @@ public fun VisionClient.sendMetaEvent(targetName: Name, payload: MetaRepr): Unit } internal val formVisionRenderer: ElementVisionRenderer = - ElementVisionRenderer { name, client, vision, _ -> + ElementVisionRenderer { name, vision, _ -> val form = document.getElementById(vision.formId) as? HTMLFormElement ?: error("An element with id = '${vision.formId} is not a form") @@ -69,22 +69,18 @@ internal val formVisionRenderer: ElementVisionRenderer = form.onsubmit = { event -> event.preventDefault() val formData = FormData(form).toMeta() - client.context.launch { - client.sendEvent(name, VisionSubmitEvent(name = name, payload = formData)) - } + vision.asyncControlEvent(VisionSubmitEvent(name = name, payload = formData)) console.info("Sent form data: ${formData.toMap()}") false } } internal val buttonVisionRenderer: ElementVisionRenderer = - ElementVisionRenderer { name, client, vision, _ -> + ElementVisionRenderer { name, vision, _ -> button(type = ButtonType.button).also { button -> button.subscribeToVision(vision) button.onclick = { - client.context.launch { - client.sendEvent(name, VisionSubmitEvent(name = name)) - } + vision.asyncControlEvent(VisionSubmitEvent(name = name)) } vision.useProperty(VisionOfHtmlButton::label) { button.innerHTML = it ?: "" diff --git a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/inputRenderers.kt b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/inputRenderers.kt index 3deb00da..4e7a9d36 100644 --- a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/inputRenderers.kt +++ b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/inputRenderers.kt @@ -35,7 +35,7 @@ private fun HTMLInputElement.subscribeToInput(inputVision: VisionOfHtmlInput) { } internal val htmlVisionRenderer: ElementVisionRenderer = - ElementVisionRenderer { _, _, vision, _ -> + ElementVisionRenderer { _, vision, _ -> div().also { div -> div.subscribeToVision(vision) vision.useProperty(VisionOfPlainHtml::content) { @@ -47,17 +47,18 @@ internal val htmlVisionRenderer: ElementVisionRenderer = internal val inputVisionRenderer: ElementVisionRenderer = ElementVisionRenderer( acceptRating = ElementVisionRenderer.DEFAULT_RATING - 1 -) { name, client, vision, _ -> +) { name, vision, _ -> + input { type = InputType.text }.also { htmlInputElement -> htmlInputElement.onchange = { - client.sendEventAsync(name, VisionValueChangeEvent(htmlInputElement.value.asValue(), name)) + vision.asyncControlEvent( VisionValueChangeEvent(htmlInputElement.value.asValue(), name)) } htmlInputElement.oninput = { - client.sendEventAsync(name, VisionInputEvent(htmlInputElement.value.asValue(), name)) + vision.asyncControlEvent(VisionInputEvent(htmlInputElement.value.asValue(), name)) } htmlInputElement.subscribeToInput(vision) @@ -68,17 +69,17 @@ internal val inputVisionRenderer: ElementVisionRenderer = ElementVisionRenderer< } internal val checkboxVisionRenderer: ElementVisionRenderer = - ElementVisionRenderer { name, client, vision, _ -> + ElementVisionRenderer { name, vision, _ -> input { type = InputType.checkBox }.also { htmlInputElement -> htmlInputElement.onchange = { - client.sendEventAsync(name, VisionValueChangeEvent(htmlInputElement.value.asValue(), name)) + vision.asyncControlEvent(VisionValueChangeEvent(htmlInputElement.value.asValue(), name)) } htmlInputElement.oninput = { - client.sendEventAsync(name, VisionInputEvent(htmlInputElement.value.asValue(), name)) + vision.asyncControlEvent(VisionInputEvent(htmlInputElement.value.asValue(), name)) } @@ -90,17 +91,17 @@ internal val checkboxVisionRenderer: ElementVisionRenderer = } internal val textVisionRenderer: ElementVisionRenderer = - ElementVisionRenderer { name, client, vision, _ -> + ElementVisionRenderer { name, vision, _ -> input { type = InputType.text }.also { htmlInputElement -> htmlInputElement.onchange = { - client.sendEventAsync(name, VisionValueChangeEvent(htmlInputElement.value.asValue(), name)) + vision.asyncControlEvent(VisionValueChangeEvent(htmlInputElement.value.asValue(), name)) } htmlInputElement.oninput = { - client.sendEventAsync(name, VisionInputEvent(htmlInputElement.value.asValue(), name)) + vision.asyncControlEvent(VisionInputEvent(htmlInputElement.value.asValue(), name)) } htmlInputElement.subscribeToInput(vision) @@ -111,20 +112,20 @@ internal val textVisionRenderer: ElementVisionRenderer = } internal val numberVisionRenderer: ElementVisionRenderer = - ElementVisionRenderer { name, client, vision, _ -> + ElementVisionRenderer { name, vision, _ -> input { type = InputType.number }.also { htmlInputElement -> htmlInputElement.onchange = { htmlInputElement.value.toDoubleOrNull()?.let { - client.sendEventAsync(name, VisionValueChangeEvent(it.asValue(), name)) + vision.asyncControlEvent(VisionValueChangeEvent(it.asValue(), name)) } } htmlInputElement.oninput = { htmlInputElement.value.toDoubleOrNull()?.let { - client.sendEventAsync(name, VisionInputEvent(it.asValue(), name)) + vision.asyncControlEvent(VisionInputEvent(it.asValue(), name)) } } @@ -137,7 +138,7 @@ internal val numberVisionRenderer: ElementVisionRenderer = } internal val rangeVisionRenderer: ElementVisionRenderer = - ElementVisionRenderer { name, client, vision, _ -> + ElementVisionRenderer { name, vision, _ -> input { type = InputType.range min = vision.min.toString() @@ -147,13 +148,13 @@ internal val rangeVisionRenderer: ElementVisionRenderer = htmlInputElement.onchange = { htmlInputElement.value.toDoubleOrNull()?.let { - client.sendEventAsync(name, VisionValueChangeEvent(it.asValue(), name)) + vision.asyncControlEvent(VisionValueChangeEvent(it.asValue(), name)) } } htmlInputElement.oninput = { htmlInputElement.value.toDoubleOrNull()?.let { - client.sendEventAsync(name, VisionInputEvent(it.asValue(), name)) + vision.asyncControlEvent(VisionInputEvent(it.asValue(), name)) } } diff --git a/visionforge-markdown/src/jsMain/kotlin/space/kscience/visionforge/markup/MarkupPlugin.kt b/visionforge-markdown/src/jsMain/kotlin/space/kscience/visionforge/markup/MarkupPlugin.kt index 4f3122c3..d6df2162 100644 --- a/visionforge-markdown/src/jsMain/kotlin/space/kscience/visionforge/markup/MarkupPlugin.kt +++ b/visionforge-markdown/src/jsMain/kotlin/space/kscience/visionforge/markup/MarkupPlugin.kt @@ -27,7 +27,7 @@ public actual class MarkupPlugin : VisionPlugin(), ElementVisionRenderer { else -> ElementVisionRenderer.ZERO_RATING } - override fun render(element: Element, client: VisionClient, name: Name, vision: Vision, meta: Meta) { + override fun render(element: Element,name: Name, vision: Vision, meta: Meta) { require(vision is VisionOfMarkup) { "The vision is not a markup vision" } val div = document.createElement("div") val flavour = when (vision.format) { diff --git a/visionforge-plotly/src/jsMain/kotlin/space/kscience/visionforge/plotly/plotlyJs.kt b/visionforge-plotly/src/jsMain/kotlin/space/kscience/visionforge/plotly/plotlyJs.kt index 99a0795e..074be6dc 100644 --- a/visionforge-plotly/src/jsMain/kotlin/space/kscience/visionforge/plotly/plotlyJs.kt +++ b/visionforge-plotly/src/jsMain/kotlin/space/kscience/visionforge/plotly/plotlyJs.kt @@ -10,7 +10,10 @@ import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.asName import space.kscience.plotly.PlotlyConfig import space.kscience.plotly.plot -import space.kscience.visionforge.* +import space.kscience.visionforge.ElementVisionRenderer +import space.kscience.visionforge.JsVisionClient +import space.kscience.visionforge.Vision +import space.kscience.visionforge.VisionPlugin public actual class PlotlyPlugin : VisionPlugin(), ElementVisionRenderer { public val visionClient: JsVisionClient by require(JsVisionClient) @@ -24,7 +27,7 @@ public actual class PlotlyPlugin : VisionPlugin(), ElementVisionRenderer { else -> ElementVisionRenderer.ZERO_RATING } - override fun render(element: Element, client: VisionClient, name: Name, vision: Vision, meta: Meta) { + override fun render(element: Element, name: Name, vision: Vision, meta: Meta) { val plot = (vision as? VisionOfPlotly)?.plot ?: error("VisionOfPlotly expected but ${vision::class} found") val config = PlotlyConfig.read(meta) element.plot(config, plot) diff --git a/visionforge-tables/src/jsMain/kotlin/space/kscience/visionforge/tables/TableVisionJsPlugin.kt b/visionforge-tables/src/jsMain/kotlin/space/kscience/visionforge/tables/TableVisionJsPlugin.kt index f9ef25c3..ba11976a 100644 --- a/visionforge-tables/src/jsMain/kotlin/space/kscience/visionforge/tables/TableVisionJsPlugin.kt +++ b/visionforge-tables/src/jsMain/kotlin/space/kscience/visionforge/tables/TableVisionJsPlugin.kt @@ -14,7 +14,6 @@ import space.kscience.dataforge.names.asName import space.kscience.visionforge.ElementVisionRenderer import space.kscience.visionforge.JsVisionClient import space.kscience.visionforge.Vision -import space.kscience.visionforge.VisionClient import tabulator.Tabulator import tabulator.TabulatorFull @@ -35,7 +34,7 @@ public class TableVisionJsPlugin : AbstractPlugin(), ElementVisionRenderer { else -> ElementVisionRenderer.ZERO_RATING } - override fun render(element: Element, client: VisionClient, name: Name, vision: Vision, meta: Meta) { + override fun render(element: Element, name: Name, vision: Vision, meta: Meta) { val table: VisionOfTable = (vision as? VisionOfTable) ?: error("VisionOfTable expected but ${vision::class} found") diff --git a/visionforge-threejs/build.gradle.kts b/visionforge-threejs/build.gradle.kts index f385061c..b066887c 100644 --- a/visionforge-threejs/build.gradle.kts +++ b/visionforge-threejs/build.gradle.kts @@ -14,10 +14,10 @@ kscience { commonMain { api(projects.visionforgeSolid) - api(projects.visionforgeComposeHtml) } jsMain { + api(projects.visionforgeComposeHtml) implementation(npm("three", "0.143.0")) implementation(npm("three-csg-ts", "3.1.13")) implementation(npm("three.meshline", "1.4.0")) diff --git a/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/ThreePlugin.kt b/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/ThreePlugin.kt index 5691d1f7..30010a12 100644 --- a/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/ThreePlugin.kt +++ b/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/ThreePlugin.kt @@ -10,7 +10,7 @@ import space.kscience.dataforge.context.* import space.kscience.dataforge.meta.Meta import space.kscience.dataforge.names.* import space.kscience.visionforge.* -import space.kscience.visionforge.html.ComposeVisionRenderer +import space.kscience.visionforge.html.ComposeHtmlVisionRenderer import space.kscience.visionforge.solid.* import space.kscience.visionforge.solid.specifications.Canvas3DOptions import space.kscience.visionforge.solid.three.compose.ThreeView @@ -22,7 +22,7 @@ import three.objects.Group as ThreeGroup /** * A plugin that handles Three Object3D representation of Visions. */ -public class ThreePlugin : AbstractPlugin(), ComposeVisionRenderer { +public class ThreePlugin : AbstractPlugin(), ComposeHtmlVisionRenderer { override val tag: PluginTag get() = Companion.tag public val solids: Solids by require(Solids) @@ -186,7 +186,7 @@ public class ThreePlugin : AbstractPlugin(), ComposeVisionRenderer { } @Composable - override fun DOMScope.render(client: VisionClient, name: Name, vision: Vision, meta: Meta) { + override fun DOMScope.render(name: Name, vision: Vision, meta: Meta) { require(vision is Solid) { "Expected Solid but found ${vision::class}" } ThreeView(context, vision, null, Canvas3DOptions.read(meta)) } diff --git a/visionforge-threejs/visionforge-threejs-server/build.gradle.kts b/visionforge-threejs/visionforge-threejs-server/build.gradle.kts index df821866..cf62eede 100644 --- a/visionforge-threejs/visionforge-threejs-server/build.gradle.kts +++ b/visionforge-threejs/visionforge-threejs-server/build.gradle.kts @@ -1,3 +1,4 @@ + plugins { id("space.kscience.gradle.mpp") alias(spclibs.plugins.compose) @@ -22,7 +23,6 @@ kscience { commonMain { api(projects.visionforgeSolid) - api(projects.visionforgeComposeHtml) } jvmMain { From f0db286ce645fbea36794b4927fc5992d9bc3e11 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Fri, 16 Feb 2024 18:21:09 +0300 Subject: [PATCH 36/41] Finalize refactor for 0.4 --- CHANGELOG.md | 15 +- README.md | 26 +- build.gradle.kts | 2 +- demo/compose-desktop-demo/README.md | 4 + .../api/compose-desktop-demo.api | 17 ++ demo/compose-desktop-demo/build.gradle.kts | 40 +++ .../src/jvmMain/kotlin/main.kt | 33 +++ .../visionforge/gdml/demo/GdmlJsDemoApp.kt | 8 +- .../src/jsMain/kotlin/JsPlaygroundApp.kt | 8 +- demo/muon-monitor/api/muon-monitor.api | 9 + demo/muon-monitor/build.gradle.kts | 2 +- .../ru/mipt/npm/muon/monitor/MMDemoApp.kt | 4 +- demo/playground/api/playground.api | 5 + .../src/jsMain/kotlin/playgroundMain.kt | 2 +- .../visionforge/solid/demo/ThreeDemoApp.kt | 4 +- settings.gradle.kts | 3 +- visionforge-compose-html/build.gradle.kts | 7 +- .../html/ComposeHtmlVisionRenderer.kt | 1 - .../visionforge/html/PropertyEditor.kt | 7 +- .../kscience/visionforge/html/TreeStyles.kt | 22 -- .../visionforge/html/VisionForgeStyles.kt | 23 +- .../compose/ComposeVisionRenderer.kt | 15 - .../visionforge/compose/composeVision.kt | 24 -- visionforge-compose-multiplatform/README.md | 21 ++ .../build.gradle.kts | 17 +- .../compose/ComposeVisionClient.kt | 134 +++++++++ .../compose/ComposeVisionRenderer.kt | 47 +++ .../visionforge/compose/MetaViewer.kt | 69 +++++ .../visionforge/compose/PropertyEditor.kt | 174 +++++++++++ .../visionforge/compose/valueChooser.kt | 270 ++++++++++++++++++ visionforge-core/README.md | 4 +- visionforge-core/api/visionforge-core.api | 174 +++++------ .../space/kscience/visionforge/StyleSheet.kt | 2 +- .../kscience/visionforge/VisionManager.kt | 2 + .../kscience/visionforge/html/VisionOfHtml.kt | 16 +- .../visionforge/html/VisionTagConsumer.kt | 2 +- .../visionforge/meta/VisionPropertyTest.kt | 2 + .../visionforge/{ => html}/Application.kt | 4 +- .../{ => html}/ElementVisionRenderer.kt | 3 +- .../visionforge/{ => html}/JsVisionClient.kt | 37 +-- .../visionforge/{ => html}/formRenderers.kt | 5 +- .../visionforge/{ => html}/inputRenderers.kt | 13 +- .../space/kscience/visionforge/FormTest.kt | 1 + .../visionforge/meta/PropertyFlowTest.kt | 65 +++++ visionforge-gdml/README.md | 4 +- visionforge-jupyter/README.md | 4 +- .../src/jsMain/kotlin/VFNotebookClient.kt | 8 +- .../src/jsMain/kotlin/commonJupyter.kt | 2 +- visionforge-markdown/README.md | 4 +- .../visionforge/markup/MarkupPlugin.kt | 6 +- visionforge-plotly/README.md | 4 +- .../kscience/visionforge/plotly/plotlyJs.kt | 4 +- visionforge-server/README.md | 4 +- visionforge-solid/README.md | 4 +- visionforge-solid/api/visionforge-solid.api | 25 +- visionforge-solid/build.gradle.kts | 1 + .../visionforge/solid/SolidMaterial.kt | 2 + .../solid/specifications/Canvas3DOptions.kt | 2 + .../solid/specifications/Canvas3DUIScheme.kt | 8 +- visionforge-tables/README.md | 4 +- .../visionforge/tables/TableVisionJsPlugin.kt | 4 +- visionforge-threejs/README.md | 4 +- .../visionforge/solid/three/ThreePlugin.kt | 7 +- .../solid/three/compose/ThreeControls.kt | 2 - .../solid/three/compose/ThreeView.kt | 1 - .../visionforge-threejs-server/README.md | 4 +- .../build.gradle.kts | 1 + .../kscience/visionforge/three/jsMain.kt | 2 +- 68 files changed, 1175 insertions(+), 279 deletions(-) create mode 100644 demo/compose-desktop-demo/README.md create mode 100644 demo/compose-desktop-demo/api/compose-desktop-demo.api create mode 100644 demo/compose-desktop-demo/build.gradle.kts create mode 100644 demo/compose-desktop-demo/src/jvmMain/kotlin/main.kt delete mode 100644 visionforge-compose-mpp/src/commonMain/kotlin/space/kscience/visionforge/compose/ComposeVisionRenderer.kt delete mode 100644 visionforge-compose-mpp/src/commonMain/kotlin/space/kscience/visionforge/compose/composeVision.kt create mode 100644 visionforge-compose-multiplatform/README.md rename {visionforge-compose-mpp => visionforge-compose-multiplatform}/build.gradle.kts (62%) create mode 100644 visionforge-compose-multiplatform/src/commonMain/kotlin/space/kscience/visionforge/compose/ComposeVisionClient.kt create mode 100644 visionforge-compose-multiplatform/src/commonMain/kotlin/space/kscience/visionforge/compose/ComposeVisionRenderer.kt create mode 100644 visionforge-compose-multiplatform/src/jvmMain/kotlin/space/kscience/visionforge/compose/MetaViewer.kt create mode 100644 visionforge-compose-multiplatform/src/jvmMain/kotlin/space/kscience/visionforge/compose/PropertyEditor.kt create mode 100644 visionforge-compose-multiplatform/src/jvmMain/kotlin/space/kscience/visionforge/compose/valueChooser.kt rename visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/{ => html}/Application.kt (94%) rename visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/{ => html}/ElementVisionRenderer.kt (96%) rename visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/{ => html}/JsVisionClient.kt (98%) rename visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/{ => html}/formRenderers.kt (95%) rename visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/{ => html}/inputRenderers.kt (92%) create mode 100644 visionforge-core/src/jvmTest/kotlin/space/kscience/visionforge/meta/PropertyFlowTest.kt diff --git a/CHANGELOG.md b/CHANGELOG.md index eaf7966f..9c2a4746 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,8 +5,6 @@ ### Added ### Changed -- **Breaking API** Move vision cache to upper level for renderers to avoid re-creating visions for page reload. -- **Breaking API** Forms refactor ### Deprecated @@ -16,6 +14,19 @@ ### Security +## 0.4.0 - 2024-02-16 + +### Added + +- Added compose-mpp rendering. + +### Changed + +- **Breaking API** Move vision cache to upper level for renderers to avoid re-creating visions for page reload. +- **Breaking API** Forms refactor. +- **Breaking API** Migrated from React to Compose-html. +- **Breaking API** changed js package for `visionforge-core` to `space.kscience.visionforge.html` to avoid mixing html and generic parts. + ## 0.3.0 - 2023-12-23 ### Added diff --git a/README.md b/README.md index f8fb04fe..b75dcb55 100644 --- a/README.md +++ b/README.md @@ -70,7 +70,11 @@ To learn more about DataForge, please consult the following URLs: > > **Maturity**: EXPERIMENTAL -### [ui](ui) +### [visionforge-compose-html](visionforge-compose-html) +> +> **Maturity**: EXPERIMENTAL + +### [visionforge-compose-multiplatform](visionforge-compose-multiplatform) > > **Maturity**: EXPERIMENTAL @@ -111,6 +115,10 @@ To learn more about DataForge, please consult the following URLs: > > **Maturity**: EXPERIMENTAL +### [demo/compose-desktop-demo](demo/compose-desktop-demo) +> +> **Maturity**: EXPERIMENTAL + ### [demo/gdml](demo/gdml) > > **Maturity**: EXPERIMENTAL @@ -135,22 +143,6 @@ To learn more about DataForge, please consult the following URLs: > > **Maturity**: EXPERIMENTAL -### [ui/bootstrap](ui/bootstrap) -> -> **Maturity**: EXPERIMENTAL - -### [ui/compose](ui/compose) -> -> **Maturity**: EXPERIMENTAL - -### [ui/react](ui/react) -> -> **Maturity**: EXPERIMENTAL - -### [ui/ring](ui/ring) -> -> **Maturity**: EXPERIMENTAL - ### [visionforge-jupyter/visionforge-jupyter-common](visionforge-jupyter/visionforge-jupyter-common) > Jupyter api artifact including all common modules > diff --git a/build.gradle.kts b/build.gradle.kts index debd7323..335299c2 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -10,7 +10,7 @@ val dataforgeVersion by extra("0.8.0") allprojects { group = "space.kscience" - version = "0.4.0-dev-3" + version = "0.4.0" } subprojects { diff --git a/demo/compose-desktop-demo/README.md b/demo/compose-desktop-demo/README.md new file mode 100644 index 00000000..591acad6 --- /dev/null +++ b/demo/compose-desktop-demo/README.md @@ -0,0 +1,4 @@ +# Module compose-desktop-demo + + + diff --git a/demo/compose-desktop-demo/api/compose-desktop-demo.api b/demo/compose-desktop-demo/api/compose-desktop-demo.api new file mode 100644 index 00000000..7a968e47 --- /dev/null +++ b/demo/compose-desktop-demo/api/compose-desktop-demo.api @@ -0,0 +1,17 @@ +public final class ComposableSingletons$MainKt { + public static final field INSTANCE LComposableSingletons$MainKt; + public static field lambda-1 Lkotlin/jvm/functions/Function2; + public static field lambda-2 Lkotlin/jvm/functions/Function3; + public static field lambda-3 Lkotlin/jvm/functions/Function3; + public fun ()V + public final fun getLambda-1$compose_desktop_demo ()Lkotlin/jvm/functions/Function2; + public final fun getLambda-2$compose_desktop_demo ()Lkotlin/jvm/functions/Function3; + public final fun getLambda-3$compose_desktop_demo ()Lkotlin/jvm/functions/Function3; +} + +public final class MainKt { + public static final fun App (Landroidx/compose/runtime/Composer;I)V + public static final fun main ()V + public static synthetic fun main ([Ljava/lang/String;)V +} + diff --git a/demo/compose-desktop-demo/build.gradle.kts b/demo/compose-desktop-demo/build.gradle.kts new file mode 100644 index 00000000..ff6bc292 --- /dev/null +++ b/demo/compose-desktop-demo/build.gradle.kts @@ -0,0 +1,40 @@ +plugins { + id("space.kscience.gradle.mpp") + alias(spclibs.plugins.compose) +} + +kscience { + jvm() + useCoroutines() + + commonMain{ + implementation(projects.visionforgeSolid) + } + + jvmMain { + implementation(projects.visionforgeComposeMultiplatform) + } +} + +kotlin{ + explicitApi = null + sourceSets{ + commonMain{ + dependencies { + implementation(compose.desktop.currentOs) + api(compose.preview) + } + } + } +} + + +compose{ + desktop{ + desktop { + application { + mainClass = "MainKt" + } + } + } +} \ No newline at end of file diff --git a/demo/compose-desktop-demo/src/jvmMain/kotlin/main.kt b/demo/compose-desktop-demo/src/jvmMain/kotlin/main.kt new file mode 100644 index 00000000..c9a1b8d6 --- /dev/null +++ b/demo/compose-desktop-demo/src/jvmMain/kotlin/main.kt @@ -0,0 +1,33 @@ +import androidx.compose.desktop.ui.tooling.preview.Preview +import androidx.compose.material.MaterialTheme +import androidx.compose.runtime.Composable +import androidx.compose.runtime.remember +import androidx.compose.ui.window.Window +import androidx.compose.ui.window.application +import space.kscience.dataforge.meta.set +import space.kscience.visionforge.compose.PropertyEditor +import space.kscience.visionforge.solid.specifications.Canvas3DOptions + +@Composable +@Preview +fun App(){ + val options = remember { + Canvas3DOptions{ + meta["custom.field"] = 32 + } + } + PropertyEditor( + properties = options.meta, + descriptor = Canvas3DOptions.descriptor, + expanded = true + ) +} + + +fun main() = application { + Window(onCloseRequest = ::exitApplication) { + MaterialTheme { + App() + } + } +} diff --git a/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GdmlJsDemoApp.kt b/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GdmlJsDemoApp.kt index 5add1d6f..3f4d775c 100644 --- a/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GdmlJsDemoApp.kt +++ b/demo/gdml/src/jsMain/kotlin/space/kscience/visionforge/gdml/demo/GdmlJsDemoApp.kt @@ -6,14 +6,14 @@ import org.jetbrains.compose.web.renderComposable import org.w3c.dom.Document import space.kscience.dataforge.context.Context import space.kscience.gdml.GdmlShowCase -import space.kscience.visionforge.Application import space.kscience.visionforge.Colors import space.kscience.visionforge.gdml.toVision -import space.kscience.visionforge.html.TreeStyles +import space.kscience.visionforge.html.Application +import space.kscience.visionforge.html.VisionForgeStyles +import space.kscience.visionforge.html.startApplication import space.kscience.visionforge.solid.ambientLight import space.kscience.visionforge.solid.invoke import space.kscience.visionforge.solid.three.ThreePlugin -import space.kscience.visionforge.startApplication private class GDMLDemoApp : Application { @@ -33,7 +33,7 @@ private class GDMLDemoApp : Application { } renderComposable(element) { - Style(TreeStyles) + Style(VisionForgeStyles) Style { "html" { height(100.percent) diff --git a/demo/js-playground/src/jsMain/kotlin/JsPlaygroundApp.kt b/demo/js-playground/src/jsMain/kotlin/JsPlaygroundApp.kt index 71de963a..b544b17a 100644 --- a/demo/js-playground/src/jsMain/kotlin/JsPlaygroundApp.kt +++ b/demo/js-playground/src/jsMain/kotlin/JsPlaygroundApp.kt @@ -5,16 +5,16 @@ import org.w3c.dom.Document import space.kscience.dataforge.context.Context import space.kscience.plotly.models.Trace import space.kscience.plotly.scatter -import space.kscience.visionforge.Application import space.kscience.visionforge.Colors +import space.kscience.visionforge.html.Application import space.kscience.visionforge.html.Tabs -import space.kscience.visionforge.html.TreeStyles +import space.kscience.visionforge.html.VisionForgeStyles +import space.kscience.visionforge.html.startApplication import space.kscience.visionforge.markup.MarkupPlugin import space.kscience.visionforge.plotly.PlotlyPlugin import space.kscience.visionforge.solid.* import space.kscience.visionforge.solid.three.ThreePlugin import space.kscience.visionforge.solid.three.compose.ThreeView -import space.kscience.visionforge.startApplication import kotlin.random.Random fun Trace.appendXYLatest(x: Number, y: Number, history: Int = 400, xErr: Number? = null, yErr: Number? = null) { @@ -40,7 +40,7 @@ private class JsPlaygroundApp : Application { val element = document.getElementById("playground") ?: error("Element with id 'playground' not found on page") renderComposable(element) { - Style(TreeStyles) + Style(VisionForgeStyles) Div({ style { padding(0.pt) diff --git a/demo/muon-monitor/api/muon-monitor.api b/demo/muon-monitor/api/muon-monitor.api index c0b6c4d8..24b6218c 100644 --- a/demo/muon-monitor/api/muon-monitor.api +++ b/demo/muon-monitor/api/muon-monitor.api @@ -1,4 +1,5 @@ public final class ru/mipt/npm/muon/monitor/Event { + public static final field $stable I public static final field Companion Lru/mipt/npm/muon/monitor/Event$Companion; public fun (ILjava/util/List;Ljava/util/Collection;)V public final fun component1 ()I @@ -15,6 +16,7 @@ public final class ru/mipt/npm/muon/monitor/Event { } public final class ru/mipt/npm/muon/monitor/Event$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field $stable I public static final field INSTANCE Lru/mipt/npm/muon/monitor/Event$$serializer; public fun childSerializers ()[Lkotlinx/serialization/KSerializer; public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; @@ -30,6 +32,7 @@ public final class ru/mipt/npm/muon/monitor/Event$Companion { } public final class ru/mipt/npm/muon/monitor/Model { + public static final field $stable I public fun (Lspace/kscience/visionforge/VisionManager;)V public final fun displayEvent (Lru/mipt/npm/muon/monitor/Event;)V public final fun encodeToString ()Ljava/lang/String; @@ -40,6 +43,7 @@ public final class ru/mipt/npm/muon/monitor/Model { } public final class ru/mipt/npm/muon/monitor/Monitor { + public static final field $stable I public static final field CENTRAL_LAYER_Z F public static final field GEOMETRY_TOLERANCE D public static final field INSTANCE Lru/mipt/npm/muon/monitor/Monitor; @@ -57,6 +61,7 @@ public final class ru/mipt/npm/muon/monitor/ReadResourceKt { } public final class ru/mipt/npm/muon/monitor/SC1 { + public static final field $stable I public fun (Ljava/lang/String;Lspace/kscience/visionforge/solid/Float32Vector3D;FFF)V public synthetic fun (Ljava/lang/String;Lspace/kscience/visionforge/solid/Float32Vector3D;FFFILkotlin/jvm/internal/DefaultConstructorMarker;)V public final fun getCenter ()Lspace/kscience/visionforge/solid/Float32Vector3D; @@ -67,6 +72,7 @@ public final class ru/mipt/npm/muon/monitor/SC1 { } public final class ru/mipt/npm/muon/monitor/SC16 { + public static final field $stable I public fun (Ljava/lang/String;Lspace/kscience/visionforge/solid/Float32Vector3D;)V public final fun getCenter ()Lspace/kscience/visionforge/solid/Float32Vector3D; public final fun getName ()Ljava/lang/String; @@ -81,6 +87,7 @@ public final class ru/mipt/npm/muon/monitor/server/MMServerKt { } public final class ru/mipt/npm/muon/monitor/sim/Cos2TrackGenerator : ru/mipt/npm/muon/monitor/sim/TrackGenerator { + public static final field $stable I public fun (Lorg/apache/commons/math3/random/RandomGenerator;DFF)V public synthetic fun (Lorg/apache/commons/math3/random/RandomGenerator;DFFILkotlin/jvm/internal/DefaultConstructorMarker;)V public fun generate ()Lorg/apache/commons/math3/geometry/euclidean/threed/Line; @@ -91,6 +98,7 @@ public final class ru/mipt/npm/muon/monitor/sim/Cos2TrackGenerator : ru/mipt/npm } public final class ru/mipt/npm/muon/monitor/sim/FixedAngleGenerator : ru/mipt/npm/muon/monitor/sim/TrackGenerator { + public static final field $stable I public fun (Lorg/apache/commons/math3/random/RandomGenerator;DDFF)V public synthetic fun (Lorg/apache/commons/math3/random/RandomGenerator;DDFFILkotlin/jvm/internal/DefaultConstructorMarker;)V public fun generate ()Lorg/apache/commons/math3/geometry/euclidean/threed/Line; @@ -134,6 +142,7 @@ public abstract interface class ru/mipt/npm/muon/monitor/sim/TrackGenerator { } public final class ru/mipt/npm/muon/monitor/sim/UniformTrackGenerator : ru/mipt/npm/muon/monitor/sim/TrackGenerator { + public static final field $stable I public fun (Lorg/apache/commons/math3/random/RandomGenerator;FF)V public synthetic fun (Lorg/apache/commons/math3/random/RandomGenerator;FFILkotlin/jvm/internal/DefaultConstructorMarker;)V public fun generate ()Lorg/apache/commons/math3/geometry/euclidean/threed/Line; diff --git a/demo/muon-monitor/build.gradle.kts b/demo/muon-monitor/build.gradle.kts index 66673306..3893e40e 100644 --- a/demo/muon-monitor/build.gradle.kts +++ b/demo/muon-monitor/build.gradle.kts @@ -30,6 +30,7 @@ kscience { commonMain { implementation(projects.visionforgeSolid) + implementation(projects.visionforgeComposeHtml) } jvmMain { implementation("org.apache.commons:commons-math3:3.6.1") @@ -39,7 +40,6 @@ kscience { implementation("ch.qos.logback:logback-classic:1.2.11") } jsMain { -// implementation(projects.visionforgeComposeHtml) implementation(projects.visionforgeThreejs) //implementation(devNpm("webpack-bundle-analyzer", "4.4.0")) } diff --git a/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMDemoApp.kt b/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMDemoApp.kt index d117d91d..bf985b4c 100644 --- a/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMDemoApp.kt +++ b/demo/muon-monitor/src/jsMain/kotlin/ru/mipt/npm/muon/monitor/MMDemoApp.kt @@ -5,11 +5,11 @@ import org.jetbrains.compose.web.renderComposable import org.w3c.dom.Document import space.kscience.dataforge.context.Context import space.kscience.dataforge.context.request -import space.kscience.visionforge.Application import space.kscience.visionforge.VisionManager +import space.kscience.visionforge.html.Application import space.kscience.visionforge.html.VisionForgeStyles +import space.kscience.visionforge.html.startApplication import space.kscience.visionforge.solid.three.ThreePlugin -import space.kscience.visionforge.startApplication private class MMDemoApp : Application { diff --git a/demo/playground/api/playground.api b/demo/playground/api/playground.api index ca5e1cc5..45992241 100644 --- a/demo/playground/api/playground.api +++ b/demo/playground/api/playground.api @@ -53,6 +53,11 @@ public final class space/kscience/visionforge/examples/GenerateSchemaKt { public static synthetic fun main ([Ljava/lang/String;)V } +public final class space/kscience/visionforge/examples/MarkdownVisionKt { + public static final fun main ()V + public static synthetic fun main ([Ljava/lang/String;)V +} + public final class space/kscience/visionforge/examples/PlotlyVisionKt { public static final fun main ()V public static synthetic fun main ([Ljava/lang/String;)V diff --git a/demo/playground/src/jsMain/kotlin/playgroundMain.kt b/demo/playground/src/jsMain/kotlin/playgroundMain.kt index 32a518ba..1ae93b7f 100644 --- a/demo/playground/src/jsMain/kotlin/playgroundMain.kt +++ b/demo/playground/src/jsMain/kotlin/playgroundMain.kt @@ -1,8 +1,8 @@ import space.kscience.dataforge.misc.DFExperimental +import space.kscience.visionforge.html.runVisionClient import space.kscience.visionforge.jupyter.VFNotebookClient import space.kscience.visionforge.markup.MarkupPlugin import space.kscience.visionforge.plotly.PlotlyPlugin -import space.kscience.visionforge.runVisionClient import space.kscience.visionforge.solid.three.ThreePlugin import space.kscience.visionforge.tables.TableVisionJsPlugin diff --git a/demo/solid-showcase/src/jsMain/kotlin/space/kscience/visionforge/solid/demo/ThreeDemoApp.kt b/demo/solid-showcase/src/jsMain/kotlin/space/kscience/visionforge/solid/demo/ThreeDemoApp.kt index 5bdbcefe..5be57d31 100644 --- a/demo/solid-showcase/src/jsMain/kotlin/space/kscience/visionforge/solid/demo/ThreeDemoApp.kt +++ b/demo/solid-showcase/src/jsMain/kotlin/space/kscience/visionforge/solid/demo/ThreeDemoApp.kt @@ -4,10 +4,10 @@ import kotlinx.coroutines.delay import kotlinx.coroutines.isActive import kotlinx.coroutines.launch import org.w3c.dom.Document -import space.kscience.visionforge.Application +import space.kscience.visionforge.html.Application +import space.kscience.visionforge.html.startApplication import space.kscience.visionforge.solid.x import space.kscience.visionforge.solid.y -import space.kscience.visionforge.startApplication import kotlin.random.Random private class ThreeDemoApp : Application { diff --git a/settings.gradle.kts b/settings.gradle.kts index 8f4e56b3..d8cf13ae 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -42,7 +42,7 @@ dependencyResolutionManagement { include( ":visionforge-core", ":visionforge-compose-html", - ":visionforge-compose-mpp", + ":visionforge-compose-multiplatform", ":visionforge-solid", // ":visionforge-fx", ":visionforge-threejs", @@ -60,6 +60,7 @@ include( ":demo:playground", // ":demo:plotly-fx", ":demo:js-playground", + ":demo:compose-desktop-demo", ":visionforge-jupyter", ":visionforge-jupyter:visionforge-jupyter-common" ) diff --git a/visionforge-compose-html/build.gradle.kts b/visionforge-compose-html/build.gradle.kts index efcad990..d3f5d754 100644 --- a/visionforge-compose-html/build.gradle.kts +++ b/visionforge-compose-html/build.gradle.kts @@ -14,11 +14,7 @@ kotlin { commonMain { dependencies { api(projects.visionforgeCore) - } - } - jvmMain{ - //need this to placate compose compiler in MPP applications - dependencies{ + //need this to placate compose compiler in MPP applications api(compose.runtime) } } @@ -28,7 +24,6 @@ kotlin { api("app.softwork:bootstrap-compose:0.1.15") api("app.softwork:bootstrap-compose-icons:0.1.15") - api(compose.runtime) api(compose.html.core) } } diff --git a/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/html/ComposeHtmlVisionRenderer.kt b/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/html/ComposeHtmlVisionRenderer.kt index f2b6db2f..5a54292d 100644 --- a/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/html/ComposeHtmlVisionRenderer.kt +++ b/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/html/ComposeHtmlVisionRenderer.kt @@ -7,7 +7,6 @@ import org.jetbrains.compose.web.renderComposable import org.w3c.dom.Element import space.kscience.dataforge.meta.Meta import space.kscience.dataforge.names.Name -import space.kscience.visionforge.ElementVisionRenderer import space.kscience.visionforge.Vision /** diff --git a/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/html/PropertyEditor.kt b/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/html/PropertyEditor.kt index cfea11e0..04329625 100644 --- a/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/html/PropertyEditor.kt +++ b/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/html/PropertyEditor.kt @@ -2,7 +2,6 @@ package space.kscience.visionforge.html import androidx.compose.runtime.* import app.softwork.bootstrapcompose.CloseButton -import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.channels.awaitClose import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.callbackFlow @@ -39,7 +38,6 @@ public sealed class EditorPropertyState { */ @Composable public fun PropertyEditor( - scope: CoroutineScope, rootMeta: MutableMeta, getPropertyState: (Name) -> EditorPropertyState, updates: Flow, @@ -136,7 +134,7 @@ public fun PropertyEditor( Div({ classes(TreeStyles.treeItem) }) { - PropertyEditor(scope, rootMeta, getPropertyState, updates, name + token, rootDescriptor, expanded) + PropertyEditor(rootMeta, getPropertyState, updates, name + token, rootDescriptor, expanded) } } } @@ -145,13 +143,12 @@ public fun PropertyEditor( @Composable public fun PropertyEditor( - scope: CoroutineScope, properties: ObservableMutableMeta, descriptor: MetaDescriptor? = null, expanded: Boolean? = null, ) { + val scope = rememberCoroutineScope() PropertyEditor( - scope = scope, rootMeta = properties, getPropertyState = { name -> if (properties[name] != null) { diff --git a/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/html/TreeStyles.kt b/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/html/TreeStyles.kt index d9469dff..4d8406ad 100644 --- a/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/html/TreeStyles.kt +++ b/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/html/TreeStyles.kt @@ -67,26 +67,4 @@ public object TreeStyles : StyleSheet(VisionForgeStyles) { public val treeLabelSelected: String by style { backgroundColor(Color.lightblue) } - - public val propertyEditorButton: String by style { - width(24.px) - alignSelf(AlignSelf.Stretch) - marginAll(1.px, 5.px) - backgroundColor(Color.white) - border { - style(LineStyle.Solid) - } - borderRadius(2.px) - textAlign("center") - textDecoration("none") - cursor("pointer") - (self + disabled) { - cursor("auto") - border { - style(LineStyle.Dashed) - } - color(Color.lightgray) - } - } - } \ No newline at end of file diff --git a/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/html/VisionForgeStyles.kt b/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/html/VisionForgeStyles.kt index 82a3a608..311f41b2 100644 --- a/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/html/VisionForgeStyles.kt +++ b/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/html/VisionForgeStyles.kt @@ -1,7 +1,28 @@ package space.kscience.visionforge.html -import org.jetbrains.compose.web.css.StyleSheet +import org.jetbrains.compose.web.css.* public object VisionForgeStyles: StyleSheet() { + public val propertyEditorButton: String by style { + width(24.px) + alignSelf(AlignSelf.Stretch) + marginAll(1.px, 5.px) + backgroundColor(Color.white) + border { + style(LineStyle.Solid) + } + borderRadius(2.px) + textAlign("center") + textDecoration("none") + cursor("pointer") + (self + disabled) { + cursor("auto") + border { + style(LineStyle.Dashed) + } + color(Color.lightgray) + } + } + } \ No newline at end of file diff --git a/visionforge-compose-mpp/src/commonMain/kotlin/space/kscience/visionforge/compose/ComposeVisionRenderer.kt b/visionforge-compose-mpp/src/commonMain/kotlin/space/kscience/visionforge/compose/ComposeVisionRenderer.kt deleted file mode 100644 index 81450070..00000000 --- a/visionforge-compose-mpp/src/commonMain/kotlin/space/kscience/visionforge/compose/ComposeVisionRenderer.kt +++ /dev/null @@ -1,15 +0,0 @@ -package space.kscience.visionforge.compose - -import androidx.compose.runtime.Composable -import space.kscience.dataforge.meta.Meta -import space.kscience.dataforge.names.Name -import space.kscience.visionforge.Vision -import space.kscience.visionforge.VisionClient - -public interface ComposeVisionRenderer { - public fun rateVision(vision: Vision): Int - @Composable - public fun render(client: VisionClient, name: Name, vision: Vision, meta: Meta) - - public companion object -} \ No newline at end of file diff --git a/visionforge-compose-mpp/src/commonMain/kotlin/space/kscience/visionforge/compose/composeVision.kt b/visionforge-compose-mpp/src/commonMain/kotlin/space/kscience/visionforge/compose/composeVision.kt deleted file mode 100644 index 2a7d3d97..00000000 --- a/visionforge-compose-mpp/src/commonMain/kotlin/space/kscience/visionforge/compose/composeVision.kt +++ /dev/null @@ -1,24 +0,0 @@ -package space.kscience.visionforge.compose - -import androidx.compose.runtime.Composable -import androidx.compose.ui.Modifier -import space.kscience.dataforge.context.Context -import space.kscience.dataforge.meta.Meta -import space.kscience.dataforge.names.Name -import space.kscience.dataforge.names.asName -import space.kscience.visionforge.Vision - - -/** - * Render an Element vision via injected vision renderer inside compose-html - */ -@Composable -public fun Vision( - context: Context, - vision: Vision, - name: Name = "@vision[${vision.hashCode().toString(16)}]".asName(), - meta: Meta = Meta.EMPTY, - modifier: Modifier = Modifier, -) { - -} diff --git a/visionforge-compose-multiplatform/README.md b/visionforge-compose-multiplatform/README.md new file mode 100644 index 00000000..0ba9ae3c --- /dev/null +++ b/visionforge-compose-multiplatform/README.md @@ -0,0 +1,21 @@ +# Module visionforge-compose-multiplatform + + + +## Usage + +## Artifact: + +The Maven coordinates of this project are `space.kscience:visionforge-compose-multiplatform:0.4.0-dev-3`. + +**Gradle Kotlin DSL:** +```kotlin +repositories { + maven("https://repo.kotlin.link") + mavenCentral() +} + +dependencies { + implementation("space.kscience:visionforge-compose-multiplatform:0.4.0-dev-3") +} +``` diff --git a/visionforge-compose-mpp/build.gradle.kts b/visionforge-compose-multiplatform/build.gradle.kts similarity index 62% rename from visionforge-compose-mpp/build.gradle.kts rename to visionforge-compose-multiplatform/build.gradle.kts index e4a447cd..b3175b38 100644 --- a/visionforge-compose-mpp/build.gradle.kts +++ b/visionforge-compose-multiplatform/build.gradle.kts @@ -1,3 +1,5 @@ +import space.kscience.gradle.Maturity + plugins { id("space.kscience.gradle.mpp") alias(spclibs.plugins.compose) @@ -14,15 +16,20 @@ kotlin { commonMain { dependencies { api(projects.visionforgeCore) - api(compose.runtime) api(compose.foundation) + api(compose.runtime) + api(compose.material) + api(compose.materialIconsExtended) } } - jvmMain{ - dependencies{ - api(compose.material) - api(compose.preview) + jvmMain { + dependencies { + implementation("com.eygraber:compose-color-picker:0.0.17") } } } +} + +readme { + maturity = Maturity.EXPERIMENTAL } \ No newline at end of file diff --git a/visionforge-compose-multiplatform/src/commonMain/kotlin/space/kscience/visionforge/compose/ComposeVisionClient.kt b/visionforge-compose-multiplatform/src/commonMain/kotlin/space/kscience/visionforge/compose/ComposeVisionClient.kt new file mode 100644 index 00000000..29bca480 --- /dev/null +++ b/visionforge-compose-multiplatform/src/commonMain/kotlin/space/kscience/visionforge/compose/ComposeVisionClient.kt @@ -0,0 +1,134 @@ +package space.kscience.visionforge.compose + +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.key +import androidx.compose.runtime.remember +import kotlinx.coroutines.flow.MutableSharedFlow +import kotlinx.coroutines.launch +import kotlinx.coroutines.sync.Mutex +import kotlinx.coroutines.sync.withLock +import space.kscience.dataforge.context.* +import space.kscience.dataforge.meta.Meta +import space.kscience.dataforge.meta.get +import space.kscience.dataforge.meta.int +import space.kscience.dataforge.names.Name +import space.kscience.dataforge.names.NameToken +import space.kscience.dataforge.names.asName +import space.kscience.visionforge.* +import space.kscience.visionforge.html.VisionOutput +import space.kscience.visionforge.html.VisionTagConsumer + +/** + * A Kotlin-browser plugin that renders visions based on provided renderers and governs communication with the server. + */ +public class ComposeVisionClient : AbstractPlugin(), VisionClient { + override val tag: PluginTag get() = Companion.tag + override val visionManager: VisionManager by require(VisionManager) + + + private val renderers by lazy { context.gather(ComposeVisionRenderer.TYPE).values } + + private fun findRendererFor(vision: Vision): ComposeVisionRenderer? = renderers.mapNotNull { + val rating = it.rateVision(vision) + if (rating > 0) { + rating to it + } else { + null + } + }.maxByOrNull { it.first }?.second + + + private val mutex = Mutex() + + + private val rootChangeCollector = VisionChangeBuilder() + + /** + * Communicate vision property changed from rendering engine to model + */ + override fun notifyPropertyChanged(visionName: Name, propertyName: Name, item: Meta?) { + context.launch { + mutex.withLock { + rootChangeCollector.propertyChanged(visionName, propertyName, item) + } + } + } + + private val eventCollector = MutableSharedFlow>(meta["feedback.eventCache"].int ?: 100) + + /** + * Send a custom feedback event + */ + override suspend fun sendEvent(targetName: Name, event: VisionEvent) { + eventCollector.emit(targetName to event) + } + + @Composable + public fun renderVision(name: Name, vision: Vision, outputMeta: Meta) { + val renderer: ComposeVisionRenderer = remember(vision) { + findRendererFor(vision) ?: error("Could not find renderer for ${vision::class}") + } + + key(vision) { + vision.setAsRoot(visionManager) + } + //subscribe to a backwards events propagation for control visions + if (vision is ControlVision) { + LaunchedEffect(vision) { + vision.controlEventFlow.collect { + sendEvent(name, it) + } + } + } + + renderer.render(name, vision, outputMeta) + } + + +// override fun content(target: String): Map = if (target == ComposeVisionRenderer.TYPE) { +// listOf( +// htmlVisionRenderer, +// inputVisionRenderer, +// checkboxVisionRenderer, +// numberVisionRenderer, +// textVisionRenderer, +// rangeVisionRenderer, +// formVisionRenderer, +// buttonVisionRenderer +// ).associateBy { it.toString().asName() } +// } else super.content(target) + + public companion object : PluginFactory { + override fun build(context: Context, meta: Meta): ComposeVisionClient = ComposeVisionClient() + + override val tag: PluginTag = PluginTag(name = "vision.client.compose", group = PluginTag.DATAFORGE_GROUP) + } +} + +/** + * Render an Element vision via injected vision renderer inside compose-html + */ +@Composable +public fun Vision( + context: Context, + vision: Vision, + name: Name? = null, + meta: Meta = Meta.EMPTY, +) { + val actualName = name ?: NameToken(VisionTagConsumer.DEFAULT_VISION_NAME, vision.hashCode().toUInt().toString()).asName() + context.request(ComposeVisionClient).renderVision(actualName, vision, meta) +} + +@Composable +public fun Vision( + context: Context, + name: Name? = null, + meta: Meta = Meta.EMPTY, + buildOutput: VisionOutput.() -> Vision, +) { + val actualName = name ?: NameToken(VisionTagConsumer.DEFAULT_VISION_NAME, buildOutput.hashCode().toUInt().toString()).asName() + val output = VisionOutput(context, actualName) + val vision = output.buildOutput() + context.request(ComposeVisionClient).renderVision(actualName, vision, meta) +} \ No newline at end of file diff --git a/visionforge-compose-multiplatform/src/commonMain/kotlin/space/kscience/visionforge/compose/ComposeVisionRenderer.kt b/visionforge-compose-multiplatform/src/commonMain/kotlin/space/kscience/visionforge/compose/ComposeVisionRenderer.kt new file mode 100644 index 00000000..a7abee3f --- /dev/null +++ b/visionforge-compose-multiplatform/src/commonMain/kotlin/space/kscience/visionforge/compose/ComposeVisionRenderer.kt @@ -0,0 +1,47 @@ +package space.kscience.visionforge.compose + +import androidx.compose.runtime.Composable +import space.kscience.dataforge.meta.Meta +import space.kscience.dataforge.misc.DfType +import space.kscience.dataforge.names.Name +import space.kscience.visionforge.Vision +import kotlin.reflect.KClass +import kotlin.reflect.cast + +@DfType(ComposeVisionRenderer.TYPE) +public interface ComposeVisionRenderer { + public fun rateVision(vision: Vision): Int + + @Composable + public fun render(name: Name, vision: Vision, meta: Meta) + + public companion object { + public const val TYPE: String = "composeVisionRenderer" + public const val ZERO_RATING: Int = 0 + public const val DEFAULT_RATING: Int = 10 + } +} + +public class SingleTypeComposeRenderer( + public val kClass: KClass, + private val acceptRating: Int = ComposeVisionRenderer.DEFAULT_RATING, + private val renderFunction: @Composable (name: Name, vision: T, meta: Meta) -> Unit, +) : ComposeVisionRenderer { + + override fun rateVision(vision: Vision): Int = + if (vision::class == kClass) acceptRating else ComposeVisionRenderer.ZERO_RATING + + @Composable + override fun render( + name: Name, + vision: Vision, + meta: Meta, + ) { + renderFunction(name, kClass.cast(vision), meta) + } +} + +public inline fun ComposeVisionRenderer( + acceptRating: Int = ComposeVisionRenderer.DEFAULT_RATING, + noinline renderFunction: @Composable (name: Name, vision: T, meta: Meta) -> Unit, +): ComposeVisionRenderer = SingleTypeComposeRenderer(T::class, acceptRating, renderFunction) diff --git a/visionforge-compose-multiplatform/src/jvmMain/kotlin/space/kscience/visionforge/compose/MetaViewer.kt b/visionforge-compose-multiplatform/src/jvmMain/kotlin/space/kscience/visionforge/compose/MetaViewer.kt new file mode 100644 index 00000000..d6578c73 --- /dev/null +++ b/visionforge-compose-multiplatform/src/jvmMain/kotlin/space/kscience/visionforge/compose/MetaViewer.kt @@ -0,0 +1,69 @@ +package space.kscience.visionforge.compose + +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.material.Icon +import androidx.compose.material.Text +import androidx.compose.material.TextButton +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.ExpandLess +import androidx.compose.material.icons.filled.ExpandMore +import androidx.compose.runtime.* +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import space.kscience.dataforge.meta.Meta +import space.kscience.dataforge.meta.descriptors.MetaDescriptor +import space.kscience.dataforge.meta.descriptors.get +import space.kscience.dataforge.meta.isLeaf +import space.kscience.dataforge.names.Name +import space.kscience.dataforge.names.NameToken +import space.kscience.dataforge.names.lastOrNull +import space.kscience.dataforge.names.plus + + +@Composable +private fun MetaViewerItem(root: Meta, name: Name, rootDescriptor: MetaDescriptor? = null) { + var expanded: Boolean by remember { mutableStateOf(true) } + val item: Meta? = root[name] + val descriptorItem: MetaDescriptor? = rootDescriptor?.get(name) + val actualValue = item?.value ?: descriptorItem?.defaultValue + val actualMeta = item ?: descriptorItem?.defaultNode + + val token = name.lastOrNull()?.toString() ?: "" + + Row(modifier = Modifier.fillMaxWidth()) { + if (actualMeta?.isLeaf == false) { + TextButton({ expanded = !expanded }) { + if (expanded) { + Icon(Icons.Filled.ExpandLess, "collapse") + } else { + Icon(Icons.Filled.ExpandMore, "expand") + } + } + } + Text(token, color = if (item == null) Color.Gray else Color.Unspecified) + Spacer(Modifier.weight(1f)) + Text(actualValue.toString()) + } + if (expanded) { + Column { + val keys = buildSet { + descriptorItem?.nodes?.keys?.forEach { + add(NameToken(it)) + } + actualMeta!!.items.keys.let { addAll(it) } + } + + keys.filter { !it.body.startsWith("@") }.forEach { token -> + MetaViewerItem(root, name + token, rootDescriptor) + } + } + } +} + +@Composable +public fun MetaViewer(meta: Meta, descriptor: MetaDescriptor? = null) { + MetaViewerItem(meta, Name.EMPTY, descriptor) +} diff --git a/visionforge-compose-multiplatform/src/jvmMain/kotlin/space/kscience/visionforge/compose/PropertyEditor.kt b/visionforge-compose-multiplatform/src/jvmMain/kotlin/space/kscience/visionforge/compose/PropertyEditor.kt new file mode 100644 index 00000000..f2088c61 --- /dev/null +++ b/visionforge-compose-multiplatform/src/jvmMain/kotlin/space/kscience/visionforge/compose/PropertyEditor.kt @@ -0,0 +1,174 @@ +package space.kscience.visionforge.compose + +import androidx.compose.foundation.layout.* +import androidx.compose.material.Icon +import androidx.compose.material.Text +import androidx.compose.material.TextButton +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Clear +import androidx.compose.material.icons.filled.ExpandLess +import androidx.compose.material.icons.filled.ExpandMore +import androidx.compose.runtime.* +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.unit.dp +import kotlinx.coroutines.channels.awaitClose +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.callbackFlow +import kotlinx.coroutines.launch +import space.kscience.dataforge.meta.MutableMeta +import space.kscience.dataforge.meta.ObservableMutableMeta +import space.kscience.dataforge.meta.descriptors.MetaDescriptor +import space.kscience.dataforge.meta.descriptors.ValueRestriction +import space.kscience.dataforge.meta.descriptors.get +import space.kscience.dataforge.meta.remove +import space.kscience.dataforge.names.* +import space.kscience.visionforge.hidden + + +/** + * The display state of a property + */ +public sealed class EditorPropertyState { + public data object Defined : EditorPropertyState() + public data class Default(public val source: String = "unknown") : EditorPropertyState() + public data object Undefined : EditorPropertyState() +} + +/** + * @param rootMeta Root config object - always non-null + * @param rootDescriptor Full path to the displayed node in [rootMeta]. Could be empty + */ +@Composable +public fun PropertyEditor( + rootMeta: MutableMeta, + getPropertyState: (Name) -> EditorPropertyState, + updates: Flow, + name: Name, + rootDescriptor: MetaDescriptor?, + initialExpanded: Boolean? = null, +) { + var expanded: Boolean by remember { mutableStateOf(initialExpanded ?: true) } + val descriptor: MetaDescriptor? by derivedStateOf { rootDescriptor?.get(name) } + var displayedValue by remember { mutableStateOf(rootMeta.getValue(name)) } + var editorPropertyState: EditorPropertyState by remember { mutableStateOf(getPropertyState(name)) } + + fun buildKeys() = buildSet { + descriptor?.nodes?.filterNot { + it.key.startsWith("@") || it.value.hidden + }?.forEach { + add(NameToken(it.key)) + } + rootMeta[name]?.items?.keys?.filterNot { it.body.startsWith("@") }?.let { addAll(it) } + } + + var keys by remember { mutableStateOf(buildKeys()) } + + val token = name.lastOrNull()?.toString() ?: "Properties" + + fun update() { + displayedValue = rootMeta.getValue(name) + editorPropertyState = getPropertyState(name) + keys = buildKeys() + } + + LaunchedEffect(rootMeta) { + updates.collect { updatedName -> + if (name.startsWith(updatedName)) { + update() + } + } + } + Column(modifier = Modifier.fillMaxWidth().padding(start = 20.dp)) { + Row(modifier = Modifier.fillMaxWidth().padding(start = 20.dp)) { + //if node has children + if (keys.isNotEmpty()) { + TextButton( + { expanded = !expanded }, + modifier = Modifier.align(Alignment.CenterVertically).width(40.dp) + ) { + if (expanded) { + Icon(Icons.Filled.ExpandLess, "collapse") + } else { + Icon(Icons.Filled.ExpandMore, "expand") + } + } + } + Text( + token, + color = when (editorPropertyState) { + is EditorPropertyState.Default, EditorPropertyState.Undefined -> Color.Gray + else -> Color.Unspecified + }, + modifier = Modifier.align(Alignment.CenterVertically) + ) + Spacer(modifier = Modifier.weight(1f)) + + if (!name.isEmpty() && descriptor?.valueRestriction != ValueRestriction.ABSENT) { + Box(modifier = Modifier.padding(1.dp, 5.dp).width(160.dp)) { + ValueChooser(descriptor, editorPropertyState, displayedValue) { + rootMeta.setValue(name, it) + update() + } + } + + } + if (!name.isEmpty()) { + TextButton( + onClick = { + rootMeta.remove(name) + update() + }, + enabled = editorPropertyState == EditorPropertyState.Defined, + modifier = Modifier.align(Alignment.CenterVertically).width(50.dp) + ) { + if (editorPropertyState == EditorPropertyState.Defined) { + Icon(Icons.Filled.Clear, "Reset") + } + } + } + } + if (expanded) { + Column(modifier = Modifier.fillMaxWidth()) { + keys.forEach { token -> + PropertyEditor(rootMeta, getPropertyState, updates, name + token, rootDescriptor, expanded) + } + } + } + } +} + + +@Composable +public fun PropertyEditor( + properties: ObservableMutableMeta, + descriptor: MetaDescriptor? = null, + expanded: Boolean? = null, +) { + val scope = rememberCoroutineScope() + PropertyEditor( + rootMeta = properties, + getPropertyState = { name -> + if (properties[name] != null) { + EditorPropertyState.Defined + } else if (descriptor?.get(name)?.defaultValue != null) { + EditorPropertyState.Default("descriptor") + } else { + EditorPropertyState.Undefined + } + }, + updates = callbackFlow { + properties.onChange(scope) { name -> + scope.launch { + send(name) + } + } + + awaitClose { properties.removeListener(scope) } + }, + name = Name.EMPTY, + rootDescriptor = descriptor, + initialExpanded = expanded, + ) +} \ No newline at end of file diff --git a/visionforge-compose-multiplatform/src/jvmMain/kotlin/space/kscience/visionforge/compose/valueChooser.kt b/visionforge-compose-multiplatform/src/jvmMain/kotlin/space/kscience/visionforge/compose/valueChooser.kt new file mode 100644 index 00000000..cfecc54e --- /dev/null +++ b/visionforge-compose-multiplatform/src/jvmMain/kotlin/space/kscience/visionforge/compose/valueChooser.kt @@ -0,0 +1,270 @@ +@file:Suppress("UNUSED_PARAMETER") + +package space.kscience.visionforge.compose + +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.text.KeyboardOptions +import androidx.compose.material.* +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.CheckBox +import androidx.compose.material.icons.filled.CheckBoxOutlineBlank +import androidx.compose.runtime.* +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.isSpecified +import androidx.compose.ui.graphics.toArgb +import androidx.compose.ui.text.input.KeyboardType +import com.eygraber.compose.colorpicker.ColorPicker +import space.kscience.dataforge.meta.* +import space.kscience.dataforge.meta.descriptors.MetaDescriptor +import space.kscience.dataforge.meta.descriptors.allowedValues +import space.kscience.visionforge.widgetType +import kotlin.math.roundToInt + + +@Composable +public fun StringValueChooser( + descriptor: MetaDescriptor?, + state: EditorPropertyState, + value: Value?, + onValueChange: (Value?) -> Unit, +) { + var stringValue by remember(value, descriptor) { mutableStateOf(value?.string ?: "") } + TextField( + value = stringValue, + onValueChange = { + stringValue = it + onValueChange(it.asValue()) + }, + modifier = Modifier.fillMaxWidth() + ) +} + + +@Composable +public fun BooleanValueChooser( + descriptor: MetaDescriptor?, + state: EditorPropertyState, + value: Value?, + onValueChange: (Value?) -> Unit, +) { + var innerValue by remember(value, descriptor) { + mutableStateOf( + value?.boolean ?: descriptor?.defaultValue?.boolean ?: false + ) + } + + Button( + onClick = { + innerValue = !innerValue + onValueChange(innerValue.asValue()) + }, + colors = if (innerValue) ButtonDefaults.buttonColors(Color.Green) else ButtonDefaults.buttonColors(Color.Gray) + ) { + if (innerValue) { + Text("On") + } else { + Text("Off") + } + } +} + +@Composable +public fun NumberValueChooser( + descriptor: MetaDescriptor?, + state: EditorPropertyState, + value: Value?, + onValueChange: (Value?) -> Unit, +) { + var stringValue by remember(value, descriptor) { mutableStateOf(value?.string ?: descriptor?.defaultValue?.string) } + + TextField( + value = stringValue ?: "", + onValueChange = { newValue -> + stringValue = newValue + newValue.toDoubleOrNull()?.let { onValueChange(it.asValue()) } + }, + isError = stringValue?.toDoubleOrNull() != null, + modifier = Modifier.fillMaxWidth(), + keyboardOptions = KeyboardOptions.Default.copy(keyboardType = KeyboardType.Number) + ) +} + + +@OptIn(ExperimentalMaterialApi::class) +@Composable +public fun ComboValueChooser( + descriptor: MetaDescriptor?, + state: EditorPropertyState, + value: Value?, + onValueChange: (Value?) -> Unit, +) { + var expanded by remember { mutableStateOf(false) } + var selected by remember(value, descriptor) { mutableStateOf(value?.string ?: "") } + + ExposedDropdownMenuBox( + expanded = expanded, + onExpandedChange = { + expanded = !expanded + }, + modifier = Modifier.fillMaxWidth() + ) { + TextField( + value = selected, + onValueChange = {}, + readOnly = true, + trailingIcon = { ExposedDropdownMenuDefaults.TrailingIcon(expanded = expanded) }, + ) + + ExposedDropdownMenu( + expanded = expanded, + onDismissRequest = { expanded = false } + ) { + descriptor?.allowedValues?.forEach { item: Value -> + DropdownMenuItem( + onClick = { + selected = item.string + expanded = false + onValueChange(selected.asValue()) + } + ) { + Text(item.string) + } + } + } + } +} + + +@Composable +public fun ColorValueChooser( + descriptor: MetaDescriptor?, + state: EditorPropertyState, + value: Value?, + onValueChange: (Value?) -> Unit, +) { + //var innerValue by remember { mutableStateOf(value ?: descriptor?.defaultValue) } + + Box(Modifier.fillMaxWidth()) { + ColorPicker(Modifier.fillMaxWidth()) { + if (it.isSpecified) { + onValueChange(it.toArgb().asValue()) + } + } + } +} + + +@OptIn(ExperimentalMaterialApi::class) +@Composable +public fun MultiSelectChooser( + descriptor: MetaDescriptor?, + state: EditorPropertyState, + value: Value?, + onValueChange: (Value?) -> Unit, +) { + var expanded by remember { mutableStateOf(false) } + var selected: Set by remember(value) { + mutableStateOf(value?.list?.toSet() ?: emptySet()) + } + + ExposedDropdownMenuBox( + expanded = expanded, + onExpandedChange = { + expanded = !expanded + }, + modifier = Modifier.fillMaxWidth() + ) { + TextField( + value = selected.joinToString(prefix = "[", postfix = "]"), + onValueChange = {}, + readOnly = true, + trailingIcon = { ExposedDropdownMenuDefaults.TrailingIcon(expanded = expanded) }, + ) + + ExposedDropdownMenu( + expanded = expanded, + onDismissRequest = { expanded = false } + ) { + descriptor?.allowedValues?.forEach { item: Value -> + val currentlySelected = item in selected + + DropdownMenuItem( + onClick = { + selected = if (currentlySelected) { + selected - item + } else { + selected + item + } + onValueChange(selected.asValue()) + } + ) { + if (currentlySelected) { + Icon(Icons.Default.CheckBox, "checked") + } else { + Icon(Icons.Default.CheckBoxOutlineBlank, "checked") + } + Text(item.string) + } + } + } + } +} + + +@Composable +public fun RangeValueChooser( + descriptor: MetaDescriptor?, + state: EditorPropertyState, + value: Value?, + onValueChange: (Value?) -> Unit, +) { + var innerValue by remember(value, descriptor) { mutableStateOf(value?.number ?: descriptor?.defaultValue?.number) } + val min by derivedStateOf { + descriptor?.attributes?.get("min").float ?: 0f + } + + val max by derivedStateOf { + descriptor?.attributes?.get("max").float ?: 0f + } + + val step by derivedStateOf { + descriptor?.attributes?.get("step").float ?: 0.1f + } + + Slider( + value = innerValue?.toFloat() ?: 0f, + onValueChange = { + innerValue = it + onValueChange(it.asValue()) + }, + valueRange = min..max, + steps = ((max - min) / step).roundToInt(), + modifier = Modifier.fillMaxWidth() + ) +} + +@Composable +public fun ValueChooser( + descriptor: MetaDescriptor?, + state: EditorPropertyState, + value: Value?, + onValueChange: (Value?) -> Unit, +) { + val rawInput by remember { mutableStateOf(false) } + + val type = descriptor?.valueTypes?.firstOrNull() + + when { + rawInput -> StringValueChooser(descriptor, state, value, onValueChange) + descriptor?.widgetType == "color" -> ColorValueChooser(descriptor, state, value, onValueChange) + descriptor?.widgetType == "multiSelect" -> MultiSelectChooser(descriptor, state, value, onValueChange) + descriptor?.widgetType == "range" -> RangeValueChooser(descriptor, state, value, onValueChange) + type == ValueType.BOOLEAN -> BooleanValueChooser(descriptor, state, value, onValueChange) + type == ValueType.NUMBER -> NumberValueChooser(descriptor, state, value, onValueChange) + descriptor?.allowedValues?.isNotEmpty() ?: false -> ComboValueChooser(descriptor, state, value, onValueChange) + //TODO handle lists + else -> StringValueChooser(descriptor, state, value, onValueChange) + } +} \ No newline at end of file diff --git a/visionforge-core/README.md b/visionforge-core/README.md index 5c5b493b..d1cad403 100644 --- a/visionforge-core/README.md +++ b/visionforge-core/README.md @@ -6,7 +6,7 @@ ## Artifact: -The Maven coordinates of this project are `space.kscience:visionforge-core:0.3.0-rc`. +The Maven coordinates of this project are `space.kscience:visionforge-core:0.4.0-dev-3`. **Gradle Kotlin DSL:** ```kotlin @@ -16,6 +16,6 @@ repositories { } dependencies { - implementation("space.kscience:visionforge-core:0.3.0-rc") + implementation("space.kscience:visionforge-core:0.4.0-dev-3") } ``` diff --git a/visionforge-core/api/visionforge-core.api b/visionforge-core/api/visionforge-core.api index 89e926ec..90fce073 100644 --- a/visionforge-core/api/visionforge-core.api +++ b/visionforge-core/api/visionforge-core.api @@ -1,3 +1,16 @@ +public abstract class space/kscience/visionforge/AbstractControlVision : space/kscience/visionforge/AbstractVision, space/kscience/visionforge/ControlVision { + public static final field Companion Lspace/kscience/visionforge/AbstractControlVision$Companion; + public fun ()V + public synthetic fun (ILspace/kscience/dataforge/meta/MutableMeta;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V + public fun dispatchControlEvent (Lspace/kscience/visionforge/VisionControlEvent;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public fun getControlEventFlow ()Lkotlinx/coroutines/flow/SharedFlow; + public static final synthetic fun write$Self (Lspace/kscience/visionforge/AbstractControlVision;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final class space/kscience/visionforge/AbstractControlVision$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + public abstract class space/kscience/visionforge/AbstractVision : space/kscience/visionforge/Vision { public static final field Companion Lspace/kscience/visionforge/AbstractVision$Companion; public fun ()V @@ -34,29 +47,20 @@ public final class space/kscience/visionforge/AbstractVisionGroup$Companion { public static synthetic fun updateProperties$default (Lspace/kscience/visionforge/AbstractVisionGroup$Companion;Lspace/kscience/visionforge/Vision;Lspace/kscience/dataforge/meta/Meta;Lspace/kscience/dataforge/names/Name;ILjava/lang/Object;)V } -public abstract class space/kscience/visionforge/AbstractVisionProperties : space/kscience/visionforge/MutableVisionProperties { - public fun (Lspace/kscience/visionforge/Vision;)V - public synthetic fun getChanges ()Lkotlinx/coroutines/flow/Flow; - public fun getChanges ()Lkotlinx/coroutines/flow/SharedFlow; +public class space/kscience/visionforge/AbstractVisionProperties : space/kscience/visionforge/MutableVisionProperties { + public fun (Lspace/kscience/visionforge/Vision;Lspace/kscience/dataforge/meta/MutableMeta;)V + public fun flowChanges ()Lkotlinx/coroutines/flow/Flow; protected final fun getChangesInternal ()Lkotlinx/coroutines/flow/MutableSharedFlow; public fun getDescriptor ()Lspace/kscience/dataforge/meta/descriptors/MetaDescriptor; - protected final fun getOrCreateProperties ()Lspace/kscience/dataforge/meta/MutableMeta; - public fun getOwn ()Lspace/kscience/dataforge/meta/Meta; - protected abstract fun getProperties ()Lspace/kscience/dataforge/meta/MutableMeta; + public synthetic fun getOwn ()Lspace/kscience/dataforge/meta/Meta; + public final fun getOwn ()Lspace/kscience/dataforge/meta/MutableMeta; public fun getValue (Lspace/kscience/dataforge/names/Name;Ljava/lang/Boolean;Ljava/lang/Boolean;)Lspace/kscience/dataforge/meta/Value; public final fun getVision ()Lspace/kscience/visionforge/Vision; public fun invalidate (Lspace/kscience/dataforge/names/Name;)V public fun set (Lspace/kscience/dataforge/names/Name;Lspace/kscience/dataforge/meta/Meta;Z)V - protected abstract fun setProperties (Lspace/kscience/dataforge/meta/MutableMeta;)V public fun setValue (Lspace/kscience/dataforge/names/Name;Lspace/kscience/dataforge/meta/Value;Z)V } -public abstract interface class space/kscience/visionforge/ClickControl : space/kscience/visionforge/ControlVision { - public fun click (Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static synthetic fun click$default (Lspace/kscience/visionforge/ClickControl;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object; - public static synthetic fun click$suspendImpl (Lspace/kscience/visionforge/ClickControl;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -} - public final class space/kscience/visionforge/Colors { public static final field BLUE_KEY Ljava/lang/String; public static final field GREEN_KEY Ljava/lang/String; @@ -223,13 +227,21 @@ public abstract interface class space/kscience/visionforge/ControlVision : space } public final class space/kscience/visionforge/ControlVisionKt { - public static final fun VisionClickEvent (Lspace/kscience/dataforge/meta/Meta;Lspace/kscience/dataforge/names/Name;)Lspace/kscience/visionforge/VisionClickEvent; - public static synthetic fun VisionClickEvent$default (Lspace/kscience/dataforge/meta/Meta;Lspace/kscience/dataforge/names/Name;ILjava/lang/Object;)Lspace/kscience/visionforge/VisionClickEvent; public static final fun VisionInputEvent (Lspace/kscience/dataforge/meta/Value;Lspace/kscience/dataforge/names/Name;)Lspace/kscience/visionforge/VisionInputEvent; public static synthetic fun VisionInputEvent$default (Lspace/kscience/dataforge/meta/Value;Lspace/kscience/dataforge/names/Name;ILjava/lang/Object;)Lspace/kscience/visionforge/VisionInputEvent; + public static final fun VisionSubmitEvent (Lspace/kscience/dataforge/meta/Meta;Lspace/kscience/dataforge/names/Name;)Lspace/kscience/visionforge/VisionSubmitEvent; + public static synthetic fun VisionSubmitEvent$default (Lspace/kscience/dataforge/meta/Meta;Lspace/kscience/dataforge/names/Name;ILjava/lang/Object;)Lspace/kscience/visionforge/VisionSubmitEvent; public static final fun VisionValueChangeEvent (Lspace/kscience/dataforge/meta/Value;Lspace/kscience/dataforge/names/Name;)Lspace/kscience/visionforge/VisionValueChangeEvent; public static synthetic fun VisionValueChangeEvent$default (Lspace/kscience/dataforge/meta/Value;Lspace/kscience/dataforge/names/Name;ILjava/lang/Object;)Lspace/kscience/visionforge/VisionValueChangeEvent; - public static final fun onClick (Lspace/kscience/visionforge/ClickControl;Lkotlinx/coroutines/CoroutineScope;Lkotlin/jvm/functions/Function2;)Lkotlinx/coroutines/Job; + public static final fun asyncControlEvent (Lspace/kscience/visionforge/ControlVision;Lspace/kscience/visionforge/VisionControlEvent;Lkotlinx/coroutines/CoroutineScope;)V + public static synthetic fun asyncControlEvent$default (Lspace/kscience/visionforge/ControlVision;Lspace/kscience/visionforge/VisionControlEvent;Lkotlinx/coroutines/CoroutineScope;ILjava/lang/Object;)V + public static final fun onSubmit (Lspace/kscience/visionforge/DataControl;Lkotlinx/coroutines/CoroutineScope;Lkotlin/jvm/functions/Function2;)Lkotlinx/coroutines/Job; +} + +public abstract interface class space/kscience/visionforge/DataControl : space/kscience/visionforge/ControlVision { + public fun submit (Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public static synthetic fun submit$default (Lspace/kscience/visionforge/DataControl;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object; + public static synthetic fun submit$suspendImpl (Lspace/kscience/visionforge/DataControl;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; } public final class space/kscience/visionforge/FlowPropertyKt { @@ -320,9 +332,9 @@ public final class space/kscience/visionforge/StyleReference { public final class space/kscience/visionforge/StyleReferenceKt { public static final fun style (Lspace/kscience/visionforge/Vision;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lkotlin/properties/ReadOnlyProperty; - public static final fun style (Lspace/kscience/visionforge/Vision;Lspace/kscience/dataforge/meta/Specification;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lkotlin/properties/ReadOnlyProperty; + public static final fun style (Lspace/kscience/visionforge/Vision;Lspace/kscience/dataforge/meta/SchemeSpec;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lkotlin/properties/ReadOnlyProperty; public static synthetic fun style$default (Lspace/kscience/visionforge/Vision;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lkotlin/properties/ReadOnlyProperty; - public static synthetic fun style$default (Lspace/kscience/visionforge/Vision;Lspace/kscience/dataforge/meta/Specification;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lkotlin/properties/ReadOnlyProperty; + public static synthetic fun style$default (Lspace/kscience/visionforge/Vision;Lspace/kscience/dataforge/meta/SchemeSpec;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lkotlin/properties/ReadOnlyProperty; public static final fun useStyle (Lspace/kscience/visionforge/Vision;Lspace/kscience/visionforge/StyleReference;Z)V public static synthetic fun useStyle$default (Lspace/kscience/visionforge/Vision;Lspace/kscience/visionforge/StyleReference;ZILjava/lang/Object;)V } @@ -364,7 +376,9 @@ public final class space/kscience/visionforge/StyleSheetKt { public final class space/kscience/visionforge/UsePropertyKt { public static final fun onPropertyChange (Lspace/kscience/visionforge/Vision;Lkotlin/reflect/KProperty1;Lkotlinx/coroutines/CoroutineScope;Lkotlin/jvm/functions/Function3;)Lkotlinx/coroutines/Job; + public static final fun onPropertyChange (Lspace/kscience/visionforge/Vision;Lkotlinx/coroutines/CoroutineScope;Lkotlin/jvm/functions/Function2;)Lkotlinx/coroutines/Job; public static synthetic fun onPropertyChange$default (Lspace/kscience/visionforge/Vision;Lkotlin/reflect/KProperty1;Lkotlinx/coroutines/CoroutineScope;Lkotlin/jvm/functions/Function3;ILjava/lang/Object;)Lkotlinx/coroutines/Job; + public static synthetic fun onPropertyChange$default (Lspace/kscience/visionforge/Vision;Lkotlinx/coroutines/CoroutineScope;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)Lkotlinx/coroutines/Job; public static final fun useProperty (Lspace/kscience/visionforge/Vision;Ljava/lang/String;Ljava/lang/Boolean;Ljava/lang/Boolean;Lkotlinx/coroutines/CoroutineScope;Lkotlin/jvm/functions/Function1;)Lkotlinx/coroutines/Job; public static final fun useProperty (Lspace/kscience/visionforge/Vision;Lkotlin/reflect/KProperty1;Lkotlinx/coroutines/CoroutineScope;Lkotlin/jvm/functions/Function2;)Lkotlinx/coroutines/Job; public static final fun useProperty (Lspace/kscience/visionforge/Vision;Lspace/kscience/dataforge/names/Name;Ljava/lang/Boolean;Ljava/lang/Boolean;Lkotlinx/coroutines/CoroutineScope;Lkotlin/jvm/functions/Function1;)Lkotlinx/coroutines/Job; @@ -462,30 +476,6 @@ public final class space/kscience/visionforge/VisionChildren$Companion { public final fun empty (Lspace/kscience/visionforge/Vision;)Lspace/kscience/visionforge/VisionChildren; } -public final class space/kscience/visionforge/VisionClickEvent : space/kscience/visionforge/VisionControlEvent { - public static final field Companion Lspace/kscience/visionforge/VisionClickEvent$Companion; - public fun (Lspace/kscience/dataforge/meta/Meta;)V - public fun getMeta ()Lspace/kscience/dataforge/meta/Meta; - public final fun getName ()Lspace/kscience/dataforge/names/Name; - public final fun getPayload ()Lspace/kscience/dataforge/meta/Meta; - public fun toString ()Ljava/lang/String; -} - -public final class space/kscience/visionforge/VisionClickEvent$$serializer : kotlinx/serialization/internal/GeneratedSerializer { - public static final field INSTANCE Lspace/kscience/visionforge/VisionClickEvent$$serializer; - public fun childSerializers ()[Lkotlinx/serialization/KSerializer; - public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; - public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lspace/kscience/visionforge/VisionClickEvent; - public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; - public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V - public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lspace/kscience/visionforge/VisionClickEvent;)V - public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; -} - -public final class space/kscience/visionforge/VisionClickEvent$Companion { - public final fun serializer ()Lkotlinx/serialization/KSerializer; -} - public abstract interface class space/kscience/visionforge/VisionClient : space/kscience/dataforge/context/Plugin { public abstract fun getVisionManager ()Lspace/kscience/visionforge/VisionManager; public abstract fun notifyPropertyChanged (Lspace/kscience/dataforge/names/Name;Lspace/kscience/dataforge/names/Name;Lspace/kscience/dataforge/meta/Meta;)V @@ -589,8 +579,6 @@ public final class space/kscience/visionforge/VisionInputEvent$Companion { public final class space/kscience/visionforge/VisionKt { public static final fun getVisible (Lspace/kscience/visionforge/Vision;)Ljava/lang/Boolean; - public static final fun onPropertyChange (Lspace/kscience/visionforge/Vision;Lkotlinx/coroutines/CoroutineScope;Lkotlin/jvm/functions/Function2;)Lkotlinx/coroutines/Job; - public static synthetic fun onPropertyChange$default (Lspace/kscience/visionforge/Vision;Lkotlinx/coroutines/CoroutineScope;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)Lkotlinx/coroutines/Job; public static final fun setVisible (Lspace/kscience/visionforge/Vision;Ljava/lang/Boolean;)V } @@ -659,10 +647,10 @@ public abstract class space/kscience/visionforge/VisionPlugin : space/kscience/d } public abstract interface class space/kscience/visionforge/VisionProperties : space/kscience/dataforge/meta/MetaProvider { + public abstract fun flowChanges ()Lkotlinx/coroutines/flow/Flow; public fun get (Lspace/kscience/dataforge/names/Name;)Lspace/kscience/dataforge/meta/Meta; public abstract fun get (Lspace/kscience/dataforge/names/Name;Ljava/lang/Boolean;Ljava/lang/Boolean;)Lspace/kscience/dataforge/meta/Meta; public static synthetic fun get$default (Lspace/kscience/visionforge/VisionProperties;Lspace/kscience/dataforge/names/Name;Ljava/lang/Boolean;Ljava/lang/Boolean;ILjava/lang/Object;)Lspace/kscience/dataforge/meta/Meta; - public abstract fun getChanges ()Lkotlinx/coroutines/flow/Flow; public abstract fun getDescriptor ()Lspace/kscience/dataforge/meta/descriptors/MetaDescriptor; public abstract fun getOwn ()Lspace/kscience/dataforge/meta/Meta; public fun getValue (Lspace/kscience/dataforge/names/Name;)Lspace/kscience/dataforge/meta/Value; @@ -685,6 +673,30 @@ public final class space/kscience/visionforge/VisionPropertiesKt { public static synthetic fun root$default (Lspace/kscience/visionforge/MutableVisionProperties;Ljava/lang/Boolean;Ljava/lang/Boolean;ILjava/lang/Object;)Lspace/kscience/dataforge/meta/MutableMeta; } +public final class space/kscience/visionforge/VisionSubmitEvent : space/kscience/visionforge/VisionControlEvent { + public static final field Companion Lspace/kscience/visionforge/VisionSubmitEvent$Companion; + public fun (Lspace/kscience/dataforge/meta/Meta;)V + public fun getMeta ()Lspace/kscience/dataforge/meta/Meta; + public final fun getName ()Lspace/kscience/dataforge/names/Name; + public final fun getPayload ()Lspace/kscience/dataforge/meta/Meta; + public fun toString ()Ljava/lang/String; +} + +public final class space/kscience/visionforge/VisionSubmitEvent$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lspace/kscience/visionforge/VisionSubmitEvent$$serializer; + public fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lspace/kscience/visionforge/VisionSubmitEvent; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lspace/kscience/visionforge/VisionSubmitEvent;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class space/kscience/visionforge/VisionSubmitEvent$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + public final class space/kscience/visionforge/VisionValueChangeEvent : space/kscience/visionforge/VisionControlEvent { public static final field Companion Lspace/kscience/visionforge/VisionValueChangeEvent$Companion; public fun (Lspace/kscience/dataforge/meta/Meta;)V @@ -750,10 +762,10 @@ public abstract interface class space/kscience/visionforge/html/HtmlVisionFragme public final class space/kscience/visionforge/html/HtmlVisionRendererKt { public static final fun appendTo (Lspace/kscience/visionforge/html/HtmlVisionFragment;Lspace/kscience/visionforge/html/VisionTagConsumer;)V - public static final fun visionFragment (Lkotlinx/html/FlowContent;Lspace/kscience/visionforge/VisionManager;ZLjava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function2;Ljava/lang/String;Lspace/kscience/visionforge/html/HtmlVisionFragment;)V - public static final fun visionFragment (Lkotlinx/html/TagConsumer;Lspace/kscience/visionforge/VisionManager;ZLjava/lang/String;Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function2;Lspace/kscience/visionforge/html/HtmlVisionFragment;)V - public static synthetic fun visionFragment$default (Lkotlinx/html/FlowContent;Lspace/kscience/visionforge/VisionManager;ZLjava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function2;Ljava/lang/String;Lspace/kscience/visionforge/html/HtmlVisionFragment;ILjava/lang/Object;)V - public static synthetic fun visionFragment$default (Lkotlinx/html/TagConsumer;Lspace/kscience/visionforge/VisionManager;ZLjava/lang/String;Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function2;Lspace/kscience/visionforge/html/HtmlVisionFragment;ILjava/lang/Object;)V + public static final fun visionFragment (Lkotlinx/html/FlowContent;Lspace/kscience/visionforge/VisionManager;ZLjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/Map;Lspace/kscience/visionforge/html/HtmlVisionFragment;)V + public static final fun visionFragment (Lkotlinx/html/TagConsumer;Lspace/kscience/visionforge/VisionManager;ZLjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/Map;Lspace/kscience/visionforge/html/HtmlVisionFragment;)V + public static synthetic fun visionFragment$default (Lkotlinx/html/FlowContent;Lspace/kscience/visionforge/VisionManager;ZLjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/Map;Lspace/kscience/visionforge/html/HtmlVisionFragment;ILjava/lang/Object;)V + public static synthetic fun visionFragment$default (Lkotlinx/html/TagConsumer;Lspace/kscience/visionforge/VisionManager;ZLjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/Map;Lspace/kscience/visionforge/html/HtmlVisionFragment;ILjava/lang/Object;)V } public final class space/kscience/visionforge/html/InputFeedbackMode : java/lang/Enum { @@ -782,6 +794,21 @@ public final class space/kscience/visionforge/html/ResourceLocation : java/lang/ public abstract interface annotation class space/kscience/visionforge/html/VisionDSL : java/lang/annotation/Annotation { } +public final class space/kscience/visionforge/html/VisionDisplay { + public fun (Lspace/kscience/visionforge/VisionManager;Lspace/kscience/visionforge/Vision;Lspace/kscience/dataforge/meta/Meta;)V + public final fun component1 ()Lspace/kscience/visionforge/VisionManager; + public final fun component2 ()Lspace/kscience/visionforge/Vision; + public final fun component3 ()Lspace/kscience/dataforge/meta/Meta; + public final fun copy (Lspace/kscience/visionforge/VisionManager;Lspace/kscience/visionforge/Vision;Lspace/kscience/dataforge/meta/Meta;)Lspace/kscience/visionforge/html/VisionDisplay; + public static synthetic fun copy$default (Lspace/kscience/visionforge/html/VisionDisplay;Lspace/kscience/visionforge/VisionManager;Lspace/kscience/visionforge/Vision;Lspace/kscience/dataforge/meta/Meta;ILjava/lang/Object;)Lspace/kscience/visionforge/html/VisionDisplay; + public fun equals (Ljava/lang/Object;)Z + public final fun getMeta ()Lspace/kscience/dataforge/meta/Meta; + public final fun getVision ()Lspace/kscience/visionforge/Vision; + public final fun getVisionManager ()Lspace/kscience/visionforge/VisionManager; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + public final class space/kscience/visionforge/html/VisionOfCheckbox : space/kscience/visionforge/html/VisionOfHtmlInput { public static final field Companion Lspace/kscience/visionforge/html/VisionOfCheckbox$Companion; public fun ()V @@ -804,20 +831,14 @@ public final class space/kscience/visionforge/html/VisionOfCheckbox$Companion { public final fun serializer ()Lkotlinx/serialization/KSerializer; } -public abstract class space/kscience/visionforge/html/VisionOfHtml : space/kscience/visionforge/AbstractVision { - public static final field Companion Lspace/kscience/visionforge/html/VisionOfHtml$Companion; - public fun ()V - public synthetic fun (ILspace/kscience/dataforge/meta/MutableMeta;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V - public final fun getClasses ()Ljava/util/Set; - public final fun setClasses (Ljava/util/Set;)V - public static final synthetic fun write$Self (Lspace/kscience/visionforge/html/VisionOfHtml;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +public abstract interface class space/kscience/visionforge/html/VisionOfHtml : space/kscience/visionforge/Vision { + public fun getClasses ()Ljava/util/Set; + public fun getStyleString ()Ljava/lang/String; + public fun setClasses (Ljava/util/Set;)V + public fun setStyleString (Ljava/lang/String;)V } -public final class space/kscience/visionforge/html/VisionOfHtml$Companion { - public final fun serializer ()Lkotlinx/serialization/KSerializer; -} - -public final class space/kscience/visionforge/html/VisionOfHtmlButton : space/kscience/visionforge/html/VisionOfHtmlControl, space/kscience/visionforge/ClickControl { +public final class space/kscience/visionforge/html/VisionOfHtmlButton : space/kscience/visionforge/AbstractControlVision, space/kscience/visionforge/DataControl, space/kscience/visionforge/html/VisionOfHtml { public static final field Companion Lspace/kscience/visionforge/html/VisionOfHtmlButton$Companion; public fun ()V public final fun getLabel ()Ljava/lang/String; @@ -839,20 +860,7 @@ public final class space/kscience/visionforge/html/VisionOfHtmlButton$Companion public final fun serializer ()Lkotlinx/serialization/KSerializer; } -public abstract class space/kscience/visionforge/html/VisionOfHtmlControl : space/kscience/visionforge/html/VisionOfHtml, space/kscience/visionforge/ControlVision { - public static final field Companion Lspace/kscience/visionforge/html/VisionOfHtmlControl$Companion; - public fun ()V - public synthetic fun (ILspace/kscience/dataforge/meta/MutableMeta;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V - public fun dispatchControlEvent (Lspace/kscience/visionforge/VisionControlEvent;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public fun getControlEventFlow ()Lkotlinx/coroutines/flow/SharedFlow; - public static final synthetic fun write$Self (Lspace/kscience/visionforge/html/VisionOfHtmlControl;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V -} - -public final class space/kscience/visionforge/html/VisionOfHtmlControl$Companion { - public final fun serializer ()Lkotlinx/serialization/KSerializer; -} - -public final class space/kscience/visionforge/html/VisionOfHtmlForm : space/kscience/visionforge/html/VisionOfHtmlControl { +public final class space/kscience/visionforge/html/VisionOfHtmlForm : space/kscience/visionforge/AbstractControlVision, space/kscience/visionforge/DataControl, space/kscience/visionforge/html/VisionOfHtml { public static final field Companion Lspace/kscience/visionforge/html/VisionOfHtmlForm$Companion; public fun (Ljava/lang/String;)V public final fun getFormId ()Ljava/lang/String; @@ -876,12 +884,14 @@ public final class space/kscience/visionforge/html/VisionOfHtmlForm$Companion { } public final class space/kscience/visionforge/html/VisionOfHtmlFormKt { - public static final fun bindForm (Lkotlinx/html/TagConsumer;Lspace/kscience/visionforge/html/VisionOfHtmlForm;Lkotlin/jvm/functions/Function1;)Ljava/lang/Object; public static final fun button (Lspace/kscience/visionforge/html/VisionOutput;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lspace/kscience/visionforge/html/VisionOfHtmlButton; public static synthetic fun button$default (Lspace/kscience/visionforge/html/VisionOutput;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lspace/kscience/visionforge/html/VisionOfHtmlButton; + public static final fun onFormSubmit (Lspace/kscience/visionforge/html/VisionOfHtmlForm;Lkotlinx/coroutines/CoroutineScope;Lkotlin/jvm/functions/Function1;)Lkotlinx/coroutines/Job; + public static final fun visionOfForm (Lkotlinx/html/TagConsumer;Lspace/kscience/visionforge/html/VisionOfHtmlForm;Ljava/lang/String;Lkotlinx/html/FormEncType;Lkotlinx/html/FormMethod;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Ljava/lang/Object; + public static synthetic fun visionOfForm$default (Lkotlinx/html/TagConsumer;Lspace/kscience/visionforge/html/VisionOfHtmlForm;Ljava/lang/String;Lkotlinx/html/FormEncType;Lkotlinx/html/FormMethod;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Ljava/lang/Object; } -public class space/kscience/visionforge/html/VisionOfHtmlInput : space/kscience/visionforge/html/VisionOfHtmlControl { +public class space/kscience/visionforge/html/VisionOfHtmlInput : space/kscience/visionforge/AbstractControlVision, space/kscience/visionforge/html/VisionOfHtml { public static final field Companion Lspace/kscience/visionforge/html/VisionOfHtmlInput$Companion; public synthetic fun (ILspace/kscience/dataforge/meta/MutableMeta;Ljava/lang/String;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V public fun (Ljava/lang/String;)V @@ -951,7 +961,7 @@ public final class space/kscience/visionforge/html/VisionOfNumberField$Companion public final fun serializer ()Lkotlinx/serialization/KSerializer; } -public final class space/kscience/visionforge/html/VisionOfPlainHtml : space/kscience/visionforge/html/VisionOfHtml { +public final class space/kscience/visionforge/html/VisionOfPlainHtml : space/kscience/visionforge/AbstractVision, space/kscience/visionforge/html/VisionOfHtml { public static final field Companion Lspace/kscience/visionforge/html/VisionOfPlainHtml$Companion; public fun ()V public final fun getContent ()Ljava/lang/String; @@ -1027,7 +1037,6 @@ public final class space/kscience/visionforge/html/VisionOutput : space/kscience public final fun getMeta ()Lspace/kscience/dataforge/meta/Meta; public final fun getName ()Lspace/kscience/dataforge/names/Name; public final fun getVisionManager ()Lspace/kscience/visionforge/VisionManager; - public final fun meta (Lkotlin/jvm/functions/Function1;)V public final fun requirePlugin (Lspace/kscience/dataforge/context/PluginFactory;)V public final fun setMeta (Lspace/kscience/dataforge/meta/Meta;)V } @@ -1098,6 +1107,11 @@ public abstract class space/kscience/visionforge/html/VisionTagConsumer : kotlin public final class space/kscience/visionforge/html/VisionTagConsumer$Companion { } +public final class space/kscience/visionforge/html/VisionTagConsumerKt { + public static final fun meta (Lspace/kscience/visionforge/html/VisionOutput;Lkotlin/jvm/functions/Function1;)V + public static final fun meta (Lspace/kscience/visionforge/html/VisionOutput;Lspace/kscience/dataforge/meta/MetaRepr;)V +} + public final class space/kscience/visionforge/visitor/CountDistinctKt { public static final fun countDistinct (Lkotlinx/coroutines/flow/Flow;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; public static final fun countDistinctBy (Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/StyleSheet.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/StyleSheet.kt index cff29e61..85fea7f4 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/StyleSheet.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/StyleSheet.kt @@ -64,7 +64,7 @@ internal fun Vision.styleChanged(key: String, oldStyle: Meta?, newStyle: Meta?) } /** - * List of names of styles applied to this object. Order matters. Not inherited. + * List of style names applied to this object. Order matters. Not inherited. */ public var Vision.styles: List get() = properties.own[Vision.STYLE_KEY]?.stringList ?: emptyList() diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionManager.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionManager.kt index 2bee6a4f..406dfeba 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionManager.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionManager.kt @@ -132,6 +132,8 @@ public class RootVision(override val manager: VisionManager) : AbstractVisionGro * Designate this [Vision] as a root and assign a [VisionManager] as its parent */ public fun Vision.setAsRoot(manager: VisionManager) { + //do nothing if vision is already rooted + if(this.manager == manager) return if (parent != null) error("Vision $this already has a parent. It could not be set as root") parent = RootVision(manager) } \ No newline at end of file diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionOfHtml.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionOfHtml.kt index 30932c37..050e88ae 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionOfHtml.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionOfHtml.kt @@ -17,11 +17,24 @@ import space.kscience.visionforge.* public interface VisionOfHtml : Vision { + + /** + * Html class strings for this instance. Does not use vision inheritance, but uses styles + */ public var classes: Set - get() = properties[::classes.name, false].stringList?.toSet() ?: emptySet() + get() = properties[::classes.name, false, true].stringList?.toSet() ?: emptySet() set(value) { properties[::classes.name] = value.map { it.asValue() } } + + /** + * A custom style string + */ + public var styleString: String? + get() = properties[::styleString.name,false,true].string + set(value){ + properties[::styleString.name] = value?.asValue() + } } @Serializable @@ -67,7 +80,6 @@ public open class VisionOfHtmlInput( public var value: Value? by properties.value() public var disabled: Boolean by properties.boolean { false } public var fieldName: String? by properties.string() - } /** diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionTagConsumer.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionTagConsumer.kt index 19cfc80a..ccf9892e 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionTagConsumer.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/html/VisionTagConsumer.kt @@ -23,7 +23,7 @@ public annotation class VisionDSL * A placeholder object to attach inline vision builders. */ @VisionDSL -public class VisionOutput @PublishedApi internal constructor(override val context: Context, public val name: Name): ContextAware { +public class VisionOutput(override val context: Context, public val name: Name): ContextAware { public var meta: Meta = Meta.EMPTY private val requirements: MutableSet> = HashSet() diff --git a/visionforge-core/src/commonTest/kotlin/space/kscience/visionforge/meta/VisionPropertyTest.kt b/visionforge-core/src/commonTest/kotlin/space/kscience/visionforge/meta/VisionPropertyTest.kt index 8b800add..71b3109c 100644 --- a/visionforge-core/src/commonTest/kotlin/space/kscience/visionforge/meta/VisionPropertyTest.kt +++ b/visionforge-core/src/commonTest/kotlin/space/kscience/visionforge/meta/VisionPropertyTest.kt @@ -10,6 +10,7 @@ import space.kscience.dataforge.context.Global import space.kscience.dataforge.context.request import space.kscience.dataforge.meta.* import space.kscience.visionforge.* +import kotlin.test.Ignore import kotlin.test.Test import kotlin.test.assertEquals import kotlin.test.assertNotEquals @@ -91,6 +92,7 @@ internal class VisionPropertyTest { } @Test + @Ignore fun testChildrenPropertyFlow() = runTest(timeout = 500.milliseconds) { val group = Global.request(VisionManager).group { diff --git a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/Application.kt b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/html/Application.kt similarity index 94% rename from visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/Application.kt rename to visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/html/Application.kt index 85ead127..1e00d529 100644 --- a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/Application.kt +++ b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/html/Application.kt @@ -1,4 +1,4 @@ -package space.kscience.visionforge +package space.kscience.visionforge.html import kotlinx.browser.document import kotlinx.coroutines.CoroutineScope @@ -46,7 +46,7 @@ public interface Application: CoroutineScope { } public fun startApplication(builder: () -> Application) { - fun start(document: Document, state: dynamic): Application{ + fun start(document: Document, state: dynamic): Application { val application = builder() @Suppress("UnsafeCastFromDynamic") diff --git a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/ElementVisionRenderer.kt b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/html/ElementVisionRenderer.kt similarity index 96% rename from visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/ElementVisionRenderer.kt rename to visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/html/ElementVisionRenderer.kt index 305fa70b..1441350b 100644 --- a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/ElementVisionRenderer.kt +++ b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/html/ElementVisionRenderer.kt @@ -1,4 +1,4 @@ -package space.kscience.visionforge +package space.kscience.visionforge.html import kotlinx.dom.clear import kotlinx.html.TagConsumer @@ -8,6 +8,7 @@ import org.w3c.dom.HTMLElement import space.kscience.dataforge.meta.Meta import space.kscience.dataforge.misc.DfType import space.kscience.dataforge.names.Name +import space.kscience.visionforge.Vision import kotlin.reflect.KClass import kotlin.reflect.cast diff --git a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/JsVisionClient.kt b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/html/JsVisionClient.kt similarity index 98% rename from visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/JsVisionClient.kt rename to visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/html/JsVisionClient.kt index 946de13c..c69e1e91 100644 --- a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/JsVisionClient.kt +++ b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/html/JsVisionClient.kt @@ -1,4 +1,4 @@ -package space.kscience.visionforge +package space.kscience.visionforge.html import kotlinx.browser.document import kotlinx.browser.window @@ -23,7 +23,7 @@ import space.kscience.dataforge.meta.int import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.asName import space.kscience.dataforge.names.parseAsName -import space.kscience.visionforge.html.VisionTagConsumer +import space.kscience.visionforge.* import space.kscience.visionforge.html.VisionTagConsumer.Companion.OUTPUT_CONNECT_ATTRIBUTE import space.kscience.visionforge.html.VisionTagConsumer.Companion.OUTPUT_ENDPOINT_ATTRIBUTE import space.kscience.visionforge.html.VisionTagConsumer.Companion.OUTPUT_FETCH_ATTRIBUTE @@ -92,19 +92,6 @@ public class JsVisionClient : AbstractPlugin(), VisionClient { eventCollector.emit(targetName to event) } - private fun renderVision(element: Element, name: Name, vision: Vision, outputMeta: Meta) { - vision.setAsRoot(visionManager) - val renderer: ElementVisionRenderer = - findRendererFor(vision) ?: error("Could not find renderer for ${vision::class}") - //subscribe to a backwards events propagation for control visions - if(vision is ControlVision){ - vision.controlEventFlow.onEach { - sendEvent(name,it) - }.launchIn(context) - } - renderer.render(element, name, vision, outputMeta) - } - private fun startVisionUpdate(element: Element, visionName: Name, vision: Vision, outputMeta: Meta) { element.attributes[OUTPUT_CONNECT_ATTRIBUTE]?.let { attr -> val wsUrl = if (attr.value.isBlank() || attr.value == VisionTagConsumer.AUTO_DATA_ATTRIBUTE) { @@ -187,6 +174,24 @@ public class JsVisionClient : AbstractPlugin(), VisionClient { } } + + private fun renderVision(element: Element, name: Name, vision: Vision, outputMeta: Meta) { + vision.setAsRoot(visionManager) + val renderer: ElementVisionRenderer = + findRendererFor(vision) ?: error("Could not find renderer for ${vision::class}") + //render vision + renderer.render(element, name, vision, outputMeta) + //start vision update from backend model + startVisionUpdate(element, name, vision, outputMeta) + //subscribe to a backwards events propagation for control visions + if(vision is ControlVision){ + vision.controlEventFlow.onEach { + sendEvent(name,it) + }.launchIn(context) + } + + } + /** * Fetch from server and render a vision, described in a given with [VisionTagConsumer.OUTPUT_CLASS] class. */ @@ -230,7 +235,6 @@ public class JsVisionClient : AbstractPlugin(), VisionClient { response.text().then { text -> val vision = visionManager.decodeFromString(text) renderVision(element, name, vision, outputMeta) - startVisionUpdate(element, name, vision, outputMeta) } } else { logger.error { "Failed to fetch initial vision state from $fetchUrl" } @@ -246,7 +250,6 @@ public class JsVisionClient : AbstractPlugin(), VisionClient { } logger.info { "Found embedded vision for output with name $name" } renderVision(element, name, embeddedVision, outputMeta) - startVisionUpdate(element, name, embeddedVision, outputMeta) } //Try to load vision via websocket diff --git a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/formRenderers.kt b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/html/formRenderers.kt similarity index 95% rename from visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/formRenderers.kt rename to visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/html/formRenderers.kt index f82850cf..a8c693d6 100644 --- a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/formRenderers.kt +++ b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/html/formRenderers.kt @@ -1,4 +1,4 @@ -package space.kscience.visionforge +package space.kscience.visionforge.html import kotlinx.browser.document import kotlinx.coroutines.launch @@ -12,8 +12,7 @@ import space.kscience.dataforge.context.debug import space.kscience.dataforge.context.logger import space.kscience.dataforge.meta.* import space.kscience.dataforge.names.Name -import space.kscience.visionforge.html.VisionOfHtmlButton -import space.kscience.visionforge.html.VisionOfHtmlForm +import space.kscience.visionforge.* /** * Convert form data to Meta diff --git a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/inputRenderers.kt b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/html/inputRenderers.kt similarity index 92% rename from visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/inputRenderers.kt rename to visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/html/inputRenderers.kt index 4e7a9d36..5ad1bb19 100644 --- a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/inputRenderers.kt +++ b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/html/inputRenderers.kt @@ -1,4 +1,4 @@ -package space.kscience.visionforge +package space.kscience.visionforge.html import kotlinx.dom.clear import kotlinx.html.InputType @@ -9,7 +9,10 @@ import org.w3c.dom.HTMLInputElement import space.kscience.dataforge.meta.asValue import space.kscience.dataforge.meta.double import space.kscience.dataforge.meta.string -import space.kscience.visionforge.html.* +import space.kscience.visionforge.VisionInputEvent +import space.kscience.visionforge.VisionValueChangeEvent +import space.kscience.visionforge.asyncControlEvent +import space.kscience.visionforge.useProperty /** * Subscribes the HTML element to a given vision. @@ -20,6 +23,10 @@ internal fun HTMLElement.subscribeToVision(vision: VisionOfHtml) { vision.useProperty(VisionOfHtml::classes) { classList.value = classes.joinToString(separator = " ") } + + vision.useProperty(VisionOfHtml::styleString) { + style.cssText = it ?: "" + } } /** @@ -54,7 +61,7 @@ internal val inputVisionRenderer: ElementVisionRenderer = ElementVisionRenderer< }.also { htmlInputElement -> htmlInputElement.onchange = { - vision.asyncControlEvent( VisionValueChangeEvent(htmlInputElement.value.asValue(), name)) + vision.asyncControlEvent(VisionValueChangeEvent(htmlInputElement.value.asValue(), name)) } htmlInputElement.oninput = { diff --git a/visionforge-core/src/jsTest/kotlin/space/kscience/visionforge/FormTest.kt b/visionforge-core/src/jsTest/kotlin/space/kscience/visionforge/FormTest.kt index 58bd2b09..75b5c188 100644 --- a/visionforge-core/src/jsTest/kotlin/space/kscience/visionforge/FormTest.kt +++ b/visionforge-core/src/jsTest/kotlin/space/kscience/visionforge/FormTest.kt @@ -4,6 +4,7 @@ import org.w3c.xhr.FormData import space.kscience.dataforge.meta.get import space.kscience.dataforge.meta.int import space.kscience.dataforge.meta.stringList +import space.kscience.visionforge.html.toMeta import kotlin.test.Test import kotlin.test.assertEquals diff --git a/visionforge-core/src/jvmTest/kotlin/space/kscience/visionforge/meta/PropertyFlowTest.kt b/visionforge-core/src/jvmTest/kotlin/space/kscience/visionforge/meta/PropertyFlowTest.kt new file mode 100644 index 00000000..3c5834a5 --- /dev/null +++ b/visionforge-core/src/jvmTest/kotlin/space/kscience/visionforge/meta/PropertyFlowTest.kt @@ -0,0 +1,65 @@ +package space.kscience.visionforge.meta + +import kotlinx.coroutines.delay +import kotlinx.coroutines.flow.launchIn +import kotlinx.coroutines.flow.map +import kotlinx.coroutines.flow.onEach +import kotlinx.coroutines.runBlocking +import org.junit.jupiter.api.Timeout +import space.kscience.dataforge.context.Global +import space.kscience.dataforge.context.request +import space.kscience.dataforge.meta.* +import space.kscience.visionforge.* +import kotlin.test.Test +import kotlin.test.assertEquals + +internal class PropertyFlowTest { + + private val manager = Global.request(VisionManager) + + @Test + @Timeout(200) + fun testChildrenPropertyFlow() = runBlocking{ + val group = Global.request(VisionManager).group { + + properties { + "test" put 11 + } + + group("child") { + properties { + "test" put 22 + } + } + + } + + val child = group.children["child"]!! + + val changesFlow = child.flowPropertyValue("test", inherit = true).map { + it!!.int + } + + val collectedValues = ArrayList(5) + + val collectorJob = changesFlow.onEach { + collectedValues.add(it) + }.launchIn(this) + + + delay(2) + assertEquals(22, child.properties["test", true].int) + + child.properties.remove("test") + delay(2) + + assertEquals(11, child.properties["test", true].int) + group.properties["test"] = 33 + delay(2) + + assertEquals(33, child.properties["test", true].int) + + collectorJob.cancel() + assertEquals(listOf(22, 11, 33), collectedValues) + } +} \ No newline at end of file diff --git a/visionforge-gdml/README.md b/visionforge-gdml/README.md index a6429697..9c0a8e5a 100644 --- a/visionforge-gdml/README.md +++ b/visionforge-gdml/README.md @@ -6,7 +6,7 @@ ## Artifact: -The Maven coordinates of this project are `space.kscience:visionforge-gdml:0.3.0-rc`. +The Maven coordinates of this project are `space.kscience:visionforge-gdml:0.4.0-dev-3`. **Gradle Kotlin DSL:** ```kotlin @@ -16,6 +16,6 @@ repositories { } dependencies { - implementation("space.kscience:visionforge-gdml:0.3.0-rc") + implementation("space.kscience:visionforge-gdml:0.4.0-dev-3") } ``` diff --git a/visionforge-jupyter/README.md b/visionforge-jupyter/README.md index 43df6bfd..f2fda065 100644 --- a/visionforge-jupyter/README.md +++ b/visionforge-jupyter/README.md @@ -6,7 +6,7 @@ Common visionforge jupyter module ## Artifact: -The Maven coordinates of this project are `space.kscience:visionforge-jupyter:0.3.0-rc`. +The Maven coordinates of this project are `space.kscience:visionforge-jupyter:0.4.0-dev-3`. **Gradle Kotlin DSL:** ```kotlin @@ -16,6 +16,6 @@ repositories { } dependencies { - implementation("space.kscience:visionforge-jupyter:0.3.0-rc") + implementation("space.kscience:visionforge-jupyter:0.4.0-dev-3") } ``` diff --git a/visionforge-jupyter/src/jsMain/kotlin/VFNotebookClient.kt b/visionforge-jupyter/src/jsMain/kotlin/VFNotebookClient.kt index e095485c..2b78f450 100644 --- a/visionforge-jupyter/src/jsMain/kotlin/VFNotebookClient.kt +++ b/visionforge-jupyter/src/jsMain/kotlin/VFNotebookClient.kt @@ -8,10 +8,10 @@ import space.kscience.dataforge.context.Context import space.kscience.dataforge.context.PluginFactory import space.kscience.dataforge.context.PluginTag import space.kscience.dataforge.meta.Meta -import space.kscience.visionforge.JsVisionClient -import space.kscience.visionforge.renderAllVisions -import space.kscience.visionforge.renderAllVisionsById -import space.kscience.visionforge.renderAllVisionsIn +import space.kscience.visionforge.html.JsVisionClient +import space.kscience.visionforge.html.renderAllVisions +import space.kscience.visionforge.html.renderAllVisionsById +import space.kscience.visionforge.html.renderAllVisionsIn @JsExport public class VFNotebookClient : AbstractPlugin() { diff --git a/visionforge-jupyter/visionforge-jupyter-common/src/jsMain/kotlin/commonJupyter.kt b/visionforge-jupyter/visionforge-jupyter-common/src/jsMain/kotlin/commonJupyter.kt index ae0e29e2..10138701 100644 --- a/visionforge-jupyter/visionforge-jupyter-common/src/jsMain/kotlin/commonJupyter.kt +++ b/visionforge-jupyter/visionforge-jupyter-common/src/jsMain/kotlin/commonJupyter.kt @@ -1,9 +1,9 @@ package space.kscience.visionforge.gdml.jupyter +import space.kscience.visionforge.html.runVisionClient import space.kscience.visionforge.jupyter.VFNotebookClient import space.kscience.visionforge.markup.MarkupPlugin import space.kscience.visionforge.plotly.PlotlyPlugin -import space.kscience.visionforge.runVisionClient import space.kscience.visionforge.solid.three.ThreePlugin import space.kscience.visionforge.tables.TableVisionJsPlugin diff --git a/visionforge-markdown/README.md b/visionforge-markdown/README.md index 5e35ccf7..6226bbea 100644 --- a/visionforge-markdown/README.md +++ b/visionforge-markdown/README.md @@ -6,7 +6,7 @@ ## Artifact: -The Maven coordinates of this project are `space.kscience:visionforge-markdown:0.3.0-rc`. +The Maven coordinates of this project are `space.kscience:visionforge-markdown:0.4.0-dev-3`. **Gradle Kotlin DSL:** ```kotlin @@ -16,6 +16,6 @@ repositories { } dependencies { - implementation("space.kscience:visionforge-markdown:0.3.0-rc") + implementation("space.kscience:visionforge-markdown:0.4.0-dev-3") } ``` diff --git a/visionforge-markdown/src/jsMain/kotlin/space/kscience/visionforge/markup/MarkupPlugin.kt b/visionforge-markdown/src/jsMain/kotlin/space/kscience/visionforge/markup/MarkupPlugin.kt index d6df2162..4806ec38 100644 --- a/visionforge-markdown/src/jsMain/kotlin/space/kscience/visionforge/markup/MarkupPlugin.kt +++ b/visionforge-markdown/src/jsMain/kotlin/space/kscience/visionforge/markup/MarkupPlugin.kt @@ -13,9 +13,13 @@ import space.kscience.dataforge.context.PluginTag import space.kscience.dataforge.meta.Meta import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.asName -import space.kscience.visionforge.* +import space.kscience.visionforge.Vision +import space.kscience.visionforge.VisionPlugin +import space.kscience.visionforge.html.ElementVisionRenderer +import space.kscience.visionforge.html.JsVisionClient import space.kscience.visionforge.markup.VisionOfMarkup.Companion.COMMONMARK_FORMAT import space.kscience.visionforge.markup.VisionOfMarkup.Companion.GFM_FORMAT +import space.kscience.visionforge.useProperty public actual class MarkupPlugin : VisionPlugin(), ElementVisionRenderer { public val visionClient: JsVisionClient by require(JsVisionClient) diff --git a/visionforge-plotly/README.md b/visionforge-plotly/README.md index 83f3b06b..4fdf04e2 100644 --- a/visionforge-plotly/README.md +++ b/visionforge-plotly/README.md @@ -6,7 +6,7 @@ ## Artifact: -The Maven coordinates of this project are `space.kscience:visionforge-plotly:0.3.0-rc`. +The Maven coordinates of this project are `space.kscience:visionforge-plotly:0.4.0-dev-3`. **Gradle Kotlin DSL:** ```kotlin @@ -16,6 +16,6 @@ repositories { } dependencies { - implementation("space.kscience:visionforge-plotly:0.3.0-rc") + implementation("space.kscience:visionforge-plotly:0.4.0-dev-3") } ``` diff --git a/visionforge-plotly/src/jsMain/kotlin/space/kscience/visionforge/plotly/plotlyJs.kt b/visionforge-plotly/src/jsMain/kotlin/space/kscience/visionforge/plotly/plotlyJs.kt index 074be6dc..32c46132 100644 --- a/visionforge-plotly/src/jsMain/kotlin/space/kscience/visionforge/plotly/plotlyJs.kt +++ b/visionforge-plotly/src/jsMain/kotlin/space/kscience/visionforge/plotly/plotlyJs.kt @@ -10,10 +10,10 @@ import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.asName import space.kscience.plotly.PlotlyConfig import space.kscience.plotly.plot -import space.kscience.visionforge.ElementVisionRenderer -import space.kscience.visionforge.JsVisionClient import space.kscience.visionforge.Vision import space.kscience.visionforge.VisionPlugin +import space.kscience.visionforge.html.ElementVisionRenderer +import space.kscience.visionforge.html.JsVisionClient public actual class PlotlyPlugin : VisionPlugin(), ElementVisionRenderer { public val visionClient: JsVisionClient by require(JsVisionClient) diff --git a/visionforge-server/README.md b/visionforge-server/README.md index c51b38ae..78c6a18f 100644 --- a/visionforge-server/README.md +++ b/visionforge-server/README.md @@ -6,7 +6,7 @@ ## Artifact: -The Maven coordinates of this project are `space.kscience:visionforge-server:0.3.0-rc`. +The Maven coordinates of this project are `space.kscience:visionforge-server:0.4.0-dev-3`. **Gradle Kotlin DSL:** ```kotlin @@ -16,6 +16,6 @@ repositories { } dependencies { - implementation("space.kscience:visionforge-server:0.3.0-rc") + implementation("space.kscience:visionforge-server:0.4.0-dev-3") } ``` diff --git a/visionforge-solid/README.md b/visionforge-solid/README.md index 331c8485..177b60ad 100644 --- a/visionforge-solid/README.md +++ b/visionforge-solid/README.md @@ -6,7 +6,7 @@ ## Artifact: -The Maven coordinates of this project are `space.kscience:visionforge-solid:0.3.0-rc`. +The Maven coordinates of this project are `space.kscience:visionforge-solid:0.4.0-dev-3`. **Gradle Kotlin DSL:** ```kotlin @@ -16,6 +16,6 @@ repositories { } dependencies { - implementation("space.kscience:visionforge-solid:0.3.0-rc") + implementation("space.kscience:visionforge-solid:0.4.0-dev-3") } ``` diff --git a/visionforge-solid/api/visionforge-solid.api b/visionforge-solid/api/visionforge-solid.api index cfeecfe3..b8fc8211 100644 --- a/visionforge-solid/api/visionforge-solid.api +++ b/visionforge-solid/api/visionforge-solid.api @@ -747,6 +747,7 @@ public final class space/kscience/visionforge/solid/SolidKt { public static final fun getY (Lspace/kscience/visionforge/solid/Solid;)Ljava/lang/Number; public static final fun getZ (Lspace/kscience/visionforge/solid/Solid;)Ljava/lang/Number; public static final fun rotate (Lspace/kscience/visionforge/solid/Solid;Lspace/kscience/kmath/geometry/Angle;Lspace/kscience/kmath/geometry/Vector3D;)V + public static final fun scale (Lspace/kscience/visionforge/solid/Solid;Ljava/lang/Number;)V public static final fun setDetail (Lspace/kscience/visionforge/solid/Solid;Ljava/lang/Integer;)V public static final fun setIgnore (Lspace/kscience/visionforge/Vision;Ljava/lang/Boolean;)V public static final fun setLayer (Lspace/kscience/visionforge/solid/Solid;I)V @@ -802,8 +803,10 @@ public final class space/kscience/visionforge/solid/SolidMaterial : space/kscien public final fun getEmissiveColor ()Lspace/kscience/visionforge/solid/ColorAccessor; public final fun getOpacity ()F public final fun getSpecularColor ()Lspace/kscience/visionforge/solid/ColorAccessor; + public final fun getType ()Ljava/lang/String; public final fun getWireframe ()Z public final fun setOpacity (F)V + public final fun setType (Ljava/lang/String;)V public final fun setWireframe (Z)V } @@ -1087,23 +1090,6 @@ public final class space/kscience/visionforge/solid/SurfaceKt { public static synthetic fun surface$default (Lspace/kscience/visionforge/MutableVisionContainer;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lspace/kscience/visionforge/solid/Surface; } -public final class space/kscience/visionforge/solid/specifications/AxesScheme : space/kscience/dataforge/meta/Scheme { - public static final field AXIS_SIZE D - public static final field AXIS_WIDTH D - public static final field Companion Lspace/kscience/visionforge/solid/specifications/AxesScheme$Companion; - public fun ()V - public final fun getSize ()D - public final fun getVisible ()Z - public final fun getWidth ()D - public final fun setSize (D)V - public final fun setVisible (Z)V - public final fun setWidth (D)V -} - -public final class space/kscience/visionforge/solid/specifications/AxesScheme$Companion : space/kscience/dataforge/meta/SchemeSpec { - public fun getDescriptor ()Lspace/kscience/dataforge/meta/descriptors/MetaDescriptor; -} - public final class space/kscience/visionforge/solid/specifications/CameraScheme : space/kscience/dataforge/meta/Scheme { public static final field Companion Lspace/kscience/visionforge/solid/specifications/CameraScheme$Companion; public static final field FAR_CLIP D @@ -1138,15 +1124,15 @@ public final class space/kscience/visionforge/solid/specifications/CameraSchemeK public final class space/kscience/visionforge/solid/specifications/Canvas3DOptions : space/kscience/dataforge/meta/Scheme { public static final field Companion Lspace/kscience/visionforge/solid/specifications/Canvas3DOptions$Companion; public fun ()V - public final fun getAxes ()Lspace/kscience/visionforge/solid/specifications/AxesScheme; public final fun getCamera ()Lspace/kscience/visionforge/solid/specifications/CameraScheme; + public final fun getCanvasName ()Ljava/lang/String; public final fun getClipping ()Lspace/kscience/visionforge/solid/specifications/PointScheme; public final fun getControls ()Lspace/kscience/visionforge/solid/specifications/Canvas3DUIScheme; public final fun getLayers ()Ljava/util/List; public final fun getOnSelect ()Lkotlin/jvm/functions/Function1; public final fun getSize ()Lspace/kscience/visionforge/solid/specifications/CanvasSize; - public final fun setAxes (Lspace/kscience/visionforge/solid/specifications/AxesScheme;)V public final fun setCamera (Lspace/kscience/visionforge/solid/specifications/CameraScheme;)V + public final fun setCanvasName (Ljava/lang/String;)V public final fun setClipping (Lspace/kscience/visionforge/solid/specifications/PointScheme;)V public final fun setControls (Lspace/kscience/visionforge/solid/specifications/Canvas3DUIScheme;)V public final fun setLayers (Ljava/util/List;)V @@ -1171,6 +1157,7 @@ public final class space/kscience/visionforge/solid/specifications/Canvas3DUISch } public final class space/kscience/visionforge/solid/specifications/Canvas3DUIScheme$Companion : space/kscience/dataforge/meta/SchemeSpec { + public fun getDescriptor ()Lspace/kscience/dataforge/meta/descriptors/MetaDescriptor; } public final class space/kscience/visionforge/solid/specifications/CanvasSize : space/kscience/dataforge/meta/Scheme { diff --git a/visionforge-solid/build.gradle.kts b/visionforge-solid/build.gradle.kts index f87cef77..f6ee0ab4 100644 --- a/visionforge-solid/build.gradle.kts +++ b/visionforge-solid/build.gradle.kts @@ -8,6 +8,7 @@ kscience { jvm() js() native() +// wasm() useSerialization { json() } diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidMaterial.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidMaterial.kt index e45c18dd..6e336110 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidMaterial.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidMaterial.kt @@ -2,6 +2,7 @@ package space.kscience.visionforge.solid import space.kscience.dataforge.meta.* import space.kscience.dataforge.meta.descriptors.MetaDescriptor +import space.kscience.dataforge.meta.descriptors.ValueRestriction import space.kscience.dataforge.meta.descriptors.value import space.kscience.dataforge.meta.set import space.kscience.dataforge.names.Name @@ -66,6 +67,7 @@ public class SolidMaterial : Scheme() { //must be lazy to avoid initialization bug MetaDescriptor { inherited = true + valueRestriction = ValueRestriction.ABSENT value(TYPE_KEY, ValueType.STRING) { inherited = true diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/specifications/Canvas3DOptions.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/specifications/Canvas3DOptions.kt index 19e93b0f..a67532ce 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/specifications/Canvas3DOptions.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/specifications/Canvas3DOptions.kt @@ -4,6 +4,7 @@ package space.kscience.visionforge.solid.specifications import space.kscience.dataforge.meta.* import space.kscience.dataforge.meta.descriptors.MetaDescriptor +import space.kscience.dataforge.meta.descriptors.ValueRestriction import space.kscience.dataforge.meta.descriptors.scheme import space.kscience.dataforge.meta.descriptors.value import space.kscience.dataforge.meta.set @@ -15,6 +16,7 @@ import space.kscience.visionforge.widgetType public object Clipping : SchemeSpec(::PointScheme) { override val descriptor: MetaDescriptor = MetaDescriptor { + valueRestriction = ValueRestriction.ABSENT value(PointScheme::x) { widgetType = "range" attributes["min"] = 0.0 diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/specifications/Canvas3DUIScheme.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/specifications/Canvas3DUIScheme.kt index 5f85cc44..46665a56 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/specifications/Canvas3DUIScheme.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/specifications/Canvas3DUIScheme.kt @@ -3,11 +3,17 @@ package space.kscience.visionforge.solid.specifications import space.kscience.dataforge.meta.Scheme import space.kscience.dataforge.meta.SchemeSpec import space.kscience.dataforge.meta.boolean +import space.kscience.dataforge.meta.descriptors.MetaDescriptor +import space.kscience.dataforge.meta.descriptors.ValueRestriction public class Canvas3DUIScheme : Scheme() { public var enabled: Boolean by boolean { true } - public companion object : SchemeSpec(::Canvas3DUIScheme) + public companion object : SchemeSpec(::Canvas3DUIScheme) { + override val descriptor: MetaDescriptor = MetaDescriptor { + valueRestriction = ValueRestriction.ABSENT + } + } } \ No newline at end of file diff --git a/visionforge-tables/README.md b/visionforge-tables/README.md index b02284f8..59af4988 100644 --- a/visionforge-tables/README.md +++ b/visionforge-tables/README.md @@ -6,7 +6,7 @@ ## Artifact: -The Maven coordinates of this project are `space.kscience:visionforge-tables:0.3.0-rc`. +The Maven coordinates of this project are `space.kscience:visionforge-tables:0.4.0-dev-3`. **Gradle Kotlin DSL:** ```kotlin @@ -16,6 +16,6 @@ repositories { } dependencies { - implementation("space.kscience:visionforge-tables:0.3.0-rc") + implementation("space.kscience:visionforge-tables:0.4.0-dev-3") } ``` diff --git a/visionforge-tables/src/jsMain/kotlin/space/kscience/visionforge/tables/TableVisionJsPlugin.kt b/visionforge-tables/src/jsMain/kotlin/space/kscience/visionforge/tables/TableVisionJsPlugin.kt index ba11976a..4b6e9be9 100644 --- a/visionforge-tables/src/jsMain/kotlin/space/kscience/visionforge/tables/TableVisionJsPlugin.kt +++ b/visionforge-tables/src/jsMain/kotlin/space/kscience/visionforge/tables/TableVisionJsPlugin.kt @@ -11,9 +11,9 @@ import space.kscience.dataforge.meta.Meta import space.kscience.dataforge.meta.toDynamic import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.asName -import space.kscience.visionforge.ElementVisionRenderer -import space.kscience.visionforge.JsVisionClient import space.kscience.visionforge.Vision +import space.kscience.visionforge.html.ElementVisionRenderer +import space.kscience.visionforge.html.JsVisionClient import tabulator.Tabulator import tabulator.TabulatorFull diff --git a/visionforge-threejs/README.md b/visionforge-threejs/README.md index 3b26d996..4b0cbb6d 100644 --- a/visionforge-threejs/README.md +++ b/visionforge-threejs/README.md @@ -6,7 +6,7 @@ ## Artifact: -The Maven coordinates of this project are `space.kscience:visionforge-threejs:0.3.0-rc`. +The Maven coordinates of this project are `space.kscience:visionforge-threejs:0.4.0-dev-3`. **Gradle Kotlin DSL:** ```kotlin @@ -16,6 +16,6 @@ repositories { } dependencies { - implementation("space.kscience:visionforge-threejs:0.3.0-rc") + implementation("space.kscience:visionforge-threejs:0.4.0-dev-3") } ``` diff --git a/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/ThreePlugin.kt b/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/ThreePlugin.kt index 30010a12..f63c1841 100644 --- a/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/ThreePlugin.kt +++ b/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/ThreePlugin.kt @@ -9,11 +9,16 @@ import org.w3c.dom.HTMLElement import space.kscience.dataforge.context.* import space.kscience.dataforge.meta.Meta import space.kscience.dataforge.names.* -import space.kscience.visionforge.* +import space.kscience.visionforge.Vision +import space.kscience.visionforge.VisionChildren +import space.kscience.visionforge.VisionClient import space.kscience.visionforge.html.ComposeHtmlVisionRenderer +import space.kscience.visionforge.html.ElementVisionRenderer +import space.kscience.visionforge.html.JsVisionClient import space.kscience.visionforge.solid.* import space.kscience.visionforge.solid.specifications.Canvas3DOptions import space.kscience.visionforge.solid.three.compose.ThreeView +import space.kscience.visionforge.visible import three.core.Object3D import kotlin.collections.set import kotlin.reflect.KClass diff --git a/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/compose/ThreeControls.kt b/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/compose/ThreeControls.kt index 63e95760..a0211a1e 100644 --- a/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/compose/ThreeControls.kt +++ b/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/compose/ThreeControls.kt @@ -9,7 +9,6 @@ import app.softwork.bootstrapcompose.Layout.Width import org.jetbrains.compose.web.dom.Hr import org.w3c.files.Blob import org.w3c.files.BlobPropertyBag -import space.kscience.dataforge.context.Global import space.kscience.dataforge.names.Name import space.kscience.visionforge.Vision import space.kscience.visionforge.encodeToString @@ -33,7 +32,6 @@ internal fun CanvasControls( } Hr() PropertyEditor( - scope = vision?.manager?.context ?: Global, properties = options.meta, descriptor = Canvas3DOptions.descriptor, expanded = false diff --git a/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/compose/ThreeView.kt b/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/compose/ThreeView.kt index b3dd1347..1f496b05 100644 --- a/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/compose/ThreeView.kt +++ b/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/compose/ThreeView.kt @@ -135,7 +135,6 @@ public fun ThreeView( NameCrumbs(selected) { selected = it } Hr() PropertyEditor( - scope = context, rootMeta = vision.properties.root(), getPropertyState = { name -> if (vision.properties.own[name] != null) { diff --git a/visionforge-threejs/visionforge-threejs-server/README.md b/visionforge-threejs/visionforge-threejs-server/README.md index 16ac3520..2f94128a 100644 --- a/visionforge-threejs/visionforge-threejs-server/README.md +++ b/visionforge-threejs/visionforge-threejs-server/README.md @@ -6,7 +6,7 @@ ## Artifact: -The Maven coordinates of this project are `space.kscience:visionforge-threejs-server:0.3.0-rc`. +The Maven coordinates of this project are `space.kscience:visionforge-threejs-server:0.4.0-dev-3`. **Gradle Kotlin DSL:** ```kotlin @@ -16,6 +16,6 @@ repositories { } dependencies { - implementation("space.kscience:visionforge-threejs-server:0.3.0-rc") + implementation("space.kscience:visionforge-threejs-server:0.4.0-dev-3") } ``` diff --git a/visionforge-threejs/visionforge-threejs-server/build.gradle.kts b/visionforge-threejs/visionforge-threejs-server/build.gradle.kts index cf62eede..8a762d13 100644 --- a/visionforge-threejs/visionforge-threejs-server/build.gradle.kts +++ b/visionforge-threejs/visionforge-threejs-server/build.gradle.kts @@ -23,6 +23,7 @@ kscience { commonMain { api(projects.visionforgeSolid) + api(projects.visionforgeComposeHtml) } jvmMain { diff --git a/visionforge-threejs/visionforge-threejs-server/src/jsMain/kotlin/space/kscience/visionforge/three/jsMain.kt b/visionforge-threejs/visionforge-threejs-server/src/jsMain/kotlin/space/kscience/visionforge/three/jsMain.kt index ed2908f5..c0169f81 100644 --- a/visionforge-threejs/visionforge-threejs-server/src/jsMain/kotlin/space/kscience/visionforge/three/jsMain.kt +++ b/visionforge-threejs/visionforge-threejs-server/src/jsMain/kotlin/space/kscience/visionforge/three/jsMain.kt @@ -1,7 +1,7 @@ package space.kscience.visionforge.three import space.kscience.dataforge.misc.DFExperimental -import space.kscience.visionforge.runVisionClient +import space.kscience.visionforge.html.runVisionClient import space.kscience.visionforge.solid.three.ThreePlugin From 1145483a9010d5947555aa70abf04dba986cee62 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Thu, 14 Mar 2024 09:04:54 +0300 Subject: [PATCH 37/41] Fix bug with ElementVisionRenderer having the same name --- build.gradle.kts | 2 +- visionforge-compose-html/build.gradle.kts | 1 + .../visionforge/html/ElementVisionRenderer.kt | 4 ++++ .../kscience/visionforge/html/inputRenderers.kt | 15 +++++++-------- .../kscience/visionforge/markup/MarkupPlugin.kt | 4 +++- .../space/kscience/visionforge/plotly/plotlyJs.kt | 2 ++ .../visionforge/tables/TableVisionJsPlugin.kt | 2 ++ .../visionforge/solid/three/ThreePlugin.kt | 2 ++ .../visionforge-threejs-server/build.gradle.kts | 4 ++-- 9 files changed, 24 insertions(+), 12 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 335299c2..6194c770 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -10,7 +10,7 @@ val dataforgeVersion by extra("0.8.0") allprojects { group = "space.kscience" - version = "0.4.0" + version = "0.4.1-dev-1" } subprojects { diff --git a/visionforge-compose-html/build.gradle.kts b/visionforge-compose-html/build.gradle.kts index d3f5d754..89d7c329 100644 --- a/visionforge-compose-html/build.gradle.kts +++ b/visionforge-compose-html/build.gradle.kts @@ -23,6 +23,7 @@ kotlin { dependencies { api("app.softwork:bootstrap-compose:0.1.15") api("app.softwork:bootstrap-compose-icons:0.1.15") + implementation(compose.html.svg) api(compose.html.core) } diff --git a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/html/ElementVisionRenderer.kt b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/html/ElementVisionRenderer.kt index 1441350b..57d3e4e1 100644 --- a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/html/ElementVisionRenderer.kt +++ b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/html/ElementVisionRenderer.kt @@ -36,6 +36,8 @@ public interface ElementVisionRenderer { meta: Meta = Meta.EMPTY, ) + override fun toString(): String + public companion object { public const val TYPE: String = "elementVisionRenderer" public const val ZERO_RATING: Int = 0 @@ -66,6 +68,8 @@ public class SingleTypeVisionRenderer( renderFunction(name, kClass.cast(vision), meta) } } + + override fun toString(): String = "ElementVisionRender(${kClass.simpleName})" } public inline fun ElementVisionRenderer( diff --git a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/html/inputRenderers.kt b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/html/inputRenderers.kt index 5ad1bb19..3615c24a 100644 --- a/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/html/inputRenderers.kt +++ b/visionforge-core/src/jsMain/kotlin/space/kscience/visionforge/html/inputRenderers.kt @@ -41,16 +41,15 @@ private fun HTMLInputElement.subscribeToInput(inputVision: VisionOfHtmlInput) { } } -internal val htmlVisionRenderer: ElementVisionRenderer = - ElementVisionRenderer { _, vision, _ -> - div().also { div -> - div.subscribeToVision(vision) - vision.useProperty(VisionOfPlainHtml::content) { - div.clear() - if (it != null) div.innerHTML = it - } +internal val htmlVisionRenderer: ElementVisionRenderer = ElementVisionRenderer { _, vision, _ -> + div().also { div -> + div.subscribeToVision(vision) + vision.useProperty(VisionOfPlainHtml::content) { + div.clear() + if (it != null) div.innerHTML = it } } +} internal val inputVisionRenderer: ElementVisionRenderer = ElementVisionRenderer( acceptRating = ElementVisionRenderer.DEFAULT_RATING - 1 diff --git a/visionforge-markdown/src/jsMain/kotlin/space/kscience/visionforge/markup/MarkupPlugin.kt b/visionforge-markdown/src/jsMain/kotlin/space/kscience/visionforge/markup/MarkupPlugin.kt index 4806ec38..7ec33c80 100644 --- a/visionforge-markdown/src/jsMain/kotlin/space/kscience/visionforge/markup/MarkupPlugin.kt +++ b/visionforge-markdown/src/jsMain/kotlin/space/kscience/visionforge/markup/MarkupPlugin.kt @@ -31,7 +31,7 @@ public actual class MarkupPlugin : VisionPlugin(), ElementVisionRenderer { else -> ElementVisionRenderer.ZERO_RATING } - override fun render(element: Element,name: Name, vision: Vision, meta: Meta) { + override fun render(element: Element, name: Name, vision: Vision, meta: Meta) { require(vision is VisionOfMarkup) { "The vision is not a markup vision" } val div = document.createElement("div") val flavour = when (vision.format) { @@ -49,6 +49,8 @@ public actual class MarkupPlugin : VisionPlugin(), ElementVisionRenderer { element.append(div) } + override fun toString(): String = "Markup" + override fun content(target: String): Map = when (target) { ElementVisionRenderer.TYPE -> mapOf("markup".asName() to this) else -> super.content(target) diff --git a/visionforge-plotly/src/jsMain/kotlin/space/kscience/visionforge/plotly/plotlyJs.kt b/visionforge-plotly/src/jsMain/kotlin/space/kscience/visionforge/plotly/plotlyJs.kt index 32c46132..3e7d8110 100644 --- a/visionforge-plotly/src/jsMain/kotlin/space/kscience/visionforge/plotly/plotlyJs.kt +++ b/visionforge-plotly/src/jsMain/kotlin/space/kscience/visionforge/plotly/plotlyJs.kt @@ -33,6 +33,8 @@ public actual class PlotlyPlugin : VisionPlugin(), ElementVisionRenderer { element.plot(config, plot) } + override fun toString(): String = "Plotly" + override fun content(target: String): Map = when (target) { ElementVisionRenderer.TYPE -> mapOf("plotly".asName() to this) else -> super.content(target) diff --git a/visionforge-tables/src/jsMain/kotlin/space/kscience/visionforge/tables/TableVisionJsPlugin.kt b/visionforge-tables/src/jsMain/kotlin/space/kscience/visionforge/tables/TableVisionJsPlugin.kt index 4b6e9be9..1b7ba961 100644 --- a/visionforge-tables/src/jsMain/kotlin/space/kscience/visionforge/tables/TableVisionJsPlugin.kt +++ b/visionforge-tables/src/jsMain/kotlin/space/kscience/visionforge/tables/TableVisionJsPlugin.kt @@ -81,6 +81,8 @@ public class TableVisionJsPlugin : AbstractPlugin(), ElementVisionRenderer { TabulatorFull(element as HTMLElement, tableOptions) } + override fun toString(): String = "Table" + override fun content(target: String): Map = when (target) { ElementVisionRenderer.TYPE -> mapOf("table".asName() to this) else -> super.content(target) diff --git a/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/ThreePlugin.kt b/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/ThreePlugin.kt index f63c1841..a4e13533 100644 --- a/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/ThreePlugin.kt +++ b/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/ThreePlugin.kt @@ -169,6 +169,8 @@ public class ThreePlugin : AbstractPlugin(), ComposeHtmlVisionRenderer { override fun rateVision(vision: Vision): Int = if (vision is Solid) ElementVisionRenderer.DEFAULT_RATING else ElementVisionRenderer.ZERO_RATING + override fun toString(): String = "ThreeJS" + /** * Render the given [Solid] Vision in a [ThreeCanvas] attached * to the [element]. Canvas objects are cached, so subsequent calls diff --git a/visionforge-threejs/visionforge-threejs-server/build.gradle.kts b/visionforge-threejs/visionforge-threejs-server/build.gradle.kts index 8a762d13..3dbfacf4 100644 --- a/visionforge-threejs/visionforge-threejs-server/build.gradle.kts +++ b/visionforge-threejs/visionforge-threejs-server/build.gradle.kts @@ -32,8 +32,8 @@ kscience { jsMain { api(projects.visionforgeThreejs) - implementation(npm("file-saver", "2.0.5")) - implementation(npm("@types/file-saver", "2.0.7")) + api(npm("file-saver", "2.0.5")) + api(npm("@types/file-saver", "2.0.7")) compileOnly(npm("webpack-bundle-analyzer", "4.5.0")) } } \ No newline at end of file From 6dc1b9f3494872a5c794702e8e778e70add1ac83 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Thu, 14 Mar 2024 14:54:16 +0300 Subject: [PATCH 38/41] Fix plotly update problem --- gradle.properties | 1 - .../kscience/visionforge/VisionChange.kt | 2 +- .../kscience/visionforge/VisionProperties.kt | 27 +++++---- .../kscience/visionforge/flowProperty.kt | 4 +- .../space/kscience/visionforge/useProperty.kt | 8 +-- .../visionforge/plotly/VisionOfPlotly.kt | 58 +++++++++++-------- .../visionforge/solid/SolidReference.kt | 8 +-- .../visionforge/solid/three/ThreePlugin.kt | 2 +- .../solid/three/compose/ThreeView.kt | 2 +- 9 files changed, 63 insertions(+), 49 deletions(-) diff --git a/gradle.properties b/gradle.properties index 23061828..c89e530c 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,7 +1,6 @@ kotlin.code.style=official kotlin.mpp.stability.nowarn=true kotlin.js.compiler=ir -#kotlin.incremental.js.ir=true org.gradle.parallel=true org.gradle.jvmargs=-Xmx4G diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionChange.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionChange.kt index 00386948..eb800111 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionChange.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionChange.kt @@ -147,7 +147,7 @@ private fun CoroutineScope.collectChange( ) { //Collect properties change - source.properties.flowChanges().onEach { propertyName -> + source.properties.changes.onEach { propertyName -> val newItem = source.properties.own[propertyName] collector.propertyChanged(name, propertyName, newItem) }.launchIn(this) diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionProperties.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionProperties.kt index 752b7bd3..9201d0bf 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionProperties.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionProperties.kt @@ -40,7 +40,11 @@ public interface VisionProperties : MetaProvider { override fun get(name: Name): Meta? = get(name, null, null) - public fun flowChanges(): Flow + public val changes: Flow + + @Deprecated("Replace with property", ReplaceWith("changes")) + public fun flowChanges(): Flow = changes + /** * Notify all listeners that a property has been changed and should be invalidated. @@ -64,7 +68,7 @@ public interface MutableVisionProperties : VisionProperties, MutableMetaProvider public fun set( name: Name, - node: Meta?, + item: Meta?, notify: Boolean, ) @@ -186,28 +190,28 @@ public open class AbstractVisionProperties( return descriptor?.defaultValue } - override fun set(name: Name, node: Meta?, notify: Boolean) { + override fun set(name: Name, item: Meta?, notify: Boolean) { //ignore if the value is the same as existing - if (own[name] == node) return + if (own[name] == item) return if (name.isEmpty()) { - if (node == null) { + if (item == null) { own.items.keys.forEach { remove(it.asName()) } } else { - (own.items.keys - node.items.keys).forEach { + (own.items.keys - item.items.keys).forEach { remove(it.asName()) } - node.items.forEach { (token, item) -> + item.items.forEach { (token, item) -> set(token, item) } } - } else if (node == null) { - own[name] = node + } else if (item == null) { + own[name] = item } else { - own[name] = node + own[name] = item } if (notify) { invalidate(name) @@ -231,7 +235,8 @@ public open class AbstractVisionProperties( @Transient protected val changesInternal: MutableSharedFlow = MutableSharedFlow() - override fun flowChanges(): Flow = changesInternal + override val changes: Flow + get() = changesInternal override fun invalidate(propertyName: Name) { //send update signal diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/flowProperty.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/flowProperty.kt index 8d1bbb72..60c39c20 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/flowProperty.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/flowProperty.kt @@ -18,7 +18,7 @@ public fun Vision.flowProperty( ): Flow = flow { //Pass initial value. emit(properties.get(propertyName, inherit, includeStyles)) - properties.flowChanges().collect { name -> + properties.changes.collect { name -> if (name.startsWith(propertyName)) { emit(properties.get(propertyName, inherit, includeStyles)) } @@ -41,7 +41,7 @@ public fun Vision.flowPropertyValue( ): Flow = flow { //Pass initial value. emit(properties.getValue(propertyName, inherit, includeStyles)) - properties.flowChanges().collect { name -> + properties.changes.collect { name -> if (name.startsWith(propertyName)) { emit(properties.getValue(propertyName, inherit, includeStyles)) } diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/useProperty.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/useProperty.kt index 07ed4bd9..fcdea6d3 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/useProperty.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/useProperty.kt @@ -25,7 +25,7 @@ public fun Vision.useProperty( ): Job { //Pass initial value. callback(properties.get(propertyName, inherit, includeStyles)) - return properties.flowChanges().onEach { name -> + return properties.changes.onEach { name -> if (name.startsWith(propertyName)) { callback(properties.get(propertyName, inherit, includeStyles)) } @@ -47,7 +47,7 @@ public fun V.useProperty( ): Job { //Pass initial value. callback(property.get(this)) - return properties.flowChanges().onEach { name -> + return properties.changes.onEach { name -> if (name.startsWith(property.name.asName())) { callback(property.get(this@useProperty)) } @@ -60,7 +60,7 @@ public fun V.useProperty( public fun Vision.onPropertyChange( scope: CoroutineScope = manager?.context ?: error("Orphan Vision can't observe properties. Use explicit scope."), callback: suspend (Name) -> Unit, -): Job = properties.flowChanges().onEach { +): Job = properties.changes.onEach { callback(it) }.launchIn(scope) @@ -71,6 +71,6 @@ public fun V.onPropertyChange( property: KProperty1, scope: CoroutineScope = manager?.context ?: error("Orphan Vision can't observe properties. Use explicit scope."), callback: suspend V.(T) -> Unit, -): Job = properties.flowChanges().filter { it.startsWith(property.name.asName()) }.onEach { +): Job = properties.changes.filter { it.startsWith(property.name.asName()) }.onEach { callback(property.get(this)) }.launchIn(scope) \ No newline at end of file diff --git a/visionforge-plotly/src/commonMain/kotlin/space/kscience/visionforge/plotly/VisionOfPlotly.kt b/visionforge-plotly/src/commonMain/kotlin/space/kscience/visionforge/plotly/VisionOfPlotly.kt index 0e2a3206..3490fdd7 100644 --- a/visionforge-plotly/src/commonMain/kotlin/space/kscience/visionforge/plotly/VisionOfPlotly.kt +++ b/visionforge-plotly/src/commonMain/kotlin/space/kscience/visionforge/plotly/VisionOfPlotly.kt @@ -1,23 +1,17 @@ package space.kscience.visionforge.plotly import kotlinx.coroutines.channels.awaitClose -import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.callbackFlow -import kotlinx.coroutines.flow.emptyFlow import kotlinx.coroutines.launch import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable import kotlinx.serialization.Transient -import space.kscience.dataforge.meta.MutableMeta -import space.kscience.dataforge.meta.MutableMetaSerializer -import space.kscience.dataforge.meta.ObservableMeta -import space.kscience.dataforge.meta.asObservable +import space.kscience.dataforge.meta.* import space.kscience.dataforge.meta.descriptors.MetaDescriptor import space.kscience.dataforge.names.Name import space.kscience.plotly.Plot import space.kscience.plotly.Plotly import space.kscience.plotly.PlotlyConfig -import space.kscience.visionforge.AbstractVisionProperties import space.kscience.visionforge.MutableVisionProperties import space.kscience.visionforge.Vision import space.kscience.visionforge.VisionBuilder @@ -26,36 +20,52 @@ import space.kscience.visionforge.html.VisionOutput @Serializable @SerialName("vision.plotly") public class VisionOfPlotly private constructor( - @Serializable(MutableMetaSerializer::class) public val meta: MutableMeta, + @Serializable(MutableMetaSerializer::class) private val meta: MutableMeta, ) : Vision { public constructor(plot: Plot) : this(plot.meta) - public val plot: Plot get() = Plot(meta.asObservable()) + @Transient + public val plot: Plot = Plot(meta.asObservable()) @Transient override var parent: Vision? = null @Transient - override val properties: MutableVisionProperties = object : AbstractVisionProperties(this, meta) { + override val properties: MutableVisionProperties = object : MutableVisionProperties { + override val own: Meta get() = plot.meta - override fun flowChanges(): Flow = if (meta is ObservableMeta) { - callbackFlow { - meta.onChange(this) { - launch { - send(it) - } - } - awaitClose { - meta.removeListener(this) + override val changes = callbackFlow { + plot.meta.onChange(this) { + println(it) + launch { + send(it) } } - } else emptyFlow() - - - override fun invalidate(propertyName: Name) { - // Do nothing + awaitClose { + plot.meta.removeListener(this) + } } + override fun invalidate(propertyName: Name) { + //do nothing, updates to source already counted +// manager?.context?.launch { +// changes.emit(propertyName) +// } + } + + override fun getValue(name: Name, inherit: Boolean?, includeStyles: Boolean?): Value? = plot.meta[name]?.value + + override fun set(name: Name, item: Meta?, notify: Boolean) { + plot.meta[name] = item + if (notify) invalidate(name) + } + + override fun setValue(name: Name, value: Value?, notify: Boolean) { + plot.meta[name] = value + if (notify) invalidate(name) + } + + override val descriptor: MetaDescriptor get() = plot.descriptor } diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidReference.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidReference.kt index ec13823e..b98bd4cb 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidReference.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/SolidReference.kt @@ -166,16 +166,16 @@ internal class SolidReferenceChild( includeStyles: Boolean?, ): Value? = own.getValue(name) ?: prototype.properties.getValue(name, inherit, includeStyles) - override fun set(name: Name, node: Meta?, notify: Boolean) { - own[name] = node + override fun set(name: Name, item: Meta?, notify: Boolean) { + own[name] = item } override fun setValue(name: Name, value: Value?, notify: Boolean) { own.setValue(name, value) } - override fun flowChanges(): Flow = - owner.properties.flowChanges().filter { it.startsWith(childToken(childName)) } + override val changes: Flow + get() = owner.properties.changes.filter { it.startsWith(childToken(childName)) } override fun invalidate(propertyName: Name) { owner.properties.invalidate(childPropertyName(childName, propertyName)) diff --git a/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/ThreePlugin.kt b/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/ThreePlugin.kt index a4e13533..c943668a 100644 --- a/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/ThreePlugin.kt +++ b/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/ThreePlugin.kt @@ -89,7 +89,7 @@ public class ThreePlugin : AbstractPlugin(), ComposeHtmlVisionRenderer { updatePosition(vision) //obj.onChildrenChange() if (observe) { - vision.properties.flowChanges().onEach { name -> + vision.properties.changes.onEach { name -> if ( name.startsWith(Solid.POSITION_KEY) || name.startsWith(Solid.ROTATION_KEY) || diff --git a/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/compose/ThreeView.kt b/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/compose/ThreeView.kt index 1f496b05..2dbd1f48 100644 --- a/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/compose/ThreeView.kt +++ b/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/compose/ThreeView.kt @@ -147,7 +147,7 @@ public fun ThreeView( } }, name = Name.EMPTY, - updates = vision.properties.flowChanges(), + updates = vision.properties.changes, rootDescriptor = vision.descriptor ) vision.styles.takeIf { it.isNotEmpty() }?.let { styles -> From ec238edbd1ec708bf17133f49f5b859737211443 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Thu, 14 Mar 2024 14:54:38 +0300 Subject: [PATCH 39/41] Fix plotly update problem --- .../src/jvmMain/kotlin/dynamicPlotlyVision.kt | 112 ++++++++++++++++++ 1 file changed, 112 insertions(+) create mode 100644 demo/playground/src/jvmMain/kotlin/dynamicPlotlyVision.kt diff --git a/demo/playground/src/jvmMain/kotlin/dynamicPlotlyVision.kt b/demo/playground/src/jvmMain/kotlin/dynamicPlotlyVision.kt new file mode 100644 index 00000000..818e1ccf --- /dev/null +++ b/demo/playground/src/jvmMain/kotlin/dynamicPlotlyVision.kt @@ -0,0 +1,112 @@ +package space.kscience.visionforge.examples + +import io.ktor.server.cio.CIO +import io.ktor.server.engine.embeddedServer +import io.ktor.server.http.content.staticResources +import io.ktor.server.routing.routing +import kotlinx.coroutines.delay +import kotlinx.coroutines.isActive +import kotlinx.coroutines.launch +import kotlinx.html.a +import kotlinx.html.h1 +import space.kscience.dataforge.context.Global +import space.kscience.dataforge.context.request +import space.kscience.plotly.layout +import space.kscience.plotly.models.Trace +import space.kscience.plotly.models.invoke +import space.kscience.visionforge.html.VisionPage +import space.kscience.visionforge.plotly.PlotlyPlugin +import space.kscience.visionforge.plotly.plotly +import space.kscience.visionforge.server.close +import space.kscience.visionforge.server.openInBrowser +import space.kscience.visionforge.server.visionPage +import kotlin.math.PI +import kotlin.math.cos +import kotlin.math.sin + +fun main() { + val plotlyPlugin = Global.request(PlotlyPlugin) + val visionManager = plotlyPlugin.visionManager + + val server = embeddedServer(CIO) { + + routing { + staticResources("/", null) + } + + + val freq = 1.0 / 1000 + val oscillationFreq = 1.0 / 10000 + + val x = (0..100).map { it.toDouble() / 100.0 } + val sinY = x.map { sin(2.0 * PI * it) } + val cosY = x.map { cos(2.0 * PI * it) } + + val sinTrace = Trace(x, sinY) { name = "sin" } + val cosTrace = Trace(x, cosY) { name = "cos" } + + visionPage( + visionManager, + VisionPage.scriptHeader("js/visionforge-playground.js"), + ) { + + h1 { +"This is the plot page" } + a("/other") { +"The other page" } + vision { + + + plotly { + traces(sinTrace, cosTrace) + layout { + title = "Other dynamic plot" + xaxis.title = "x axis name" + yaxis.title = "y axis name" + } + } + } + } + + visionPage( + visionManager, + VisionPage.scriptHeader("js/visionforge-playground.js"), + route = "other" + ) { + h1 { +"This is the other plot page" } + a("/") { +"Back to the main page" } + vision { + plotly { + traces(sinTrace) + layout { + title = "Dynamic plot" + xaxis.title = "x axis name" + yaxis.title = "y axis name" + } + } + } + } + + + //Start pushing updates + launch { + var time: Long = 0 + + while (isActive) { + delay(10) + time += 10 + sinTrace.y.numbers = x.map { sin(2.0 * PI * (it + time.toDouble() * freq)) } + val cosAmp = cos(2.0 * PI * oscillationFreq * time) + cosTrace.y.numbers = x.map { cos(2.0 * PI * (it + time.toDouble() * freq)) * cosAmp } + } + } + + }.start(false) + + + server.openInBrowser() + + while (readlnOrNull() != "exit") { + + } + + server.close() +} From d305789aa8eddef6d34591f746669f9fb35b6d89 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Thu, 14 Mar 2024 15:52:17 +0300 Subject: [PATCH 40/41] remove debug print --- .../kotlin/space/kscience/visionforge/plotly/VisionOfPlotly.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/visionforge-plotly/src/commonMain/kotlin/space/kscience/visionforge/plotly/VisionOfPlotly.kt b/visionforge-plotly/src/commonMain/kotlin/space/kscience/visionforge/plotly/VisionOfPlotly.kt index 3490fdd7..df619295 100644 --- a/visionforge-plotly/src/commonMain/kotlin/space/kscience/visionforge/plotly/VisionOfPlotly.kt +++ b/visionforge-plotly/src/commonMain/kotlin/space/kscience/visionforge/plotly/VisionOfPlotly.kt @@ -36,7 +36,6 @@ public class VisionOfPlotly private constructor( override val changes = callbackFlow { plot.meta.onChange(this) { - println(it) launch { send(it) } From e5882d01f8e512a59c45a77099a189814c32c16e Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Fri, 15 Mar 2024 10:46:30 +0300 Subject: [PATCH 41/41] v 4.1 --- CHANGELOG.md | 11 +++++++++++ build.gradle.kts | 2 +- demo/playground/api/playground.api | 5 +++++ visionforge-compose-multiplatform/README.md | 4 ++-- visionforge-core/README.md | 4 ++-- visionforge-core/api/visionforge-core.api | 5 +++-- visionforge-gdml/README.md | 4 ++-- visionforge-jupyter/README.md | 4 ++-- visionforge-markdown/README.md | 4 ++-- visionforge-plotly/README.md | 4 ++-- .../kscience/visionforge/plotly/VisionOfPlotly.kt | 2 +- visionforge-server/README.md | 4 ++-- visionforge-solid/README.md | 4 ++-- visionforge-tables/README.md | 4 ++-- visionforge-threejs/README.md | 4 ++-- .../visionforge-threejs-server/README.md | 4 ++-- 16 files changed, 43 insertions(+), 26 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9c2a4746..2fa6c42d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,17 @@ ### Security +## 0.4.1 - 2024-03-15 + +### Changed + +- VisionProperties `flowChanges()` -> `changes` + +### Fixed + +- Bug with ElementVisionRenderer having the same name +- Plotly update problem + ## 0.4.0 - 2024-02-16 ### Added diff --git a/build.gradle.kts b/build.gradle.kts index 6194c770..eb7e4fe4 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -10,7 +10,7 @@ val dataforgeVersion by extra("0.8.0") allprojects { group = "space.kscience" - version = "0.4.1-dev-1" + version = "0.4.1" } subprojects { diff --git a/demo/playground/api/playground.api b/demo/playground/api/playground.api index 45992241..e133494f 100644 --- a/demo/playground/api/playground.api +++ b/demo/playground/api/playground.api @@ -23,6 +23,11 @@ public final class space/kscience/visionforge/examples/ControlVisionKt { public static synthetic fun main ([Ljava/lang/String;)V } +public final class space/kscience/visionforge/examples/DynamicPlotlyVisionKt { + public static final fun main ()V + public static synthetic fun main ([Ljava/lang/String;)V +} + public final class space/kscience/visionforge/examples/ExtrudedKt { public static final fun main ()V public static synthetic fun main ([Ljava/lang/String;)V diff --git a/visionforge-compose-multiplatform/README.md b/visionforge-compose-multiplatform/README.md index 0ba9ae3c..aef4ef10 100644 --- a/visionforge-compose-multiplatform/README.md +++ b/visionforge-compose-multiplatform/README.md @@ -6,7 +6,7 @@ ## Artifact: -The Maven coordinates of this project are `space.kscience:visionforge-compose-multiplatform:0.4.0-dev-3`. +The Maven coordinates of this project are `space.kscience:visionforge-compose-multiplatform:0.4.1`. **Gradle Kotlin DSL:** ```kotlin @@ -16,6 +16,6 @@ repositories { } dependencies { - implementation("space.kscience:visionforge-compose-multiplatform:0.4.0-dev-3") + implementation("space.kscience:visionforge-compose-multiplatform:0.4.1") } ``` diff --git a/visionforge-core/README.md b/visionforge-core/README.md index d1cad403..ebd092d8 100644 --- a/visionforge-core/README.md +++ b/visionforge-core/README.md @@ -6,7 +6,7 @@ ## Artifact: -The Maven coordinates of this project are `space.kscience:visionforge-core:0.4.0-dev-3`. +The Maven coordinates of this project are `space.kscience:visionforge-core:0.4.1`. **Gradle Kotlin DSL:** ```kotlin @@ -16,6 +16,6 @@ repositories { } dependencies { - implementation("space.kscience:visionforge-core:0.4.0-dev-3") + implementation("space.kscience:visionforge-core:0.4.1") } ``` diff --git a/visionforge-core/api/visionforge-core.api b/visionforge-core/api/visionforge-core.api index 90fce073..9586823b 100644 --- a/visionforge-core/api/visionforge-core.api +++ b/visionforge-core/api/visionforge-core.api @@ -49,7 +49,7 @@ public final class space/kscience/visionforge/AbstractVisionGroup$Companion { public class space/kscience/visionforge/AbstractVisionProperties : space/kscience/visionforge/MutableVisionProperties { public fun (Lspace/kscience/visionforge/Vision;Lspace/kscience/dataforge/meta/MutableMeta;)V - public fun flowChanges ()Lkotlinx/coroutines/flow/Flow; + public fun getChanges ()Lkotlinx/coroutines/flow/Flow; protected final fun getChangesInternal ()Lkotlinx/coroutines/flow/MutableSharedFlow; public fun getDescriptor ()Lspace/kscience/dataforge/meta/descriptors/MetaDescriptor; public synthetic fun getOwn ()Lspace/kscience/dataforge/meta/Meta; @@ -647,10 +647,11 @@ public abstract class space/kscience/visionforge/VisionPlugin : space/kscience/d } public abstract interface class space/kscience/visionforge/VisionProperties : space/kscience/dataforge/meta/MetaProvider { - public abstract fun flowChanges ()Lkotlinx/coroutines/flow/Flow; + public fun flowChanges ()Lkotlinx/coroutines/flow/Flow; public fun get (Lspace/kscience/dataforge/names/Name;)Lspace/kscience/dataforge/meta/Meta; public abstract fun get (Lspace/kscience/dataforge/names/Name;Ljava/lang/Boolean;Ljava/lang/Boolean;)Lspace/kscience/dataforge/meta/Meta; public static synthetic fun get$default (Lspace/kscience/visionforge/VisionProperties;Lspace/kscience/dataforge/names/Name;Ljava/lang/Boolean;Ljava/lang/Boolean;ILjava/lang/Object;)Lspace/kscience/dataforge/meta/Meta; + public abstract fun getChanges ()Lkotlinx/coroutines/flow/Flow; public abstract fun getDescriptor ()Lspace/kscience/dataforge/meta/descriptors/MetaDescriptor; public abstract fun getOwn ()Lspace/kscience/dataforge/meta/Meta; public fun getValue (Lspace/kscience/dataforge/names/Name;)Lspace/kscience/dataforge/meta/Value; diff --git a/visionforge-gdml/README.md b/visionforge-gdml/README.md index 9c0a8e5a..e26717d4 100644 --- a/visionforge-gdml/README.md +++ b/visionforge-gdml/README.md @@ -6,7 +6,7 @@ ## Artifact: -The Maven coordinates of this project are `space.kscience:visionforge-gdml:0.4.0-dev-3`. +The Maven coordinates of this project are `space.kscience:visionforge-gdml:0.4.1`. **Gradle Kotlin DSL:** ```kotlin @@ -16,6 +16,6 @@ repositories { } dependencies { - implementation("space.kscience:visionforge-gdml:0.4.0-dev-3") + implementation("space.kscience:visionforge-gdml:0.4.1") } ``` diff --git a/visionforge-jupyter/README.md b/visionforge-jupyter/README.md index f2fda065..b5794ea5 100644 --- a/visionforge-jupyter/README.md +++ b/visionforge-jupyter/README.md @@ -6,7 +6,7 @@ Common visionforge jupyter module ## Artifact: -The Maven coordinates of this project are `space.kscience:visionforge-jupyter:0.4.0-dev-3`. +The Maven coordinates of this project are `space.kscience:visionforge-jupyter:0.4.1`. **Gradle Kotlin DSL:** ```kotlin @@ -16,6 +16,6 @@ repositories { } dependencies { - implementation("space.kscience:visionforge-jupyter:0.4.0-dev-3") + implementation("space.kscience:visionforge-jupyter:0.4.1") } ``` diff --git a/visionforge-markdown/README.md b/visionforge-markdown/README.md index 6226bbea..5aa2def9 100644 --- a/visionforge-markdown/README.md +++ b/visionforge-markdown/README.md @@ -6,7 +6,7 @@ ## Artifact: -The Maven coordinates of this project are `space.kscience:visionforge-markdown:0.4.0-dev-3`. +The Maven coordinates of this project are `space.kscience:visionforge-markdown:0.4.1`. **Gradle Kotlin DSL:** ```kotlin @@ -16,6 +16,6 @@ repositories { } dependencies { - implementation("space.kscience:visionforge-markdown:0.4.0-dev-3") + implementation("space.kscience:visionforge-markdown:0.4.1") } ``` diff --git a/visionforge-plotly/README.md b/visionforge-plotly/README.md index 4fdf04e2..1b5c3678 100644 --- a/visionforge-plotly/README.md +++ b/visionforge-plotly/README.md @@ -6,7 +6,7 @@ ## Artifact: -The Maven coordinates of this project are `space.kscience:visionforge-plotly:0.4.0-dev-3`. +The Maven coordinates of this project are `space.kscience:visionforge-plotly:0.4.1`. **Gradle Kotlin DSL:** ```kotlin @@ -16,6 +16,6 @@ repositories { } dependencies { - implementation("space.kscience:visionforge-plotly:0.4.0-dev-3") + implementation("space.kscience:visionforge-plotly:0.4.1") } ``` diff --git a/visionforge-plotly/src/commonMain/kotlin/space/kscience/visionforge/plotly/VisionOfPlotly.kt b/visionforge-plotly/src/commonMain/kotlin/space/kscience/visionforge/plotly/VisionOfPlotly.kt index df619295..444bcb9c 100644 --- a/visionforge-plotly/src/commonMain/kotlin/space/kscience/visionforge/plotly/VisionOfPlotly.kt +++ b/visionforge-plotly/src/commonMain/kotlin/space/kscience/visionforge/plotly/VisionOfPlotly.kt @@ -20,7 +20,7 @@ import space.kscience.visionforge.html.VisionOutput @Serializable @SerialName("vision.plotly") public class VisionOfPlotly private constructor( - @Serializable(MutableMetaSerializer::class) private val meta: MutableMeta, + @Serializable(MutableMetaSerializer::class) public val meta: MutableMeta, ) : Vision { public constructor(plot: Plot) : this(plot.meta) diff --git a/visionforge-server/README.md b/visionforge-server/README.md index 78c6a18f..b7fa4411 100644 --- a/visionforge-server/README.md +++ b/visionforge-server/README.md @@ -6,7 +6,7 @@ ## Artifact: -The Maven coordinates of this project are `space.kscience:visionforge-server:0.4.0-dev-3`. +The Maven coordinates of this project are `space.kscience:visionforge-server:0.4.1`. **Gradle Kotlin DSL:** ```kotlin @@ -16,6 +16,6 @@ repositories { } dependencies { - implementation("space.kscience:visionforge-server:0.4.0-dev-3") + implementation("space.kscience:visionforge-server:0.4.1") } ``` diff --git a/visionforge-solid/README.md b/visionforge-solid/README.md index 177b60ad..e0a6e29b 100644 --- a/visionforge-solid/README.md +++ b/visionforge-solid/README.md @@ -6,7 +6,7 @@ ## Artifact: -The Maven coordinates of this project are `space.kscience:visionforge-solid:0.4.0-dev-3`. +The Maven coordinates of this project are `space.kscience:visionforge-solid:0.4.1`. **Gradle Kotlin DSL:** ```kotlin @@ -16,6 +16,6 @@ repositories { } dependencies { - implementation("space.kscience:visionforge-solid:0.4.0-dev-3") + implementation("space.kscience:visionforge-solid:0.4.1") } ``` diff --git a/visionforge-tables/README.md b/visionforge-tables/README.md index 59af4988..dab2ad0b 100644 --- a/visionforge-tables/README.md +++ b/visionforge-tables/README.md @@ -6,7 +6,7 @@ ## Artifact: -The Maven coordinates of this project are `space.kscience:visionforge-tables:0.4.0-dev-3`. +The Maven coordinates of this project are `space.kscience:visionforge-tables:0.4.1`. **Gradle Kotlin DSL:** ```kotlin @@ -16,6 +16,6 @@ repositories { } dependencies { - implementation("space.kscience:visionforge-tables:0.4.0-dev-3") + implementation("space.kscience:visionforge-tables:0.4.1") } ``` diff --git a/visionforge-threejs/README.md b/visionforge-threejs/README.md index 4b0cbb6d..0ac15cc6 100644 --- a/visionforge-threejs/README.md +++ b/visionforge-threejs/README.md @@ -6,7 +6,7 @@ ## Artifact: -The Maven coordinates of this project are `space.kscience:visionforge-threejs:0.4.0-dev-3`. +The Maven coordinates of this project are `space.kscience:visionforge-threejs:0.4.1`. **Gradle Kotlin DSL:** ```kotlin @@ -16,6 +16,6 @@ repositories { } dependencies { - implementation("space.kscience:visionforge-threejs:0.4.0-dev-3") + implementation("space.kscience:visionforge-threejs:0.4.1") } ``` diff --git a/visionforge-threejs/visionforge-threejs-server/README.md b/visionforge-threejs/visionforge-threejs-server/README.md index 2f94128a..3190b351 100644 --- a/visionforge-threejs/visionforge-threejs-server/README.md +++ b/visionforge-threejs/visionforge-threejs-server/README.md @@ -6,7 +6,7 @@ ## Artifact: -The Maven coordinates of this project are `space.kscience:visionforge-threejs-server:0.4.0-dev-3`. +The Maven coordinates of this project are `space.kscience:visionforge-threejs-server:0.4.1`. **Gradle Kotlin DSL:** ```kotlin @@ -16,6 +16,6 @@ repositories { } dependencies { - implementation("space.kscience:visionforge-threejs-server:0.4.0-dev-3") + implementation("space.kscience:visionforge-threejs-server:0.4.1") } ```