From 0b496fc0e0c8fe2fff4a6e64032c995916c03d7a Mon Sep 17 00:00:00 2001 From: Nikhil Rao Date: Tue, 20 Dec 2022 15:22:04 -0800 Subject: [PATCH] Use websockets for events (#150) --- poetry.lock | 87 +- pynecone/.templates/web/bun.lockb | Bin 229830 -> 229700 bytes pynecone/.templates/web/next.config.js | 2 +- pynecone/.templates/web/package.json | 4 +- pynecone/.templates/web/styles/code/prism.js | 2001 +++++++++--------- pynecone/.templates/web/utils/state.js | 102 +- pynecone/app.py | 112 +- pynecone/compiler/compiler.py | 4 +- pynecone/compiler/templates.py | 9 +- pynecone/compiler/utils.py | 6 +- pynecone/constants.py | 14 +- pyproject.toml | 1 + 12 files changed, 1257 insertions(+), 1085 deletions(-) diff --git a/poetry.lock b/poetry.lock index 5212ad1c9..6fcd1c70f 100644 --- a/poetry.lock +++ b/poetry.lock @@ -604,14 +604,14 @@ plugins = ["importlib-metadata"] [[package]] name = "pyright" -version = "1.1.283" +version = "1.1.284" description = "Command line wrapper for pyright" category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "pyright-1.1.283-py3-none-any.whl", hash = "sha256:d5b14bb50ccbfb7769e09a611960665021816ea1b0543e0ffb8c341388c73710"}, - {file = "pyright-1.1.283.tar.gz", hash = "sha256:57dcc7abf0b764d5f587a80faf20186f5666adffe5f34afa10d471e96bbd9509"}, + {file = "pyright-1.1.284-py3-none-any.whl", hash = "sha256:e3bfbd33c20af48eed9d20138767265161ba8a4b55c740476a36ce822bd482d1"}, + {file = "pyright-1.1.284.tar.gz", hash = "sha256:ef7c0e46e38be95687f5a0633e55c5171ca166048b9560558168a976162e287c"}, ] [package.dependencies] @@ -1020,6 +1020,85 @@ typing-extensions = {version = "*", markers = "python_version < \"3.8\""} [package.extras] standard = ["colorama (>=0.4)", "httptools (>=0.5.0)", "python-dotenv (>=0.13)", "pyyaml (>=5.1)", "uvloop (>=0.14.0,!=0.15.0,!=0.15.1)", "watchfiles (>=0.13)", "websockets (>=10.4)"] +[[package]] +name = "websockets" +version = "10.4" +description = "An implementation of the WebSocket Protocol (RFC 6455 & 7692)" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "websockets-10.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d58804e996d7d2307173d56c297cf7bc132c52df27a3efaac5e8d43e36c21c48"}, + {file = "websockets-10.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bc0b82d728fe21a0d03e65f81980abbbcb13b5387f733a1a870672c5be26edab"}, + {file = "websockets-10.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ba089c499e1f4155d2a3c2a05d2878a3428cf321c848f2b5a45ce55f0d7d310c"}, + {file = "websockets-10.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:33d69ca7612f0ddff3316b0c7b33ca180d464ecac2d115805c044bf0a3b0d032"}, + {file = "websockets-10.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:62e627f6b6d4aed919a2052efc408da7a545c606268d5ab5bfab4432734b82b4"}, + {file = "websockets-10.4-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:38ea7b82bfcae927eeffc55d2ffa31665dc7fec7b8dc654506b8e5a518eb4d50"}, + {file = "websockets-10.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e0cb5cc6ece6ffa75baccfd5c02cffe776f3f5c8bf486811f9d3ea3453676ce8"}, + {file = "websockets-10.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:ae5e95cfb53ab1da62185e23b3130e11d64431179debac6dc3c6acf08760e9b1"}, + {file = "websockets-10.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7c584f366f46ba667cfa66020344886cf47088e79c9b9d39c84ce9ea98aaa331"}, + {file = "websockets-10.4-cp310-cp310-win32.whl", hash = "sha256:b029fb2032ae4724d8ae8d4f6b363f2cc39e4c7b12454df8df7f0f563ed3e61a"}, + {file = "websockets-10.4-cp310-cp310-win_amd64.whl", hash = "sha256:8dc96f64ae43dde92530775e9cb169979f414dcf5cff670455d81a6823b42089"}, + {file = "websockets-10.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:47a2964021f2110116cc1125b3e6d87ab5ad16dea161949e7244ec583b905bb4"}, + {file = "websockets-10.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e789376b52c295c4946403bd0efecf27ab98f05319df4583d3c48e43c7342c2f"}, + {file = "websockets-10.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7d3f0b61c45c3fa9a349cf484962c559a8a1d80dae6977276df8fd1fa5e3cb8c"}, + {file = "websockets-10.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f55b5905705725af31ccef50e55391621532cd64fbf0bc6f4bac935f0fccec46"}, + {file = "websockets-10.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:00c870522cdb69cd625b93f002961ffb0c095394f06ba8c48f17eef7c1541f96"}, + {file = "websockets-10.4-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f38706e0b15d3c20ef6259fd4bc1700cd133b06c3c1bb108ffe3f8947be15fa"}, + {file = "websockets-10.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f2c38d588887a609191d30e902df2a32711f708abfd85d318ca9b367258cfd0c"}, + {file = "websockets-10.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:fe10ddc59b304cb19a1bdf5bd0a7719cbbc9fbdd57ac80ed436b709fcf889106"}, + {file = "websockets-10.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:90fcf8929836d4a0e964d799a58823547df5a5e9afa83081761630553be731f9"}, + {file = "websockets-10.4-cp311-cp311-win32.whl", hash = "sha256:b9968694c5f467bf67ef97ae7ad4d56d14be2751000c1207d31bf3bb8860bae8"}, + {file = "websockets-10.4-cp311-cp311-win_amd64.whl", hash = "sha256:a7a240d7a74bf8d5cb3bfe6be7f21697a28ec4b1a437607bae08ac7acf5b4882"}, + {file = "websockets-10.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:74de2b894b47f1d21cbd0b37a5e2b2392ad95d17ae983e64727e18eb281fe7cb"}, + {file = "websockets-10.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e3a686ecb4aa0d64ae60c9c9f1a7d5d46cab9bfb5d91a2d303d00e2cd4c4c5cc"}, + {file = "websockets-10.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b0d15c968ea7a65211e084f523151dbf8ae44634de03c801b8bd070b74e85033"}, + {file = "websockets-10.4-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:00213676a2e46b6ebf6045bc11d0f529d9120baa6f58d122b4021ad92adabd41"}, + {file = "websockets-10.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:e23173580d740bf8822fd0379e4bf30aa1d5a92a4f252d34e893070c081050df"}, + {file = "websockets-10.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:dd500e0a5e11969cdd3320935ca2ff1e936f2358f9c2e61f100a1660933320ea"}, + {file = "websockets-10.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:4239b6027e3d66a89446908ff3027d2737afc1a375f8fd3eea630a4842ec9a0c"}, + {file = "websockets-10.4-cp37-cp37m-win32.whl", hash = "sha256:8a5cc00546e0a701da4639aa0bbcb0ae2bb678c87f46da01ac2d789e1f2d2038"}, + {file = "websockets-10.4-cp37-cp37m-win_amd64.whl", hash = "sha256:a9f9a735deaf9a0cadc2d8c50d1a5bcdbae8b6e539c6e08237bc4082d7c13f28"}, + {file = "websockets-10.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5c1289596042fad2cdceb05e1ebf7aadf9995c928e0da2b7a4e99494953b1b94"}, + {file = "websockets-10.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0cff816f51fb33c26d6e2b16b5c7d48eaa31dae5488ace6aae468b361f422b63"}, + {file = "websockets-10.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:dd9becd5fe29773d140d68d607d66a38f60e31b86df75332703757ee645b6faf"}, + {file = "websockets-10.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45ec8e75b7dbc9539cbfafa570742fe4f676eb8b0d3694b67dabe2f2ceed8aa6"}, + {file = "websockets-10.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4f72e5cd0f18f262f5da20efa9e241699e0cf3a766317a17392550c9ad7b37d8"}, + {file = "websockets-10.4-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:185929b4808b36a79c65b7865783b87b6841e852ef5407a2fb0c03381092fa3b"}, + {file = "websockets-10.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:7d27a7e34c313b3a7f91adcd05134315002aaf8540d7b4f90336beafaea6217c"}, + {file = "websockets-10.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:884be66c76a444c59f801ac13f40c76f176f1bfa815ef5b8ed44321e74f1600b"}, + {file = "websockets-10.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:931c039af54fc195fe6ad536fde4b0de04da9d5916e78e55405436348cfb0e56"}, + {file = "websockets-10.4-cp38-cp38-win32.whl", hash = "sha256:db3c336f9eda2532ec0fd8ea49fef7a8df8f6c804cdf4f39e5c5c0d4a4ad9a7a"}, + {file = "websockets-10.4-cp38-cp38-win_amd64.whl", hash = "sha256:48c08473563323f9c9debac781ecf66f94ad5a3680a38fe84dee5388cf5acaf6"}, + {file = "websockets-10.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:40e826de3085721dabc7cf9bfd41682dadc02286d8cf149b3ad05bff89311e4f"}, + {file = "websockets-10.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:56029457f219ade1f2fc12a6504ea61e14ee227a815531f9738e41203a429112"}, + {file = "websockets-10.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f5fc088b7a32f244c519a048c170f14cf2251b849ef0e20cbbb0fdf0fdaf556f"}, + {file = "websockets-10.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2fc8709c00704194213d45e455adc106ff9e87658297f72d544220e32029cd3d"}, + {file = "websockets-10.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0154f7691e4fe6c2b2bc275b5701e8b158dae92a1ab229e2b940efe11905dff4"}, + {file = "websockets-10.4-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c6d2264f485f0b53adf22697ac11e261ce84805c232ed5dbe6b1bcb84b00ff0"}, + {file = "websockets-10.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9bc42e8402dc5e9905fb8b9649f57efcb2056693b7e88faa8fb029256ba9c68c"}, + {file = "websockets-10.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:edc344de4dac1d89300a053ac973299e82d3db56330f3494905643bb68801269"}, + {file = "websockets-10.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:84bc2a7d075f32f6ed98652db3a680a17a4edb21ca7f80fe42e38753a58ee02b"}, + {file = "websockets-10.4-cp39-cp39-win32.whl", hash = "sha256:c94ae4faf2d09f7c81847c63843f84fe47bf6253c9d60b20f25edfd30fb12588"}, + {file = "websockets-10.4-cp39-cp39-win_amd64.whl", hash = "sha256:bbccd847aa0c3a69b5f691a84d2341a4f8a629c6922558f2a70611305f902d74"}, + {file = "websockets-10.4-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:82ff5e1cae4e855147fd57a2863376ed7454134c2bf49ec604dfe71e446e2193"}, + {file = "websockets-10.4-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d210abe51b5da0ffdbf7b43eed0cfdff8a55a1ab17abbec4301c9ff077dd0342"}, + {file = "websockets-10.4-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:942de28af58f352a6f588bc72490ae0f4ccd6dfc2bd3de5945b882a078e4e179"}, + {file = "websockets-10.4-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c9b27d6c1c6cd53dc93614967e9ce00ae7f864a2d9f99fe5ed86706e1ecbf485"}, + {file = "websockets-10.4-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:3d3cac3e32b2c8414f4f87c1b2ab686fa6284a980ba283617404377cd448f631"}, + {file = "websockets-10.4-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:da39dd03d130162deb63da51f6e66ed73032ae62e74aaccc4236e30edccddbb0"}, + {file = "websockets-10.4-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:389f8dbb5c489e305fb113ca1b6bdcdaa130923f77485db5b189de343a179393"}, + {file = "websockets-10.4-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09a1814bb15eff7069e51fed0826df0bc0702652b5cb8f87697d469d79c23576"}, + {file = "websockets-10.4-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ff64a1d38d156d429404aaa84b27305e957fd10c30e5880d1765c9480bea490f"}, + {file = "websockets-10.4-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:b343f521b047493dc4022dd338fc6db9d9282658862756b4f6fd0e996c1380e1"}, + {file = "websockets-10.4-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:932af322458da7e4e35df32f050389e13d3d96b09d274b22a7aa1808f292fee4"}, + {file = "websockets-10.4-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d6a4162139374a49eb18ef5b2f4da1dd95c994588f5033d64e0bbfda4b6b6fcf"}, + {file = "websockets-10.4-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c57e4c1349fbe0e446c9fa7b19ed2f8a4417233b6984277cce392819123142d3"}, + {file = "websockets-10.4-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b627c266f295de9dea86bd1112ed3d5fafb69a348af30a2422e16590a8ecba13"}, + {file = "websockets-10.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:05a7233089f8bd355e8cbe127c2e8ca0b4ea55467861906b80d2ebc7db4d6b72"}, + {file = "websockets-10.4.tar.gz", hash = "sha256:eef610b23933c54d5d921c92578ae5f89813438fded840c2e9809d378dc765d3"}, +] + [[package]] name = "zipp" version = "3.11.0" @@ -1039,4 +1118,4 @@ testing = ["flake8 (<5)", "func-timeout", "jaraco.functools", "jaraco.itertools" [metadata] lock-version = "2.0" python-versions = "^3.7" -content-hash = "bdbe03e00e254692c4037edb18af3f1c4be6562f95108c9f057691878d09885d" +content-hash = "97dfea67e5b4dd4749628c44911fa43392206c1c77a90191b267f060f95d10c4" diff --git a/pynecone/.templates/web/bun.lockb b/pynecone/.templates/web/bun.lockb index 4a3f56469d4856b271091a46507be3f2865ccd6b..0cfe62a6f3b7be9075320fed92e4885b2c325091 100755 GIT binary patch delta 46491 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 delta 47246 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 diff --git a/pynecone/.templates/web/next.config.js b/pynecone/.templates/web/next.config.js index 90ceeefe4..da1bb770f 100644 --- a/pynecone/.templates/web/next.config.js +++ b/pynecone/.templates/web/next.config.js @@ -1,3 +1,3 @@ module.exports = { - reactStrictMode: true + reactStrictMode: true, }; diff --git a/pynecone/.templates/web/package.json b/pynecone/.templates/web/package.json index 5cd79862d..f4acc2d1f 100644 --- a/pynecone/.templates/web/package.json +++ b/pynecone/.templates/web/package.json @@ -18,7 +18,7 @@ "gridjs-react": "^4.0.0", "next": "^12.1.0", "plotly.js": "2.6.4", - "prettier": "^2.7.1", + "prettier": "^2.8.1", "react": "^17.0.2", "react-dom": "^17.0.2", "react-markdown": "^8.0.3", @@ -28,4 +28,4 @@ "remark-gfm": "^3.0.1", "remark-math": "^5.1.1" } -} \ No newline at end of file +} diff --git a/pynecone/.templates/web/styles/code/prism.js b/pynecone/.templates/web/styles/code/prism.js index 20853361d..5568cf25b 100644 --- a/pynecone/.templates/web/styles/code/prism.js +++ b/pynecone/.templates/web/styles/code/prism.js @@ -1,992 +1,1015 @@ export const light = { - "code[class*=\"language-\"]": { - "background": "hsl(230, 1%, 98%)", - "color": "hsl(230, 8%, 24%)", - "fontFamily": "\"Fira Code\", \"Fira Mono\", Menlo, Consolas, \"DejaVu Sans Mono\", monospace", - "direction": "ltr", - "textAlign": "left", - "whiteSpace": "pre", - "wordSpacing": "normal", - "wordBreak": "normal", - "lineHeight": "1.5", - "MozTabSize": "2", - "OTabSize": "2", - "tabSize": "2", - "WebkitHyphens": "none", - "MozHyphens": "none", - "msHyphens": "none", - "hyphens": "none" - }, - "pre[class*=\"language-\"]": { - "background": "hsl(230, 1%, 98%)", - "color": "hsl(230, 8%, 24%)", - "fontFamily": "\"Fira Code\", \"Fira Mono\", Menlo, Consolas, \"DejaVu Sans Mono\", monospace", - "direction": "ltr", - "textAlign": "left", - "whiteSpace": "pre", - "wordSpacing": "normal", - "wordBreak": "normal", - "lineHeight": "1.5", - "MozTabSize": "2", - "OTabSize": "2", - "tabSize": "2", - "WebkitHyphens": "none", - "MozHyphens": "none", - "msHyphens": "none", - "hyphens": "none", - "padding": "1em", - "margin": "0.5em 0", - "overflow": "auto", - "borderRadius": "0.3em" - }, - "code[class*=\"language-\"]::-moz-selection": { - "background": "hsl(230, 1%, 90%)", - "color": "inherit" - }, - "code[class*=\"language-\"] *::-moz-selection": { - "background": "hsl(230, 1%, 90%)", - "color": "inherit" - }, - "pre[class*=\"language-\"] *::-moz-selection": { - "background": "hsl(230, 1%, 90%)", - "color": "inherit" - }, - "code[class*=\"language-\"]::selection": { - "background": "hsl(230, 1%, 90%)", - "color": "inherit" - }, - "code[class*=\"language-\"] *::selection": { - "background": "hsl(230, 1%, 90%)", - "color": "inherit" - }, - "pre[class*=\"language-\"] *::selection": { - "background": "hsl(230, 1%, 90%)", - "color": "inherit" - }, - ":not(pre) > code[class*=\"language-\"]": { - "padding": "0.2em 0.3em", - "borderRadius": "0.3em", - "whiteSpace": "normal" - }, - "comment": { - "color": "hsl(230, 4%, 64%)", - "fontStyle": "italic" - }, - "prolog": { - "color": "hsl(230, 4%, 64%)" - }, - "cdata": { - "color": "hsl(230, 4%, 64%)" - }, - "doctype": { - "color": "hsl(230, 8%, 24%)" - }, - "punctuation": { - "color": "hsl(230, 8%, 24%)" - }, - "entity": { - "color": "hsl(230, 8%, 24%)", - "cursor": "help" - }, - "attr-name": { - "color": "hsl(35, 99%, 36%)" - }, - "class-name": { - "color": "hsl(35, 99%, 36%)" - }, - "boolean": { - "color": "hsl(35, 99%, 36%)" - }, - "constant": { - "color": "hsl(35, 99%, 36%)" - }, - "number": { - "color": "hsl(35, 99%, 36%)" - }, - "atrule": { - "color": "hsl(35, 99%, 36%)" - }, - "keyword": { - "color": "hsl(301, 63%, 40%)" - }, - "property": { - "color": "hsl(5, 74%, 59%)" - }, - "tag": { - "color": "hsl(5, 74%, 59%)" - }, - "symbol": { - "color": "hsl(5, 74%, 59%)" - }, - "deleted": { - "color": "hsl(5, 74%, 59%)" - }, - "important": { - "color": "hsl(5, 74%, 59%)" - }, - "selector": { - "color": "hsl(119, 34%, 47%)" - }, - "string": { - "color": "hsl(119, 34%, 47%)" - }, - "char": { - "color": "hsl(119, 34%, 47%)" - }, - "builtin": { - "color": "hsl(119, 34%, 47%)" - }, - "inserted": { - "color": "hsl(119, 34%, 47%)" - }, - "regex": { - "color": "hsl(119, 34%, 47%)" - }, - "attr-value": { - "color": "hsl(119, 34%, 47%)" - }, - "attr-value > .token.punctuation": { - "color": "hsl(119, 34%, 47%)" - }, - "variable": { - "color": "hsl(221, 87%, 60%)" - }, - "operator": { - "color": "hsl(221, 87%, 60%)" - }, - "function": { - "color": "hsl(221, 87%, 60%)" - }, - "url": { - "color": "hsl(198, 99%, 37%)" - }, - "attr-value > .token.punctuation.attr-equals": { - "color": "hsl(230, 8%, 24%)" - }, - "special-attr > .token.attr-value > .token.value.css": { - "color": "hsl(230, 8%, 24%)" - }, - ".language-css .token.selector": { - "color": "hsl(5, 74%, 59%)" - }, - ".language-css .token.property": { - "color": "hsl(230, 8%, 24%)" - }, - ".language-css .token.function": { - "color": "hsl(198, 99%, 37%)" - }, - ".language-css .token.url > .token.function": { - "color": "hsl(198, 99%, 37%)" - }, - ".language-css .token.url > .token.string.url": { - "color": "hsl(119, 34%, 47%)" - }, - ".language-css .token.important": { - "color": "hsl(301, 63%, 40%)" - }, - ".language-css .token.atrule .token.rule": { - "color": "hsl(301, 63%, 40%)" - }, - ".language-javascript .token.operator": { - "color": "hsl(301, 63%, 40%)" - }, - ".language-javascript .token.template-string > .token.interpolation > .token.interpolation-punctuation.punctuation": { - "color": "hsl(344, 84%, 43%)" - }, - ".language-json .token.operator": { - "color": "hsl(230, 8%, 24%)" - }, - ".language-json .token.null.keyword": { - "color": "hsl(35, 99%, 36%)" - }, - ".language-markdown .token.url": { - "color": "hsl(230, 8%, 24%)" - }, - ".language-markdown .token.url > .token.operator": { - "color": "hsl(230, 8%, 24%)" - }, - ".language-markdown .token.url-reference.url > .token.string": { - "color": "hsl(230, 8%, 24%)" - }, - ".language-markdown .token.url > .token.content": { - "color": "hsl(221, 87%, 60%)" - }, - ".language-markdown .token.url > .token.url": { - "color": "hsl(198, 99%, 37%)" - }, - ".language-markdown .token.url-reference.url": { - "color": "hsl(198, 99%, 37%)" - }, - ".language-markdown .token.blockquote.punctuation": { - "color": "hsl(230, 4%, 64%)", - "fontStyle": "italic" - }, - ".language-markdown .token.hr.punctuation": { - "color": "hsl(230, 4%, 64%)", - "fontStyle": "italic" - }, - ".language-markdown .token.code-snippet": { - "color": "hsl(119, 34%, 47%)" - }, - ".language-markdown .token.bold .token.content": { - "color": "hsl(35, 99%, 36%)" - }, - ".language-markdown .token.italic .token.content": { - "color": "hsl(301, 63%, 40%)" - }, - ".language-markdown .token.strike .token.content": { - "color": "hsl(5, 74%, 59%)" - }, - ".language-markdown .token.strike .token.punctuation": { - "color": "hsl(5, 74%, 59%)" - }, - ".language-markdown .token.list.punctuation": { - "color": "hsl(5, 74%, 59%)" - }, - ".language-markdown .token.title.important > .token.punctuation": { - "color": "hsl(5, 74%, 59%)" - }, - "bold": { - "fontWeight": "bold" - }, - "italic": { - "fontStyle": "italic" - }, - "namespace": { - "Opacity": "0.8" - }, - "token.tab:not(:empty):before": { - "color": "hsla(230, 8%, 24%, 0.2)" - }, - "token.cr:before": { - "color": "hsla(230, 8%, 24%, 0.2)" - }, - "token.lf:before": { - "color": "hsla(230, 8%, 24%, 0.2)" - }, - "token.space:before": { - "color": "hsla(230, 8%, 24%, 0.2)" - }, - "div.code-toolbar > .toolbar.toolbar > .toolbar-item": { - "marginRight": "0.4em" - }, - "div.code-toolbar > .toolbar.toolbar > .toolbar-item > button": { - "background": "hsl(230, 1%, 90%)", - "color": "hsl(230, 6%, 44%)", - "padding": "0.1em 0.4em", - "borderRadius": "0.3em" - }, - "div.code-toolbar > .toolbar.toolbar > .toolbar-item > a": { - "background": "hsl(230, 1%, 90%)", - "color": "hsl(230, 6%, 44%)", - "padding": "0.1em 0.4em", - "borderRadius": "0.3em" - }, - "div.code-toolbar > .toolbar.toolbar > .toolbar-item > span": { - "background": "hsl(230, 1%, 90%)", - "color": "hsl(230, 6%, 44%)", - "padding": "0.1em 0.4em", - "borderRadius": "0.3em" - }, - "div.code-toolbar > .toolbar.toolbar > .toolbar-item > button:hover": { - "background": "hsl(230, 1%, 78%)", - "color": "hsl(230, 8%, 24%)" - }, - "div.code-toolbar > .toolbar.toolbar > .toolbar-item > button:focus": { - "background": "hsl(230, 1%, 78%)", - "color": "hsl(230, 8%, 24%)" - }, - "div.code-toolbar > .toolbar.toolbar > .toolbar-item > a:hover": { - "background": "hsl(230, 1%, 78%)", - "color": "hsl(230, 8%, 24%)" - }, - "div.code-toolbar > .toolbar.toolbar > .toolbar-item > a:focus": { - "background": "hsl(230, 1%, 78%)", - "color": "hsl(230, 8%, 24%)" - }, - "div.code-toolbar > .toolbar.toolbar > .toolbar-item > span:hover": { - "background": "hsl(230, 1%, 78%)", - "color": "hsl(230, 8%, 24%)" - }, - "div.code-toolbar > .toolbar.toolbar > .toolbar-item > span:focus": { - "background": "hsl(230, 1%, 78%)", - "color": "hsl(230, 8%, 24%)" - }, - ".line-highlight.line-highlight": { - "background": "hsla(230, 8%, 24%, 0.05)" - }, - ".line-highlight.line-highlight:before": { - "background": "hsl(230, 1%, 90%)", - "color": "hsl(230, 8%, 24%)", - "padding": "0.1em 0.6em", - "borderRadius": "0.3em", - "boxShadow": "0 2px 0 0 rgba(0, 0, 0, 0.2)" - }, - ".line-highlight.line-highlight[data-end]:after": { - "background": "hsl(230, 1%, 90%)", - "color": "hsl(230, 8%, 24%)", - "padding": "0.1em 0.6em", - "borderRadius": "0.3em", - "boxShadow": "0 2px 0 0 rgba(0, 0, 0, 0.2)" - }, - "pre[id].linkable-line-numbers.linkable-line-numbers span.line-numbers-rows > span:hover:before": { - "backgroundColor": "hsla(230, 8%, 24%, 0.05)" - }, - ".line-numbers.line-numbers .line-numbers-rows": { - "borderRightColor": "hsla(230, 8%, 24%, 0.2)" - }, - ".command-line .command-line-prompt": { - "borderRightColor": "hsla(230, 8%, 24%, 0.2)" - }, - ".line-numbers .line-numbers-rows > span:before": { - "color": "hsl(230, 1%, 62%)" - }, - ".command-line .command-line-prompt > span:before": { - "color": "hsl(230, 1%, 62%)" - }, - ".rainbow-braces .token.token.punctuation.brace-level-1": { - "color": "hsl(5, 74%, 59%)" - }, - ".rainbow-braces .token.token.punctuation.brace-level-5": { - "color": "hsl(5, 74%, 59%)" - }, - ".rainbow-braces .token.token.punctuation.brace-level-9": { - "color": "hsl(5, 74%, 59%)" - }, - ".rainbow-braces .token.token.punctuation.brace-level-2": { - "color": "hsl(119, 34%, 47%)" - }, - ".rainbow-braces .token.token.punctuation.brace-level-6": { - "color": "hsl(119, 34%, 47%)" - }, - ".rainbow-braces .token.token.punctuation.brace-level-10": { - "color": "hsl(119, 34%, 47%)" - }, - ".rainbow-braces .token.token.punctuation.brace-level-3": { - "color": "hsl(221, 87%, 60%)" - }, - ".rainbow-braces .token.token.punctuation.brace-level-7": { - "color": "hsl(221, 87%, 60%)" - }, - ".rainbow-braces .token.token.punctuation.brace-level-11": { - "color": "hsl(221, 87%, 60%)" - }, - ".rainbow-braces .token.token.punctuation.brace-level-4": { - "color": "hsl(301, 63%, 40%)" - }, - ".rainbow-braces .token.token.punctuation.brace-level-8": { - "color": "hsl(301, 63%, 40%)" - }, - ".rainbow-braces .token.token.punctuation.brace-level-12": { - "color": "hsl(301, 63%, 40%)" - }, - "pre.diff-highlight > code .token.token.deleted:not(.prefix)": { - "backgroundColor": "hsla(353, 100%, 66%, 0.15)" - }, - "pre > code.diff-highlight .token.token.deleted:not(.prefix)": { - "backgroundColor": "hsla(353, 100%, 66%, 0.15)" - }, - "pre.diff-highlight > code .token.token.deleted:not(.prefix)::-moz-selection": { - "backgroundColor": "hsla(353, 95%, 66%, 0.25)" - }, - "pre.diff-highlight > code .token.token.deleted:not(.prefix) *::-moz-selection": { - "backgroundColor": "hsla(353, 95%, 66%, 0.25)" - }, - "pre > code.diff-highlight .token.token.deleted:not(.prefix)::-moz-selection": { - "backgroundColor": "hsla(353, 95%, 66%, 0.25)" - }, - "pre > code.diff-highlight .token.token.deleted:not(.prefix) *::-moz-selection": { - "backgroundColor": "hsla(353, 95%, 66%, 0.25)" - }, - "pre.diff-highlight > code .token.token.deleted:not(.prefix)::selection": { - "backgroundColor": "hsla(353, 95%, 66%, 0.25)" - }, - "pre.diff-highlight > code .token.token.deleted:not(.prefix) *::selection": { - "backgroundColor": "hsla(353, 95%, 66%, 0.25)" - }, - "pre > code.diff-highlight .token.token.deleted:not(.prefix)::selection": { - "backgroundColor": "hsla(353, 95%, 66%, 0.25)" - }, - "pre > code.diff-highlight .token.token.deleted:not(.prefix) *::selection": { - "backgroundColor": "hsla(353, 95%, 66%, 0.25)" - }, - "pre.diff-highlight > code .token.token.inserted:not(.prefix)": { - "backgroundColor": "hsla(137, 100%, 55%, 0.15)" - }, - "pre > code.diff-highlight .token.token.inserted:not(.prefix)": { - "backgroundColor": "hsla(137, 100%, 55%, 0.15)" - }, - "pre.diff-highlight > code .token.token.inserted:not(.prefix)::-moz-selection": { - "backgroundColor": "hsla(135, 73%, 55%, 0.25)" - }, - "pre.diff-highlight > code .token.token.inserted:not(.prefix) *::-moz-selection": { - "backgroundColor": "hsla(135, 73%, 55%, 0.25)" - }, - "pre > code.diff-highlight .token.token.inserted:not(.prefix)::-moz-selection": { - "backgroundColor": "hsla(135, 73%, 55%, 0.25)" - }, - "pre > code.diff-highlight .token.token.inserted:not(.prefix) *::-moz-selection": { - "backgroundColor": "hsla(135, 73%, 55%, 0.25)" - }, - "pre.diff-highlight > code .token.token.inserted:not(.prefix)::selection": { - "backgroundColor": "hsla(135, 73%, 55%, 0.25)" - }, - "pre.diff-highlight > code .token.token.inserted:not(.prefix) *::selection": { - "backgroundColor": "hsla(135, 73%, 55%, 0.25)" - }, - "pre > code.diff-highlight .token.token.inserted:not(.prefix)::selection": { - "backgroundColor": "hsla(135, 73%, 55%, 0.25)" - }, - "pre > code.diff-highlight .token.token.inserted:not(.prefix) *::selection": { - "backgroundColor": "hsla(135, 73%, 55%, 0.25)" - }, - ".prism-previewer.prism-previewer:before": { - "borderColor": "hsl(0, 0, 95%)" - }, - ".prism-previewer-gradient.prism-previewer-gradient div": { - "borderColor": "hsl(0, 0, 95%)", - "borderRadius": "0.3em" - }, - ".prism-previewer-color.prism-previewer-color:before": { - "borderRadius": "0.3em" - }, - ".prism-previewer-easing.prism-previewer-easing:before": { - "borderRadius": "0.3em" - }, - ".prism-previewer.prism-previewer:after": { - "borderTopColor": "hsl(0, 0, 95%)" - }, - ".prism-previewer-flipped.prism-previewer-flipped.after": { - "borderBottomColor": "hsl(0, 0, 95%)" - }, - ".prism-previewer-angle.prism-previewer-angle:before": { - "background": "hsl(0, 0%, 100%)" - }, - ".prism-previewer-time.prism-previewer-time:before": { - "background": "hsl(0, 0%, 100%)" - }, - ".prism-previewer-easing.prism-previewer-easing": { - "background": "hsl(0, 0%, 100%)" - }, - ".prism-previewer-angle.prism-previewer-angle circle": { - "stroke": "hsl(230, 8%, 24%)", - "strokeOpacity": "1" - }, - ".prism-previewer-time.prism-previewer-time circle": { - "stroke": "hsl(230, 8%, 24%)", - "strokeOpacity": "1" - }, - ".prism-previewer-easing.prism-previewer-easing circle": { - "stroke": "hsl(230, 8%, 24%)", - "fill": "transparent" - }, - ".prism-previewer-easing.prism-previewer-easing path": { - "stroke": "hsl(230, 8%, 24%)" - }, - ".prism-previewer-easing.prism-previewer-easing line": { - "stroke": "hsl(230, 8%, 24%)" - } -} - + 'code[class*="language-"]': { + background: "hsl(230, 1%, 98%)", + color: "hsl(230, 8%, 24%)", + fontFamily: + '"Fira Code", "Fira Mono", Menlo, Consolas, "DejaVu Sans Mono", monospace', + direction: "ltr", + textAlign: "left", + whiteSpace: "pre", + wordSpacing: "normal", + wordBreak: "normal", + lineHeight: "1.5", + MozTabSize: "2", + OTabSize: "2", + tabSize: "2", + WebkitHyphens: "none", + MozHyphens: "none", + msHyphens: "none", + hyphens: "none", + }, + 'pre[class*="language-"]': { + background: "hsl(230, 1%, 98%)", + color: "hsl(230, 8%, 24%)", + fontFamily: + '"Fira Code", "Fira Mono", Menlo, Consolas, "DejaVu Sans Mono", monospace', + direction: "ltr", + textAlign: "left", + whiteSpace: "pre", + wordSpacing: "normal", + wordBreak: "normal", + lineHeight: "1.5", + MozTabSize: "2", + OTabSize: "2", + tabSize: "2", + WebkitHyphens: "none", + MozHyphens: "none", + msHyphens: "none", + hyphens: "none", + padding: "1em", + margin: "0.5em 0", + overflow: "auto", + borderRadius: "0.3em", + }, + 'code[class*="language-"]::-moz-selection': { + background: "hsl(230, 1%, 90%)", + color: "inherit", + }, + 'code[class*="language-"] *::-moz-selection': { + background: "hsl(230, 1%, 90%)", + color: "inherit", + }, + 'pre[class*="language-"] *::-moz-selection': { + background: "hsl(230, 1%, 90%)", + color: "inherit", + }, + 'code[class*="language-"]::selection': { + background: "hsl(230, 1%, 90%)", + color: "inherit", + }, + 'code[class*="language-"] *::selection': { + background: "hsl(230, 1%, 90%)", + color: "inherit", + }, + 'pre[class*="language-"] *::selection': { + background: "hsl(230, 1%, 90%)", + color: "inherit", + }, + ':not(pre) > code[class*="language-"]': { + padding: "0.2em 0.3em", + borderRadius: "0.3em", + whiteSpace: "normal", + }, + comment: { + color: "hsl(230, 4%, 64%)", + fontStyle: "italic", + }, + prolog: { + color: "hsl(230, 4%, 64%)", + }, + cdata: { + color: "hsl(230, 4%, 64%)", + }, + doctype: { + color: "hsl(230, 8%, 24%)", + }, + punctuation: { + color: "hsl(230, 8%, 24%)", + }, + entity: { + color: "hsl(230, 8%, 24%)", + cursor: "help", + }, + "attr-name": { + color: "hsl(35, 99%, 36%)", + }, + "class-name": { + color: "hsl(35, 99%, 36%)", + }, + boolean: { + color: "hsl(35, 99%, 36%)", + }, + constant: { + color: "hsl(35, 99%, 36%)", + }, + number: { + color: "hsl(35, 99%, 36%)", + }, + atrule: { + color: "hsl(35, 99%, 36%)", + }, + keyword: { + color: "hsl(301, 63%, 40%)", + }, + property: { + color: "hsl(5, 74%, 59%)", + }, + tag: { + color: "hsl(5, 74%, 59%)", + }, + symbol: { + color: "hsl(5, 74%, 59%)", + }, + deleted: { + color: "hsl(5, 74%, 59%)", + }, + important: { + color: "hsl(5, 74%, 59%)", + }, + selector: { + color: "hsl(119, 34%, 47%)", + }, + string: { + color: "hsl(119, 34%, 47%)", + }, + char: { + color: "hsl(119, 34%, 47%)", + }, + builtin: { + color: "hsl(119, 34%, 47%)", + }, + inserted: { + color: "hsl(119, 34%, 47%)", + }, + regex: { + color: "hsl(119, 34%, 47%)", + }, + "attr-value": { + color: "hsl(119, 34%, 47%)", + }, + "attr-value > .token.punctuation": { + color: "hsl(119, 34%, 47%)", + }, + variable: { + color: "hsl(221, 87%, 60%)", + }, + operator: { + color: "hsl(221, 87%, 60%)", + }, + function: { + color: "hsl(221, 87%, 60%)", + }, + url: { + color: "hsl(198, 99%, 37%)", + }, + "attr-value > .token.punctuation.attr-equals": { + color: "hsl(230, 8%, 24%)", + }, + "special-attr > .token.attr-value > .token.value.css": { + color: "hsl(230, 8%, 24%)", + }, + ".language-css .token.selector": { + color: "hsl(5, 74%, 59%)", + }, + ".language-css .token.property": { + color: "hsl(230, 8%, 24%)", + }, + ".language-css .token.function": { + color: "hsl(198, 99%, 37%)", + }, + ".language-css .token.url > .token.function": { + color: "hsl(198, 99%, 37%)", + }, + ".language-css .token.url > .token.string.url": { + color: "hsl(119, 34%, 47%)", + }, + ".language-css .token.important": { + color: "hsl(301, 63%, 40%)", + }, + ".language-css .token.atrule .token.rule": { + color: "hsl(301, 63%, 40%)", + }, + ".language-javascript .token.operator": { + color: "hsl(301, 63%, 40%)", + }, + ".language-javascript .token.template-string > .token.interpolation > .token.interpolation-punctuation.punctuation": + { + color: "hsl(344, 84%, 43%)", + }, + ".language-json .token.operator": { + color: "hsl(230, 8%, 24%)", + }, + ".language-json .token.null.keyword": { + color: "hsl(35, 99%, 36%)", + }, + ".language-markdown .token.url": { + color: "hsl(230, 8%, 24%)", + }, + ".language-markdown .token.url > .token.operator": { + color: "hsl(230, 8%, 24%)", + }, + ".language-markdown .token.url-reference.url > .token.string": { + color: "hsl(230, 8%, 24%)", + }, + ".language-markdown .token.url > .token.content": { + color: "hsl(221, 87%, 60%)", + }, + ".language-markdown .token.url > .token.url": { + color: "hsl(198, 99%, 37%)", + }, + ".language-markdown .token.url-reference.url": { + color: "hsl(198, 99%, 37%)", + }, + ".language-markdown .token.blockquote.punctuation": { + color: "hsl(230, 4%, 64%)", + fontStyle: "italic", + }, + ".language-markdown .token.hr.punctuation": { + color: "hsl(230, 4%, 64%)", + fontStyle: "italic", + }, + ".language-markdown .token.code-snippet": { + color: "hsl(119, 34%, 47%)", + }, + ".language-markdown .token.bold .token.content": { + color: "hsl(35, 99%, 36%)", + }, + ".language-markdown .token.italic .token.content": { + color: "hsl(301, 63%, 40%)", + }, + ".language-markdown .token.strike .token.content": { + color: "hsl(5, 74%, 59%)", + }, + ".language-markdown .token.strike .token.punctuation": { + color: "hsl(5, 74%, 59%)", + }, + ".language-markdown .token.list.punctuation": { + color: "hsl(5, 74%, 59%)", + }, + ".language-markdown .token.title.important > .token.punctuation": { + color: "hsl(5, 74%, 59%)", + }, + bold: { + fontWeight: "bold", + }, + italic: { + fontStyle: "italic", + }, + namespace: { + Opacity: "0.8", + }, + "token.tab:not(:empty):before": { + color: "hsla(230, 8%, 24%, 0.2)", + }, + "token.cr:before": { + color: "hsla(230, 8%, 24%, 0.2)", + }, + "token.lf:before": { + color: "hsla(230, 8%, 24%, 0.2)", + }, + "token.space:before": { + color: "hsla(230, 8%, 24%, 0.2)", + }, + "div.code-toolbar > .toolbar.toolbar > .toolbar-item": { + marginRight: "0.4em", + }, + "div.code-toolbar > .toolbar.toolbar > .toolbar-item > button": { + background: "hsl(230, 1%, 90%)", + color: "hsl(230, 6%, 44%)", + padding: "0.1em 0.4em", + borderRadius: "0.3em", + }, + "div.code-toolbar > .toolbar.toolbar > .toolbar-item > a": { + background: "hsl(230, 1%, 90%)", + color: "hsl(230, 6%, 44%)", + padding: "0.1em 0.4em", + borderRadius: "0.3em", + }, + "div.code-toolbar > .toolbar.toolbar > .toolbar-item > span": { + background: "hsl(230, 1%, 90%)", + color: "hsl(230, 6%, 44%)", + padding: "0.1em 0.4em", + borderRadius: "0.3em", + }, + "div.code-toolbar > .toolbar.toolbar > .toolbar-item > button:hover": { + background: "hsl(230, 1%, 78%)", + color: "hsl(230, 8%, 24%)", + }, + "div.code-toolbar > .toolbar.toolbar > .toolbar-item > button:focus": { + background: "hsl(230, 1%, 78%)", + color: "hsl(230, 8%, 24%)", + }, + "div.code-toolbar > .toolbar.toolbar > .toolbar-item > a:hover": { + background: "hsl(230, 1%, 78%)", + color: "hsl(230, 8%, 24%)", + }, + "div.code-toolbar > .toolbar.toolbar > .toolbar-item > a:focus": { + background: "hsl(230, 1%, 78%)", + color: "hsl(230, 8%, 24%)", + }, + "div.code-toolbar > .toolbar.toolbar > .toolbar-item > span:hover": { + background: "hsl(230, 1%, 78%)", + color: "hsl(230, 8%, 24%)", + }, + "div.code-toolbar > .toolbar.toolbar > .toolbar-item > span:focus": { + background: "hsl(230, 1%, 78%)", + color: "hsl(230, 8%, 24%)", + }, + ".line-highlight.line-highlight": { + background: "hsla(230, 8%, 24%, 0.05)", + }, + ".line-highlight.line-highlight:before": { + background: "hsl(230, 1%, 90%)", + color: "hsl(230, 8%, 24%)", + padding: "0.1em 0.6em", + borderRadius: "0.3em", + boxShadow: "0 2px 0 0 rgba(0, 0, 0, 0.2)", + }, + ".line-highlight.line-highlight[data-end]:after": { + background: "hsl(230, 1%, 90%)", + color: "hsl(230, 8%, 24%)", + padding: "0.1em 0.6em", + borderRadius: "0.3em", + boxShadow: "0 2px 0 0 rgba(0, 0, 0, 0.2)", + }, + "pre[id].linkable-line-numbers.linkable-line-numbers span.line-numbers-rows > span:hover:before": + { + backgroundColor: "hsla(230, 8%, 24%, 0.05)", + }, + ".line-numbers.line-numbers .line-numbers-rows": { + borderRightColor: "hsla(230, 8%, 24%, 0.2)", + }, + ".command-line .command-line-prompt": { + borderRightColor: "hsla(230, 8%, 24%, 0.2)", + }, + ".line-numbers .line-numbers-rows > span:before": { + color: "hsl(230, 1%, 62%)", + }, + ".command-line .command-line-prompt > span:before": { + color: "hsl(230, 1%, 62%)", + }, + ".rainbow-braces .token.token.punctuation.brace-level-1": { + color: "hsl(5, 74%, 59%)", + }, + ".rainbow-braces .token.token.punctuation.brace-level-5": { + color: "hsl(5, 74%, 59%)", + }, + ".rainbow-braces .token.token.punctuation.brace-level-9": { + color: "hsl(5, 74%, 59%)", + }, + ".rainbow-braces .token.token.punctuation.brace-level-2": { + color: "hsl(119, 34%, 47%)", + }, + ".rainbow-braces .token.token.punctuation.brace-level-6": { + color: "hsl(119, 34%, 47%)", + }, + ".rainbow-braces .token.token.punctuation.brace-level-10": { + color: "hsl(119, 34%, 47%)", + }, + ".rainbow-braces .token.token.punctuation.brace-level-3": { + color: "hsl(221, 87%, 60%)", + }, + ".rainbow-braces .token.token.punctuation.brace-level-7": { + color: "hsl(221, 87%, 60%)", + }, + ".rainbow-braces .token.token.punctuation.brace-level-11": { + color: "hsl(221, 87%, 60%)", + }, + ".rainbow-braces .token.token.punctuation.brace-level-4": { + color: "hsl(301, 63%, 40%)", + }, + ".rainbow-braces .token.token.punctuation.brace-level-8": { + color: "hsl(301, 63%, 40%)", + }, + ".rainbow-braces .token.token.punctuation.brace-level-12": { + color: "hsl(301, 63%, 40%)", + }, + "pre.diff-highlight > code .token.token.deleted:not(.prefix)": { + backgroundColor: "hsla(353, 100%, 66%, 0.15)", + }, + "pre > code.diff-highlight .token.token.deleted:not(.prefix)": { + backgroundColor: "hsla(353, 100%, 66%, 0.15)", + }, + "pre.diff-highlight > code .token.token.deleted:not(.prefix)::-moz-selection": + { + backgroundColor: "hsla(353, 95%, 66%, 0.25)", + }, + "pre.diff-highlight > code .token.token.deleted:not(.prefix) *::-moz-selection": + { + backgroundColor: "hsla(353, 95%, 66%, 0.25)", + }, + "pre > code.diff-highlight .token.token.deleted:not(.prefix)::-moz-selection": + { + backgroundColor: "hsla(353, 95%, 66%, 0.25)", + }, + "pre > code.diff-highlight .token.token.deleted:not(.prefix) *::-moz-selection": + { + backgroundColor: "hsla(353, 95%, 66%, 0.25)", + }, + "pre.diff-highlight > code .token.token.deleted:not(.prefix)::selection": { + backgroundColor: "hsla(353, 95%, 66%, 0.25)", + }, + "pre.diff-highlight > code .token.token.deleted:not(.prefix) *::selection": { + backgroundColor: "hsla(353, 95%, 66%, 0.25)", + }, + "pre > code.diff-highlight .token.token.deleted:not(.prefix)::selection": { + backgroundColor: "hsla(353, 95%, 66%, 0.25)", + }, + "pre > code.diff-highlight .token.token.deleted:not(.prefix) *::selection": { + backgroundColor: "hsla(353, 95%, 66%, 0.25)", + }, + "pre.diff-highlight > code .token.token.inserted:not(.prefix)": { + backgroundColor: "hsla(137, 100%, 55%, 0.15)", + }, + "pre > code.diff-highlight .token.token.inserted:not(.prefix)": { + backgroundColor: "hsla(137, 100%, 55%, 0.15)", + }, + "pre.diff-highlight > code .token.token.inserted:not(.prefix)::-moz-selection": + { + backgroundColor: "hsla(135, 73%, 55%, 0.25)", + }, + "pre.diff-highlight > code .token.token.inserted:not(.prefix) *::-moz-selection": + { + backgroundColor: "hsla(135, 73%, 55%, 0.25)", + }, + "pre > code.diff-highlight .token.token.inserted:not(.prefix)::-moz-selection": + { + backgroundColor: "hsla(135, 73%, 55%, 0.25)", + }, + "pre > code.diff-highlight .token.token.inserted:not(.prefix) *::-moz-selection": + { + backgroundColor: "hsla(135, 73%, 55%, 0.25)", + }, + "pre.diff-highlight > code .token.token.inserted:not(.prefix)::selection": { + backgroundColor: "hsla(135, 73%, 55%, 0.25)", + }, + "pre.diff-highlight > code .token.token.inserted:not(.prefix) *::selection": { + backgroundColor: "hsla(135, 73%, 55%, 0.25)", + }, + "pre > code.diff-highlight .token.token.inserted:not(.prefix)::selection": { + backgroundColor: "hsla(135, 73%, 55%, 0.25)", + }, + "pre > code.diff-highlight .token.token.inserted:not(.prefix) *::selection": { + backgroundColor: "hsla(135, 73%, 55%, 0.25)", + }, + ".prism-previewer.prism-previewer:before": { + borderColor: "hsl(0, 0, 95%)", + }, + ".prism-previewer-gradient.prism-previewer-gradient div": { + borderColor: "hsl(0, 0, 95%)", + borderRadius: "0.3em", + }, + ".prism-previewer-color.prism-previewer-color:before": { + borderRadius: "0.3em", + }, + ".prism-previewer-easing.prism-previewer-easing:before": { + borderRadius: "0.3em", + }, + ".prism-previewer.prism-previewer:after": { + borderTopColor: "hsl(0, 0, 95%)", + }, + ".prism-previewer-flipped.prism-previewer-flipped.after": { + borderBottomColor: "hsl(0, 0, 95%)", + }, + ".prism-previewer-angle.prism-previewer-angle:before": { + background: "hsl(0, 0%, 100%)", + }, + ".prism-previewer-time.prism-previewer-time:before": { + background: "hsl(0, 0%, 100%)", + }, + ".prism-previewer-easing.prism-previewer-easing": { + background: "hsl(0, 0%, 100%)", + }, + ".prism-previewer-angle.prism-previewer-angle circle": { + stroke: "hsl(230, 8%, 24%)", + strokeOpacity: "1", + }, + ".prism-previewer-time.prism-previewer-time circle": { + stroke: "hsl(230, 8%, 24%)", + strokeOpacity: "1", + }, + ".prism-previewer-easing.prism-previewer-easing circle": { + stroke: "hsl(230, 8%, 24%)", + fill: "transparent", + }, + ".prism-previewer-easing.prism-previewer-easing path": { + stroke: "hsl(230, 8%, 24%)", + }, + ".prism-previewer-easing.prism-previewer-easing line": { + stroke: "hsl(230, 8%, 24%)", + }, +}; export const dark = { - "code[class*=\"language-\"]": { - "background": "hsl(220, 13%, 18%)", - "color": "hsl(220, 14%, 71%)", - "textShadow": "0 1px rgba(0, 0, 0, 0.3)", - "fontFamily": "\"Fira Code\", \"Fira Mono\", Menlo, Consolas, \"DejaVu Sans Mono\", monospace", - "direction": "ltr", - "textAlign": "left", - "whiteSpace": "pre", - "wordSpacing": "normal", - "wordBreak": "normal", - "lineHeight": "1.5", - "MozTabSize": "2", - "OTabSize": "2", - "tabSize": "2", - "WebkitHyphens": "none", - "MozHyphens": "none", - "msHyphens": "none", - "hyphens": "none" - }, - "pre[class*=\"language-\"]": { - "background": "hsl(220, 13%, 18%)", - "color": "hsl(220, 14%, 71%)", - "textShadow": "0 1px rgba(0, 0, 0, 0.3)", - "fontFamily": "\"Fira Code\", \"Fira Mono\", Menlo, Consolas, \"DejaVu Sans Mono\", monospace", - "direction": "ltr", - "textAlign": "left", - "whiteSpace": "pre", - "wordSpacing": "normal", - "wordBreak": "normal", - "lineHeight": "1.5", - "MozTabSize": "2", - "OTabSize": "2", - "tabSize": "2", - "WebkitHyphens": "none", - "MozHyphens": "none", - "msHyphens": "none", - "hyphens": "none", - "padding": "1em", - "margin": "0.5em 0", - "overflow": "auto", - "borderRadius": "0.3em" - }, - "code[class*=\"language-\"]::-moz-selection": { - "background": "hsl(220, 13%, 28%)", - "color": "inherit", - "textShadow": "none" - }, - "code[class*=\"language-\"] *::-moz-selection": { - "background": "hsl(220, 13%, 28%)", - "color": "inherit", - "textShadow": "none" - }, - "pre[class*=\"language-\"] *::-moz-selection": { - "background": "hsl(220, 13%, 28%)", - "color": "inherit", - "textShadow": "none" - }, - "code[class*=\"language-\"]::selection": { - "background": "hsl(220, 13%, 28%)", - "color": "inherit", - "textShadow": "none" - }, - "code[class*=\"language-\"] *::selection": { - "background": "hsl(220, 13%, 28%)", - "color": "inherit", - "textShadow": "none" - }, - "pre[class*=\"language-\"] *::selection": { - "background": "hsl(220, 13%, 28%)", - "color": "inherit", - "textShadow": "none" - }, - ":not(pre) > code[class*=\"language-\"]": { - "padding": "0.2em 0.3em", - "borderRadius": "0.3em", - "whiteSpace": "normal" - }, - "comment": { - "color": "hsl(220, 10%, 40%)", - "fontStyle": "italic" - }, - "prolog": { - "color": "hsl(220, 10%, 40%)" - }, - "cdata": { - "color": "hsl(220, 10%, 40%)" - }, - "doctype": { - "color": "hsl(220, 14%, 71%)" - }, - "punctuation": { - "color": "hsl(220, 14%, 71%)" - }, - "entity": { - "color": "hsl(220, 14%, 71%)", - "cursor": "help" - }, - "attr-name": { - "color": "hsl(29, 54%, 61%)" - }, - "class-name": { - "color": "hsl(29, 54%, 61%)" - }, - "boolean": { - "color": "hsl(29, 54%, 61%)" - }, - "constant": { - "color": "hsl(29, 54%, 61%)" - }, - "number": { - "color": "hsl(29, 54%, 61%)" - }, - "atrule": { - "color": "hsl(29, 54%, 61%)" - }, - "keyword": { - "color": "hsl(286, 60%, 67%)" - }, - "property": { - "color": "hsl(355, 65%, 65%)" - }, - "tag": { - "color": "hsl(355, 65%, 65%)" - }, - "symbol": { - "color": "hsl(355, 65%, 65%)" - }, - "deleted": { - "color": "hsl(355, 65%, 65%)" - }, - "important": { - "color": "hsl(355, 65%, 65%)" - }, - "selector": { - "color": "hsl(95, 38%, 62%)" - }, - "string": { - "color": "hsl(95, 38%, 62%)" - }, - "char": { - "color": "hsl(95, 38%, 62%)" - }, - "builtin": { - "color": "hsl(95, 38%, 62%)" - }, - "inserted": { - "color": "hsl(95, 38%, 62%)" - }, - "regex": { - "color": "hsl(95, 38%, 62%)" - }, - "attr-value": { - "color": "hsl(95, 38%, 62%)" - }, - "attr-value > .token.punctuation": { - "color": "hsl(95, 38%, 62%)" - }, - "variable": { - "color": "hsl(207, 82%, 66%)" - }, - "operator": { - "color": "hsl(207, 82%, 66%)" - }, - "function": { - "color": "hsl(207, 82%, 66%)" - }, - "url": { - "color": "hsl(187, 47%, 55%)" - }, - "attr-value > .token.punctuation.attr-equals": { - "color": "hsl(220, 14%, 71%)" - }, - "special-attr > .token.attr-value > .token.value.css": { - "color": "hsl(220, 14%, 71%)" - }, - ".language-css .token.selector": { - "color": "hsl(355, 65%, 65%)" - }, - ".language-css .token.property": { - "color": "hsl(220, 14%, 71%)" - }, - ".language-css .token.function": { - "color": "hsl(187, 47%, 55%)" - }, - ".language-css .token.url > .token.function": { - "color": "hsl(187, 47%, 55%)" - }, - ".language-css .token.url > .token.string.url": { - "color": "hsl(95, 38%, 62%)" - }, - ".language-css .token.important": { - "color": "hsl(286, 60%, 67%)" - }, - ".language-css .token.atrule .token.rule": { - "color": "hsl(286, 60%, 67%)" - }, - ".language-javascript .token.operator": { - "color": "hsl(286, 60%, 67%)" - }, - ".language-javascript .token.template-string > .token.interpolation > .token.interpolation-punctuation.punctuation": { - "color": "hsl(5, 48%, 51%)" - }, - ".language-json .token.operator": { - "color": "hsl(220, 14%, 71%)" - }, - ".language-json .token.null.keyword": { - "color": "hsl(29, 54%, 61%)" - }, - ".language-markdown .token.url": { - "color": "hsl(220, 14%, 71%)" - }, - ".language-markdown .token.url > .token.operator": { - "color": "hsl(220, 14%, 71%)" - }, - ".language-markdown .token.url-reference.url > .token.string": { - "color": "hsl(220, 14%, 71%)" - }, - ".language-markdown .token.url > .token.content": { - "color": "hsl(207, 82%, 66%)" - }, - ".language-markdown .token.url > .token.url": { - "color": "hsl(187, 47%, 55%)" - }, - ".language-markdown .token.url-reference.url": { - "color": "hsl(187, 47%, 55%)" - }, - ".language-markdown .token.blockquote.punctuation": { - "color": "hsl(220, 10%, 40%)", - "fontStyle": "italic" - }, - ".language-markdown .token.hr.punctuation": { - "color": "hsl(220, 10%, 40%)", - "fontStyle": "italic" - }, - ".language-markdown .token.code-snippet": { - "color": "hsl(95, 38%, 62%)" - }, - ".language-markdown .token.bold .token.content": { - "color": "hsl(29, 54%, 61%)" - }, - ".language-markdown .token.italic .token.content": { - "color": "hsl(286, 60%, 67%)" - }, - ".language-markdown .token.strike .token.content": { - "color": "hsl(355, 65%, 65%)" - }, - ".language-markdown .token.strike .token.punctuation": { - "color": "hsl(355, 65%, 65%)" - }, - ".language-markdown .token.list.punctuation": { - "color": "hsl(355, 65%, 65%)" - }, - ".language-markdown .token.title.important > .token.punctuation": { - "color": "hsl(355, 65%, 65%)" - }, - "bold": { - "fontWeight": "bold" - }, - "italic": { - "fontStyle": "italic" - }, - "namespace": { - "Opacity": "0.8" - }, - "token.tab:not(:empty):before": { - "color": "hsla(220, 14%, 71%, 0.15)", - "textShadow": "none" - }, - "token.cr:before": { - "color": "hsla(220, 14%, 71%, 0.15)", - "textShadow": "none" - }, - "token.lf:before": { - "color": "hsla(220, 14%, 71%, 0.15)", - "textShadow": "none" - }, - "token.space:before": { - "color": "hsla(220, 14%, 71%, 0.15)", - "textShadow": "none" - }, - "div.code-toolbar > .toolbar.toolbar > .toolbar-item": { - "marginRight": "0.4em" - }, - "div.code-toolbar > .toolbar.toolbar > .toolbar-item > button": { - "background": "hsl(220, 13%, 26%)", - "color": "hsl(220, 9%, 55%)", - "padding": "0.1em 0.4em", - "borderRadius": "0.3em" - }, - "div.code-toolbar > .toolbar.toolbar > .toolbar-item > a": { - "background": "hsl(220, 13%, 26%)", - "color": "hsl(220, 9%, 55%)", - "padding": "0.1em 0.4em", - "borderRadius": "0.3em" - }, - "div.code-toolbar > .toolbar.toolbar > .toolbar-item > span": { - "background": "hsl(220, 13%, 26%)", - "color": "hsl(220, 9%, 55%)", - "padding": "0.1em 0.4em", - "borderRadius": "0.3em" - }, - "div.code-toolbar > .toolbar.toolbar > .toolbar-item > button:hover": { - "background": "hsl(220, 13%, 28%)", - "color": "hsl(220, 14%, 71%)" - }, - "div.code-toolbar > .toolbar.toolbar > .toolbar-item > button:focus": { - "background": "hsl(220, 13%, 28%)", - "color": "hsl(220, 14%, 71%)" - }, - "div.code-toolbar > .toolbar.toolbar > .toolbar-item > a:hover": { - "background": "hsl(220, 13%, 28%)", - "color": "hsl(220, 14%, 71%)" - }, - "div.code-toolbar > .toolbar.toolbar > .toolbar-item > a:focus": { - "background": "hsl(220, 13%, 28%)", - "color": "hsl(220, 14%, 71%)" - }, - "div.code-toolbar > .toolbar.toolbar > .toolbar-item > span:hover": { - "background": "hsl(220, 13%, 28%)", - "color": "hsl(220, 14%, 71%)" - }, - "div.code-toolbar > .toolbar.toolbar > .toolbar-item > span:focus": { - "background": "hsl(220, 13%, 28%)", - "color": "hsl(220, 14%, 71%)" - }, - ".line-highlight.line-highlight": { - "background": "hsla(220, 100%, 80%, 0.04)" - }, - ".line-highlight.line-highlight:before": { - "background": "hsl(220, 13%, 26%)", - "color": "hsl(220, 14%, 71%)", - "padding": "0.1em 0.6em", - "borderRadius": "0.3em", - "boxShadow": "0 2px 0 0 rgba(0, 0, 0, 0.2)" - }, - ".line-highlight.line-highlight[data-end]:after": { - "background": "hsl(220, 13%, 26%)", - "color": "hsl(220, 14%, 71%)", - "padding": "0.1em 0.6em", - "borderRadius": "0.3em", - "boxShadow": "0 2px 0 0 rgba(0, 0, 0, 0.2)" - }, - "pre[id].linkable-line-numbers.linkable-line-numbers span.line-numbers-rows > span:hover:before": { - "backgroundColor": "hsla(220, 100%, 80%, 0.04)" - }, - ".line-numbers.line-numbers .line-numbers-rows": { - "borderRightColor": "hsla(220, 14%, 71%, 0.15)" - }, - ".command-line .command-line-prompt": { - "borderRightColor": "hsla(220, 14%, 71%, 0.15)" - }, - ".line-numbers .line-numbers-rows > span:before": { - "color": "hsl(220, 14%, 45%)" - }, - ".command-line .command-line-prompt > span:before": { - "color": "hsl(220, 14%, 45%)" - }, - ".rainbow-braces .token.token.punctuation.brace-level-1": { - "color": "hsl(355, 65%, 65%)" - }, - ".rainbow-braces .token.token.punctuation.brace-level-5": { - "color": "hsl(355, 65%, 65%)" - }, - ".rainbow-braces .token.token.punctuation.brace-level-9": { - "color": "hsl(355, 65%, 65%)" - }, - ".rainbow-braces .token.token.punctuation.brace-level-2": { - "color": "hsl(95, 38%, 62%)" - }, - ".rainbow-braces .token.token.punctuation.brace-level-6": { - "color": "hsl(95, 38%, 62%)" - }, - ".rainbow-braces .token.token.punctuation.brace-level-10": { - "color": "hsl(95, 38%, 62%)" - }, - ".rainbow-braces .token.token.punctuation.brace-level-3": { - "color": "hsl(207, 82%, 66%)" - }, - ".rainbow-braces .token.token.punctuation.brace-level-7": { - "color": "hsl(207, 82%, 66%)" - }, - ".rainbow-braces .token.token.punctuation.brace-level-11": { - "color": "hsl(207, 82%, 66%)" - }, - ".rainbow-braces .token.token.punctuation.brace-level-4": { - "color": "hsl(286, 60%, 67%)" - }, - ".rainbow-braces .token.token.punctuation.brace-level-8": { - "color": "hsl(286, 60%, 67%)" - }, - ".rainbow-braces .token.token.punctuation.brace-level-12": { - "color": "hsl(286, 60%, 67%)" - }, - "pre.diff-highlight > code .token.token.deleted:not(.prefix)": { - "backgroundColor": "hsla(353, 100%, 66%, 0.15)" - }, - "pre > code.diff-highlight .token.token.deleted:not(.prefix)": { - "backgroundColor": "hsla(353, 100%, 66%, 0.15)" - }, - "pre.diff-highlight > code .token.token.deleted:not(.prefix)::-moz-selection": { - "backgroundColor": "hsla(353, 95%, 66%, 0.25)" - }, - "pre.diff-highlight > code .token.token.deleted:not(.prefix) *::-moz-selection": { - "backgroundColor": "hsla(353, 95%, 66%, 0.25)" - }, - "pre > code.diff-highlight .token.token.deleted:not(.prefix)::-moz-selection": { - "backgroundColor": "hsla(353, 95%, 66%, 0.25)" - }, - "pre > code.diff-highlight .token.token.deleted:not(.prefix) *::-moz-selection": { - "backgroundColor": "hsla(353, 95%, 66%, 0.25)" - }, - "pre.diff-highlight > code .token.token.deleted:not(.prefix)::selection": { - "backgroundColor": "hsla(353, 95%, 66%, 0.25)" - }, - "pre.diff-highlight > code .token.token.deleted:not(.prefix) *::selection": { - "backgroundColor": "hsla(353, 95%, 66%, 0.25)" - }, - "pre > code.diff-highlight .token.token.deleted:not(.prefix)::selection": { - "backgroundColor": "hsla(353, 95%, 66%, 0.25)" - }, - "pre > code.diff-highlight .token.token.deleted:not(.prefix) *::selection": { - "backgroundColor": "hsla(353, 95%, 66%, 0.25)" - }, - "pre.diff-highlight > code .token.token.inserted:not(.prefix)": { - "backgroundColor": "hsla(137, 100%, 55%, 0.15)" - }, - "pre > code.diff-highlight .token.token.inserted:not(.prefix)": { - "backgroundColor": "hsla(137, 100%, 55%, 0.15)" - }, - "pre.diff-highlight > code .token.token.inserted:not(.prefix)::-moz-selection": { - "backgroundColor": "hsla(135, 73%, 55%, 0.25)" - }, - "pre.diff-highlight > code .token.token.inserted:not(.prefix) *::-moz-selection": { - "backgroundColor": "hsla(135, 73%, 55%, 0.25)" - }, - "pre > code.diff-highlight .token.token.inserted:not(.prefix)::-moz-selection": { - "backgroundColor": "hsla(135, 73%, 55%, 0.25)" - }, - "pre > code.diff-highlight .token.token.inserted:not(.prefix) *::-moz-selection": { - "backgroundColor": "hsla(135, 73%, 55%, 0.25)" - }, - "pre.diff-highlight > code .token.token.inserted:not(.prefix)::selection": { - "backgroundColor": "hsla(135, 73%, 55%, 0.25)" - }, - "pre.diff-highlight > code .token.token.inserted:not(.prefix) *::selection": { - "backgroundColor": "hsla(135, 73%, 55%, 0.25)" - }, - "pre > code.diff-highlight .token.token.inserted:not(.prefix)::selection": { - "backgroundColor": "hsla(135, 73%, 55%, 0.25)" - }, - "pre > code.diff-highlight .token.token.inserted:not(.prefix) *::selection": { - "backgroundColor": "hsla(135, 73%, 55%, 0.25)" - }, - ".prism-previewer.prism-previewer:before": { - "borderColor": "hsl(224, 13%, 17%)" - }, - ".prism-previewer-gradient.prism-previewer-gradient div": { - "borderColor": "hsl(224, 13%, 17%)", - "borderRadius": "0.3em" - }, - ".prism-previewer-color.prism-previewer-color:before": { - "borderRadius": "0.3em" - }, - ".prism-previewer-easing.prism-previewer-easing:before": { - "borderRadius": "0.3em" - }, - ".prism-previewer.prism-previewer:after": { - "borderTopColor": "hsl(224, 13%, 17%)" - }, - ".prism-previewer-flipped.prism-previewer-flipped.after": { - "borderBottomColor": "hsl(224, 13%, 17%)" - }, - ".prism-previewer-angle.prism-previewer-angle:before": { - "background": "hsl(219, 13%, 22%)" - }, - ".prism-previewer-time.prism-previewer-time:before": { - "background": "hsl(219, 13%, 22%)" - }, - ".prism-previewer-easing.prism-previewer-easing": { - "background": "hsl(219, 13%, 22%)" - }, - ".prism-previewer-angle.prism-previewer-angle circle": { - "stroke": "hsl(220, 14%, 71%)", - "strokeOpacity": "1" - }, - ".prism-previewer-time.prism-previewer-time circle": { - "stroke": "hsl(220, 14%, 71%)", - "strokeOpacity": "1" - }, - ".prism-previewer-easing.prism-previewer-easing circle": { - "stroke": "hsl(220, 14%, 71%)", - "fill": "transparent" - }, - ".prism-previewer-easing.prism-previewer-easing path": { - "stroke": "hsl(220, 14%, 71%)" - }, - ".prism-previewer-easing.prism-previewer-easing line": { - "stroke": "hsl(220, 14%, 71%)" - } -} + 'code[class*="language-"]': { + background: "hsl(220, 13%, 18%)", + color: "hsl(220, 14%, 71%)", + textShadow: "0 1px rgba(0, 0, 0, 0.3)", + fontFamily: + '"Fira Code", "Fira Mono", Menlo, Consolas, "DejaVu Sans Mono", monospace', + direction: "ltr", + textAlign: "left", + whiteSpace: "pre", + wordSpacing: "normal", + wordBreak: "normal", + lineHeight: "1.5", + MozTabSize: "2", + OTabSize: "2", + tabSize: "2", + WebkitHyphens: "none", + MozHyphens: "none", + msHyphens: "none", + hyphens: "none", + }, + 'pre[class*="language-"]': { + background: "hsl(220, 13%, 18%)", + color: "hsl(220, 14%, 71%)", + textShadow: "0 1px rgba(0, 0, 0, 0.3)", + fontFamily: + '"Fira Code", "Fira Mono", Menlo, Consolas, "DejaVu Sans Mono", monospace', + direction: "ltr", + textAlign: "left", + whiteSpace: "pre", + wordSpacing: "normal", + wordBreak: "normal", + lineHeight: "1.5", + MozTabSize: "2", + OTabSize: "2", + tabSize: "2", + WebkitHyphens: "none", + MozHyphens: "none", + msHyphens: "none", + hyphens: "none", + padding: "1em", + margin: "0.5em 0", + overflow: "auto", + borderRadius: "0.3em", + }, + 'code[class*="language-"]::-moz-selection': { + background: "hsl(220, 13%, 28%)", + color: "inherit", + textShadow: "none", + }, + 'code[class*="language-"] *::-moz-selection': { + background: "hsl(220, 13%, 28%)", + color: "inherit", + textShadow: "none", + }, + 'pre[class*="language-"] *::-moz-selection': { + background: "hsl(220, 13%, 28%)", + color: "inherit", + textShadow: "none", + }, + 'code[class*="language-"]::selection': { + background: "hsl(220, 13%, 28%)", + color: "inherit", + textShadow: "none", + }, + 'code[class*="language-"] *::selection': { + background: "hsl(220, 13%, 28%)", + color: "inherit", + textShadow: "none", + }, + 'pre[class*="language-"] *::selection': { + background: "hsl(220, 13%, 28%)", + color: "inherit", + textShadow: "none", + }, + ':not(pre) > code[class*="language-"]': { + padding: "0.2em 0.3em", + borderRadius: "0.3em", + whiteSpace: "normal", + }, + comment: { + color: "hsl(220, 10%, 40%)", + fontStyle: "italic", + }, + prolog: { + color: "hsl(220, 10%, 40%)", + }, + cdata: { + color: "hsl(220, 10%, 40%)", + }, + doctype: { + color: "hsl(220, 14%, 71%)", + }, + punctuation: { + color: "hsl(220, 14%, 71%)", + }, + entity: { + color: "hsl(220, 14%, 71%)", + cursor: "help", + }, + "attr-name": { + color: "hsl(29, 54%, 61%)", + }, + "class-name": { + color: "hsl(29, 54%, 61%)", + }, + boolean: { + color: "hsl(29, 54%, 61%)", + }, + constant: { + color: "hsl(29, 54%, 61%)", + }, + number: { + color: "hsl(29, 54%, 61%)", + }, + atrule: { + color: "hsl(29, 54%, 61%)", + }, + keyword: { + color: "hsl(286, 60%, 67%)", + }, + property: { + color: "hsl(355, 65%, 65%)", + }, + tag: { + color: "hsl(355, 65%, 65%)", + }, + symbol: { + color: "hsl(355, 65%, 65%)", + }, + deleted: { + color: "hsl(355, 65%, 65%)", + }, + important: { + color: "hsl(355, 65%, 65%)", + }, + selector: { + color: "hsl(95, 38%, 62%)", + }, + string: { + color: "hsl(95, 38%, 62%)", + }, + char: { + color: "hsl(95, 38%, 62%)", + }, + builtin: { + color: "hsl(95, 38%, 62%)", + }, + inserted: { + color: "hsl(95, 38%, 62%)", + }, + regex: { + color: "hsl(95, 38%, 62%)", + }, + "attr-value": { + color: "hsl(95, 38%, 62%)", + }, + "attr-value > .token.punctuation": { + color: "hsl(95, 38%, 62%)", + }, + variable: { + color: "hsl(207, 82%, 66%)", + }, + operator: { + color: "hsl(207, 82%, 66%)", + }, + function: { + color: "hsl(207, 82%, 66%)", + }, + url: { + color: "hsl(187, 47%, 55%)", + }, + "attr-value > .token.punctuation.attr-equals": { + color: "hsl(220, 14%, 71%)", + }, + "special-attr > .token.attr-value > .token.value.css": { + color: "hsl(220, 14%, 71%)", + }, + ".language-css .token.selector": { + color: "hsl(355, 65%, 65%)", + }, + ".language-css .token.property": { + color: "hsl(220, 14%, 71%)", + }, + ".language-css .token.function": { + color: "hsl(187, 47%, 55%)", + }, + ".language-css .token.url > .token.function": { + color: "hsl(187, 47%, 55%)", + }, + ".language-css .token.url > .token.string.url": { + color: "hsl(95, 38%, 62%)", + }, + ".language-css .token.important": { + color: "hsl(286, 60%, 67%)", + }, + ".language-css .token.atrule .token.rule": { + color: "hsl(286, 60%, 67%)", + }, + ".language-javascript .token.operator": { + color: "hsl(286, 60%, 67%)", + }, + ".language-javascript .token.template-string > .token.interpolation > .token.interpolation-punctuation.punctuation": + { + color: "hsl(5, 48%, 51%)", + }, + ".language-json .token.operator": { + color: "hsl(220, 14%, 71%)", + }, + ".language-json .token.null.keyword": { + color: "hsl(29, 54%, 61%)", + }, + ".language-markdown .token.url": { + color: "hsl(220, 14%, 71%)", + }, + ".language-markdown .token.url > .token.operator": { + color: "hsl(220, 14%, 71%)", + }, + ".language-markdown .token.url-reference.url > .token.string": { + color: "hsl(220, 14%, 71%)", + }, + ".language-markdown .token.url > .token.content": { + color: "hsl(207, 82%, 66%)", + }, + ".language-markdown .token.url > .token.url": { + color: "hsl(187, 47%, 55%)", + }, + ".language-markdown .token.url-reference.url": { + color: "hsl(187, 47%, 55%)", + }, + ".language-markdown .token.blockquote.punctuation": { + color: "hsl(220, 10%, 40%)", + fontStyle: "italic", + }, + ".language-markdown .token.hr.punctuation": { + color: "hsl(220, 10%, 40%)", + fontStyle: "italic", + }, + ".language-markdown .token.code-snippet": { + color: "hsl(95, 38%, 62%)", + }, + ".language-markdown .token.bold .token.content": { + color: "hsl(29, 54%, 61%)", + }, + ".language-markdown .token.italic .token.content": { + color: "hsl(286, 60%, 67%)", + }, + ".language-markdown .token.strike .token.content": { + color: "hsl(355, 65%, 65%)", + }, + ".language-markdown .token.strike .token.punctuation": { + color: "hsl(355, 65%, 65%)", + }, + ".language-markdown .token.list.punctuation": { + color: "hsl(355, 65%, 65%)", + }, + ".language-markdown .token.title.important > .token.punctuation": { + color: "hsl(355, 65%, 65%)", + }, + bold: { + fontWeight: "bold", + }, + italic: { + fontStyle: "italic", + }, + namespace: { + Opacity: "0.8", + }, + "token.tab:not(:empty):before": { + color: "hsla(220, 14%, 71%, 0.15)", + textShadow: "none", + }, + "token.cr:before": { + color: "hsla(220, 14%, 71%, 0.15)", + textShadow: "none", + }, + "token.lf:before": { + color: "hsla(220, 14%, 71%, 0.15)", + textShadow: "none", + }, + "token.space:before": { + color: "hsla(220, 14%, 71%, 0.15)", + textShadow: "none", + }, + "div.code-toolbar > .toolbar.toolbar > .toolbar-item": { + marginRight: "0.4em", + }, + "div.code-toolbar > .toolbar.toolbar > .toolbar-item > button": { + background: "hsl(220, 13%, 26%)", + color: "hsl(220, 9%, 55%)", + padding: "0.1em 0.4em", + borderRadius: "0.3em", + }, + "div.code-toolbar > .toolbar.toolbar > .toolbar-item > a": { + background: "hsl(220, 13%, 26%)", + color: "hsl(220, 9%, 55%)", + padding: "0.1em 0.4em", + borderRadius: "0.3em", + }, + "div.code-toolbar > .toolbar.toolbar > .toolbar-item > span": { + background: "hsl(220, 13%, 26%)", + color: "hsl(220, 9%, 55%)", + padding: "0.1em 0.4em", + borderRadius: "0.3em", + }, + "div.code-toolbar > .toolbar.toolbar > .toolbar-item > button:hover": { + background: "hsl(220, 13%, 28%)", + color: "hsl(220, 14%, 71%)", + }, + "div.code-toolbar > .toolbar.toolbar > .toolbar-item > button:focus": { + background: "hsl(220, 13%, 28%)", + color: "hsl(220, 14%, 71%)", + }, + "div.code-toolbar > .toolbar.toolbar > .toolbar-item > a:hover": { + background: "hsl(220, 13%, 28%)", + color: "hsl(220, 14%, 71%)", + }, + "div.code-toolbar > .toolbar.toolbar > .toolbar-item > a:focus": { + background: "hsl(220, 13%, 28%)", + color: "hsl(220, 14%, 71%)", + }, + "div.code-toolbar > .toolbar.toolbar > .toolbar-item > span:hover": { + background: "hsl(220, 13%, 28%)", + color: "hsl(220, 14%, 71%)", + }, + "div.code-toolbar > .toolbar.toolbar > .toolbar-item > span:focus": { + background: "hsl(220, 13%, 28%)", + color: "hsl(220, 14%, 71%)", + }, + ".line-highlight.line-highlight": { + background: "hsla(220, 100%, 80%, 0.04)", + }, + ".line-highlight.line-highlight:before": { + background: "hsl(220, 13%, 26%)", + color: "hsl(220, 14%, 71%)", + padding: "0.1em 0.6em", + borderRadius: "0.3em", + boxShadow: "0 2px 0 0 rgba(0, 0, 0, 0.2)", + }, + ".line-highlight.line-highlight[data-end]:after": { + background: "hsl(220, 13%, 26%)", + color: "hsl(220, 14%, 71%)", + padding: "0.1em 0.6em", + borderRadius: "0.3em", + boxShadow: "0 2px 0 0 rgba(0, 0, 0, 0.2)", + }, + "pre[id].linkable-line-numbers.linkable-line-numbers span.line-numbers-rows > span:hover:before": + { + backgroundColor: "hsla(220, 100%, 80%, 0.04)", + }, + ".line-numbers.line-numbers .line-numbers-rows": { + borderRightColor: "hsla(220, 14%, 71%, 0.15)", + }, + ".command-line .command-line-prompt": { + borderRightColor: "hsla(220, 14%, 71%, 0.15)", + }, + ".line-numbers .line-numbers-rows > span:before": { + color: "hsl(220, 14%, 45%)", + }, + ".command-line .command-line-prompt > span:before": { + color: "hsl(220, 14%, 45%)", + }, + ".rainbow-braces .token.token.punctuation.brace-level-1": { + color: "hsl(355, 65%, 65%)", + }, + ".rainbow-braces .token.token.punctuation.brace-level-5": { + color: "hsl(355, 65%, 65%)", + }, + ".rainbow-braces .token.token.punctuation.brace-level-9": { + color: "hsl(355, 65%, 65%)", + }, + ".rainbow-braces .token.token.punctuation.brace-level-2": { + color: "hsl(95, 38%, 62%)", + }, + ".rainbow-braces .token.token.punctuation.brace-level-6": { + color: "hsl(95, 38%, 62%)", + }, + ".rainbow-braces .token.token.punctuation.brace-level-10": { + color: "hsl(95, 38%, 62%)", + }, + ".rainbow-braces .token.token.punctuation.brace-level-3": { + color: "hsl(207, 82%, 66%)", + }, + ".rainbow-braces .token.token.punctuation.brace-level-7": { + color: "hsl(207, 82%, 66%)", + }, + ".rainbow-braces .token.token.punctuation.brace-level-11": { + color: "hsl(207, 82%, 66%)", + }, + ".rainbow-braces .token.token.punctuation.brace-level-4": { + color: "hsl(286, 60%, 67%)", + }, + ".rainbow-braces .token.token.punctuation.brace-level-8": { + color: "hsl(286, 60%, 67%)", + }, + ".rainbow-braces .token.token.punctuation.brace-level-12": { + color: "hsl(286, 60%, 67%)", + }, + "pre.diff-highlight > code .token.token.deleted:not(.prefix)": { + backgroundColor: "hsla(353, 100%, 66%, 0.15)", + }, + "pre > code.diff-highlight .token.token.deleted:not(.prefix)": { + backgroundColor: "hsla(353, 100%, 66%, 0.15)", + }, + "pre.diff-highlight > code .token.token.deleted:not(.prefix)::-moz-selection": + { + backgroundColor: "hsla(353, 95%, 66%, 0.25)", + }, + "pre.diff-highlight > code .token.token.deleted:not(.prefix) *::-moz-selection": + { + backgroundColor: "hsla(353, 95%, 66%, 0.25)", + }, + "pre > code.diff-highlight .token.token.deleted:not(.prefix)::-moz-selection": + { + backgroundColor: "hsla(353, 95%, 66%, 0.25)", + }, + "pre > code.diff-highlight .token.token.deleted:not(.prefix) *::-moz-selection": + { + backgroundColor: "hsla(353, 95%, 66%, 0.25)", + }, + "pre.diff-highlight > code .token.token.deleted:not(.prefix)::selection": { + backgroundColor: "hsla(353, 95%, 66%, 0.25)", + }, + "pre.diff-highlight > code .token.token.deleted:not(.prefix) *::selection": { + backgroundColor: "hsla(353, 95%, 66%, 0.25)", + }, + "pre > code.diff-highlight .token.token.deleted:not(.prefix)::selection": { + backgroundColor: "hsla(353, 95%, 66%, 0.25)", + }, + "pre > code.diff-highlight .token.token.deleted:not(.prefix) *::selection": { + backgroundColor: "hsla(353, 95%, 66%, 0.25)", + }, + "pre.diff-highlight > code .token.token.inserted:not(.prefix)": { + backgroundColor: "hsla(137, 100%, 55%, 0.15)", + }, + "pre > code.diff-highlight .token.token.inserted:not(.prefix)": { + backgroundColor: "hsla(137, 100%, 55%, 0.15)", + }, + "pre.diff-highlight > code .token.token.inserted:not(.prefix)::-moz-selection": + { + backgroundColor: "hsla(135, 73%, 55%, 0.25)", + }, + "pre.diff-highlight > code .token.token.inserted:not(.prefix) *::-moz-selection": + { + backgroundColor: "hsla(135, 73%, 55%, 0.25)", + }, + "pre > code.diff-highlight .token.token.inserted:not(.prefix)::-moz-selection": + { + backgroundColor: "hsla(135, 73%, 55%, 0.25)", + }, + "pre > code.diff-highlight .token.token.inserted:not(.prefix) *::-moz-selection": + { + backgroundColor: "hsla(135, 73%, 55%, 0.25)", + }, + "pre.diff-highlight > code .token.token.inserted:not(.prefix)::selection": { + backgroundColor: "hsla(135, 73%, 55%, 0.25)", + }, + "pre.diff-highlight > code .token.token.inserted:not(.prefix) *::selection": { + backgroundColor: "hsla(135, 73%, 55%, 0.25)", + }, + "pre > code.diff-highlight .token.token.inserted:not(.prefix)::selection": { + backgroundColor: "hsla(135, 73%, 55%, 0.25)", + }, + "pre > code.diff-highlight .token.token.inserted:not(.prefix) *::selection": { + backgroundColor: "hsla(135, 73%, 55%, 0.25)", + }, + ".prism-previewer.prism-previewer:before": { + borderColor: "hsl(224, 13%, 17%)", + }, + ".prism-previewer-gradient.prism-previewer-gradient div": { + borderColor: "hsl(224, 13%, 17%)", + borderRadius: "0.3em", + }, + ".prism-previewer-color.prism-previewer-color:before": { + borderRadius: "0.3em", + }, + ".prism-previewer-easing.prism-previewer-easing:before": { + borderRadius: "0.3em", + }, + ".prism-previewer.prism-previewer:after": { + borderTopColor: "hsl(224, 13%, 17%)", + }, + ".prism-previewer-flipped.prism-previewer-flipped.after": { + borderBottomColor: "hsl(224, 13%, 17%)", + }, + ".prism-previewer-angle.prism-previewer-angle:before": { + background: "hsl(219, 13%, 22%)", + }, + ".prism-previewer-time.prism-previewer-time:before": { + background: "hsl(219, 13%, 22%)", + }, + ".prism-previewer-easing.prism-previewer-easing": { + background: "hsl(219, 13%, 22%)", + }, + ".prism-previewer-angle.prism-previewer-angle circle": { + stroke: "hsl(220, 14%, 71%)", + strokeOpacity: "1", + }, + ".prism-previewer-time.prism-previewer-time circle": { + stroke: "hsl(220, 14%, 71%)", + strokeOpacity: "1", + }, + ".prism-previewer-easing.prism-previewer-easing circle": { + stroke: "hsl(220, 14%, 71%)", + fill: "transparent", + }, + ".prism-previewer-easing.prism-previewer-easing path": { + stroke: "hsl(220, 14%, 71%)", + }, + ".prism-previewer-easing.prism-previewer-easing line": { + stroke: "hsl(220, 14%, 71%)", + }, +}; diff --git a/pynecone/.templates/web/utils/state.js b/pynecone/.templates/web/utils/state.js index 356eb17d5..18158e486 100644 --- a/pynecone/.templates/web/utils/state.js +++ b/pynecone/.templates/web/utils/state.js @@ -1,8 +1,16 @@ -import axios from "axios"; +// State management for Pynecone web apps. +// Global variable to hold the token. let token; + +// Key for the token in the session storage. const TOKEN_KEY = "token"; +/** + * Generate a UUID (Used for session tokens). + * Taken from: https://stackoverflow.com/questions/105034/how-do-i-create-a-guid-uuid + * @returns A UUID. + */ const generateUUID = () => { let d = new Date().getTime(), d2 = (performance && performance.now && performance.now() * 1000) || 0; @@ -19,6 +27,10 @@ const generateUUID = () => { }); }; +/** + * Get the token for the current session. + * @returns The token. + */ export const getToken = () => { if (token) { return token; @@ -32,6 +44,11 @@ export const getToken = () => { return token; }; +/** + * Apply a delta to the state. + * @param state The state to apply the delta to. + * @param delta The delta to apply. + */ export const applyDelta = (state, delta) => { for (const substate in delta) { let s = state; @@ -45,53 +62,86 @@ export const applyDelta = (state, delta) => { } }; -export const applyEvent = async (state, event, endpoint, router) => { +/** + * Send an event to the server. + * @param event The event to send. + * @param router The router object. + * @param socket The socket object to send the event on. + */ +export const applyEvent = async (event, router, socket) => { // Handle special events if (event.name == "_redirect") { router.push(event.payload.path); - return []; + return; } if (event.name == "_console") { console.log(event.payload.message); - return []; + return; } if (event.name == "_alert") { alert(event.payload.message); - return []; + return; } + // Send the event to the server. event.token = getToken(); - const update = (await axios.post(endpoint, event)).data; - applyDelta(state, update.delta); - return update.events; + if (socket) { + socket.send(JSON.stringify(event)); + } }; -export const updateState = async ( - state, - result, - setResult, - endpoint, - router -) => { +/** + * Process an event off the event queue. + * @param state The state with the event queue. + * @param result The current result + * @param setResult The function to set the result. + * @param router The router object. + * @param socket The socket object to send the event on. + */ +export const updateState = async (state, result, setResult, router, socket) => { + // If we are already processing an event, or there are no events to process, return. if (result.processing || state.events.length == 0) { return; } + + // If the socket is not ready, return. + if (!socket.readyState) { + return; + } + + // Process the next event in the queue. setResult({ ...result, processing: true }); - const events = await applyEvent( - state, - state.events.shift(), - endpoint, - router - ); - setResult({ - processing: true, - state: state, - events: events, - }); + await applyEvent(state.events.shift(), router, socket); }; +/** + * Connect to a websocket and set the handlers. + * @param socket The socket object to connect. + * @param state The state object to apply the deltas to. + * @param setResult The function to set the result. + * @param endpoint The endpoint to connect to. + */ +export const connect = async (socket, state, setResult, endpoint) => { + socket.current = new WebSocket(endpoint); + socket.current.onmessage = function (update) { + update = JSON.parse(update.data); + applyDelta(state, update.delta); + setResult({ + processing: false, + state: state, + events: update.events, + }); + }; +}; + +/** + * Create an event object. + * @param name The name of the event. + * @param payload The payload of the event. + * @returns The event object. + */ export const E = (name, payload) => { return { name, payload }; }; diff --git a/pynecone/app.py b/pynecone/app.py index 1447a6031..1077d7a61 100644 --- a/pynecone/app.py +++ b/pynecone/app.py @@ -1,10 +1,8 @@ """The main Pynecone app.""" -import os -import re from typing import Any, Callable, Coroutine, Dict, List, Optional, Tuple, Type, Union -import fastapi +from fastapi import FastAPI, WebSocket from fastapi.middleware import cors from pynecone import constants, utils @@ -32,7 +30,7 @@ class App(Base): stylesheets: List[str] = [] # The backend API object. - api: fastapi.FastAPI = None # type: ignore + api: FastAPI = None # type: ignore # The state class to use for the app. state: Type[State] = DefaultState @@ -62,7 +60,7 @@ class App(Base): self.state_manager.setup(state=self.state) # Set up the API. - self.api = fastapi.FastAPI() + self.api = FastAPI() self.add_cors() self.add_default_endpoints() @@ -74,7 +72,7 @@ class App(Base): """ return f"" - def __call__(self) -> fastapi.FastAPI: + def __call__(self) -> FastAPI: """Run the backend api instance. Returns: @@ -85,10 +83,10 @@ class App(Base): def add_default_endpoints(self): """Add the default endpoints.""" # To test the server. - self.get(str(constants.Endpoint.PING))(_ping) + self.api.get(str(constants.Endpoint.PING))(_ping) # To make state changes. - self.post(str(constants.Endpoint.EVENT))(_event(app=self)) + self.api.websocket(str(constants.Endpoint.EVENT))(_event(app=self)) def add_cors(self): """Add CORS middleware to the app.""" @@ -99,32 +97,6 @@ class App(Base): allow_headers=["*"], ) - def get(self, path: str, *args, **kwargs) -> Callable: - """Register a get request. - - Args: - path: The endpoint path to link to the request. - *args: Args to pass to the request. - **kwargs: Kwargs to pass to the request. - - Returns: - A decorator to handle the request. - """ - return self.api.get(path, *args, **kwargs) - - def post(self, path: str, *args, **kwargs) -> Callable: - """Register a post request. - - Args: - path: The endpoint path to link to the request. - *args: Args to pass to the request. - **kwargs: Kwargs to pass to the request. - - Returns: - A decorator to handle the request. - """ - return self.api.post(path, *args, **kwargs) - def preprocess(self, state: State, event: Event) -> Optional[Delta]: """Preprocess the event. @@ -324,35 +296,65 @@ async def _ping() -> str: return "pong" -def _event(app: App) -> Reducer: - """Create an event reducer to modify the state. +def _event(app: App): + """Websocket endpoint for events. Args: - app: The app to modify the state of. + app: The app to add the endpoint to. Returns: - A handler that takes in an event and modifies the state. + The websocket endpoint. """ - async def process(event: Event) -> StateUpdate: - # Get the state for the session. - state = app.get_state(event.token) + async def ws(websocket: WebSocket): + """Create websocket endpoint. - # Preprocess the event. - pre = app.preprocess(state, event) - if pre is not None: - return StateUpdate(delta=pre) + Args: + websocket: The websocket sending events. + """ + # Accept the connection. + await websocket.accept() - # Apply the event to the state. - update = await state.process(event) - app.set_state(event.token, state) + # Process events until the connection is closed. + while True: + # Get the event. + event = Event.parse_raw(await websocket.receive_text()) - # Postprocess the event. - post = app.postprocess(state, event, update.delta) - if post is not None: - return StateUpdate(delta=post) + # Process the event. + update = await process(app, event) - # Return the delta. - return update + # Send the update. + await websocket.send_text(update.json()) - return process + return ws + + +async def process(app: App, event: Event) -> StateUpdate: + """Process an event. + + Args: + app: The app to process the event for. + event: The event to process. + + Returns: + The state update after processing the event. + """ + # Get the state for the session. + state = app.get_state(event.token) + + # Preprocess the event. + pre = app.preprocess(state, event) + if pre is not None: + return StateUpdate(delta=pre) + + # Apply the event to the state. + update = await state.process(event) + app.set_state(event.token, state) + + # Postprocess the event. + post = app.postprocess(state, event, update.delta) + if post is not None: + return StateUpdate(delta=post) + + # Return the update. + return update diff --git a/pynecone/compiler/compiler.py b/pynecone/compiler/compiler.py index 1f9635f07..5dea09c1c 100644 --- a/pynecone/compiler/compiler.py +++ b/pynecone/compiler/compiler.py @@ -10,9 +10,9 @@ from pynecone.state import State # Imports to be included in every Pynecone app. DEFAULT_IMPORTS: ImportDict = { - "react": {"useEffect", "useState"}, + "react": {"useEffect", "useRef", "useState"}, "next/router": {"useRouter"}, - f"/{constants.STATE_PATH}": {"updateState", "E"}, + f"/{constants.STATE_PATH}": {"connect", "updateState", "E"}, "": {"focus-visible/dist/focus-visible"}, } diff --git a/pynecone/compiler/templates.py b/pynecone/compiler/templates.py index a9cdce124..143cbb5ce 100644 --- a/pynecone/compiler/templates.py +++ b/pynecone/compiler/templates.py @@ -136,12 +136,16 @@ EVENT_FN = join( ROUTER = constants.ROUTER RESULT = constants.RESULT PROCESSING = constants.PROCESSING +SOCKET = constants.SOCKET STATE = constants.STATE EVENTS = constants.EVENTS SET_RESULT = format_state_setter(RESULT) USE_EFFECT = join( [ "useEffect(() => {{", + f" if (!{SOCKET}.current) {{{{", + f" connect({SOCKET}, {{state}}, {SET_RESULT}, {EVENT_ENDPOINT})", + " }}", " const update = async () => {{", f" if ({RESULT}.{STATE} != null) {{{{", f" {{set_state}}({{{{", @@ -154,7 +158,7 @@ USE_EFFECT = join( f" {PROCESSING}: false,", " }})", " }}", - f" await updateState({{state}}, {RESULT}, {SET_RESULT}, {EVENT_ENDPOINT}, {ROUTER})", + f" await updateState({{state}}, {RESULT}, {SET_RESULT}, {ROUTER}, {SOCKET}.current)", " }}", " update()", "}})", @@ -163,3 +167,6 @@ USE_EFFECT = join( # Routing ROUTER = f"const {constants.ROUTER} = useRouter()" + +# Sockets. +SOCKET = "const socket = useRef(null)" diff --git a/pynecone/compiler/utils.py b/pynecone/compiler/utils.py index 284c66a2d..f355a3b22 100644 --- a/pynecone/compiler/utils.py +++ b/pynecone/compiler/utils.py @@ -94,9 +94,6 @@ def compile_constants() -> str: ) -import plotly.graph_objects as go - - def compile_state(state: Type[State]) -> str: """Compile the state of the app. @@ -126,7 +123,8 @@ def compile_state(state: Type[State]) -> str: initial_state=json.dumps(initial_result), ) router = templates.ROUTER - return templates.join([synced_state, result, router]) + socket = templates.SOCKET + return templates.join([synced_state, result, router, socket]) def compile_events(state: Type[State]) -> str: diff --git a/pynecone/constants.py b/pynecone/constants.py index 57efa6a7d..40051cad3 100644 --- a/pynecone/constants.py +++ b/pynecone/constants.py @@ -74,6 +74,8 @@ APP_VAR = "app" API_VAR = "api" # The name of the router variable. ROUTER = "router" +# The name of the socket variable. +SOCKET = "socket" # The name of the variable to hold API results. RESULT = "result" # The name of the process variable. @@ -146,7 +148,17 @@ class Endpoint(Enum): Returns: The full URL for the endpoint. """ + # Import here to avoid circular imports. from pynecone import utils + # Get the API URL from the config. config = utils.get_config() - return "".join([config.api_url, str(self)]) + url = "".join([config.api_url, str(self)]) + + # The event endpoint is a websocket. + if self == Endpoint.EVENT: + # Replace the protocol with ws. + url = url.replace("https://", "ws://").replace("http://", "ws://") + + # Return the url. + return url diff --git a/pyproject.toml b/pyproject.toml index 8c40c0297..5c9821b3e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -34,6 +34,7 @@ uvicorn = "^0.20.0" rich = "^12.6.0" redis = "^4.3.5" httpx = "^0.23.1" +websockets = "^10.4" [tool.poetry.dev-dependencies] pytest = "^7.1.2"