commit 11f391964b9133143f3ea558a05c23aa721e94e7 Author: opensourcecheemsburgers Date: Fri Mar 7 17:16:08 2025 +0200 Initial template commit diff --git a/.cargo/config.toml b/.cargo/config.toml new file mode 100644 index 0000000..e33feca --- /dev/null +++ b/.cargo/config.toml @@ -0,0 +1,16 @@ +[target.wasm32-unknown-unknown] +runner = 'wasm-bindgen-test-runner' + +[build] +rustflags = ["-Z", "threads=16"] +jobs = 16 + +[target.x86_64-unknown-linux-gnu] +linker = "clang" +rustflags = ["-C", "link-arg=-fuse-ld=/usr/bin/mold", "-Z", "codegen-backend=cranelift"] + +[unstable] +codegen-backend = true + +[profile.server-dev] +codegen-backend = "cranelift" diff --git a/.dprint.jsonc b/.dprint.jsonc new file mode 100644 index 0000000..6d16b08 --- /dev/null +++ b/.dprint.jsonc @@ -0,0 +1,32 @@ +{ + "excludes": [ + "**/node_modules", + "**/target", + "**/dist", + "**/*-lock.json", + "**/*.lock", + "src-tauri/gen/", + "frontend/assets/css/output.css", + ], + "exec": { + "commands": [ + { + "command": "just fmt-rust", + "exts": ["rs"], + }, + { + "command": "just --unstable --fmt", + "exts": ["justfile", ".justfile"], + }, + ], + }, + "plugins": [ + "https://plugins.dprint.dev/markdown-0.17.8.wasm", + "https://plugins.dprint.dev/toml-0.6.3.wasm", + "https://plugins.dprint.dev/exec-0.5.1.json@492414e39dea4dccc07b4af796d2f4efdb89e84bae2bd4e1e924c0cc050855bf", + "https://plugins.dprint.dev/g-plane/markup_fmt-v0.18.0.wasm", + "https://plugins.dprint.dev/g-plane/malva-v0.11.1.wasm", + "https://plugins.dprint.dev/typescript-0.93.3.wasm", + "https://plugins.dprint.dev/json-0.19.4.wasm", + ], +} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..390dd18 --- /dev/null +++ b/.gitignore @@ -0,0 +1,105 @@ +# Rust / Leptos +target/ +dist/ +debug/ +src-tauri/gen/ +src-tauri/icons/ +Cargo.lock +**/*.rs.bk +*.pdb + +# Ides +.idea +.vscode/settings.json +*.sublime* + +# runtime data +pids +*.pid +*.seed +*.pid.lock + +# miscellaneous +/.vs +.DS_Store +.Thumbs.db +debug.log +TODO.md + +### Javascript +.npm/ +.yarn/ +package-lock.json +node_modules +yarn.lock +bun.lockb +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +*.tgz + +# dotenv environment variables file +.env + +# Android + +# Gradle files +.gradle/ +build/ + +# Local configuration file (sdk path, etc) +local.properties + +# Log/OS Files +*.log + +# Android Studio generated files and folders +captures/ +.externalNativeBuild/ +.cxx/ +*.apk +output.json + +# IntelliJ +*.iml +.idea/ +misc.xml +deploymentTargetDropDown.xml +render.experimental.xml + +# Keystore files +*.jks +*.keystore + +# Google Services (e.g. APIs or Firebase) +google-services.json + +# Android Profiling +*.hprof + +# Compiled class file +*.class + +# Log file +*.log + +# BlueJ files +*.ctxt + +# Mobile Tools for Java (J2ME) +.mtj.tmp/ + +# Package Files # +*.jar +*.war +*.nar +*.ear +*.zip +*.tar.gz +*.rar + +# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml +hs_err_pid* +replay_pid* diff --git a/.helix/languages.toml b/.helix/languages.toml new file mode 100644 index 0000000..a22169a --- /dev/null +++ b/.helix/languages.toml @@ -0,0 +1,129 @@ +[[language]] +name = "rust" +scope = "source.rust" +injection-regex = "rust_with_rstml" +grammar = "rust_with_rstml" +file-types = ["rs"] +roots = ["Cargo.toml", "Cargo.lock", "tailwind.config.js"] +language-servers = ["rust-analyzer", "tailwindcss-language-server"] +formatter = { command = "dprint", args = ["fmt", "--stdin", "rs"] } +auto-format = true + +[[grammar]] +name = "rust_with_rstml" +source = { git = "https://github.com/rayliwell/tree-sitter-rstml", rev = "c0a807f052c80575e2b5e2c0e01a5c65baaaa08c", subpath = "rust_with_rstml" } + +[language-server.rust-analyzer.config] +cargo.allFeatures = true +check.command = "clippy" +except-features = ["format"] +diagnostics = { experimental = { enable = true } } +hover = { actions = { enable = true } } +typing = { autoClosingAngleBrackets = { enable = true } } +procMacro = { enable = true } + +[language-server.tailwindcss-language-server] +command = "tailwindcss-language-server" +args = ["--stdio"] +config = { userLanguages = { rust = "html", "*.rs" = "html" }, tailwindCSS = { experimental = { classRegex = ['(class="(.*?)"|.class\("(.*?)"\)|.trace\("(.*?)"\)|.inline\("(.*?)"\)|(_?)(CLASSES|classes|CLASS|class)(:\s(&str|&\x27static str|String))?.=.(String::new\("(.*?)"\)|String::from\("(.*?)"\)|"(.*?)"))'] } } } + +# [language-server.dprint-language-server] +# command = "dprint" +# args = ["lsp"] + +[[language]] +name = "html" +file-types = ["html"] +language-servers = [ + "vscode-html-language-server", + "tailwindcss-language-server", +] +formatter = { command = "dprint", args = ["fmt", "--stdin", "html"] } +auto-format = true + +[language-server.vscode-html-language-server] +command = "vscode-html-language-server" +args = ["--stdio"] + +[[language]] +name = "css" +file-types = ["css"] +language-servers = ["vscode-css-language-server", "tailwindcss-language-server"] +formatter = { command = "dprint", args = ["fmt", "--stdin", "css"] } +auto-format = true + +[language-server.vscode-css-language-server] +command = "vscode-css-language-server" +args = ["--stdio"] + +[language-server.vscode-css-language-server.config] +css = { validate = { enable = true } } +scss = { validate = { enable = true } } +less = { validate = { enable = true } } +provideFormatter = true + +[[language]] +name = "json" +file-types = ["json"] +language-servers = ["vscode-json-language-server"] +formatter = { command = "dprint", args = ["fmt", "--stdin", "json"] } +auto-format = true + +[[language]] +name = "jsonc" +file-types = ["jsonc"] +language-servers = ["vscode-json-language-server"] +formatter = { command = "dprint", args = ["fmt", "--stdin", "jsonc"] } +auto-format = true + +[language-server.vscode-json-language-server] +command = "vscode-json-language-server" +args = ["--stdio"] + +[[language]] +name = "javascript" +file-types = ["js", "jsx"] +language-servers = ["typescript-language-server"] +formatter = { command = "dprint", args = ["fmt", "--stdin", "js"] } +auto-format = true + +[[language]] +name = "typescript" +file-types = ["js", "jsx"] +language-servers = ["typescript-language-server"] +formatter = { command = "dprint", args = ["fmt", "--stdin", "ts"] } +auto-format = true + +[[language]] +name = "jsx" +language-servers = ["typescript-language-server"] +formatter = { command = "dprint", args = ["fmt", "--stdin", "jsx"] } +auto-format = true + +[[language]] +name = "tsx" +language-servers = ["typescript-language-server"] +formatter = { command = "dprint", args = ["fmt", "--stdin", "tsx"] } +auto-format = true + +[[language]] +name = "toml" +file-types = ["toml"] +roots = ["."] +language-servers = ["taplo"] +formatter = { command = "dprint", args = ["fmt", "--stdin", "toml"] } +auto-format = true + +[language-server.taplo] +command = "taplo" +args = ["lsp", "stdio"] + +[language-server.taplo.config] +root_dir = [".git", "*.toml"] + +[[language]] +name = "markdown" +file-types = ["md"] +language-servers = ["marksman"] +formatter = { command = "dprint", args = ["fmt", "--stdin", "md"] } +auto-format = true diff --git a/.ignore b/.ignore new file mode 100644 index 0000000..97a09f5 --- /dev/null +++ b/.ignore @@ -0,0 +1,4 @@ +frontend/assets/fonts/* +src-tauri/icons/* +src-tauri/gen/* +target/* diff --git a/.justfile b/.justfile new file mode 100644 index 0000000..c9d7449 --- /dev/null +++ b/.justfile @@ -0,0 +1,149 @@ +use-nightly: + rustup default nightly + rustup update + +use-stable: + rustup default stable + rustup update + +install-windows-cross-compilation-deps: + yay -S nsis + cargo install --locked cargo-xwin + +install-deps: install-windows-cross-compilation-deps + yay -S --needed \ + webkit2gtk-4.1 \ + base-devel \ + curl \ + wget \ + file \ + openssl \ + appmenu-gtk-module \ + libappindicator-gtk3 \ + librsvg + +install-formatters-and-lsps: + rustup component add rust-analyzer + cargo install dprint leptosfmt + taplo-cli --features "lsp" --locked + +install-tauri: + cargo install create-tauri-app + cargo install tauri-cli + +clean-cargo-tomls: + cargo sort --workspace --grouped + cargo machete --with-metadata --fix + +fmt-rust: + sh -c 'rustywind --custom-regex "(?:class=\"|.class\\(\"|.trace\\(\"|.inline\\(\"|(?:_?)(?:CLASSES|classes|CLASS|class)(?::\\s(?:&str|&\\x27static str|String))?.=.(?:String::new\\(\"|String::from\\(\"|\"))([_a-zA-Z0-9\\.,\\s\\-:\\[\\]()/#]+)(?:\")" --stdin | leptosfmt --stdin --rustfmt -q' + +fmt: + dprint fmt \ + --allow-no-files \ + --config .dprint.json \ + --incremental \ + --log-level warn + +[linux] +check-timings: + RUSTFLAGS="-C panic=abort" \ + cargo check \ + --debug \ + --runner cargo-xwin \ + --target x86_64-pc-windows-msvc \ + -- \ + -Z build-std=std,panic_abort \ + -Z build-std-features=panic_immediate_abort + +[windows] +check-timings: + RUSTFLAGS="-C panic=abort" \ + cargo check \ + --debug \ + --runner cargo-xwin \ + --target x86_64-pc-windows-msvc \ + -- \ + -Z build-std=std,panic_abort \ + -Z build-std-features=panic_immediate_abort + +[linux] +dev: + RUSTFLAGS="-C panic=abort" \ + cargo tauri dev \ + --target x86_64-unknown-linux-gnu \ + -- \ + -Z build-std=std,panic_abort \ + -Z build-std-features=panic_immediate_abort + +[windows] +dev: + RUSTFLAGS="-C panic=abort" \ + cargo tauri dev \ + --target x86_64-pc-windows-msvc \ + -- \ + -Z build-std=std,panic_abort \ + -Z build-std-features=panic_immediate_abort + +[linux] +build: + RUSTFLAGS="-C panic=abort" \ + cargo tauri build \ + --debug \ + --target x86_64-unknown-linux-gnu \ + -- \ + -Z build-std=std,panic_abort \ + -Z build-std-features=panic_immediate_abort + +[linux] +test: + RUSTFLAGS="-C panic=abort" \ + cargo run \ + -p template-e2e + --target x86_64-unknown-linux-gnu \ + -- \ + -Z build-std=std,panic_abort \ + -Z build-std-features=panic_immediate_abort + +[windows] +build: + RUSTFLAGS="-C panic=abort" \ + cargo tauri build \ + --debug \ + --target x86_64-pc-windows-msvc \ + -- \ + -Z build-std=std,panic_abort \ + -Z build-std-features=panic_immediate_abort + +[linux] +build-release: + RUSTFLAGS="-C panic=abort" \ + cargo tauri build \ + --target x86_64-unknown-linux-gnu \ + -- \ + -Z build-std=std,panic_abort \ + -Z build-std-features=panic_immediate_abort \ + -Z build-std-features="optimize_for_size" + +[windows] +build-release: + RUSTFLAGS="-C panic=abort" \ + cargo tauri build \ + --target x86_64-pc-windows-msvc \ + -- \ + -Z build-std=std,panic_abort \ + -Z build-std-features=panic_immediate_abort \ + -Z build-std-features="optimize_for_size" + +cross-compile-windows: + RUSTFLAGS="-C panic=abort" \ + cargo tauri build \ + --runner cargo-xwin \ + --target x86_64-pc-windows-msvc \ + -- \ + -Z build-std=std,panic_abort \ + -Z build-std-features=panic_immediate_abort \ + -Z build-std-features="optimize_for_size" + +browser_drivers: + geckodriver --host 127.0.0.1 --port 4444 diff --git a/.leptosfmt.toml b/.leptosfmt.toml new file mode 100644 index 0000000..d8e3c0e --- /dev/null +++ b/.leptosfmt.toml @@ -0,0 +1,10 @@ +max_width = 120 +tab_spaces = 4 +indentation_style = "Tabs" +newline_style = "Unix" +attr_value_brace_style = "WhenRequired" +macro_names = ["leptos::view", "view"] +closing_tag_style = "Preserve" + +[attr_values] +class = "Tailwind" diff --git a/.rustfmt.toml b/.rustfmt.toml new file mode 100644 index 0000000..9e95630 --- /dev/null +++ b/.rustfmt.toml @@ -0,0 +1,14 @@ +edition = "2024" +tab_spaces = 4 +max_width = 120 +chain_width = 40 +single_line_if_else_max_width = 0 +comment_width = 100 +format_strings = true +imports_layout = "Vertical" +imports_granularity = "Crate" +group_imports = "StdExternalCrate" +format_code_in_doc_comments = true +wrap_comments = true +use_field_init_shorthand = true +use_small_heuristics = "Max" diff --git a/.rusty-hook.toml b/.rusty-hook.toml new file mode 100644 index 0000000..af81a3b --- /dev/null +++ b/.rusty-hook.toml @@ -0,0 +1,2 @@ +[logging] +verbose = true diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..0daba7b --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,61 @@ +[workspace] +members = ["frontend", "src-tauri", "tests"] +resolver = "2" + +[workspace.package] +version = "0.0.0" +authors = ["Stephen Power"] +categories = ["wasm", "web-programming"] +edition = "2021" +keywords = ["tauri", "leptos", "dprint", "tailwind", "daisyui", "helix", "wasm"] +license = "AGPL-3.0" +readme = "README.md" +repository = "88.80.188.133:3000/opensourcecheemsburgers/template" +description = "A template." + +[workspace.lints.rust] +unsafe_code = "forbid" + +[workspace.lints.clippy] +all = "warn" +pedantic = "warn" +nursery = "warn" +cargo = "warn" + +[profile.release] +panic = "abort" +codegen-units = 1 +lto = "fat" +opt-level = 3 +strip = true + +[profile.dev] +panic = "abort" +opt-level = 1 +codegen-units = 256 +lto = "off" +incremental = true +debug = false # Enable if debugging is necessary. + +[profile.dev.package."*"] +opt-level = 3 + +[workspace.dev-dependencies] +rusty-hook = "0.11.2" +wasm-bindgen-test = "0.3.0" + +[workspace.dependencies] +console_error_panic_hook = "0.1.7" +gloo = "0.11.0" +leptos = { version = "0.7.7", features = ["csr", "nightly"] } +phosphor-leptos = "0.7.0" +serde = { version = "1.0.218", features = ["derive"] } +serde_json = "1.0.139" +tailwind-css = "0.13.0" +tauri = { git = "https://github.com/tauri-apps/tauri/", branch = "refactor/android-dev", features = ["config-toml"] } +tauri-build = { version = "2.0.6", features = ["config-toml"] } +thirtyfour = "0.34.0" +thiserror = "2.0.11" +tokio = { version = "1", features = ["full"] } +wasm-bindgen = "0.2.100" +web-sys = "0.3.77" diff --git a/README.md b/README.md new file mode 100644 index 0000000..a973874 --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +# Title diff --git a/frontend/Cargo.toml b/frontend/Cargo.toml new file mode 100644 index 0000000..2aad948 --- /dev/null +++ b/frontend/Cargo.toml @@ -0,0 +1,21 @@ +[package] +name = "template-frontend" +version.workspace = true +authors.workspace = true +categories.workspace = true +edition.workspace = true +keywords.workspace = true +license.workspace = true +readme.workspace = true +repository.workspace = true +resolver = "2" +description.workspace = true + +[dependencies] +console_error_panic_hook.workspace = true +gloo.workspace = true +leptos.workspace = true +phosphor-leptos.workspace = true +tailwind-css.workspace = true +wasm-bindgen.workspace = true +web-sys.workspace = true diff --git a/frontend/README.md b/frontend/README.md new file mode 100644 index 0000000..2ce7133 --- /dev/null +++ b/frontend/README.md @@ -0,0 +1,15 @@ +# frontend + +To install dependencies: + +```bash +bun install +``` + +To run: + +```bash +bun run index.ts +``` + +This project was created using `bun init` in bun v1.1.38. [Bun](https://bun.sh) is a fast all-in-one JavaScript runtime. diff --git a/frontend/Trunk.toml b/frontend/Trunk.toml new file mode 100644 index 0000000..a5073f0 --- /dev/null +++ b/frontend/Trunk.toml @@ -0,0 +1,25 @@ +[build] +release = false +dist = "./dist" +filehash = true +target = "./index.html" + +[watch] +watch = ["./src", "./index.html", "./assets"] +ignore = ["../target", "./dist", "../src-tauri"] + +[serve] +addresses = ["127.0.0.1"] +port = 42069 +open = false +no_autoreload = false +ws_protocol = "ws" + +[clean] +dist = "./dist" +cargo = false + +[tools] +wasm_bindgen = "0.2.99" +wasm_opt = "version_118" +tailwindcss = "3.4.10" diff --git a/frontend/assets/css/input.css b/frontend/assets/css/input.css new file mode 100644 index 0000000..727b432 --- /dev/null +++ b/frontend/assets/css/input.css @@ -0,0 +1,417 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +@layer base { + .crisp-edges { + image-rendering: -webkit-optimize-contrast; + image-rendering: -moz-crisp-edges; + } + /* comfortaa-300 - latin */ + @font-face { + font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */ + font-family: "Comfortaa"; + font-style: normal; + font-weight: 300; + src: url("../../assets/fonts/comfortaa/comfortaa-v45-latin-300.woff2") + format( + "woff2" + ); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */ + } + + /* comfortaa-regular - latin */ + @font-face { + font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */ + font-family: "Comfortaa"; + font-style: normal; + font-weight: 400; + src: url("../../assets/fonts/comfortaa/comfortaa-v45-latin-regular.woff2") + format( + "woff2" + ); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */ + } + + /* comfortaa-500 - latin */ + @font-face { + font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */ + font-family: "Comfortaa"; + font-style: normal; + font-weight: 500; + src: url("../../assets/fonts/comfortaa/comfortaa-v45-latin-500.woff2") + format( + "woff2" + ); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */ + } + + /* comfortaa-600 - latin */ + @font-face { + font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */ + font-family: "Comfortaa"; + font-style: normal; + font-weight: 600; + src: url("../../assets/fonts/comfortaa/comfortaa-v45-latin-600.woff2") + format( + "woff2" + ); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */ + } + + /* comfortaa-700 - latin */ + @font-face { + font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */ + font-family: "Comfortaa"; + font-style: normal; + font-weight: 700; + src: url("../../assets/fonts/comfortaa/comfortaa-v45-latin-700.woff2") + format( + "woff2" + ); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */ + } + + /* figtree-300 - latin */ + @font-face { + font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */ + font-family: "Figtree"; + font-style: normal; + font-weight: 300; + src: url("../../assets/fonts/figtree/figtree-v5-latin-300.woff2") + format( + "woff2" + ); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */ + } + + /* figtree-300italic - latin */ + @font-face { + font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */ + font-family: "Figtree"; + font-style: italic; + font-weight: 300; + src: url("../../assets/fonts/figtree/figtree-v5-latin-300italic.woff2") + format( + "woff2" + ); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */ + } + + /* figtree-regular - latin */ + @font-face { + font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */ + font-family: "Figtree"; + font-style: normal; + font-weight: 400; + src: url("../../assets/fonts/figtree/figtree-v5-latin-regular.woff2") + format( + "woff2" + ); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */ + } + + /* figtree-italic - latin */ + @font-face { + font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */ + font-family: "Figtree"; + font-style: italic; + font-weight: 400; + src: url("../../assets/fonts/figtree/figtree-v5-latin-italic.woff2") + format( + "woff2" + ); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */ + } + + /* figtree-500 - latin */ + @font-face { + font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */ + font-family: "Figtree"; + font-style: normal; + font-weight: 500; + src: url("../../assets/fonts/figtree/figtree-v5-latin-500.woff2") + format( + "woff2" + ); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */ + } + + /* figtree-500italic - latin */ + @font-face { + font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */ + font-family: "Figtree"; + font-style: italic; + font-weight: 500; + src: url("../../assets/fonts/figtree/figtree-v5-latin-500italic.woff2") + format( + "woff2" + ); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */ + } + + /* figtree-600 - latin */ + @font-face { + font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */ + font-family: "Figtree"; + font-style: normal; + font-weight: 600; + src: url("../../assets/fonts/figtree/figtree-v5-latin-600.woff2") + format( + "woff2" + ); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */ + } + + /* figtree-600italic - latin */ + @font-face { + font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */ + font-family: "Figtree"; + font-style: italic; + font-weight: 600; + src: url("../../assets/fonts/figtree/figtree-v5-latin-600italic.woff2") + format( + "woff2" + ); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */ + } + + /* figtree-700 - latin */ + @font-face { + font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */ + font-family: "Figtree"; + font-style: normal; + font-weight: 700; + src: url("../../assets/fonts/figtree/figtree-v5-latin-700.woff2") + format( + "woff2" + ); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */ + } + + /* figtree-700italic - latin */ + @font-face { + font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */ + font-family: "Figtree"; + font-style: italic; + font-weight: 700; + src: url("../../assets/fonts/figtree/figtree-v5-latin-700italic.woff2") + format( + "woff2" + ); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */ + } + + /* figtree-800 - latin */ + @font-face { + font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */ + font-family: "Figtree"; + font-style: normal; + font-weight: 800; + src: url("../../assets/fonts/figtree/figtree-v5-latin-800.woff2") + format( + "woff2" + ); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */ + } + + /* figtree-800italic - latin */ + @font-face { + font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */ + font-family: "Figtree"; + font-style: italic; + font-weight: 800; + src: url("../../assets/fonts/figtree/figtree-v5-latin-800italic.woff2") + format( + "woff2" + ); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */ + } + + /* figtree-900 - latin */ + @font-face { + font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */ + font-family: "Figtree"; + font-style: normal; + font-weight: 900; + src: url("../../assets/fonts/figtree/figtree-v5-latin-900.woff2") + format( + "woff2" + ); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */ + } + + /* figtree-900italic - latin */ + @font-face { + font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */ + font-family: "Figtree"; + font-style: italic; + font-weight: 900; + src: url("../../assets/fonts/figtree/figtree-v5-latin-900italic.woff2") + format( + "woff2" + ); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */ + } + + /* cousine-regular - latin */ + @font-face { + font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */ + font-family: "Cousine"; + font-style: normal; + font-weight: 400; + src: url("../../assets/fonts/cousine/cousine-v27-latin-regular.woff2") + format( + "woff2" + ); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */ + } + + /* cousine-italic - latin */ + @font-face { + font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */ + font-family: "Cousine"; + font-style: italic; + font-weight: 400; + src: url("../../assets/fonts/cousine/cousine-v27-latin-italic.woff2") + format( + "woff2" + ); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */ + } + + /* cousine-700 - latin */ + @font-face { + font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */ + font-family: "Cousine"; + font-style: normal; + font-weight: 700; + src: url("../../assets/fonts/cousine/cousine-v27-latin-700.woff2") + format( + "woff2" + ); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */ + } + + /* cousine-700italic - latin */ + @font-face { + font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */ + font-family: "Cousine"; + font-style: italic; + font-weight: 700; + src: url("../../assets/fonts/cousine/cousine-v27-latin-700italic.woff2") + format( + "woff2" + ); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */ + } + + /* open-sans-300 - latin */ + @font-face { + font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */ + font-family: "Open Sans"; + font-style: normal; + font-weight: 300; + src: url("../../assets/fonts/open-sans/open-sans-v40-latin-300.woff2") + format( + "woff2" + ); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */ + } + + /* open-sans-300italic - latin */ + @font-face { + font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */ + font-family: "Open Sans"; + font-style: italic; + font-weight: 300; + src: url("../../assets/fonts/open-sans/open-sans-v40-latin-300italic.woff2") + format( + "woff2" + ); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */ + } + + /* open-sans-regular - latin */ + @font-face { + font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */ + font-family: "Open Sans"; + font-style: normal; + font-weight: 400; + src: url("../../assets/fonts/open-sans/open-sans-v40-latin-regular.woff2") + format( + "woff2" + ); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */ + } + + /* open-sans-italic - latin */ + @font-face { + font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */ + font-family: "Open Sans"; + font-style: italic; + font-weight: 400; + src: url("../../assets/fonts/open-sans/open-sans-v40-latin-italic.woff2") + format( + "woff2" + ); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */ + } + + /* open-sans-500 - latin */ + @font-face { + font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */ + font-family: "Open Sans"; + font-style: normal; + font-weight: 500; + src: url("../../assets/fonts/open-sans/open-sans-v40-latin-500.woff2") + format( + "woff2" + ); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */ + } + + /* open-sans-500italic - latin */ + @font-face { + font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */ + font-family: "Open Sans"; + font-style: italic; + font-weight: 500; + src: url("../../assets/fonts/open-sans/open-sans-v40-latin-500italic.woff2") + format( + "woff2" + ); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */ + } + + /* open-sans-600 - latin */ + @font-face { + font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */ + font-family: "Open Sans"; + font-style: normal; + font-weight: 600; + src: url("../../assets/fonts/open-sans/open-sans-v40-latin-600.woff2") + format( + "woff2" + ); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */ + } + + /* open-sans-600italic - latin */ + @font-face { + font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */ + font-family: "Open Sans"; + font-style: italic; + font-weight: 600; + src: url("../../assets/fonts/open-sans/open-sans-v40-latin-600italic.woff2") + format( + "woff2" + ); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */ + } + + /* open-sans-700italic - latin */ + @font-face { + font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */ + font-family: "Open Sans"; + font-style: italic; + font-weight: 700; + src: url("../../assets/fonts/open-sans/open-sans-v40-latin-700italic.woff2") + format( + "woff2" + ); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */ + } + + /* open-sans-800 - latin */ + @font-face { + font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */ + font-family: "Open Sans"; + font-style: normal; + font-weight: 800; + src: url("../../assets/fonts/open-sans/open-sans-v40-latin-800.woff2") + format( + "woff2" + ); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */ + } + + /* open-sans-800italic - latin */ + @font-face { + font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */ + font-family: "Open Sans"; + font-style: italic; + font-weight: 800; + src: url("../../assets/fonts/open-sans/open-sans-v40-latin-800italic.woff2") + format( + "woff2" + ); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */ + } +} diff --git a/frontend/assets/fonts/comfortaa/comfortaa-v45-latin-300.woff2 b/frontend/assets/fonts/comfortaa/comfortaa-v45-latin-300.woff2 new file mode 100644 index 0000000..7fb6941 Binary files /dev/null and b/frontend/assets/fonts/comfortaa/comfortaa-v45-latin-300.woff2 differ diff --git a/frontend/assets/fonts/comfortaa/comfortaa-v45-latin-500.woff2 b/frontend/assets/fonts/comfortaa/comfortaa-v45-latin-500.woff2 new file mode 100644 index 0000000..ed2adf8 Binary files /dev/null and b/frontend/assets/fonts/comfortaa/comfortaa-v45-latin-500.woff2 differ diff --git a/frontend/assets/fonts/comfortaa/comfortaa-v45-latin-600.woff2 b/frontend/assets/fonts/comfortaa/comfortaa-v45-latin-600.woff2 new file mode 100644 index 0000000..25c1d63 Binary files /dev/null and b/frontend/assets/fonts/comfortaa/comfortaa-v45-latin-600.woff2 differ diff --git a/frontend/assets/fonts/comfortaa/comfortaa-v45-latin-700.woff2 b/frontend/assets/fonts/comfortaa/comfortaa-v45-latin-700.woff2 new file mode 100644 index 0000000..8cb8b14 Binary files /dev/null and b/frontend/assets/fonts/comfortaa/comfortaa-v45-latin-700.woff2 differ diff --git a/frontend/assets/fonts/comfortaa/comfortaa-v45-latin-regular.woff2 b/frontend/assets/fonts/comfortaa/comfortaa-v45-latin-regular.woff2 new file mode 100644 index 0000000..7740306 Binary files /dev/null and b/frontend/assets/fonts/comfortaa/comfortaa-v45-latin-regular.woff2 differ diff --git a/frontend/assets/fonts/cousine/cousine-v27-latin-700.woff2 b/frontend/assets/fonts/cousine/cousine-v27-latin-700.woff2 new file mode 100644 index 0000000..4862c1f Binary files /dev/null and b/frontend/assets/fonts/cousine/cousine-v27-latin-700.woff2 differ diff --git a/frontend/assets/fonts/cousine/cousine-v27-latin-700italic.woff2 b/frontend/assets/fonts/cousine/cousine-v27-latin-700italic.woff2 new file mode 100644 index 0000000..ad3ced5 Binary files /dev/null and b/frontend/assets/fonts/cousine/cousine-v27-latin-700italic.woff2 differ diff --git a/frontend/assets/fonts/cousine/cousine-v27-latin-italic.woff2 b/frontend/assets/fonts/cousine/cousine-v27-latin-italic.woff2 new file mode 100644 index 0000000..128b155 Binary files /dev/null and b/frontend/assets/fonts/cousine/cousine-v27-latin-italic.woff2 differ diff --git a/frontend/assets/fonts/cousine/cousine-v27-latin-regular.woff2 b/frontend/assets/fonts/cousine/cousine-v27-latin-regular.woff2 new file mode 100644 index 0000000..2ef9467 Binary files /dev/null and b/frontend/assets/fonts/cousine/cousine-v27-latin-regular.woff2 differ diff --git a/frontend/assets/fonts/figtree/figtree-v5-latin-300.woff2 b/frontend/assets/fonts/figtree/figtree-v5-latin-300.woff2 new file mode 100644 index 0000000..ff1fa4d Binary files /dev/null and b/frontend/assets/fonts/figtree/figtree-v5-latin-300.woff2 differ diff --git a/frontend/assets/fonts/figtree/figtree-v5-latin-300italic.woff2 b/frontend/assets/fonts/figtree/figtree-v5-latin-300italic.woff2 new file mode 100644 index 0000000..edea917 Binary files /dev/null and b/frontend/assets/fonts/figtree/figtree-v5-latin-300italic.woff2 differ diff --git a/frontend/assets/fonts/figtree/figtree-v5-latin-500.woff2 b/frontend/assets/fonts/figtree/figtree-v5-latin-500.woff2 new file mode 100644 index 0000000..43944b1 Binary files /dev/null and b/frontend/assets/fonts/figtree/figtree-v5-latin-500.woff2 differ diff --git a/frontend/assets/fonts/figtree/figtree-v5-latin-500italic.woff2 b/frontend/assets/fonts/figtree/figtree-v5-latin-500italic.woff2 new file mode 100644 index 0000000..b96899a Binary files /dev/null and b/frontend/assets/fonts/figtree/figtree-v5-latin-500italic.woff2 differ diff --git a/frontend/assets/fonts/figtree/figtree-v5-latin-600.woff2 b/frontend/assets/fonts/figtree/figtree-v5-latin-600.woff2 new file mode 100644 index 0000000..5ad11a8 Binary files /dev/null and b/frontend/assets/fonts/figtree/figtree-v5-latin-600.woff2 differ diff --git a/frontend/assets/fonts/figtree/figtree-v5-latin-600italic.woff2 b/frontend/assets/fonts/figtree/figtree-v5-latin-600italic.woff2 new file mode 100644 index 0000000..59af821 Binary files /dev/null and b/frontend/assets/fonts/figtree/figtree-v5-latin-600italic.woff2 differ diff --git a/frontend/assets/fonts/figtree/figtree-v5-latin-700.woff2 b/frontend/assets/fonts/figtree/figtree-v5-latin-700.woff2 new file mode 100644 index 0000000..6039759 Binary files /dev/null and b/frontend/assets/fonts/figtree/figtree-v5-latin-700.woff2 differ diff --git a/frontend/assets/fonts/figtree/figtree-v5-latin-700italic.woff2 b/frontend/assets/fonts/figtree/figtree-v5-latin-700italic.woff2 new file mode 100644 index 0000000..8e16837 Binary files /dev/null and b/frontend/assets/fonts/figtree/figtree-v5-latin-700italic.woff2 differ diff --git a/frontend/assets/fonts/figtree/figtree-v5-latin-800.woff2 b/frontend/assets/fonts/figtree/figtree-v5-latin-800.woff2 new file mode 100644 index 0000000..a9bb876 Binary files /dev/null and b/frontend/assets/fonts/figtree/figtree-v5-latin-800.woff2 differ diff --git a/frontend/assets/fonts/figtree/figtree-v5-latin-800italic.woff2 b/frontend/assets/fonts/figtree/figtree-v5-latin-800italic.woff2 new file mode 100644 index 0000000..2c700dc Binary files /dev/null and b/frontend/assets/fonts/figtree/figtree-v5-latin-800italic.woff2 differ diff --git a/frontend/assets/fonts/figtree/figtree-v5-latin-900.woff2 b/frontend/assets/fonts/figtree/figtree-v5-latin-900.woff2 new file mode 100644 index 0000000..e60de1d Binary files /dev/null and b/frontend/assets/fonts/figtree/figtree-v5-latin-900.woff2 differ diff --git a/frontend/assets/fonts/figtree/figtree-v5-latin-900italic.woff2 b/frontend/assets/fonts/figtree/figtree-v5-latin-900italic.woff2 new file mode 100644 index 0000000..d55405c Binary files /dev/null and b/frontend/assets/fonts/figtree/figtree-v5-latin-900italic.woff2 differ diff --git a/frontend/assets/fonts/figtree/figtree-v5-latin-italic.woff2 b/frontend/assets/fonts/figtree/figtree-v5-latin-italic.woff2 new file mode 100644 index 0000000..36378a6 Binary files /dev/null and b/frontend/assets/fonts/figtree/figtree-v5-latin-italic.woff2 differ diff --git a/frontend/assets/fonts/figtree/figtree-v5-latin-regular.woff2 b/frontend/assets/fonts/figtree/figtree-v5-latin-regular.woff2 new file mode 100644 index 0000000..c359928 Binary files /dev/null and b/frontend/assets/fonts/figtree/figtree-v5-latin-regular.woff2 differ diff --git a/frontend/assets/fonts/open-sans/open-sans-v40-latin-300.woff2 b/frontend/assets/fonts/open-sans/open-sans-v40-latin-300.woff2 new file mode 100644 index 0000000..e000fcb Binary files /dev/null and b/frontend/assets/fonts/open-sans/open-sans-v40-latin-300.woff2 differ diff --git a/frontend/assets/fonts/open-sans/open-sans-v40-latin-300italic.woff2 b/frontend/assets/fonts/open-sans/open-sans-v40-latin-300italic.woff2 new file mode 100644 index 0000000..5167821 Binary files /dev/null and b/frontend/assets/fonts/open-sans/open-sans-v40-latin-300italic.woff2 differ diff --git a/frontend/assets/fonts/open-sans/open-sans-v40-latin-500.woff2 b/frontend/assets/fonts/open-sans/open-sans-v40-latin-500.woff2 new file mode 100644 index 0000000..a35be30 Binary files /dev/null and b/frontend/assets/fonts/open-sans/open-sans-v40-latin-500.woff2 differ diff --git a/frontend/assets/fonts/open-sans/open-sans-v40-latin-500italic.woff2 b/frontend/assets/fonts/open-sans/open-sans-v40-latin-500italic.woff2 new file mode 100644 index 0000000..039e72f Binary files /dev/null and b/frontend/assets/fonts/open-sans/open-sans-v40-latin-500italic.woff2 differ diff --git a/frontend/assets/fonts/open-sans/open-sans-v40-latin-600.woff2 b/frontend/assets/fonts/open-sans/open-sans-v40-latin-600.woff2 new file mode 100644 index 0000000..f67ef00 Binary files /dev/null and b/frontend/assets/fonts/open-sans/open-sans-v40-latin-600.woff2 differ diff --git a/frontend/assets/fonts/open-sans/open-sans-v40-latin-600italic.woff2 b/frontend/assets/fonts/open-sans/open-sans-v40-latin-600italic.woff2 new file mode 100644 index 0000000..bd6a4d1 Binary files /dev/null and b/frontend/assets/fonts/open-sans/open-sans-v40-latin-600italic.woff2 differ diff --git a/frontend/assets/fonts/open-sans/open-sans-v40-latin-700italic.woff2 b/frontend/assets/fonts/open-sans/open-sans-v40-latin-700italic.woff2 new file mode 100644 index 0000000..2c96334 Binary files /dev/null and b/frontend/assets/fonts/open-sans/open-sans-v40-latin-700italic.woff2 differ diff --git a/frontend/assets/fonts/open-sans/open-sans-v40-latin-800.woff2 b/frontend/assets/fonts/open-sans/open-sans-v40-latin-800.woff2 new file mode 100644 index 0000000..cf65114 Binary files /dev/null and b/frontend/assets/fonts/open-sans/open-sans-v40-latin-800.woff2 differ diff --git a/frontend/assets/fonts/open-sans/open-sans-v40-latin-800italic.woff2 b/frontend/assets/fonts/open-sans/open-sans-v40-latin-800italic.woff2 new file mode 100644 index 0000000..17bc073 Binary files /dev/null and b/frontend/assets/fonts/open-sans/open-sans-v40-latin-800italic.woff2 differ diff --git a/frontend/assets/fonts/open-sans/open-sans-v40-latin-italic.woff2 b/frontend/assets/fonts/open-sans/open-sans-v40-latin-italic.woff2 new file mode 100644 index 0000000..84ee197 Binary files /dev/null and b/frontend/assets/fonts/open-sans/open-sans-v40-latin-italic.woff2 differ diff --git a/frontend/assets/fonts/open-sans/open-sans-v40-latin-regular.woff2 b/frontend/assets/fonts/open-sans/open-sans-v40-latin-regular.woff2 new file mode 100644 index 0000000..eaae942 Binary files /dev/null and b/frontend/assets/fonts/open-sans/open-sans-v40-latin-regular.woff2 differ diff --git a/frontend/assets/logos/daisyui.svg b/frontend/assets/logos/daisyui.svg new file mode 100644 index 0000000..c572404 --- /dev/null +++ b/frontend/assets/logos/daisyui.svg @@ -0,0 +1,18 @@ + + + + + + + diff --git a/frontend/assets/logos/gitea.svg b/frontend/assets/logos/gitea.svg new file mode 100644 index 0000000..9df6b83 --- /dev/null +++ b/frontend/assets/logos/gitea.svg @@ -0,0 +1,31 @@ + + + + + + + + + + + + diff --git a/frontend/assets/logos/helix.svg b/frontend/assets/logos/helix.svg new file mode 100644 index 0000000..5e1a026 --- /dev/null +++ b/frontend/assets/logos/helix.svg @@ -0,0 +1 @@ + diff --git a/frontend/assets/logos/leptos.svg b/frontend/assets/logos/leptos.svg new file mode 100644 index 0000000..78c9de4 --- /dev/null +++ b/frontend/assets/logos/leptos.svg @@ -0,0 +1,59 @@ + + + + + + + + + + + + + diff --git a/frontend/assets/logos/rust.svg b/frontend/assets/logos/rust.svg new file mode 100644 index 0000000..47c8496 --- /dev/null +++ b/frontend/assets/logos/rust.svg @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + diff --git a/frontend/assets/logos/tailwind.svg b/frontend/assets/logos/tailwind.svg new file mode 100644 index 0000000..d68377e --- /dev/null +++ b/frontend/assets/logos/tailwind.svg @@ -0,0 +1,15 @@ + + + + + + + + + + diff --git a/frontend/assets/logos/tauri.svg b/frontend/assets/logos/tauri.svg new file mode 100644 index 0000000..31b62c9 --- /dev/null +++ b/frontend/assets/logos/tauri.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/frontend/index.html b/frontend/index.html new file mode 100644 index 0000000..af33fd5 --- /dev/null +++ b/frontend/index.html @@ -0,0 +1,12 @@ + + + + + + + + Stephen Power + + + + diff --git a/frontend/package.json b/frontend/package.json new file mode 100644 index 0000000..f676eab --- /dev/null +++ b/frontend/package.json @@ -0,0 +1,10 @@ +{ + "name": "template", + "module": "index.html", + "type": "module", + "devDependencies": { + "@types/bun": "latest", + "@types/node": "^22.10.2", + "daisyui": "^4.12.23" + } +} diff --git a/frontend/src/main.rs b/frontend/src/main.rs new file mode 100644 index 0000000..47947a6 --- /dev/null +++ b/frontend/src/main.rs @@ -0,0 +1,119 @@ +#![forbid(unsafe_code)] +#![forbid(clippy::unwrap_used)] +#![warn(clippy::all)] +#![warn(clippy::pedantic)] +#![warn(clippy::nursery)] +#![warn(clippy::cargo)] +#![allow(clippy::multiple_crate_versions)] +#![allow(clippy::module_name_repetitions)] + +use leptos::{ + either::Either, + html::{ + a, + div, + img, + }, + prelude::*, +}; + +fn main() { + console_error_panic_hook::set_once(); + leptos::mount::mount_to_body(|| app); +} + +// Look mom, no macros! +fn app() -> impl IntoView { + console_error_panic_hook::set_once(); + + div() + .attr("data-theme", "dracula") + .class("flex justify-center w-screen min-h-screen bg-base-100") + .child( + div() + .class("flex flex-col gap-8 justify-center items-center font-semibold lg:gap-12") + .child(title()) + .child(description()) + .child(source_code_link()) + .child(tools_links()), + ) +} + +fn title() -> impl IntoView { + div() + .class("text-2xl font-semibold md:text-3xl lg:text-4xl xl:text-5xl 2xl:text-6xl font-display") + .child("Cheemsburger's Template") +} + +fn description() -> impl IntoView { + div() + .class("font-sans text-base font-light lg:text-lg xl:text-xl 2xl:text-2xl") + .child("Welcome to my awesome template!") +} + +fn source_code_link() -> impl IntoView { + div() + .attr("data-tip", "Source") + .class("tooltip tooltip-top tooltip-info") + .child( + a().id("source_code_btn_link") + .class("gap-3 font-mono normal-case btn btn-lg btn-wide btn-outline") + .attr("target", "_blank") + .href("https://git.powerware.ie/opensourcecheemsburgers/template") + .child( + img() + .src("assets/logos/gitea.svg") + .class("w-8 h-8"), + ) + .child("Source"), + ) +} + +fn tools_links() -> impl IntoView { + div() + .class("flex flex-col gap-x-4 gap-y-6 items-center md:grid md:grid-cols-3 xl:flex xl:flex-row") + .child(link_btn("https://tauri.app", "Tauri", Some("tauri.svg"))) + .child(link_btn("https://leptos.dev", "Leptos", Some("leptos.svg"))) + .child(link_btn("https://tailwindcss.com", "TailwindCSS", Some("tailwind.svg"))) + .child(link_btn("https://daisyui.com", "DaisyUI", Some("daisyui.svg"))) + .child(link_btn("https://helix-editor.com", "Helix", Some("helix.svg"))) + .child(link_btn("https://dprint.dev", "Dprint", None)) +} + +fn link_btn(link: &'static str, name: &'static str, logo: Option<&'static str>) -> impl IntoView { + let tip = link.replace("https://", ""); + let mut id = name.to_string().to_ascii_lowercase(); + id.push_str("_link_btn"); + + if let Some(logo) = logo { + let mut logo_path = String::from("assets/logos/"); + logo_path.push_str(logo); + + Either::Left( + div() + .attr("data-tip", tip) + .class("tooltip tooltip-top tooltip-info") + .child( + a().class("gap-3 font-mono normal-case btn btn-outline btn-md lg:btn-lg") + .attr("target", "_blank") + .href(link) + .id(id) + .child(img().src(logo_path).class("w-8 h-8")) + .child(name), + ), + ) + } else { + Either::Right( + div() + .attr("data-tip", tip) + .class("tooltip tooltip-top tooltip-info") + .child( + a().class("gap-3 font-mono normal-case btn btn-outline btn-md lg:btn-lg") + .attr("target", "_blank") + .href(link) + .id(id) + .child(name), + ), + ) + } +} diff --git a/frontend/tailwind.config.js b/frontend/tailwind.config.js new file mode 100644 index 0000000..ca0157a --- /dev/null +++ b/frontend/tailwind.config.js @@ -0,0 +1,64 @@ +/** @type {import('tailwindcss').Config} */ +module.exports = { + mode: "jit", + plugins: [require("daisyui")], + future: { + hoverOnlyWhenSupported: true, + }, + content: [ + "./assets/css/input.css", + "./src/main.rs", + "./src/*.rs", + "./src/**/*.rs", + "./index.html", + ], + theme: { + fontFamily: { + sans: ["Figtree"], + display: ["Comfortaa"], + mono: ["Cousine"], + }, + extend: { + screens: { + "3xl": "1920px", + "4xl": "2560px", + }, + }, + }, + daisyui: { + themes: [ + "light", + "dark", + "cupcake", + "bumblebee", + "emerald", + "corporate", + "synthwave", + "retro", + "cyberpunk", + "valentine", + "halloween", + "garden", + "forest", + "aqua", + "lofi", + "pastel", + "fantasy", + "wireframe", + "black", + "luxury", + "dracula", + "cmyk", + "autumn", + "business", + "acid", + "lemonade", + "night", + "coffee", + "winter", + "dim", + "nord", + "sunset", + ], + }, +}; diff --git a/rust-toolchain.toml b/rust-toolchain.toml new file mode 100644 index 0000000..4b2ea98 --- /dev/null +++ b/rust-toolchain.toml @@ -0,0 +1,5 @@ +[toolchain] +channel = "nightly" +components = ["rust-analyzer", "rustfmt", "rustc-dev"] +targets = ["wasm32-unknown-unknown", "x86_64-unknown-linux-gnu", "x86_64-pc-windows-msvc"] +profile = "default" diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml new file mode 100644 index 0000000..221ec8d --- /dev/null +++ b/src-tauri/Cargo.toml @@ -0,0 +1,35 @@ +[lib] +name = "template_lib" +resolver = "2" +crate-type = ["staticlib", "cdylib", "rlib"] + +[package] +name = "template" +version.workspace = true +authors.workspace = true +categories.workspace = true +edition.workspace = true +keywords.workspace = true +license.workspace = true +readme.workspace = true +repository.workspace = true +description.workspace = true + +[lints] +workspace = true + +[dependencies] +either_of = "0.1.5" +serde.workspace = true +serde_json.workspace = true +tauri.workspace = true + +[build-dependencies] +tauri-build.workspace = true + +[features] +# this feature is used for production builds or when `devPath` points to the filesystem and the built-in dev server is disabled. +# If you use cargo directly instead of tauri's cli you can use this feature flag to switch between tauri's `dev` and `build` modes. +# DO NOT REMOVE!! +default = ["custom-protocol"] +custom-protocol = ["tauri/custom-protocol"] diff --git a/src-tauri/Tauri.toml b/src-tauri/Tauri.toml new file mode 100644 index 0000000..866e9d0 --- /dev/null +++ b/src-tauri/Tauri.toml @@ -0,0 +1,96 @@ +product-name = "template" +identifier = "gitea.opensourcecheemsburgers.template" + +[build] +before-build-command = "trunk build" +before-dev-command = "trunk serve" +dev-url = "http://localhost:42069" +frontend-dist = "../frontend/dist/" + +[bundle] +active = false +targets = "all" +icon = [ + "icons/128x128@2x.png", + "icons/32x32.png", + # "icons/icon.icns", + # "icons/icon.png", + # "icons/Square107x107Logo.png", + # "icons/Square150x150Logo.png", + # "icons/Square30x30Logo.png", + # "icons/Square44x44Logo.png", + # "icons/Square89x89Logo.png", + "icons/128x128.png", + "icons/android/*", + "icons/icon.ico", + # "icons/ios/*", + # "icons/Square142x142Logo.png", + # "icons/Square284x284Logo.png", + # "icons/Square310x310Logo.png", + # "icons/Square71x71Logo.png", + # "icons/StoreLogo.png", +] +# create-updater-artifacts = false +use-local-tools-dir = false + +[bundle.linux.appimage] +bundle-media-framework = false +files = {} + +[bundle.linux.deb] +files = {} + +[bundle.linux.rpm] +epoch = 0 +files = {} +release = "0" + +[bundle.macOS] +files = {} +hardened-runtime = true +minimum-system-version = "10.13" + +[bundle.macOS.dmg] +app-position = { x = 180, y = 170 } +application-folder-position = { x = 480, y = 170 } +window-size = { height = 400, width = 660 } + +[bundle.android] +min-sdk-version = 24 + +[bundle.iOS] +minimum-system-version = "13.0" + +[bundle.windows] +allow-downgrades = true +# certificateThumbprint = "" +# digestAlgorithm = "" +# nsis = "" +# signCommand = "" +# timestampUrl = "" +# wix = "" +tsp = false + +[bundle.windows.webviewInstallMode] +silent = true +type = "downloadBootstrapper" + +[app] +with-global-tauri = true +enable-gtk-app-id = false +macos-private-api = false +windows = [ + { url = "http::127.0.0.1:42069" }, +] + +[app.security] +capabilities = [] +dangerous-disable-asset-csp-modification = false +freeze-prototype = false + +[app.security.assetProtocol] +enable = false +scope = [] + +[app.security.pattern] +use = "brownfield" diff --git a/src-tauri/build.rs b/src-tauri/build.rs new file mode 100644 index 0000000..261851f --- /dev/null +++ b/src-tauri/build.rs @@ -0,0 +1,3 @@ +fn main() { + tauri_build::build(); +} diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs new file mode 100644 index 0000000..1a73fb3 --- /dev/null +++ b/src-tauri/src/lib.rs @@ -0,0 +1,9 @@ +use tauri::generate_context; + +#[cfg_attr(mobile, tauri::mobile_entry_point)] +pub fn run() { + #![allow(clippy::missing_panics_doc)] + tauri::Builder::default() + .run(generate_context!()) + .expect("Error"); +} diff --git a/src-tauri/src/main.rs b/src-tauri/src/main.rs new file mode 100644 index 0000000..9c4606b --- /dev/null +++ b/src-tauri/src/main.rs @@ -0,0 +1,13 @@ +#![forbid(unsafe_code)] +#![forbid(clippy::unwrap_used)] +#![warn(clippy::all)] +#![warn(clippy::pedantic)] +#![warn(clippy::nursery)] +#![warn(clippy::cargo)] +#![allow(clippy::multiple_crate_versions)] +#![allow(clippy::module_name_repetitions)] +#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")] + +fn main() { + template_lib::run(); +} diff --git a/tests/Cargo.toml b/tests/Cargo.toml new file mode 100644 index 0000000..9370769 --- /dev/null +++ b/tests/Cargo.toml @@ -0,0 +1,16 @@ +[package] +name = "template-e2e" +version.workspace = true +authors.workspace = true +categories.workspace = true +edition.workspace = true +keywords.workspace = true +license.workspace = true +readme.workspace = true +repository.workspace = true +resolver = "2" +description.workspace = true + +[dependencies] +thirtyfour.workspace = true +tokio.workspace = true diff --git a/tests/src/main.rs b/tests/src/main.rs new file mode 100644 index 0000000..5064953 --- /dev/null +++ b/tests/src/main.rs @@ -0,0 +1,47 @@ +use std::{ + error::Error, + thread::sleep, + time::Duration, +}; + +use thirtyfour::prelude::*; +use tokio::time::{ + Timeout, + timeout, +}; + +pub const LINK_BTNS: [(&'static str, &'static str); 6] = [ + ("tauri_link_btn", "https://tauri.app/"), + ("leptos_link_btn", "https://leptos.dev/"), + ("tailwindcss_link_btn", "https://tailwindcss.com/"), + ("daisyui_link_btn", "https://daisyui.com/"), + ("helix_link_btn", "https://helix-editor.com/"), + ("dprint_link_btn", "https://dprint.dev/"), +]; + +#[tokio::main] +async fn main() -> Result<(), Box> { + // let caps = DesiredCapabilities::chrome(); + // let driver = WebDriver::new("http://localhost:9515", caps).await?; + let caps = DesiredCapabilities::firefox(); + let driver = WebDriver::new("http://localhost:4444", caps).await?; + + driver + .goto("http://127.0.0.1:42069") + .await?; + + for link_btn in LINK_BTNS { + let btn = driver.find(By::Id(link_btn.0)).await?; + + assert_eq!( + link_btn.1, + btn.prop("href") + .await? + .unwrap_or_default() + ); + } + + driver.quit().await?; + + Ok(()) +}