React
LoadingonOpenChangeLoading React…
Open one. Five follow. Each tile runs Combobox in its own framework and reports the change in its own syntax.
Combobox docs: demo, examples and APIonOpenChangeLoading React…
@open-changeLoading Vue…
onOpenChangeLoading Svelte…
(openChange)Loading Angular…
onOpenChangeLoading Solid…
No changes yet. Use any tile.
The attributes on each framework's Popup element, read from the page while it is open. Open a tile to fill its column.
Each tile sets modal to false, so five popups can be open at once without each one shutting out the others.
The showcase example for Combobox, as written in each framework. Lines that only React has are marked.
import { Combobox } from '@▢▢▢▢/react/combobox'
const fruits = ['Apple', 'Banana', 'Cherry', 'Grape', 'Lemon', 'Mango', 'Orange', 'Peach', 'Pear']
export default function ComboboxExample() {
return (
<Combobox.Root items={fruits}>
<label className="field">
<span className="select-label">Choose a fruit</span>
<Combobox.InputGroup className="combobox">
<Combobox.Input className="combobox-input" placeholder="e.g. Apple" />
<Combobox.Clear
className="combobox-button"
aria-label="Clear selection"
>
×
</Combobox.Clear>
<Combobox.Trigger
className="combobox-button"
aria-label="Open popup"
>
<Combobox.Icon className="select-icon" />
</Combobox.Trigger>
</Combobox.InputGroup>
</label>
<Combobox.Portal>
<Combobox.Positioner className="select-positioner" sideOffset={6}>
<Combobox.Popup className="select-popup combobox-popup">
<Combobox.Empty className="combobox-empty">
No fruits found.
</Combobox.Empty>
<Combobox.List className="select-list">
<Combobox.Collection>
{(fruit: string) => (
<Combobox.Item
key={fruit}
value={fruit}
className="select-item"
>
<Combobox.ItemIndicator
className="select-item-indicator"
>
✓
</Combobox.ItemIndicator>
<span className="select-item-text">{fruit}</span>
</Combobox.Item>
)}
</Combobox.Collection>
</Combobox.List>
</Combobox.Popup>
</Combobox.Positioner>
</Combobox.Portal>
</Combobox.Root>
)
}
<script setup lang="ts">
import { Combobox } from '@▢▢▢▢/vue/combobox'
const fruits = ['Apple', 'Banana', 'Cherry', 'Grape', 'Lemon', 'Mango', 'Orange', 'Peach', 'Pear']
</script>
<template>
<Combobox.Root :items="fruits">
<label class="field">
<span class="select-label">Choose a fruit</span>
<Combobox.InputGroup class="combobox">
<Combobox.Input class="combobox-input" placeholder="e.g. Apple" />
<Combobox.Clear class="combobox-button" aria-label="Clear selection"
>×</Combobox.Clear
>
<Combobox.Trigger class="combobox-button" aria-label="Open popup">
<Combobox.Icon class="select-icon" />
</Combobox.Trigger>
</Combobox.InputGroup>
</label>
<Combobox.Portal>
<Combobox.Positioner class="select-positioner" :side-offset="6">
<Combobox.Popup class="select-popup combobox-popup">
<Combobox.Empty class="combobox-empty"
>No fruits found.</Combobox.Empty
>
<Combobox.List class="select-list">
<Combobox.Collection v-slot="fruit">
<Combobox.Item :key="fruit" :value="fruit" class="select-item">
<Combobox.ItemIndicator class="select-item-indicator"
>✓</Combobox.ItemIndicator
>
<span class="select-item-text">{{ fruit }}</span>
</Combobox.Item>
</Combobox.Collection>
</Combobox.List>
</Combobox.Popup>
</Combobox.Positioner>
</Combobox.Portal>
</Combobox.Root>
</template>
Combobox in each framework, side by side. Lower is better for size, time and memory. No outside baseline: the frameworks are compared with each other only.
The Combobox.Root props as each framework writes them. A name that differs from React is marked.
onCheckedChange(checked, details), onOpenChange(open, details), onValueChange(value, details).:default-checked, :side-offset). Upstream's callbacks are Vue events with the same arguments: checkedChange(checked, details), openChange(open, details), valueChange(value, details).onCheckedChange(checked, details), onOpenChange(open, details), onValueChange(value, details), with details.cancel(), reason and event. Native event props use Svelte's names (onclick, onkeydown).checked, disabled, nativeButton); boolean inputs also work as bare attributes. Each callback with details is an output named without on: checkedChange, openChange, valueChange.onCheckedChange(checked, details), with details.cancel() and details.event. Native handlers are camelCase (onClick, onKeyDown), as Solid 2 requires.namepropnamenamename[name]namedefaultValuepropdefaultValuedefault-valuedefaultValue[defaultValue]defaultValuevaluepropvaluevaluevalue[value]valueonValueChangeeventonValueChange@value-changeonValueChange(valueChange)onValueChangedefaultInputValuepropdefaultInputValuedefault-input-valuedefaultInputValue[defaultInputValue]defaultInputValueinputValuepropinputValueinput-valueinputValue[inputValue]inputValueonInputValueChangeeventonInputValueChange@input-value-changeonInputValueChange(inputValueChange)onInputValueChangedefaultOpenpropdefaultOpendefault-opendefaultOpen[defaultOpen]defaultOpenopenpropopenopenopen[open]openonOpenChangeeventonOpenChange@open-changeonOpenChange(openChange)onOpenChangeautoHighlightpropautoHighlightauto-highlightautoHighlight[autoHighlight]autoHighlighthighlightItemOnHoverprophighlightItemOnHoverhighlight-item-on-hoverhighlightItemOnHover[highlightItemOnHover]highlightItemOnHoveractionsRefpropactionsRefactions-refactionsRef[actionsRef]actionsRefautoCompletepropautoCompleteauto-completeautoComplete[autoComplete]autoCompletefilterpropfilterfilterfilter[filter]filterfilteredItemspropfilteredItemsfiltered-itemsfilteredItems[filteredItems]filteredItemsformpropformformform[form]formgridpropgridgridgrid[grid]gridinlinepropinlineinlineinline[inline]inlineisItemEqualToValuepropisItemEqualToValueis-item-equal-to-valueisItemEqualToValue[isItemEqualToValue]isItemEqualToValueitemToStringLabelpropitemToStringLabelitem-to-string-labelitemToStringLabel[itemToStringLabel]itemToStringLabelitemToStringValuepropitemToStringValueitem-to-string-valueitemToStringValue[itemToStringValue]itemToStringValueitemspropitemsitemsitems[items]itemslimitproplimitlimitlimit[limit]limitlocaleproplocalelocalelocale[locale]localeloopFocusproploopFocusloop-focusloopFocus[loopFocus]loopFocusmodalpropmodalmodalmodal[modal]modalmultiplepropmultiplemultiplemultiple[multiple]multipleonItemHighlightedeventonItemHighlighted@item-highlightedonItemHighlighted(itemHighlighted)onItemHighlightedonOpenChangeCompleteeventonOpenChangeComplete@open-change-completeonOpenChangeComplete(openChangeComplete)onOpenChangeCompleteopenOnInputClickpropopenOnInputClickopen-on-input-clickopenOnInputClick[openOnInputClick]openOnInputClickvirtualizedpropvirtualizedvirtualizedvirtualized[virtualized]virtualizeddisabledpropdisableddisableddisabled[disabled]disabledreadOnlypropreadOnlyread-onlyreadOnly[readOnly]readOnlyrequiredproprequiredrequiredrequired[required]requiredinputRefpropinputRefinput-refinputRef[inputRef]inputRefidpropididid[id]idchildrenpropchildren#defaultchildrenng-contentchildren