From d201017f321700bce15b09c9703ff31d5eb7c25f Mon Sep 17 00:00:00 2001 From: dcpastoors Date: Wed, 2 Sep 2026 17:24:40 +0200 Subject: [PATCH] initial setup --- .agentsignore | 7 + .gitea/template | 5 + .gitignore | 277 +++++++++++++++++++++++++++++ .idea/.gitignore | 10 ++ .idea/misc.xml | 6 + .idea/vcs.xml | 6 + AGENTS.md | 64 +++++++ Cargo.toml | 27 +++ Trunk.toml | 6 + assets/mridge-craft-icon.webp | Bin 0 -> 83476 bytes index.html | 23 +++ package.json | 14 ++ src/app.rs | 97 ++++++++++ src/components/config_error.rs | 21 +++ src/components/empty_view.rs | 14 ++ src/components/error_view.rs | 16 ++ src/components/home.rs | 14 ++ src/components/loading_view.rs | 11 ++ src/components/mod.rs | 13 ++ src/components/page_header.rs | 20 +++ src/context.rs | 100 +++++++++++ src/main.rs | 12 ++ src/styles.css | 315 +++++++++++++++++++++++++++++++++ 23 files changed, 1078 insertions(+) create mode 100644 .agentsignore create mode 100644 .gitea/template create mode 100644 .gitignore create mode 100644 .idea/.gitignore create mode 100644 .idea/misc.xml create mode 100644 .idea/vcs.xml create mode 100644 AGENTS.md create mode 100644 Cargo.toml create mode 100644 Trunk.toml create mode 100644 assets/mridge-craft-icon.webp create mode 100644 index.html create mode 100644 package.json create mode 100644 src/app.rs create mode 100644 src/components/config_error.rs create mode 100644 src/components/empty_view.rs create mode 100644 src/components/error_view.rs create mode 100644 src/components/home.rs create mode 100644 src/components/loading_view.rs create mode 100644 src/components/mod.rs create mode 100644 src/components/page_header.rs create mode 100644 src/context.rs create mode 100644 src/main.rs create mode 100644 src/styles.css diff --git a/.agentsignore b/.agentsignore new file mode 100644 index 0000000..8a4bb11 --- /dev/null +++ b/.agentsignore @@ -0,0 +1,7 @@ +package-lock.json +Cargo.lock +/node_modules +/target +/dist +/.idea +/.git \ No newline at end of file diff --git a/.gitea/template b/.gitea/template new file mode 100644 index 0000000..f2ac79e --- /dev/null +++ b/.gitea/template @@ -0,0 +1,5 @@ +# Replace in specific config files +agent.md +Trunk.toml +index.html +Cargo.toml \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c50b5d2 --- /dev/null +++ b/.gitignore @@ -0,0 +1,277 @@ + +### JetBrains template +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider +# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 + +# User-specific stuff +.idea/**/workspace.xml +.idea/**/tasks.xml +.idea/**/usage.statistics.xml +.idea/**/dictionaries +.idea/**/shelf + +# AWS User-specific +.idea/**/aws.xml + +# Generated files +.idea/**/contentModel.xml + +# Sensitive or high-churn files +.idea/**/dataSources/ +.idea/**/dataSources.ids +.idea/**/dataSources.local.xml +.idea/**/sqlDataSources.xml +.idea/**/dynamic.xml +.idea/**/uiDesigner.xml +.idea/**/dbnavigator.xml + +# Gradle +.idea/**/gradle.xml +.idea/**/libraries + +# Gradle and Maven with auto-import +# When using Gradle or Maven with auto-import, you should exclude module files, +# since they will be recreated, and may cause churn. Uncomment if using +# auto-import. +# .idea/artifacts +# .idea/compiler.xml +# .idea/jarRepositories.xml +# .idea/modules.xml +# .idea/*.iml +# .idea/modules +# *.iml +# *.ipr + +# CMake +cmake-build-*/ + +# Mongo Explorer plugin +.idea/**/mongoSettings.xml + +# File-based project format +*.iws + +# IntelliJ +out/ + +# mpeltonen/sbt-idea plugin +.idea_modules/ + +# JIRA plugin +atlassian-ide-plugin.xml + +# Cursive Clojure plugin +.idea/replstate.xml + +# SonarLint plugin +.idea/sonarlint/ + +# Crashlytics plugin (for Android Studio and IntelliJ) +com_crashlytics_export_strings.xml +crashlytics.properties +crashlytics-build.properties +fabric.properties + +# Editor-based Rest Client +.idea/httpRequests + +# Android studio 3.1+ serialized cache file +.idea/caches/build_file_checksums.ser + +### Rust template +# Generated by Cargo +# will have compiled files and executables +debug/ +target/ +dist/ + +# 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 + +# RustRover +# JetBrains specific template is maintained in a separate JetBrains.gitignore that can +# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore +# and can be added to the global gitignore or merged into this file. For a more nuclear +# option (not recommended) you can uncomment the following to ignore the entire idea folder. +#.idea/ +### Linux template +*~ + +# temporary files which can be created if a process still has a handle open of a deleted file +.fuse_hidden* + +# KDE directory preferences +.directory + +# Linux trash folder which might appear on any partition or disk +.Trash-* + +# .nfs files are created when an open file is removed but is still being accessed +.nfs* + +### Node template +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* +.pnpm-debug.log* + +# Diagnostic reports (https://nodejs.org/api/report.html) +report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage +*.lcov + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# Snowpack dependency directory (https://snowpack.dev/) +web_modules/ + +# TypeScript cache +*.tsbuildinfo + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Optional stylelint cache +.stylelintcache + +# Microbundle cache +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variable files +.env +.env.development.local +.env.test.local +.env.production.local +.env.local + +# parcel-bundler cache (https://parceljs.org/) +.cache +.parcel-cache + +# Next.js build output +.next +out + +# Nuxt.js build / generate output +.nuxt +dist + +# Gatsby files +.cache/ +# Comment in the public line in if your project uses Gatsby and not Next.js +# https://nextjs.org/blog/next-9-1#public-directory-support +# public + +# vuepress build output +.vuepress/dist + +# vuepress v2.x temp and cache directory +.temp +.cache + +# Docusaurus cache and generated files +.docusaurus + +# Serverless directories +.serverless/ + +# FuseBox cache +.fusebox/ + +# DynamoDB Local files +.dynamodb/ + +# TernJS port file +.tern-port + +# Stores VSCode versions used for testing VSCode extensions +.vscode-test + +# yarn v2 +.yarn/cache +.yarn/unplugged +.yarn/build-state.yml +.yarn/install-state.gz +.pnp.* + +### macOS template +# General +.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two \r +Icon + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..30cf57e --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,10 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Ignored default folder with query files +/queries/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..4b151ab --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..71401a8 --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,64 @@ +# AGENTS.md + +Iframe Leptos CSR aka "Mont Fort App" craft. Data from generated Matterhorn `*Api`. Theme is `mountainridge`. You implement pages. You do not own codegen, hosting, or the toolchain. + +Use the injected workspace tools for git, check, build, issues, and Matterhorn deps. Do not shell out to `git` / `cargo` / `npm` / `trunk`. Commit only if asked (`feat:` / `fix:` / `docs:` / `refactor:`). + +## Frozen + +`src/codegen/**`, `schemas/`, `read_app_config`, `index.html` config script + `` + asset `copy-dir`, `Router base`, `data-theme="mountainridge"`, `src/styles.css` theme block, `Cargo.toml`. + +Missing entity → Matterhorn-search tool → Matterhorn-dep tool, then generate. Still missing → issue, stop. New crate or new CSS tokens → stop. Field not on the struct → migration, not a UI hack. + +## Layout + +```text +src/main.rs mount +src/app.rs App + Shell + routes + nav ← register here +src/context.rs AppCtx +src/components/ pages + PageHeader, EmptyView, ErrorView +src/codegen/ read-only types + *Api +``` + +```rust +let ctx = expect_context::(); +let api = ThingApi::new(ctx.matterhorn_config.clone()); +``` + +Pages never read `window.__embeddedAppConfig`. Config failure is handled in `App`. + +## Page + +`src/components/_list.rs` → export in `mod.rs` → one relative `` and one `href="./…"` `` in `src/app.rs`. Do not touch `main.rs`. + +Flat siblings under `/`. Nest a `ParentRoute` only for a second ``. `path!("features")`, never `path!("/features")`. + +```rust +let data = LocalResource::new(move || { + let api = api.clone(); + async move { api.fetch_thing(vec![], vec![], HashMap::new(), 50, 0).await } +}); + +view! { + + {move || Suspend::new(async move { + match data.await { + Ok(rows) if rows.is_empty() => view! { }.into_any(), + Ok(rows) => view! { /* Option fields only */ }.into_any(), + Err(err) => view! { }.into_any(), + } + })} +} +``` + +Do not add ``. Do not call `.get()` on the resource. `store_*` / forms only if the user asked. Projections = schema names (`createdAt`, not `created_at`). + +`view!` text is quoted. `leptos::prelude::*`, not `use leptos::*`. `` takes `attr:class` (or `{..} class`). Brand/nav is not a `.btn`. + +## UI + +DaisyUI on `mountainridge`: `card`, `table`, `badge`, `menu`. Real `.btn` for submit/delete only. No `tailwind.config.*`. No page CSS. Scroll, if needed, is `min-h-0 flex-1 overflow-y-auto` on the page body — not `h-dvh`, not `html` overflow. + +## Done + +`check` + `build` clean. Diff = new page + `mod.rs` + `app.rs`. Theme, styles, codegen, Cargo untouched. diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..e8e3e9f --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,27 @@ +[package] +name = "r_${REPO_NAME_SNAKE}" +repository = "${REPO_HTTPS_URL}" +version = "0.1.0" +edition = "2021" + +[dependencies] +leptos = { version = "0.8", features = ["csr"] } +leptos_router = "0.8" +console_error_panic_hook = "0.1" +wasm-bindgen = "0.2" +serde = { version = "1.0", features = ["derive"] } +matterhorn-client = { version = "0.1" } +uuid = { version = "1", features = ["serde"] } +chrono = { version = "0.4", features = ["serde"] } +anyhow = "1.0" +serde_json = "1.0.149" +reqwest = { version = "0.13", features = ["json"] } +thiserror = "2.0" +once_cell = "1.21" +tokio = { version = "1.53", features = ["sync"] } +gloo-timers = { version = "0.4", features = ["futures"] } +base64 = "0.23" +regress = "0.12" +web-sys = "0.3" +wasm-bindgen-futures = "0.4" +js-sys = "0.3" diff --git a/Trunk.toml b/Trunk.toml new file mode 100644 index 0000000..6e282d5 --- /dev/null +++ b/Trunk.toml @@ -0,0 +1,6 @@ +[build] +filehash = false +public_url = "/crafts/releases/$REPO_OWNER/$REPO_NAME/" + +[serve] +addresses = ["0.0.0.0"] diff --git a/assets/mridge-craft-icon.webp b/assets/mridge-craft-icon.webp new file mode 100644 index 0000000000000000000000000000000000000000..815acc217c3c1185983a67deb62314826feedab0 GIT binary patch literal 83476 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 }> + + + + + + } + .into_any() + } + } +} + +#[component] +fn Shell() -> impl IntoView { + let ctx = expect_context::(); + let user = ctx.user.clone().unwrap_or_else(|| "Guest".to_string()); + let logo = ctx.asset_path("mridge-craft-icon.webp"); + + view! { +
+ + +
+ + +
+
+ + } + }> + }> + + + +
+
+
+ +
+ + +
+
+ } +} diff --git a/src/components/config_error.rs b/src/components/config_error.rs new file mode 100644 index 0000000..43b6dc9 --- /dev/null +++ b/src/components/config_error.rs @@ -0,0 +1,21 @@ +use leptos::prelude::*; + +#[component] +pub fn ConfigError() -> impl IntoView { + view! { +
+
+
+

"Configuration unavailable"

+

+ "This craft did not receive APP_CONFIG from the host. " + "token and matterhorn_base_url are required." +

+

+ "Reload the preview after the host has posted the iframe message. Do not continue without config." +

+
+
+
+ } +} diff --git a/src/components/empty_view.rs b/src/components/empty_view.rs new file mode 100644 index 0000000..d606037 --- /dev/null +++ b/src/components/empty_view.rs @@ -0,0 +1,14 @@ +use leptos::prelude::*; + +#[component] +pub fn EmptyView( + #[prop(default = "Nothing to show")] title: &'static str, + #[prop(default = "No records were returned.")] message: &'static str, +) -> impl IntoView { + view! { +
+

{title}

+

{message}

+
+ } +} diff --git a/src/components/error_view.rs b/src/components/error_view.rs new file mode 100644 index 0000000..1468fed --- /dev/null +++ b/src/components/error_view.rs @@ -0,0 +1,16 @@ +use leptos::prelude::*; + +#[component] +pub fn ErrorView( + #[prop(default = "Something went wrong")] title: &'static str, + message: String, +) -> impl IntoView { + view! { + + } +} diff --git a/src/components/home.rs b/src/components/home.rs new file mode 100644 index 0000000..31f4af7 --- /dev/null +++ b/src/components/home.rs @@ -0,0 +1,14 @@ +use crate::components::PageHeader; +use leptos::prelude::*; + +#[component] +pub fn Home() -> impl IntoView { + view! { + +
+
+

"Use the navigation to open generated entity pages."

+
+
+ } +} diff --git a/src/components/loading_view.rs b/src/components/loading_view.rs new file mode 100644 index 0000000..5509d1b --- /dev/null +++ b/src/components/loading_view.rs @@ -0,0 +1,11 @@ +use leptos::prelude::*; + +#[component] +pub fn LoadingView(#[prop(default = "Loading…")] label: &'static str) -> impl IntoView { + view! { +
+ + {label} +
+ } +} diff --git a/src/components/mod.rs b/src/components/mod.rs new file mode 100644 index 0000000..bdb2ec2 --- /dev/null +++ b/src/components/mod.rs @@ -0,0 +1,13 @@ +mod config_error; +mod empty_view; +mod error_view; +mod home; +mod loading_view; +mod page_header; + +pub use config_error::ConfigError; +pub use empty_view::EmptyView; +pub use error_view::ErrorView; +pub use home::Home; +pub use loading_view::LoadingView; +pub use page_header::PageHeader; \ No newline at end of file diff --git a/src/components/page_header.rs b/src/components/page_header.rs new file mode 100644 index 0000000..92a1ac5 --- /dev/null +++ b/src/components/page_header.rs @@ -0,0 +1,20 @@ +use leptos::prelude::*; + +#[component] +pub fn PageHeader( + title: &'static str, + #[prop(optional)] subtitle: Option<&'static str>, + #[prop(optional)] children: Option, +) -> impl IntoView { + view! { +
+
+

{title}

+ {subtitle.map(|text| view! {

{text}

})} +
+
+ {children.map(|c| c())} +
+
+ } +} diff --git a/src/context.rs b/src/context.rs new file mode 100644 index 0000000..ecd06a1 --- /dev/null +++ b/src/context.rs @@ -0,0 +1,100 @@ +use matterhorn_client::ClientConfig; +use wasm_bindgen::JsValue; + +#[derive(Clone, Debug)] +pub struct AppCtx { + pub user: Option, + pub base_path: String, + pub matterhorn_config: ClientConfig, +} + +impl AppCtx { + pub fn asset_path(&self, file: &str) -> String { + format!("{}assets/{}", self.base_path, file.trim_start_matches('/')) + } +} + +fn clog(msg: impl AsRef) { + web_sys::console::log_1(&JsValue::from_str(&format!( + "[craft config] {}", + msg.as_ref() + ))); +} + +fn js_type_name(value: &JsValue) -> String { + if value.is_undefined() { + "undefined".into() + } else if value.is_null() { + "null".into() + } else if let Some(s) = value.as_string() { + format!("string(len={})", s.len()) + } else { + js_sys::Object::from(value.clone()).to_string().into() + } +} + +fn field_string(raw: &JsValue, key: &str) -> Option { + let value = js_sys::Reflect::get(raw, &JsValue::from_str(key)).ok()?; + clog(format!("{key}: {}", js_type_name(&value))); + value.as_string() +} + +/// Reads iframe-injected `window.__embeddedAppConfig`. +/// Expected payload: +/// `{ type: "APP_CONFIG", token, user, matterhorn_base_url }` +pub fn read_app_config() -> Option { + clog("read_app_config()"); + + let base_path = web_sys::window() + .and_then(|w| w.document()) + .and_then(|d| d.query_selector("base").ok().flatten()) + .and_then(|el| el.get_attribute("href")) + .unwrap_or_else(|| "/".to_string()); + + let window = match web_sys::window() { + Some(w) => w, + None => { + clog("window is missing"); + return None; + } + }; + + let embedded = js_sys::Reflect::get(&window, &"__embeddedAppConfig".into()).ok(); + let raw = match embedded { + Some(value) if !value.is_undefined() && !value.is_null() => value, + _ => { + clog("no usable __embeddedAppConfig"); + return None; + } + }; + + let token = match field_string(&raw, "token") { + Some(value) if !value.is_empty() => value, + Some(_) => { + clog("token is empty — host message not applied yet?"); + return None; + } + None => { + clog("token is not a string"); + return None; + } + }; + let base_url = match field_string(&raw, "matterhorn_base_url") { + Some(value) if !value.is_empty() => value, + Some(_) => { + clog("matterhorn_base_url is empty"); + return None; + } + None => { + clog("matterhorn_base_url is not a string"); + return None; + } + }; + let user = field_string(&raw, "username"); + + Some(AppCtx { + user, + base_path, + matterhorn_config: ClientConfig { base_url, token }, + }) +} diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..d3ce72e --- /dev/null +++ b/src/main.rs @@ -0,0 +1,12 @@ +mod app; +mod context; +mod components; +mod codegen; + +use app::App; +use leptos::mount::mount_to_body; + +fn main() { + console_error_panic_hook::set_once(); + mount_to_body(App); +} diff --git a/src/styles.css b/src/styles.css new file mode 100644 index 0000000..da01db8 --- /dev/null +++ b/src/styles.css @@ -0,0 +1,315 @@ +@import "@fontsource/geist/200.css"; +@import "@fontsource/geist/300.css"; +@import "@fontsource/geist/400.css"; +@import "@fontsource/geist/500.css"; +@import "@fontsource/geist/600.css"; +@import "tailwindcss"; + +@plugin "daisyui" { + themes: mountainridge --default; + darkTheme: mountainridge; + base: true; + styled: true; + utils: true; + logs: false; +} + +@plugin "daisyui/theme" { + name: "mountainridge"; + default: true; + prefersdark: true; + color-scheme: "dark"; + font-family: "Geist", system-ui, sans-serif; + /* Backgrounds — charcoal scale */ + --color-base-100: oklch(16% 0.02 214); + --color-base-200: oklch(13% 0.02 214); + --color-base-300: oklch(10% 0.02 214); + --color-base-content: oklch(92% 0.005 214); + + /* Primary — sea-grass green rgb(88, 191, 177) */ + --color-primary: oklch(72% 0.097 183); + --color-primary-content: oklch(13% 0.02 214); + + /* Secondary — glacier light blue rgb(94, 150, 159) */ + --color-secondary: oklch(60% 0.055 205); + --color-secondary-content: oklch(13% 0.02 214); + + /* Accent — flamingo pink rgba(253, 117, 127) */ + --color-accent: oklch(72% 0.155 14); /* flamingo pink */ + --color-accent-content: oklch(13% 0.02 214); + + + /* Neutral — charcoal slate */ + --color-neutral: oklch(28% 0.02 214); + --color-neutral-content: oklch(80% 0.01 214); + + /* Semantic */ + --color-info: oklch(60% 0.055 205); + --color-info-content: oklch(13% 0.02 214); + --color-success: oklch(72% 0.097 183); + --color-success-content: oklch(13% 0.02 214); + --color-warning: oklch(68% 0.16 42); /* alpenglow orange */ + --color-warning-content: oklch(13% 0.02 214); + --color-error: oklch(72% 0.155 14); /* flamingo pink */ + --color-error-content: oklch(13% 0.02 214); + + /* Shape */ + --radius-selector: 1.5rem; + --radius-field: 0.48rem; + --radius-box: 0.48rem; + --size-selector: 0.25rem; + --size-field: 0.25rem; + --border: 1px; + --depth: 1; + --noise: 0; +} + +:root { + all: inherit; + color: var(--color-base-content); /* DaisyUI's base text color */ + /* font-family: "Geist", system-ui, sans-serif;*/ + /* creating the perfect shadow according to twitter/X + - https://codepen.io/jh3y/pen/yLWgjpd + - https://x.com/jh3yy/status/1796208073830232574 + */ + --tint: 214; + --alpha: 4; + --base: hsl(var(--tint, 214) 80% 27% / calc(var(--alpha, 4) * 1%)); + --shade: hsl(from var(--base) calc(h + 8) 25 calc(l - 5)); + + --perfect-shadow: 0 0 0 1px var(--base), + 0 1px 1px -0.5px var(--shade), + 0 3px 3px -1.5px var(--shade), + 0 6px 6px -3px var(--shade), + 0 12px 12px -6px var(--base), + 0 24px 24px -12px var(--base); + + + --shade-active: hsla(173, 41%, 53%, 0.66); + --base-active: hsl(var(--tint, 214) 80% 27% / calc(var(--alpha, 4) * 1%)); + + --perfect-shadow-active: 0 0 0 1px var(--base-active), + 0 1px 1px -0.5px var(--shade-active), + 0 3px 3px -1.5px var(--shade-active), + 0 6px 6px -3px var(--shade-active), + 0 12px 12px -6px var(--base-active), + 0 24px 24px -12px var(--base-active); + + --perfect-shadow-thin-active: 0 0 0 1px var(--base-active), + 0 1px 2px -0.5px var(--shade-active), + 0 2px 4px -1px var(--shade-active), + 0 4px 8px -2px var(--shade-active); + + --shade-active-warn: rgba(253, 117, 127, 0.66); + --perfect-shadow-warn: 0 0 0 1px var(--shade-active-warn), + 0 1px 1px -0.5px var(--shade-active-warn), + 0 3px 3px -1.5px var(--shade-active-warn), + 0 6px 6px -3px var(--shade-active-warn), + 0 12px 12px -6px var(--base-active), + 0 24px 24px -12px var(--base-active); + + + --base-thin: hsl(var(--tint, 214) 80% 27% / calc(var(--alpha, 4) * 1%)); + --shade-thin: hsl(from var(--base-thin) calc(h + 8) 25 calc(l - 5)); + + --perfect-shadow-thin: 0 0 0 1px var(--base-thin), + 0 1px 2px -0.5px var(--shade-thin), + 0 3px 6px -1px var(--shade-thin); + --perfect-shadow-light: 0px 6px 20px -4px rgba(0, 0, 0, 0.40), 0px 0px 30px -8px rgba(123, 94, 248, 0.10); + /* === DARK BACKGROUND SHADOWS === */ + + /* Tinted with glacier blue for atmosphere */ + --tint-dark: 205; + --alpha-dark: 30; + + --base-dark: hsl(var(--tint-dark) 60% 60% / calc(var(--alpha-dark) * 1%)); + --shade-dark: hsl(from var(--base-dark) calc(h + 8) 70 calc(l + 10)); + + /* Full shadow — for cards, modals, elevated surfaces */ + --perfect-shadow-dark: 0 0 0 1px hsl(205 40% 50% / 15%), + 0 1px 1px -0.5px var(--base-dark), + 0 3px 3px -1.5px var(--base-dark), + 0 6px 6px -3px var(--shade-dark), + 0 12px 12px -6px var(--shade-dark), + 0 24px 24px -12px var(--base-dark); + + /* Thin shadow — for buttons, inputs, small elements */ + --perfect-shadow-thin-dark: 0 0 0 1px hsl(205 40% 50% / 12%), + 0 1px 2px -0.5px var(--base-dark), + 0 3px 6px -1px var(--shade-dark); + + /* Active/focus state — sea-grass green glow */ + --shade-active-dark: hsla(183, 35%, 55%, 0.45); /* sea-grass green */ + + --perfect-shadow-thin-active-dark: 0 0 0 1px hsla(183, 35%, 55%, 0.3), + 0 1px 2px -0.5px var(--shade-active-dark), + 0 2px 4px -1px var(--shade-active-dark), + 0 4px 8px -2px var(--shade-active-dark); + + /* Warning/error active state — flamingo pink glow */ + --shade-active-warn-dark: rgba(253, 117, 127, 0.45); + + --perfect-shadow-warn-dark: 0 0 0 1px rgba(253, 117, 127, 0.3), + 0 1px 1px -0.5px var(--shade-active-warn-dark), + 0 3px 3px -1.5px var(--shade-active-warn-dark), + 0 6px 6px -3px var(--shade-active-warn-dark), + 0 12px 12px -6px var(--shade-active-warn-dark); + + --mountain-white-dark: rgb(245, 242, 242); /* ≈ 80% – popular "dark mode off-white" */ + --mountain-white: rgb(255, 252, 252, 1); + --ghost-white: rgb(248, 248, 255, 1); + + /* Very subtle darkening – still very bright */ + --mountain-white-darker-1: rgb(245, 242, 242); /* ≈ 96% brightness */ + --mountain-white-darker-2: rgb(235, 232, 232); /* ≈ 92% */ + + /* Noticeably darker but still clearly a very light / "off-white" */ + --mountain-white-darker-3: rgb(230, 227, 227); /* ≈ 90% */ + --mountain-white-darker-4: rgb(220, 217, 217); /* ≈ 86% */ + --mountain-white-darker-5: rgb(204, 201, 201); /* ≈ 80% – popular "dark mode off-white" */ + + /* Deeper / moodier off-whites – start feeling more greyish */ + --mountain-white-darker-6: rgb(189, 186, 186); /* ≈ 74% */ + --mountain-white-darker-7: rgb(170, 167, 167); /* ≈ 67% – quite smoky now */ + --mountain-white-darker-8: rgb(150, 147, 147); /* ≈ 59% – very muted/dark off-white */ + + --charcoal-deep: rgb(15, 20, 25); + --charcoal-dark: rgb(25, 30, 35); /* +10 */ + --charcoal-medium: rgb(35, 40, 48); /* +20ish */ + --charcoal-soft: rgb(45, 50, 58); /* noticeably lighter but still moody */ + --charcoal-slate: rgb(55, 60, 68); /* good background / surface color */ + --charcoal-lighter: rgb(70, 75, 85); /* readable dark gray, modern UI feel */ + --deep-night-black: rgb(8, 18, 28); + --abyss-black: rgb(6, 15, 22); + + --bs-dark: var(--charcoal-medium); /* changes the base dark color */ + --bs-dark-rgb: 35, 40, 48; + --bs-blue: var(--glacier-blue); + + /* custom colors */ + --flamingo-pink: rgba(253, 117, 127, 1); + --sea-grass-green: rgba(88, 191, 177, 1); + + --mountain-darkgray: rgb(12, 31, 49, 1); + --mountain-gray: rgb(102, 133, 139, 1); + --mountain-lightgray: rgb(121, 152, 155, 1); + + --glacier-blue: rgb(28, 80, 101); + --glacier-darkblue: rgb(12, 39, 49); + --glacier-lightblue: rgb(94, 150, 159); + --glacier-blue-rgb: 94, 150, 159; + + /* borders, corners, and shadows */ + --perfect-border-radius: 0.48em; + --backdrop-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.2), 0 1px 3px 0 rgba(0, 0, 0, 0.19); + --backdrop-transition: all 0.3s ease; + + /* global overwrites of bootstrap vars */ + --text-bg-primary-badge-color: var(--glacier-blue); + + /* White to Darker Blue diagonal gradient */ + --gradient-white-dark-blue: linear-gradient( + 142deg, + var(--ghost-white) 0%, + var(--ghost-white) 55%, + var(--glacier-lightblue) 67%, + var(--glacier-lightblue) 75%, + var(--glacier-blue) 100% + ); + --gradient-dark: linear-gradient(135deg, var(--mountain-white) 0%, var(--mountain-darkgray) 100%); +} + +* { + scrollbar-width: thin; + scrollbar-color: color-mix(in oklch, var(--color-base-content) 28%, transparent) var(--color-base-200); +} + +*::-webkit-scrollbar { + width: 8px; + height: 8px; +} + +*::-webkit-scrollbar-track { + background: var(--color-base-200); +} + +*::-webkit-scrollbar-thumb { + background-color: color-mix(in oklch, var(--color-base-content) 28%, transparent); + border-radius: var(--radius-field); + border: 2px solid var(--color-base-200); +} + +*::-webkit-scrollbar-thumb:hover { + background-color: color-mix(in oklch, var(--color-primary) 65%, transparent); +} + +*::-webkit-scrollbar-corner { + background: var(--color-base-200); +} + +html, body { + height: 100%; + width: 100%; + margin: 0; + overflow: hidden; + background-color: var(--color-base-200); + color: var(--color-base-content); +} + +body > * { + height: 100%; + max-height: 100%; + min-height: 0; +} + +.drawer, +.drawer-content, +.drawer-side { + height: 100%; + max-height: 100%; + min-height: 0 !important; +} + +.drawer-content { + overflow: hidden; +} + +html, :root, body { + font-size: 14px; +} + +html, body { + font-family: "Geist Variable", "Geist", system-ui, sans-serif; + font-weight: 300; + font-synthesis: none; /* no fake 700 from 400 */ +} + +h1, h2, h3 { + font-weight: 300; +} + +h4, h5, h6, p { + font-weight: 400; +} + +.btn { + box-shadow: var(--perfect-shadow-thin-dark); + transition: transform 0.3s ease-out, box-shadow 0.3s ease-out; +} + +.btn:hover { + transform: scale(1.1) translateY(-2px); + box-shadow: var(--perfect-shadow-thin-active-dark); +} + +.btn:not(.btn-ghost):not(.btn-outline):hover { + transform: scale(1.1) translateY(-2px); + box-shadow: var(--perfect-shadow-thin-active-dark); +} + +.btn, +.menu a, +.tab, +.table :where(th) { + font-weight: 400; +} \ No newline at end of file

;(;BOk4nz5c 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 literal 0 HcmV?d00001 diff --git a/index.html b/index.html new file mode 100644 index 0000000..5d55eb7 --- /dev/null +++ b/index.html @@ -0,0 +1,23 @@ + + + + + + + MountainRidge.xyz - Mont Fort App + + + + + + + + + \ No newline at end of file diff --git a/package.json b/package.json new file mode 100644 index 0000000..62e2950 --- /dev/null +++ b/package.json @@ -0,0 +1,14 @@ +{ + "dependencies": { + "@fontsource/geist": "^5.3.0", + "daisyui": "^5.5.18", + "tailwindcss": "^4.2.1" + }, + "scripts": { + "build-craft": "npm install && tailwindcss -i src/styles.css -o assets/styles.css --minify && trunk build --config Trunk.toml", + "fmt": "cargo fmt", + "check": "cargo fmt && cargo check --all-targets --all-features -q --message-format short --color never", + "lint": "cargo clippy --all-targets --all-features -- -D warnings", + "test": "cargo test --all-targets --all-features" + } +} diff --git a/src/app.rs b/src/app.rs new file mode 100644 index 0000000..016e80e --- /dev/null +++ b/src/app.rs @@ -0,0 +1,97 @@ +use crate::components::{ + ConfigError, ErrorView, Home, LoadingView, SoftwareFeatureList, +}; +use crate::context::{read_app_config, AppCtx}; +use leptos::prelude::*; +use leptos_router::components::{A, Outlet, ParentRoute, Route, Router, Routes}; +use leptos_router::path; + +/// Register new pages here: add a `` and a matching nav ``. +#[component] +pub fn App() -> impl IntoView { + match read_app_config() { + None => view! { }.into_any(), + Some(config) => { + provide_context(config.clone()); + view! { + + "Not found"