From b3de8da4bffc9a7f314841a589991ddfbf0b7d0d Mon Sep 17 00:00:00 2001 From: Christopher Biscardi Date: Fri, 30 Aug 2024 22:32:55 -0700 Subject: [PATCH] initial 0.7 site --- .github/workflows/deploy.yml | 34 ++ .github/workflows/release.yml | 68 ++++ .github/workflows/test.yml | 12 + .gitignore | 14 + .rustfmt.toml | 4 + Cargo.toml | 19 + crates/www/Cargo.toml | 108 +++++ crates/www/LICENSE | 24 ++ crates/www/README.md | 90 +++++ crates/www/end2end/package-lock.json | 167 ++++++++ crates/www/end2end/package.json | 15 + crates/www/end2end/playwright.config.ts | 105 +++++ crates/www/end2end/tests/example.spec.ts | 9 + crates/www/end2end/tsconfig.json | 109 +++++ crates/www/public/_redirects | 14 + crates/www/public/favicon.ico | Bin 0 -> 1512 bytes crates/www/public/logos/logo-c-mask.svg | 19 + crates/www/public/logos/logo-circle.svg | 19 + crates/www/public/logos/logo-full.svg | 20 + crates/www/public/logos/logo-rounded.svg | 19 + crates/www/public/logos/rust.svg | 1 + crates/www/public/rust-adventure.svg | 14 + crates/www/public/textures/binding-light.png | Bin 0 -> 21520 bytes crates/www/public/textures/concrete-wall.png | Bin 0 -> 49186 bytes crates/www/public/textures/cubes.png | Bin 0 -> 633 bytes crates/www/public/textures/dot-grid.webp | Bin 0 -> 4032 bytes .../www/public/textures/dust_scratches.webp | Bin 0 -> 22720 bytes crates/www/public/textures/micro_carbon.png | Bin 0 -> 80 bytes crates/www/public/textures/tactile_noise.webp | Bin 0 -> 1040 bytes crates/www/public/textures/webb.png | Bin 0 -> 12207 bytes crates/www/src/app.rs | 56 +++ crates/www/src/components.rs | 6 + crates/www/src/components/button.rs | 153 ++++++++ crates/www/src/components/footer.rs | 173 ++++++++ crates/www/src/components/progress_bar.rs | 160 ++++++++ crates/www/src/lib.rs | 12 + crates/www/src/main.rs | 38 ++ crates/www/src/routes.rs | 1 + crates/www/src/routes/index.rs | 303 ++++++++++++++ crates/www/style/input.css | 332 ++++++++++++++++ crates/www/tailwind.config.js | 371 ++++++++++++++++++ fly.toml | 37 ++ justfile | 4 + rust-toolchain.toml | 2 + 44 files changed, 2532 insertions(+) create mode 100644 .github/workflows/deploy.yml create mode 100644 .github/workflows/release.yml create mode 100644 .github/workflows/test.yml create mode 100644 .gitignore create mode 100644 .rustfmt.toml create mode 100644 Cargo.toml create mode 100644 crates/www/Cargo.toml create mode 100644 crates/www/LICENSE create mode 100644 crates/www/README.md create mode 100644 crates/www/end2end/package-lock.json create mode 100644 crates/www/end2end/package.json create mode 100644 crates/www/end2end/playwright.config.ts create mode 100644 crates/www/end2end/tests/example.spec.ts create mode 100644 crates/www/end2end/tsconfig.json create mode 100644 crates/www/public/_redirects create mode 100644 crates/www/public/favicon.ico create mode 100644 crates/www/public/logos/logo-c-mask.svg create mode 100644 crates/www/public/logos/logo-circle.svg create mode 100644 crates/www/public/logos/logo-full.svg create mode 100644 crates/www/public/logos/logo-rounded.svg create mode 100644 crates/www/public/logos/rust.svg create mode 100644 crates/www/public/rust-adventure.svg create mode 100644 crates/www/public/textures/binding-light.png create mode 100644 crates/www/public/textures/concrete-wall.png create mode 100644 crates/www/public/textures/cubes.png create mode 100644 crates/www/public/textures/dot-grid.webp create mode 100644 crates/www/public/textures/dust_scratches.webp create mode 100644 crates/www/public/textures/micro_carbon.png create mode 100644 crates/www/public/textures/tactile_noise.webp create mode 100644 crates/www/public/textures/webb.png create mode 100644 crates/www/src/app.rs create mode 100644 crates/www/src/components.rs create mode 100644 crates/www/src/components/button.rs create mode 100644 crates/www/src/components/footer.rs create mode 100644 crates/www/src/components/progress_bar.rs create mode 100644 crates/www/src/lib.rs create mode 100644 crates/www/src/main.rs create mode 100644 crates/www/src/routes.rs create mode 100644 crates/www/src/routes/index.rs create mode 100644 crates/www/style/input.css create mode 100644 crates/www/tailwind.config.js create mode 100644 fly.toml create mode 100644 justfile create mode 100644 rust-toolchain.toml diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml new file mode 100644 index 00000000..3b638a56 --- /dev/null +++ b/.github/workflows/deploy.yml @@ -0,0 +1,34 @@ +name: Deploy to Production +on: + release: + # type: released + # A release was published, or a pre-release was changed to a release. + types: [released] + # repository_dispatch: + # types: [deploy] + +jobs: + deploy: + name: Deploy to Fly.io and Netlify + runs-on: ubuntu-latest + steps: + - uses: superfly/flyctl-actions/setup-flyctl@master + - uses: dsaltares/fetch-gh-release-asset@master + with: + file: "static-assets.tar.gz" + - name: Un-tar static assets + run: tar -xzvf static-assets.tar.gz + - name: Publish to Netlify + uses: netlify/actions/cli@master + with: + args: deploy --dir=target/site --prod + env: + NETLIFY_SITE_ID: 92571a12-b93f-4e77-bf4e-744c8ccec4e5 + NETLIFY_AUTH_TOKEN: ${{ secrets.NETLIFY_AUTH_TOKEN }} + - uses: dsaltares/fetch-gh-release-asset@master + with: + file: "fly.toml" + - run: flyctl deploy --image $IMAGE_LABEL + env: + FLY_API_TOKEN: ${{ secrets.FLY_API_TOKEN }} + IMAGE_LABEL: registry.fly.io/christopherbiscardi:${{github.event.release.name}} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 00000000..12e674cd --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,68 @@ +name: Cut Release +on: + push: + branches: + - "wasm-main" + paths: + - "src/**" + - "Dockerfile" + - "style/**" + - "tailwind.config.js" + - "fly.toml" + - "public/**" + +jobs: + release: + name: Test, Release [Docker, GH] + runs-on: ubuntu-22.04 + steps: + - uses: actions/checkout@v3 + - uses: dtolnay/rust-toolchain@nightly + with: + toolchain: nightly-2024-08-10 + targets: "wasm32-unknown-unknown" + - uses: superfly/flyctl-actions/setup-flyctl@master + - uses: Swatinem/rust-cache@v2 + with: + # The prefix cache key, this can be changed to start a new cache manually. + prefix-key: "v0-rust" + + # A cache key that is used instead of the automatic `job`-based key, + # and is stable over multiple jobs. + # default: empty + # shared-key: "" + - name: "Install cargo-leptos" + run: curl --proto '=https' --tlsv1.2 -LsSf https://leptos-rs.artifacts.axodotdev.host/cargo-leptos/v0.2.12/cargo-leptos-installer.sh | sh + - run: cargo leptos test + - run: cargo leptos build --release + env: + CDN_PATH: https://cdn.christopherbiscardi.com + CDN_PKG_PATH: https://cdn.christopherbiscardi.com/pkg + LEPTOS_HASH_FILES: true + - name: Get current date + id: date + run: | + echo "date=$(date +'%Y-%m-%d')" >> $GITHUB_ENV + - name: Publish Docker Image to Fly.io + run: flyctl deploy --build-only --push --image-label $IMAGE_LABEL + env: + FLY_API_TOKEN: ${{ secrets.FLY_API_TOKEN }} + IMAGE_LABEL: gh-${{ env.date }}-${{ github.sha }} + - name: Tar static files + run: | + tar -czvf static-assets.tar.gz target/site + - name: Publish GitHub Release + id: gh-release + uses: softprops/action-gh-release@v1 + with: + name: gh-${{ env.date }}-${{ github.sha }} + fail_on_unmatched_files: true + target_commitish: main + tag_name: ${{env.date}}-${{ github.sha }} + token: ${{ secrets.RELEASE_TOKEN }} + files: | + Cargo.toml + target/release/this-week-in-bevy + static-assets.tar.gz + target/release/hash.txt + fly.toml diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 00000000..108b9bd0 --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,12 @@ +name: test suite +on: [pull_request] + +jobs: + test: + name: cargo leptos test + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: dtolnay/rust-toolchain@nightly + - run: cargo install cargo-leptos + - run: cargo leptos test diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..6985cf1b --- /dev/null +++ b/.gitignore @@ -0,0 +1,14 @@ +# Generated by Cargo +# will have compiled files and executables +debug/ +target/ + +# Remove Cargo.lock from gitignore if creating an executable, leave it for libraries +# More information here https://doc.rust-lang.org/cargo/guide/cargo-toml-vs-cargo-lock.html +Cargo.lock + +# These are backup files generated by rustfmt +**/*.rs.bk + +# MSVC Windows builds of rustc generate these, which store debugging information +*.pdb diff --git a/.rustfmt.toml b/.rustfmt.toml new file mode 100644 index 00000000..ea35942d --- /dev/null +++ b/.rustfmt.toml @@ -0,0 +1,4 @@ +max_width = 60 +wrap_comments = true +comment_width = 50 +fn_call_width = 40 diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 00000000..2264dd29 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,19 @@ +[workspace] +resolver = "2" +members = ["crates/*"] + + +# Defines a size-optimized profile for the WASM bundle in release mode +[profile.wasm-release] +inherits = "release" +opt-level = 'z' +lto = true +codegen-units = 1 +panic = "abort" + + +# [patch.crates-io] +# # leptos = { version = "0.7.0-beta" +# leptos = { git = "https://github.com/leptos-rs/leptos", branch = "leptos_0.7" } +# leptos_axum = { git = "https://github.com/leptos-rs/leptos", branch = "leptos_0.7" } +# leptos_router = { git = "https://github.com/leptos-rs/leptos", branch = "leptos_0.7" } diff --git a/crates/www/Cargo.toml b/crates/www/Cargo.toml new file mode 100644 index 00000000..9dc709f5 --- /dev/null +++ b/crates/www/Cargo.toml @@ -0,0 +1,108 @@ +[package] +name = "www" +version = "0.1.0" +edition = "2021" + +[lib] +crate-type = ["cdylib", "rlib"] + +[dependencies] +leptos_meta = { git = "https://github.com/leptos-rs/leptos", branch = "leptos_0.7" } +axum = { version = "0.7", optional = true } +console_error_panic_hook = "0.1" +leptos = { git = "https://github.com/leptos-rs/leptos", branch = "leptos_0.7", features = [ + "nightly", + "experimental-islands", +] } +leptos_axum = { git = "https://github.com/leptos-rs/leptos", branch = "leptos_0.7", optional = true } +leptos_router = { git = "https://github.com/leptos-rs/leptos", branch = "leptos_0.7", features = [ + "nightly", +] } +leptos-use = { git = "https://github.com/Synphonyte/leptos-use.git", branch = "leptos-0.7" } +tokio = { version = "1", features = ["rt-multi-thread"], optional = true } +tower = { version = "0.4", optional = true } +tower-http = { version = "0.5", features = ["fs"], optional = true } +wasm-bindgen = "=0.2.92" +thiserror = "1" +tracing = { version = "0.1", optional = true } +http = "1" + + +[features] +hydrate = ["leptos/hydrate"] +ssr = [ + "dep:axum", + "dep:tokio", + "dep:tower", + "dep:tower-http", + "dep:leptos_axum", + "leptos/ssr", + "leptos_meta/ssr", + "leptos_router/ssr", + "dep:tracing", +] + + +[package.metadata.leptos] +# The name used by wasm-bindgen/cargo-leptos for the JS/WASM bundle. Defaults to the crate name +output-name = "www" + +# The site root folder is where cargo-leptos generate all output. WARNING: all content of this folder will be erased on a rebuild. Use it in your server setup. +site-root = "target/site" + +# The site-root relative folder where all compiled output (JS, WASM and CSS) is written +# Defaults to pkg +site-pkg-dir = "pkg" + +# [Optional] The source CSS file. If it ends with .sass or .scss then it will be compiled by dart-sass into CSS. The CSS is optimized by Lightning CSS before being written to //app.css +# style-file = "style/main.scss" +tailwind-input-file = "style/input.css" + +# Assets source dir. All files found here will be copied and synchronized to site-root. +# The assets-dir cannot have a sub directory with the same name/path as site-pkg-dir. +# +# Optional. Env: LEPTOS_ASSETS_DIR. +assets-dir = "public" + +# The IP and port (ex: 127.0.0.1:3000) where the server serves the content. Use it in your server setup. +site-addr = "127.0.0.1:3000" + +# The port to use for automatic reload monitoring +reload-port = 3001 + +# [Optional] Command to use when running end2end tests. It will run in the end2end dir. +# [Windows] for non-WSL use "npx.cmd playwright test" +# This binary name can be checked in Powershell with Get-Command npx +end2end-cmd = "npx playwright test" +end2end-dir = "end2end" + +# The browserlist query used for optimizing the CSS. +browserquery = "defaults" + +# The environment Leptos will run in, usually either "DEV" or "PROD" +env = "DEV" + +# The features to use when compiling the bin target +# +# Optional. Can be over-ridden with the command line parameter --bin-features +bin-features = ["ssr"] + +# If the --no-default-features flag should be used when compiling the bin target +# +# Optional. Defaults to false. +bin-default-features = false + +# The features to use when compiling the lib target +# +# Optional. Can be over-ridden with the command line parameter --lib-features +lib-features = ["hydrate"] + +# If the --no-default-features flag should be used when compiling the lib target +# +# Optional. Defaults to false. +lib-default-features = false + +# The profile to use for the lib target when compiling for release +# +# Optional. Defaults to "release". +lib-profile-release = "wasm-release" diff --git a/crates/www/LICENSE b/crates/www/LICENSE new file mode 100644 index 00000000..fdddb29a --- /dev/null +++ b/crates/www/LICENSE @@ -0,0 +1,24 @@ +This is free and unencumbered software released into the public domain. + +Anyone is free to copy, modify, publish, use, compile, sell, or +distribute this software, either in source code form or as a compiled +binary, for any purpose, commercial or non-commercial, and by any +means. + +In jurisdictions that recognize copyright laws, the author or authors +of this software dedicate any and all copyright interest in the +software to the public domain. We make this dedication for the benefit +of the public at large and to the detriment of our heirs and +successors. We intend this dedication to be an overt act of +relinquishment in perpetuity of all present and future rights to this +software under copyright law. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +For more information, please refer to diff --git a/crates/www/README.md b/crates/www/README.md new file mode 100644 index 00000000..b1d5de23 --- /dev/null +++ b/crates/www/README.md @@ -0,0 +1,90 @@ + + + Leptos Logo + + +# Leptos Axum Starter Template + +This is a template for use with the [Leptos](https://github.com/leptos-rs/leptos) web framework and the [cargo-leptos](https://github.com/akesson/cargo-leptos) tool using [Axum](https://github.com/tokio-rs/axum). + +## Creating your template repo + +If you don't have `cargo-leptos` installed you can install it with + +```bash +cargo install cargo-leptos --locked +``` + +Then run +```bash +cargo leptos new --git https://github.com/leptos-rs/start-axum-0.7 +``` + +to generate a new project template. + +```bash +cd www +``` + +to go to your newly created project. +Feel free to explore the project structure, but the best place to start with your application code is in `src/app.rs`. +Addtionally, Cargo.toml may need updating as new versions of the dependencies are released, especially if things are not working after a `cargo update`. + +## Running your project + +```bash +cargo leptos watch +``` + +## Installing Additional Tools + +By default, `cargo-leptos` uses `nightly` Rust, `cargo-generate`, and `sass`. If you run into any trouble, you may need to install one or more of these tools. + +1. `rustup toolchain install nightly --allow-downgrade` - make sure you have Rust nightly +2. `rustup target add wasm32-unknown-unknown` - add the ability to compile Rust to WebAssembly +3. `cargo install cargo-generate` - install `cargo-generate` binary (should be installed automatically in future) +4. `npm install -g sass` - install `dart-sass` (should be optional in future + +## Compiling for Release +```bash +cargo leptos build --release +``` + +Will generate your server binary in target/server/release and your site package in target/site + +## Testing Your Project +```bash +cargo leptos end-to-end +``` + +```bash +cargo leptos end-to-end --release +``` + +Cargo-leptos uses Playwright as the end-to-end test tool. +Tests are located in end2end/tests directory. + +## Executing a Server on a Remote Machine Without the Toolchain +After running a `cargo leptos build --release` the minimum files needed are: + +1. The server binary located in `target/server/release` +2. The `site` directory and all files within located in `target/site` + +Copy these files to your remote server. The directory structure should be: +```text +www +site/ +``` +Set the following environment variables (updating for your project as needed): +```text +LEPTOS_OUTPUT_NAME="www" +LEPTOS_SITE_ROOT="site" +LEPTOS_SITE_PKG_DIR="pkg" +LEPTOS_SITE_ADDR="127.0.0.1:3000" +LEPTOS_RELOAD_PORT="3001" +``` +Finally, run the server binary. + +## Licensing + +This template itself is released under the Unlicense. You should replace the LICENSE for your own application with an appropriate license if you plan to release it publicly. diff --git a/crates/www/end2end/package-lock.json b/crates/www/end2end/package-lock.json new file mode 100644 index 00000000..260e8eb1 --- /dev/null +++ b/crates/www/end2end/package-lock.json @@ -0,0 +1,167 @@ +{ + "name": "end2end", + "version": "1.0.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "end2end", + "version": "1.0.0", + "license": "ISC", + "devDependencies": { + "@playwright/test": "^1.44.1", + "@types/node": "^20.12.12", + "typescript": "^5.4.5" + } + }, + "node_modules/@playwright/test": { + "version": "1.44.1", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.44.1.tgz", + "integrity": "sha512-1hZ4TNvD5z9VuhNJ/walIjvMVvYkZKf71axoF/uiAqpntQJXpG64dlXhoDXE3OczPuTuvjf/M5KWFg5VAVUS3Q==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "playwright": "1.44.1" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@types/node": { + "version": "20.12.12", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.12.tgz", + "integrity": "sha512-eWLDGF/FOSPtAvEqeRAQ4C8LSA7M1I7i0ky1I8U7kD1J5ITyW3AsRhQrKVoWf5pFKZ2kILsEGJhsI9r93PYnOw==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/playwright": { + "version": "1.44.1", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.44.1.tgz", + "integrity": "sha512-qr/0UJ5CFAtloI3avF95Y0L1xQo6r3LQArLIg/z/PoGJ6xa+EwzrwO5lpNr/09STxdHuUoP2mvuELJS+hLdtgg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "playwright-core": "1.44.1" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=16" + }, + "optionalDependencies": { + "fsevents": "2.3.2" + } + }, + "node_modules/playwright-core": { + "version": "1.44.1", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.44.1.tgz", + "integrity": "sha512-wh0JWtYTrhv1+OSsLPgFzGzt67Y7BE/ZS3jEqgGBlp2ppp1ZDj8c+9IARNW4dwf1poq5MgHreEM2KV/GuR4cFA==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "playwright-core": "cli.js" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/typescript": { + "version": "5.4.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", + "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true, + "license": "MIT" + } + }, + "dependencies": { + "@playwright/test": { + "version": "1.44.1", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.44.1.tgz", + "integrity": "sha512-1hZ4TNvD5z9VuhNJ/walIjvMVvYkZKf71axoF/uiAqpntQJXpG64dlXhoDXE3OczPuTuvjf/M5KWFg5VAVUS3Q==", + "dev": true, + "requires": { + "playwright": "1.44.1" + } + }, + "@types/node": { + "version": "20.12.12", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.12.tgz", + "integrity": "sha512-eWLDGF/FOSPtAvEqeRAQ4C8LSA7M1I7i0ky1I8U7kD1J5ITyW3AsRhQrKVoWf5pFKZ2kILsEGJhsI9r93PYnOw==", + "dev": true, + "requires": { + "undici-types": "~5.26.4" + } + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true + }, + "playwright": { + "version": "1.44.1", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.44.1.tgz", + "integrity": "sha512-qr/0UJ5CFAtloI3avF95Y0L1xQo6r3LQArLIg/z/PoGJ6xa+EwzrwO5lpNr/09STxdHuUoP2mvuELJS+hLdtgg==", + "dev": true, + "requires": { + "fsevents": "2.3.2", + "playwright-core": "1.44.1" + } + }, + "playwright-core": { + "version": "1.44.1", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.44.1.tgz", + "integrity": "sha512-wh0JWtYTrhv1+OSsLPgFzGzt67Y7BE/ZS3jEqgGBlp2ppp1ZDj8c+9IARNW4dwf1poq5MgHreEM2KV/GuR4cFA==", + "dev": true + }, + "typescript": { + "version": "5.4.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", + "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", + "dev": true + }, + "undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true + } + } +} diff --git a/crates/www/end2end/package.json b/crates/www/end2end/package.json new file mode 100644 index 00000000..a80ac597 --- /dev/null +++ b/crates/www/end2end/package.json @@ -0,0 +1,15 @@ +{ + "name": "end2end", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": {}, + "keywords": [], + "author": "", + "license": "ISC", + "devDependencies": { + "@playwright/test": "^1.44.1", + "@types/node": "^20.12.12", + "typescript": "^5.4.5" + } +} diff --git a/crates/www/end2end/playwright.config.ts b/crates/www/end2end/playwright.config.ts new file mode 100644 index 00000000..aee2d46f --- /dev/null +++ b/crates/www/end2end/playwright.config.ts @@ -0,0 +1,105 @@ +import type { PlaywrightTestConfig } from "@playwright/test"; +import { devices, defineConfig } from "@playwright/test"; + +/** + * Read environment variables from file. + * https://github.com/motdotla/dotenv + */ +// require('dotenv').config(); + +/** + * See https://playwright.dev/docs/test-configuration. + */ +export default defineConfig({ + testDir: "./tests", + /* Maximum time one test can run for. */ + timeout: 30 * 1000, + expect: { + /** + * Maximum time expect() should wait for the condition to be met. + * For example in `await expect(locator).toHaveText();` + */ + timeout: 5000, + }, + /* Run tests in files in parallel */ + fullyParallel: true, + /* Fail the build on CI if you accidentally left test.only in the source code. */ + forbidOnly: !!process.env.CI, + /* Retry on CI only */ + retries: process.env.CI ? 2 : 0, + /* Opt out of parallel tests on CI. */ + workers: process.env.CI ? 1 : undefined, + /* Reporter to use. See https://playwright.dev/docs/test-reporters */ + reporter: "html", + /* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */ + use: { + /* Maximum time each action such as `click()` can take. Defaults to 0 (no limit). */ + actionTimeout: 0, + /* Base URL to use in actions like `await page.goto('/')`. */ + // baseURL: 'http://localhost:3000', + + /* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */ + trace: "on-first-retry", + }, + + /* Configure projects for major browsers */ + projects: [ + { + name: "chromium", + use: { + ...devices["Desktop Chrome"], + }, + }, + + { + name: "firefox", + use: { + ...devices["Desktop Firefox"], + }, + }, + + { + name: "webkit", + use: { + ...devices["Desktop Safari"], + }, + }, + + /* Test against mobile viewports. */ + // { + // name: 'Mobile Chrome', + // use: { + // ...devices['Pixel 5'], + // }, + // }, + // { + // name: 'Mobile Safari', + // use: { + // ...devices['iPhone 12'], + // }, + // }, + + /* Test against branded browsers. */ + // { + // name: 'Microsoft Edge', + // use: { + // channel: 'msedge', + // }, + // }, + // { + // name: 'Google Chrome', + // use: { + // channel: 'chrome', + // }, + // }, + ], + + /* Folder for test artifacts such as screenshots, videos, traces, etc. */ + // outputDir: 'test-results/', + + /* Run your local dev server before starting the tests */ + // webServer: { + // command: 'npm run start', + // port: 3000, + // }, +}); diff --git a/crates/www/end2end/tests/example.spec.ts b/crates/www/end2end/tests/example.spec.ts new file mode 100644 index 00000000..0139fc30 --- /dev/null +++ b/crates/www/end2end/tests/example.spec.ts @@ -0,0 +1,9 @@ +import { test, expect } from "@playwright/test"; + +test("homepage has title and heading text", async ({ page }) => { + await page.goto("http://localhost:3000/"); + + await expect(page).toHaveTitle("Welcome to Leptos"); + + await expect(page.locator("h1")).toHaveText("Welcome to Leptos!"); +}); diff --git a/crates/www/end2end/tsconfig.json b/crates/www/end2end/tsconfig.json new file mode 100644 index 00000000..e075f973 --- /dev/null +++ b/crates/www/end2end/tsconfig.json @@ -0,0 +1,109 @@ +{ + "compilerOptions": { + /* Visit https://aka.ms/tsconfig to read more about this file */ + + /* Projects */ + // "incremental": true, /* Save .tsbuildinfo files to allow for incremental compilation of projects. */ + // "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */ + // "tsBuildInfoFile": "./.tsbuildinfo", /* Specify the path to .tsbuildinfo incremental compilation file. */ + // "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects. */ + // "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */ + // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */ + + /* Language and Environment */ + "target": "es2016", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */ + // "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ + // "jsx": "preserve", /* Specify what JSX code is generated. */ + // "experimentalDecorators": true, /* Enable experimental support for legacy experimental decorators. */ + // "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */ + // "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h'. */ + // "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */ + // "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using 'jsx: react-jsx*'. */ + // "reactNamespace": "", /* Specify the object invoked for 'createElement'. This only applies when targeting 'react' JSX emit. */ + // "noLib": true, /* Disable including any library files, including the default lib.d.ts. */ + // "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */ + // "moduleDetection": "auto", /* Control what method is used to detect module-format JS files. */ + + /* Modules */ + "module": "commonjs", /* Specify what module code is generated. */ + // "rootDir": "./", /* Specify the root folder within your source files. */ + // "moduleResolution": "node10", /* Specify how TypeScript looks up a file from a given module specifier. */ + // "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */ + // "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */ + // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */ + // "typeRoots": [], /* Specify multiple folders that act like './node_modules/@types'. */ + // "types": [], /* Specify type package names to be included without being referenced in a source file. */ + // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ + // "moduleSuffixes": [], /* List of file name suffixes to search when resolving a module. */ + // "allowImportingTsExtensions": true, /* Allow imports to include TypeScript file extensions. Requires '--moduleResolution bundler' and either '--noEmit' or '--emitDeclarationOnly' to be set. */ + // "resolvePackageJsonExports": true, /* Use the package.json 'exports' field when resolving package imports. */ + // "resolvePackageJsonImports": true, /* Use the package.json 'imports' field when resolving imports. */ + // "customConditions": [], /* Conditions to set in addition to the resolver-specific defaults when resolving imports. */ + // "resolveJsonModule": true, /* Enable importing .json files. */ + // "allowArbitraryExtensions": true, /* Enable importing files with any extension, provided a declaration file is present. */ + // "noResolve": true, /* Disallow 'import's, 'require's or ''s from expanding the number of files TypeScript should add to a project. */ + + /* JavaScript Support */ + // "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */ + // "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */ + // "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */ + + /* Emit */ + // "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */ + // "declarationMap": true, /* Create sourcemaps for d.ts files. */ + // "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */ + // "sourceMap": true, /* Create source map files for emitted JavaScript files. */ + // "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */ + // "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output. */ + // "outDir": "./", /* Specify an output folder for all emitted files. */ + // "removeComments": true, /* Disable emitting comments. */ + // "noEmit": true, /* Disable emitting files from a compilation. */ + // "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */ + // "importsNotUsedAsValues": "remove", /* Specify emit/checking behavior for imports that are only used for types. */ + // "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */ + // "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */ + // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ + // "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */ + // "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */ + // "newLine": "crlf", /* Set the newline character for emitting files. */ + // "stripInternal": true, /* Disable emitting declarations that have '@internal' in their JSDoc comments. */ + // "noEmitHelpers": true, /* Disable generating custom helper functions like '__extends' in compiled output. */ + // "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */ + // "preserveConstEnums": true, /* Disable erasing 'const enum' declarations in generated code. */ + // "declarationDir": "./", /* Specify the output directory for generated declaration files. */ + // "preserveValueImports": true, /* Preserve unused imported values in the JavaScript output that would otherwise be removed. */ + + /* Interop Constraints */ + // "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */ + // "verbatimModuleSyntax": true, /* Do not transform or elide any imports or exports not marked as type-only, ensuring they are written in the output file's format based on the 'module' setting. */ + // "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */ + "esModuleInterop": true, /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */ + // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */ + "forceConsistentCasingInFileNames": true, /* Ensure that casing is correct in imports. */ + + /* Type Checking */ + "strict": true, /* Enable all strict type-checking options. */ + // "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied 'any' type. */ + // "strictNullChecks": true, /* When type checking, take into account 'null' and 'undefined'. */ + // "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */ + // "strictBindCallApply": true, /* Check that the arguments for 'bind', 'call', and 'apply' methods match the original function. */ + // "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */ + // "noImplicitThis": true, /* Enable error reporting when 'this' is given the type 'any'. */ + // "useUnknownInCatchVariables": true, /* Default catch clause variables as 'unknown' instead of 'any'. */ + // "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */ + // "noUnusedLocals": true, /* Enable error reporting when local variables aren't read. */ + // "noUnusedParameters": true, /* Raise an error when a function parameter isn't read. */ + // "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */ + // "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */ + // "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */ + // "noUncheckedIndexedAccess": true, /* Add 'undefined' to a type when accessed using an index. */ + // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */ + // "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type. */ + // "allowUnusedLabels": true, /* Disable error reporting for unused labels. */ + // "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */ + + /* Completeness */ + // "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */ + "skipLibCheck": true /* Skip type checking all .d.ts files. */ + } +} diff --git a/crates/www/public/_redirects b/crates/www/public/_redirects new file mode 100644 index 00000000..c546bae3 --- /dev/null +++ b/crates/www/public/_redirects @@ -0,0 +1,14 @@ +/post/codeblocks,-mdx,-and-mdx-utils /post/codeblocks-mdx-and-mdx-utils +/post/design-systems-people,-processes,-and-emergent-behavior /post/design-systems-people-processes-and-emergent-behavior +/post/gatsby-themes,-webpack-loaders,-and-npm-packages /post/gatsby-themes-webpack-loaders-and-npm-packages +/post/kafka,-kube,-and-statefulsets-on-gke /post/kafka-kube-and-statefulsets-on-gke +/post/notes-on-parsing-the-graph-ql-sdl /post/notes-on-parsing-the-graphql-sdl +/posts /post +/post/manipulating-gatsby-page-context-with-on-create-page /post/manipulating-gatsby-page-context-with-oncreatepage +/post/a-first-look-at-fauna-db /post/a-first-look-at-faunadb +/post/using-mdxp-rovider-host-elements-in-react-live-scope /post/using-mdxprovider-host-elements-in-react-live-scope +/post/creating-mdx-nodes-from-raw-strings /post/creating-mdx-nodes-from-raw-strings-and-nodes +/post/if-you-can-t-delete-code-then-you-re-stuck-with-it /post/if-you-cant-delete-code-then-youre-stuck-with-it +/post/shipping-multi-package-repos-with-git-hub-actions-changesets-and-lerna /post/shipping-multipackage-repos-with-github-actions-changesets-and-lerna +/feed /rss.xml +/rss /rss.xml \ No newline at end of file diff --git a/crates/www/public/favicon.ico b/crates/www/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..00eb0877530bb12442b8f5bfa52ea1370896fc03 GIT binary patch literal 1512 zcmVP)noVn8j>k`zlU3Julb zi}D2F#Yd7R{s;9z&?jS15<(w}A1}g7(?rYGHw+(vbc@@Ct)(Rt+HQB|`a84Tb#`}V zcW1ZfVLt9X=iJ|%uY1ohl|lNGt_Ith@6^nDNmHXH9b)2;sKWCEo+pSY%G>mi>Zl&% ztpl;3%W$az`t<3Q_SC&ow&oK|dZ#8V?ML-QMknAkg8|IAju5FIX~TvK%wI3~iMhx9 zl`nDWzCLB$8R@|aUumtI+`@U!E3o{2aP9#pl{YIOBc#K*wRJR}1hIoZ30Pg9m}jirm%(GEzado;3TK~c1E_b?63cU+;wrkPR@11e z-I0jRpe)f3qSC}3q}s7UZz0Cfx{Ax}KmfVl0VxsLwf zmBj^RZ(Tu+rgKX00<{sKj#dupPgP3;Mm;4;-4GUbrxo^y^Z&F+z4&vC@l z`Kl02Q&liQ7dOgA$b@Y|0Ot(zW&|5f3guFSSJ8K{)UyIvSBh>imWh;0;X=Yx671t# zP2W^C(n7^KESbn!!Jjet3UvUl!Q<31fVl5lxNkW?i9$=On7DF6uhXyb+s+z+FB0hI zVX0?SK?*OeYTG6~oZd~*$^8@J%BX>Tu+%c+M!twxlI)wtHd84*e) zS@*|Jx6theJ(RRu$KX`E*Ql17QS^PKlk9z0u+3CLV~;xM=GYh6pi&A)Mh|gpX`4qg zS|Ulsy97&>y!YkkwY8#Ku+oG00nB(fNt1&m1q>ZBcp^DEJYWAX>L`MmRSsFY3Re1@ zCTD!x)JXj%x*)n8U{2dE9dZ$plJK)yTZGGdT8pJ3pV7?h7Hsb8{7=@osJSS`GhL^Oty(fL zx1zI?XB(u&0=T`lwj1S)p6(swd>6j^<;3&3hA5N|0o9=FeQx + + + + + + + + + + + + + + + + + + diff --git a/crates/www/public/logos/logo-circle.svg b/crates/www/public/logos/logo-circle.svg new file mode 100644 index 00000000..0221dc53 --- /dev/null +++ b/crates/www/public/logos/logo-circle.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/crates/www/public/logos/logo-full.svg b/crates/www/public/logos/logo-full.svg new file mode 100644 index 00000000..396fbac4 --- /dev/null +++ b/crates/www/public/logos/logo-full.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/crates/www/public/logos/logo-rounded.svg b/crates/www/public/logos/logo-rounded.svg new file mode 100644 index 00000000..4709db1a --- /dev/null +++ b/crates/www/public/logos/logo-rounded.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/crates/www/public/logos/rust.svg b/crates/www/public/logos/rust.svg new file mode 100644 index 00000000..9e2f0fd0 --- /dev/null +++ b/crates/www/public/logos/rust.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/crates/www/public/rust-adventure.svg b/crates/www/public/rust-adventure.svg new file mode 100644 index 00000000..d69c921a --- /dev/null +++ b/crates/www/public/rust-adventure.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/crates/www/public/textures/binding-light.png b/crates/www/public/textures/binding-light.png new file mode 100644 index 0000000000000000000000000000000000000000..c41860c2b11d28ac1e57cf91af209358bc77199b GIT binary patch literal 21520 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

E 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 P00000NkvXXu0mjfL1?p_ literal 0 HcmV?d00001 diff --git a/crates/www/public/textures/cubes.png b/crates/www/public/textures/cubes.png new file mode 100644 index 0000000000000000000000000000000000000000..cfd79110639b72f96f028efdba77979408402368 GIT binary patch literal 633 zcmeAS@N?(olHy`uVBq!ia0vp^&On^P!3-o{?X5izq_hHjLR^9Lbuc)1@Zjakmx0V{ z*RBB>K=SI7srr_ zTW_b|EqZLg;r3P1iMjCp|I*n@Zq;R{8+2J)Zx**Q|5@zE!o;Swj23wL~`^Qh;KI`q)3(LHJ z`q@vr&bvBUaS_`L)?|s^RvVe}ORiU5b2N7+bk3W#{qx7md@n3RC3{*8bG~oOZcARc zz&c_{Y_R2(3D}Lj+`m7$ z@YDWA!^quY36^RL-Y#bFW?ZtCb!&2__rVgM;~@0Mo^Q9M zd1dCC@2+z^C6r_??Ef_J%v8~f?9LvKD}U-%aJX*Sw`6h$^R);|b&lN<7sLwZT>hf} ztu~R7@3YSH*twg`*&q15duXf4}^MUv>2W{sH($?t%R`>reUL zOaGn!vi+U-0R4gg|JftRPC4r(Cxs=BSKmt*~Vn^v*rFe&Jz0dfhZNjVClQ~oTHrak|}azbqU zRu&&O29*bU`qFJ?Yq!{ak>38a$>=)MC!p~$qe6AW5Hv8!@=<@(qkuEoAP@LKRNDI6pu93S=XFF{@ki1 z8suMxEZXRCo8|(3F$W1C!RuMyUf6=8HT@&hEy@rjgmD5Xe%qo$P!iEOKpCdU!N^$V z&8oCQk&6+6;stf$E(%zk*f8$`#Zwym>HOB@Ol>$#CAx#q#2@X-qLJpBt2*o^CJtg&`&g{C_I6{>4Qc<{_NcgzhzI9 zwCTxxk5mPDXDI9+?aHE&=9;TI^N2s&gl*1PAj50h>I#CZKpre)#RR9eOvleE4WXo$ zc{KK?V0aG&S09zb5o>p~Nc(p8@RLybROw0l&k(rOz$BYFv4e~lYpIpPJbjiYNgW%v zt&0=s7Gvp==9;Tm$5J2d%A%2?>%U}=_|3B{;-5|$6(DrjnCz9-UIGnGVB19xKOq!C zr?i+%R=6rR=Tb}!S$&la7M6*BoFcl(FUyVUi`r%Av_~yUgHVu2klnd^7$|2ZiT5%3 zo`ygG{`~b+q;dRoG5A9+Y_XwiktsNc-6=2*U1;=u27t-OGLK7YzFB8qoShSWXtb(u zP?WB_&qlcr4viyi#^|3p`JEl%s+hIj=LwkN^%in6o=JI~j42#s>%^`9%?h#L79$GJ z87M!Z%l^eAlyBOtKGz}f(Z8ZeYLr4ggRV2alyct*p;~K3GIGp&6-W&_M3&I^;|?A(a`r9o#(Pi$fh!fGEaJNL9vaV{QlPA2I%(>#;tr2J?-e>e zM&u@QPNSc+B@i`Amjt_eD?P!TMT?(i!7IuQoD*~Y@cvXA77)UH78{n`b)D5D{g{`U zyv;m!;K1+Zv2ERK8i>^Ohn3)O-7UOAoA};*q}`-a%Fr}s0v*g@UpZ2G3F_qAg>m}^ zN3zYF&ZM7r`rUb};2yWp8Oxc~I>QHi2PcOj__Lv;Rx-SJyd?~T)6unhB7F~kjT)I= zLwRHq3gIxuFXd|2EqH%WHtafI--`YTN{?ih@a=YFV$Gh#FiDI7fB*oR?2QTygCYI6 zcEjMiODFvn{}i0wm&5TSZ#bmXMKP^=)chn6NnHqt8FJft8$TXLBT&HT91-3mFa~z5 z>W<5}M@{WCwYjruGvQ{OLjo)Gq*lIcdZ&8H;xJNTeM8lJ1+vfD8K9Cbmy^ruM^x@T z{5b?pb-nYM3qj3!Xi&*z!}FsU;|#=&nL*il@0PwHOTFH6IH!~Mg3ey8}4*C1d!@whtu=k0P zZ>tih%%Q5>1||Z|7#J+IhB>=B$5zkzL3+@0XrLJdw5fHHT6Dm#xk@jEviB6Lo zMS|^PW}J@+t-vL8wucnL)krzQ;k{9>ArR*_0N&23FwCHe#7*t6n1e#a3+DIi>q6 z7g@{)QZwer+p8@NE6(oDS=vNN&igRvF}=ewKjoi$>S-a@$^|EgDO-+dLP(^BvmB+x zT+LD~f>p9TJ!0(E4!gLA!i;(x<0{D@A<o$wu`v>p@ZC^?*mCeqa~F3uRc z3gNv{?Aentyl*zNXMI;4GmOJ+ENKcjD0{MLQ}DwpUpr5t#0#m$Z?YrFdbyqpdN%!6 zY~!eGNdey^Xvh-So+gH$KSicM~DefuY z;MM^dY6TYnNX?w@ujgZ}sK#!@jl??OAhNi6N4%4AYf@#tBn|mAYSa+jjwXdb-#9=3 z3Yl1SA|ZyeAp#hE?TPGqbmN*SHb4F^;4kSzMl->lA=JqM!|d*g_w{MhWoyfryf5QSlP*jV zmo7;4khQ)D=|8lOi2q0UZTVPoT)T4~Jn~ch;iWStHv_H7tokMhfUUr(JAX80kKI(J z#iV}=c_52ycrO(C0nprdvI!=T0&`l7;iIz5TpU!*BNcjHNdaK0=TjIP7$}||g}Opw zoIl+3M4bRc8GrRQ)Em*X60;YgId?`iGk0N&k(u8G7L~*j_Sxz@73z(68+o3URg5Dn zV$+bwqaeAoLT7Ww8sPAX9PwM#h&e}FTK*VUR+DhY9Qau$eE(F3?(E+9!5_#lC&-Rp zWXaZ+u!?Y-bRsQ;i7&|Bqal*>tJH!vaDU*9pp~1`!E-K%r_t`_V5DyU%F$QssR_mF zMtiI;kD!kKvQDiZQ2I@;gEb7oJdG^&$sS;nTpaI%;NBsLS8IYJ(!ARvx) z0QBsc-}Y~zLnmlaoK>4mXNGf)tlJbbIc>3cY5X;xJcqAy4~n#!@5uubf0eijTpbrY zUx`G9!gEI{Q&;F`hx!9x4tOsPA-x343*#uy#`EPZFv1oZv#j8ajDpkTM}0FWhL}fu2PcOj__Lv? zno3VBs@z|uIfeuwDV0vZj-LJBTSnkt2z4HQ-*8%Hm$!q^y2X1o1A@Abr)y>7-XTH` zk=X=0n8Lntr1TTj$+pZ3>icLoZ8eK!t?a&zK4V*3Exw-hQANKz%~W^5a(Hqti#i%& z%IYz-)dD4{d}=a@{uDiD6{Y4V4AnFXN}5aDQntLoe^yLBNULU1gI1m?iUE0^+`QFL0K`mb2;~9Ra33*&=*U|<@KZ1iD2o- zEuxdH@0`e4>aFb~bup{CW7LaC_6xKx?idkYr6RT5#mq)c zw<+)go+_-Nz^Ba}Aq-@|hHAu5(rGwns7LO1l0E~slkGKKCj8eEL~pa3!9QCu%NVrt z_2N9muAACvYjk3eN!*+v$lZc(2mk|0z5vt;5z)QSTTAAC44uNGnxXzWilQ|bOCkxD z#SCDWwWI+eo}?Sg(KB%#BGP@svO$D)@3Vw-PN(!vMZeB|k;#--JIQ22t03w|V2;BW zl-d~mf?Jqag7IEo?t5QJ`*Uc=A*Bh8kzFEX8fWOW!g>LLw zQ)baS;3<$8Q7U#cpN>x_L{a_#mp!tn0<6Fyv}U1?I6Uj2`Px_95ZF^2FI1rbn^wgYSbK*Tt*}%mO;{l@%%Z~DCz(iu5(pNK7 zi{{{EOaFc_Rj(0!;;S}noYMm5F(MPo)-b>ouV=XoWBfc;)uj;I%7`g~9xa8n5+xzq zeLSk*iJU=7+;d72QX3JFLkK&Pc`m$~fvWXZ5jyUC`pVMVvG@Q0l~iDROW+sE>$5u0 ziQsQDBUYfXtc6QWR@cWi=R?E)vGNs4QlW91ILr5~daMM& zzKIu4ON+Yp6q*|x-_P6hEg?AX=m4nGP8r=3G*3*^MbA!P-Ac^7v`R2R!zQ-14iAzQ zY|NaP7iSDzg>c@jc5KO+TFlh+GluRdP`)|XD+FV2Y&=$?p2x$b#oc=kIUH0{1~Cl) z_{2MlOu#hU`WqaN2l5aWCf~A{ccKj_W^*_+9Z=cH z7!3m#T0i-8iwW&E?=UM&w6RsKb8~L<@vwSu#&|QtI+-9iefnI$?7UY3y_Z$F-(?<=o$u+;HtougD@YLR38?huA4MJO2y#N{b ziWd<5(=EJ=H-qttDdLqO04)cz_#n>X8zgZod&9UFb%*m&TMyYbo^w#{NtdFn6wS)? z{wmZ^IjgzgE(F`;l!XH*^Ja5YMYQ-?br@Y$ltr90c3F#qig7P9Eqr2aJ=V<4qkQ0v moFDiZKlXW-u6l>6t(@_`AnmBkaiEnEkxL+8WKobp0000)#@j>y literal 0 HcmV?d00001 diff --git a/crates/www/public/textures/dust_scratches.webp b/crates/www/public/textures/dust_scratches.webp new file mode 100644 index 0000000000000000000000000000000000000000..b40b6505dd02abaf59704ccb12fa39a9c3324b73 GIT binary patch literal 22720 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 ZiH$lC7t-k;#2?s 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 Iy#rJJ4{cw(#sB~S literal 0 HcmV?d00001 diff --git a/crates/www/src/app.rs b/crates/www/src/app.rs new file mode 100644 index 00000000..853ad8e0 --- /dev/null +++ b/crates/www/src/app.rs @@ -0,0 +1,56 @@ +use crate::{components::*, routes::index::IndexPage}; +use leptos::{html::Link, prelude::*}; +use leptos_meta::{ + provide_meta_context, MetaTags, Stylesheet, Title, +}; +use leptos_router::{ + components::{Route, Router, Routes}, + StaticSegment, +}; + +pub fn shell(options: LeptosOptions) -> impl IntoView { + view! { + + + + + + + + + + + + + + + + + } +} + +#[component] +pub fn App() -> impl IntoView { + // Provides context that manages stylesheets, + // titles, meta tags, etc. + provide_meta_context(); + + view! { + // injects a stylesheet into the document + // id=leptos means cargo-leptos will hot-reload this stylesheet + + + + + <ProgressBar/> + + <Router> + <main class="relative textured-bg"> + <Routes fallback=|| "Page not found.".into_view()> + <Route path=StaticSegment("") view=IndexPage/> + </Routes> + </main> + </Router> + <Footer/> + } +} diff --git a/crates/www/src/components.rs b/crates/www/src/components.rs new file mode 100644 index 00000000..87623094 --- /dev/null +++ b/crates/www/src/components.rs @@ -0,0 +1,6 @@ +pub mod button; +pub mod footer; +pub mod progress_bar; + +pub use footer::Footer; +pub use progress_bar::ProgressBar; diff --git a/crates/www/src/components/button.rs b/crates/www/src/components/button.rs new file mode 100644 index 00000000..48a95e53 --- /dev/null +++ b/crates/www/src/components/button.rs @@ -0,0 +1,153 @@ +use leptos::prelude::*; +// use serde::{Deserialize, Serialize}; + +const SOLID_CLASSES: &str = concat!( + "rounded-md", + " ", + // "bg-indigo-600", + " ", + "px-2.5", + " ", + "py-1.5", + " ", + "text-sm", + " ", + "font-semibold", + " ", + // "text-ctp-text", + " ", + "shadow-sm", + " ", + // "hover:bg-indigo-500", + " ", + "focus-visible:outline", + " ", + "focus-visible:outline-2", + " ", + "focus-visible:outline-offset-2", + " ", + // "focus-visible:outline-indigo-600", +); + +#[component] +pub fn Button( + #[prop(optional)] variant: Variant, + color: ButtonColor, + #[prop(into)] on_click: Callback<(), ()>, + children: Children, +) -> impl IntoView { + let classes = match variant { + Variant::Solid => { + format!("{SOLID_CLASSES} {} hover:bg-white/10, focus-visible:outline-{} text-white dark:text-black", color.bg(), color.as_str()) + } + Variant::Outline => todo!(), + Variant::Ghost => todo!(), + }; + + view! { + <button + type="button" + on:click=move |_| on_click(()) + class=classes> + {children()} + </button> + } +} + +#[derive(Default)] +pub enum Variant { + #[default] + Solid, + Outline, + Ghost, +} + +pub enum ButtonColor { + ROSEWATER, + FLAMINGO, + PINK, + MAUVE, + RED, + MAROON, + PEACH, + YELLOW, + GREEN, + TEAL, + SKY, + SAPPHIRE, + BLUE, + LAVENDER, + // social colors + TWITTER, + YOUTUBE, + MASTODON, +} + +impl ButtonColor { + fn bg(&self) -> &str { + match self { + ButtonColor::ROSEWATER => "bg-ctp-rosewater", + ButtonColor::FLAMINGO => "bg-ctp-flamingo", + ButtonColor::PINK => "bg-ctp-pink", + ButtonColor::MAUVE => "bg-ctp-mauve", + ButtonColor::RED => "bg-ctp-red", + ButtonColor::MAROON => "bg-ctp-maroon", + ButtonColor::PEACH => "bg-ctp-peach", + ButtonColor::YELLOW => "bg-ctp-yellow", + ButtonColor::GREEN => "bg-ctp-green", + ButtonColor::TEAL => "bg-ctp-teal", + ButtonColor::SKY => "bg-ctp-sky", + ButtonColor::SAPPHIRE => "bg-ctp-sapphire", + ButtonColor::BLUE => "bg-ctp-blue", + ButtonColor::LAVENDER => "bg-ctp-lavender", + + ButtonColor::TWITTER => todo!(), + ButtonColor::YOUTUBE => todo!(), + ButtonColor::MASTODON => todo!(), + } + } + fn as_str(&self) -> &str { + match self { + ButtonColor::ROSEWATER => "ctp-rosewater", + ButtonColor::FLAMINGO => "ctp-flamingo", + ButtonColor::PINK => "ctp-pink", + ButtonColor::MAUVE => "ctp-mauve", + ButtonColor::RED => "ctp-red", + ButtonColor::MAROON => "ctp-maroon", + ButtonColor::PEACH => "ctp-peach", + ButtonColor::YELLOW => "ctp-yellow", + ButtonColor::GREEN => "ctp-green", + ButtonColor::TEAL => "ctp-teal", + ButtonColor::SKY => "ctp-sky", + ButtonColor::SAPPHIRE => "ctp-sapphire", + ButtonColor::BLUE => "ctp-blue", + ButtonColor::LAVENDER => "ctp-lavender", + + ButtonColor::TWITTER => todo!(), + ButtonColor::YOUTUBE => todo!(), + ButtonColor::MASTODON => todo!(), + } + } + fn outline(&self) -> &str { + match self { + ButtonColor::ROSEWATER => "bg-ctp-rosewater", + ButtonColor::FLAMINGO => "bg-ctp-flamingo", + ButtonColor::PINK => "bg-ctp-pink", + ButtonColor::MAUVE => "bg-ctp-mauve", + ButtonColor::RED => "bg-ctp-red", + ButtonColor::MAROON => "bg-ctp-maroon", + ButtonColor::PEACH => "bg-ctp-peach", + ButtonColor::YELLOW => "bg-ctp-yellow", + ButtonColor::GREEN => "bg-ctp-green", + ButtonColor::TEAL => "bg-ctp-teal", + ButtonColor::SKY => "bg-ctp-sky", + ButtonColor::SAPPHIRE => "bg-ctp-sapphire", + ButtonColor::BLUE => "bg-ctp-blue", + ButtonColor::LAVENDER => "bg-ctp-lavender", + + ButtonColor::TWITTER => todo!(), + ButtonColor::YOUTUBE => todo!(), + ButtonColor::MASTODON => todo!(), + } + } +} diff --git a/crates/www/src/components/footer.rs b/crates/www/src/components/footer.rs new file mode 100644 index 00000000..bad348f3 --- /dev/null +++ b/crates/www/src/components/footer.rs @@ -0,0 +1,173 @@ +use leptos::prelude::*; + +#[component] +pub fn Footer() -> impl IntoView { + view! { + <div + class="main-header-darken" + style=" + background-image: linear-gradient(153deg, rgba(152, 152, 152, 0.03) 0%, rgba(152, 152, 152, 0.03) 9%, rgba(197, 197, 197, 0.03) 9%, rgba(197, 197, 197, 0.03) 21%, rgba(106, 106, 106, 0.03) 21%, rgba(106, 106, 106, 0.03) 32%, rgba(222, 222, 222, 0.03) 32%, rgba(222, 222, 222, 0.03) 72%, rgba(16, 16, 16, 0.03) 72%, rgba(16, 16, 16, 0.03) 92%, rgba(181, 181, 181, 0.03) 92%, rgba(181, 181, 181, 0.03) 97%, rgba(130, 130, 130, 0.03) 97%, rgba(130, 130, 130, 0.03) 100%), linear-gradient(39deg, rgba(237, 237, 237, 0.03) 0%, rgba(237, 237, 237, 0.03) 22%, rgba(126, 126, 126, 0.03) 22%, rgba(126, 126, 126, 0.03) 55%, rgba(196, 196, 196, 0.03) 55%, rgba(196, 196, 196, 0.03) 61%, rgba(121, 121, 121, 0.03) 61%, rgba(121, 121, 121, 0.03) 71%, rgba(133, 133, 133, 0.03) 71%, rgba(133, 133, 133, 0.03) 84%, rgba(132, 132, 132, 0.03) 84%, rgba(132, 132, 132, 0.03) 97%, rgba(185, 185, 185, 0.03) 97%, rgba(185, 185, 185, 0.03) 100%), linear-gradient(124deg, rgba(168, 168, 168, 0.03) 0%, rgba(168, 168, 168, 0.03) 7%, rgba(169, 169, 169, 0.03) 7%, rgba(169, 169, 169, 0.03) 19%, rgba(73, 73, 73, 0.03) 19%, rgba(73, 73, 73, 0.03) 50%, rgba(150, 150, 150, 0.03) 50%, rgba(150, 150, 150, 0.03) 67%, rgba(68, 68, 68, 0.03) 67%, rgba(68, 68, 68, 0.03) 81%, rgba(111, 111, 111, 0.03) 81%, rgba(111, 111, 111, 0.03) 91%, rgba(191, 191, 191, 0.03) 91%, rgba(191, 191, 191, 0.03) 100%), linear-gradient(95deg, rgba(147, 147, 147, 0.03) 0%, rgba(147, 147, 147, 0.03) 17%, rgba(79, 79, 79, 0.03) 17%, rgba(79, 79, 79, 0.03) 27%, rgba(28, 28, 28, 0.03) 27%, rgba(28, 28, 28, 0.03) 45%, rgba(27, 27, 27, 0.03) 45%, rgba(27, 27, 27, 0.03) 56%, rgba(228, 228, 228, 0.03) 56%, rgba(228, 228, 228, 0.03) 64%, rgba(38, 38, 38, 0.03) 64%, rgba(38, 38, 38, 0.03) 72%, rgba(42, 42, 42, 0.03) 72%, rgba(42, 42, 42, 0.03) 100%), linear-gradient(346deg, rgba(59, 59, 59, 0.03) 0%, rgba(59, 59, 59, 0.03) 16%, rgba(66, 66, 66, 0.03) 16%, rgba(66, 66, 66, 0.03) 20%, rgba(236, 236, 236, 0.03) 20%, rgba(236, 236, 236, 0.03) 41%, rgba(244, 244, 244, 0.03) 41%, rgba(244, 244, 244, 0.03) 55%, rgba(106, 106, 106, 0.03) 55%, rgba(106, 106, 106, 0.03) 61%, rgba(220, 220, 220, 0.03) 61%, rgba(220, 220, 220, 0.03) 63%, rgba(209, 209, 209, 0.03) 63%, rgba(209, 209, 209, 0.03) 100%), linear-gradient(124deg, rgba(255, 36, 0, 0.17), rgba(232, 29, 29, 0.17), rgba(232, 183, 29, 0.17), rgba(227, 232, 29, 0.17), rgba(29, 232, 64, 0.17), rgba(29, 221, 232, 0.17), rgba(43, 29, 232, 0.17), rgba(221, 0, 243, 0.17), rgba(221, 0, 243, 0.17)) + " + > + + // <ConvertKitForm /> + + <footer class="mix-blend-color-dodge"> + <div class="max-w-screen-xl mx-auto py-12 px-4 sm:px-6 lg:py-16 lg:px-8"> + <div class="xl:grid xl:grid-cols-3 xl:gap-8"> + <div class="grid grid-cols-2 gap-8 xl:col-span-2"> + <div class="md:grid md:grid-cols-2 md:gap-8"> + <div> + <h4 class="text-sm leading-5 font-semibold text-gray-400 tracking-wider uppercase"> + I Cover + </h4> + <ul class="mt-4 space-y-4"> + <li> + <a + href="/game-development" + class="text-base leading-6 text-gray-300 hover:text-white" + > + Game Development + </a> + </li> + <li> + <a + href="/rust" + class="text-base leading-6 text-ctp-text hover:text-white" + > + Rust + </a> + </li> + <li> + <a + href="/wasm" + class="text-base leading-6 text-ctp-text hover:text-white" + > + Wasm + </a> + </li> + {/* <li> + <a + href="#" + class="text-base leading-6 text-gray-300 hover:text-white" + > + The <span class="text-pink-300">Edge</span> Newsletter + </a> + </li> */} + </ul> + </div> + <div class="mt-12 md:mt-0"> + <h4 class="text-sm leading-5 font-semibold text-gray-400 tracking-wider uppercase"> + I Make + </h4> + <ul class="mt-4 space-y-4"> + <li> + <a + href="https://rustadventure.dev" + class="text-base leading-6 text-gray-300 hover:text-white" + > + Rust Adventure + </a> + </li> + <li> + <a + href="https://thisweekinbevy.com" + class="text-base leading-6 text-gray-300 hover:text-white" + > + This Week in Bevy Engine + </a> + </li> + <li> + <a + href="https://pages.convertkit.com/04c24646a3/c136f814fc" + class="text-ctp-red leading-6 text-gray-300 hover:text-white" + > + <span class="text-blue-300">Personal</span> Newsletter + </a> + </li> + // <li> + // <a + // href="https://sector.tools/" + // class="text-base leading-6 text-gray-300 hover:text-white" + // > + // Sector Tools + // </a> + // </li> + </ul> + </div> + </div> + <div class="md:grid md:grid-cols-2 md:gap-8"> + <div class="mt-12 md:mt-0"> + <h4 class="text-sm leading-5 font-semibold text-gray-400 tracking-wider uppercase"> + I Exist + </h4> + <ul class="mt-4 space-y-4"> + <li> + <a + href="https://www.youtube.com/@chrisbiscardi" + class="text-base leading-6 text-gray-300 hover:text-brand-youtube" + > + YouTube + </a> + </li> + <li> + <a + href="https://hachyderm.io/@chrisbiscardi" + class="text-base leading-6 text-gray-300 hover:text-brand-mastodon" + > + Mastodon + </a> + </li> + + </ul> + </div> + </div> + </div> + </div> + <div class="mt-8 border-t border-gray-500 pt-8 md:flex md:items-center md:justify-between"> + <div class="flex space-x-6 md:order-2"> + <a + href="https://twitter.com/chrisbiscardi" + class="text-gray-400 hover:text-gray-300" + > + <span class="sr-only">Twitter</span> + <svg class="h-6 w-6" fill="currentColor" viewBox="0 0 24 24"> + <path d="M8.29 20.251c7.547 0 11.675-6.253 11.675-11.675 0-.178 0-.355-.012-.53A8.348 8.348 0 0022 5.92a8.19 8.19 0 01-2.357.646 4.118 4.118 0 001.804-2.27 8.224 8.224 0 01-2.605.996 4.107 4.107 0 00-6.993 3.743 11.65 11.65 0 01-8.457-4.287 4.106 4.106 0 001.27 5.477A4.072 4.072 0 012.8 9.713v.052a4.105 4.105 0 003.292 4.022 4.095 4.095 0 01-1.853.07 4.108 4.108 0 003.834 2.85A8.233 8.233 0 012 18.407a11.616 11.616 0 006.29 1.84" /> + </svg> + </a> + <a + href="https://github.com/christopherbiscardi/" + class="text-gray-400 hover:text-gray-300" + > + <span class="sr-only">GitHub</span> + <svg class="h-6 w-6" fill="currentColor" viewBox="0 0 24 24"> + <path + fill-rule="evenodd" + d="M12 2C6.477 2 2 6.484 2 12.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0112 6.844c.85.004 1.705.115 2.504.337 1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.202 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.943.359.309.678.92.678 1.855 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.019 10.019 0 0022 12.017C22 6.484 17.522 2 12 2z" + clip-rule="evenodd" + /> + </svg> + </a> + <a + href="https://dribbble.com/chrisbiscardi" + class="text-gray-400 hover:text-gray-300" + > + <span class="sr-only">Dribbble</span> + <svg class="h-6 w-6" fill="currentColor" viewBox="0 0 24 24"> + <path + fill-rule="evenodd" + d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10c5.51 0 10-4.48 10-10S17.51 2 12 2zm6.605 4.61a8.502 8.502 0 011.93 5.314c-.281-.054-3.101-.629-5.943-.271-.065-.141-.12-.293-.184-.445a25.416 25.416 0 00-.564-1.236c3.145-1.28 4.577-3.124 4.761-3.362zM12 3.475c2.17 0 4.154.813 5.662 2.148-.152.216-1.443 1.941-4.48 3.08-1.399-2.57-2.95-4.675-3.189-5A8.687 8.687 0 0112 3.475zm-3.633.803a53.896 53.896 0 013.167 4.935c-3.992 1.063-7.517 1.04-7.896 1.04a8.581 8.581 0 014.729-5.975zM3.453 12.01v-.26c.37.01 4.512.065 8.775-1.215.25.477.477.965.694 1.453-.109.033-.228.065-.336.098-4.404 1.42-6.747 5.303-6.942 5.629a8.522 8.522 0 01-2.19-5.705zM12 20.547a8.482 8.482 0 01-5.239-1.8c.152-.315 1.888-3.656 6.703-5.337.022-.01.033-.01.054-.022a35.318 35.318 0 011.823 6.475 8.4 8.4 0 01-3.341.684zm4.761-1.465c-.086-.52-.542-3.015-1.659-6.084 2.679-.423 5.022.271 5.314.369a8.468 8.468 0 01-3.655 5.715z" + clip-rule="evenodd" + /> + </svg> + </a> + </div> + <p class="mt-8 text-base leading-6 text-gray-400 md:mt-0 md:order-1"> + Built with <a href="https://leptos.dev/">Leptos</a>, <a href="https://github.com/tokio-rs/axum">Axum</a>, and Wasm + </p> + </div> + </div> + </footer> + </div> + } +} diff --git a/crates/www/src/components/progress_bar.rs b/crates/www/src/components/progress_bar.rs new file mode 100644 index 00000000..50978b83 --- /dev/null +++ b/crates/www/src/components/progress_bar.rs @@ -0,0 +1,160 @@ +use leptos::prelude::*; +use leptos_use::{use_event_listener, use_window}; + +const STYLES: &str = "#top-progress { + background: #11151da6; + } + #top-progress::-webkit-progress-value { + background: linear-gradient( + 124deg, + #ff2400, + #e81d1d, + #e8b71d, + #e3e81d, + #1de840, + #1ddde8, + #2b1de8, + #dd00f3, + #dd00f3 + ); + background-size: 100vw; + opacity: 0.4; + } + #top-progress::-webkit-progress-bar { + background: transparent; + opacity: 1; + } + #top-progress::-moz-progress-bar { + background: linear-gradient( + 124deg, + #ff2400, + #e81d1d, + #e8b71d, + #e3e81d, + #1de840, + #1ddde8, + #2b1de8, + #dd00f3, + #dd00f3 + ); + background-size: 100vw; + opacity: 0.4; + }"; + +fn get_indicator_percentage_width( + current_pos: f64, + total_scroll: f64, +) -> f64 { + (current_pos / total_scroll) * 100. +} + +#[component] +pub fn ProgressBar() -> impl IntoView { + let scroll_position_percentage = RwSignal::new(0.); + + #[cfg(not(feature = "ssr"))] + Effect::watch( + move || {}, + move |_, _, _| { + let _ = use_event_listener( + use_window(), + leptos::ev::scroll, + move |_| { + log!("click from element"); + + let Some(ref window) = *use_window() + else { + return; + }; + + let current_pos = + window.scroll_y().unwrap(); + let inner_height = window + .inner_height() + .unwrap() + .as_f64() + .unwrap_or(0.); + let scroll_height = get_scroll_height(); + let scroll_distance = + scroll_height as f64 - inner_height; + + let indicator_width = + get_indicator_percentage_width( + current_pos, + scroll_distance, + ); + + scroll_position_percentage + .set(indicator_width); + }, + ); + + let win = use_window(); + let window = win.as_ref().clone().unwrap(); + + let inner_height = window + .inner_height() + .unwrap() + .as_f64() + .unwrap_or(0.); + let scroll_height = get_scroll_height(); + let scroll_distance = + scroll_height as f64 - inner_height; + let indicator_width = + get_indicator_percentage_width( + window.scroll_y().unwrap(), + scroll_distance, + ); + + scroll_position_percentage.set(indicator_width); + }, + false, + ); + + view! { + <> + <style>{STYLES}</style> + <progress + id="top-progress" + class="z-50 fixed top-0 left-0 appearance-none w-full h-1 opacity-100" + // value={isNaN(scroll_position_pecentage) ? 100. : scroll_position_pecentage} + value=scroll_position_percentage + max="100" + > + 70 % + </progress> + </> + } +} + +#[cfg(not(feature = "ssr"))] +// find the total height of window +fn get_scroll_height() -> i32 { + let win = use_window(); + let document = win.document(); + // https://javascript.info/size-and-scroll-window#width-height-of-the-document + *[ + document.body().unwrap().scroll_height(), + document + .as_ref() + .unwrap() + .document_element() + .unwrap() + .scroll_height(), + document.body().unwrap().offset_height(), + // document + // .document_element() + // .unwrap() + // .offset_height(), + document.body().unwrap().client_height(), + document + .as_ref() + .unwrap() + .document_element() + .unwrap() + .client_height(), + ] + .iter() + .max() + .unwrap() +} diff --git a/crates/www/src/lib.rs b/crates/www/src/lib.rs new file mode 100644 index 00000000..e4cabbab --- /dev/null +++ b/crates/www/src/lib.rs @@ -0,0 +1,12 @@ +pub mod app; +mod components; +mod routes; + +#[cfg(feature = "hydrate")] +#[wasm_bindgen::prelude::wasm_bindgen] +pub fn hydrate() { + use crate::app::*; + console_error_panic_hook::set_once(); + // leptos::mount::hydrate_body(App); + leptos::mount::hydrate_islands(); +} diff --git a/crates/www/src/main.rs b/crates/www/src/main.rs new file mode 100644 index 00000000..d6bfe8af --- /dev/null +++ b/crates/www/src/main.rs @@ -0,0 +1,38 @@ + +#[cfg(feature = "ssr")] +#[tokio::main] +async fn main() { + use axum::Router; + use leptos::prelude::*; + use leptos_axum::{generate_route_list, LeptosRoutes}; + use www::app::*; + + let conf = get_configuration(None).unwrap(); + let addr = conf.leptos_options.site_addr; + let leptos_options = conf.leptos_options; + // Generate the list of routes in your Leptos App + let routes = generate_route_list(App); + + let app = Router::new() + .leptos_routes(&leptos_options, routes, { + let leptos_options = leptos_options.clone(); + move || shell(leptos_options.clone()) + }) + .fallback(leptos_axum::file_and_error_handler(shell)) + .with_state(leptos_options); + + // run our app with hyper + // `axum::Server` is a re-export of `hyper::Server` + log!("listening on http://{}", &addr); + let listener = tokio::net::TcpListener::bind(&addr).await.unwrap(); + axum::serve(listener, app.into_make_service()) + .await + .unwrap(); +} + +#[cfg(not(feature = "ssr"))] +pub fn main() { + // no client-side main function + // unless we want this to work with e.g., Trunk for pure client-side testing + // see lib.rs for hydration function instead +} diff --git a/crates/www/src/routes.rs b/crates/www/src/routes.rs new file mode 100644 index 00000000..33edc959 --- /dev/null +++ b/crates/www/src/routes.rs @@ -0,0 +1 @@ +pub mod index; diff --git a/crates/www/src/routes/index.rs b/crates/www/src/routes/index.rs new file mode 100644 index 00000000..898b665f --- /dev/null +++ b/crates/www/src/routes/index.rs @@ -0,0 +1,303 @@ +use leptos::{either::Either, prelude::*}; +// use sens8::button::*; + +#[component] +fn BentoBox<'a>( + #[prop(optional)] border_gradient: &'a str, + bg: Option<&'a str>, + image_header: Option<&'a str>, + #[prop(default = 2.)] speed: f64, + children: Children, +) -> impl IntoView + 'a { + let mut style = "".to_string(); + if !border_gradient.is_empty() { + style.push_str("--border-gradient: "); + style.push_str(border_gradient); + style.push_str(" border-box; "); + }; + if let Some(bg) = bg { + style.push_str("--bg-grad: "); + style.push_str(bg); + style.push_str(" padding-box;"); + }; + let mut container_style = "".to_string(); + container_style.push_str("--border-speed: "); + container_style.push_str(&speed.to_string()); + container_style.push_str(";"); + view! { + <div + style=container_style + class="bento-container h-full" + > + <div + style=style + class="bento-box h-full" + > + { + if let Some(src) = image_header { + Either::Left(view!{ + <img + class="img-header" + src=src + /> + }) + } else { + Either::Right(view!("")) + } + } + {children()} + </div> + </div> + } +} + +#[derive(Clone)] +struct BentoBoxContent<'a> { + title: &'a str, + content: &'a str, + bg: Option<&'a str>, + border_gradient: Option<&'a str>, + speed: f64, + center_title: bool, + image_header: Option<&'a str>, +} +impl<'a> Default for BentoBoxContent<'a> { + fn default() -> Self { + Self { + title: Default::default(), + content: Default::default(), + bg: Default::default(), + border_gradient: Default::default(), + speed: 2., + center_title: false, + image_header: None, + } + } +} + +#[component] +pub fn IndexPage() -> impl IntoView { + let boxes = RwSignal::new( + vec![ + BentoBoxContent { + title: "Bevy", + content: "svg-bevy", + bg: Some("linear-gradient(-45deg, #232326, #1e1e22)"), + // bg: Some("url('')"), + border_gradient: Some("conic-gradient( from calc(180deg + var(--angle)) at 50% 70%, #1e1e22, #ececec)"), + image_header: Some("https://res.cloudinary.com/dilgcuzda/image/upload/v1723431989/thisweekinbevy/01J528TBS3A73AHPN9KHWGJ7T0.avif"), + ..Default::default() + }, + BentoBoxContent { + title: "", + content: "wasm", + bg: None, + // 38.0 30.0 92.0 #624DEA + border_gradient: Some("conic-gradient( from calc(180deg + var(--angle)) at 50% 70%, #624DEA, #ded9fb)"), + center_title: true, + image_header: Some("/img/wasm-heading.avif"), + ..Default::default() + }, + BentoBoxContent { + title: "Shaders", + content: "svg-art", + bg: None, + border_gradient: None, + + ..Default::default() + }, + BentoBoxContent { + title: "Rust Adventure", + content: "learn something and do some rust stuff", + bg: Some("linear-gradient(-45deg, #2e1e1e 0%, var(--ctp-base) 60%)"), + border_gradient: Some("conic-gradient( from calc(180deg + var(--angle)) at 50% 70%, #2e1e1e, var(--ctp-red))"), + speed: 10., + center_title: true, + ..Default::default() + }, + BentoBoxContent { + title: "Something", + content: "svg-hex", + bg: None, + border_gradient: Some("conic-gradient( from calc(180deg + var(--angle)) at 50% 70%, hsl(265, 55%, 30%), hsl(265, 55%, 60%))"), + ..Default::default() + }, + BentoBoxContent { + title: "YouTube", + content: "YouTube", + bg: None, + border_gradient: None, + ..Default::default() + }, + BentoBoxContent { + title: "YouTube", + content: "YouTube", + bg: None, + border_gradient: Some("conic-gradient( + from calc(180deg + var(--angle)) at 50% 70%, + #e8b71d55, + #e81d1d55, + #ff240055 + )"), + ..Default::default() + }, + BentoBoxContent { + title: "YouTube", + content: "YouTube", + bg: None, + border_gradient: None, + ..Default::default() + }, + ] + .into_iter() + .enumerate() + .collect::<Vec<(usize, BentoBoxContent)>>(), + ); + view! { + <Hero/> + <div class="grid grid-cols-3 gap-4 mx-auto max-w-7xl sm:px-6 lg:px-8 py-14"> + <For + // a function that returns the items we're iterating over; a signal is fine + each=move || boxes.get() + // a unique key for each item + key=|boxy| boxy.0.to_string() + // renders each item to a view + // min-h-24 min-h-32 min-h-36 min-h-16 min-h-64 + children=move |(index, content)| { + view! { + <div + class=format!( + "row-span-1 {}", + // "row-span-1 rounded-xl border-2 border-slate-400/10 bg-neutral-100 p-4 dark:bg-ctp-surface0 min-h-full {}", + if index == 3 || index == 6 { + "col-span-2" + } else { + "" + }) + > + <BentoBox + border_gradient=content.border_gradient.unwrap_or("") + bg=content.bg + speed=content.speed + image_header=content.image_header + > + <p class=format!("text-2xl font-bold leading-7 text-ctp-text sm:truncate sm:text-3xl sm:tracking-tight {}", + if content.center_title { + "text-center" + } else { + "" + } + )>{content.title}</p> + { + if content.content == "svg-art" { + view!{ + <span class="text-ctp-text"> + wgpu and wgsl + </span> + }.into_any() + } else if content.content == "svg-hex" { + view! { + <span> + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 800 800"><defs><filter id="b" width="400%" height="400%" x="-100%" y="-100%" color-interpolation-filters="sRGB" filterUnits="objectBoundingBox" primitiveUnits="userSpaceOnUse"><feGaussianBlur width="100%" height="100%" x="0%" y="0%" in="SourceGraphic" result="blur" stdDeviation="17 8"/></filter><filter id="c" width="400%" height="400%" x="-100%" y="-100%" color-interpolation-filters="sRGB" filterUnits="objectBoundingBox" primitiveUnits="userSpaceOnUse"><feGaussianBlur width="100%" height="100%" x="0%" y="0%" in="SourceGraphic" result="blur" stdDeviation="10 17"/></filter><linearGradient id="a" x1="50%" x2="50%" y1="0%" y2="100%"><stop offset="0%" stop-color="hsl(265, 55%, 30%)"/><stop offset="100%" stop-color="hsl(265, 55%, 60%)"/></linearGradient></defs><g fill="none" stroke="url(#a)" stroke-width="16"><path d="M388.453 233.461a23.095 23.095 0 0 1 23.094.001l126.906 73.27A23.093 23.093 0 0 1 550 326.73v146.538c0 8.25-4.402 15.875-11.547 20l-126.906 73.27a23.095 23.095 0 0 1-23.094-.001l-126.906-73.27A23.093 23.093 0 0 1 250 473.27V326.731c0-8.25 4.402-15.875 11.547-20l126.906-73.27Z" filter="url(#b)"/><path d="M400.453 233.461a23.095 23.095 0 0 1 23.094.001l126.906 73.27A23.093 23.093 0 0 1 562 326.73v146.538c0 8.25-4.402 15.875-11.547 20l-126.906 73.27a23.095 23.095 0 0 1-23.094-.001l-126.906-73.27A23.093 23.093 0 0 1 262 473.27V326.731c0-8.25 4.402-15.875 11.547-20l126.906-73.27Z" filter="url(#c)" opacity=".25"/><path d="M376.453 233.461a23.095 23.095 0 0 1 23.094.001l126.906 73.27A23.093 23.093 0 0 1 538 326.73v146.538c0 8.25-4.402 15.875-11.547 20l-126.906 73.27a23.095 23.095 0 0 1-23.094-.001l-126.906-73.27A23.093 23.093 0 0 1 238 473.27V326.731c0-8.25 4.402-15.875 11.547-20l126.906-73.27Z" filter="url(#c)" opacity=".25"/><path d="M388.453 233.461a23.095 23.095 0 0 1 23.094.001l126.906 73.27A23.093 23.093 0 0 1 550 326.73v146.538c0 8.25-4.402 15.875-11.547 20l-126.906 73.27a23.095 23.095 0 0 1-23.094-.001l-126.906-73.27A23.093 23.093 0 0 1 250 473.27V326.731c0-8.25 4.402-15.875 11.547-20l126.906-73.27Z"/></g></svg> + </span> + }.into_any() + } else if content.content == "svg-bevy" { + view! { + <span> + game development + </span> + }.into_any() + } else if content.content == "wasm" { + view! { + <div class="visible-on-hover text-slate-900"> + <h2 class="outfit-900"> + <a href="/wasm" class="focus:outline-none"> + <span class="absolute inset-0 z-1" aria-hidden="true"></span> + Wasm + </a> + </h2> + <span class="drop-shadow-2xl"> + Webassembly, Leptos, Rust, and more... + </span> + </div> + }.into_any() + } else { + view!{ + <span> + // <p class="text-ctp-text">{content.content}</p> + <svg/> + </span> + }.into_any() + } + } + </BentoBox> + </div> + } + } + /> + </div> + } +} + +#[component] +pub fn Hero() -> impl IntoView { + return view! { + <div + class="relative main-header-darken" + style= + "background-image: linear-gradient(153deg, rgba(152, 152, 152, 0.03) 0%, rgba(152, 152, 152, 0.03) 9%,rgba(197, 197, 197, 0.03) 9%, rgba(197, 197, 197, 0.03) 21%,rgba(106, 106, 106, 0.03) 21%, rgba(106, 106, 106, 0.03) 32%,rgba(222, 222, 222, 0.03) 32%, rgba(222, 222, 222, 0.03) 72%,rgba(16, 16, 16, 0.03) 72%, rgba(16, 16, 16, 0.03) 92%,rgba(181, 181, 181, 0.03) 92%, rgba(181, 181, 181, 0.03) 97%,rgba(130, 130, 130, 0.03) 97%, rgba(130, 130, 130, 0.03) 100%),linear-gradient(39deg, rgba(237, 237, 237, 0.03) 0%, rgba(237, 237, 237, 0.03) 22%,rgba(126, 126, 126, 0.03) 22%, rgba(126, 126, 126, 0.03) 55%,rgba(196, 196, 196, 0.03) 55%, rgba(196, 196, 196, 0.03) 61%,rgba(121, 121, 121, 0.03) 61%, rgba(121, 121, 121, 0.03) 71%,rgba(133, 133, 133, 0.03) 71%, rgba(133, 133, 133, 0.03) 84%,rgba(132, 132, 132, 0.03) 84%, rgba(132, 132, 132, 0.03) 97%,rgba(185, 185, 185, 0.03) 97%, rgba(185, 185, 185, 0.03) 100%),linear-gradient(124deg, rgba(168, 168, 168, 0.03) 0%, rgba(168, 168, 168, 0.03) 7%,rgba(169, 169, 169, 0.03) 7%, rgba(169, 169, 169, 0.03) 19%,rgba(73, 73, 73, 0.03) 19%, rgba(73, 73, 73, 0.03) 50%,rgba(150, 150, 150, 0.03) 50%, rgba(150, 150, 150, 0.03) 67%,rgba(68, 68, 68, 0.03) 67%, rgba(68, 68, 68, 0.03) 81%,rgba(111, 111, 111, 0.03) 81%, rgba(111, 111, 111, 0.03) 91%,rgba(191, 191, 191, 0.03) 91%, rgba(191, 191, 191, 0.03) 100%),linear-gradient(95deg, rgba(147, 147, 147, 0.03) 0%, rgba(147, 147, 147, 0.03) 17%,rgba(79, 79, 79, 0.03) 17%, rgba(79, 79, 79, 0.03) 27%,rgba(28, 28, 28, 0.03) 27%, rgba(28, 28, 28, 0.03) 45%,rgba(27, 27, 27, 0.03) 45%, rgba(27, 27, 27, 0.03) 56%,rgba(228, 228, 228, 0.03) 56%, rgba(228, 228, 228, 0.03) 64%,rgba(38, 38, 38, 0.03) 64%, rgba(38, 38, 38, 0.03) 72%,rgba(42, 42, 42, 0.03) 72%, rgba(42, 42, 42, 0.03) 100%),linear-gradient(346deg, rgba(59, 59, 59, 0.03) 0%, rgba(59, 59, 59, 0.03) 16%,rgba(66, 66, 66, 0.03) 16%, rgba(66, 66, 66, 0.03) 20%,rgba(236, 236, 236, 0.03) 20%, rgba(236, 236, 236, 0.03) 41%,rgba(244, 244, 244, 0.03) 41%, rgba(244, 244, 244, 0.03) 55%,rgba(106, 106, 106, 0.03) 55%, rgba(106, 106, 106, 0.03) 61%,rgba(220, 220, 220, 0.03) 61%, rgba(220, 220, 220, 0.03) 63%,rgba(209, 209, 209, 0.03) 63%, rgba(209, 209, 209, 0.03) 100%),linear-gradient(124deg, rgba(255, 36, 0, 0.17), rgba(232, 29, 29, 0.17), rgba(232, 183, 29, 0.17), rgba(227, 232, 29, 0.17), rgba(29, 232, 64, 0.17), rgba(29, 221, 232, 0.17), rgba(43, 29, 232, 0.17), rgba(221, 0, 243, 0.17), rgba(221, 0, 243, 0.17))" + > + <div class="relative max-w-7xl mx-auto py-24 px-4 sm:py-32 sm:px-6 lg:px-8"> + <h1 class="text-4xl font-extrabold tracking-tight text-white sm:text-5xl lg:text-6xl flex"> + "Hey, I'm Chris" + <img + style="height: 4rem" + class="sm:ml-4 outfit-900" + src="/img/party-corgi.gif" + alt="party corgi rainbow animated" + /> + </h1> + <p class="mt-6 text-xl text-indigo-100 max-w-3xl"> + I write about{" "} + <a class="text-red-400" href="/rust"> + Rust + </a>{", "} + JavaScript, and occassionally other languages. + This site is built with Leptos and Wasm. + The content is written in + <a class="text-blue-400" href="https://twitter.com/sectortools"> + Sector + </a> + . + </p> + <ul class="flex py-4 gap-x-2 mt-4"> + // <li class=""> + // <Button href="https://twitter.com/chrisbiscardi" + // color=ButtonColor::TWITTER + // icon="twitter"> + // Twitter + // </Button> + // </li> + // <li class=""> + // <Button + // href="https://www.youtube.com/channel/UCiSIL42pQRpc-8JNiYDFyzQ" + // color=ButtonColor::YOUTUBE + // icon="youtube" + // > + // YouTube + // </Button> + // </li> + // <li class=""> + // <SocialButton + // href="https://github.com/ChristopherBiscardi" + // icon="github" + // > + // GitHub + // </SocialButton> + // </li> + </ul> + {/* <LowerTilt /> */} + </div> + </div> + }; +} diff --git a/crates/www/style/input.css b/crates/www/style/input.css new file mode 100644 index 00000000..0f2b02ab --- /dev/null +++ b/crates/www/style/input.css @@ -0,0 +1,332 @@ +/* catppuccin variables */ +.ctp-latte { + --ctp-rosewater: rgb(220, 138, 120); + --ctp-flamingo: rgb(221, 120, 120); + --ctp-pink: rgb(234, 118, 203); + --ctp-mauve: rgb(136, 57, 239); + --ctp-red: rgb(210, 15, 57); + --ctp-maroon: rgb(230, 69, 83); + --ctp-peach: rgb(254, 100, 11); + --ctp-yellow: rgb(223, 142, 29); + --ctp-green: rgb(64, 160, 43); + --ctp-teal: rgb(23, 146, 153); + --ctp-sky: rgb(4, 165, 229); + --ctp-sapphire: rgb(32, 159, 181); + --ctp-blue: rgb(30, 102, 245); + --ctp-lavender: rgb(114, 135, 253); + --ctp-text: rgb(76, 79, 105); + --ctp-subtext1: rgb(92, 95, 119); + --ctp-subtext0: rgb(108, 111, 133); + --ctp-overlay2: rgb(124, 127, 147); + --ctp-overlay1: rgb(140, 143, 161); + --ctp-overlay0: rgb(156, 160, 176); + --ctp-surface2: rgb(172, 176, 190); + --ctp-surface1: rgb(188, 192, 204); + --ctp-surface0: rgb(204, 208, 218); + --ctp-base: rgb(239, 241, 245); + --ctp-mantle: rgb(230, 233, 239); + --ctp-crust: rgb(220, 224, 232); +} +.ctp-frappe { + --ctp-rosewater: rgb(242, 213, 207); + --ctp-flamingo: rgb(238, 190, 190); + --ctp-pink: rgb(244, 184, 228); + --ctp-mauve: rgb(202, 158, 230); + --ctp-red: rgb(231, 130, 132); + --ctp-maroon: rgb(234, 153, 156); + --ctp-peach: rgb(239, 159, 118); + --ctp-yellow: rgb(229, 200, 144); + --ctp-green: rgb(166, 209, 137); + --ctp-teal: rgb(129, 200, 190); + --ctp-sky: rgb(153, 209, 219); + --ctp-sapphire: rgb(133, 193, 220); + --ctp-blue: rgb(140, 170, 238); + --ctp-lavender: rgb(186, 187, 241); + --ctp-text: rgb(198, 208, 245); + --ctp-subtext1: rgb(181, 191, 226); + --ctp-subtext0: rgb(165, 173, 206); + --ctp-overlay2: rgb(148, 156, 187); + --ctp-overlay1: rgb(131, 139, 167); + --ctp-overlay0: rgb(115, 121, 148); + --ctp-surface2: rgb(98, 104, 128); + --ctp-surface1: rgb(81, 87, 109); + --ctp-surface0: rgb(65, 69, 89); + --ctp-base: rgb(48, 52, 70); + --ctp-mantle: rgb(41, 44, 60); + --ctp-crust: rgb(35, 38, 52); +} +.ctp-macchiato { + --ctp-rosewater: rgb(244, 219, 214); + --ctp-flamingo: rgb(240, 198, 198); + --ctp-pink: rgb(245, 189, 230); + --ctp-mauve: rgb(198, 160, 246); + --ctp-red: rgb(237, 135, 150); + --ctp-maroon: rgb(238, 153, 160); + --ctp-peach: rgb(245, 169, 127); + --ctp-yellow: rgb(238, 212, 159); + --ctp-green: rgb(166, 218, 149); + --ctp-teal: rgb(139, 213, 202); + --ctp-sky: rgb(145, 215, 227); + --ctp-sapphire: rgb(125, 196, 228); + --ctp-blue: rgb(138, 173, 244); + --ctp-lavender: rgb(183, 189, 248); + --ctp-text: rgb(202, 211, 245); + --ctp-subtext1: rgb(184, 192, 224); + --ctp-subtext0: rgb(165, 173, 203); + --ctp-overlay2: rgb(147, 154, 183); + --ctp-overlay1: rgb(128, 135, 162); + --ctp-overlay0: rgb(110, 115, 141); + --ctp-surface2: rgb(91, 96, 120); + --ctp-surface1: rgb(73, 77, 100); + --ctp-surface0: rgb(54, 58, 79); + --ctp-base: rgb(36, 39, 58); + --ctp-mantle: rgb(30, 32, 48); + --ctp-crust: rgb(24, 25, 38); +} +.ctp-mocha { + --ctp-rosewater: rgb(245, 224, 220); + --ctp-flamingo: rgb(242, 205, 205); + --ctp-pink: rgb(245, 194, 231); + --ctp-mauve: rgb(203, 166, 247); + --ctp-red: rgb(243, 139, 168); + --ctp-maroon: rgb(235, 160, 172); + --ctp-peach: rgb(250, 179, 135); + --ctp-yellow: rgb(249, 226, 175); + --ctp-green: rgb(166, 227, 161); + --ctp-teal: rgb(148, 226, 213); + --ctp-sky: rgb(137, 220, 235); + --ctp-sapphire: rgb(116, 199, 236); + --ctp-blue: rgb(137, 180, 250); + --ctp-lavender: rgb(180, 190, 254); + --ctp-text: rgb(205, 214, 244); + --ctp-subtext1: rgb(186, 194, 222); + --ctp-subtext0: rgb(166, 173, 200); + --ctp-overlay2: rgb(147, 153, 178); + --ctp-overlay1: rgb(127, 132, 156); + --ctp-overlay0: rgb(108, 112, 134); + --ctp-surface2: rgb(88, 91, 112); + --ctp-surface1: rgb(69, 71, 90); + --ctp-surface0: rgb(49, 50, 68); + --ctp-base: rgb(30, 30, 46); + --ctp-mantle: rgb(24, 24, 37); + --ctp-crust: rgb(17, 17, 27); +} + +@tailwind base; +@tailwind components; +@tailwind utilities; + +:root { + --ctp-rosewater: rgb(220, 138, 120); + --ctp-flamingo: rgb(221, 120, 120); + --ctp-pink: rgb(234, 118, 203); + --ctp-mauve: rgb(136, 57, 239); + --ctp-red: rgb(210, 15, 57); + --ctp-maroon: rgb(230, 69, 83); + --ctp-peach: rgb(254, 100, 11); + --ctp-yellow: rgb(223, 142, 29); + --ctp-green: rgb(64, 160, 43); + --ctp-teal: rgb(23, 146, 153); + --ctp-sky: rgb(4, 165, 229); + --ctp-sapphire: rgb(32, 159, 181); + --ctp-blue: rgb(30, 102, 245); + --ctp-lavender: rgb(114, 135, 253); + --ctp-text: rgb(76, 79, 105); + --ctp-subtext1: rgb(92, 95, 119); + --ctp-subtext0: rgb(108, 111, 133); + --ctp-overlay2: rgb(124, 127, 147); + --ctp-overlay1: rgb(140, 143, 161); + --ctp-overlay0: rgb(156, 160, 176); + --ctp-surface2: rgb(172, 176, 190); + --ctp-surface1: rgb(188, 192, 204); + --ctp-surface0: rgb(204, 208, 218); + --ctp-base: rgb(239, 241, 245); + --ctp-mantle: rgb(230, 233, 239); + --ctp-crust: rgb(220, 224, 232); +} + +@media (prefers-color-scheme: dark) { + :root { + --ctp-rosewater: rgb(245, 224, 220); + --ctp-flamingo: rgb(242, 205, 205); + --ctp-pink: rgb(245, 194, 231); + --ctp-mauve: rgb(203, 166, 247); + --ctp-red: rgb(243, 139, 168); + --ctp-maroon: rgb(235, 160, 172); + --ctp-peach: rgb(250, 179, 135); + --ctp-yellow: rgb(249, 226, 175); + --ctp-green: rgb(166, 227, 161); + --ctp-teal: rgb(148, 226, 213); + --ctp-sky: rgb(137, 220, 235); + --ctp-sapphire: rgb(116, 199, 236); + --ctp-blue: rgb(137, 180, 250); + --ctp-lavender: rgb(180, 190, 254); + --ctp-text: rgb(205, 214, 244); + --ctp-subtext1: rgb(186, 194, 222); + --ctp-subtext0: rgb(166, 173, 200); + --ctp-overlay2: rgb(147, 153, 178); + --ctp-overlay1: rgb(127, 132, 156); + --ctp-overlay0: rgb(108, 112, 134); + --ctp-surface2: rgb(88, 91, 112); + --ctp-surface1: rgb(69, 71, 90); + --ctp-surface0: rgb(49, 50, 68); + --ctp-base: rgb(30, 30, 46); + --ctp-mantle: rgb(24, 24, 37); + --ctp-crust: rgb(17, 17, 27); + } +} + +/* Bento Boxes */ +@property --angle { + inherits: true; + initial-value: 0deg; + syntax: "<angle>"; +} + +.bento-container { + --border-width: 1; + --border-radius: 5; + --border-speed: 2; + --angle: 0; + animation: rotate-gradient calc(var(--border-speed, 2) * 1s) infinite linear; + animation-play-state: paused; + --gradient: conic-gradient( + from calc(180deg + var(--angle)) at 50% 70%, + #ff240055, + #e81d1d55, + #e8b71d55, + #e3e81d55, + #1de84055, + #1ddde855, + #2b1de855, + #dd00f355, + #dd00f355 + ); +} +.bento-container:hover { + animation-play-state: running; + --alpha: 0; +} +@keyframes rotate-gradient { + from { + --angle: 0deg; + } + to { + --angle: 360deg; + } +} +.bento-box { + --bg: var(--ctp-base); + --bg-grad: linear-gradient(-45deg, var(--ctp-surface0), var(--ctp-base)) + padding-box; + --border-gradient: var(--gradient) border-box; + background: var(--bg-grad); /*, var(--border-gradient);*/ + border: calc(var(--border-width, 2) * 1px) solid transparent; + padding: 2rem; + border-radius: calc(var(--border-radius, 8) * 1px); + position: relative; + transform: translate3d(0, 0, 0); + transition: background 0.1s; + box-shadow: 0px 8px 16px 0px rgba(17, 17, 27, 0.24), + 0px 0px 4px 0px rgba(17, 17, 27, 0.04), + rgba(205, 214, 244, 0.235) 0px 0px 1px 0px inset; + background-size: 100%; + background-repeat: no-repeat; + overflow: hidden; +} +.bento-box:hover { + background: var(--bg-grad), var(--border-gradient); + background-size: 110%; + background-repeat: no-repeat; + background-position: top center; +} + +.bento-box::before { + content: ""; + position: absolute; + inset: calc(var(--border-width) * -1px); + border-radius: calc(var(--border-radius) * 1px); + background: var(--ctp-surface0); + opacity: var(--alpha, 0.5); + transition: opacity 0.2s; +} + +.bento-box .img-header { + transition: all 0.1s ease-out; + margin: -2rem; + position: absolute; + z-index: -1; +} +.bento-box:hover .img-header { + filter: blur(5px); + transform: scale3d(1.15, 1.15, 1.15); +} +.bento-box .visible-on-hover { + visibility: hidden; +} +.bento-box:hover .visible-on-hover { + visibility: visible; +} +.bento-box .img-header::after { + background: #1fa9f4; + content: ""; +} + +.rainbow-borders { + border-image-source: linear-gradient( + 90deg, + rgba(251, 89, 74, 0.3) 0%, + rgba(251, 222, 75, 0.3) 25%, + rgba(112, 228, 112, 0.3) 50%, + rgba(51, 183, 255, 0.3) 75% + ); + + border-bottom-width: 2px; + border-image-slice: 1; +} +.rainbow-borders:hover { + border-image-source: linear-gradient( + 90deg, + rgba(251, 89, 74, 1) 0%, + rgba(251, 222, 75, 1) 25%, + rgba(112, 228, 112, 1) 50%, + rgba(51, 183, 255, 1) 75% + ); +} + +.outfit-900 { + font-family: "Outfit", sans-serif; + font-optical-sizing: auto; + font-weight: 900; + font-style: normal; +} + +@media (prefers-color-scheme: light) { + .main-header-darken { + background: #555; + } +} + +.textured-bg:before { + content: " "; + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + background: url(/textures/cubes.png), var(--ctp-base); + background-blend-mode: multiply; +} + +@media (prefers-color-scheme: dark) { + .textured-bg:before { + content: " "; + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + background: url(/textures/micro_carbon.png), var(--ctp-base); + background-blend-mode: luminosity; + } +} diff --git a/crates/www/tailwind.config.js b/crates/www/tailwind.config.js new file mode 100644 index 00000000..b287473b --- /dev/null +++ b/crates/www/tailwind.config.js @@ -0,0 +1,371 @@ +/** @type {import('tailwindcss').Config} */ +module.exports = { + content: { + files: ["*.html", "./crates/www/**/*.rs"], + }, + theme: { + extend: { + backgroundColor: { + "ctp-rosewater": "var(--ctp-rosewater)", + "ctp-flamingo": "var(--ctp-flamingo)", + "ctp-pink": "var(--ctp-pink)", + "ctp-mauve": "var(--ctp-mauve)", + "ctp-red": "var(--ctp-red)", + "ctp-maroon": "var(--ctp-maroon)", + "ctp-peach": "var(--ctp-peach)", + "ctp-yellow": "var(--ctp-yellow)", + "ctp-green": "var(--ctp-green)", + "ctp-teal": "var(--ctp-teal)", + "ctp-sky": "var(--ctp-sky)", + "ctp-sapphire": "var(--ctp-sapphire)", + "ctp-blue": "var(--ctp-blue)", + "ctp-lavender": "var(--ctp-lavender)", + "ctp-text": "var(--ctp-text)", + "ctp-subtext1": "var(--ctp-subtext1)", + "ctp-subtext0": "var(--ctp-subtext0)", + "ctp-overlay2": "var(--ctp-overlay2)", + "ctp-overlay1": "var(--ctp-overlay1)", + "ctp-overlay0": "var(--ctp-overlay0)", + "ctp-surface2": "var(--ctp-surface2)", + "ctp-surface1": "var(--ctp-surface1)", + "ctp-surface0": "var(--ctp-surface0)", + "ctp-base": "var(--ctp-base)", + "ctp-mantle": "var(--ctp-mantle)", + "ctp-crust": "var(--ctp-crust)", + "brand-youtube": "#ff0000", + "brand-mastodon": "#6364FF", + }, + borderColor: { + "ctp-rosewater": "var(--ctp-rosewater)", + "ctp-flamingo": "var(--ctp-flamingo)", + "ctp-pink": "var(--ctp-pink)", + "ctp-mauve": "var(--ctp-mauve)", + "ctp-red": "var(--ctp-red)", + "ctp-maroon": "var(--ctp-maroon)", + "ctp-peach": "var(--ctp-peach)", + "ctp-yellow": "var(--ctp-yellow)", + "ctp-green": "var(--ctp-green)", + "ctp-teal": "var(--ctp-teal)", + "ctp-sky": "var(--ctp-sky)", + "ctp-sapphire": "var(--ctp-sapphire)", + "ctp-blue": "var(--ctp-blue)", + "ctp-lavender": "var(--ctp-lavender)", + "ctp-text": "var(--ctp-text)", + "ctp-subtext1": "var(--ctp-subtext1)", + "ctp-subtext0": "var(--ctp-subtext0)", + "ctp-overlay2": "var(--ctp-overlay2)", + "ctp-overlay1": "var(--ctp-overlay1)", + "ctp-overlay0": "var(--ctp-overlay0)", + "ctp-surface2": "var(--ctp-surface2)", + "ctp-surface1": "var(--ctp-surface1)", + "ctp-surface0": "var(--ctp-surface0)", + "ctp-base": "var(--ctp-base)", + "ctp-mantle": "var(--ctp-mantle)", + "ctp-crust": "var(--ctp-crust)", + "brand-youtube": "#ff0000", + "brand-mastodon": "#6364FF", + }, + caretColor: { + "ctp-rosewater": "var(--ctp-rosewater)", + "ctp-flamingo": "var(--ctp-flamingo)", + "ctp-pink": "var(--ctp-pink)", + "ctp-mauve": "var(--ctp-mauve)", + "ctp-red": "var(--ctp-red)", + "ctp-maroon": "var(--ctp-maroon)", + "ctp-peach": "var(--ctp-peach)", + "ctp-yellow": "var(--ctp-yellow)", + "ctp-green": "var(--ctp-green)", + "ctp-teal": "var(--ctp-teal)", + "ctp-sky": "var(--ctp-sky)", + "ctp-sapphire": "var(--ctp-sapphire)", + "ctp-blue": "var(--ctp-blue)", + "ctp-lavender": "var(--ctp-lavender)", + "ctp-text": "var(--ctp-text)", + "ctp-subtext1": "var(--ctp-subtext1)", + "ctp-subtext0": "var(--ctp-subtext0)", + "ctp-overlay2": "var(--ctp-overlay2)", + "ctp-overlay1": "var(--ctp-overlay1)", + "ctp-overlay0": "var(--ctp-overlay0)", + "ctp-surface2": "var(--ctp-surface2)", + "ctp-surface1": "var(--ctp-surface1)", + "ctp-surface0": "var(--ctp-surface0)", + "ctp-base": "var(--ctp-base)", + "ctp-mantle": "var(--ctp-mantle)", + "ctp-crust": "var(--ctp-crust)", + "brand-youtube": "#ff0000", + "brand-mastodon": "#6364FF", + }, + colors: { + "ctp-rosewater": "var(--ctp-rosewater)", + "ctp-flamingo": "var(--ctp-flamingo)", + "ctp-pink": "var(--ctp-pink)", + "ctp-mauve": "var(--ctp-mauve)", + "ctp-red": "var(--ctp-red)", + "ctp-maroon": "var(--ctp-maroon)", + "ctp-peach": "var(--ctp-peach)", + "ctp-yellow": "var(--ctp-yellow)", + "ctp-green": "var(--ctp-green)", + "ctp-teal": "var(--ctp-teal)", + "ctp-sky": "var(--ctp-sky)", + "ctp-sapphire": "var(--ctp-sapphire)", + "ctp-blue": "var(--ctp-blue)", + "ctp-lavender": "var(--ctp-lavender)", + "ctp-text": "var(--ctp-text)", + "ctp-subtext1": "var(--ctp-subtext1)", + "ctp-subtext0": "var(--ctp-subtext0)", + "ctp-overlay2": "var(--ctp-overlay2)", + "ctp-overlay1": "var(--ctp-overlay1)", + "ctp-overlay0": "var(--ctp-overlay0)", + "ctp-surface2": "var(--ctp-surface2)", + "ctp-surface1": "var(--ctp-surface1)", + "ctp-surface0": "var(--ctp-surface0)", + "ctp-base": "var(--ctp-base)", + "ctp-mantle": "var(--ctp-mantle)", + "ctp-crust": "var(--ctp-crust)", + "brand-youtube": "#ff0000", + "brand-mastodon": "#6364FF", + }, + divideColor: { + "ctp-rosewater": "var(--ctp-rosewater)", + "ctp-flamingo": "var(--ctp-flamingo)", + "ctp-pink": "var(--ctp-pink)", + "ctp-mauve": "var(--ctp-mauve)", + "ctp-red": "var(--ctp-red)", + "ctp-maroon": "var(--ctp-maroon)", + "ctp-peach": "var(--ctp-peach)", + "ctp-yellow": "var(--ctp-yellow)", + "ctp-green": "var(--ctp-green)", + "ctp-teal": "var(--ctp-teal)", + "ctp-sky": "var(--ctp-sky)", + "ctp-sapphire": "var(--ctp-sapphire)", + "ctp-blue": "var(--ctp-blue)", + "ctp-lavender": "var(--ctp-lavender)", + "ctp-text": "var(--ctp-text)", + "ctp-subtext1": "var(--ctp-subtext1)", + "ctp-subtext0": "var(--ctp-subtext0)", + "ctp-overlay2": "var(--ctp-overlay2)", + "ctp-overlay1": "var(--ctp-overlay1)", + "ctp-overlay0": "var(--ctp-overlay0)", + "ctp-surface2": "var(--ctp-surface2)", + "ctp-surface1": "var(--ctp-surface1)", + "ctp-surface0": "var(--ctp-surface0)", + "ctp-base": "var(--ctp-base)", + "ctp-mantle": "var(--ctp-mantle)", + "ctp-crust": "var(--ctp-crust)", + "brand-youtube": "#ff0000", + "brand-mastodon": "#6364FF", + }, + fill: { + "ctp-rosewater": "var(--ctp-rosewater)", + "ctp-flamingo": "var(--ctp-flamingo)", + "ctp-pink": "var(--ctp-pink)", + "ctp-mauve": "var(--ctp-mauve)", + "ctp-red": "var(--ctp-red)", + "ctp-maroon": "var(--ctp-maroon)", + "ctp-peach": "var(--ctp-peach)", + "ctp-yellow": "var(--ctp-yellow)", + "ctp-green": "var(--ctp-green)", + "ctp-teal": "var(--ctp-teal)", + "ctp-sky": "var(--ctp-sky)", + "ctp-sapphire": "var(--ctp-sapphire)", + "ctp-blue": "var(--ctp-blue)", + "ctp-lavender": "var(--ctp-lavender)", + "ctp-text": "var(--ctp-text)", + "ctp-subtext1": "var(--ctp-subtext1)", + "ctp-subtext0": "var(--ctp-subtext0)", + "ctp-overlay2": "var(--ctp-overlay2)", + "ctp-overlay1": "var(--ctp-overlay1)", + "ctp-overlay0": "var(--ctp-overlay0)", + "ctp-surface2": "var(--ctp-surface2)", + "ctp-surface1": "var(--ctp-surface1)", + "ctp-surface0": "var(--ctp-surface0)", + "ctp-base": "var(--ctp-base)", + "ctp-mantle": "var(--ctp-mantle)", + "ctp-crust": "var(--ctp-crust)", + "brand-youtube": "#ff0000", + "brand-mastodon": "#6364FF", + }, + gradientColorStops: { + "ctp-rosewater": "var(--ctp-rosewater)", + "ctp-flamingo": "var(--ctp-flamingo)", + "ctp-pink": "var(--ctp-pink)", + "ctp-mauve": "var(--ctp-mauve)", + "ctp-red": "var(--ctp-red)", + "ctp-maroon": "var(--ctp-maroon)", + "ctp-peach": "var(--ctp-peach)", + "ctp-yellow": "var(--ctp-yellow)", + "ctp-green": "var(--ctp-green)", + "ctp-teal": "var(--ctp-teal)", + "ctp-sky": "var(--ctp-sky)", + "ctp-sapphire": "var(--ctp-sapphire)", + "ctp-blue": "var(--ctp-blue)", + "ctp-lavender": "var(--ctp-lavender)", + "ctp-text": "var(--ctp-text)", + "ctp-subtext1": "var(--ctp-subtext1)", + "ctp-subtext0": "var(--ctp-subtext0)", + "ctp-overlay2": "var(--ctp-overlay2)", + "ctp-overlay1": "var(--ctp-overlay1)", + "ctp-overlay0": "var(--ctp-overlay0)", + "ctp-surface2": "var(--ctp-surface2)", + "ctp-surface1": "var(--ctp-surface1)", + "ctp-surface0": "var(--ctp-surface0)", + "ctp-base": "var(--ctp-base)", + "ctp-mantle": "var(--ctp-mantle)", + "ctp-crust": "var(--ctp-crust)", + "brand-youtube": "#ff0000", + "brand-mastodon": "#6364FF", + }, + placeholderColor: { + "ctp-rosewater": "var(--ctp-rosewater)", + "ctp-flamingo": "var(--ctp-flamingo)", + "ctp-pink": "var(--ctp-pink)", + "ctp-mauve": "var(--ctp-mauve)", + "ctp-red": "var(--ctp-red)", + "ctp-maroon": "var(--ctp-maroon)", + "ctp-peach": "var(--ctp-peach)", + "ctp-yellow": "var(--ctp-yellow)", + "ctp-green": "var(--ctp-green)", + "ctp-teal": "var(--ctp-teal)", + "ctp-sky": "var(--ctp-sky)", + "ctp-sapphire": "var(--ctp-sapphire)", + "ctp-blue": "var(--ctp-blue)", + "ctp-lavender": "var(--ctp-lavender)", + "ctp-text": "var(--ctp-text)", + "ctp-subtext1": "var(--ctp-subtext1)", + "ctp-subtext0": "var(--ctp-subtext0)", + "ctp-overlay2": "var(--ctp-overlay2)", + "ctp-overlay1": "var(--ctp-overlay1)", + "ctp-overlay0": "var(--ctp-overlay0)", + "ctp-surface2": "var(--ctp-surface2)", + "ctp-surface1": "var(--ctp-surface1)", + "ctp-surface0": "var(--ctp-surface0)", + "ctp-base": "var(--ctp-base)", + "ctp-mantle": "var(--ctp-mantle)", + "ctp-crust": "var(--ctp-crust)", + "brand-youtube": "#ff0000", + "brand-mastodon": "#6364FF", + }, + ringColor: { + "ctp-rosewater": "var(--ctp-rosewater)", + "ctp-flamingo": "var(--ctp-flamingo)", + "ctp-pink": "var(--ctp-pink)", + "ctp-mauve": "var(--ctp-mauve)", + "ctp-red": "var(--ctp-red)", + "ctp-maroon": "var(--ctp-maroon)", + "ctp-peach": "var(--ctp-peach)", + "ctp-yellow": "var(--ctp-yellow)", + "ctp-green": "var(--ctp-green)", + "ctp-teal": "var(--ctp-teal)", + "ctp-sky": "var(--ctp-sky)", + "ctp-sapphire": "var(--ctp-sapphire)", + "ctp-blue": "var(--ctp-blue)", + "ctp-lavender": "var(--ctp-lavender)", + "ctp-text": "var(--ctp-text)", + "ctp-subtext1": "var(--ctp-subtext1)", + "ctp-subtext0": "var(--ctp-subtext0)", + "ctp-overlay2": "var(--ctp-overlay2)", + "ctp-overlay1": "var(--ctp-overlay1)", + "ctp-overlay0": "var(--ctp-overlay0)", + "ctp-surface2": "var(--ctp-surface2)", + "ctp-surface1": "var(--ctp-surface1)", + "ctp-surface0": "var(--ctp-surface0)", + "ctp-base": "var(--ctp-base)", + "ctp-mantle": "var(--ctp-mantle)", + "ctp-crust": "var(--ctp-crust)", + "brand-youtube": "#ff0000", + "brand-mastodon": "#6364FF", + }, + ringOffsetColor: { + "ctp-rosewater": "var(--ctp-rosewater)", + "ctp-flamingo": "var(--ctp-flamingo)", + "ctp-pink": "var(--ctp-pink)", + "ctp-mauve": "var(--ctp-mauve)", + "ctp-red": "var(--ctp-red)", + "ctp-maroon": "var(--ctp-maroon)", + "ctp-peach": "var(--ctp-peach)", + "ctp-yellow": "var(--ctp-yellow)", + "ctp-green": "var(--ctp-green)", + "ctp-teal": "var(--ctp-teal)", + "ctp-sky": "var(--ctp-sky)", + "ctp-sapphire": "var(--ctp-sapphire)", + "ctp-blue": "var(--ctp-blue)", + "ctp-lavender": "var(--ctp-lavender)", + "ctp-text": "var(--ctp-text)", + "ctp-subtext1": "var(--ctp-subtext1)", + "ctp-subtext0": "var(--ctp-subtext0)", + "ctp-overlay2": "var(--ctp-overlay2)", + "ctp-overlay1": "var(--ctp-overlay1)", + "ctp-overlay0": "var(--ctp-overlay0)", + "ctp-surface2": "var(--ctp-surface2)", + "ctp-surface1": "var(--ctp-surface1)", + "ctp-surface0": "var(--ctp-surface0)", + "ctp-base": "var(--ctp-base)", + "ctp-mantle": "var(--ctp-mantle)", + "ctp-crust": "var(--ctp-crust)", + "brand-youtube": "#ff0000", + "brand-mastodon": "#6364FF", + }, + stroke: { + "ctp-rosewater": "var(--ctp-rosewater)", + "ctp-flamingo": "var(--ctp-flamingo)", + "ctp-pink": "var(--ctp-pink)", + "ctp-mauve": "var(--ctp-mauve)", + "ctp-red": "var(--ctp-red)", + "ctp-maroon": "var(--ctp-maroon)", + "ctp-peach": "var(--ctp-peach)", + "ctp-yellow": "var(--ctp-yellow)", + "ctp-green": "var(--ctp-green)", + "ctp-teal": "var(--ctp-teal)", + "ctp-sky": "var(--ctp-sky)", + "ctp-sapphire": "var(--ctp-sapphire)", + "ctp-blue": "var(--ctp-blue)", + "ctp-lavender": "var(--ctp-lavender)", + "ctp-text": "var(--ctp-text)", + "ctp-subtext1": "var(--ctp-subtext1)", + "ctp-subtext0": "var(--ctp-subtext0)", + "ctp-overlay2": "var(--ctp-overlay2)", + "ctp-overlay1": "var(--ctp-overlay1)", + "ctp-overlay0": "var(--ctp-overlay0)", + "ctp-surface2": "var(--ctp-surface2)", + "ctp-surface1": "var(--ctp-surface1)", + "ctp-surface0": "var(--ctp-surface0)", + "ctp-base": "var(--ctp-base)", + "ctp-mantle": "var(--ctp-mantle)", + "ctp-crust": "var(--ctp-crust)", + "brand-youtube": "#ff0000", + "brand-mastodon": "#6364FF", + }, + textColor: { + "ctp-rosewater": "var(--ctp-rosewater)", + "ctp-flamingo": "var(--ctp-flamingo)", + "ctp-pink": "var(--ctp-pink)", + "ctp-mauve": "var(--ctp-mauve)", + "ctp-red": "var(--ctp-red)", + "ctp-maroon": "var(--ctp-maroon)", + "ctp-peach": "var(--ctp-peach)", + "ctp-yellow": "var(--ctp-yellow)", + "ctp-green": "var(--ctp-green)", + "ctp-teal": "var(--ctp-teal)", + "ctp-sky": "var(--ctp-sky)", + "ctp-sapphire": "var(--ctp-sapphire)", + "ctp-blue": "var(--ctp-blue)", + "ctp-lavender": "var(--ctp-lavender)", + "ctp-text": "var(--ctp-text)", + "ctp-subtext1": "var(--ctp-subtext1)", + "ctp-subtext0": "var(--ctp-subtext0)", + "ctp-overlay2": "var(--ctp-overlay2)", + "ctp-overlay1": "var(--ctp-overlay1)", + "ctp-overlay0": "var(--ctp-overlay0)", + "ctp-surface2": "var(--ctp-surface2)", + "ctp-surface1": "var(--ctp-surface1)", + "ctp-surface0": "var(--ctp-surface0)", + "ctp-base": "var(--ctp-base)", + "ctp-mantle": "var(--ctp-mantle)", + "ctp-crust": "var(--ctp-crust)", + "brand-youtube": "#ff0000", + "brand-mastodon": "#6364FF", + }, + }, + }, + plugins: [require("@tailwindcss/forms"), require("@tailwindcss/typography")], +}; diff --git a/fly.toml b/fly.toml new file mode 100644 index 00000000..1f083a86 --- /dev/null +++ b/fly.toml @@ -0,0 +1,37 @@ +app = "christopherbiscardi" +kill_signal = "SIGINT" +kill_timeout = 5 +processes = [] + +[env] +RUST_LOG = "info" + +[experimental] +allowed_public_ports = [] +auto_rollback = true + +[[services]] +http_checks = [] +internal_port = 3000 +processes = ["app"] +protocol = "tcp" +script_checks = [] +[services.concurrency] +hard_limit = 25 +soft_limit = 20 +type = "connections" + +[[services.ports]] +force_https = true +handlers = ["http"] +port = 80 + +[[services.ports]] +handlers = ["tls", "http"] +port = 443 + +[[services.tcp_checks]] +grace_period = "1s" +interval = "15s" +restart_limit = 0 +timeout = "2s" diff --git a/justfile b/justfile new file mode 100644 index 00000000..b477f63e --- /dev/null +++ b/justfile @@ -0,0 +1,4 @@ +watch: + cargo leptos watch --project www +build: + cargo leptos build --project www --release \ No newline at end of file diff --git a/rust-toolchain.toml b/rust-toolchain.toml new file mode 100644 index 00000000..fc116afb --- /dev/null +++ b/rust-toolchain.toml @@ -0,0 +1,2 @@ +[toolchain] +channel = "nightly-2024-08-10"