Skip to content

Commit 552434c

Browse files
authored
Better split view (#7)
* Update web-sys and dependant packages to new minor version * Add split-yew dependency * Dependencies separation * Added Split.js module * Added resizable split view * Forgot to remove border class * Updated split-yew dependency
1 parent 9f42c3d commit 552434c

File tree

6 files changed

+66
-15
lines changed

6 files changed

+66
-15
lines changed

Cargo.lock

+24
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

frontend/Cargo.toml

+2
Original file line numberDiff line numberDiff line change
@@ -25,3 +25,5 @@ thiserror = { workspace = true }
2525
tracing = { workspace = true, default-features = false }
2626
time = { version = "0.3", features = ["wasm-bindgen"] }
2727
tracing-subscriber = { workspace = true, features = ["time"] }
28+
29+
split-yew = "0.1.1"

frontend/index.html

+7
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,13 @@
99
<link data-trunk href="static" rel="copy-dir">
1010
<link rel="icon" href="/static/favicon.ico" sizes="any">
1111
<link rel="icon" href="/static/favicon.svg" type="image/svg+xml">
12+
<script type="importmap">
13+
{
14+
"imports": {
15+
"split.js": "https://unpkg.com/[email protected]/dist/split.es.js"
16+
}
17+
}
18+
</script>
1219
</head>
1320
<body class="text-gray-200 h-screen"></body>
1421
</html>

frontend/src/app.rs

+19-11
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ use crate::components::output::OutputContainer;
33
use crate::utils::query::Query;
44
use crate::{icon, ActionButtonState, ActionButtonStateContext};
55
use gloo::history::{BrowserHistory, History};
6+
use split_yew::{Direction, Split};
67
use std::rc::Rc;
78
use yew::prelude::*;
89
use yew::suspense::Suspense;
@@ -14,12 +15,21 @@ pub fn App() -> Html {
1415

1516
let action_button_state = use_context::<ActionButtonStateContext>().unwrap();
1617

18+
let split_sizes = use_state(|| vec![100.0, 0.0]);
19+
let output_collapsed = use_state(|| true);
20+
1721
let on_run_click = {
1822
let action_button_state = action_button_state.clone();
1923
let editor_contents = editor_contents.clone();
24+
let split_sizes = split_sizes.clone();
25+
let output_collapsed = output_collapsed.clone();
2026
let data = data.clone();
2127
move |_| {
2228
data.set(Some(Rc::from(editor_contents.as_ref().borrow().as_str())));
29+
if *output_collapsed {
30+
output_collapsed.set(false);
31+
split_sizes.set(vec![50.0, 50.0]);
32+
}
2333
action_button_state.dispatch(ActionButtonState::Disabled);
2434
}
2535
};
@@ -69,11 +79,7 @@ pub fn App() -> Html {
6979
classes.push("hover:bg-gray-900")
7080
}
7181

72-
let template_rows = if data.is_some() {
73-
"grid-template-rows: 1fr 1fr"
74-
} else {
75-
"grid-template-rows: 1fr "
76-
};
82+
let collapsed_split = if *output_collapsed { Some(1) } else { None };
7783

7884
html! {
7985
<div class="flex flex-col h-screen">
@@ -84,16 +90,18 @@ pub fn App() -> Html {
8490
<button onclick={on_share_click} disabled={action_button_state.disabled()} class={classes}>{icon!("share", classes!("fill-gray-200"))} {"Share"}</button>
8591
</div>
8692
</header>
87-
<div class="grid h-full" style={template_rows}>
88-
<Suspense fallback={{html! {"loading..."}}}>
89-
<Editor {oninput} />
90-
</Suspense>
91-
<div class="w-full h-full min-h-0">
93+
<Split min_sizes={vec![100.0, 0.0]} sizes={(*split_sizes).clone()} collapsed={collapsed_split} direction={Direction::Vertical} class="flex flex-col flex-grow overflow-hidden">
94+
<div>
95+
<Suspense fallback={{html! {"loading..."}}}>
96+
<Editor {oninput} />
97+
</Suspense>
98+
</div>
99+
<div class="w-full min-h-0">
92100
if let Some(ref data) = *data {
93101
<OutputContainer value={data} />
94102
}
95103
</div>
96-
</div>
104+
</Split>
97105
</div>
98106
}
99107
}

frontend/src/components/output.rs

+1-4
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
use crate::{ActionButtonState, ActionButtonStateContext};
21
use crate::api::BACKEND_URL;
2+
use crate::{ActionButtonState, ActionButtonStateContext};
33
use gloo_net::http::QueryParams;
44
use std::rc::Rc;
55
use yew::prelude::*;
@@ -39,9 +39,6 @@ pub fn OutputContainer(props: &OutputContainerProps) -> Html {
3939
let classes = classes!(
4040
"w-full",
4141
"h-full",
42-
"border-t-[10px]",
43-
"border-gray-400",
44-
"border-solid",
4542
if *loading { "invisible" } else { "visible" }
4643
);
4744
html! {

frontend/styles/globals.scss

+13
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,19 @@
99
box-sizing: border-box;
1010
}
1111

12+
/* For Split.js */
13+
.gutter {
14+
background-color: #9ca3af;
15+
}
16+
17+
.gutter.gutter-vertical {
18+
cursor: row-resize;
19+
}
20+
21+
.gutter.gutter-horizontal {
22+
cursor: col-resize;
23+
}
24+
1225
/*
1326
body {
1427
height: 100vh;

0 commit comments

Comments
 (0)