230 lines
9.7 KiB
Rust
230 lines
9.7 KiB
Rust
use crate::prelude::*;
|
|
|
|
pub struct Welcome;
|
|
|
|
impl PackageTrait for Welcome {
|
|
fn name(&self) -> L10n {
|
|
L10n::l("welcome_package_name")
|
|
}
|
|
|
|
fn description(&self) -> L10n {
|
|
L10n::l("welcome_package_description")
|
|
}
|
|
|
|
fn configure_service(&self, scfg: &mut service::web::ServiceConfig) {
|
|
scfg.route("/", service::web::get().to(home_page))
|
|
.route("/{lang}", service::web::get().to(home_lang));
|
|
}
|
|
}
|
|
|
|
async fn home_page(request: HttpRequest) -> ResultPage<Markup, ErrorPage> {
|
|
home(request, &LANGID_DEFAULT)
|
|
}
|
|
|
|
async fn home_lang(
|
|
request: HttpRequest,
|
|
path: service::web::Path<String>,
|
|
) -> ResultPage<Markup, ErrorPage> {
|
|
match langid_for(path.into_inner()) {
|
|
Ok(lang) => home(request, lang),
|
|
_ => Err(ErrorPage::NotFound(request)),
|
|
}
|
|
}
|
|
|
|
fn home(request: HttpRequest, lang: &'static LanguageIdentifier) -> ResultPage<Markup, ErrorPage> {
|
|
Page::new(request)
|
|
.with_title(L10n::l("welcome_title"))
|
|
.with_assets(AssetsOp::LangId(lang))
|
|
.with_assets(AssetsOp::AddStyleSheet(StyleSheet::at(
|
|
"/base/css/welcome.css",
|
|
)))
|
|
.with_body_id("welcome")
|
|
.with_component(hello_world())
|
|
.with_component(welcome())
|
|
.with_component(about_pagetop())
|
|
.with_component(promo_pagetop())
|
|
.with_component(reporting_issues())
|
|
.render()
|
|
}
|
|
|
|
fn hello_world() -> Container {
|
|
Container::header()
|
|
.with_classes(ClassesOp::Add, "hello-world")
|
|
.with_justify(FlexJustify::Center)
|
|
.add_item(
|
|
Flex::new().with_size(FlexSize::Percent90).add_component(
|
|
Container::new()
|
|
.with_direction(FlexDirection::Column(BreakPoint::MD))
|
|
.add_item(
|
|
Flex::new()
|
|
.with_classes(ClassesOp::Add, "hello-col-text")
|
|
.with_size(FlexSize::Percent40)
|
|
.add_component(
|
|
Heading::h1(L10n::l("welcome_title"))
|
|
.with_size(HeadingSize::Medium),
|
|
)
|
|
.add_component(
|
|
Paragraph::fluent(L10n::l("welcome_intro").with_arg(
|
|
"app",
|
|
format!(
|
|
"<span class=\"app-name\">{}</span>",
|
|
&config::SETTINGS.app.name,
|
|
),
|
|
))
|
|
.with_font_size(FontSize::Medium),
|
|
)
|
|
.add_component(Paragraph::fluent(L10n::l("welcome_powered").with_arg(
|
|
"pagetop",
|
|
format!(
|
|
"<a href=\"{}\" target=\"_blank\">{}</a>",
|
|
"https://pagetop.cillero.es", "PageTop",
|
|
),
|
|
)))
|
|
.add_component(
|
|
Button::anchor(
|
|
"https://github.com/manuelcillero/pagetop",
|
|
L10n::l("welcome_code"),
|
|
)
|
|
.with_target(ButtonTarget::Blank)
|
|
.with_left_icon(Some(Icon::with("git")))
|
|
.with_classes(ClassesOp::Add, "code-link")
|
|
.with_font_size(FontSize::Medium),
|
|
)
|
|
.add_component(
|
|
Button::anchor("#welcome-page", L10n::l("welcome"))
|
|
.with_style(StyleBase::Link)
|
|
.with_left_icon(Some(Icon::with("arrow-down-circle-fill")))
|
|
.with_classes(ClassesOp::Add, "welcome-link")
|
|
.with_font_size(FontSize::Medium),
|
|
),
|
|
)
|
|
.add_item(
|
|
Flex::with(Image::with("/base/images/header.svg"))
|
|
.with_classes(ClassesOp::Add, "hello-col-image")
|
|
.with_size(FlexSize::Percent60),
|
|
),
|
|
),
|
|
)
|
|
}
|
|
|
|
fn welcome() -> Container {
|
|
Container::section()
|
|
.with_id("welcome-page")
|
|
.with_classes(ClassesOp::Add, "welcome")
|
|
.with_justify(FlexJustify::Center)
|
|
.add_item(
|
|
Flex::new()
|
|
.with_size(FlexSize::Percent80)
|
|
.add_component(Heading::h2(L10n::l("welcome_page")))
|
|
.add_component(
|
|
Heading::h3(L10n::l("welcome_subtitle").with_arg(
|
|
"app",
|
|
format!(
|
|
"<span class=\"app-name\">{}</span>",
|
|
&config::SETTINGS.app.name
|
|
),
|
|
))
|
|
.with_size(HeadingSize::Subtitle),
|
|
)
|
|
.add_component(
|
|
Paragraph::fluent(L10n::l("welcome_text1")).with_font_size(FontSize::Medium),
|
|
)
|
|
.add_component(Paragraph::fluent(L10n::l("welcome_text2"))),
|
|
)
|
|
}
|
|
|
|
fn about_pagetop() -> Container {
|
|
Container::new()
|
|
.with_classes(ClassesOp::Add, "pagetop")
|
|
.with_justify(FlexJustify::Center)
|
|
.add_item(
|
|
Flex::new().with_size(FlexSize::Percent90).add_component(
|
|
Container::new()
|
|
.with_direction(FlexDirection::Column(BreakPoint::SM))
|
|
.add_item(
|
|
Flex::with(Image::with("/base/images/about.svg"))
|
|
.with_classes(ClassesOp::Add, "pagetop-col-image")
|
|
.with_size(FlexSize::Percent40),
|
|
)
|
|
.add_item(
|
|
Flex::new()
|
|
.with_classes(ClassesOp::Add, "pagetop-col-text")
|
|
.add_component(Heading::h2(L10n::l("welcome_pagetop_title")))
|
|
.add_component(
|
|
Paragraph::fluent(L10n::l("welcome_pagetop_text1"))
|
|
.with_font_size(FontSize::Medium),
|
|
)
|
|
.add_component(Paragraph::fluent(L10n::l("welcome_pagetop_text2")))
|
|
.add_component(Paragraph::fluent(L10n::l("welcome_pagetop_text3"))),
|
|
),
|
|
),
|
|
)
|
|
}
|
|
|
|
fn promo_pagetop() -> Container {
|
|
Container::new()
|
|
.with_classes(ClassesOp::Add, "promo")
|
|
.with_justify(FlexJustify::Center)
|
|
.add_item(
|
|
Flex::new().with_size(FlexSize::Percent75).add_component(
|
|
Container::new()
|
|
.with_direction(FlexDirection::Column(BreakPoint::MD))
|
|
.add_item(
|
|
Flex::new()
|
|
.with_classes(ClassesOp::Add, "promo-col-text")
|
|
.with_size(FlexSize::Percent50)
|
|
.add_component(Heading::h2(L10n::l("welcome_promo_title")))
|
|
.add_component(
|
|
Paragraph::fluent(L10n::l("welcome_promo_text1").with_arg(
|
|
"pagetop",
|
|
format!(
|
|
"<a href=\"{}\" target=\"_blank\">{}</a>",
|
|
"https://crates.io/crates/pagetop", "PageTop",
|
|
),
|
|
))
|
|
.with_font_size(FontSize::Medium),
|
|
),
|
|
)
|
|
.add_item(
|
|
Flex::with(Image::with("/base/images/pagetop.png"))
|
|
.with_classes(ClassesOp::Add, "promo-col-image")
|
|
.with_size(FlexSize::Percent50),
|
|
),
|
|
),
|
|
)
|
|
}
|
|
|
|
fn reporting_issues() -> Container {
|
|
Container::new()
|
|
.with_classes(ClassesOp::Add, "issues")
|
|
.with_justify(FlexJustify::Center)
|
|
.add_item(
|
|
Flex::new().with_size(FlexSize::Percent90).add_component(
|
|
Container::new()
|
|
.with_direction(FlexDirection::Column(BreakPoint::MD))
|
|
.add_item(
|
|
Flex::with(Image::with("/base/images/issues.jpg"))
|
|
.with_classes(ClassesOp::Add, "issues-col-image"),
|
|
)
|
|
.add_item(
|
|
Flex::new()
|
|
.with_classes(ClassesOp::Add, "issues-col-text")
|
|
.with_size(FlexSize::Percent50)
|
|
.add_component(Heading::h2(L10n::l("welcome_issues_title")))
|
|
.add_component(
|
|
Paragraph::fluent(L10n::l("welcome_issues_text1"))
|
|
.with_font_size(FontSize::Medium),
|
|
)
|
|
.add_component(Paragraph::fluent(
|
|
L10n::l("welcome_issues_text2").with_arg(
|
|
"app",
|
|
format!(
|
|
"<span class=\"app-name\">{}</span>",
|
|
&config::SETTINGS.app.name,
|
|
),
|
|
),
|
|
)),
|
|
),
|
|
),
|
|
)
|
|
}
|