@@ -37,6 +37,7 @@ const INSPECTOR_DEFAULT_WIDTH_PX: f64 = 420.0;
3737const INSPECTOR_MIN_WIDTH_PX : f64 = 280.0 ;
3838const INSPECTOR_MAX_WIDTH_PX : f64 = 760.0 ;
3939const VIEWPORT_MIN_WIDTH_PX : f64 = 360.0 ;
40+ const INSPECTOR_BOTTOM_BREAKPOINT_PX : f64 = 900.0 ;
4041
4142type 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+
6177thread_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