Skip to content

Commit 5908a4d

Browse files
committed
Move mermaid inspector below on narrow panes
1 parent 71defc1 commit 5908a4d

2 files changed

Lines changed: 53 additions & 0 deletions

File tree

src/workbench/diagram_render/diagram-render.css

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,10 @@
136136
flex: 1 1 0;
137137
}
138138

139+
.mermaid-workspace--narrow {
140+
flex-direction: column;
141+
}
142+
139143
.mermaid-inspector {
140144
flex: 0 0 var(--mermaid-inspector-width, min(34vw, 420px));
141145
min-width: 280px;
@@ -175,6 +179,10 @@
175179
opacity: 0.64;
176180
}
177181

182+
.mermaid-workspace--narrow .mermaid-inspector__resizer {
183+
display: none;
184+
}
185+
178186
.mermaid-inspector__resize-shield {
179187
position: absolute;
180188
inset: 0;
@@ -280,6 +288,12 @@
280288
color: var(--accent);
281289
}
282290

291+
.mermaid-workspace--narrow .mermaid-inspector {
292+
flex: 0 0 min(42vh, 360px);
293+
width: 100%;
294+
min-width: 0;
295+
}
296+
283297
@media (max-width: 860px) {
284298
.mermaid-workspace {
285299
flex-direction: column;

src/workbench/diagram_render/mod.rs

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ const INSPECTOR_DEFAULT_WIDTH_PX: f64 = 420.0;
3737
const INSPECTOR_MIN_WIDTH_PX: f64 = 280.0;
3838
const INSPECTOR_MAX_WIDTH_PX: f64 = 760.0;
3939
const VIEWPORT_MIN_WIDTH_PX: f64 = 360.0;
40+
const INSPECTOR_BOTTOM_BREAKPOINT_PX: f64 = 900.0;
4041

4142
type SourceEditorClosures = (
4243
Closure<dyn Fn(String)>,
@@ -58,6 +59,21 @@ fn next_render_id() -> String {
5859
})
5960
}
6061

62+
fn update_inspector_narrow_layout(
63+
workspace_ref: NodeRef<html::Div>,
64+
inspector_narrow: RwSignal<bool>,
65+
resizing_inspector: RwSignal<bool>,
66+
) {
67+
let Some(el) = workspace_ref.get_untracked() else {
68+
return;
69+
};
70+
let narrow = el.get_bounding_client_rect().width() < INSPECTOR_BOTTOM_BREAKPOINT_PX;
71+
inspector_narrow.set(narrow);
72+
if narrow && resizing_inspector.get_untracked() {
73+
resizing_inspector.set(false);
74+
}
75+
}
76+
6177
thread_local! {
6278
/// Caches successfully rendered diagram markup keyed by `(theme, code)`.
6379
///
@@ -140,8 +156,10 @@ pub fn MermaidPreviewWithInspector(
140156
let pending_debounce = StoredValue::new_local(None::<Timeout>);
141157
let workspace_ref = NodeRef::<html::Div>::new();
142158
let inspector_width = RwSignal::new(INSPECTOR_DEFAULT_WIDTH_PX);
159+
let inspector_narrow = RwSignal::new(false);
143160
let resizing_inspector = RwSignal::new(false);
144161
let resize_start = RwSignal::new((0.0_f64, INSPECTOR_DEFAULT_WIDTH_PX));
162+
let pending_layout_measure = StoredValue::new_local(None::<Timeout>);
145163

146164
Effect::new(move |_| {
147165
let next = source.get();
@@ -153,6 +171,9 @@ pub fn MermaidPreviewWithInspector(
153171
});
154172

155173
let on_resize_down = move |ev: PointerEvent| {
174+
if inspector_narrow.get_untracked() {
175+
return;
176+
}
156177
ev.prevent_default();
157178
ev.stop_propagation();
158179
resizing_inspector.set(true);
@@ -192,19 +213,37 @@ pub fn MermaidPreviewWithInspector(
192213
}
193214
});
194215

216+
Effect::new(move |_| {
217+
let _ = inspector_open.get();
218+
pending_layout_measure.update_value(|slot| {
219+
*slot = Some(Timeout::new(0, move || {
220+
update_inspector_narrow_layout(workspace_ref, inspector_narrow, resizing_inspector);
221+
}));
222+
});
223+
});
224+
225+
let window_resize_listener = window_event_listener_untyped("resize", move |_| {
226+
update_inspector_narrow_layout(workspace_ref, inspector_narrow, resizing_inspector);
227+
});
228+
195229
on_cleanup(move || {
196230
pending_debounce.update_value(|slot| {
197231
*slot = None;
198232
});
233+
pending_layout_measure.update_value(|slot| {
234+
*slot = None;
235+
});
199236
move_listener.remove();
200237
up_listener.remove();
238+
window_resize_listener.remove();
201239
});
202240

203241
view! {
204242
<div
205243
node_ref=workspace_ref
206244
class="mermaid-workspace"
207245
class:mermaid-workspace--inspector=move || inspector_open.get()
246+
class:mermaid-workspace--narrow=move || inspector_narrow.get()
208247
class:mermaid-workspace--resizing=move || resizing_inspector.get()
209248
style=move || format!("--mermaid-inspector-width: {:.0}px;", inspector_width.get())
210249
>

0 commit comments

Comments
 (0)