style(predlozhnik): make the page look a bit more inviting

with some sprinkling of CSS and some different button classes, this
doesn't look half bad!

Change-Id: I49a3af4a77ce58713c735b2401b807062a3efb21
Reviewed-on: https://cl.tvl.fyi/c/depot/+/5989
Tested-by: BuildkiteCI
Reviewed-by: tazjin <tazjin@tvl.su>
This commit is contained in:
Vincent Ambo 2022-07-28 16:38:35 +03:00 committed by tazjin
parent ebbda2484a
commit ca608d3e9c
4 changed files with 73 additions and 37 deletions

View file

@ -1,2 +1,3 @@
/target/
**/*.rs.bk
dist/

View file

@ -0,0 +1,29 @@
body {
max-width: 800px;
margin: 40px auto;
}
#header {
display: flex;
flex-direction: column;
}
.btn.btn-ghost:disabled {
border-color: #9f9f9f;
color: #9f9f9f;
}
#predlogi,#padezhi {
display: flex;
flex-direction: row;
flex-wrap: wrap;
}
.btn {
margin: 3px;
flex-grow: 1;
}
.footer {
text-align: right;
}

View file

@ -2,6 +2,10 @@
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet"
href="https://unpkg.com/terminal.css@0.7.2/dist/terminal.min.css" />
<link data-trunk rel="inline" href="index.css">
<title>Предложник</title>
</head>
</html>

View file

@ -5,7 +5,6 @@ use lazy_static::lazy_static;
use maplit::hashmap;
use std::collections::BTreeSet;
use std::collections::HashMap;
use std::fmt::Write;
#[derive(Clone, Copy, Debug, Hash, PartialEq, Eq, PartialOrd, Ord)]
enum Падеж {
@ -110,19 +109,6 @@ lazy_static! {
};
}
fn example_output() -> String {
let mut out = String::new();
for (пд, пги) in &*ПОАДЕЖУ {
write!(out, "Падеж: {:?}\n", пд).ok();
for п in пги {
write!(out, "\t{}\n", п).ok();
}
}
out
}
enum Сообщение {
ВыбралПадеж(Option<Падеж>),
ВыбралПредлог(Option<&'static str>),
@ -140,9 +126,13 @@ struct Вывод {
объяснение: Option<Html>,
}
fn объяснить(падеж: Падеж, предлог: &str) -> Html {
fn объясни(падеж: Падеж, предлог: &str) -> Html {
html! {
<div id="obyasnenie">
<hr/>
<h2>{"Пример:"}</h2>
{format!("{} {}", предлог, падеж.вопрос())}
</div>
}
}
@ -151,7 +141,7 @@ fn ограничить(м: &Модель) -> Вывод {
(Some(пж), Some(пл)) => Вывод {
доступные_падежи: BTreeSet::from([пж]),
доступные_предлоги: BTreeSet::from([*пл]),
объяснение: Some(объяснить(пж, пл)),
объяснение: Some(объясни(пж, пл)),
},
(Some(пж), None) => Вывод {
@ -174,6 +164,16 @@ fn ограничить(м: &Модель) -> Вывод {
}
}
fn класс_кнопки(выбран: bool, доступен: bool) -> String {
let класс = "btn ".to_string();
класс
+ match (выбран, доступен) {
(true, _) => "btn-primary",
(false, true) => "btn-ghost btn-primary",
(false, false) => "btn-ghost btn-default",
}
}
fn покажи_предлог(
link: &Scope<Модель>,
м: &Модель,
@ -182,13 +182,7 @@ fn покажи_предлог(
) -> Html {
let выбран = м.предлог == Some(п);
let доступен = вв.доступные_предлоги.contains(п);
let mut класс = "btn btn-ghost ".to_string();
класс += match (выбран, доступен) {
(true, _) => "btn-error",
(false, true) => "btn-primary",
(false, false) => "btn-default",
};
let класс = класс_кнопки(выбран, доступен);
html! {
<button class={класс}
@ -208,13 +202,7 @@ fn покажи_падеж(
) -> Html {
let выбран = м.падеж == Some(п);
let доступен = вв.доступные_падежи.contains(&п);
let mut класс = "btn btn-ghost ".to_string();
класс += match (выбран, доступен) {
(true, _) => "btn-error",
(false, true) => "btn-primary",
(false, false) => "btn-default",
};
let класс = класс_кнопки(выбран, доступен);
html! {
<button class={класс}
@ -262,26 +250,40 @@ impl Component for Модель {
let объяснение = вв
.объяснение
.map(|s| html! {{s}})
.map(|exp| exp)
.unwrap_or_else(|| html! {});
let footer = html! {
<footer>
<hr/>
<p class="footer">
<a href="https://code.tvl.fyi/tree/users/tazjin/predlozhnik">{"код"}</a>
{" | "}
{"сделано "}<a href="https://tvl.su">{"ООО \"ТВЛ\""}</a>
</p>
</footer>
};
html! {
<>
<link rel="stylesheet"
href="https://unpkg.com/terminal.css@0.7.2/dist/terminal.min.css" />
<div id="header">
<h1>{"Прелдожник"}</h1>
<p>{"... показывает которые предлоги употребляются в каких падежах на русском языке."}</p>
</div>
<h2>{"Выбирай предлог:"}</h2>
<div id="predlogi">
<h2>{"Предлоги:"}</h2>
{кнапки_предлогов}
</div>
<hr/>
<h2>{"Выбирай падеж:"}</h2>
<div id="padezhi">
<h2>{"Падежи:"}</h2>
{кнапки_падежов}
</div>
<hr/>
{объяснение}
{footer}
</>
}
}