Files
moeka-project/packages/stage-ui
Makito 1e7c468c03 feat(provider): add voicevox family speech providers (#2383)
## Description

Adds the VOICEVOX engine family as text-to-speech providers. Two
catalogue entries share one adapter:

- `voicevox` — VOICEVOX ENGINE, default `http://localhost:50021/`
- `aivis-speech` — AivisSpeech Engine, default `http://localhost:10101/`

<img width="1203" height="976" alt="Screenshot 2026-08-28 at 23 33 30"
src="https://github.com/user-attachments/assets/ae475852-ccc0-4bd7-81ea-9e9ba2f75e31"
/>

<img width="1203" height="976" alt="Screenshot 2026-08-28 at 23 34 14"
src="https://github.com/user-attachments/assets/f83f73a9-ee76-4a91-a2fc-907b361beb0d"
/>

## Linked Issues

Closes #2166
2026-08-28 19:46:27 +00:00
..
2026-03-12 05:09:32 +08:00
2026-08-26 20:13:10 +08:00
2026-08-26 20:13:10 +08:00
2026-08-28 04:59:05 +08:00
2026-08-26 20:13:10 +08:00
2026-08-26 20:13:10 +08:00

Stage UI

Shared core for stage

Button analytics

Register the shared plugin once in each Vue application:

import { trackButtonPlugin } from '@proj-airi/stage-ui/directives/track-button'

createApp(App)
  .use(trackButtonPlugin)
  .mount('#app')

Buttons that represent a product-analysis click intent can then declare a typed event without wrapping their business handler:

<Button
  v-track-button="{ name: 'update_check_clicked', channel: selectedChannel }"
  @click="checkForUpdates()"
/>

Keep async outcomes, confirmed state changes, impressions, and lifecycle events in their owning business flows instead of attaching them to the initial click.

Histoire (UI storyboard)

https://histoire.dev/

pnpm -F @proj-airi/stage-ui run story:dev

Project structure

  1. If a story is bound to a specific component, it can be placed beside the component in the src folder. e.g., MyComponent.story.vue
  2. If a story is not bound to a specific component, then it should be placed in the stories folder. e.g., MyStory.story.vue