commit 6c5d621cc5c18430fdd809f1d292ec6195ab7858 Author: august kline Date: Thu Sep 12 22:12:40 2024 -0400 Initial commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..89ae148 --- /dev/null +++ b/.gitignore @@ -0,0 +1,29 @@ +target/ +*.bin +result + +# Logs +log +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/george/Cargo.lock b/george/Cargo.lock new file mode 100644 index 0000000..5ff2ff5 --- /dev/null +++ b/george/Cargo.lock @@ -0,0 +1,894 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "anyhow" +version = "1.0.86" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da" + +[[package]] +name = "autocfg" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1" + +[[package]] +name = "bumpalo" +version = "3.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" + +[[package]] +name = "cc" +version = "1.0.103" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2755ff20a1d93490d26ba33a6f092a38a508398a5320df5d4b3014fcccce9410" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "console_error_panic_hook" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a06aeb73f470f66dcdbf7223caeebb85984942f22f1adb2a088cf9668146bbbc" +dependencies = [ + "cfg-if", + "wasm-bindgen", +] + +[[package]] +name = "dlib" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "330c60081dcc4c72131f8eb70510f1ac07223e5d4163db481a04a0befcffa412" +dependencies = [ + "libloading", +] + +[[package]] +name = "downcast-rs" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" + +[[package]] +name = "equivalent" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" + +[[package]] +name = "errno" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" +dependencies = [ + "libc", + "windows-sys", +] + +[[package]] +name = "fastrand" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a" + +[[package]] +name = "futures" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" + +[[package]] +name = "futures-executor" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" + +[[package]] +name = "futures-macro" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "futures-sink" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" + +[[package]] +name = "futures-task" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" + +[[package]] +name = "futures-util" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "george" +version = "0.1.0" +dependencies = [ + "console_error_panic_hook", + "georgeemu", + "minifb", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "georgeemu" +version = "0.1.0" +source = "git+https://git.augustkline.com/august/george-emu#952b79cf91542021e732d8fd5b0b46dbf0132a46" +dependencies = [ + "anyhow", + "console_error_panic_hook", + "minifb", + "serde", + "termion", + "toml", + "web-sys", +] + +[[package]] +name = "hashbrown" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" + +[[package]] +name = "indexmap" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68b900aa2f7301e21c36462b170ee99994de34dff39a4a6a528e80e7376d07e5" +dependencies = [ + "equivalent", + "hashbrown", +] + +[[package]] +name = "instant" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" +dependencies = [ + "cfg-if", + "js-sys", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "itoa" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" + +[[package]] +name = "js-sys" +version = "0.3.70" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1868808506b929d7b0cfa8f75951347aa71bb21144b7791bae35d9bccfcfe37a" +dependencies = [ + "wasm-bindgen", +] + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" + +[[package]] +name = "libc" +version = "0.2.155" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" + +[[package]] +name = "libloading" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e310b3a6b5907f99202fcdb4960ff45b93735d7c7d96b760fcff8db2dc0e103d" +dependencies = [ + "cfg-if", + "windows-targets", +] + +[[package]] +name = "libredox" +version = "0.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3af92c55d7d839293953fcd0fda5ecfe93297cfde6ffbdec13b41d99c0ba6607" +dependencies = [ + "bitflags 2.5.0", + "libc", + "redox_syscall", +] + +[[package]] +name = "linux-raw-sys" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" + +[[package]] +name = "log" +version = "0.4.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" + +[[package]] +name = "memchr" +version = "2.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" + +[[package]] +name = "memoffset" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce" +dependencies = [ + "autocfg", +] + +[[package]] +name = "minifb" +version = "0.27.0" +source = "git+https://github.com/augustkline/rust_minifb#2e2fdcf1d692c8c3d827a221a66569d81c73f99a" +dependencies = [ + "cc", + "console_error_panic_hook", + "dlib", + "futures", + "instant", + "js-sys", + "lazy_static", + "libc", + "orbclient", + "raw-window-handle", + "serde", + "serde_derive", + "tempfile", + "wasm-bindgen", + "wasm-bindgen-futures", + "wayland-client", + "wayland-cursor", + "wayland-protocols", + "web-sys", + "winapi", + "x11-dl", +] + +[[package]] +name = "nix" +version = "0.24.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa52e972a9a719cecb6864fb88568781eb706bac2cd1d4f04a648542dbf78069" +dependencies = [ + "bitflags 1.3.2", + "cfg-if", + "libc", + "memoffset", +] + +[[package]] +name = "numtoa" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8f8bdf33df195859076e54ab11ee78a1b208382d3a26ec40d142ffc1ecc49ef" + +[[package]] +name = "once_cell" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" + +[[package]] +name = "orbclient" +version = "0.3.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52f0d54bde9774d3a51dcf281a5def240c71996bc6ca05d2c847ec8b2b216166" +dependencies = [ + "libc", + "libredox", + "sdl2", + "sdl2-sys", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "pkg-config" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" + +[[package]] +name = "proc-macro2" +version = "1.0.86" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "raw-window-handle" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20675572f6f24e9e76ef639bc5552774ed45f1c30e2951e1e99c59888861c539" + +[[package]] +name = "redox_syscall" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" +dependencies = [ + "bitflags 1.3.2", +] + +[[package]] +name = "redox_termios" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20145670ba436b55d91fc92d25e71160fbfbdd57831631c8d7d36377a476f1cb" + +[[package]] +name = "rustix" +version = "0.38.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" +dependencies = [ + "bitflags 2.5.0", + "errno", + "libc", + "linux-raw-sys", + "windows-sys", +] + +[[package]] +name = "ryu" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" + +[[package]] +name = "scoped-tls" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" + +[[package]] +name = "sdl2" +version = "0.35.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7959277b623f1fb9e04aea73686c3ca52f01b2145f8ea16f4ff30d8b7623b1a" +dependencies = [ + "bitflags 1.3.2", + "lazy_static", + "libc", + "sdl2-sys", +] + +[[package]] +name = "sdl2-sys" +version = "0.35.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3586be2cf6c0a8099a79a12b4084357aa9b3e0b0d7980e3b67aaf7a9d55f9f0" +dependencies = [ + "cfg-if", + "libc", + "version-compare", +] + +[[package]] +name = "serde" +version = "1.0.203" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7253ab4de971e72fb7be983802300c30b5a7f0c2e56fab8abfc6a214307c0094" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.203" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "500cbc0ebeb6f46627f50f3f5811ccf6bf00643be300b4c3eabc0ef55dc5b5ba" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.127" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8043c06d9f82bd7271361ed64f415fe5e12a77fdb52e573e7f06a516dea329ad" +dependencies = [ + "itoa", + "memchr", + "ryu", + "serde", +] + +[[package]] +name = "serde_spanned" +version = "0.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb5b1b31579f3811bf615c144393417496f152e12ac8b7663bf664f4a815306d" +dependencies = [ + "serde", +] + +[[package]] +name = "slab" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +dependencies = [ + "autocfg", +] + +[[package]] +name = "smallvec" +version = "1.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" + +[[package]] +name = "syn" +version = "2.0.67" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff8655ed1d86f3af4ee3fd3263786bc14245ad17c4c7e85ba7187fb3ae028c90" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "tempfile" +version = "3.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1" +dependencies = [ + "cfg-if", + "fastrand", + "rustix", + "windows-sys", +] + +[[package]] +name = "termion" +version = "4.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ccce68e518d1173e80876edd54760b60b792750d0cab6444a79101c6ea03848" +dependencies = [ + "libc", + "libredox", + "numtoa", + "redox_termios", +] + +[[package]] +name = "toml" +version = "0.8.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1ed1f98e3fdc28d6d910e6737ae6ab1a93bf1985935a1193e68f93eeb68d24e" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit", +] + +[[package]] +name = "toml_datetime" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_edit" +version = "0.22.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "583c44c02ad26b0c3f3066fe629275e50627026c51ac2e595cca4c230ce1ce1d" +dependencies = [ + "indexmap", + "serde", + "serde_spanned", + "toml_datetime", + "winnow", +] + +[[package]] +name = "unicode-ident" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" + +[[package]] +name = "version-compare" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "579a42fc0b8e0c63b76519a339be31bed574929511fa53c1a3acae26eb258f29" + +[[package]] +name = "wasm-bindgen" +version = "0.2.93" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a82edfc16a6c469f5f44dc7b571814045d60404b55a0ee849f9bcfa2e63dd9b5" +dependencies = [ + "cfg-if", + "once_cell", + "serde", + "serde_json", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.93" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9de396da306523044d3302746f1208fa71d7532227f15e347e2d93e4145dd77b" +dependencies = [ + "bumpalo", + "log", + "once_cell", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76bc14366121efc8dbb487ab05bcc9d346b3b5ec0eaa76e46594cabbe51762c0" +dependencies = [ + "cfg-if", + "js-sys", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.93" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "585c4c91a46b072c92e908d99cb1dcdf95c5218eeb6f3bf1efa991ee7a68cccf" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.93" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "afc340c74d9005395cf9dd098506f7f44e38f2b4a21c6aaacf9a105ea5e1e836" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.93" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c62a0a307cb4a311d3a07867860911ca130c3494e8c2719593806c08bc5d0484" + +[[package]] +name = "wayland-client" +version = "0.29.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f3b068c05a039c9f755f881dc50f01732214f5685e379829759088967c46715" +dependencies = [ + "bitflags 1.3.2", + "downcast-rs", + "libc", + "nix", + "scoped-tls", + "wayland-commons", + "wayland-scanner", + "wayland-sys", +] + +[[package]] +name = "wayland-commons" +version = "0.29.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8691f134d584a33a6606d9d717b95c4fa20065605f798a3f350d78dced02a902" +dependencies = [ + "nix", + "once_cell", + "smallvec", + "wayland-sys", +] + +[[package]] +name = "wayland-cursor" +version = "0.29.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6865c6b66f13d6257bef1cd40cbfe8ef2f150fb8ebbdb1e8e873455931377661" +dependencies = [ + "nix", + "wayland-client", + "xcursor", +] + +[[package]] +name = "wayland-protocols" +version = "0.29.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b950621f9354b322ee817a23474e479b34be96c2e909c14f7bc0100e9a970bc6" +dependencies = [ + "bitflags 1.3.2", + "wayland-client", + "wayland-commons", + "wayland-scanner", +] + +[[package]] +name = "wayland-scanner" +version = "0.29.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f4303d8fa22ab852f789e75a967f0a2cdc430a607751c0499bada3e451cbd53" +dependencies = [ + "proc-macro2", + "quote", + "xml-rs", +] + +[[package]] +name = "wayland-sys" +version = "0.29.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be12ce1a3c39ec7dba25594b97b42cb3195d54953ddb9d3d95a7c3902bc6e9d4" +dependencies = [ + "dlib", + "lazy_static", + "pkg-config", +] + +[[package]] +name = "web-sys" +version = "0.3.70" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26fdeaafd9bd129f65e7c031593c24d62186301e0c72c8978fa1678be7d532c0" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-targets" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f0713a46559409d202e70e28227288446bf7841d3211583a4b53e3f6d96e7eb" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_gnullvm", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88ba073cf16d5372720ec942a8ccbf61626074c6d4dd2e745299726ce8b89670" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0" + +[[package]] +name = "winnow" +version = "0.6.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68a9bda4691f099d435ad181000724da8e5899daa10713c2d432552b9ccd3a6f" +dependencies = [ + "memchr", +] + +[[package]] +name = "x11-dl" +version = "2.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38735924fedd5314a6e548792904ed8c6de6636285cb9fec04d5b1db85c1516f" +dependencies = [ + "libc", + "once_cell", + "pkg-config", +] + +[[package]] +name = "xcursor" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a0ccd7b4a5345edfcd0c3535718a4e9ff7798ffc536bb5b5a0e26ff84732911" + +[[package]] +name = "xml-rs" +version = "0.8.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "791978798f0597cfc70478424c2b4fdc2b7a8024aaff78497ef00f24ef674193" diff --git a/george/Cargo.toml b/george/Cargo.toml new file mode 100644 index 0000000..de555d3 --- /dev/null +++ b/george/Cargo.toml @@ -0,0 +1,23 @@ +[package] +name = "george" +version = "0.1.0" +edition = "2021" + +[lib] +crate-type = ["cdylib", "rlib"] + +[features] +default = ["minifb/web"] + +[dependencies] +console_error_panic_hook = "0.1.7" +georgeemu = { git = "https://git.augustkline.com/august/george-emu" } +minifb = { git = "https://github.com/augustkline/rust_minifb" } +wasm-bindgen = "0.2.93" + +[dependencies.web-sys] +version = "*" +features = ['Document', 'Element', 'HtmlElement', 'Node', 'Window'] + +[package.metadata.wasm-pack.profile.profiling] +wasm-opt = ['-O'] diff --git a/george/rust-toolchain.toml b/george/rust-toolchain.toml new file mode 100644 index 0000000..292fe49 --- /dev/null +++ b/george/rust-toolchain.toml @@ -0,0 +1,2 @@ +[toolchain] +channel = "stable" diff --git a/george/src/demo.asm b/george/src/demo.asm new file mode 100644 index 0000000..8dbfba2 --- /dev/null +++ b/george/src/demo.asm @@ -0,0 +1,217 @@ +; use `vasm6502_oldstyle -dotdir -wdc02 -ldots -Fbin` to assemble +; source is at http://www.compilers.de/vasm.html + + .include "./macro.inc" + .org $8000 + +temp = $20 ; scratchpad page + +cursor = $300 +cursor_x = cursor +cursor_y = cursor + 1 + +rand_index = $200 + +reset: + sei + ldx #0; initialize data stack pointer + jsr delay + jsr delay + jsr delay + jsr delay + jsr delay + jsr delay + jsr delay + jsr delay + jsr delay + jsr delay + jsr delay + jsr delay + jsr delay + jsr delay + jsr delay + jsr delay + jsr delay + jsr delay + jsr delay + jsr delay + jsr delay + jsr delay + jsr delay + jsr delay + jsr delay + jsr delay + +main: + jsr rand_draw + lda #0 + jsr delay + jsr delay + jsr delay + jsr delay + jsr delay + jsr delay + jsr delay + jsr delay + jsr delay + jsr delay + jsr print + jmp main + +; prints string from cursor position, stopping at end of string or at 256 chars, whichever comes first +; $6000 + (64*Y) + X +; THIS WILL WRITE OUT OF BOUNDS IF THE CURSOR IS OUT OF BOUNDS/STRING IS TOO LONG + +print: + jsr cursor_addr + ldy #0 + .loop: + jsr delay + jsr delay + jsr delay + jsr delay + jsr delay + lda text, y + beq .end + sta (temp), y + iny + jmp .loop + .end: + rts + + +; calculates real vram address from cursor (x, y) + +cursor_addr: + stz temp + stz temp + 1 + lda cursor_y + beq .add_x ; if y's zero just add x + .y_mult: + ; multiply by 64 + clc + asl + rol temp + 1 + asl + rol temp + 1 + asl + rol temp + 1 + asl + rol temp + 1 + asl + rol temp + 1 + asl + rol temp + 1 + sta temp + .add_x: + clc + lda cursor_x + adc temp + sta temp + lda #0 + adc temp + 1 + sta temp + 1 + clc + lda #$60 + adc temp + 1 + sta temp + 1 + rts + + +rand_draw: + ldx rand_index + lda random_x, x + sta cursor_x + lda random_y, x + sta cursor_y + jsr cursor_addr + inc rand_index + rts + +text: + .asciiz 7," hi warp team ", 7 + +random_y: + .byte 25,12,0,20,4,25,5,13 + .byte 20, 1, 1, 22, 12, 19, 19, 19 + .byte 9, 0, 4, 18, 13, 14, 4, 16 + .byte 8, 17, 21, 14, 23, 21, 9, 0 + .byte 14, 10, 14, 2, 26, 18, 15, 23 + .byte 12, 2, 5, 4, 25, 20, 27, 4 + .byte 28, 21, 3, 22, 11, 25, 2, 25 + .byte 13, 17, 17, 24, 8, 8, 20, 21 + .byte 11, 24, 27, 25, 8, 12, 7, 0 + .byte 27, 12, 19, 27, 10, 3, 19, 2 + .byte 2, 23, 22, 5, 26, 28, 4, 16 + .byte 18, 7, 10, 9, 6, 19, 9, 2 + .byte 14, 8, 14, 18, 18, 2, 13, 0 + .byte 15, 26, 3, 23, 17, 12, 18, 11 + .byte 4, 16, 17, 22, 9, 25, 3, 15 + .byte 28, 3, 6, 14, 25, 5, 21, 8 + .byte 15, 18, 15, 5, 28, 6, 15, 4 + .byte 10, 1, 16, 24, 6, 9, 22, 3 + .byte 17, 18, 10, 19, 27, 11, 22, 16 + .byte 22, 17, 15, 6, 23, 11, 11, 11 + .byte 4, 15, 5, 25, 19, 1, 8, 26 + .byte 21, 20, 17, 27, 11, 3, 11, 20 + .byte 15, 28, 0, 6, 14, 23, 20, 21 + .byte 17, 20, 16, 15, 19, 6, 21, 19 + .byte 15, 27, 1, 22, 7, 0, 5, 2 + .byte 14, 24, 15, 4, 20, 16, 1, 14 + .byte 4, 16, 4, 8, 13, 26, 3, 9 + .byte 12, 25, 5, 0, 7, 17, 14, 20 + .byte 2, 26, 2, 27, 18, 23, 5, 8 + .byte 4, 21, 10, 11, 28, 22, 6, 6 + .byte 10, 13, 23, 12, 20, 28, 20, 1 + .byte 27, 19, 25, 6, 1, 10, 1 + +random_x: + .byte 42, 59, 11, 5, 18, 0, 26, 1 + .byte 61, 16, 1, 51, 36, 47, 23, 1 + .byte 16, 50, 46, 4, 55, 31, 15, 2 + .byte 45, 21, 59, 53, 15, 43, 0, 2 + .byte 64, 31, 38, 41, 25, 12, 12, 3 + .byte 30, 13, 64, 44, 21, 8, 48, 3 + .byte 46, 1, 2, 33, 4, 32, 59, 28 + .byte 4, 24, 58, 53, 21, 41, 30, 2 + .byte 56, 53, 31, 10, 42, 12, 9, 54 + .byte 14, 14, 24, 29, 43, 60, 54, 26 + .byte 5, 53, 17, 55, 27, 46, 31, 3 + .byte 26, 44, 63, 30, 10, 34, 62, 48 + .byte 42, 47, 51, 7, 55, 32, 14, 21 + .byte 15, 26, 52, 37, 48, 0, 13, 2 + .byte 50, 20, 35, 32, 8, 41, 2, 24 + .byte 18, 9, 52, 22, 52, 12, 19, 32 + .byte 29, 46, 34, 58, 54, 51, 43, 57 + .byte 62, 10, 12, 57, 36, 39, 4, 30 + .byte 38, 9, 30, 32, 33, 57, 3, 25 + .byte 21, 36, 59, 30, 19, 39, 9, 60 + .byte 34, 50, 52, 37, 34, 42, 3, 33 + .byte 40, 19, 2, 26, 10, 38, 46, 30 + .byte 3, 1, 19, 16, 26, 58, 42, 49 + .byte 63, 1, 63, 41, 0, 21, 41, 19 + .byte 21, 45, 44, 52, 20, 5, 11, 64 + .byte 1, 62, 16, 5, 5, 8, 58, 56 + .byte 16, 26, 6, 37, 19, 16, 25, 29 + .byte 64, 59, 16, 6, 41, 28, 8, 51 + .byte 54, 5, 19, 28, 13, 38, 52, 35 + .byte 42, 13, 34, 33, 61, 61, 7, 27 + .byte 38, 33, 9, 57, 10, 30, 8, 4 + .byte 46, 3, 39, 46, 62, 20, 48, 7 + +delay: + delay + delay + delay + delay + delay + delay + delay + rts + +isr: ; interrupt service routine + rti + + .org $fffc + .word reset + .word isr diff --git a/george/src/demo.rom b/george/src/demo.rom new file mode 100644 index 0000000..2c9b75a Binary files /dev/null and b/george/src/demo.rom differ diff --git a/george/src/lib.rs b/george/src/lib.rs new file mode 100644 index 0000000..a03dab8 --- /dev/null +++ b/george/src/lib.rs @@ -0,0 +1,63 @@ +use std::{cell::RefCell, panic, rc::Rc}; + +use georgeemu::GeorgeEmu; +use minifb::{Scale, ScaleMode, Window, WindowOptions}; +use wasm_bindgen::prelude::*; +use web_sys::HtmlElement; + +fn window() -> web_sys::Window { + web_sys::window().expect("no global `window` exists") +} + +fn request_animation_frame(f: &Closure) { + window() + .request_animation_frame(f.as_ref().unchecked_ref()) + .expect("should register `requestAnimationFrame` OK"); +} + +const WIDTH: usize = 512; +const HEIGHT: usize = 380; + +#[wasm_bindgen(start)] +pub fn main() { + panic::set_hook(Box::new(console_error_panic_hook::hook)); + let rom = *include_bytes!("./demo.rom"); + let document = window().document().unwrap(); + let george_canvas: HtmlElement = document + .get_element_by_id("george") + .unwrap() + .dyn_into::() + .unwrap(); + let window = Window::new( + george_canvas, + WIDTH, + HEIGHT, + WindowOptions { + resize: true, + borderless: true, + title: true, + transparency: false, + scale: Scale::FitScreen, + scale_mode: ScaleMode::AspectRatioStretch, + topmost: false, + none: true, + }, + ) + .unwrap(); + let mut emu = GeorgeEmu::builder().rom(rom).window(window).build(); + + let f = Rc::new(RefCell::new(None)); + let g = f.clone(); + + *g.borrow_mut() = Some(Closure::wrap(Box::new(move || { + // cycle roughly however many cycles would've run during a frame + for _ in 0..32000 { + emu.cycle(); + } + emu.draw(); + // schedule this closure for running again at next frame + request_animation_frame(f.borrow().as_ref().unwrap()); + }) as Box)); + + request_animation_frame(g.borrow().as_ref().unwrap()); +} diff --git a/george/src/macro.inc b/george/src/macro.inc new file mode 100644 index 0000000..b7e773c --- /dev/null +++ b/george/src/macro.inc @@ -0,0 +1,2008 @@ + .macro delay + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + .endm diff --git a/index.html b/index.html new file mode 100644 index 0000000..c5d5cb5 --- /dev/null +++ b/index.html @@ -0,0 +1,160 @@ + + + + + + + + Hi Warp Team, I'm August! + + + + + + + + +
+
+
+
+

Hi Warp Team!

+

i'm august

+

I love your product and want to help build the terminal of the future

+ $ echo +
+ +
+
+
+

what am I?

+

+ I am a skilled Rust and Typescript engineer who has + collaborated with global teams to + bring developers together, applies her skills to build + beautiful products, and spends her free time tinkering and growing her skills. +

+
+ +
+
+
+
+ + + +
+
+

+ This site was written in plain + Typescript, and this + demo is an emulator i wrote from + scratch in Rust that was compiled to WASM and runs + hand-written assembly in the browser at native speed. +

+
+
+ +

+ At my last job with The Coding + Train I worked with + a + global team of designers and educators to bring coding education to tens of thousands of + monthly + active users. I led implementation of the Passenger + Showcase, which enabled hundreds of creative coders to have their projects featured + on + the + site. +

+
+
+ +

I'm both a talented engineer and creatively-driven. I studied at NYU ITP's + undergrad program, + Interactive Media Arts, where I applied my engineering skills to the arts, creating interactive musical + watercolors, hidden message poetry, and networked oracles, just to name a + few + projects. +

+
+
+ +

+ For fun I like to play with hardware, and lately I've + been + developing fuzzy, a programming + language + for + my homemade computer george. Other + spare-time projects I've written include svg + canvases, generative audio + markov + chains, and ephemeral chat + apps. +

+
+
+
+
+
+ man for the future of coding +

here's a feature idea...

+

I read up on your interview process and figured I'd skip straight to the best part!

+

The terminal of the future should blur the lines between TUI and GUI.

+

Here, I imagined an enhanced user interface for man that respects the developer and + doesn't + switch + contexts + or change their workflow.

+

(and here's a little server I wrote + just + for + this demo)

+
+
+
+
+ + + +
+
+
+ ~ + + +
+
+
+
+
+
+

Let's work together

+

Shoot me an email and let's set up an interview

+

I'm really excited to bring my skills to your team!

+
+
+
+
+ + + diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..789243f --- /dev/null +++ b/package-lock.json @@ -0,0 +1,715 @@ +{ + "name": "vite-plugin-wasm-pack-example", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "vite-plugin-wasm-pack-example", + "version": "1.0.0", + "license": "MIT", + "devDependencies": { + "vite": "^2.6.14", + "vite-plugin-wasm-pack": "^0.1.9" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.14.54.tgz", + "integrity": "sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/esbuild": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.54.tgz", + "integrity": "sha512-Cy9llcy8DvET5uznocPyqL3BFRrFXSVqbgpMJ9Wz8oVjZlh/zUSNbPRbov0VX7VxN2JH1Oa0uNxZ7eLRb62pJA==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/linux-loong64": "0.14.54", + "esbuild-android-64": "0.14.54", + "esbuild-android-arm64": "0.14.54", + "esbuild-darwin-64": "0.14.54", + "esbuild-darwin-arm64": "0.14.54", + "esbuild-freebsd-64": "0.14.54", + "esbuild-freebsd-arm64": "0.14.54", + "esbuild-linux-32": "0.14.54", + "esbuild-linux-64": "0.14.54", + "esbuild-linux-arm": "0.14.54", + "esbuild-linux-arm64": "0.14.54", + "esbuild-linux-mips64le": "0.14.54", + "esbuild-linux-ppc64le": "0.14.54", + "esbuild-linux-riscv64": "0.14.54", + "esbuild-linux-s390x": "0.14.54", + "esbuild-netbsd-64": "0.14.54", + "esbuild-openbsd-64": "0.14.54", + "esbuild-sunos-64": "0.14.54", + "esbuild-windows-32": "0.14.54", + "esbuild-windows-64": "0.14.54", + "esbuild-windows-arm64": "0.14.54" + } + }, + "node_modules/esbuild-android-64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.54.tgz", + "integrity": "sha512-Tz2++Aqqz0rJ7kYBfz+iqyE3QMycD4vk7LBRyWaAVFgFtQ/O8EJOnVmTOiDWYZ/uYzB4kvP+bqejYdVKzE5lAQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-android-arm64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.54.tgz", + "integrity": "sha512-F9E+/QDi9sSkLaClO8SOV6etqPd+5DgJje1F9lOWoNncDdOBL2YF59IhsWATSt0TLZbYCf3pNlTHvVV5VfHdvg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-darwin-64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.54.tgz", + "integrity": "sha512-jtdKWV3nBviOd5v4hOpkVmpxsBy90CGzebpbO9beiqUYVMBtSc0AL9zGftFuBon7PNDcdvNCEuQqw2x0wP9yug==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-darwin-arm64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.54.tgz", + "integrity": "sha512-OPafJHD2oUPyvJMrsCvDGkRrVCar5aVyHfWGQzY1dWnzErjrDuSETxwA2HSsyg2jORLY8yBfzc1MIpUkXlctmw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-freebsd-64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.54.tgz", + "integrity": "sha512-OKwd4gmwHqOTp4mOGZKe/XUlbDJ4Q9TjX0hMPIDBUWWu/kwhBAudJdBoxnjNf9ocIB6GN6CPowYpR/hRCbSYAg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-freebsd-arm64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.54.tgz", + "integrity": "sha512-sFwueGr7OvIFiQT6WeG0jRLjkjdqWWSrfbVwZp8iMP+8UHEHRBvlaxL6IuKNDwAozNUmbb8nIMXa7oAOARGs1Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-32": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.54.tgz", + "integrity": "sha512-1ZuY+JDI//WmklKlBgJnglpUL1owm2OX+8E1syCD6UAxcMM/XoWd76OHSjl/0MR0LisSAXDqgjT3uJqT67O3qw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.54.tgz", + "integrity": "sha512-EgjAgH5HwTbtNsTqQOXWApBaPVdDn7XcK+/PtJwZLT1UmpLoznPd8c5CxqsH2dQK3j05YsB3L17T8vE7cp4cCg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-arm": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.54.tgz", + "integrity": "sha512-qqz/SjemQhVMTnvcLGoLOdFpCYbz4v4fUo+TfsWG+1aOu70/80RV6bgNpR2JCrppV2moUQkww+6bWxXRL9YMGw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-arm64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.54.tgz", + "integrity": "sha512-WL71L+0Rwv+Gv/HTmxTEmpv0UgmxYa5ftZILVi2QmZBgX3q7+tDeOQNqGtdXSdsL8TQi1vIaVFHUPDe0O0kdig==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-mips64le": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.54.tgz", + "integrity": "sha512-qTHGQB8D1etd0u1+sB6p0ikLKRVuCWhYQhAHRPkO+OF3I/iSlTKNNS0Lh2Oc0g0UFGguaFZZiPJdJey3AGpAlw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-ppc64le": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.54.tgz", + "integrity": "sha512-j3OMlzHiqwZBDPRCDFKcx595XVfOfOnv68Ax3U4UKZ3MTYQB5Yz3X1mn5GnodEVYzhtZgxEBidLWeIs8FDSfrQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-riscv64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.54.tgz", + "integrity": "sha512-y7Vt7Wl9dkOGZjxQZnDAqqn+XOqFD7IMWiewY5SPlNlzMX39ocPQlOaoxvT4FllA5viyV26/QzHtvTjVNOxHZg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-s390x": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.54.tgz", + "integrity": "sha512-zaHpW9dziAsi7lRcyV4r8dhfG1qBidQWUXweUjnw+lliChJqQr+6XD71K41oEIC3Mx1KStovEmlzm+MkGZHnHA==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-netbsd-64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.54.tgz", + "integrity": "sha512-PR01lmIMnfJTgeU9VJTDY9ZerDWVFIUzAtJuDHwwceppW7cQWjBBqP48NdeRtoP04/AtO9a7w3viI+PIDr6d+w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-openbsd-64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.54.tgz", + "integrity": "sha512-Qyk7ikT2o7Wu76UsvvDS5q0amJvmRzDyVlL0qf5VLsLchjCa1+IAvd8kTBgUxD7VBUUVgItLkk609ZHUc1oCaw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-sunos-64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.54.tgz", + "integrity": "sha512-28GZ24KmMSeKi5ueWzMcco6EBHStL3B6ubM7M51RmPwXQGLe0teBGJocmWhgwccA1GeFXqxzILIxXpHbl9Q/Kw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-windows-32": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.54.tgz", + "integrity": "sha512-T+rdZW19ql9MjS7pixmZYVObd9G7kcaZo+sETqNH4RCkuuYSuv9AGHUVnPoP9hhuE1WM1ZimHz1CIBHBboLU7w==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-windows-64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.54.tgz", + "integrity": "sha512-AoHTRBUuYwXtZhjXZbA1pGfTo8cJo3vZIcWGLiUcTNgHpJJMC1rVA44ZereBHMJtotyN71S8Qw0npiCIkW96cQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-windows-arm64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.54.tgz", + "integrity": "sha512-M0kuUvXhot1zOISQGXwWn6YtS+Y/1RT9WrVIOywZnJHo3jCDyewAc79aKNQWFCQm+xNHVTq9h8dZKvygoXQQRg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-core-module": { + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", + "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", + "dev": true, + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/narrowing": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/narrowing/-/narrowing-1.5.0.tgz", + "integrity": "sha512-DUu4XdKgkfAPTAL28k79pdnshDE2W5T24QAnidSPo2F/W1TX6CjNzmEeXQfE5O1lxQvC0GYI6ZRDsLcyzugEYA==", + "dev": true + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/picocolors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", + "dev": true + }, + "node_modules/postcss": { + "version": "8.4.41", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.41.tgz", + "integrity": "sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.0.1", + "source-map-js": "^1.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/rollup": { + "version": "2.77.3", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.77.3.tgz", + "integrity": "sha512-/qxNTG7FbmefJWoeeYJFbHehJ2HNWnjkAFRKzWN/45eNBBF/r8lo992CwcJXEzyVxs5FmfId+vTSTQDb+bxA+g==", + "dev": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=10.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/source-map-js": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", + "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/vite": { + "version": "2.9.18", + "resolved": "https://registry.npmjs.org/vite/-/vite-2.9.18.tgz", + "integrity": "sha512-sAOqI5wNM9QvSEE70W3UGMdT8cyEn0+PmJMTFvTB8wB0YbYUWw3gUbY62AOyrXosGieF2htmeLATvNxpv/zNyQ==", + "dev": true, + "dependencies": { + "esbuild": "^0.14.27", + "postcss": "^8.4.13", + "resolve": "^1.22.0", + "rollup": ">=2.59.0 <2.78.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": ">=12.2.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + }, + "peerDependencies": { + "less": "*", + "sass": "*", + "stylus": "*" + }, + "peerDependenciesMeta": { + "less": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + } + } + }, + "node_modules/vite-plugin-wasm-pack": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/vite-plugin-wasm-pack/-/vite-plugin-wasm-pack-0.1.12.tgz", + "integrity": "sha512-WliYvQp9HXluir4OKGbngkcKxtYtifU11cqLurRRJGsl770Sjr1iIkp5RuvU3IC1poT4A57Z2/YgAKI2Skm7ZA==", + "dev": true, + "dependencies": { + "chalk": "^4.1.2", + "fs-extra": "^10.0.0", + "narrowing": "^1.4.0" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..cc87377 --- /dev/null +++ b/package.json @@ -0,0 +1,15 @@ +{ + "name": "vite-plugin-wasm-pack-example", + "version": "1.0.0", + "main": "index.js", + "license": "MIT", + "devDependencies": { + "vite": "^2.6.14", + "vite-plugin-wasm-pack": "^0.1.9" + }, + "scripts": { + "wasm": "wasm-pack build ./george --target web", + "dev": "vite", + "build": "vite build" + } +} diff --git a/public/blinkenlights.jpeg b/public/blinkenlights.jpeg new file mode 100644 index 0000000..682ebe9 Binary files /dev/null and b/public/blinkenlights.jpeg differ diff --git a/public/chevron.svg b/public/chevron.svg new file mode 100644 index 0000000..2df54da --- /dev/null +++ b/public/chevron.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/train.svg b/public/train.svg new file mode 100644 index 0000000..4124f40 --- /dev/null +++ b/public/train.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/index.ts b/src/index.ts new file mode 100644 index 0000000..69d2dba --- /dev/null +++ b/src/index.ts @@ -0,0 +1,231 @@ +//@ts-ignore +import init, { main } from "george"; + +async function run() { + await init(); + main(); +} + +run(); + +async function getManpage(command: string) { + const res = await fetch(`https://man.augustkline.com/${command}`, { + method: "GET", + credentials: "same-origin", + }); + const parser = new DOMParser(); + const json = await res.json(); + const html = window.atob(json["html"]); + const doc = parser.parseFromString(html, "text/html"); + return doc; +} + +const sendInput = async (event: SubmitEvent) => { + event.preventDefault(); + const form: HTMLFormElement = document.getElementById( + "man-input", + )! as HTMLFormElement; + + const input = form.elements[0] as HTMLInputElement; + const command_text = input.value; + input.value = ""; + const command = command_text.slice(4, command_text.length); + try { + await makeManpage(command); + makeEcho(command_text, false); + } catch (error) { + makeEcho(command_text, true); + } +}; + +const makeEcho = (command: string, error: boolean) => { + const results = document.getElementById("results")!; + const echo = document.createElement("div"); + const commandEl = document.createElement("code"); + commandEl.innerHTML = command; + const result = document.createElement("p"); + if (error) { + if (command.slice(0, 4) == "man ") { + result.innerHTML = `Unrecognized command ${command.slice(4, command.length)}`; + } else { + result.innerHTML = `Unrecognized command ${command}`; + } + echo.className += " error"; + } else { + result.innerHTML = `Opening man page for ${command.slice(4, command.length)}`; + } + echo.append(commandEl, result); + results.append(echo); + fadeIn(echo); +}; + +const fadeIn = (el: HTMLElement) => { + el.style.animation = "fade-in 0.3s"; +}; + +const fadeInFlex = (el: HTMLElement) => { + el.style.animation = "fade-in 0.5s, flex-in 0.8s"; +}; + +const makeManpage = async (command: string) => { + const demo = document.getElementById("man-demo")!; + const doc = await getManpage(command); + if (demo.children.length > 1) { + const h1 = document.createElement("h1"); + const desc = doc.getElementsByClassName("Pp")!.item(0)?.innerHTML; + const widget = document.getElementById("manpage-widget")!; + widget.scrollTop = 0; + h1.innerHTML = `${desc}`; + widget.innerHTML = ""; + widget.style.setProperty("opacity", "1"); + widget.append(h1, ...doc.body.children); + } else { + const h1 = document.createElement("h1"); + const desc = doc.getElementsByClassName("Pp")!.item(0)?.innerHTML; + const widget = document.createElement("div"); + widget.id = "manpage-widget"; + const container = document.createElement("div"); + container.id = "manpage-container"; + container.className = "widget"; + h1.innerHTML = `${desc}`; + widget.innerHTML = ""; + widget.style.setProperty("opacity", "1"); + widget.append(h1, ...doc.body.children); + container.append(widget); + demo.append(container); + fadeInFlex(container); + } +}; + +const typeAnim = () => { + let i = 0; + const txt = '"here\'s what I bring to the team"'; + const speed = 75; + const type = () => { + if (i < txt.length) { + document.getElementById("typed")!.innerHTML += txt.charAt(i); + i++; + setTimeout(type, speed); + } + }; + type(); +}; +setTimeout(typeAnim, 1000); + +const manTerm = document.getElementById("man-terminal")!; +const input = document.getElementById("man-input")! as HTMLFormElement; +manTerm.addEventListener("click", () => { + let prompt = input.children[1] as HTMLInputElement; + prompt.focus(); +}); + +const setTabIndices = () => { + const canvases = document.getElementsByTagName("canvas")!; + for (let canvas in canvases) { + canvases[canvas].setAttribute("tabIndex", "-1"); + } +}; + +window.addEventListener("load", () => { + // Wait for wasm to add canvas before changing indices + setTimeout(setTabIndices, 1000); +}); + +input!.addEventListener("submit", sendInput); + +const memoize = (fn) => { + let cache = {}; + return (...args) => { + let n = args[0]; + if (n in cache) { + return cache[n]; + } else { + let result = fn(n); + cache[n] = result; + return result; + } + }; +}; + +const getAboutWords = (): { + abouts: HTMLCollectionOf; + displays: HTMLCollectionOf; +} => { + let about = document.getElementById("about")!; + let abouts = about.getElementsByTagName( + "a", + )! as HTMLCollectionOf; + let aboutDisplay = document.getElementById("about-display")!; + let displays = aboutDisplay.getElementsByClassName( + "about", + )! as HTMLCollectionOf; + return { abouts, displays }; +}; + +const setAboutWordsMouseEnter = () => { + let { abouts, displays } = getAboutWords(); + for (let i = 0; i < abouts.length; i++) { + let word = abouts.item(i)!; + word.onmouseenter = () => { + for (let j = 0; j < abouts.length; j++) { + let display = displays.item(j)!; + if (word != abouts.item(j)) { + abouts.item(j)!.className = ""; + if (memoize(window.getComputedStyle(display)).opacity === "1") { + display.style.animation = "fade-out 0.3s forwards"; + } else { + display.style.opacity = "0"; + display.style.animation = ""; + } + display.style.pointerEvents = "none"; + } + } + word.className = "august-accent-underline"; + displays.item(i)!.style.animation = "fade-in 0.3s forwards"; + displays.item(i)!.style.pointerEvents = "all"; + }; + word.onclick = (ev) => { + ev.preventDefault(); + }; + } +}; + +const removeListenersMobile = () => { + let { abouts } = getAboutWords(); + for (let i = 0; i < abouts.length; i++) { + let word = abouts.item(i)!; + word.onmouseenter = null; + word.onclick = null; + } +}; + +const onResize = () => { + const mobile = window.matchMedia("all and (max-width: 70rem)").matches; + if (mobile) { + removeListenersMobile(); + setMobileAboutStyle(); + } else { + setAboutWordsMouseEnter(); + } +}; + +window.addEventListener("resize", onResize); + +const setMobileAboutStyle = () => { + const { abouts, displays } = getAboutWords(); + for (let i = 0; i < abouts.length; i++) { + abouts[i].className = ""; + displays[i].style.pointerEvents = "all"; + } +}; + +const onLoad = () => { + const mobile = window.matchMedia("all and (max-width: 70rem)").matches; + if (!mobile) { + setAboutWordsMouseEnter(); + } else { + setMobileAboutStyle(); + } +}; + +window.addEventListener("load", onLoad); diff --git a/style.css b/style.css new file mode 100644 index 0000000..1fccc9f --- /dev/null +++ b/style.css @@ -0,0 +1,712 @@ +:root { + /* UI Fonts */ + --ui-font-family: Inter, sans-serif; + --code-font-family: Hack, monospace; + font-family: var(--ui-font-family); + font-feature-settings: 'liga' 1, 'calt' 1; + + /* UI Colors */ + --accent-1: rgba(255, 255, 255, 0.05); + --accent-2: rgba(255, 255, 255, 0.1); + --accent-3: rgba(255, 255, 255, 0.15); + --widget-shadow: + inset 0 0 0 1px var(--accent-3), + 0 0.2rem 2rem rgba(255, 255, 255, 0.1); + --inner-border: inset 0 0 0 1px var(--accent-2); + --accent-bg: linear-gradient(95deg, var(--accent-3), var(--accent-1)); + --august-pink: oklch(80.67% 0.1 0); + --august-orange: oklch(80.67% 0.1 43); + --accent-grad: linear-gradient(120deg in oklab, var(--august-pink) 10%, var(--august-orange) 80%); + --font-color: white; + color-scheme: dark; + + /* Text Size Calculation */ + --min-fs: 1; + --max-fs: 1.5; + --min-vw: 20; + --max-vw: 45; + --min-fs-rem: var(--min-fs) * 1rem; + --max-fs-rem: var(--max-fs) * 1rem; + --min-vw-rem: var(--min-vw) * 1rem; + --slope: (var(--max-fs) - var(--min-fs)) * (100svi - var(--min-vw-rem)) / (var(--max-vw) - var(--min-vw)); + --font-size: clamp(var(--min-fs-rem), var(--min-fs-rem) + var(--slope), var(--max-fs-rem)); +} + +* { + color: var(--font-color); +} + +@supports (font-variation-settings: normal) { + :root { + font-family: InterVariable, sans-serif; + } +} + +::selection { + background-color: color-mix(in srgb, white, transparent 70%); +} + +a[href^='http'] { + text-decoration: none; + font-weight: 700; + + transition: color 0.3s ease; + + &:hover { + color: var(--august-pink) + } +} + +.chevron { + position: absolute; + inline-size: 3rem; + bottom: 5%; + left: 50%; + color: rgba(255, 255, 255, 0.8); + transform: translate(-50%, -50%); + animation: pullDown 5s cubic-bezier(0.77, 0, 0.175, 1) infinite; + animation-delay: 4s; +} + +@keyframes pullDown { + + from, + to { + bottom: 5%; + } + + 50% { + bottom: 2%; + } +} + + +body, +html { + font-size: calc(var(--font-size) * 0.8); + inline-size: 100%; + block-size: 100%; + margin: 0; + padding: 0; + overflow: auto; +} + +.august-accent { + background: var(--accent-grad); + color: transparent; + background-clip: text; + -webkit-background-clip: text; +} + +.august-accent-underline { + background-image: var(--accent-grad); + color: black; + background-size: 100% 100% !important; + background-repeat: no-repeat; + background-position: left bottom; +} + +body { + display: flex; + flex-direction: column; +} + +code { + font-family: var(--code-font-family); +} + +.background { + background: linear-gradient(160deg, #101010, #010101); +} + +.dots { + inline-size: 100%; + background-image: radial-gradient(rgba(255, 255, 255, 0.2) 1px, transparent 0); + background-size: 4rem 4rem; + background-position: 0.1rem 0; +} + +#typed { + animation: blink-cursor 1s step-end infinite; + padding-inline-end: 0.5ch; +} + +.echo { + color: var(--august-pink) +} + +.page { + --inner-padding: calc(var(--font-size) * 2); + + flex-direction: column; + display: flex; + position: relative; + padding: var(--inner-padding); + gap: var(--font-size); + + &:first-child, + &:last-child { + div { + margin: auto; + } + + block-size: calc(100svb - calc(2 * var(--inner-padding))); + + p { + font-size: calc(var(--font-size)); + } + + h1 { + margin-block: 0.5rem; + font-size: calc(4 * var(--font-size)); + + &.accent { + font-size: calc(1.5 * var(--font-size)); + align-self: start; + } + } + } + + &:nth-child(2) { + align-items: center; + + .about-menu { + flex: 0 1 50%; + + h1 { + font-size: calc(3 * var(--font-size)); + max-block-size: 2ch; + } + + p { + font-size: calc(var(--font-size) * 1.8); + font-weight: 300; + text-wrap: pretty; + padding: 1rem; + + a { + text-decoration: none; + padding-inline: 0.25rem; + font-weight: 500 !important; + background-size: 100% 2px; + background-image: var(--accent-grad); + background-repeat: no-repeat; + background-position: left bottom; + transition: background-size 0.3s ease, color 0.3s ease; + } + + } + } + + + + #about-display { + position: relative; + display: flex; + align-items: center; + justify-content: center; + flex: 0 1 50%; + block-size: 90%; + + &>:first-child { + pointer-events: all; + opacity: 1; + } + + &>:not(:first-child) { + pointer-events: none; + opacity: 0; + } + } + + + .about { + display: flex; + position: absolute; + flex-direction: column; + justify-content: space-between; + inline-size: 80%; + block-size: 100%; + + &>* { + border-radius: 1rem; + } + + img { + max-inline-size: 100%; + } + + &>:first-child { + max-block-size: 100%; + block-size: 100%; + overflow: hidden; + } + + p { + font-size: var(--font-size); + padding: 1rem; + } + + .train { + background: white; + padding: 1rem; + } + + .george { + background-color: #110500; + padding: 2.5rem 1rem; + + & canvas { + inline-size: 100%; + object-fit: contain; + image-rendering: pixelated; + z-index: -10; + + /* this is a bug with rust_minifb, + it makes 2 canvases for some reason... */ + &:nth-child(2) { + display: none; + } + + } + } + } + } +} + +#manpage-container { + display: flex; + overflow: hidden; +} + +#man-demo { + display: flex; + gap: var(--font-size); + + + a { + pointer-events: none; + } + + .terminal { + background: black; + position: relative; + display: flex; + justify-content: end; + flex-direction: column; + padding: var(--font-size); + min-block-size: calc(var(--font-size) * 6); + + &:not(:only-child) { + transition: flex 0.8s; + flex: 0 0 50%; + } + + &:only-child { + flex: 1; + } + + p { + margin: 0; + + &:nth-child(1) { + color: lightblue; + } + } + + input, + p { + font-size: inherit; + font-family: var(--code-font-family); + } + + + #results { + div { + margin-block: 1rem; + padding: 0.25rem 0.5rem; + overflow: hidden; + } + + p { + margin-block: 0.5rem; + + code { + color: var(--august-orange) + } + } + + .error { + background: #ff615920; + border-inline-start: solid 2px #ff6159; + } + + code { + color: lightblue; + } + } + + + form { + &>input { + inline-size: 100%; + background: transparent; + outline: none; + border: none; + } + + code { + color: pink; + } + } + } + + #manpage-widget { + --inner-padding: calc(var(--font-size)) calc(var(--font-size)); + overflow-y: auto; + overflow-x: hidden; + padding: 1rem; + + &>* { + margin-block-start: 0; + padding: var(--inner-padding); + } + + a { + pointer-events: none; + + ::after { + content: none; + } + } + + + #SYNOPSIS { + margin-block-start: 0 + } + + + h1 { + font-family: InterVariable, sans-serif; + font-size: var(--font-size); + font-weight: 400; + } + + &>h1 { + position: sticky; + top: 0; + background: #000a; + border-radius: 1rem; + box-shadow: var(--inner-border); + backdrop-filter: blur(10px); + -webkit-backdrop-filter: blur(0.5rem); + + &::before { + content: 'man'; + display: block; + align-self: start; + margin-block: 0 1rem; + font-size: calc(var(--font-size) * 0.8); + font-weight: 300; + text-align: center; + max-inline-size: 4ch; + border-radius: 0.3rem; + box-shadow: var(--inner-border); + background: var(--accent-bg); + padding: 0.2rem; + } + } + + + & .manual-text>section:first-child { + display: none; + } + + section>h1, + section>h2 { + text-transform: lowercase; + font-weight: 300; + font-style: italic; + } + + & * { + text-decoration: none; + } + + p:not(:has(*)) { + background: none; + border: none; + } + + .Bl-tag dd { + margin-block-end: 1rem; + } + + b, + i, + code, + pre { + font-family: var(--code-font-family); + + } + + table { + display: block; + overflow: auto; + + tbody { + display: inline-block; + } + + &:is(.head, .foot) { + display: none; + } + + &.Nm tr { + display: block; + gap: 1rem; + + } + + td:nth-child(1) { + padding-inline-end: 0.5rem; + } + + td:not(:has(*)) { + display: none; + } + + } + + section.Sh:nth-child(2) .Pp, + b:not(section.Sh:nth-child(2) .Pp b, dt b, pre b), + pre, + dt { + background: #fff3; + padding: 0.1rem 0.4rem; + border-radius: 0.3rem; + } + + .Pp { + display: inline-block; + } + + pre { + overflow: auto; + } + + dt { + display: inline-block; + margin-block: 0.4rem; + } + + } + +} + +.accent { + --spacing: calc(0.25 * var(--font-size)); + display: inline-block; + font-weight: 300; + border-radius: 0.3rem; + padding: var(--spacing) calc(var(--spacing) * 2); + box-shadow: var(--inner-border); + background: var(--accent-bg); + backdrop-filter: blur(0.5rem); + -webkit-backdrop-filter: blur(0.5rem); +} + +.widget { + position: relative; + background: black; + border-radius: 1rem; + box-shadow: inset 0 0 0 1px var(--accent-3), + 0 0.2rem 2rem rgba(255, 255, 255, 0.1); + + .traffic-lights { + --spacing: calc(0.5 * var(--font-size)); + position: absolute; + top: var(--spacing); + left: calc(var(--spacing) * 1.25); + user-select: none; + + .dot { + display: inline-block; + inline-size: var(--spacing); + block-size: var(--spacing); + margin-inline-end: 0.3rem; + background: red; + border-radius: 100%; + } + + .red { + background: #ff6159; + } + + .yellow { + background: #ffbd2e; + } + + .green { + background: #28c941; + } + } +} + +@keyframes blink-cursor { + + from, + to { + border-inline-end: 0.15rem solid transparent; + } + + 50% { + border-inline-end: 0.15rem solid white; + } + +} + + +@media all and (max-width: 60rem) { + .page { + &:nth-child(2) { + flex-direction: column; + + .about { + margin: 5svb auto; + inline-size: 90%; + position: relative; + opacity: 1 !important; + } + + #about-display { + display: contents; + } + } + } + + + #man-demo { + max-block-size: 80svb; + flex-direction: column; + + #manpage-widget>h1 { + position: relative; + } + } +} + +@media all and (min-width: 60rem) { + + body { + scroll-snap-type: block mandatory; + } + + .page { + flex-direction: row; + block-size: calc(100svb - calc(2 * var(--inner-padding))); + scroll-snap-align: center; + scroll-snap-stop: always; + + .page-desc { + h1 { + font-size: calc(var(--font-size)* 1.7); + } + + p { + font-size: calc(var(--font-size)* 1.1); + max-inline-size: 24ch; + } + } + + } +} + +@media all and (min-width: 60rem) and (max-width: 80rem) { + .page { + &:nth-child(3) { + flex-direction: row; + grid-template-columns: 4; + } + + &:nth-child(2) { + #about { + font-size: calc(var(--font-size) * 1.2); + } + + flex-direction: row; + grid-template-columns: 4; + } + + .page-desc { + + h1 { + font-size: calc(var(--font-size)* 1.3); + } + + p { + font-size: calc(var(--font-size)); + max-inline-size: 24ch; + } + } + } + + #man-demo { + min-inline-size: 50vi; + inline-size: 50vi; + flex-direction: column-reverse; + + .terminal:not(:only-child) { + transition: flex 0.8s; + flex: 0; + } + + } +} + + + +@media all and (min-width: 80rem) { + + .page:nth-child(3) { + justify-content: space-between; + } + + #man-demo { + flex-direction: row; + flex: 1; + max-inline-size: 60%; + justify-self: flex-end; + } +} + + +@keyframes fade-in { + from { + opacity: 0; + } + + to { + opacity: 1; + } +} + +@keyframes fade-out { + from { + opacity: 1; + } + + to { + opacity: 0; + } +} + +@keyframes flex-in { + from { + flex: 0; + } + + to { + flex: 1; + } +} diff --git a/vite.config.ts b/vite.config.ts new file mode 100644 index 0000000..d038284 --- /dev/null +++ b/vite.config.ts @@ -0,0 +1,9 @@ +import { defineConfig } from "vite"; +import wasmPack from "vite-plugin-wasm-pack"; + +export default defineConfig({ + build: { + minify: false, + }, + plugins: [wasmPack(["./george"])], +});