substantially improved styling

This commit is contained in:
2024-09-28 17:34:59 -06:00
parent a7135fb96d
commit faf3cd3df7
2 changed files with 87 additions and 34 deletions
+81 -29
View File
@@ -4,7 +4,7 @@ use std::collections::{BTreeMap, BTreeSet, HashMap};
use dioxus::prelude::*; use dioxus::prelude::*;
use ordermap::OrderSet; use ordermap::OrderSet;
use sir::css; use sir::{css, global_css};
pub type ChannelId = u32; pub type ChannelId = u32;
pub type UserId = u32; pub type UserId = u32;
@@ -82,13 +82,13 @@ pub fn UserPill(name: String) -> Element {
" "
border: solid 1px black; border: solid 1px black;
border-radius: 8px; border-radius: 8px;
margin: 4px;
padding: 4px; padding: 4px;
width: fit-content;
" "
); );
rsx!( rsx!(
span { div {
class: "{pill}", class: "{pill}",
"{name}" "{name}"
} }
@@ -120,8 +120,10 @@ pub fn Channel(id: ChannelId) -> Element {
display: flex; display: flex;
flex-direction: row; flex-direction: row;
flex-wrap: wrap; flex-wrap: wrap;
gap: 8px;
margin-left: 5px; margin-left: 5px;
padding-left: 11px; " padding-left: 11px;
"
); );
rsx!( rsx!(
@@ -147,34 +149,75 @@ pub fn ChatView() -> Element {
let net: Coroutine<Command> = use_coroutine_handle(); let net: Coroutine<Command> = use_coroutine_handle();
let server = STATE.server.read(); let server = STATE.server.read();
let mut draft = use_signal(|| "".to_string()); let mut draft = use_signal(|| "".to_string());
let chat_history_box = css!(
"
margin: 16px;
border: solid black 1px;
"
);
let chat_message = css!(
"
display: flex;
flex-direction: row;
margin: 16px;
gap: 8px;
align-items: center;
"
);
let chat_box = css!(
"
display: flex;
flex-direction: row;
margin: 16px;
gap: 8px;
input {
flex-grow: 1;
padding: 8px;
}
"
);
let mut do_send = move || {
if let Some(user) = STATE.server.read().this_user() {
net.send(SendChat {
markdown: draft.write().split_off(0),
channels: vec![user.channel],
});
}
};
rsx!( rsx!(
div { div {
style: "margin: 16px; padding: 16px; border: solid black 1px;", class: "{chat_history_box}",
for chat in server.chat.iter() { for chat in server.chat.iter() {
if let Some(sender) = chat.sender.and_then(|u| server.users.get(&u)) { div {
UserPill { name: sender.name.clone() } class: "{chat_message}",
"\u{8194}" if let Some(sender) = chat.sender.and_then(|u| server.users.get(&u)) {
} UserPill { name: sender.name.clone() }
span {
dangerous_inner_html: "{chat.dangerous_html}",
}
hr {}
}
input {
placeholder: "say something",
value: "{draft.read()}",
oninput: move |evt| draft.set(evt.value().clone()),
}
button {
onclick: move |_| {
if let Some(user) = STATE.server.read().this_user() {
net.send(SendChat {
markdown: draft.write().split_off(0),
channels: vec![user.channel],
});
} }
}, span {
"Send" dangerous_inner_html: "{chat.dangerous_html}",
}
}
}
div {
class: "{chat_box}",
input {
placeholder: "say something",
value: "{draft.read()}",
oninput: move |evt| draft.set(evt.value().clone()),
onkeypress: move |evt: Event<KeyboardData>| {
if evt.code() == Code::Enter && evt.modifiers().is_empty() {
do_send();
}
}
}
button {
onclick: move |_| do_send(),
"Send"
}
} }
} }
) )
@@ -183,9 +226,18 @@ pub fn ChatView() -> Element {
#[component] #[component]
pub fn ServerView() -> Element { pub fn ServerView() -> Element {
let server = STATE.server.read(); let server = STATE.server.read();
let channel_box = css!(
"
padding: 16px;
margin: 16px;
border: solid black 1px;
"
);
rsx!( rsx!(
div { div {
style: "margin: 16px; padding: 16px; border: solid black 1px;", class: "framed_box {channel_box}",
for (id, state) in server.channels.iter() { for (id, state) in server.channels.iter() {
if state.parent.is_none() { if state.parent.is_none() {
Channel { id: *id } Channel { id: *id }
+6 -5
View File
@@ -550,10 +550,11 @@ fn accept_command(
match command { match command {
Command::SendChat { markdown, channels } => { Command::SendChat { markdown, channels } => {
use markdown::*; use markdown::*;
let html_text = match tokenize(&markdown).as_slice() { let blocks = tokenize(&markdown);
block @ [Block::Paragraph(par)] => match par.as_slice() { let html_text = match blocks.as_slice() {
[Span::Text(par)] => par.to_string(), [Block::Paragraph(par)] => match par.as_slice() {
_ => generate_markdown(block.to_vec()) [Span::Text(text)] => text.to_string(),
_ => to_html(&markdown)
.trim() .trim()
.strip_prefix("<p>") .strip_prefix("<p>")
.unwrap() .unwrap()
@@ -561,7 +562,7 @@ fn accept_command(
.unwrap() .unwrap()
.to_string(), .to_string(),
}, },
block => generate_markdown(block.to_vec()).trim().to_string(), _ => to_html(&markdown).trim().to_string(),
}; };
{ {