substantially improved styling
This commit is contained in:
+76
-24
@@ -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,45 +149,95 @@ 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());
|
||||||
rsx!(
|
|
||||||
div {
|
let chat_history_box = css!(
|
||||||
style: "margin: 16px; padding: 16px; border: solid black 1px;",
|
"
|
||||||
for chat in server.chat.iter() {
|
margin: 16px;
|
||||||
if let Some(sender) = chat.sender.and_then(|u| server.users.get(&u)) {
|
border: solid black 1px;
|
||||||
UserPill { name: sender.name.clone() }
|
"
|
||||||
"\u{8194}"
|
);
|
||||||
}
|
let chat_message = css!(
|
||||||
span {
|
"
|
||||||
dangerous_inner_html: "{chat.dangerous_html}",
|
display: flex;
|
||||||
}
|
flex-direction: row;
|
||||||
hr {}
|
margin: 16px;
|
||||||
}
|
gap: 8px;
|
||||||
|
align-items: center;
|
||||||
|
"
|
||||||
|
);
|
||||||
|
let chat_box = css!(
|
||||||
|
"
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
margin: 16px;
|
||||||
|
gap: 8px;
|
||||||
|
|
||||||
input {
|
input {
|
||||||
placeholder: "say something",
|
flex-grow: 1;
|
||||||
value: "{draft.read()}",
|
padding: 8px;
|
||||||
oninput: move |evt| draft.set(evt.value().clone()),
|
|
||||||
}
|
}
|
||||||
button {
|
"
|
||||||
onclick: move |_| {
|
);
|
||||||
|
|
||||||
|
let mut do_send = move || {
|
||||||
if let Some(user) = STATE.server.read().this_user() {
|
if let Some(user) = STATE.server.read().this_user() {
|
||||||
net.send(SendChat {
|
net.send(SendChat {
|
||||||
markdown: draft.write().split_off(0),
|
markdown: draft.write().split_off(0),
|
||||||
channels: vec![user.channel],
|
channels: vec![user.channel],
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
},
|
};
|
||||||
|
|
||||||
|
rsx!(
|
||||||
|
div {
|
||||||
|
class: "{chat_history_box}",
|
||||||
|
for chat in server.chat.iter() {
|
||||||
|
div {
|
||||||
|
class: "{chat_message}",
|
||||||
|
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}",
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
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"
|
"Send"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
#[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
@@ -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(),
|
||||||
};
|
};
|
||||||
|
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user