@happyvertical/smrt-ui 0.51.39 → 0.52.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (212) hide show
  1. package/AGENTS.md +14 -2
  2. package/README.md +257 -5
  3. package/dist/actions/__tests__/swipe-dismiss.test.js +69 -0
  4. package/dist/actions/swipe-dismiss.d.ts +42 -0
  5. package/dist/actions/swipe-dismiss.d.ts.map +1 -0
  6. package/dist/actions/swipe-dismiss.js +69 -0
  7. package/dist/components/calendar/Calendar.svelte +5 -0
  8. package/dist/components/calendar/Calendar.svelte.d.ts.map +1 -1
  9. package/dist/components/calendar/CalendarView.svelte +1250 -0
  10. package/dist/components/calendar/CalendarView.svelte.d.ts +66 -0
  11. package/dist/components/calendar/CalendarView.svelte.d.ts.map +1 -0
  12. package/dist/components/calendar/DayView.svelte +5 -0
  13. package/dist/components/calendar/DayView.svelte.d.ts.map +1 -1
  14. package/dist/components/calendar/__tests__/CalendarView.test.js +226 -0
  15. package/dist/components/calendar/__tests__/calendar-model.test.js +138 -0
  16. package/dist/components/calendar/calendar-model.d.ts +178 -0
  17. package/dist/components/calendar/calendar-model.d.ts.map +1 -0
  18. package/dist/components/calendar/calendar-model.js +362 -0
  19. package/dist/components/calendar/index.d.ts +12 -1
  20. package/dist/components/calendar/index.d.ts.map +1 -1
  21. package/dist/components/calendar/index.js +11 -1
  22. package/dist/components/data/CollectionList.svelte +23 -5
  23. package/dist/components/data/CollectionList.svelte.d.ts +8 -2
  24. package/dist/components/data/CollectionList.svelte.d.ts.map +1 -1
  25. package/dist/components/data/DataTable.svelte +118 -40
  26. package/dist/components/data/DataTable.svelte.d.ts.map +1 -1
  27. package/dist/components/data/DataTableController.d.ts +4 -0
  28. package/dist/components/data/DataTableController.d.ts.map +1 -1
  29. package/dist/components/data/DataTableController.js +11 -4
  30. package/dist/components/data/ListSortSelect.svelte +121 -0
  31. package/dist/components/data/ListSortSelect.svelte.d.ts +22 -0
  32. package/dist/components/data/ListSortSelect.svelte.d.ts.map +1 -0
  33. package/dist/components/data/SortableHeader.svelte +169 -0
  34. package/dist/components/data/SortableHeader.svelte.d.ts +30 -0
  35. package/dist/components/data/SortableHeader.svelte.d.ts.map +1 -0
  36. package/dist/components/data/__tests__/CollectionList.test.js +37 -0
  37. package/dist/components/data/__tests__/DataTable.test.js +76 -0
  38. package/dist/components/data/__tests__/DataTableController.test.js +35 -0
  39. package/dist/components/data/__tests__/SortableHeader.test.js +101 -0
  40. package/dist/components/data/__tests__/link-step-surface.test.js +172 -0
  41. package/dist/components/data/__tests__/list-sort-state.svelte.test.js +71 -0
  42. package/dist/components/data/__tests__/list-sort.test.js +91 -0
  43. package/dist/components/data/__tests__/surface-navigation.test.js +121 -0
  44. package/dist/components/data/data-surface.d.ts +1 -0
  45. package/dist/components/data/data-surface.d.ts.map +1 -1
  46. package/dist/components/data/data-surface.js +1 -0
  47. package/dist/components/data/index.d.ts +6 -0
  48. package/dist/components/data/index.d.ts.map +1 -1
  49. package/dist/components/data/index.js +6 -0
  50. package/dist/components/data/link-surface.d.ts +79 -0
  51. package/dist/components/data/link-surface.d.ts.map +1 -0
  52. package/dist/components/data/link-surface.js +155 -0
  53. package/dist/components/data/list-sort-state.svelte.d.ts +39 -0
  54. package/dist/components/data/list-sort-state.svelte.d.ts.map +1 -0
  55. package/dist/components/data/list-sort-state.svelte.js +47 -0
  56. package/dist/components/data/list-sort.d.ts +94 -0
  57. package/dist/components/data/list-sort.d.ts.map +1 -0
  58. package/dist/components/data/list-sort.js +182 -0
  59. package/dist/components/data/step-surface.d.ts +73 -0
  60. package/dist/components/data/step-surface.d.ts.map +1 -0
  61. package/dist/components/data/step-surface.js +177 -0
  62. package/dist/components/data/surface-navigation.d.ts +49 -0
  63. package/dist/components/data/surface-navigation.d.ts.map +1 -0
  64. package/dist/components/data/surface-navigation.js +100 -0
  65. package/dist/components/data/types.d.ts +19 -0
  66. package/dist/components/data/types.d.ts.map +1 -1
  67. package/dist/components/feedback/PhoneSheet.svelte +224 -0
  68. package/dist/components/feedback/PhoneSheet.svelte.d.ts +35 -0
  69. package/dist/components/feedback/PhoneSheet.svelte.d.ts.map +1 -0
  70. package/dist/components/feedback/WorkingStrip.svelte +426 -0
  71. package/dist/components/feedback/WorkingStrip.svelte.d.ts +37 -0
  72. package/dist/components/feedback/WorkingStrip.svelte.d.ts.map +1 -0
  73. package/dist/components/feedback/__tests__/PhoneSheet.test.js +101 -0
  74. package/dist/components/feedback/__tests__/WorkingStrip.test.js +172 -0
  75. package/dist/components/feedback/index.d.ts +4 -0
  76. package/dist/components/feedback/index.d.ts.map +1 -1
  77. package/dist/components/feedback/index.js +5 -0
  78. package/dist/components/feedback/working-status.d.ts +34 -0
  79. package/dist/components/feedback/working-status.d.ts.map +1 -0
  80. package/dist/components/feedback/working-status.js +5 -0
  81. package/dist/components/forms/Checkbox.svelte +26 -2
  82. package/dist/components/forms/Combobox.svelte +68 -12
  83. package/dist/components/forms/Combobox.svelte.d.ts +6 -0
  84. package/dist/components/forms/Combobox.svelte.d.ts.map +1 -1
  85. package/dist/components/forms/DictationButton.svelte +128 -0
  86. package/dist/components/forms/DictationButton.svelte.d.ts +19 -0
  87. package/dist/components/forms/DictationButton.svelte.d.ts.map +1 -0
  88. package/dist/components/forms/DictationStatus.svelte +164 -0
  89. package/dist/components/forms/DictationStatus.svelte.d.ts +11 -0
  90. package/dist/components/forms/DictationStatus.svelte.d.ts.map +1 -0
  91. package/dist/components/forms/Fieldset.svelte +5 -1
  92. package/dist/components/forms/Fieldset.svelte.d.ts +2 -0
  93. package/dist/components/forms/Fieldset.svelte.d.ts.map +1 -1
  94. package/dist/components/forms/FormActionBar.svelte +84 -0
  95. package/dist/components/forms/FormActionBar.svelte.d.ts +23 -0
  96. package/dist/components/forms/FormActionBar.svelte.d.ts.map +1 -0
  97. package/dist/components/forms/Input.svelte +9 -0
  98. package/dist/components/forms/Radio.svelte +15 -4
  99. package/dist/components/forms/SearchInput.svelte +207 -0
  100. package/dist/components/forms/SearchInput.svelte.d.ts +22 -0
  101. package/dist/components/forms/SearchInput.svelte.d.ts.map +1 -0
  102. package/dist/components/forms/Select.svelte +9 -0
  103. package/dist/components/forms/StagedControlReview.svelte +21 -12
  104. package/dist/components/forms/StagedControlReview.svelte.d.ts.map +1 -1
  105. package/dist/components/forms/Switch.svelte +11 -5
  106. package/dist/components/forms/TagsInput.svelte +8 -1
  107. package/dist/components/forms/Textarea.svelte +8 -0
  108. package/dist/components/forms/__tests__/Combobox.test.js +87 -0
  109. package/dist/components/forms/__tests__/ControlHitArea.test.js +73 -0
  110. package/dist/components/forms/__tests__/DictationButton.test.js +176 -0
  111. package/dist/components/forms/__tests__/Fieldset.test.js +37 -0
  112. package/dist/components/forms/__tests__/FormActionBar.test.js +22 -0
  113. package/dist/components/forms/__tests__/SearchInput.test.js +92 -0
  114. package/dist/components/forms/__tests__/StagedControlReview.test.js +37 -3
  115. package/dist/components/forms/__tests__/combobox-labels.fixture.svelte +19 -0
  116. package/dist/components/forms/__tests__/combobox-labels.fixture.svelte.d.ts +11 -0
  117. package/dist/components/forms/__tests__/combobox-labels.fixture.svelte.d.ts.map +1 -0
  118. package/dist/components/forms/__tests__/composite-registration.fixture.svelte +29 -0
  119. package/dist/components/forms/__tests__/composite-registration.fixture.svelte.d.ts +8 -0
  120. package/dist/components/forms/__tests__/composite-registration.fixture.svelte.d.ts.map +1 -0
  121. package/dist/components/forms/__tests__/control-interaction.test.js +19 -1
  122. package/dist/components/forms/__tests__/control-proposals.test.js +63 -0
  123. package/dist/components/forms/__tests__/dictation-recording.test.js +582 -0
  124. package/dist/components/forms/__tests__/dictation.test.js +486 -0
  125. package/dist/components/forms/__tests__/long-press.test.js +175 -0
  126. package/dist/components/forms/__tests__/place-picker.fixture.svelte +33 -0
  127. package/dist/components/forms/__tests__/place-picker.fixture.svelte.d.ts +12 -0
  128. package/dist/components/forms/__tests__/place-picker.fixture.svelte.d.ts.map +1 -0
  129. package/dist/components/forms/audio-capture.d.ts +69 -0
  130. package/dist/components/forms/audio-capture.d.ts.map +1 -0
  131. package/dist/components/forms/audio-capture.js +193 -0
  132. package/dist/components/forms/control-interaction.d.ts +6 -0
  133. package/dist/components/forms/control-interaction.d.ts.map +1 -1
  134. package/dist/components/forms/control-interaction.js +12 -1
  135. package/dist/components/forms/control-proposals.d.ts +55 -0
  136. package/dist/components/forms/control-proposals.d.ts.map +1 -0
  137. package/dist/components/forms/control-proposals.js +188 -0
  138. package/dist/components/forms/dictation-transcribe.d.ts +36 -0
  139. package/dist/components/forms/dictation-transcribe.d.ts.map +1 -0
  140. package/dist/components/forms/dictation-transcribe.js +65 -0
  141. package/dist/components/forms/dictation.svelte.d.ts +200 -0
  142. package/dist/components/forms/dictation.svelte.d.ts.map +1 -0
  143. package/dist/components/forms/dictation.svelte.js +686 -0
  144. package/dist/components/forms/index.d.ts +14 -1
  145. package/dist/components/forms/index.d.ts.map +1 -1
  146. package/dist/components/forms/index.js +14 -1
  147. package/dist/components/forms/insert-text.d.ts +12 -0
  148. package/dist/components/forms/insert-text.d.ts.map +1 -0
  149. package/dist/components/forms/insert-text.js +38 -0
  150. package/dist/components/forms/long-press.d.ts +88 -0
  151. package/dist/components/forms/long-press.d.ts.map +1 -0
  152. package/dist/components/forms/long-press.js +213 -0
  153. package/dist/components/forms/ready-beep.d.ts +24 -0
  154. package/dist/components/forms/ready-beep.d.ts.map +1 -0
  155. package/dist/components/forms/ready-beep.js +82 -0
  156. package/dist/components/layout/PageHeader.svelte +151 -17
  157. package/dist/components/layout/PageHeader.svelte.d.ts +47 -7
  158. package/dist/components/layout/PageHeader.svelte.d.ts.map +1 -1
  159. package/dist/components/layout/__tests__/PageHeader.test.js +87 -1
  160. package/dist/components/layout/index.d.ts +1 -0
  161. package/dist/components/layout/index.d.ts.map +1 -1
  162. package/dist/components/layout/index.js +1 -0
  163. package/dist/components/layout/page-header-context.d.ts +25 -0
  164. package/dist/components/layout/page-header-context.d.ts.map +1 -0
  165. package/dist/components/layout/page-header-context.js +16 -0
  166. package/dist/components/nav/Tabs.svelte +241 -0
  167. package/dist/components/nav/Tabs.svelte.d.ts +15 -0
  168. package/dist/components/nav/Tabs.svelte.d.ts.map +1 -1
  169. package/dist/components/nav/__tests__/LinkTabs.test.js +117 -0
  170. package/dist/components/nav/index.d.ts +1 -0
  171. package/dist/components/nav/index.d.ts.map +1 -1
  172. package/dist/components/nav/index.js +1 -0
  173. package/dist/components/nav/tabs-overflow.d.ts +12 -0
  174. package/dist/components/nav/tabs-overflow.d.ts.map +1 -0
  175. package/dist/components/nav/tabs-overflow.js +17 -0
  176. package/dist/components/nav/types.d.ts +8 -0
  177. package/dist/components/nav/types.d.ts.map +1 -1
  178. package/dist/components/ui/Button.svelte +7 -0
  179. package/dist/components/ui/Card.svelte +14 -5
  180. package/dist/components/ui/Dropdown.svelte +55 -1
  181. package/dist/components/ui/Dropdown.svelte.d.ts +8 -0
  182. package/dist/components/ui/Dropdown.svelte.d.ts.map +1 -1
  183. package/dist/components/ui/IconToggle.svelte +139 -0
  184. package/dist/components/ui/IconToggle.svelte.d.ts +32 -0
  185. package/dist/components/ui/IconToggle.svelte.d.ts.map +1 -0
  186. package/dist/components/ui/IconToggleGroup.svelte +56 -0
  187. package/dist/components/ui/IconToggleGroup.svelte.d.ts +21 -0
  188. package/dist/components/ui/IconToggleGroup.svelte.d.ts.map +1 -0
  189. package/dist/components/ui/Pagination.svelte +1 -1
  190. package/dist/components/ui/Popover.svelte +17 -1
  191. package/dist/components/ui/Popover.svelte.d.ts +8 -0
  192. package/dist/components/ui/Popover.svelte.d.ts.map +1 -1
  193. package/dist/components/ui/__tests__/IconToggle.test.js +59 -0
  194. package/dist/components/ui/__tests__/IconToggleGroup.test.js +30 -0
  195. package/dist/components/ui/__tests__/Popover.test.js +44 -0
  196. package/dist/components/ui/__tests__/dropdown-popover-icon.test.js +125 -0
  197. package/dist/components/ui/__tests__/phone-touch-targets.test.js +39 -0
  198. package/dist/components/ui/index.d.ts +2 -0
  199. package/dist/components/ui/index.d.ts.map +1 -1
  200. package/dist/components/ui/index.js +2 -0
  201. package/dist/i18n/strings.ui.d.ts +41 -0
  202. package/dist/i18n/strings.ui.d.ts.map +1 -1
  203. package/dist/i18n/strings.ui.js +46 -0
  204. package/dist/svelte/__tests__/playground.test.js +1 -0
  205. package/dist/svelte/playground/CalendarPreview.svelte +140 -0
  206. package/dist/svelte/playground/CalendarPreview.svelte.d.ts +4 -0
  207. package/dist/svelte/playground/CalendarPreview.svelte.d.ts.map +1 -0
  208. package/dist/svelte/playground.d.ts.map +1 -1
  209. package/dist/svelte/playground.js +10 -0
  210. package/dist/types-generic.d.ts +2 -0
  211. package/dist/types-generic.d.ts.map +1 -1
  212. package/package.json +3 -3
@@ -0,0 +1,65 @@
1
+ /**
2
+ * Turning a recorded message into text, for dictation's recording fallback.
3
+ *
4
+ * `Dictation` records audio when the browser cannot recognise speech itself
5
+ * and hands it to a `DictationTranscribe` function. The app decides where it
6
+ * goes: normally its own server route, which holds the speech service's key
7
+ * (never put a provider key in the browser). `createHttpTranscriber` is that
8
+ * function for a route that takes the raw audio as the request body and
9
+ * answers `{ text }`.
10
+ */
11
+ import { DictationError } from './audio-capture.js';
12
+ /**
13
+ * A `DictationTranscribe` that POSTs the audio to `url` as the raw request
14
+ * body (`Content-Type` is the recording's type) with `language` and
15
+ * `durationMs` in the query string, and reads `{ text }` back.
16
+ *
17
+ * Status codes become plain-words errors: 413 → `too-long`, 503 →
18
+ * `unavailable` (not set up), 401/403 → `forbidden`, anything else →
19
+ * `not-transcribed`. The server's `{ error }` text is kept as the error
20
+ * message for logs, not shown.
21
+ */
22
+ export function createHttpTranscriber(url, options = {}) {
23
+ return async (audio, { mimeType, language, durationMs, signal }) => {
24
+ const doFetch = options.fetch ?? globalThis.fetch;
25
+ const base = typeof window !== 'undefined'
26
+ ? window.location.href
27
+ : 'http://localhost/';
28
+ const target = new URL(String(url), base);
29
+ if (language)
30
+ target.searchParams.set('language', language);
31
+ if (Number.isFinite(durationMs)) {
32
+ target.searchParams.set('durationMs', String(Math.round(durationMs)));
33
+ }
34
+ let response;
35
+ try {
36
+ response = await doFetch(target.toString(), {
37
+ method: 'POST',
38
+ headers: { ...options.headers, 'Content-Type': mimeType },
39
+ body: audio,
40
+ credentials: 'same-origin',
41
+ signal,
42
+ });
43
+ }
44
+ catch (error) {
45
+ if (error?.name === 'AbortError')
46
+ throw error;
47
+ throw new DictationError('not-transcribed', `Could not reach the speech service: ${error instanceof Error ? error.message : String(error)}`, 'network');
48
+ }
49
+ const body = (await response.json().catch(() => null));
50
+ if (!response.ok) {
51
+ const message = typeof body?.error === 'string'
52
+ ? body.error
53
+ : `Speech service answered ${response.status}`;
54
+ const kind = response.status === 413
55
+ ? 'too-long'
56
+ : response.status === 503
57
+ ? 'unavailable'
58
+ : response.status === 401 || response.status === 403
59
+ ? 'forbidden'
60
+ : 'not-transcribed';
61
+ throw new DictationError(kind, message, `http-${response.status}`);
62
+ }
63
+ return typeof body?.text === 'string' ? body.text : '';
64
+ };
65
+ }
@@ -0,0 +1,200 @@
1
+ /**
2
+ * Dictation: speak into a text field.
3
+ *
4
+ * The state machine behind the microphone button and "long-press a field to
5
+ * speak". It does not recognise speech itself: the host hands it a speech
6
+ * source, normally smrt-svelte's browser speech-to-text adapter
7
+ * (`createSttDictationSource` in `@happyvertical/smrt-svelte/browser-ai`),
8
+ * whose adapters already satisfy `DictationSpeechSource`. That keeps smrt-ui
9
+ * free of the Provider and the speech engines, and gives one speech engine
10
+ * for forms, chat, and anything else.
11
+ *
12
+ * States: `idle` → `starting` → `listening` → `stopping` → `idle`, and
13
+ * `error` (with `errorKind`) from any of them. A "ready" beep plays when the
14
+ * microphone is actually listening. Final phrases go to `onText` (put them
15
+ * in the field with `insertTextAtCursor`); the phrase in progress is
16
+ * `interim`.
17
+ *
18
+ * How listening stops: tap the microphone again (`toggle`/`stop`), send the
19
+ * form, press Escape, or pause talking (the browser ends it). A long press
20
+ * starts listening and it keeps listening after the finger comes up, so the
21
+ * person can press, hear the beep, let go, and talk.
22
+ *
23
+ * On first use it asks for the microphone (`getUserMedia`) and waits for the
24
+ * answer before it starts recognising, so the permission prompt cannot cut
25
+ * the recogniser off and a "no" shows as "the microphone is blocked".
26
+ *
27
+ * It never stops silently. Every recogniser error becomes an `error` state
28
+ * with a plain `errorKind` (and the raw `errorCode`, and a console warning);
29
+ * a recogniser that ends on its own within `earlyEndMs` of starting without
30
+ * hearing anything (Brave's speech recognition does this) is an error too.
31
+ *
32
+ * Recording fallback: give it a `transcribe` function and, when the browser
33
+ * has no speech recognition (Firefox), or it fails with no speech service
34
+ * behind it (Brave: Web Speech `network` / `service-not-allowed`, or an end
35
+ * straight away), it records the message with `MediaRecorder` instead
36
+ * (WebM/Opus, or MP4 on Safari; capped at `maxDurationMs` and `maxBytes`).
37
+ * When the person stops, the state is `transcribing` ("Writing it down…")
38
+ * while `transcribe(audio, { mimeType, language })` turns the recording into
39
+ * text, which goes to `onText` like a spoken phrase. Once the browser's
40
+ * recogniser has failed, this `Dictation` records straight away next time.
41
+ */
42
+ import { type DictationAudioCaptureFactory } from './audio-capture.js';
43
+ import type { DictationTranscribe } from './dictation-transcribe.js';
44
+ export type DictationState = 'idle' | 'starting' | 'listening' | 'stopping' | 'transcribing' | 'error';
45
+ /**
46
+ * Why dictation stopped with an error:
47
+ * - `unsupported`: this browser cannot recognise speech, or has no speech
48
+ * service behind it (Web Speech `network` / `service-not-allowed`: Brave);
49
+ * - `denied`: the microphone is blocked;
50
+ * - `no-speech`: nothing was heard;
51
+ * - `microphone`: no microphone, or it could not be opened (`audio-capture`);
52
+ * - `interrupted`: it stopped straight away without hearing anything
53
+ * (`aborted`, or an early end with no error);
54
+ * - `too-long`: the recording was too long or too large to write down;
55
+ * - `not-transcribed`: the recording could not be written down;
56
+ * - `unavailable`: writing recordings down is not set up here;
57
+ * - `forbidden`: this person may not use it here;
58
+ * - `failed`: anything else.
59
+ */
60
+ export type DictationErrorKind = 'unsupported' | 'denied' | 'no-speech' | 'microphone' | 'interrupted' | 'too-long' | 'not-transcribed' | 'unavailable' | 'forbidden' | 'failed';
61
+ export interface DictationSpeechResult {
62
+ text: string;
63
+ isFinal: boolean;
64
+ }
65
+ export interface DictationStartOptions {
66
+ language?: string;
67
+ continuous?: boolean;
68
+ interimResults?: boolean;
69
+ }
70
+ /**
71
+ * A speech recogniser. smrt-svelte's `STTAdapter` satisfies it structurally.
72
+ * `start` may reject (not supported, microphone blocked); later failures
73
+ * arrive through `onError`, and `onEnd` fires when it stops listening.
74
+ */
75
+ export interface DictationSpeechSource {
76
+ start(options?: DictationStartOptions): Promise<void>;
77
+ stop(): Promise<void>;
78
+ onResult(callback: (result: DictationSpeechResult) => void): () => void;
79
+ onError(callback: (error: Error) => void): () => void;
80
+ onEnd(callback: () => void): () => void;
81
+ /** When given, listening (and the beep) starts on this event. */
82
+ onStart?(callback: () => void): () => void;
83
+ }
84
+ /** Resolves the speech source on first use (it may load lazily). */
85
+ export type DictationSourceProvider = () => DictationSpeechSource | Promise<DictationSpeechSource>;
86
+ export interface DictationOptions {
87
+ /** The speech source; without one dictation reports `unsupported`. */
88
+ source?: DictationSourceProvider | null;
89
+ /** A finished phrase to put into the field. */
90
+ onText: (text: string) => void;
91
+ /** The phrase in progress (also on `interim`). */
92
+ onInterim?: (text: string) => void;
93
+ /** BCP-47 language. Default: the page's `lang`, else `en-US`. */
94
+ language?: string;
95
+ /**
96
+ * The ready beep: `true` (default) plays the built-in beep, `false` none,
97
+ * or a function that plays one and resolves whether it did.
98
+ */
99
+ beep?: boolean | (() => Promise<boolean> | boolean);
100
+ /** How long to wait for the source to confirm it stopped. Default 1500ms. */
101
+ stopTimeoutMs?: number;
102
+ /**
103
+ * Ask for the microphone (`getUserMedia`) and wait for the answer before
104
+ * starting the source, once per `Dictation`. Default `true`; skipped where
105
+ * the browser has no `navigator.mediaDevices`.
106
+ */
107
+ requestMicrophone?: boolean;
108
+ /**
109
+ * A source that ends by itself this soon after it started listening,
110
+ * without a result and without being asked to stop, failed
111
+ * (`interrupted`). Default 1000ms; `0` turns the check off.
112
+ */
113
+ earlyEndMs?: number;
114
+ /**
115
+ * Where problems are reported (default: `console.warn`). Never given the
116
+ * audio or the words heard.
117
+ */
118
+ log?: (event: DictationLogEvent) => void;
119
+ /**
120
+ * Turns a recorded message into text. With it, dictation records instead
121
+ * when the browser cannot recognise speech (see the module comment), and
122
+ * without a `source` it always records. Normally
123
+ * `createHttpTranscriber('/your/route')`: the speech service's key stays on
124
+ * the server.
125
+ */
126
+ transcribe?: DictationTranscribe | null;
127
+ /** Records the message (default: `MediaRecorder`). For tests and hosts. */
128
+ capture?: DictationAudioCaptureFactory;
129
+ /** Longest recording, in ms; it stops and is written down then. Default 120000. */
130
+ maxDurationMs?: number;
131
+ /** Largest recording, in bytes. Default 10 MB. */
132
+ maxBytes?: number;
133
+ /** How long writing a recording down may take. Default 60000ms. */
134
+ transcribeTimeoutMs?: number;
135
+ }
136
+ /** A dictation problem, for logs. */
137
+ export interface DictationLogEvent {
138
+ kind: DictationErrorKind;
139
+ /** Raw code: the Web Speech error (`network`, …) or the error's name. */
140
+ code: string | null;
141
+ message: string;
142
+ /**
143
+ * Where it happened: `microphone`, `source`, `start`, `error`, `end`, or
144
+ * in the recording fallback `record` / `transcribe`.
145
+ */
146
+ stage: 'microphone' | 'source' | 'start' | 'error' | 'end' | 'record' | 'transcribe';
147
+ /** Set when dictation carried on by recording instead of stopping. */
148
+ fallback?: 'recording';
149
+ }
150
+ /** The raw code of a speech or media error, when it has one. */
151
+ export declare function dictationErrorCode(error: unknown): string | null;
152
+ /**
153
+ * Sort a speech error into a `DictationErrorKind`. Reads the error's `code`
154
+ * and `name` (smrt-svelte browser-ai errors: `PERMISSION_DENIED`,
155
+ * `CAPABILITY_NOT_AVAILABLE`) and the Web Speech error names.
156
+ */
157
+ export declare function classifyDictationError(error: unknown): DictationErrorKind;
158
+ export declare class Dictation {
159
+ #private;
160
+ /** Where dictation is (see the module comment). */
161
+ state: DictationState;
162
+ /** Why it stopped, while `state` is `error`. */
163
+ errorKind: DictationErrorKind | null;
164
+ /** The raw error code behind `errorKind` (`network`, `NotAllowedError`…). */
165
+ errorCode: string | null;
166
+ /** The phrase being spoken right now. */
167
+ interim: string;
168
+ /** The ready beep could not play yet (no user gesture); `unlock` plays it. */
169
+ beepPending: boolean;
170
+ /**
171
+ * `true` while this message is being recorded (the fallback) rather than
172
+ * recognised by the browser.
173
+ */
174
+ recording: boolean;
175
+ constructor(options: DictationOptions);
176
+ /** A speech source or a `transcribe` was given (the browser may still turn out unable). */
177
+ get available(): boolean;
178
+ /** Starting or listening. */
179
+ get active(): boolean;
180
+ /** Replace options (for example a new `onText`). */
181
+ setOptions(options: Partial<DictationOptions>): void;
182
+ /** Start listening. A no-op while already starting, listening, or writing down. */
183
+ start(): Promise<void>;
184
+ /**
185
+ * Stop listening; the phrase in progress is kept if the source finishes it.
186
+ * A recording is written down (`transcribing`) and its text handed over.
187
+ */
188
+ stop(): Promise<void>;
189
+ /** Tap on the microphone: start, or stop while listening. */
190
+ toggle(): Promise<void>;
191
+ /** Clear an error so the field looks normal again. */
192
+ clearError(): void;
193
+ /**
194
+ * Call from a user gesture (a tap, a long press's release): plays the
195
+ * ready beep if it could not play when listening started.
196
+ */
197
+ unlock(): Promise<void>;
198
+ dispose(): void;
199
+ }
200
+ //# sourceMappingURL=dictation.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dictation.svelte.d.ts","sourceRoot":"","sources":["../../../src/components/forms/dictation.svelte.ts"],"names":[],"mappings":"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"}