@@ -458,10 +458,9 @@ class ParallaxEditorApp {
458458 this . refs . appShell = rootDocument . querySelector ( ".app-shell" ) ;
459459 this . refs . leftSidebar = rootDocument . getElementById ( "leftSidebar" ) ;
460460 this . refs . rightSidebar = rootDocument . getElementById ( "rightSidebar" ) ;
461- this . refs . showLeftPanelButton = rootDocument . getElementById ( "showLeftPanelButton" ) ;
462- this . refs . showRightPanelButton = rootDocument . getElementById ( "showRightPanelButton" ) ;
463- this . refs . closeLeftOverlayButton = rootDocument . getElementById ( "closeLeftOverlayButton" ) ;
464- this . refs . closeRightOverlayButton = rootDocument . getElementById ( "closeRightOverlayButton" ) ;
461+ this . refs . leftPanelAccordions = Array . from ( rootDocument . querySelectorAll ( "#leftSidebar .panel-accordion" ) ) ;
462+ this . refs . rightPanelAccordions = Array . from ( rootDocument . querySelectorAll ( "#rightSidebar .panel-accordion" ) ) ;
463+ this . refs . overlayToggleButtons = Array . from ( rootDocument . querySelectorAll ( "[data-overlay-toggle]" ) ) ;
465464 this . refs . previewWrap = rootDocument . querySelector ( ".preview-wrap" ) ;
466465 this . refs . previewCanvas = rootDocument . getElementById ( "previewCanvas" ) ;
467466 this . refs . previewContext = this . refs . previewCanvas . getContext ( "2d" , { alpha : false } ) ;
@@ -487,21 +486,18 @@ class ParallaxEditorApp {
487486 this . refs . inspectRemediationButton . addEventListener ( "click" , ( ) => this . inspectRemediationActions ( ) ) ;
488487 this . refs . jumpToProblemButton . addEventListener ( "click" , ( ) => this . jumpToRemediationProblem ( ) ) ;
489488 this . refs . applyRemediationButton . addEventListener ( "click" , ( ) => this . applyRemediationAction ( ) ) ;
490- this . refs . showLeftPanelButton ?. addEventListener ( "click" , ( ) => {
491- this . refs . leftSidebar ?. classList . toggle ( "visible-overlay" ) ;
492- this . syncOverlayToggleButtons ( ) ;
489+ this . refs . overlayToggleButtons . forEach ( ( button ) => {
490+ button . addEventListener ( "click" , ( ) => {
491+ const side = button . dataset . overlaySide === "left" ? "left" : "right" ;
492+ const targetId = button . dataset . overlayTarget || "" ;
493+ this . toggleOverlayPanel ( side , targetId ) ;
494+ } ) ;
493495 } ) ;
494- this . refs . showRightPanelButton ?. addEventListener ( "click" , ( ) => {
495- this . refs . rightSidebar ?. classList . toggle ( "visible-overlay" ) ;
496- this . syncOverlayToggleButtons ( ) ;
496+ this . refs . leftPanelAccordions . forEach ( ( panel ) => {
497+ panel . addEventListener ( "toggle" , ( ) => this . handleOverlayAccordionToggle ( "left" , panel ) ) ;
497498 } ) ;
498- this . refs . closeLeftOverlayButton ?. addEventListener ( "click" , ( ) => {
499- this . refs . leftSidebar ?. classList . remove ( "visible-overlay" ) ;
500- this . syncOverlayToggleButtons ( ) ;
501- } ) ;
502- this . refs . closeRightOverlayButton ?. addEventListener ( "click" , ( ) => {
503- this . refs . rightSidebar ?. classList . remove ( "visible-overlay" ) ;
504- this . syncOverlayToggleButtons ( ) ;
499+ this . refs . rightPanelAccordions . forEach ( ( panel ) => {
500+ panel . addEventListener ( "toggle" , ( ) => this . handleOverlayAccordionToggle ( "right" , panel ) ) ;
505501 } ) ;
506502 document . addEventListener ( "fullscreenchange" , ( ) => {
507503 this . syncFullscreenState ( ) ;
@@ -551,14 +547,88 @@ class ParallaxEditorApp {
551547 }
552548
553549 syncOverlayToggleButtons ( ) {
554- const leftVisible = this . refs . leftSidebar ?. classList . contains ( "visible-overlay" ) === true ;
555- const rightVisible = this . refs . rightSidebar ?. classList . contains ( "visible-overlay" ) === true ;
556- if ( this . refs . showLeftPanelButton instanceof HTMLElement ) {
557- this . refs . showLeftPanelButton . style . display = leftVisible ? "none" : "" ;
550+ const fullscreenActive = Boolean ( document . fullscreenElement ) ;
551+ this . refs . overlayToggleButtons . forEach ( ( button ) => {
552+ const side = button . dataset . overlaySide === "left" ? "left" : "right" ;
553+ const targetId = button . dataset . overlayTarget || "" ;
554+ const sidebar = this . getOverlaySidebar ( side ) ;
555+ const target = targetId ? document . getElementById ( targetId ) : null ;
556+ const active = Boolean (
557+ fullscreenActive
558+ && sidebar instanceof HTMLElement
559+ && sidebar . classList . contains ( "visible-overlay" )
560+ && target instanceof HTMLElement
561+ && target . open
562+ ) ;
563+ button . setAttribute ( "aria-expanded" , active ? "true" : "false" ) ;
564+ const symbol = button . querySelector ( ".overlay-toggle-symbol" ) ;
565+ if ( symbol ) {
566+ symbol . textContent = active ? "-" : "+" ;
567+ }
568+ const hideWhileOverlayOpen = Boolean (
569+ fullscreenActive
570+ && sidebar instanceof HTMLElement
571+ && sidebar . classList . contains ( "visible-overlay" )
572+ ) ;
573+ button . classList . toggle ( "is-hidden-while-overlay-open" , hideWhileOverlayOpen ) ;
574+ } ) ;
575+ }
576+
577+ getOverlaySidebar ( side ) {
578+ return side === "left" ? this . refs . leftSidebar : this . refs . rightSidebar ;
579+ }
580+
581+ getOverlayPanels ( side ) {
582+ return side === "left" ? this . refs . leftPanelAccordions : this . refs . rightPanelAccordions ;
583+ }
584+
585+ toggleOverlayPanel ( side , targetId ) {
586+ const sidebar = this . getOverlaySidebar ( side ) ;
587+ const panels = this . getOverlayPanels ( side ) ;
588+ if ( ! ( sidebar instanceof HTMLElement ) || ! Array . isArray ( panels ) || panels . length === 0 ) {
589+ return ;
590+ }
591+ const target = panels . find ( ( panel ) => panel . id === targetId ) ;
592+ if ( ! ( target instanceof HTMLElement ) ) {
593+ return ;
594+ }
595+
596+ const fullscreenActive = Boolean ( document . fullscreenElement ) ;
597+ if ( ! fullscreenActive ) {
598+ target . open = ! target . open ;
599+ this . syncOverlayToggleButtons ( ) ;
600+ return ;
601+ }
602+
603+ const overlayVisible = sidebar . classList . contains ( "visible-overlay" ) ;
604+ if ( ! overlayVisible ) {
605+ sidebar . classList . add ( "visible-overlay" ) ;
606+ target . open = true ;
607+ } else {
608+ target . open = ! target . open ;
609+ }
610+ if ( ! panels . some ( ( panel ) => panel . open ) ) {
611+ sidebar . classList . remove ( "visible-overlay" ) ;
558612 }
559- if ( this . refs . showRightPanelButton instanceof HTMLElement ) {
560- this . refs . showRightPanelButton . style . display = rightVisible ? "none" : "" ;
613+
614+ this . syncOverlayToggleButtons ( ) ;
615+ }
616+
617+ handleOverlayAccordionToggle ( side , panel ) {
618+ if ( ! document . fullscreenElement ) {
619+ return ;
561620 }
621+ const sidebar = this . getOverlaySidebar ( side ) ;
622+ const panels = this . getOverlayPanels ( side ) ;
623+ if ( ! ( sidebar instanceof HTMLElement ) || ! Array . isArray ( panels ) ) {
624+ return ;
625+ }
626+ if ( panel . open ) {
627+ sidebar . classList . add ( "visible-overlay" ) ;
628+ } else if ( ! panels . some ( ( entry ) => entry . open ) ) {
629+ sidebar . classList . remove ( "visible-overlay" ) ;
630+ }
631+ this . syncOverlayToggleButtons ( ) ;
562632 }
563633
564634 getSelectedLayer ( ) {
0 commit comments