Add project-scoped voice dictation controls with observable local model management. - Add the Voice Input settings section with opt-in enablement and runtime-safe status handling. - Add Parakeet v3 model download, removal, progress polling, search, documentation, and regression coverage. - Add a minor release changeset for Voice Input settings. Files changed: .changeset/fn-8572-voice-input-settings.md | 7 ++ docs/dashboard-guide.md | 4 + docs/settings-reference.md | 1 + .../dashboard/app/components/SettingsModal.tsx | 7 +- .../VoiceInputSection.modal-visibility.test.tsx | 19 +++ .../settings/__tests__/VoiceInputSection.test.tsx | 137 +++++++++++++++++++++ .../settings/__tests__/section-keys.test.ts | 1 + .../search/__tests__/settings-search-index.test.ts | 1 + .../app/components/settings/search/entries.ts | 2 + .../app/components/settings/section-keys.ts | 2 + .../settings/sections/VoiceInputSection.css | 48 ++++++++ .../settings/sections/VoiceInputSection.search.ts | 14 +++ .../settings/sections/VoiceInputSection.tsx | 128 ++++++++++++++++++++ 13 files changed, 370 insertions(+), 1 deletion(-) Fusion-Task-Id: FN-8572 Fusion-Task-Lineage: 2d2ad0df-3765-4d19-a6f3-7c2b5ca5df95 Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
49 lines
1.0 KiB
CSS
49 lines
1.0 KiB
CSS
/*
|
|
FNXC:VoiceInput 2026-07-28-12:00:
|
|
Voice model controls use the existing SettingsFieldRow slots. These styles only
|
|
arrange status and standard buttons within those slots, preserving shared settings
|
|
spacing and responsive touch targets without creating a parallel panel.
|
|
*/
|
|
.voice-input-section {
|
|
display: grid;
|
|
gap: var(--space-xs);
|
|
}
|
|
|
|
.voice-input-section__message {
|
|
margin: 0;
|
|
color: var(--color-warning);
|
|
font-size: var(--font-size-xs);
|
|
}
|
|
|
|
.voice-input-section__status {
|
|
color: var(--text-muted);
|
|
font-size: var(--font-size-sm);
|
|
}
|
|
|
|
.voice-input-section__status--installed {
|
|
color: var(--color-success);
|
|
}
|
|
|
|
.voice-input-section__status--error,
|
|
.voice-input-section__status--unknown {
|
|
color: var(--color-error);
|
|
}
|
|
|
|
.voice-input-section__status--downloading,
|
|
.voice-input-section__status--queued {
|
|
color: var(--color-warning);
|
|
}
|
|
|
|
.voice-input-section__actions {
|
|
display: flex;
|
|
flex-wrap: wrap;
|
|
gap: var(--space-sm);
|
|
}
|
|
|
|
@media (max-width: 768px) {
|
|
.voice-input-section__actions .btn {
|
|
inline-size: 100%;
|
|
justify-content: center;
|
|
}
|
|
}
|