All examples

Toggle and ToggleGroup

Styled pressable toggles and segmented groups (single and multiple) with variants, sizes, RTL and dark. Fictional labels only.

Toggle and ToggleGroup

texuli-toggle · texuli/Toggle

texuli toggle
Props
  • orientation
  • pressed
  • size
  • type
  • value
  • variant

Live example loads in an isolated same-origin preview frame.

Source (toggle/ToggleDemo.svelte)
<script lang="ts">
import { Toggle, ToggleGroup, ToggleGroupItem } from 'texuli/toggle';

let bold = $state(false);
let align = $state('left');
let format = $state<string[]>(['bold']);
</script>

<div class="demo" data-example="texuli-toggle">
  <section>
    <h2>Default toggle</h2>
    <Toggle bind:pressed={bold}>Bold</Toggle>
  </section>

  <section>
    <h2>Variants and sizes</h2>
    <div class="row">
      <Toggle variant="default" size="sm">Sm</Toggle>
      <Toggle variant="default" size="md" defaultPressed>Md</Toggle>
      <Toggle variant="default" size="lg">Lg</Toggle>
      <Toggle variant="outline">Outline</Toggle>
      <Toggle variant="outline" disabled>Off</Toggle>
    </div>
  </section>

  <section>
    <h2>Single group (segmented)</h2>
    <ToggleGroup type="single" bind:value={align} variant="outline" aria-label="Text align">
      <ToggleGroupItem value="left">Left</ToggleGroupItem>
      <ToggleGroupItem value="center">Center</ToggleGroupItem>
      <ToggleGroupItem value="right">Right</ToggleGroupItem>
    </ToggleGroup>
    <p class="hint">Selected: {align || 'none'}</p>
  </section>

  <section>
    <h2>Multiple group</h2>
    <ToggleGroup type="multiple" bind:value={format} aria-label="Text style">
      <ToggleGroupItem value="bold">Bold</ToggleGroupItem>
      <ToggleGroupItem value="italic">Italic</ToggleGroupItem>
      <ToggleGroupItem value="underline">Underline</ToggleGroupItem>
    </ToggleGroup>
  </section>

  <section>
    <h2>Vertical outline</h2>
    <ToggleGroup
      type="single"
      orientation="vertical"
      variant="outline"
      defaultValue="day"
      aria-label="View"
    >
      <ToggleGroupItem value="day">Day</ToggleGroupItem>
      <ToggleGroupItem value="week">Week</ToggleGroupItem>
      <ToggleGroupItem value="month">Month</ToggleGroupItem>
    </ToggleGroup>
  </section>

  <section dir="rtl" lang="ar">
    <h2>RTL</h2>
    <ToggleGroup type="single" variant="outline" defaultValue="a" aria-label="اتجاه">
      <ToggleGroupItem value="a">أ</ToggleGroupItem>
      <ToggleGroupItem value="b">ب</ToggleGroupItem>
      <ToggleGroupItem value="c">ج</ToggleGroupItem>
    </ToggleGroup>
  </section>

</div>

<style>
  .demo {
    min-inline-size: 0;
    max-inline-size: min(100%, 40rem);
    display: grid;
    gap: 1.5rem;
    padding: 1rem;
    font-family: var(--tx-font-sans, system-ui, sans-serif);
    color: var(--tx-foreground, CanvasText);
    background: var(--tx-background, Canvas);
  }
  section {
    display: grid;
    gap: 0.5rem;
  }
  h2 {
    margin: 0;
    font-size: 0.85rem;
    font-weight: 600;
  }
  .row {
    display: flex;
    flex-wrap: wrap;
    gap: 0.5rem;
    align-items: center;
  }
  .hint {
    margin: 0;
    font-size: 0.8rem;
    color: var(--tx-muted-foreground, GrayText);
  }
</style>