diff --git a/website/404/index.html b/website/404/index.html new file mode 100644 index 0000000..843177b --- /dev/null +++ b/website/404/index.html @@ -0,0 +1,81 @@ + + + + + + + Grinminer.net + + + + + + + + + + + + + + + + + + + +
+ Public Nodes + Public API + Node/VPS Application + Download Firmware/Wallets + Mainnet Explorer + Testnet Explorer + Wallet Checker + Telegram + Github + + + +
+ +

Developed over 2 years to be an alternative to the corporate cloud.

+ + + grinminer-banner + + +
+
+

Provider of hosted public & private nodes + solo mining pools + a Trezor/Ledger compatible wallet.

+
+
+

Host of Grin's permanent public testnet mining node allowing devs to have 24/7 block production, aiding development of the protocol.

+
+

VPS service with no KYC, customer logs, contracts, or corporate ties.

+
+

Grinminer.net is not controlled by any company or foundation.

+
+

404 NOT FOUND

+ grinminer ad +
+ + + + + \ No newline at end of file diff --git a/website/api/index.html b/website/api/index.html new file mode 100644 index 0000000..87fb6b0 --- /dev/null +++ b/website/api/index.html @@ -0,0 +1,88 @@ + + + + + + + Grinminer.net + + + + + + + + + + + + + + + + + +
+ Public Nodes + Public API + Node/VPS Application + Download Firmware/Wallets + Mainnet Explorer + Testnet Explorer + Wallet Checker + Telegram + Github + + + +
+ +

Developed over 2 years to be an alternative to the corporate cloud.

+ + + + grinminer-banner + +
+
+

Provider of hosted public & private nodes + solo mining pools + a Trezor/Ledger compatible wallet.

+
+

Grinminer public APIs

+

no API secret required

+

Mainnet

+

http://grinminer.net:3413

+

Testnet

+

http://grinminer.net:13413

+ Grin node api v1 documentation +
+ Grin node api v2 documentation + + + + + + \ No newline at end of file diff --git a/website/application/index.html b/website/application/index.html new file mode 100644 index 0000000..d9fa299 --- /dev/null +++ b/website/application/index.html @@ -0,0 +1,127 @@ + + + + + + + Grinminer.net + + + + + + + + + + + + + + + + + + <
+ Public Nodes + Public API + Node/VPS Application + Download Firmware/Wallets + Mainnet Explorer + Testnet Explorer + Wallet Checker + Telegram + Github + + + +
+ +

Developed over 2 years to be an alternative to the corporate cloud.

+ + + + grinminer-banner + +
+
+

Provider of hosted public & private nodes + solo mining pools + a Trezor/Ledger compatible wallet.

+
+ +
+
+

Sign Up

+

Please fill in this form to create an account.

+

Fees are nominal, and meant to discourage resource waste. Must be paid in Grin.

+

All nodes are LXC containers running the latest Debian release.

+
+
+ Are you looking for a Grin node or node+stratum? + + +
+
+
+ Do you want an archival or pruned node? + + +
+
+
+ Do you require node setup or support/backups? + + + +
+
+
+ Do you agree to only use your VPS for Grin software? + + +
+
+ +
+ +
+ + + +

Grinminer.net is very young and experimental, use at your own risk.

+

Once applied you will receive an email response within 48 hours to confirm.

+ +
+ +
+
+
+ + + +
+ +
+ + \ No newline at end of file diff --git a/website/firmware/SDCARD-IPollo-G1-2.5.4-firmware.img b/website/firmware/SDCARD-IPollo-G1-2.5.4-firmware.img new file mode 100644 index 0000000..7d7151c Binary files /dev/null and b/website/firmware/SDCARD-IPollo-G1-2.5.4-firmware.img differ diff --git a/website/firmware/SDCARD-Ipollo-G1-2.5.2-firmware.bin b/website/firmware/SDCARD-Ipollo-G1-2.5.2-firmware.bin new file mode 100644 index 0000000..e056ab4 Binary files /dev/null and b/website/firmware/SDCARD-Ipollo-G1-2.5.2-firmware.bin differ diff --git a/website/firmware/WEBFLASH-Ipollo-G1-2.4.0-firmware.bin b/website/firmware/WEBFLASH-Ipollo-G1-2.4.0-firmware.bin new file mode 100644 index 0000000..807f97a --- /dev/null +++ b/website/firmware/WEBFLASH-Ipollo-G1-2.4.0-firmware.bin @@ -0,0 +1,2479 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ipollo-firmware/Ipollo_G1-MINI_GRIN_V240.bin at main · vekamo/ipollo-firmware · GitHub + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ Skip to content + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+ + + + + +
+ + + + + + + + + +
+
+
+ + + + + + + + + +
+ + +
+ +
+ +
+ + + + / + + ipollo-firmware + + + Public +
+ + +
+ +
+ + +
+
+ +
+
+ + + + +
+ + + + + + +
+ + + + + + + + + + + + + + + + + + +

Latest commit

 

History

History
8.3 MB

Ipollo_G1-MINI_GRIN_V240.bin

File metadata and controls

8.3 MB
View raw

(Sorry about that, but we can’t show files that are this big right now.)

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

Footer

+ + + + +
+
+ + + + + © 2024 GitHub, Inc. + +
+ + +
+
+ + + + + + + + + + + + + + + + + + + +
+ +
+
+ + + diff --git a/website/firmware/WEBFLASH-Ipollo-G1-2.4.4-firmware.bin b/website/firmware/WEBFLASH-Ipollo-G1-2.4.4-firmware.bin new file mode 100644 index 0000000..c70e4da --- /dev/null +++ b/website/firmware/WEBFLASH-Ipollo-G1-2.4.4-firmware.bin @@ -0,0 +1,2479 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ipollo-firmware/iPolloG1mini-iPollo_244firmware.bin at main · vekamo/ipollo-firmware · GitHub + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ Skip to content + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+ + + + + +
+ + + + + + + + + +
+
+
+ + + + + + + + + +
+ + +
+ +
+ +
+ + + + / + + ipollo-firmware + + + Public +
+ + +
+ +
+ + +
+
+ +
+
+ + + + +
+ + + + + + +
+ + + + + + + + + + + + + + + + + + +

Latest commit

 

History

History
8.51 MB

iPolloG1mini-iPollo_244firmware.bin

File metadata and controls

8.51 MB
View raw

(Sorry about that, but we can’t show files that are this big right now.)

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

Footer

+ + + + +
+
+ + + + + © 2024 GitHub, Inc. + +
+ + +
+
+ + + + + + + + + + + + + + + + + + + +
+ +
+
+ + + diff --git a/website/firmware/WEBFLASH-Ipollo-G1-2.4.9-firmware.bin b/website/firmware/WEBFLASH-Ipollo-G1-2.4.9-firmware.bin new file mode 100644 index 0000000..b16be02 --- /dev/null +++ b/website/firmware/WEBFLASH-Ipollo-G1-2.4.9-firmware.bin @@ -0,0 +1,1861 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ipollo-firmware/iPollo_G_series-iPollo2.49firmware.bin at main · vekamo/ipollo-firmware · GitHub + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ Skip to content + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+ + + + + +
+ + + + + + + + + +
+
+
+ + + + + + + + + +
+ + +
+ +
+ +
+ + + + / + + ipollo-firmware + + + Public +
+ + +
+ +
+ + +
+
+ +
+
+ + + + +
+ + + + + + +
+ + + + + + + + + + + + + + + + + + +
+
+ + + + +
+ +
+ +
+
+ +
+ +
+

Footer

+ + + + +
+
+ + + + + © 2024 GitHub, Inc. + +
+ + +
+
+ + + + + + + + + + + + + + + + + + + +
+ +
+
+ + + diff --git a/website/firmware/WEBFLASH-Ipollo-G1-2.5.2-firmware.img b/website/firmware/WEBFLASH-Ipollo-G1-2.5.2-firmware.img new file mode 100644 index 0000000..6e65633 Binary files /dev/null and b/website/firmware/WEBFLASH-Ipollo-G1-2.5.2-firmware.img differ diff --git a/website/firmware/WEBFLASH-Ipollo-G1-2.5.4-firmware.bin b/website/firmware/WEBFLASH-Ipollo-G1-2.5.4-firmware.bin new file mode 100644 index 0000000..c935ad6 Binary files /dev/null and b/website/firmware/WEBFLASH-Ipollo-G1-2.5.4-firmware.bin differ diff --git a/website/grinminer-form/Cargo.toml b/website/grinminer-form/Cargo.toml new file mode 100644 index 0000000..736270c --- /dev/null +++ b/website/grinminer-form/Cargo.toml @@ -0,0 +1,11 @@ +[package] +name = "grinminer-form" +version = "0.1.0" +edition = "2021" + +[dependencies] +rocket = { git = "https://github.com/rwf2/Rocket" } + +[dependencies.rocket_dyn_templates] +version = "0.1.0" +features = ["handlebars", "tera", "minijinja"] diff --git a/website/grinminer-form/index.html b/website/grinminer-form/index.html new file mode 100644 index 0000000..0454647 --- /dev/null +++ b/website/grinminer-form/index.html @@ -0,0 +1,151 @@ +** start of undefined ** + + + + + + + +
+
+

Grinminer.net application

+

+ Apply for a free or paid node/stratum depending on support level +

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

Select an option

+ +
+ +
+

Do you need setup help and ongoing support your node(s)?

+ + +
+ +
+

Do you agree to only use this VPS for Grin?

+ +
+
+

What future features are you interested in?(Check all that apply)

+ + + + +
+
+

Comments or suggestions?

+ +
+ +
+ +
+
+
+ + + +** end of undefined ** + +** start of undefined ** + + + +** end of undefined ** + diff --git a/website/grinminer-form/src/main.rs b/website/grinminer-form/src/main.rs new file mode 100644 index 0000000..a908eb4 --- /dev/null +++ b/website/grinminer-form/src/main.rs @@ -0,0 +1,97 @@ +#[macro_use] extern crate rocket; + +use rocket::time::Date; +use rocket::http::{Status, ContentType}; +use rocket::form::{Form, Contextual, FromForm, FromFormField, Context}; +use rocket::fs::{FileServer, TempFile, relative}; + +use rocket_dyn_templates::Template; + +#[derive(Debug, FromForm)] +struct Password<'v> { + #[field(validate = len(6..))] + #[field(validate = eq(self.second))] + #[allow(unused)] + first: &'v str, + #[allow(unused)] + #[field(validate = eq(self.first))] + second: &'v str, +} + +#[derive(Debug, FromFormField)] +enum Rights { + Public, + Reserved, + Exclusive, +} + +#[derive(Debug, FromFormField)] +enum Category { + Biology, + Chemistry, + Physics, + #[field(value = "CS")] + ComputerScience, +} + +#[derive(Debug, FromForm)] +#[allow(dead_code)] +struct Submission<'v> { + #[field(validate = len(1..))] + title: &'v str, + date: Date, + #[field(validate = len(1..=250))] + r#abstract: &'v str, + #[field(validate = ext(ContentType::PDF))] + file: TempFile<'v>, + #[field(validate = len(1..))] + category: Vec, + rights: Rights, + ready: bool, +} + +#[derive(Debug, FromForm)] +#[allow(dead_code)] +struct Account<'v> { + #[field(validate = len(1..))] + name: &'v str, + password: Password<'v>, + #[field(validate = contains('@').or_else(msg!("invalid email address")))] + email: &'v str, +} + +#[derive(Debug, FromForm)] +#[allow(dead_code)] +struct Submit<'v> { + account: Account<'v>, + submission: Submission<'v>, +} + +#[get("/")] +fn index() -> Template { + Template::render("index", &Context::default()) +} + +// NOTE: We use `Contextual` here because we want to collect all submitted form +// fields to re-render forms with submitted values on error. If you have no such +// need, do not use `Contextual`. Use the equivalent of `Form>`. +#[post("/", data = "
")] +fn submit<'r>(form: Form>>) -> (Status, Template) { + let template = match form.value { + Some(ref submission) => { + println!("submission: {:#?}", submission); + Template::render("success", &form.context) + } + None => Template::render("index", &form.context), + }; + + (form.context.status(), template) +} + +#[launch] +fn rocket() -> _ { + rocket::build() + .mount("/", routes![index, submit]) + .attach(Template::fairing()) + .mount("/", FileServer::from(relative!("/static"))) +} diff --git a/website/grinminer-form/src/tests.rs b/website/grinminer-form/src/tests.rs new file mode 100644 index 0000000..d106245 --- /dev/null +++ b/website/grinminer-form/src/tests.rs @@ -0,0 +1,193 @@ +use std::fmt; +use super::{rocket, FormInput, FormOption}; + +use rocket::local::blocking::Client; +use rocket::http::ContentType; + +impl fmt::Display for FormOption { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match *self { + FormOption::A => write!(f, "a"), + FormOption::B => write!(f, "b"), + FormOption::C => write!(f, "c"), + } + } +} + +macro_rules! assert_form_eq { + ($client:expr, $form_str:expr, $expected:expr) => {{ + let res = $client.post("/") + .header(ContentType::Form) + .body($form_str) + .dispatch(); + + assert_eq!(res.into_string(), Some($expected)); + }}; +} + +macro_rules! assert_valid_form { + ($client:expr, $input:expr) => {{ + let f = format!("checkbox={}&number={}&type={}&password={}&textarea={}&select={}", + $input.checkbox, $input.number, $input.radio, $input.password, + $input.text_area, $input.select); + assert_form_eq!($client, &f, format!("{:?}", $input)); + }}; +} + +macro_rules! assert_valid_raw_form { + ($client:expr, $form_str:expr, $input:expr) => {{ + assert_form_eq!($client, $form_str, format!("{:?}", $input)); + }}; +} + +#[test] +fn test_good_forms() { + let client = Client::tracked(rocket()).unwrap(); + let mut input = FormInput { + checkbox: true, + number: 310, + radio: FormOption::A, + password: "beep".into(), + text_area: "bop".to_string(), + select: FormOption::B + }; + + assert_valid_form!(&client, &input); + + input.checkbox = false; + assert_valid_form!(&client, &input); + + input.number = 0; + assert_valid_form!(&client, &input); + input.number = 120; + assert_valid_form!(&client, &input); + input.number = 133; + assert_valid_form!(&client, &input); + + input.radio = FormOption::B; + assert_valid_form!(&client, &input); + input.radio = FormOption::C; + assert_valid_form!(&client, &input); + + input.password = "".into(); + assert_valid_form!(&client, &input); + input.password = "----90138490285u2o3hndslkv".into(); + assert_valid_form!(&client, &input); + input.password = "hi".into(); + assert_valid_form!(&client, &input); + + input.text_area = "".to_string(); + assert_valid_form!(&client, &input); + input.text_area = "----90138490285u2o3hndslkv".to_string(); + assert_valid_form!(&client, &input); + input.text_area = "hey".to_string(); + assert_valid_form!(&client, &input); + + input.select = FormOption::A; + assert_valid_form!(&client, &input); + input.select = FormOption::C; + assert_valid_form!(&client, &input); + + // checkbox need not be present; defaults to false; accepts 'on' and 'off' + assert_valid_raw_form!(&client, + "number=133&type=c&password=hi&textarea=hey&select=c", + &input); + + assert_valid_raw_form!(&client, + "checkbox=off&number=133&type=c&password=hi&textarea=hey&select=c", + &input); + + input.checkbox = true; + assert_valid_raw_form!(&client, + "checkbox=on&number=133&type=c&password=hi&textarea=hey&select=c", + &input); +} + +macro_rules! assert_invalid_form { + ($client:expr, $vals:expr) => {{ + let vals = $vals; + let s = format!("checkbox={}&number={}&type={}&password={}&textarea={}&select={}", + vals[0], vals[1], vals[2], vals[3], vals[4], vals[5]); + assert_form_eq!($client, &s, format!("Invalid form input: {}", s)); + *vals = ["true", "1", "a", "hi", "hey", "b"]; + }}; +} + +macro_rules! assert_invalid_raw_form { + ($client:expr, $form_str:expr) => {{ + assert_form_eq!($client, $form_str, format!("Invalid form input: {}", $form_str)); + }}; +} + +#[test] +fn check_semantically_invalid_forms() { + let client = Client::tracked(rocket()).unwrap(); + let mut form_vals = ["true", "1", "a", "hi", "hey", "b"]; + + form_vals[0] = "not true"; + assert_invalid_form!(&client, &mut form_vals); + form_vals[0] = "bing"; + assert_invalid_form!(&client, &mut form_vals); + form_vals[0] = "true0"; + assert_invalid_form!(&client, &mut form_vals); + form_vals[0] = " false"; + assert_invalid_form!(&client, &mut form_vals); + + form_vals[1] = "-1"; + assert_invalid_form!(&client, &mut form_vals); + form_vals[1] = "1e10"; + assert_invalid_form!(&client, &mut form_vals); + form_vals[1] = "-1-1"; + assert_invalid_form!(&client, &mut form_vals); + form_vals[1] = "NaN"; + assert_invalid_form!(&client, &mut form_vals); + + form_vals[2] = "A?"; + assert_invalid_form!(&client, &mut form_vals); + form_vals[2] = " B"; + assert_invalid_form!(&client, &mut form_vals); + form_vals[2] = "d"; + assert_invalid_form!(&client, &mut form_vals); + form_vals[2] = "100"; + assert_invalid_form!(&client, &mut form_vals); + form_vals[2] = ""; + assert_invalid_form!(&client, &mut form_vals); + + // password and textarea are always valid, so we skip them + form_vals[5] = "A."; + assert_invalid_form!(&client, &mut form_vals); + form_vals[5] = "b "; + assert_invalid_form!(&client, &mut form_vals); + form_vals[5] = "d"; + assert_invalid_form!(&client, &mut form_vals); + form_vals[5] = "-a"; + assert_invalid_form!(&client, &mut form_vals); + form_vals[5] = ""; + assert_invalid_form!(&client, &mut form_vals); + + // now forms with missing fields + assert_invalid_raw_form!(&client, "number=10&type=a&password=hi&textarea=hey"); + assert_invalid_raw_form!(&client, "number=10&radio=a&password=hi&textarea=hey&select=b"); + assert_invalid_raw_form!(&client, "number=10&password=hi&select=b"); + assert_invalid_raw_form!(&client, "number=10&select=b"); + assert_invalid_raw_form!(&client, "password=hi&select=b"); + assert_invalid_raw_form!(&client, "password=hi"); + assert_invalid_raw_form!(&client, ""); +} + +#[test] +fn check_structurally_invalid_forms() { + let client = Client::tracked(rocket()).unwrap(); + assert_invalid_raw_form!(&client, "==&&&&&&=="); + assert_invalid_raw_form!(&client, "a&=b"); + assert_invalid_raw_form!(&client, "="); +} + +#[test] +fn check_bad_utf8() { + let client = Client::tracked(rocket()).unwrap(); + unsafe { + let bad_str = std::str::from_utf8_unchecked(b"a=\xff"); + assert_form_eq!(&client, bad_str, "Form input was invalid UTF-8.".into()); + } +} diff --git a/website/grinminer-form/static/chota.min.css b/website/grinminer-form/static/chota.min.css new file mode 100644 index 0000000..166cdc8 --- /dev/null +++ b/website/grinminer-form/static/chota.min.css @@ -0,0 +1 @@ +/*! chota.css v0.8.0 | MIT License | github.com/jenil/chota */:root{--bg-color:#fff;--bg-secondary-color:#f3f3f6;--color-primary:#14854f;--color-lightGrey:#d2d6dd;--color-grey:#747681;--color-darkGrey:#3f4144;--color-error:#d43939;--color-success:#28bd14;--grid-maxWidth:120rem;--grid-gutter:2rem;--font-size:1.6rem;--font-color:#333;--font-family-sans:-apple-system,BlinkMacSystemFont,Avenir,"Avenir Next","Segoe UI","Roboto","Oxygen","Ubuntu","Cantarell","Fira Sans","Droid Sans","Helvetica Neue",sans-serif;--font-family-mono:monaco,"Consolas","Lucida Console",monospace}html{-webkit-box-sizing:border-box;box-sizing:border-box;font-size:62.5%;line-height:1.15;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}*,:after,:before{-webkit-box-sizing:inherit;box-sizing:inherit}*{scrollbar-width:thin;scrollbar-color:var(--color-lightGrey) var(--bg-primary)}::-webkit-scrollbar{width:8px}::-webkit-scrollbar-track{background:var(--bg-primary)}::-webkit-scrollbar-thumb{background:var(--color-lightGrey)}body{background-color:var(--bg-color);line-height:1.6;font-size:var(--font-size);color:var(--font-color);font-family:Segoe UI,Helvetica Neue,sans-serif;font-family:var(--font-family-sans);margin:0;padding:0}h1,h2,h3,h4,h5,h6{font-weight:500;margin:.35em 0 .7em}h1{font-size:2em}h2{font-size:1.75em}h3{font-size:1.5em}h4{font-size:1.25em}h5{font-size:1em}h6{font-size:.85em}a{color:var(--color-primary);text-decoration:none}a:hover:not(.button){opacity:.75}button{font-family:inherit}p{margin-top:0}blockquote{background-color:var(--bg-secondary-color);padding:1.5rem 2rem;border-left:3px solid var(--color-lightGrey)}dl dt{font-weight:700}hr{background-color:var(--color-lightGrey);height:1px;margin:1rem 0}hr,table{border:none}table{width:100%;border-collapse:collapse;border-spacing:0;text-align:left}table.striped tr:nth-of-type(2n){background-color:var(--bg-secondary-color)}td,th{vertical-align:middle;padding:1.2rem .4rem}thead{border-bottom:2px solid var(--color-lightGrey)}tfoot{border-top:2px solid var(--color-lightGrey)}code,kbd,pre,samp,tt{font-family:var(--font-family-mono)}code,kbd{font-size:90%;white-space:pre-wrap;border-radius:4px;padding:.2em .4em;color:var(--color-error)}code,kbd,pre{background-color:var(--bg-secondary-color)}pre{font-size:1em;padding:1rem;overflow-x:auto}pre code{background:none;padding:0}abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}img{max-width:100%}fieldset{border:1px solid var(--color-lightGrey)}iframe{border:0}.container{max-width:var(--grid-maxWidth);margin:0 auto;width:96%;padding:0 calc(var(--grid-gutter)/2)}.row{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start;margin-left:calc(var(--grid-gutter)/-2);margin-right:calc(var(--grid-gutter)/-2)}.row,.row.reverse{-webkit-box-orient:horizontal}.row.reverse{-webkit-box-direction:reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.col{-webkit-box-flex:1;-ms-flex:1;flex:1}.col,[class*=" col-"],[class^=col-]{margin:0 calc(var(--grid-gutter)/2) calc(var(--grid-gutter)/2)}.col-1{-ms-flex:0 0 calc(8.33333% - var(--grid-gutter));flex:0 0 calc(8.33333% - var(--grid-gutter));max-width:calc(8.33333% - var(--grid-gutter))}.col-1,.col-2{-webkit-box-flex:0}.col-2{-ms-flex:0 0 calc(16.66667% - var(--grid-gutter));flex:0 0 calc(16.66667% - var(--grid-gutter));max-width:calc(16.66667% - var(--grid-gutter))}.col-3{-ms-flex:0 0 calc(25% - var(--grid-gutter));flex:0 0 calc(25% - var(--grid-gutter));max-width:calc(25% - var(--grid-gutter))}.col-3,.col-4{-webkit-box-flex:0}.col-4{-ms-flex:0 0 calc(33.33333% - var(--grid-gutter));flex:0 0 calc(33.33333% - var(--grid-gutter));max-width:calc(33.33333% - var(--grid-gutter))}.col-5{-ms-flex:0 0 calc(41.66667% - var(--grid-gutter));flex:0 0 calc(41.66667% - var(--grid-gutter));max-width:calc(41.66667% - var(--grid-gutter))}.col-5,.col-6{-webkit-box-flex:0}.col-6{-ms-flex:0 0 calc(50% - var(--grid-gutter));flex:0 0 calc(50% - var(--grid-gutter));max-width:calc(50% - var(--grid-gutter))}.col-7{-ms-flex:0 0 calc(58.33333% - var(--grid-gutter));flex:0 0 calc(58.33333% - var(--grid-gutter));max-width:calc(58.33333% - var(--grid-gutter))}.col-7,.col-8{-webkit-box-flex:0}.col-8{-ms-flex:0 0 calc(66.66667% - var(--grid-gutter));flex:0 0 calc(66.66667% - var(--grid-gutter));max-width:calc(66.66667% - var(--grid-gutter))}.col-9{-ms-flex:0 0 calc(75% - var(--grid-gutter));flex:0 0 calc(75% - var(--grid-gutter));max-width:calc(75% - var(--grid-gutter))}.col-9,.col-10{-webkit-box-flex:0}.col-10{-ms-flex:0 0 calc(83.33333% - var(--grid-gutter));flex:0 0 calc(83.33333% - var(--grid-gutter));max-width:calc(83.33333% - var(--grid-gutter))}.col-11{-ms-flex:0 0 calc(91.66667% - var(--grid-gutter));flex:0 0 calc(91.66667% - var(--grid-gutter));max-width:calc(91.66667% - var(--grid-gutter))}.col-11,.col-12{-webkit-box-flex:0}.col-12{-ms-flex:0 0 calc(100% - var(--grid-gutter));flex:0 0 calc(100% - var(--grid-gutter));max-width:calc(100% - var(--grid-gutter))}@media screen and (max-width:599px){.container{width:100%}.col,[class*=col-],[class^=col-]{-webkit-box-flex:0;-ms-flex:0 1 100%;flex:0 1 100%;max-width:100%}}@media screen and (min-width:900px){.col-1-md{-webkit-box-flex:0;-ms-flex:0 0 calc(8.33333% - var(--grid-gutter));flex:0 0 calc(8.33333% - var(--grid-gutter));max-width:calc(8.33333% - var(--grid-gutter))}.col-2-md{-webkit-box-flex:0;-ms-flex:0 0 calc(16.66667% - var(--grid-gutter));flex:0 0 calc(16.66667% - var(--grid-gutter));max-width:calc(16.66667% - var(--grid-gutter))}.col-3-md{-webkit-box-flex:0;-ms-flex:0 0 calc(25% - var(--grid-gutter));flex:0 0 calc(25% - var(--grid-gutter));max-width:calc(25% - var(--grid-gutter))}.col-4-md{-webkit-box-flex:0;-ms-flex:0 0 calc(33.33333% - var(--grid-gutter));flex:0 0 calc(33.33333% - var(--grid-gutter));max-width:calc(33.33333% - var(--grid-gutter))}.col-5-md{-webkit-box-flex:0;-ms-flex:0 0 calc(41.66667% - var(--grid-gutter));flex:0 0 calc(41.66667% - var(--grid-gutter));max-width:calc(41.66667% - var(--grid-gutter))}.col-6-md{-webkit-box-flex:0;-ms-flex:0 0 calc(50% - var(--grid-gutter));flex:0 0 calc(50% - var(--grid-gutter));max-width:calc(50% - var(--grid-gutter))}.col-7-md{-webkit-box-flex:0;-ms-flex:0 0 calc(58.33333% - var(--grid-gutter));flex:0 0 calc(58.33333% - var(--grid-gutter));max-width:calc(58.33333% - var(--grid-gutter))}.col-8-md{-webkit-box-flex:0;-ms-flex:0 0 calc(66.66667% - var(--grid-gutter));flex:0 0 calc(66.66667% - var(--grid-gutter));max-width:calc(66.66667% - var(--grid-gutter))}.col-9-md{-webkit-box-flex:0;-ms-flex:0 0 calc(75% - var(--grid-gutter));flex:0 0 calc(75% - var(--grid-gutter));max-width:calc(75% - var(--grid-gutter))}.col-10-md{-webkit-box-flex:0;-ms-flex:0 0 calc(83.33333% - var(--grid-gutter));flex:0 0 calc(83.33333% - var(--grid-gutter));max-width:calc(83.33333% - var(--grid-gutter))}.col-11-md{-webkit-box-flex:0;-ms-flex:0 0 calc(91.66667% - var(--grid-gutter));flex:0 0 calc(91.66667% - var(--grid-gutter));max-width:calc(91.66667% - var(--grid-gutter))}.col-12-md{-webkit-box-flex:0;-ms-flex:0 0 calc(100% - var(--grid-gutter));flex:0 0 calc(100% - var(--grid-gutter));max-width:calc(100% - var(--grid-gutter))}}@media screen and (min-width:1200px){.col-1-lg{-webkit-box-flex:0;-ms-flex:0 0 calc(8.33333% - var(--grid-gutter));flex:0 0 calc(8.33333% - var(--grid-gutter));max-width:calc(8.33333% - var(--grid-gutter))}.col-2-lg{-webkit-box-flex:0;-ms-flex:0 0 calc(16.66667% - var(--grid-gutter));flex:0 0 calc(16.66667% - var(--grid-gutter));max-width:calc(16.66667% - var(--grid-gutter))}.col-3-lg{-webkit-box-flex:0;-ms-flex:0 0 calc(25% - var(--grid-gutter));flex:0 0 calc(25% - var(--grid-gutter));max-width:calc(25% - var(--grid-gutter))}.col-4-lg{-webkit-box-flex:0;-ms-flex:0 0 calc(33.33333% - var(--grid-gutter));flex:0 0 calc(33.33333% - var(--grid-gutter));max-width:calc(33.33333% - var(--grid-gutter))}.col-5-lg{-webkit-box-flex:0;-ms-flex:0 0 calc(41.66667% - var(--grid-gutter));flex:0 0 calc(41.66667% - var(--grid-gutter));max-width:calc(41.66667% - var(--grid-gutter))}.col-6-lg{-webkit-box-flex:0;-ms-flex:0 0 calc(50% - var(--grid-gutter));flex:0 0 calc(50% - var(--grid-gutter));max-width:calc(50% - var(--grid-gutter))}.col-7-lg{-webkit-box-flex:0;-ms-flex:0 0 calc(58.33333% - var(--grid-gutter));flex:0 0 calc(58.33333% - var(--grid-gutter));max-width:calc(58.33333% - var(--grid-gutter))}.col-8-lg{-webkit-box-flex:0;-ms-flex:0 0 calc(66.66667% - var(--grid-gutter));flex:0 0 calc(66.66667% - var(--grid-gutter));max-width:calc(66.66667% - var(--grid-gutter))}.col-9-lg{-webkit-box-flex:0;-ms-flex:0 0 calc(75% - var(--grid-gutter));flex:0 0 calc(75% - var(--grid-gutter));max-width:calc(75% - var(--grid-gutter))}.col-10-lg{-webkit-box-flex:0;-ms-flex:0 0 calc(83.33333% - var(--grid-gutter));flex:0 0 calc(83.33333% - var(--grid-gutter));max-width:calc(83.33333% - var(--grid-gutter))}.col-11-lg{-webkit-box-flex:0;-ms-flex:0 0 calc(91.66667% - var(--grid-gutter));flex:0 0 calc(91.66667% - var(--grid-gutter));max-width:calc(91.66667% - var(--grid-gutter))}.col-12-lg{-webkit-box-flex:0;-ms-flex:0 0 calc(100% - var(--grid-gutter));flex:0 0 calc(100% - var(--grid-gutter));max-width:calc(100% - var(--grid-gutter))}}fieldset{padding:.5rem 2rem}legend{text-transform:uppercase;font-size:.8em;letter-spacing:.1rem}input:not([type=checkbox]):not([type=radio]):not([type=submit]):not([type=color]):not([type=button]):not([type=reset]),select,textarea,textarea[type=text]{font-family:inherit;padding:.8rem 1rem;border-radius:4px;border:1px solid var(--color-lightGrey);font-size:1em;-webkit-transition:all .2s ease;transition:all .2s ease;display:block;width:100%}input:not([type=checkbox]):not([type=radio]):not([type=submit]):not([type=color]):not([type=button]):not([type=reset]):not(:disabled):hover,select:hover,textarea:hover,textarea[type=text]:hover{border-color:var(--color-grey)}input:not([type=checkbox]):not([type=radio]):not([type=submit]):not([type=color]):not([type=button]):not([type=reset]):focus,select:focus,textarea:focus,textarea[type=text]:focus{outline:none;border-color:var(--color-primary);-webkit-box-shadow:0 0 1px var(--color-primary);box-shadow:0 0 1px var(--color-primary)}input.error:not([type=checkbox]):not([type=radio]):not([type=submit]):not([type=color]):not([type=button]):not([type=reset]),textarea.error{border-color:var(--color-error)}input.success:not([type=checkbox]):not([type=radio]):not([type=submit]):not([type=color]):not([type=button]):not([type=reset]),textarea.success{border-color:var(--color-success)}select{-webkit-appearance:none;background:#f3f3f6 no-repeat 100%;background-size:1ex;background-origin:content-box;background-image:url("data:image/svg+xml;utf8,")}[type=checkbox],[type=radio]{width:1.6rem;height:1.6rem}.button,[type=button],[type=reset],[type=submit],button{padding:1rem 2.5rem;color:var(--color-darkGrey);background:var(--color-lightGrey);border-radius:4px;border:1px solid transparent;font-size:var(--font-size);line-height:1;text-align:center;-webkit-transition:opacity .2s ease;transition:opacity .2s ease;text-decoration:none;-webkit-transform:scale(1);transform:scale(1);display:inline-block;cursor:pointer}.grouped{display:-webkit-box;display:-ms-flexbox;display:flex}.grouped>:not(:last-child){margin-right:16px}.grouped.gapless>*{margin:0 0 0 -1px!important;border-radius:0!important}.grouped.gapless>:first-child{margin:0!important;border-radius:4px 0 0 4px!important}.grouped.gapless>:last-child{border-radius:0 4px 4px 0!important}.button+.button{margin-left:1rem}.button:hover,[type=button]:hover,[type=reset]:hover,[type=submit]:hover,button:hover{opacity:.8}.button:active,[type=button]:active,[type=reset]:active,[type=submit]:active,button:active{-webkit-transform:scale(.98);transform:scale(.98)}button:disabled,button:disabled:hover,input:disabled,input:disabled:hover{opacity:.4;cursor:not-allowed}.button.dark,.button.error,.button.primary,.button.secondary,.button.success,[type=submit]{color:#fff;z-index:1;background-color:#000;background-color:var(--color-primary)}.button.secondary{background-color:var(--color-grey)}.button.dark{background-color:var(--color-darkGrey)}.button.error{background-color:var(--color-error)}.button.success{background-color:var(--color-success)}.button.outline{background-color:transparent;border-color:var(--color-lightGrey)}.button.outline.primary{border-color:var(--color-primary);color:var(--color-primary)}.button.outline.secondary{border-color:var(--color-grey);color:var(--color-grey)}.button.outline.dark{border-color:var(--color-darkGrey);color:var(--color-darkGrey)}.button.clear{background-color:transparent;border-color:transparent;color:var(--color-primary)}.button.icon{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.button.icon>img{margin-left:2px}.button.icon-only{padding:1rem}::-webkit-input-placeholder{color:#bdbfc4}::-moz-placeholder{color:#bdbfc4}:-ms-input-placeholder{color:#bdbfc4}::-ms-input-placeholder{color:#bdbfc4}::placeholder{color:#bdbfc4}.nav{display:-webkit-box;display:-ms-flexbox;display:flex;min-height:5rem;-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch}.nav img{max-height:3rem}.nav-center,.nav-left,.nav-right,.nav>.container{display:-webkit-box;display:-ms-flexbox;display:flex}.nav-center,.nav-left,.nav-right{-webkit-box-flex:1;-ms-flex:1;flex:1}.nav-left{-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.nav-right{-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end}.nav-center{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}@media screen and (max-width:480px){.nav,.nav>.container{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.nav-center,.nav-left,.nav-right{-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}}.nav .brand,.nav a{text-decoration:none;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding:1rem 2rem;color:var(--color-darkGrey)}.nav .active:not(.button),.nav [aria-current=page]:not(.button){color:#000;color:var(--color-primary)}.nav .brand{font-size:1.75em;padding-top:0;padding-bottom:0}.nav .brand img{padding-right:1rem}.nav .button{margin:auto 1rem}.card{padding:1rem 2rem;border-radius:4px;background:var(--bg-color);-webkit-box-shadow:0 1px 3px var(--color-grey);box-shadow:0 1px 3px var(--color-grey)}.card p:last-child{margin:0}.card header>*{margin-top:0;margin-bottom:1rem}.tabs{display:-webkit-box;display:-ms-flexbox;display:flex}.tabs a{text-decoration:none}.tabs>.dropdown>summary,.tabs>a{padding:1rem 2rem;-webkit-box-flex:0;-ms-flex:0 1 auto;flex:0 1 auto;color:var(--color-darkGrey);border-bottom:2px solid var(--color-lightGrey);text-align:center}.tabs>a.active,.tabs>a:hover,.tabs>a[aria-current=page]{opacity:1;border-bottom:2px solid var(--color-darkGrey)}.tabs>a.active,.tabs>a[aria-current=page]{border-color:var(--color-primary)}.tabs.is-full a{-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto}.tag{display:inline-block;border:1px solid var(--color-lightGrey);text-transform:uppercase;color:var(--color-grey);padding:.5rem;line-height:1;letter-spacing:.5px}.tag.is-small{padding:.4rem;font-size:.75em}.tag.is-large{padding:.7rem;font-size:1.125em}.tag+.tag{margin-left:1rem}details.dropdown{position:relative;display:inline-block}details.dropdown>:last-child{position:absolute;left:0;white-space:nowrap}.bg-primary{background-color:var(--color-primary)!important}.bg-light{background-color:var(--color-lightGrey)!important}.bg-dark{background-color:var(--color-darkGrey)!important}.bg-grey{background-color:var(--color-grey)!important}.bg-error{background-color:var(--color-error)!important}.bg-success{background-color:var(--color-success)!important}.bd-primary{border:1px solid var(--color-primary)!important}.bd-light{border:1px solid var(--color-lightGrey)!important}.bd-dark{border:1px solid var(--color-darkGrey)!important}.bd-grey{border:1px solid var(--color-grey)!important}.bd-error{border:1px solid var(--color-error)!important}.bd-success{border:1px solid var(--color-success)!important}.text-primary{color:var(--color-primary)!important}.text-light{color:var(--color-lightGrey)!important}.text-dark{color:var(--color-darkGrey)!important}.text-grey{color:var(--color-grey)!important}.text-error{color:var(--color-error)!important}.text-success{color:var(--color-success)!important}.text-white{color:#fff!important}.pull-right{float:right!important}.pull-left{float:left!important}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.text-justify{text-align:justify}.text-uppercase{text-transform:uppercase}.text-lowercase{text-transform:lowercase}.text-capitalize{text-transform:capitalize}.is-full-screen{width:100%;min-height:100vh}.is-full-width{width:100%!important}.is-vertical-align{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.is-center,.is-horizontal-align{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.is-center{-webkit-box-align:center;-ms-flex-align:center;align-items:center}.is-right{-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end}.is-left,.is-right{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.is-left{-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.is-fixed{position:fixed;width:100%}.is-paddingless{padding:0!important}.is-marginless{margin:0!important}.is-pointer{cursor:pointer!important}.is-rounded{border-radius:100%}.clearfix{content:"";display:table;clear:both}.is-hidden{display:none!important}@media screen and (max-width:599px){.hide-xs{display:none!important}}@media screen and (min-width:600px) and (max-width:899px){.hide-sm{display:none!important}}@media screen and (min-width:900px) and (max-width:1199px){.hide-md{display:none!important}}@media screen and (min-width:1200px){.hide-lg{display:none!important}}@media print{.hide-pr{display:none!important}} diff --git a/website/grinminer-form/templates/index.html.tera b/website/grinminer-form/templates/index.html.tera new file mode 100644 index 0000000..dd227b8 --- /dev/null +++ b/website/grinminer-form/templates/index.html.tera @@ -0,0 +1,148 @@ +{% import "macros" as m %} + + + + + + + Rocket Form Example + + + + +
+

Form Example

+ + {% if errors | length > 0 %} +
+
+ + error: {{ errors | length }} field{{ errors | length | pluralize }} + failed to validate + +
+
+ {% endif %} + + +
+ About You +
+
+ {{ m::input(label="Name", type="text", name="account.name") }} + +
+
+ {{ m::input(label="Email Address", type="text", name="account.email") }} + +
+
+ +
+
+ {{ m::input(label="Password", type="password", name="account.password.first") }} + +
+ +
+ + {{ + m::input(label="Confirm Password", + type="password", + name="account.password.second") + }} + + +
+
+
+ +
+ Metadata + +
+
+ {{ m::input(label="Title", type="text", name="submission.title") }} + +
+
+ +
+
+ {{ m::input(label="Publish Date", type="date", name="submission.date") }} + +
+ +
+ {{ + m::select( + label="Rights Assignment", + name="submission.rights", + options=["Public", "Reserved", "Exclusive"] + ) + }} +
+
+ +
+
+ +
+ {{ m::checkbox(name="submission.category", label="Biology", value="Biology") }} +
+ {{ m::checkbox(name="submission.category", label="Chemistry", value="Chemistry") }} +
+ {{ m::checkbox(name="submission.category", label="Physics", value="Physics") }} +
+ {{ m::checkbox(name="submission.category", label="CS", value="CS") }} +
+
+ +
+ +
+ Contents + + {{ + m::textarea( + label="Abstract", + name="submission.abstract", + placeholder="Your abstract, max 250 characters...", + max=250 + ) + }} + + {{ + m::input( + label="File to Upload (PDF, max 1MiB)", + type="file", + name="submission.file" + ) + }} + + + +
+
+ {{ m::checkbox(name="submission.ready", label="Submission is ready for review.") }} +
+
+ +
+ +
+ + +
+ + diff --git a/website/grinminer-form/templates/macros.html.tera b/website/grinminer-form/templates/macros.html.tera new file mode 100644 index 0000000..ec7144e --- /dev/null +++ b/website/grinminer-form/templates/macros.html.tera @@ -0,0 +1,63 @@ +{% macro value_for(name) %} + {%- if name in values -%} + {{- values | get(key=name) | first -}} + {%- endif -%} +{% endmacro value_for %} + +{% macro errors_for(name) %} + {%- if name in errors -%} + {% set field_errors = errors | get(key=name) %} + {% for error in field_errors %} +

{{ error.msg }}

+ {% endfor %} + {%- endif -%} +{% endmacro errors_for %} + +{% macro input(type, label, name, value="") %} + + + + {{ self::errors_for(name=name) }} +{% endmacro input %} + +{% macro checkbox(name, label, value="yes") %} + +{% endmacro checkbox %} + +{% macro textarea(label, name, placeholder="", max=250) %} + + + + {{ self::errors_for(name=name) }} +{% endmacro textarea %} + +{% macro select(label, name, options) %} + + +{% endmacro select %} diff --git a/website/grinminer-form/templates/success.html.tera b/website/grinminer-form/templates/success.html.tera new file mode 100644 index 0000000..cd3addb --- /dev/null +++ b/website/grinminer-form/templates/success.html.tera @@ -0,0 +1,30 @@ + + + + + + Rocket Form Example + + + + +
+

Success!

+ +

Submission Data

+ +
    + {% for key, value in values %} +
  • {{ key }} - {{ value }}
  • + {% endfor %} +
+ + < Submit Another + + diff --git a/website/images/gpp.png b/website/images/gpp.png new file mode 100644 index 0000000..003c8f4 Binary files /dev/null and b/website/images/gpp.png differ diff --git a/website/images/grim.png b/website/images/grim.png new file mode 100644 index 0000000..0aa4c62 Binary files /dev/null and b/website/images/grim.png differ diff --git a/website/images/grin-logo-cat-cropped-black.png b/website/images/grin-logo-cat-cropped-black.png new file mode 100644 index 0000000..31561bd Binary files /dev/null and b/website/images/grin-logo-cat-cropped-black.png differ diff --git a/website/images/grin-logo-cat.svg b/website/images/grin-logo-cat.svg new file mode 100644 index 0000000..2a4b04d --- /dev/null +++ b/website/images/grin-logo-cat.svg @@ -0,0 +1,1605 @@ + + + + + + + + + diff --git a/website/images/grinminerbanner.png b/website/images/grinminerbanner.png new file mode 100644 index 0000000..0b96e98 Binary files /dev/null and b/website/images/grinminerbanner.png differ diff --git a/website/images/ipollo.png b/website/images/ipollo.png new file mode 100644 index 0000000..d585471 Binary files /dev/null and b/website/images/ipollo.png differ diff --git a/website/images/network.png b/website/images/network.png new file mode 100644 index 0000000..70557ef Binary files /dev/null and b/website/images/network.png differ diff --git a/website/images/network.svg b/website/images/network.svg new file mode 100644 index 0000000..1f799a2 --- /dev/null +++ b/website/images/network.svg @@ -0,0 +1,4 @@ + + + +
Ipollo G1 Mini
2Gbps
Broadband



LTE Backup

Lenovo M3210.x.x.xLenovo M3210.x.x.xLenovo X3650 M5 12LFF10.x.x.x.xLenovo M3210.x.x.xMikrotik CRS309-1G-8S10.x.x.x
Zone00 Edge
Zone05 Mining
Zone01 Core
Zone02 HA-nodes
Juniper EX2200-C-12P10.x.x.xLenovo M3210.x.x.x
Zone03 Free-nodes
Juniper SRX32010.x.x.x10.x.x.xQNAP QSW-2104-2S
WAN
Lenovo M3210.x.x.xLenovo M3210.x.x.x            Juniper EX2300-48MP            10.x.x.x.x10.x.x.x10.x.x.x10.x.x.x10.x.x.x10.x.x.xgrinminer.netnetwork bytransatoshi
Legend

Green = 10Gbps
Orange = 1Gbps
Red = <1Gbps
1 line = single
2 lines = LACP (2-4)

Lenovo M920q10.x.x.xLenovo M920x10.x.x.xLenovo M920x10.x.x.x
\ No newline at end of file diff --git a/website/images/web-banner.png b/website/images/web-banner.png new file mode 100755 index 0000000..5e0a80c Binary files /dev/null and b/website/images/web-banner.png differ diff --git a/website/main.css b/website/main.css new file mode 100644 index 0000000..a1b8f6a --- /dev/null +++ b/website/main.css @@ -0,0 +1,224 @@ +body { + margin: 0; + font-family: "Lato", sans-serif; + background-color: black; + color: #fef102; + } + + p { + font-family: monospace; + font-weight: 400; + font-size: 14px; + color: whitesmoke; + text-wrap: balance; + } + + input[type="text"] { + width: 430px; + } + + /* Add a black background color to the top navigation */ + .topnav { + background-color: #333; + overflow: hidden; + } + + /* Style the links inside the navigation bar */ + .topnav a { + float: left; + display: block; + color: whitesmoke; + text-align: center; + padding: 14px 16px; + text-decoration: none; + font-size: 17px; + } + + /* Change the color of links on hover */ + .topnav a:hover { + background-color: #fef102; + color: black; + } + + /* Add an active class to highlight the current page */ + .topnav a.active { + background-color: #fef102; + color: black; + border-right: black 2px solid; + } + + /* Add an active class to highlight the current page */ + .topnav a.grey { + border-right: black 2px solid; + } + + .responsive { + max-width: 90%; + height: auto; + margin: 0 auto; + border: #fef102 solid 4px; + border-radius: 30px; + box-shadow:0 0 10px #fef102; + text-align: center; + display: block; + } + + .diagram { + width: 100%; + margin-top: 20px; + } + + .fourohfour { + font-size: 80px; + } + + .ad { + width: 100%; + } + + .subtitle { + font-family: monospace; + font-size: 16px + font-weight: 800; + border: #fef102 solid 4px; + border-radius: 0 0 15px 15px; + box-shadow: 0 0 10px #fef102; + width: 70%; + height: auto; + margin: -5px auto 30px auto; + display: block; + text-align:center; + padding: 0 40px 0 40px; + } + + div.content { + text-align: center; + padding: 1px 16px; + display: block; + } + + .cloud { + text-align: center; + width: 100%; + height: auto; + color: black; + display: block; + background-color: #fef102; + } + + .nodes { + text-align: center; + } + + .site.pad.community-pad{ + padding-top:40px; + padding-bottom:40px; + border-top:1px solid black; + } + + .community { + background-color:black; + padding:-10px 16px 64px 16px; + max-width:700px; + margin:0 auto; + } + + .community a { + border-bottom:1px solid black + } + + .community h2 { + text-align:center + } + + .community-subheading { + line-height:1.4em; + text-align:center + } + + .community-content { + margin-top:40px; + background-color:black; + } + + .community-row { + padding:20px; + margin: 5px 0 5px 0; + display:flex; + flex-direction: column; + border: solid 1px silver; + } + + .community-row-img { + height:80px; + width:80px; + margin-right:16px; + border-radius:15px + } + + .community-row-content { + margin-top:4px + } + + .community-row-heading { + font-size:18px; + font-weight:bold; + margin-bottom:4px + } + + .community-row-desc { + line-height:1.4em; + margin-bottom:8px + } + + .community-row-category { + color:#6F6F6F; + font-size:12px + } + + .footer { + text-align: center; + margin: 0 auto; + } + + .topnav { + overflow: hidden; + background-color: #333; + } + + .topnav a { + float: left; + display: block; + color: whitesmoke; + text-align: center; + padding: 14px 16px; + text-decoration: none; + } + + .topnav a:hover { + background-color: #fef102; + color: black; + } + + .topnav .icon { + display: none; + } + + /* Responsive styles */ + @media screen and (max-width: 600px) { + .topnav a { + display: none; /* Hide all links by default */ + } + .topnav a.icon { + float: right; + display: block; /* Show the hamburger icon */ + color: #fef102; + } + .topnav.responsive { + position: relative; + } + .topnav.responsive a { + display: block; /* Show links when the menu is responsive */ + float: none; /* Remove float */ + } + } \ No newline at end of file diff --git a/website/thanks.html b/website/thanks.html new file mode 100644 index 0000000..3255d84 --- /dev/null +++ b/website/thanks.html @@ -0,0 +1,87 @@ + + + + + + + Grinminer.net + + + + + + + + + + + + + + + + + + + + + + + +

Developed over 2 years to be an alternative to the corporate cloud.

+ + + grinminer-banner + + +
+
+

Provider of hosted public & private nodes + solo mining pools + a Trezor/Ledger compatible wallet.

+
+ +
+

Thank you! Expect a response within 48hr.

+
+ + + + + + \ No newline at end of file