@@ -192,8 +192,17 @@ async function copyText(value, button) {
192192 flashCopied ( button ) ;
193193}
194194
195- function setSplitFromClientX ( clientX ) {
195+ function setSplitFromPointer ( clientX , clientY ) {
196196 const rect = els . split . getBoundingClientRect ( ) ;
197+ const isVertical = window . matchMedia ( "(max-width: 900px)" ) . matches ;
198+
199+ if ( isVertical ) {
200+ const raw = ( ( clientY - rect . top ) / rect . height ) * 100 ;
201+ const clamped = Math . max ( 20 , Math . min ( 80 , raw ) ) ;
202+ document . documentElement . style . setProperty ( "--top-height" , `${ clamped } %` ) ;
203+ return ;
204+ }
205+
197206 const raw = ( ( clientX - rect . left ) / rect . width ) * 100 ;
198207 const clamped = Math . max ( 20 , Math . min ( 80 , raw ) ) ;
199208 document . documentElement . style . setProperty ( "--left-width" , `${ clamped } %` ) ;
@@ -302,33 +311,82 @@ function initEvents() {
302311
303312 els . input . addEventListener ( "scroll" , syncYamlScroll , { passive : true } ) ;
304313
305- els . divider . addEventListener ( "pointerdown" , ( event ) => {
306- if ( window . matchMedia ( "(max-width: 900px)" ) . matches ) {
307- return ;
308- }
314+ const startDrag = ( clientX , clientY ) => {
309315 dragging = true ;
310- els . divider . setPointerCapture ( event . pointerId ) ;
311- setSplitFromClientX ( event . clientX ) ;
312- } ) ;
316+ document . body . style . userSelect = "none" ;
317+ document . body . classList . add ( "is-resizing" ) ;
318+ setSplitFromPointer ( clientX , clientY ) ;
319+ } ;
313320
314- els . divider . addEventListener ( "pointermove" , ( event ) => {
321+ const moveDrag = ( clientX , clientY ) => {
315322 if ( ! dragging ) {
316323 return ;
317324 }
318- setSplitFromClientX ( event . clientX ) ;
319- } ) ;
325+ setSplitFromPointer ( clientX , clientY ) ;
326+ } ;
320327
321- els . divider . addEventListener ( "pointerup" , ( event ) => {
328+ const stopDrag = ( ) => {
322329 if ( ! dragging ) {
323330 return ;
324331 }
325332 dragging = false ;
326- els . divider . releasePointerCapture ( event . pointerId ) ;
333+ document . body . style . userSelect = "" ;
334+ document . body . classList . remove ( "is-resizing" ) ;
335+ } ;
336+
337+ els . divider . addEventListener ( "pointerdown" , ( event ) => {
338+ event . preventDefault ( ) ;
339+ startDrag ( event . clientX , event . clientY ) ;
327340 } ) ;
328341
329- els . divider . addEventListener ( "pointercancel " , ( ) => {
330- dragging = false ;
342+ window . addEventListener ( "pointermove " , ( event ) => {
343+ moveDrag ( event . clientX , event . clientY ) ;
331344 } ) ;
345+ window . addEventListener ( "pointerup" , stopDrag ) ;
346+ window . addEventListener ( "pointercancel" , stopDrag ) ;
347+
348+ els . divider . addEventListener ( "mousedown" , ( event ) => {
349+ if ( event . button !== 0 ) {
350+ return ;
351+ }
352+ event . preventDefault ( ) ;
353+ startDrag ( event . clientX , event . clientY ) ;
354+ } ) ;
355+
356+ window . addEventListener ( "mousemove" , ( event ) => {
357+ moveDrag ( event . clientX , event . clientY ) ;
358+ } ) ;
359+ window . addEventListener ( "mouseup" , stopDrag ) ;
360+
361+ els . divider . addEventListener (
362+ "touchstart" ,
363+ ( event ) => {
364+ const touch = event . touches [ 0 ] ;
365+ if ( ! touch ) {
366+ return ;
367+ }
368+ event . preventDefault ( ) ;
369+ startDrag ( touch . clientX , touch . clientY ) ;
370+ } ,
371+ { passive : false } ,
372+ ) ;
373+
374+ window . addEventListener (
375+ "touchmove" ,
376+ ( event ) => {
377+ const touch = event . touches [ 0 ] ;
378+ if ( ! touch ) {
379+ return ;
380+ }
381+ if ( dragging ) {
382+ event . preventDefault ( ) ;
383+ }
384+ moveDrag ( touch . clientX , touch . clientY ) ;
385+ } ,
386+ { passive : false } ,
387+ ) ;
388+ window . addEventListener ( "touchend" , stopDrag ) ;
389+ window . addEventListener ( "touchcancel" , stopDrag ) ;
332390
333391 els . copyYamlBtn ?. addEventListener ( "click" , ( ) => {
334392 void copyText ( els . input . value , els . copyYamlBtn ) ;
0 commit comments