Angular control gallery
Every control the Angular kit exports, with the code to paste.
These are real @listenssoft/speechui-angular snippets, not previews — a Angular app can't run inside this page. To try the interaction model hands-on, the React gallery runs live in the browser; the speech behavior is identical across kits.
Listening bar & popup
Choose between a listening bar at the top of the page, or a compact floating popup. Both show the live transcript and a waveform that pulses to the engine's audio level.
import { Component } from "@angular/core";
import { ListensListeningBarComponent } from "@listenssoft/speechui-angular";
@Component({
selector: "demo-listening-bar",
imports: [ListensListeningBarComponent],
template: `
<listens-listening-bar [alwaysShow]="true" />
`,
})
export class DemoListeningBar {}Text
Display text that swaps when listening.
import { Component } from "@angular/core";
import { ListensTextComponent } from "@listenssoft/speechui-angular";
@Component({
selector: "demo-text",
imports: [ListensTextComponent],
template: `
<p>
<listens-text listeningContent='“Listening is active”'>
Hold anywhere on the page to talk.
</listens-text>
</p>
`,
})
export class DemoText {}Text field
A single-line input users can type into — or dictate into: “name Jane Doe”.
import { Component } from "@angular/core";
import { FormsModule } from "@angular/forms";
import { ListensInputComponent } from "@listenssoft/speechui-angular";
@Component({
selector: "demo-text-field",
imports: [ListensInputComponent, FormsModule],
template: `
<listens-input
label="Name"
command="name"
type="name"
placeholder="Jane Doe"
[(ngModel)]="name"
/>
`,
})
export class DemoTextField {
name = "";
}Text area
Multi-line dictation with no value filter — say the command and keep talking.
import { Component } from "@angular/core";
import { FormsModule } from "@angular/forms";
import { ListensTextAreaComponent } from "@listenssoft/speechui-angular";
@Component({
selector: "demo-text-area",
imports: [ListensTextAreaComponent, FormsModule],
template: `
<listens-textarea
label="Notes"
command="notes"
[rows]="4"
placeholder="Dictate mission notes…"
[(ngModel)]="notes"
/>
`,
})
export class DemoTextArea {
notes = "";
}Label button
A styled button that fires when its command is heard — “launch” clicks it.
import { Component, signal } from "@angular/core";
import { ListensLabelButtonComponent } from "@listenssoft/speechui-angular";
@Component({
selector: "demo-label-button",
imports: [ListensLabelButtonComponent],
template: `
<div style="display: grid; gap: 8px; justify-items: start">
<listens-label-button
label="Launch"
command="launch"
(clicked)="count.set(count() + 1)"
/>
<span>Launched {{ count() }} times</span>
</div>
`,
})
export class DemoLabelButton {
count = signal(0);
}Button (bare)
A plain native button that responds to speech — zero kit markup, zero kit styles. Yours to design.
import { Component, signal } from "@angular/core";
import { ListensCommandDirective } from "@listenssoft/speechui-angular";
@Component({
selector: "demo-bare-button",
imports: [ListensCommandDirective],
template: `
<!-- On a native button, the command directive IS the bare button -->
<button
listensCommand="engage"
listensLabel="Engage"
class="my-pill-button"
(click)="count.set(count() + 1)"
>
Engage ({{ count() }})
</button>
`,
styles: `
.my-pill-button {
padding: 8px 18px;
border-radius: 999px;
border: 1px solid #888;
background: transparent;
font: inherit;
cursor: pointer;
}
`,
})
export class DemoBareButton {
count = signal(0);
}Input (bare)
A plain native input that takes dictation — zero kit markup, zero kit styles. Yours to design.
import { Component } from "@angular/core";
import { FormsModule } from "@angular/forms";
import { ListensInputDirective } from "@listenssoft/speechui-angular";
@Component({
selector: "demo-bare-input",
imports: [ListensInputDirective, FormsModule],
template: `
<label style="display: grid; gap: 4px">
Callsign
<!-- A native input; the directive adds dictation, no markup -->
<input
listensInput="callsign"
listensLabel="Callsign"
listensType="letters"
class="my-input"
[(ngModel)]="callsign"
/>
</label>
`,
styles: `
.my-input {
padding: 8px 10px;
border: 1px solid #888;
border-radius: 6px;
font: inherit;
}
`,
})
export class DemoBareInput {
callsign = "";
}Toggle
An on/off switch that flips when its command is heard: “dark mode”.
import { Component } from "@angular/core";
import { FormsModule } from "@angular/forms";
import { ListensToggleComponent } from "@listenssoft/speechui-angular";
@Component({
selector: "demo-toggle",
imports: [ListensToggleComponent, FormsModule],
template: `
<listens-toggle
label="Dark mode"
command="dark mode"
[(ngModel)]="enabled"
/>
`,
})
export class DemoToggle {
enabled = false;
}Toggle button & group
Press-to-activate buttons; grouped, they form a mutually-exclusive segmented control you can address by voice.
import { Component, signal } from "@angular/core";
import {
ListensToggleButtonComponent,
ListensToggleButtonGroupComponent,
} from "@listenssoft/speechui-angular";
@Component({
selector: "demo-toggle-buttons",
imports: [ListensToggleButtonComponent, ListensToggleButtonGroupComponent],
template: `
<div style="display: grid; gap: 8px; justify-items: start">
<listens-toggle-button-group>
<button
listensToggleButton
label="Day"
[checked]="view() === 'Day'"
(checkedChange)="$event && view.set('Day')"
></button>
<button
listensToggleButton
label="Week"
[checked]="view() === 'Week'"
(checkedChange)="$event && view.set('Week')"
></button>
<button
listensToggleButton
label="Month"
[checked]="view() === 'Month'"
(checkedChange)="$event && view.set('Month')"
></button>
</listens-toggle-button-group>
<span>Showing: {{ view() }}</span>
</div>
`,
})
export class DemoToggleButtons {
view = signal("Day");
}Slider
A slider users can drag — or set by voice: “volume to seventy”.
import { Component } from "@angular/core";
import { ListensSliderComponent } from "@listenssoft/speechui-angular";
@Component({
selector: "demo-slider",
imports: [ListensSliderComponent],
template: `
<listens-slider label="Volume" command="volume" [(value)]="volume" />
`,
})
export class DemoSlider {
volume = 40;
}Radio group
Single select by voice: “size large” picks Large.
import { Component } from "@angular/core";
import { FormsModule } from "@angular/forms";
import { ListensRadioGroupComponent } from "@listenssoft/speechui-angular";
@Component({
selector: "demo-radio-group",
imports: [ListensRadioGroupComponent, FormsModule],
template: `
<listens-radio-group
label="Size"
command="size"
[options]="['Small', 'Medium', 'Large']"
[(ngModel)]="size"
/>
`,
})
export class DemoRadioGroup {
size = "Medium";
}Checkbox
Multi select by voice: “toppings cheese and olives” toggles both.
import { Component } from "@angular/core";
import { FormsModule } from "@angular/forms";
import { ListensCheckboxComponent } from "@listenssoft/speechui-angular";
@Component({
selector: "demo-checkbox",
imports: [ListensCheckboxComponent, FormsModule],
template: `
<listens-checkbox
label="Toppings"
command="toppings"
[options]="['Cheese', 'Mushrooms', 'Olives', 'Peppers']"
[(ngModel)]="toppings"
/>
`,
})
export class DemoCheckbox {
toppings = ["Cheese"];
}Picker
A color picker whose grid opens on command and answers to color names: “color dark red”.
import { Component } from "@angular/core";
import { ListensPickerComponent } from "@listenssoft/speechui-angular";
@Component({
selector: "demo-picker",
imports: [ListensPickerComponent],
template: `
<listens-picker label="Accent color" command="color" [(value)]="color" />
`,
})
export class DemoPicker {
color = "blue";
}List
An editable checklist you can talk to: “checklist add fuel cells and rations”.
import { Component, signal } from "@angular/core";
import { ListensListComponent } from "@listenssoft/speechui-angular";
import type { ListensListItem } from "@listenssoft/speechui-angular";
@Component({
selector: "demo-list",
imports: [ListensListComponent],
template: `
<listens-list
label="Pre-flight checklist"
command="checklist"
[(value)]="items"
/>
`,
})
export class DemoList {
items = signal<ListensListItem[]>([
{ id: "1", text: "oxygen tanks", checked: true },
{ id: "2", text: "star charts", checked: false },
]);
}Combobox
A filterable select with a spoken trigger word: “destination” opens it, “Mars” picks it.
import { Component } from "@angular/core";
import { ListensComboBoxComponent } from "@listenssoft/speechui-angular";
@Component({
selector: "demo-combobox",
imports: [ListensComboBoxComponent],
template: `
<listens-combobox
label="Destination"
command="destination"
[options]="['Luna', 'Mars', 'Europa', 'Titan', 'Ganymede']"
placeholder="Choose a destination…"
[(value)]="destination"
/>
`,
})
export class DemoComboBox {
destination = "";
}Command
The headless primitive: attach a spoken command to anything and run your own code when it's heard.
import { Component, signal } from "@angular/core";
import { ListensCommandDirective } from "@listenssoft/speechui-angular";
@Component({
selector: "demo-command",
imports: [ListensCommandDirective],
template: `
<div style="display: grid; gap: 8px; justify-items: start">
<!-- the directive click()s its host when the command is heard -->
<button
listensCommand="undock"
listensLabel="Undock"
(click)="status.set('undocked')"
(listensMatched)="onMatched($event)"
>
Undock
</button>
<span>Status: {{ status() }}</span>
</div>
`,
})
export class DemoCommand {
status = signal("docked");
onMatched(transcript: string) {
console.log("matched:", transcript);
}
}