Toggle group
.toggle-group shares radii like a button group.
Multiple-press is independent aria-pressed.
One-at-a-time is a single $state value. data-orientation="vertical" stacks the items.
There is no wrapper.
Several at once
One at a time
<script>
let marks = $state({ bold: true, italic: false, underline: false });
let align = $state('start');
function flip(key) {
marks = { ...marks, [key]: !marks[key] };
}
</script>
<div class="toggle-group">
<button class="toggle toggle-outline" type="button" aria-pressed={marks.bold} aria-label="Bold" onclick={() => flip('bold')}>B</button>
<button class="toggle toggle-outline" type="button" aria-pressed={marks.italic} aria-label="Italic" onclick={() => flip('italic')}>I</button>
<button class="toggle toggle-outline" type="button" aria-pressed={marks.underline} aria-label="Underline" onclick={() => flip('underline')}>U</button>
</div>
<div class="toggle-group" role="group" aria-label="Align">
<button class="toggle toggle-outline" type="button" aria-pressed={align === 'start'} onclick={() => align = 'start'}>Start</button>
<button class="toggle toggle-outline" type="button" aria-pressed={align === 'middle'} onclick={() => align = 'middle'}>Middle</button>
<button class="toggle toggle-outline" type="button" aria-pressed={align === 'end'} onclick={() => align = 'end'}>End</button>
</div>