@@ -521,6 +521,101 @@ describe('<Combobox.Value />', () => {
521521 } ) ;
522522 } ) ;
523523
524+ describe ( 'multiple selection' , ( ) => {
525+ it ( 'displays comma-separated labels from items array' , async ( ) => {
526+ const items = [
527+ { value : 'sans' , label : 'Sans-serif' } ,
528+ { value : 'serif' , label : 'Serif' } ,
529+ { value : 'mono' , label : 'Monospace' } ,
530+ ] ;
531+
532+ await render (
533+ < Combobox . Root defaultValue = { [ items [ 0 ] , items [ 1 ] ] } items = { items } multiple >
534+ < Combobox . Trigger >
535+ < span data-testid = "value" >
536+ < Combobox . Value />
537+ </ span >
538+ </ Combobox . Trigger >
539+ < Combobox . Portal >
540+ < Combobox . Positioner >
541+ < Combobox . Popup >
542+ < Combobox . Input />
543+ < Combobox . List >
544+ { ( item : any ) => (
545+ < Combobox . Item key = { item . value } value = { item } >
546+ { item . label }
547+ </ Combobox . Item >
548+ ) }
549+ </ Combobox . List >
550+ </ Combobox . Popup >
551+ </ Combobox . Positioner >
552+ </ Combobox . Portal >
553+ </ Combobox . Root > ,
554+ ) ;
555+
556+ expect ( screen . getByTestId ( 'value' ) ) . to . have . text ( 'Sans-serif, Serif' ) ;
557+ } ) ;
558+
559+ it ( 'supports ReactNode labels for multiple selections' , async ( ) => {
560+ const items = [
561+ { value : 'bold' , label : < strong > Bold Text</ strong > } ,
562+ { value : 'italic' , label : < em > Italic Text</ em > } ,
563+ ] ;
564+
565+ await render (
566+ < Combobox . Root defaultValue = { items } items = { items } multiple >
567+ < Combobox . Trigger >
568+ < span data-testid = "value" >
569+ < Combobox . Value />
570+ </ span >
571+ </ Combobox . Trigger >
572+ < Combobox . Portal >
573+ < Combobox . Positioner >
574+ < Combobox . Popup >
575+ < Combobox . List >
576+ { ( item : any ) => (
577+ < Combobox . Item key = { item . value } value = { item } >
578+ { item . label }
579+ </ Combobox . Item >
580+ ) }
581+ </ Combobox . List >
582+ </ Combobox . Popup >
583+ </ Combobox . Positioner >
584+ </ Combobox . Portal >
585+ </ Combobox . Root > ,
586+ ) ;
587+
588+ const value = screen . getByTestId ( 'value' ) ;
589+ expect ( value . querySelector ( 'strong' ) ) . to . have . text ( 'Bold Text' ) ;
590+ expect ( value . querySelector ( 'em' ) ) . to . have . text ( 'Italic Text' ) ;
591+ expect ( value ) . to . have . text ( 'Bold Text, Italic Text' ) ;
592+ } ) ;
593+
594+ it ( 'falls back to raw values when items are not provided' , async ( ) => {
595+ await render (
596+ < Combobox . Root defaultValue = { [ 'serif' , 'mono' ] } multiple >
597+ < Combobox . Trigger >
598+ < span data-testid = "value" >
599+ < Combobox . Value />
600+ </ span >
601+ </ Combobox . Trigger >
602+ < Combobox . Portal >
603+ < Combobox . Positioner >
604+ < Combobox . Popup >
605+ < Combobox . List >
606+ < Combobox . Item value = "serif" > Serif</ Combobox . Item >
607+ < Combobox . Item value = "mono" > Monospace</ Combobox . Item >
608+ </ Combobox . List >
609+ </ Combobox . Popup >
610+ </ Combobox . Positioner >
611+ </ Combobox . Portal >
612+ </ Combobox . Root > ,
613+ ) ;
614+
615+ expect ( screen . getByTestId ( 'value' ) ) . to . have . text ( 'serif, mono' ) ;
616+ } ) ;
617+ } ) ;
618+
524619 describe ( 'primitive values' , ( ) => {
525620 it ( 'handles string values correctly' , async ( ) => {
526621 await render (
0 commit comments