@@ -591,3 +591,162 @@ InputsWithMenu.parameters = {
591591 // Disables Chromatic's snapshotting on a global level
592592 chromatic : { disableSnapshot : true } ,
593593} ;
594+
595+ export const menuWithMultipleSelection = ( ) : TemplateResult => {
596+ import ( '@spectrum-web-components/picker-button/sp-picker-button.js' ) ;
597+ import ( '@spectrum-web-components/overlay/sp-overlay.js' ) ;
598+ import ( '@spectrum-web-components/popover/sp-popover.js' ) ;
599+
600+ function handleKeydown ( event : KeyboardEvent ) : void {
601+ const logEl = document . querySelector ( '.debug-log' ) ;
602+ if ( logEl ) {
603+ const time = new Date ( ) . toLocaleTimeString ( ) ;
604+ const info = `[${ time } ] Key: "${ event . key } ", Target: ${ ( event . target as HTMLElement ) . tagName } , defaultPrevented: ${ event . defaultPrevented } ` ;
605+ logEl . textContent = info + '\n' + logEl . textContent ;
606+ }
607+ }
608+
609+ setTimeout ( ( ) => {
610+ const menu = document . querySelector (
611+ 'sp-menu[selects="multiple"]'
612+ ) as Menu ;
613+ const overlay = document . querySelector ( 'sp-overlay' ) ;
614+ if ( menu && overlay ) {
615+ menu . addEventListener ( 'keydown' , handleKeydown , { capture : true } ) ;
616+ console . log ( 'Debug: Menu found, attaching keydown listener' ) ;
617+ console . log ( 'Debug: Menu selects=' , menu . getAttribute ( 'selects' ) ) ;
618+ console . log ( 'Debug: Menu childItems=' , menu . childItems ) ;
619+
620+ // Log focus changes
621+ menu . addEventListener ( 'focusin' , ( ) => {
622+ console . log (
623+ '🎯 FOCUSIN on menu, activeElement:' ,
624+ document . activeElement
625+ ) ;
626+ } ) ;
627+
628+ // Also listen on document for all keydown events
629+ document . addEventListener (
630+ 'keydown' ,
631+ ( event : KeyboardEvent ) => {
632+ if ( event . key === ' ' || event . key === 'Enter' ) {
633+ console . log (
634+ '⌨️ Space/Enter pressed, activeElement:' ,
635+ document . activeElement ?. tagName
636+ ) ;
637+ }
638+ if ( event . key === 'Escape' ) {
639+ console . log (
640+ '🚪 Escape pressed, overlay open:' ,
641+ overlay . open ,
642+ 'activeElement:' ,
643+ document . activeElement ?. tagName
644+ ) ;
645+ }
646+ } ,
647+ { capture : true }
648+ ) ;
649+
650+ // Listen for overlay events
651+ overlay . addEventListener ( 'sp-opened' , ( ) => {
652+ console . log ( '✅ Overlay opened' ) ;
653+ } ) ;
654+ overlay . addEventListener ( 'sp-closed' , ( ) => {
655+ console . log ( '❌ Overlay closed' ) ;
656+ } ) ;
657+ }
658+ } , 1000 ) ;
659+
660+ return html `
661+ < style >
662+ .multi-select-demo {
663+ display : flex;
664+ flex-direction : column;
665+ gap : 16px ;
666+ padding : 20px ;
667+ }
668+ .status {
669+ padding : 12px ;
670+ background : var (--spectrum-gray-100 );
671+ border-radius : 4px ;
672+ font-family : monospace;
673+ font-size : 12px ;
674+ }
675+ .instructions {
676+ padding : 12px ;
677+ background : var (--spectrum-blue-100 );
678+ border-radius : 4px ;
679+ font-size : 14px ;
680+ }
681+ .debug-log {
682+ padding : 12px ;
683+ background : var (--spectrum-yellow-100 );
684+ border-radius : 4px ;
685+ font-family : monospace;
686+ font-size : 11px ;
687+ max-height : 150px ;
688+ overflow-y : auto;
689+ white-space : pre-wrap;
690+ }
691+ </ style >
692+ < div class ="multi-select-demo ">
693+ < div class ="instructions ">
694+ < strong > Instructions:</ strong >
695+ < br />
696+ 1. Click the picker button below to open the menu
697+ < br />
698+ 2. Use
699+ < kbd > Arrow Up/Down</ kbd >
700+ to navigate
701+ < br />
702+ 3. Press
703+ < kbd > Space</ kbd >
704+ or
705+ < kbd > Enter</ kbd >
706+ to toggle selection
707+ < br />
708+ 4. Press
709+ < kbd > Escape</ kbd >
710+ to close
711+ < br />
712+ 5. Watch the debug log below for keyboard events
713+ </ div >
714+
715+ < sp-picker-button id ="multi-select-button ">
716+ < span slot ="label "> Select multiple options</ span >
717+ </ sp-picker-button >
718+
719+ < sp-overlay
720+ trigger ="multi-select-button@click "
721+ placement ="bottom-start "
722+ >
723+ < sp-popover >
724+ < sp-menu
725+ selects ="multiple "
726+ label ="Select options "
727+ @change =${ ( event : Event ) => {
728+ console . log (
729+ 'Selected:' ,
730+ ( event . target as Menu ) . selected
731+ ) ;
732+ } }
733+ >
734+ < sp-menu-item value ="option1 "> Option 1</ sp-menu-item >
735+ < sp-menu-item value ="option2 "> Option 2</ sp-menu-item >
736+ < sp-menu-item value ="option3 "> Option 3</ sp-menu-item >
737+ </ sp-menu >
738+ </ sp-popover >
739+ </ sp-overlay >
740+
741+ < div class ="debug-log "> Debug log will appear here...</ div >
742+ </ div >
743+ ` ;
744+ } ;
745+
746+ menuWithMultipleSelection . parameters = {
747+ chromatic : { disableSnapshot : true } ,
748+ } ;
749+
750+ menuWithMultipleSelection . story = {
751+ name : 'Picker Button with Multiple Selection' ,
752+ } ;
0 commit comments