@k2b/ui 0.47.0 → 0.49.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.
- package/dist/browser/actions/CopyButton.js +26 -18
- package/dist/browser/actions/CopyButton.js.map +1 -1
- package/dist/browser/chat/ChatComposer.js +244 -193
- package/dist/browser/chat/ChatComposer.js.map +1 -1
- package/dist/browser/chat/chat-messages.js +6 -0
- package/dist/browser/chat/chat-messages.js.map +1 -1
- package/dist/browser/chat/types.js.map +1 -1
- package/dist/browser/content/Calendar.js +40 -5
- package/dist/browser/content/Calendar.js.map +1 -1
- package/dist/browser/content/calendar-event-detail.js +328 -0
- package/dist/browser/content/calendar-event-detail.js.map +1 -0
- package/dist/browser/content/calendar-messages.js +34 -2
- package/dist/browser/content/calendar-messages.js.map +1 -1
- package/dist/browser/content/calendar-shared.js +189 -82
- package/dist/browser/content/calendar-shared.js.map +1 -1
- package/dist/browser/content/calendar-time-view.js +101 -96
- package/dist/browser/content/calendar-time-view.js.map +1 -1
- package/dist/browser/content/index.js.map +1 -1
- package/dist/browser/feedback/prompt-confirm.js +7 -4
- package/dist/browser/feedback/prompt-confirm.js.map +1 -1
- package/dist/browser/feedback/prompts.js +3 -3
- package/dist/browser/feedback/prompts.js.map +1 -1
- package/dist/browser/inputs/NumberInput.js +17 -5
- package/dist/browser/inputs/NumberInput.js.map +1 -1
- package/dist/browser/inputs/dictation/Dictation.js +114 -108
- package/dist/browser/inputs/dictation/Dictation.js.map +1 -1
- package/dist/browser/inputs/dictation/dictation-messages.js +2 -0
- package/dist/browser/inputs/dictation/dictation-messages.js.map +1 -1
- package/dist/browser/layout/AppWorkspace.js +574 -522
- package/dist/browser/layout/AppWorkspace.js.map +1 -1
- package/dist/browser/layout/MobileShell.js +26 -0
- package/dist/browser/layout/MobileShell.js.map +1 -1
- package/dist/browser/layout/index.js +1 -0
- package/dist/browser/layout/index.js.map +1 -1
- package/dist/browser/layout/sheet-handle.js +155 -0
- package/dist/browser/layout/sheet-handle.js.map +1 -0
- package/dist/browser/surfaces/NoticeCard.js +48 -29
- package/dist/browser/surfaces/NoticeCard.js.map +1 -1
- package/dist/ssr/actions/CopyButton.js +13 -8
- package/dist/ssr/actions/CopyButton.js.map +1 -1
- package/dist/ssr/chat/ChatComposer.js +53 -30
- package/dist/ssr/chat/ChatComposer.js.map +1 -1
- package/dist/ssr/chat/chat-messages.js +6 -0
- package/dist/ssr/chat/chat-messages.js.map +1 -1
- package/dist/ssr/chat/types.js.map +1 -1
- package/dist/ssr/content/Calendar.js +36 -4
- package/dist/ssr/content/Calendar.js.map +1 -1
- package/dist/ssr/content/calendar-event-detail.js +212 -0
- package/dist/ssr/content/calendar-event-detail.js.map +1 -0
- package/dist/ssr/content/calendar-messages.js +34 -2
- package/dist/ssr/content/calendar-messages.js.map +1 -1
- package/dist/ssr/content/calendar-shared.js +117 -36
- package/dist/ssr/content/calendar-shared.js.map +1 -1
- package/dist/ssr/content/calendar-time-view.js +6 -4
- package/dist/ssr/content/calendar-time-view.js.map +1 -1
- package/dist/ssr/content/index.js.map +1 -1
- package/dist/ssr/feedback/prompt-confirm.js +7 -4
- package/dist/ssr/feedback/prompt-confirm.js.map +1 -1
- package/dist/ssr/feedback/prompts.js +3 -3
- package/dist/ssr/feedback/prompts.js.map +1 -1
- package/dist/ssr/inputs/NumberInput.js +17 -5
- package/dist/ssr/inputs/NumberInput.js.map +1 -1
- package/dist/ssr/inputs/dictation/Dictation.js +3 -1
- package/dist/ssr/inputs/dictation/Dictation.js.map +1 -1
- package/dist/ssr/inputs/dictation/dictation-messages.js +2 -0
- package/dist/ssr/inputs/dictation/dictation-messages.js.map +1 -1
- package/dist/ssr/layout/AppWorkspace.js +152 -114
- package/dist/ssr/layout/AppWorkspace.js.map +1 -1
- package/dist/ssr/layout/MobileShell.js +26 -0
- package/dist/ssr/layout/MobileShell.js.map +1 -1
- package/dist/ssr/layout/index.js +1 -0
- package/dist/ssr/layout/index.js.map +1 -1
- package/dist/ssr/layout/sheet-handle.js +155 -0
- package/dist/ssr/layout/sheet-handle.js.map +1 -0
- package/dist/ssr/surfaces/NoticeCard.js +25 -10
- package/dist/ssr/surfaces/NoticeCard.js.map +1 -1
- package/dist/styles.css +1 -1
- package/dist/types/chat/chat-messages.d.ts +3 -0
- package/dist/types/chat/types.d.ts +5 -0
- package/dist/types/content/Calendar.d.ts +29 -5
- package/dist/types/content/calendar-event-detail.d.ts +21 -0
- package/dist/types/content/calendar-messages.d.ts +16 -0
- package/dist/types/content/calendar-shared.d.ts +16 -1
- package/dist/types/content/calendar-time-view.d.ts +1 -1
- package/dist/types/content/index.d.ts +1 -1
- package/dist/types/feedback/prompt-confirm.d.ts +3 -1
- package/dist/types/feedback/prompts.d.ts +2 -2
- package/dist/types/inputs/NumberInput.d.ts +1 -1
- package/dist/types/inputs/dictation/dictation-messages.d.ts +1 -0
- package/dist/types/layout/AppWorkspace.d.ts +16 -1
- package/dist/types/layout/MobileShell.d.ts +5 -0
- package/dist/types/layout/index.d.ts +2 -1
- package/dist/types/layout/sheet-handle.d.ts +21 -0
- package/dist/types/surfaces/NoticeCard.d.ts +5 -2
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":[],"sources":["inputs/dictation/Dictation.tsx"],"sourcesContent":["import { createEffect, createSignal, Index, type JSX, Match, onCleanup, Show, Switch } from \"solid-js\";\nimport { Button, IconButton } from \"../../actions/Button\";\nimport { Dropdown } from \"../../actions/Dropdown\";\nimport { useLocale } from \"../../intl/locale\";\nimport { AnchoredPopover } from \"../../layout/AnchoredPopover\";\nimport { type DictationController, type DictationNotice, isBarNotice } from \"./create-dictation\";\nimport { dictationMessages } from \"./dictation-messages\";\nimport type { DictationDevice } from \"./types\";\n\nconst useDictationMessages = () => {\n const locale = useLocale();\n return () => dictationMessages.resolve([locale()]).t;\n};\n\n/** Whether the bar stands in for the host's controls: while dictating, finishing, or showing a bar notice. */\nexport const dictationBarShown = (dictation: DictationController) => dictation.active() || isBarNotice(dictation.notice());\n\nconst clock = (ms: number) => {\n const seconds = Math.max(0, Math.floor(ms / 1000));\n return `${Math.floor(seconds / 60)}:${String(seconds % 60).padStart(2, \"0\")}`;\n};\n\n/** The quiet countdown starts one minute before the end. */\nconst warnMs = 60_000;\n\nconst deviceIcon = (device: DictationDevice | undefined) => {\n const label = device?.label ?? \"\";\n if (/airpods|buds|headset|headphone|kopfhörer/i.test(label)) return \"ti-headphones\";\n if (/iphone|android|phone|handy|mobile/i.test(label)) return \"ti-device-mobile\";\n if (/macbook|laptop|built-in|internal|intern/i.test(label) || !label) return \"ti-device-laptop\";\n return \"ti-microphone\";\n};\n\nexport type DictationButtonProps = {\n dictation: DictationController;\n size?: \"xs\" | \"sm\";\n class?: string;\n /** The box the notice cards line up with, such as the whole composer; defaults to the button. */\n cardAnchor?: () => HTMLElement | undefined;\n};\n\n/**\n * The microphone at its fixed place. A press starts live dictation; offline it stays focusable and says why it waits.\n * Notices that need a decision, such as a blocked microphone or a used-up allowance, open as cards above it.\n */\nexport function DictationButton(props: DictationButtonProps): JSX.Element {\n const t = useDictationMessages();\n const [button, setButton] = createSignal<HTMLButtonElement>();\n const card = () => {\n const notice = props.dictation.notice();\n return notice && !isBarNotice(notice) ? notice : null;\n };\n createEffect(() => props.dictation.bind(\"microphone\", button()));\n onCleanup(() => props.dictation.bind(\"microphone\", undefined));\n return (\n <>\n <IconButton\n ref={setButton}\n size={props.size ?? \"sm\"}\n class={`k2b-dictation-button ${props.class ?? \"\"}`}\n label={props.dictation.offline() ? t().dictateOffline : t().dictate}\n tooltip={props.dictation.offline() ? t().offline : t().dictate}\n aria-pressed={props.dictation.active() ? \"true\" : \"false\"}\n aria-disabled={props.dictation.offline() || (!props.dictation.active() && props.dictation.disabled()) ? \"true\" : undefined}\n data-notice={card()?.kind}\n onClick={() => {\n if (props.dictation.offline() || (!props.dictation.active() && props.dictation.disabled())) return;\n if (props.dictation.active()) void props.dictation.stop();\n else props.dictation.start();\n }}\n >\n <i class={`ti ${card()?.kind === \"blocked\" ? \"ti-microphone-off\" : \"ti-microphone\"}`} aria-hidden=\"true\" />\n </IconButton>\n <Show when={card()}>\n {(notice) => <DictationCard dictation={props.dictation} notice={notice()} anchor={props.cardAnchor?.() ?? button()} />}\n </Show>\n </>\n );\n}\n\nfunction DictationCard(props: { dictation: DictationController; notice: DictationNotice; anchor: HTMLElement | undefined }) {\n const t = useDictationMessages();\n const locale = useLocale();\n const resetTime = () => {\n const notice = props.notice;\n const at = notice.kind === \"quota\" && notice.resetsAt ? new Date(notice.resetsAt) : null;\n const time = (at ?? new Date(new Date().setHours(24, 0, 0, 0))).toLocaleTimeString(locale(), { hour: \"2-digit\", minute: \"2-digit\" });\n const today = new Date();\n const tomorrow = !at || at.toDateString() !== today.toDateString();\n return tomorrow ? t().quotaBodyTomorrow({ time }) : t().quotaBody({ time });\n };\n const content = (): { icon: string; title: string; body: JSX.Element; retry: boolean } => {\n switch (props.notice.kind) {\n case \"blocked\":\n return {\n icon: \"ti-microphone-off\",\n title: t().blockedTitle,\n body: (\n <>\n <p>{t().blockedBody}</p>\n <ol>\n <li>{t().blockedStep1}</li>\n <li>{t().blockedStep2}</li>\n </ol>\n </>\n ),\n retry: true,\n };\n case \"quota\":\n return { icon: \"ti-hourglass\", title: t().quotaTitle, body: <p>{resetTime()}</p>, retry: false };\n case \"overloaded\":\n return {\n icon: \"ti-hourglass\",\n title: t().overloadedTitle,\n body: <p>{props.dictation.alternative?.note ?? t().overloadedBody}</p>,\n retry: true,\n };\n case \"elsewhere\":\n return { icon: \"ti-microphone\", title: t().elsewhereTitle, body: <p>{t().elsewhereBody}</p>, retry: false };\n case \"unavailable\":\n return { icon: \"ti-microphone-off\", title: t().unavailableTitle, body: <p>{t().unavailableBody}</p>, retry: true };\n default:\n return { icon: \"ti-microphone-off\", title: t().notAvailableTitle, body: <p>{t().notAvailableBody}</p>, retry: false };\n }\n };\n return (\n <AnchoredPopover\n anchor={props.anchor}\n onClose={() => props.dictation.dismiss()}\n label={content().title}\n side=\"above\"\n align=\"end\"\n width=\"20rem\"\n sheet={false}\n class=\"k2b-dictation-card\"\n >\n <h3 class=\"k2b-dictation-card__title\">\n <i class={`ti ${content().icon}`} aria-hidden=\"true\" />\n {content().title}\n </h3>\n <div class=\"k2b-dictation-card__body\">{content().body}</div>\n <div class=\"k2b-dictation-card__actions\">\n <Show when={props.notice.kind === \"overloaded\" ? props.dictation.alternative : undefined}>\n {(alternative) => (\n <Button\n size=\"sm\"\n variant=\"ghost\"\n onClick={() => {\n props.dictation.dismiss();\n alternative().run();\n }}\n >\n {alternative().label}\n </Button>\n )}\n </Show>\n <Show\n when={content().retry}\n fallback={\n <Button\n size=\"sm\"\n variant=\"ghost\"\n class={props.notice.kind === \"elsewhere\" ? \"k2b-dictation-card__primary\" : undefined}\n onClick={() => props.dictation.dismiss()}\n >\n {t().ok}\n </Button>\n }\n >\n <Button size=\"sm\" variant=\"ghost\" class=\"k2b-dictation-card__primary\" onClick={() => props.dictation.start()}>\n {t().retry}\n </Button>\n </Show>\n </div>\n </AnchoredPopover>\n );\n}\n\nexport type DictationBarProps = {\n dictation: DictationController;\n class?: string;\n};\n\n/**\n * The row that stands in for the host's controls while dictating, at the same place and height: Discard, level, time,\n * microphone and Stop; then \"Finishing …\" until the last words arrived; and a notice with \"Continue\" when the session\n * ended early. Render it where `dictationBarShown()` is true. Escape stops, after closing an open menu.\n */\nexport function DictationBar(props: DictationBarProps): JSX.Element {\n const t = useDictationMessages();\n const status = () => props.dictation.status();\n const remaining = () => props.dictation.maxMs() - props.dictation.elapsedMs();\n const warning = () => status() === \"live\" && remaining() <= warnMs;\n const time = () => (warning() ? t().timeLeft({ time: clock(remaining()) }) : clock(props.dictation.elapsedMs()));\n const slots = 160;\n const bars = () => {\n const levels = props.dictation.levels();\n return Array.from({ length: slots }, (_, index) => levels[levels.length - slots + index] ?? 0);\n };\n const deviceLabel = () => props.dictation.device()?.label || t().microphone;\n\n const onKey = (event: KeyboardEvent) => {\n if (event.key !== \"Escape\" || event.defaultPrevented || status() !== \"live\") return;\n event.preventDefault();\n void props.dictation.stop();\n };\n createEffect(() => {\n if (status() !== \"live\") return;\n document.addEventListener(\"keydown\", onKey);\n onCleanup(() => document.removeEventListener(\"keydown\", onKey));\n });\n const bindStop = (element: HTMLElement) => {\n props.dictation.bind(\"stop\", element);\n onCleanup(() => props.dictation.bind(\"stop\", undefined));\n };\n const bindContinue = (element: HTMLElement) => {\n props.dictation.bind(\"continue\", element);\n onCleanup(() => props.dictation.bind(\"continue\", undefined));\n };\n\n const deviceItems = () => [\n {\n sectionLabel: t().microphone,\n items: (props.dictation.devices().length\n ? props.dictation.devices()\n : props.dictation.device()\n ? [props.dictation.device()!]\n : []\n ).map((device) => ({\n choice: \"radio\" as const,\n icon: `ti ${deviceIcon(device)}`,\n label: device.id === \"default\" ? `${device.label || t().microphone} · ${t().systemDefault}` : device.label || t().microphone,\n checked: () => (props.dictation.deviceId() ?? props.dictation.device()?.id) === device.id,\n action: () => props.dictation.chooseDevice(device.id),\n })),\n },\n ];\n\n return (\n <div class={`k2b-dictation-bar ${props.class ?? \"\"}`}>\n <Switch>\n <Match when={status() === \"finishing\"}>\n <div class=\"k2b-dictation-bar__row\" data-state=\"finishing\" role=\"group\" aria-label={t().finishingGroup}>\n <IconButton size=\"sm\" label={t().discard} aria-disabled=\"true\" class=\"k2b-dictation-bar__icon\">\n <i class=\"ti ti-x\" aria-hidden=\"true\" />\n </IconButton>\n <div class=\"k2b-dictation-bar__status\" role=\"status\">\n <i class=\"ti ti-loader-2 k2b-spin\" aria-hidden=\"true\" />\n <span class=\"k2b-dictation-bar__message\">{t().finishing}</span>\n </div>\n <span class=\"k2b-dictation-bar__time\">{clock(props.dictation.elapsedMs())}</span>\n <span class=\"k2b-dictation-bar__stop\" data-disabled=\"true\" aria-hidden=\"true\">\n <span />\n </span>\n </div>\n </Match>\n <Match when={status() === \"live\" || status() === \"starting\"}>\n <div class=\"k2b-dictation-bar__row\" data-state={status()} role=\"group\" aria-label={t().running}>\n <IconButton size=\"sm\" label={t().discard} class=\"k2b-dictation-bar__icon\" onClick={() => props.dictation.discard()}>\n <i class=\"ti ti-x\" aria-hidden=\"true\" />\n </IconButton>\n <span class=\"k2b-dictation-bar__dot\" data-live={status() === \"live\" ? \"true\" : undefined} aria-hidden=\"true\" />\n <div class=\"k2b-dictation-bar__wave\" aria-hidden=\"true\">\n <Index each={bars()}>{(level) => <span style={{ \"--k2b-dictation-level\": String(0.1 + level() * 0.9) }} />}</Index>\n </div>\n <span class=\"k2b-dictation-bar__time\" data-warning={warning() ? \"true\" : undefined}>\n {status() === \"starting\" ? clock(0) : time()}\n </span>\n <Dropdown\n items={deviceItems()}\n position=\"top-left\"\n width=\"16.25rem\"\n onOpenChange={(open) => {\n if (open) void props.dictation.loadDevices();\n }}\n >\n <Dropdown.Trigger appearance=\"plain\" class=\"k2b-dictation-bar__device\" label={t().microphoneNamed({ name: deviceLabel() })}>\n <i class={`ti ${deviceIcon(props.dictation.device())}`} aria-hidden=\"true\" />\n <span class=\"k2b-dictation-bar__device-name\">{deviceLabel()}</span>\n <i class=\"ti ti-chevron-down k2b-dictation-bar__device-chevron\" aria-hidden=\"true\" />\n </Dropdown.Trigger>\n </Dropdown>\n <button\n ref={bindStop}\n type=\"button\"\n class=\"k2b-dictation-bar__stop\"\n aria-label={t().stop}\n title={t().stop}\n onClick={() => void props.dictation.stop()}\n >\n <span aria-hidden=\"true\" />\n </button>\n </div>\n </Match>\n <Match when={isBarNotice(props.dictation.notice()) ? props.dictation.notice() : undefined}>\n {(notice) => {\n const ended = () => {\n const value = notice();\n return value.kind === \"ended\" ? value : undefined;\n };\n const minutes = () => Math.round((ended()?.maxMs ?? 600_000) / 60_000);\n const long = () =>\n !ended() ? t().interrupted : ended()!.reason === \"silence\" ? t().silenceDone : t().maxDone({ minutes: minutes() });\n const short = () =>\n !ended()\n ? t().interruptedShort\n : ended()!.reason === \"silence\"\n ? t().silenceDoneShort\n : t().maxDoneShort({ minutes: minutes() });\n return (\n <div class=\"k2b-dictation-bar__row\" data-state=\"notice\">\n <div class=\"k2b-dictation-bar__status\" data-tone={ended() ? undefined : \"danger\"} role=\"status\">\n <i class={`ti ${ended() ? \"ti-clock\" : \"ti-alert-circle\"}`} aria-hidden=\"true\" />\n {/* The full message is read on every width; the visible text shortens on narrow rows. */}\n <span class=\"k2b-sr-only\">{long()}</span>\n <span class=\"k2b-dictation-bar__message k2b-dictation-bar__message--long\" aria-hidden=\"true\">\n {long()}\n </span>\n <span class=\"k2b-dictation-bar__message k2b-dictation-bar__message--short\" aria-hidden=\"true\">\n {short()}\n </span>\n </div>\n <Button\n ref={bindContinue}\n size=\"sm\"\n variant=\"ghost\"\n class=\"k2b-dictation-bar__continue\"\n onClick={() => props.dictation.start()}\n >\n {t().continue}\n </Button>\n <IconButton size=\"sm\" label={t().dismiss} class=\"k2b-dictation-bar__icon\" onClick={() => props.dictation.dismiss()}>\n <i class=\"ti ti-x\" aria-hidden=\"true\" />\n </IconButton>\n </div>\n );\n }}\n </Match>\n </Switch>\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA,SAAS,YAAY,EAAE,YAAY,EAAE,KAAK,EAAY,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,QAAQ,UAAU;AACtG,SAAS,MAAM,EAAE,UAAU,QAAQ,sBAAsB;AACzD,SAAS,QAAQ,QAAQ,wBAAwB;AACjD,SAAS,SAAS,QAAQ,mBAAmB;AAC7C,SAAS,eAAe,QAAQ,8BAA8B;AAC9D,SAAyD,WAAW,QAAQ,oBAAoB;AAChG,SAAS,iBAAiB,QAAQ,sBAAsB;AAGxD,MAAM,oBAAoB,GAAG,MAAM;EACjC,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC;EAC1B,OAAO,MAAM,iBAAiB,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACtD,CAAC;;AAED;AACA,OAAO,MAAM,iBAAiB,GAAI,SAA8B,IAAK,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,WAAW,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;AAE1H,MAAM,KAAK,GAAI,EAAU,IAAK;EAC5B,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC;EAClD,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,IAAI,MAAM,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE;AAC/E,CAAC;;AAED;AACA,MAAM,MAAM,GAAG,MAAM;AAErB,MAAM,UAAU,GAAI,MAAmC,IAAK;EAC1D,MAAM,KAAK,GAAG,MAAM,EAAE,KAAK,IAAI,EAAE;EACjC,IAAI,2CAA2C,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,OAAO,eAAe;EACnF,IAAI,oCAAoC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,OAAO,kBAAkB;EAC/E,IAAI,0CAA0C,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,kBAAkB;EAC/F,OAAO,eAAe;AACxB,CAAC;AAUD;AACA;AACA;AACA;AACA,OAAO,SAAS,eAAe,CAAC,KAA2B,EAAe;EACxE,MAAM,CAAC,GAAG,oBAAoB,CAAC,CAAC;EAChC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,YAAY,CAAoB,CAAC;EAC7D,MAAM,IAAI,GAAG,MAAM;IACjB,MAAM,MAAM,GAAG,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IACvC,OAAO,MAAM,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,GAAG,MAAM,GAAG,IAAI;EACvD,CAAC;EACD,YAAY,CAAC,MAAM,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;EAChE,SAAS,CAAC,MAAM,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;EAC9D,0BAEK,UAAU;IAAA,IAET,IAAI;MAAA,OAAE,KAAK,CAAC,IAAI,IAAI,IAAI;IAAA;IAAA;MAAA,OACjB,wBAAwB,KAAK,CAAC,KAAK,IAAI,EAAE,EAAE;IAAA;IAAA,IAClD,KAAK;MAAA,OAAE,oBAAK,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,MAAG,CAAC,CAAC,CAAC,CAAC,cAAc,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO;IAAA;IAAA,IACnE,OAAO;MAAA,OAAE,oBAAK,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,MAAG,CAAC,CAAC,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO;IAAA;IAAA;MAAA,OAChD,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,GAAG,MAAM,GAAG,OAAO;IAAA;IAAA;MAAA,OAC1C,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,IAAK,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAE,GAAG,MAAM,GAAG,SAAS;IAAA;IAAA;MAAA,OAC7G,IAAI,CAAC,CAAC,EAAE,IAAI;IAAA;IACzB,OAAO,EAAE,MAAM;MACb,IAAI,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,IAAK,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAE,EAAE;MAC5F,IAAI,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,KACrD,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAC9B,CAAC;IAAA;MAAA,qBAES,MAAM,IAAI,CAAC,CAAC,EAAE,IAAI,KAAK,SAAS,GAAG,mBAAmB,GAAG,eAAe,EAAE;IAAA;EAAA,sBAErF,IAAI;IAAA,IAAC,IAAI;MAAA,OAAE,IAAI,CAAC,CAAC;IAAA;IAAA,UACd,MAAM,sBAAM,aAAa;MAAA,IAAC,SAAS;QAAA,OAAE,KAAK,CAAC,SAAS;MAAA;MAAA,IAAE,MAAM;QAAA,OAAE,MAAM,CAAC,CAAC;MAAA;MAAA,IAAE,MAAM;QAAA,OAAE,KAAK,CAAC,UAAU,GAAG,CAAC,IAAI,MAAM,CAAC,CAAC;MAAA;IAAA;EAAI;AAI9H;AAEA,SAAS,aAAa,CAAC,KAAmG,EAAE;EAC1H,MAAM,CAAC,GAAG,oBAAoB,CAAC,CAAC;EAChC,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC;EAC1B,MAAM,SAAS,GAAG,MAAM;IACtB,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM;IAC3B,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,KAAK,OAAO,IAAI,MAAM,CAAC,QAAQ,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,IAAI;IACxF,MAAM,IAAI,GAAG,CAAC,EAAE,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,kBAAkB,CAAC,MAAM,CAAC,CAAC,EAAE;MAAE,IAAI,EAAE,SAAS;MAAE,MAAM,EAAE;IAAU,CAAC,CAAC;IACpI,MAAM,KAAK,GAAG,IAAI,IAAI,CAAC,CAAC;IACxB,MAAM,QAAQ,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC,YAAY,CAAC,CAAC,KAAK,KAAK,CAAC,YAAY,CAAC,CAAC;IAClE,OAAO,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC;MAAE;IAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;MAAE;IAAK,CAAC,CAAC;EAC7E,CAAC;EACD,MAAM,OAAO,GAAG,MAA0E;IACxF,QAAQ,KAAK,CAAC,MAAM,CAAC,IAAI;MACvB,KAAK,SAAS;QACZ,OAAO;UACL,IAAI,EAAE,mBAAmB;UACzB,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,YAAY;UACvB,IAAI,2BAEI,CAAC,CAAC,CAAC,CAAC,WAAW,4BAEZ,CAAC,CAAC,CAAC,CAAC,YAAY,YAChB,CAAC,CAAC,CAAC,CAAC,YAAY,GAG1B;UACD,KAAK,EAAE;QACT,CAAC;MACH,KAAK,OAAO;QACV,OAAO;UAAE,IAAI,EAAE,cAAc;UAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU;UAAE,IAAI,0BAAM,SAAS,CAAC,CAAC,EAAK;UAAE,KAAK,EAAE;QAAM,CAAC;MAClG,KAAK,YAAY;QACf,OAAO;UACL,IAAI,EAAE,cAAc;UACpB,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,eAAe;UAC1B,IAAI,0BAAM,KAAK,CAAC,SAAS,CAAC,WAAW,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,cAAc,EAAK;UACtE,KAAK,EAAE;QACT,CAAC;MACH,KAAK,WAAW;QACd,OAAO;UAAE,IAAI,EAAE,eAAe;UAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,cAAc;UAAE,IAAI,0BAAM,CAAC,CAAC,CAAC,CAAC,aAAa,EAAK;UAAE,KAAK,EAAE;QAAM,CAAC;MAC7G,KAAK,aAAa;QAChB,OAAO;UAAE,IAAI,EAAE,mBAAmB;UAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,gBAAgB;UAAE,IAAI,0BAAM,CAAC,CAAC,CAAC,CAAC,eAAe,EAAK;UAAE,KAAK,EAAE;QAAK,CAAC;MACpH;QACE,OAAO;UAAE,IAAI,EAAE,mBAAmB;UAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,iBAAiB;UAAE,IAAI,0BAAM,CAAC,CAAC,CAAC,CAAC,gBAAgB,EAAK;UAAE,KAAK,EAAE;QAAM,CAAC;IACzH;EACF,CAAC;EACD,yBACG,eAAe;IAAA,IACd,MAAM;MAAA,OAAE,KAAK,CAAC,MAAM;IAAA;IACpB,OAAO,EAAE,MAAM,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IAAA,IACxC,KAAK;MAAA,OAAE,OAAO,CAAC,CAAC,CAAC,KAAK;IAAA;IACtB,IAAI;IACJ,KAAK;IACL,KAAK;IACL,KAAK,EAAE,KAAK;IAAA;IAAA;MAAA,uBAIA,eAAM,OAAO,CAAC,CAAC,CAAC,IAAI,SAAE,WAC/B,OAAO,CAAC,CAAC,CAAC,KAAK,4BAEqB,OAAO,CAAC,CAAC,CAAC,IAAI,8CAElD,IAAI;QAAA,IAAC,IAAI;UAAA,OAAE,kBAAK,CAAC,MAAM,CAAC,IAAI,KAAK,YAAY,MAAG,KAAK,CAAC,SAAS,CAAC,WAAW,GAAG,SAAS;QAAA;QAAA,UACpF,WAAW,sBACV,MAAM;UACL,IAAI;UACJ,OAAO;UACP,OAAO,EAAE,MAAM;YACb,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;YACzB,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;UACrB,CAAC;UAAA;YAAA,OAEA,WAAW,CAAC,CAAC,CAAC,KAAK;UAAA;QAAA;MAEvB,gCAEF,IAAI;QAAA,IACH,IAAI;UAAA,OAAE,OAAO,CAAC,CAAC,CAAC,KAAK;QAAA;QAAA,IACrB,QAAQ;UAAA,yBACL,MAAM;YACL,IAAI;YACJ,OAAO;YAAA;cAAA,OACA,KAAK,CAAC,MAAM,CAAC,IAAI,KAAK,WAAW,GAAG,6BAA6B,GAAG,SAAS;YAAA;YACpF,OAAO,EAAE,MAAM,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;YAAA;cAAA,OAEvC,CAAC,CAAC,CAAC,CAAC,EAAE;YAAA;UAAA;QAAA;QAAA;UAAA,yBAIV,MAAM;YAAC,IAAI;YAAM,OAAO;YAAA;YAA6C,OAAO,EAAE,MAAM,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;YAAA;cAAA,OACzG,CAAC,CAAC,CAAC,CAAC,KAAK;YAAA;UAAA;QAAA;MAAA;IAAA;EAAA;AAMtB;AAOA;AACA;AACA;AACA;AACA;AACA,OAAO,SAAS,YAAY,CAAC,KAAwB,EAAe;EAClE,MAAM,CAAC,GAAG,oBAAoB,CAAC,CAAC;EAChC,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;EAC7C,MAAM,SAAS,GAAG,MAAM,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,GAAG,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;EAC7E,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,CAAC,KAAK,MAAM,IAAI,SAAS,CAAC,CAAC,IAAI,MAAM;EAClE,MAAM,IAAI,GAAG,MAAO,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;IAAE,IAAI,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;EAAE,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAE;EAChH,MAAM,KAAK,GAAG,GAAG;EACjB,MAAM,IAAI,GAAG,MAAM;IACjB,MAAM,MAAM,GAAG,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IACvC,OAAO,KAAK,CAAC,IAAI,CAAC;MAAE,MAAM,EAAE;IAAM,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,KAAK,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC;EAChG,CAAC;EACD,MAAM,WAAW,GAAG,MAAM,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU;EAE3E,MAAM,KAAK,GAAI,KAAoB,IAAK;IACtC,IAAI,KAAK,CAAC,GAAG,KAAK,QAAQ,IAAI,KAAK,CAAC,gBAAgB,IAAI,MAAM,CAAC,CAAC,KAAK,MAAM,EAAE;IAC7E,KAAK,CAAC,cAAc,CAAC,CAAC;IACtB,KAAK,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;EAC7B,CAAC;EACD,YAAY,CAAC,MAAM;IACjB,IAAI,MAAM,CAAC,CAAC,KAAK,MAAM,EAAE;IACzB,QAAQ,CAAC,gBAAgB,CAAC,SAAS,EAAE,KAAK,CAAC;IAC3C,SAAS,CAAC,MAAM,QAAQ,CAAC,mBAAmB,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;EACjE,CAAC,CAAC;EACF,MAAM,QAAQ,GAAI,OAAoB,IAAK;IACzC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC;IACrC,SAAS,CAAC,MAAM,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;EAC1D,CAAC;EACD,MAAM,YAAY,GAAI,OAAoB,IAAK;IAC7C,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC;IACzC,SAAS,CAAC,MAAM,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;EAC9D,CAAC;EAED,MAAM,WAAW,GAAG,MAAM,CACxB;IACE,YAAY,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU;IAC5B,KAAK,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,GACpC,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,GACzB,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,GACtB,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAE,GAC3B,EAAE,EACN,GAAG,CAAE,MAAM,KAAM;MACjB,MAAM,EAAE,OAAgB;MACxB,IAAI,EAAE,MAAM,UAAU,CAAC,MAAM,CAAC,EAAE;MAChC,KAAK,EAAE,MAAM,CAAC,EAAE,KAAK,SAAS,GAAG,GAAG,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,MAAM,CAAC,CAAC,CAAC,CAAC,aAAa,EAAE,GAAG,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU;MAC5H,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,IAAI,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,MAAM,MAAM,CAAC,EAAE;MACzF,MAAM,EAAE,MAAM,KAAK,CAAC,SAAS,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE;IACtD,CAAC,CAAC;EACJ,CAAC,CACF;EAED,uBACc,8BAAqB,KAAK,CAAC,KAAK,IAAI,EAAE,SAAE,6BACjD,MAAM;IAAA;MAAA,0BACJ,KAAK;QAAA,IAAC,IAAI;UAAA,OAAE,MAAM,CAAC,CAAC,KAAK,WAAW;QAAA;QAAA;UAAA,4DACiD,CAAC,CAAC,CAAC,CAAC,cAAc,4CACnG,UAAU;YAAC,IAAI;YAAA,IAAM,KAAK;cAAA,OAAE,CAAC,CAAC,CAAC,CAAC,OAAO;YAAA;YAAA;YAAA;YAAA;cAAA;YAAA;UAAA,cAKI,CAAC,CAAC,CAAC,CAAC,SAAS,YAElB,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC;QAAA;MAAA,sBAM5E,KAAK;QAAA,IAAC,IAAI;UAAA,OAAE,MAAM,CAAC,CAAC,KAAK,MAAM,IAAI,MAAM,CAAC,CAAC,KAAK,UAAU;QAAA;QAAA;UAAA,4DACT,MAAM,CAAC,CAAC,uDAA2B,CAAC,CAAC,CAAC,CAAC,OAAO,4CAC3F,UAAU;YAAC,IAAI;YAAA,IAAM,KAAK;cAAA,OAAE,CAAC,CAAC,CAAC,CAAC,OAAO;YAAA;YAAA;YAAkC,OAAO,EAAE,MAAM,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;YAAA;cAAA;YAAA;UAAA,iCAGlE,MAAM,CAAC,CAAC,KAAK,MAAM,GAAG,MAAM,YAAG,SAAS,4CAErF,KAAK;YAAA,IAAC,IAAI;cAAA,OAAE,IAAI,CAAC,CAAC;YAAA;YAAA,UAAI,KAAK,0EAA6C,MAAM,CAAC,GAAG,GAAG,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC;UAAM,oCAExD,OAAO,CAAC,CAAC,GAAG,MAAM,YAAG,SAAS,iBAC/E,MAAM,CAAC,CAAC,KAAK,UAAU,YAAG,KAAK,CAAC,CAAC,CAAC,aAAG,IAAI,CAAC,CAAC,8BAE7C,QAAQ;YAAA,IACP,KAAK;cAAA,OAAE,WAAW,CAAC,CAAC;YAAA;YACpB,QAAQ;YACR,KAAK;YACL,YAAY,EAAG,IAAI,IAAK;cACtB,IAAI,IAAI,EAAE,KAAK,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;YAC9C,CAAC;YAAA;cAAA,yBAEA,QAAQ,CAAC,OAAO;gBAAC,UAAU;gBAAA;gBAAA,IAA2C,KAAK;kBAAA,OAAE,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC;oBAAE,IAAI,EAAE,WAAW,CAAC;kBAAE,CAAC,CAAC;gBAAA;gBAAA;kBAAA,sBAC9G,eAAM,UAAU,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,SAAE,2BACR,WAAW,CAAC,CAAC;gBAAA;cAAA;YAAA;UAAA,2CAQjD,CAAC,CAAC,CAAC,CAAC,IAAI,mDACb,CAAC,CAAC,CAAC,CAAC,IAAI;QAAA;MAAA,sBAOpB,KAAK;QAAA,IAAC,IAAI;UAAA,OAAE,0BAAW,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,MAAG,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,GAAG,SAAS;QAAA;QAAA,UACrF,MAAM,IAAK;UACX,MAAM,KAAK,GAAG,MAAM;YAClB,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC;YACtB,OAAO,KAAK,CAAC,IAAI,KAAK,OAAO,GAAG,KAAK,GAAG,SAAS;UACnD,CAAC;UACD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,IAAI,OAAO,IAAI,MAAM,CAAC;UACtE,MAAM,IAAI,GAAG,MACX,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,GAAG,KAAK,CAAC,CAAC,CAAE,MAAM,KAAK,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;YAAE,OAAO,EAAE,OAAO,CAAC;UAAE,CAAC,CAAC;UACpH,MAAM,KAAK,GAAG,MACZ,CAAC,KAAK,CAAC,CAAC,GACJ,CAAC,CAAC,CAAC,CAAC,gBAAgB,GACpB,KAAK,CAAC,CAAC,CAAE,MAAM,KAAK,SAAS,GAC3B,CAAC,CAAC,CAAC,CAAC,gBAAgB,GACpB,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC;YAAE,OAAO,EAAE,OAAO,CAAC;UAAE,CAAC,CAAC;UAChD,mDAEsD,KAAK,CAAC,CAAC,YAAG,SAAS,UAAG,QAAQ,UACpE,MAAM,KAAK,CAAC,CAAC,GAAG,UAAU,GAAG,iBAAiB,EAAE,WAE/B,IAAI,CAAC,CAAC,YAE9B,IAAI,CAAC,CAAC,YAGN,KAAK,CAAC,CAAC,8BAGX,MAAM;YAEL,IAAI;YACJ,OAAO;YAAA;YAEP,OAAO,EAAE,MAAM,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;YAAA;cAAA,OAErC,CAAC,CAAC,CAAC,CAAC,QAAQ;YAAA;UAAA,gCAEd,UAAU;YAAC,IAAI;YAAA,IAAM,KAAK;cAAA,OAAE,CAAC,CAAC,CAAC,CAAC,OAAO;YAAA;YAAA;YAAkC,OAAO,EAAE,MAAM,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;YAAA;cAAA;YAAA;UAAA;QAKxH;MAAC;IAAA;EAAA;AAKX","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":[],"sources":["inputs/dictation/Dictation.tsx"],"sourcesContent":["import { createEffect, createSignal, Index, type JSX, Match, onCleanup, Show, Switch } from \"solid-js\";\nimport { Button, IconButton } from \"../../actions/Button\";\nimport { Dropdown } from \"../../actions/Dropdown\";\nimport { useLocale } from \"../../intl/locale\";\nimport { AnchoredPopover } from \"../../layout/AnchoredPopover\";\nimport { type DictationController, type DictationNotice, isBarNotice } from \"./create-dictation\";\nimport { dictationMessages } from \"./dictation-messages\";\nimport type { DictationDevice } from \"./types\";\n\nconst useDictationMessages = () => {\n const locale = useLocale();\n return () => dictationMessages.resolve([locale()]).t;\n};\n\n/** Whether the bar stands in for the host's controls: while dictating, finishing, or showing a bar notice. */\nexport const dictationBarShown = (dictation: DictationController) => dictation.active() || isBarNotice(dictation.notice());\n\nconst clock = (ms: number) => {\n const seconds = Math.max(0, Math.floor(ms / 1000));\n return `${Math.floor(seconds / 60)}:${String(seconds % 60).padStart(2, \"0\")}`;\n};\n\n/** The quiet countdown starts one minute before the end. */\nconst warnMs = 60_000;\n\nconst deviceIcon = (device: DictationDevice | undefined) => {\n const label = device?.label ?? \"\";\n if (/airpods|buds|headset|headphone|kopfhörer/i.test(label)) return \"ti-headphones\";\n if (/iphone|android|phone|handy|mobile/i.test(label)) return \"ti-device-mobile\";\n if (/macbook|laptop|built-in|internal|intern/i.test(label) || !label) return \"ti-device-laptop\";\n return \"ti-microphone\";\n};\n\nexport type DictationButtonProps = {\n dictation: DictationController;\n size?: \"xs\" | \"sm\";\n class?: string;\n /** The box the notice cards line up with, such as the whole composer; defaults to the button. */\n cardAnchor?: () => HTMLElement | undefined;\n};\n\n/**\n * The microphone at its fixed place. A press starts live dictation; offline it stays focusable and says why it waits.\n * Notices that need a decision, such as a blocked microphone or a used-up allowance, open as cards above it.\n */\nexport function DictationButton(props: DictationButtonProps): JSX.Element {\n const t = useDictationMessages();\n const [button, setButton] = createSignal<HTMLButtonElement>();\n const card = () => {\n const notice = props.dictation.notice();\n return notice && !isBarNotice(notice) ? notice : null;\n };\n createEffect(() => props.dictation.bind(\"microphone\", button()));\n onCleanup(() => props.dictation.bind(\"microphone\", undefined));\n return (\n <>\n <IconButton\n ref={setButton}\n size={props.size ?? \"sm\"}\n class={`k2b-dictation-button ${props.class ?? \"\"}`}\n label={props.dictation.offline() ? t().dictateOffline : t().dictate}\n tooltip={props.dictation.offline() ? t().offline : t().dictate}\n aria-pressed={props.dictation.active() ? \"true\" : \"false\"}\n aria-disabled={props.dictation.offline() || (!props.dictation.active() && props.dictation.disabled()) ? \"true\" : undefined}\n data-notice={card()?.kind}\n onClick={() => {\n if (props.dictation.offline() || (!props.dictation.active() && props.dictation.disabled())) return;\n if (props.dictation.active()) void props.dictation.stop();\n else props.dictation.start();\n }}\n >\n <i class={`ti ${card()?.kind === \"blocked\" ? \"ti-microphone-off\" : \"ti-microphone\"}`} aria-hidden=\"true\" />\n </IconButton>\n <Show when={card()}>\n {(notice) => <DictationCard dictation={props.dictation} notice={notice()} anchor={props.cardAnchor?.() ?? button()} />}\n </Show>\n </>\n );\n}\n\nfunction DictationCard(props: { dictation: DictationController; notice: DictationNotice; anchor: HTMLElement | undefined }) {\n const t = useDictationMessages();\n const locale = useLocale();\n const resetTime = () => {\n const notice = props.notice;\n const at = notice.kind === \"quota\" && notice.resetsAt ? new Date(notice.resetsAt) : null;\n const time = (at ?? new Date(new Date().setHours(24, 0, 0, 0))).toLocaleTimeString(locale(), { hour: \"2-digit\", minute: \"2-digit\" });\n const today = new Date();\n const tomorrow = !at || at.toDateString() !== today.toDateString();\n return tomorrow ? t().quotaBodyTomorrow({ time }) : t().quotaBody({ time });\n };\n const content = (): { icon: string; title: string; body: JSX.Element; retry: boolean } => {\n switch (props.notice.kind) {\n case \"blocked\":\n return {\n icon: \"ti-microphone-off\",\n title: t().blockedTitle,\n // An installed app has no address bar, and where a device keeps the app's permissions differs, so its\n // card names no path.\n body: matchMedia(\"(display-mode: standalone)\").matches ? (\n <p>{t().blockedApp}</p>\n ) : (\n <>\n <p>{t().blockedBody}</p>\n <ol>\n <li>{t().blockedStep1}</li>\n <li>{t().blockedStep2}</li>\n </ol>\n </>\n ),\n retry: true,\n };\n case \"quota\":\n return { icon: \"ti-hourglass\", title: t().quotaTitle, body: <p>{resetTime()}</p>, retry: false };\n case \"overloaded\":\n return {\n icon: \"ti-hourglass\",\n title: t().overloadedTitle,\n body: <p>{props.dictation.alternative?.note ?? t().overloadedBody}</p>,\n retry: true,\n };\n case \"elsewhere\":\n return { icon: \"ti-microphone\", title: t().elsewhereTitle, body: <p>{t().elsewhereBody}</p>, retry: false };\n case \"unavailable\":\n return { icon: \"ti-microphone-off\", title: t().unavailableTitle, body: <p>{t().unavailableBody}</p>, retry: true };\n default:\n return { icon: \"ti-microphone-off\", title: t().notAvailableTitle, body: <p>{t().notAvailableBody}</p>, retry: false };\n }\n };\n return (\n <AnchoredPopover\n anchor={props.anchor}\n onClose={() => props.dictation.dismiss()}\n label={content().title}\n side=\"above\"\n align=\"end\"\n width=\"20rem\"\n sheet={false}\n class=\"k2b-dictation-card\"\n >\n <h3 class=\"k2b-dictation-card__title\">\n <i class={`ti ${content().icon}`} aria-hidden=\"true\" />\n {content().title}\n </h3>\n <div class=\"k2b-dictation-card__body\">{content().body}</div>\n <div class=\"k2b-dictation-card__actions\">\n <Show when={props.notice.kind === \"overloaded\" ? props.dictation.alternative : undefined}>\n {(alternative) => (\n <Button\n size=\"sm\"\n variant=\"ghost\"\n onClick={() => {\n props.dictation.dismiss();\n alternative().run();\n }}\n >\n {alternative().label}\n </Button>\n )}\n </Show>\n <Show\n when={content().retry}\n fallback={\n <Button\n size=\"sm\"\n variant=\"ghost\"\n class={props.notice.kind === \"elsewhere\" ? \"k2b-dictation-card__primary\" : undefined}\n onClick={() => props.dictation.dismiss()}\n >\n {t().ok}\n </Button>\n }\n >\n <Button size=\"sm\" variant=\"ghost\" class=\"k2b-dictation-card__primary\" onClick={() => props.dictation.start()}>\n {t().retry}\n </Button>\n </Show>\n </div>\n </AnchoredPopover>\n );\n}\n\nexport type DictationBarProps = {\n dictation: DictationController;\n class?: string;\n};\n\n/**\n * The row that stands in for the host's controls while dictating, at the same place and height: Discard, level, time,\n * microphone and Stop; then \"Finishing …\" until the last words arrived; and a notice with \"Continue\" when the session\n * ended early. Render it where `dictationBarShown()` is true. Escape stops, after closing an open menu.\n */\nexport function DictationBar(props: DictationBarProps): JSX.Element {\n const t = useDictationMessages();\n const status = () => props.dictation.status();\n const remaining = () => props.dictation.maxMs() - props.dictation.elapsedMs();\n const warning = () => status() === \"live\" && remaining() <= warnMs;\n const time = () => (warning() ? t().timeLeft({ time: clock(remaining()) }) : clock(props.dictation.elapsedMs()));\n const slots = 160;\n const bars = () => {\n const levels = props.dictation.levels();\n return Array.from({ length: slots }, (_, index) => levels[levels.length - slots + index] ?? 0);\n };\n const deviceLabel = () => props.dictation.device()?.label || t().microphone;\n\n const onKey = (event: KeyboardEvent) => {\n if (event.key !== \"Escape\" || event.defaultPrevented || status() !== \"live\") return;\n event.preventDefault();\n void props.dictation.stop();\n };\n createEffect(() => {\n if (status() !== \"live\") return;\n document.addEventListener(\"keydown\", onKey);\n onCleanup(() => document.removeEventListener(\"keydown\", onKey));\n });\n const bindStop = (element: HTMLElement) => {\n props.dictation.bind(\"stop\", element);\n onCleanup(() => props.dictation.bind(\"stop\", undefined));\n };\n const bindContinue = (element: HTMLElement) => {\n props.dictation.bind(\"continue\", element);\n onCleanup(() => props.dictation.bind(\"continue\", undefined));\n };\n\n const deviceItems = () => [\n {\n sectionLabel: t().microphone,\n items: (props.dictation.devices().length\n ? props.dictation.devices()\n : props.dictation.device()\n ? [props.dictation.device()!]\n : []\n ).map((device) => ({\n choice: \"radio\" as const,\n icon: `ti ${deviceIcon(device)}`,\n label: device.id === \"default\" ? `${device.label || t().microphone} · ${t().systemDefault}` : device.label || t().microphone,\n checked: () => (props.dictation.deviceId() ?? props.dictation.device()?.id) === device.id,\n action: () => props.dictation.chooseDevice(device.id),\n })),\n },\n ];\n\n return (\n <div class={`k2b-dictation-bar ${props.class ?? \"\"}`}>\n <Switch>\n <Match when={status() === \"finishing\"}>\n <div class=\"k2b-dictation-bar__row\" data-state=\"finishing\" role=\"group\" aria-label={t().finishingGroup}>\n <IconButton size=\"sm\" label={t().discard} aria-disabled=\"true\" class=\"k2b-dictation-bar__icon\">\n <i class=\"ti ti-x\" aria-hidden=\"true\" />\n </IconButton>\n <div class=\"k2b-dictation-bar__status\" role=\"status\">\n <i class=\"ti ti-loader-2 k2b-spin\" aria-hidden=\"true\" />\n <span class=\"k2b-dictation-bar__message\">{t().finishing}</span>\n </div>\n <span class=\"k2b-dictation-bar__time\">{clock(props.dictation.elapsedMs())}</span>\n <span class=\"k2b-dictation-bar__stop\" data-disabled=\"true\" aria-hidden=\"true\">\n <span />\n </span>\n </div>\n </Match>\n <Match when={status() === \"live\" || status() === \"starting\"}>\n <div class=\"k2b-dictation-bar__row\" data-state={status()} role=\"group\" aria-label={t().running}>\n <IconButton size=\"sm\" label={t().discard} class=\"k2b-dictation-bar__icon\" onClick={() => props.dictation.discard()}>\n <i class=\"ti ti-x\" aria-hidden=\"true\" />\n </IconButton>\n <span class=\"k2b-dictation-bar__dot\" data-live={status() === \"live\" ? \"true\" : undefined} aria-hidden=\"true\" />\n <div class=\"k2b-dictation-bar__wave\" aria-hidden=\"true\">\n <Index each={bars()}>{(level) => <span style={{ \"--k2b-dictation-level\": String(0.1 + level() * 0.9) }} />}</Index>\n </div>\n <span class=\"k2b-dictation-bar__time\" data-warning={warning() ? \"true\" : undefined}>\n {status() === \"starting\" ? clock(0) : time()}\n </span>\n <Dropdown\n items={deviceItems()}\n position=\"top-left\"\n width=\"16.25rem\"\n onOpenChange={(open) => {\n if (open) void props.dictation.loadDevices();\n }}\n >\n <Dropdown.Trigger appearance=\"plain\" class=\"k2b-dictation-bar__device\" label={t().microphoneNamed({ name: deviceLabel() })}>\n <i class={`ti ${deviceIcon(props.dictation.device())}`} aria-hidden=\"true\" />\n <span class=\"k2b-dictation-bar__device-name\">{deviceLabel()}</span>\n <i class=\"ti ti-chevron-down k2b-dictation-bar__device-chevron\" aria-hidden=\"true\" />\n </Dropdown.Trigger>\n </Dropdown>\n <button\n ref={bindStop}\n type=\"button\"\n class=\"k2b-dictation-bar__stop\"\n aria-label={t().stop}\n title={t().stop}\n onClick={() => void props.dictation.stop()}\n >\n <span aria-hidden=\"true\" />\n </button>\n </div>\n </Match>\n <Match when={isBarNotice(props.dictation.notice()) ? props.dictation.notice() : undefined}>\n {(notice) => {\n const ended = () => {\n const value = notice();\n return value.kind === \"ended\" ? value : undefined;\n };\n const minutes = () => Math.round((ended()?.maxMs ?? 600_000) / 60_000);\n const long = () =>\n !ended() ? t().interrupted : ended()!.reason === \"silence\" ? t().silenceDone : t().maxDone({ minutes: minutes() });\n const short = () =>\n !ended()\n ? t().interruptedShort\n : ended()!.reason === \"silence\"\n ? t().silenceDoneShort\n : t().maxDoneShort({ minutes: minutes() });\n return (\n <div class=\"k2b-dictation-bar__row\" data-state=\"notice\">\n <div class=\"k2b-dictation-bar__status\" data-tone={ended() ? undefined : \"danger\"} role=\"status\">\n <i class={`ti ${ended() ? \"ti-clock\" : \"ti-alert-circle\"}`} aria-hidden=\"true\" />\n {/* The full message is read on every width; the visible text shortens on narrow rows. */}\n <span class=\"k2b-sr-only\">{long()}</span>\n <span class=\"k2b-dictation-bar__message k2b-dictation-bar__message--long\" aria-hidden=\"true\">\n {long()}\n </span>\n <span class=\"k2b-dictation-bar__message k2b-dictation-bar__message--short\" aria-hidden=\"true\">\n {short()}\n </span>\n </div>\n <Button\n ref={bindContinue}\n size=\"sm\"\n variant=\"ghost\"\n class=\"k2b-dictation-bar__continue\"\n onClick={() => props.dictation.start()}\n >\n {t().continue}\n </Button>\n <IconButton size=\"sm\" label={t().dismiss} class=\"k2b-dictation-bar__icon\" onClick={() => props.dictation.dismiss()}>\n <i class=\"ti ti-x\" aria-hidden=\"true\" />\n </IconButton>\n </div>\n );\n }}\n </Match>\n </Switch>\n </div>\n );\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -35,6 +35,7 @@ export const dictationMessages = i18n.define({
|
|
|
35
35
|
blockedBody: "The browser does not let this page use the microphone. To allow it:",
|
|
36
36
|
blockedStep1: "Tap the lock on the left of the address bar.",
|
|
37
37
|
blockedStep2: "Choose “Allow” for “Microphone”.",
|
|
38
|
+
blockedApp: "This app may not use the microphone. Allow the microphone for it, then try again.",
|
|
38
39
|
retry: "Try again",
|
|
39
40
|
quotaTitle: "Your dictation allowance for today is used up",
|
|
40
41
|
quotaBody: ({
|
|
@@ -89,6 +90,7 @@ export const dictationMessages = i18n.define({
|
|
|
89
90
|
blockedBody: "Der Browser lässt diese Seite nicht an das Mikrofon. So erlaubst du es:",
|
|
90
91
|
blockedStep1: "Links in der Adressleiste auf das Schloss tippen.",
|
|
91
92
|
blockedStep2: "Bei „Mikrofon“ „Erlauben“ wählen.",
|
|
93
|
+
blockedApp: "Diese App darf das Mikrofon nicht nutzen. Erlaube ihr das Mikrofon und versuche es dann erneut.",
|
|
92
94
|
retry: "Erneut versuchen",
|
|
93
95
|
quotaTitle: "Dein Diktat-Kontingent für heute ist aufgebraucht",
|
|
94
96
|
quotaBody: ({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":[],"sources":["inputs/dictation/dictation-messages.ts"],"sourcesContent":["import { i18n } from \"@k2b/stdlib\";\n\nexport const dictationMessages = i18n.define({\n baseLocale: \"en\",\n messages: {\n en: {\n dictate: \"Dictate\",\n dictateOffline: \"Dictate, not available offline\",\n offline: \"Offline. Dictation needs a connection.\",\n discard: \"Discard dictation\",\n stop: \"Stop dictation\",\n running: \"Dictating\",\n finishingGroup: \"Finishing dictation\",\n finishing: \"Finishing …\",\n starting: \"Starting …\",\n ended: \"Dictation ended\",\n discarded: \"Dictation discarded\",\n microphone: \"Microphone\",\n microphoneNamed: ({ name }: { name: string }) => `Microphone: ${name}`,\n systemDefault: \"Default\",\n interrupted: \"Dictation interrupted. The text so far stays.\",\n interruptedShort: \"Interrupted. Text stays.\",\n maxDone: ({ minutes }: { minutes: number }) => `Ended after ${minutes} minutes. The text stays.`,\n maxDoneShort: ({ minutes }: { minutes: number }) => `Ended after ${minutes} min.`,\n silenceDone: \"Ended after a long silence. The text stays.\",\n silenceDoneShort: \"Ended after silence.\",\n continue: \"Continue dictating\",\n dismiss: \"Close notice\",\n blockedTitle: \"Microphone blocked\",\n blockedBody: \"The browser does not let this page use the microphone. To allow it:\",\n blockedStep1: \"Tap the lock on the left of the address bar.\",\n blockedStep2: \"Choose “Allow” for “Microphone”.\",\n retry: \"Try again\",\n quotaTitle: \"Your dictation allowance for today is used up\",\n quotaBody: ({ time }: { time: string }) => `You can dictate again from ${time}. Typing works as always.`,\n quotaBodyTomorrow: ({ time }: { time: string }) => `You can dictate again from tomorrow, ${time}. Typing works as always.`,\n overloadedTitle: \"Live dictation is busy right now\",\n overloadedBody: \"Try again in a moment.\",\n elsewhereTitle: \"You are dictating in another tab\",\n elsewhereBody: \"End it there, then you can dictate here.\",\n unavailableTitle: \"No microphone found\",\n unavailableBody: \"Connect a microphone or choose another one, then try again.\",\n notAvailableTitle: \"Dictation is not available here\",\n notAvailableBody: \"Typing works as always.\",\n ok: \"OK\",\n timeLeft: ({ time }: { time: string }) => `${time} left`,\n },\n de: {\n dictate: \"Diktieren\",\n dictateOffline: \"Diktieren, offline nicht verfügbar\",\n offline: \"Offline. Diktieren braucht eine Verbindung.\",\n discard: \"Diktat verwerfen\",\n stop: \"Diktat beenden\",\n running: \"Diktat läuft\",\n finishingGroup: \"Diktat wird abgeschlossen\",\n finishing: \"Wird abgeschlossen …\",\n starting: \"Wird gestartet …\",\n ended: \"Diktat beendet\",\n discarded: \"Diktat verworfen\",\n microphone: \"Mikrofon\",\n microphoneNamed: ({ name }: { name: string }) => `Mikrofon: ${name}`,\n systemDefault: \"Standard\",\n interrupted: \"Diktat unterbrochen. Der Text bis hier bleibt.\",\n interruptedShort: \"Unterbrochen. Text bleibt.\",\n maxDone: ({ minutes }: { minutes: number }) => `Nach ${minutes} Minuten beendet. Der Text bleibt.`,\n maxDoneShort: ({ minutes }: { minutes: number }) => `Nach ${minutes} Min. beendet.`,\n silenceDone: \"Nach langer Stille beendet. Der Text bleibt.\",\n silenceDoneShort: \"Nach Stille beendet.\",\n continue: \"Weiter diktieren\",\n dismiss: \"Hinweis schließen\",\n blockedTitle: \"Mikrofon blockiert\",\n blockedBody: \"Der Browser lässt diese Seite nicht an das Mikrofon. So erlaubst du es:\",\n blockedStep1: \"Links in der Adressleiste auf das Schloss tippen.\",\n blockedStep2: \"Bei „Mikrofon“ „Erlauben“ wählen.\",\n retry: \"Erneut versuchen\",\n quotaTitle: \"Dein Diktat-Kontingent für heute ist aufgebraucht\",\n quotaBody: ({ time }: { time: string }) => `Ab ${time} kannst du wieder diktieren. Tippen geht natürlich weiter.`,\n quotaBodyTomorrow: ({ time }: { time: string }) => `Ab morgen, ${time}, kannst du wieder diktieren. Tippen geht natürlich weiter.`,\n overloadedTitle: \"Live-Diktat ist gerade ausgelastet\",\n overloadedBody: \"Versuch es in einem Moment noch mal.\",\n elsewhereTitle: \"Du diktierst gerade in einem anderen Tab\",\n elsewhereBody: \"Beende es dort, dann kannst du hier diktieren.\",\n unavailableTitle: \"Kein Mikrofon gefunden\",\n unavailableBody: \"Schließ ein Mikrofon an oder wähl ein anderes, dann versuch es noch mal.\",\n notAvailableTitle: \"Diktieren ist hier nicht verfügbar\",\n notAvailableBody: \"Tippen geht natürlich weiter.\",\n ok: \"OK\",\n timeLeft: ({ time }: { time: string }) => `noch ${time}`,\n },\n },\n});\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":[],"sources":["inputs/dictation/dictation-messages.ts"],"sourcesContent":["import { i18n } from \"@k2b/stdlib\";\n\nexport const dictationMessages = i18n.define({\n baseLocale: \"en\",\n messages: {\n en: {\n dictate: \"Dictate\",\n dictateOffline: \"Dictate, not available offline\",\n offline: \"Offline. Dictation needs a connection.\",\n discard: \"Discard dictation\",\n stop: \"Stop dictation\",\n running: \"Dictating\",\n finishingGroup: \"Finishing dictation\",\n finishing: \"Finishing …\",\n starting: \"Starting …\",\n ended: \"Dictation ended\",\n discarded: \"Dictation discarded\",\n microphone: \"Microphone\",\n microphoneNamed: ({ name }: { name: string }) => `Microphone: ${name}`,\n systemDefault: \"Default\",\n interrupted: \"Dictation interrupted. The text so far stays.\",\n interruptedShort: \"Interrupted. Text stays.\",\n maxDone: ({ minutes }: { minutes: number }) => `Ended after ${minutes} minutes. The text stays.`,\n maxDoneShort: ({ minutes }: { minutes: number }) => `Ended after ${minutes} min.`,\n silenceDone: \"Ended after a long silence. The text stays.\",\n silenceDoneShort: \"Ended after silence.\",\n continue: \"Continue dictating\",\n dismiss: \"Close notice\",\n blockedTitle: \"Microphone blocked\",\n blockedBody: \"The browser does not let this page use the microphone. To allow it:\",\n blockedStep1: \"Tap the lock on the left of the address bar.\",\n blockedStep2: \"Choose “Allow” for “Microphone”.\",\n blockedApp: \"This app may not use the microphone. Allow the microphone for it, then try again.\",\n retry: \"Try again\",\n quotaTitle: \"Your dictation allowance for today is used up\",\n quotaBody: ({ time }: { time: string }) => `You can dictate again from ${time}. Typing works as always.`,\n quotaBodyTomorrow: ({ time }: { time: string }) => `You can dictate again from tomorrow, ${time}. Typing works as always.`,\n overloadedTitle: \"Live dictation is busy right now\",\n overloadedBody: \"Try again in a moment.\",\n elsewhereTitle: \"You are dictating in another tab\",\n elsewhereBody: \"End it there, then you can dictate here.\",\n unavailableTitle: \"No microphone found\",\n unavailableBody: \"Connect a microphone or choose another one, then try again.\",\n notAvailableTitle: \"Dictation is not available here\",\n notAvailableBody: \"Typing works as always.\",\n ok: \"OK\",\n timeLeft: ({ time }: { time: string }) => `${time} left`,\n },\n de: {\n dictate: \"Diktieren\",\n dictateOffline: \"Diktieren, offline nicht verfügbar\",\n offline: \"Offline. Diktieren braucht eine Verbindung.\",\n discard: \"Diktat verwerfen\",\n stop: \"Diktat beenden\",\n running: \"Diktat läuft\",\n finishingGroup: \"Diktat wird abgeschlossen\",\n finishing: \"Wird abgeschlossen …\",\n starting: \"Wird gestartet …\",\n ended: \"Diktat beendet\",\n discarded: \"Diktat verworfen\",\n microphone: \"Mikrofon\",\n microphoneNamed: ({ name }: { name: string }) => `Mikrofon: ${name}`,\n systemDefault: \"Standard\",\n interrupted: \"Diktat unterbrochen. Der Text bis hier bleibt.\",\n interruptedShort: \"Unterbrochen. Text bleibt.\",\n maxDone: ({ minutes }: { minutes: number }) => `Nach ${minutes} Minuten beendet. Der Text bleibt.`,\n maxDoneShort: ({ minutes }: { minutes: number }) => `Nach ${minutes} Min. beendet.`,\n silenceDone: \"Nach langer Stille beendet. Der Text bleibt.\",\n silenceDoneShort: \"Nach Stille beendet.\",\n continue: \"Weiter diktieren\",\n dismiss: \"Hinweis schließen\",\n blockedTitle: \"Mikrofon blockiert\",\n blockedBody: \"Der Browser lässt diese Seite nicht an das Mikrofon. So erlaubst du es:\",\n blockedStep1: \"Links in der Adressleiste auf das Schloss tippen.\",\n blockedStep2: \"Bei „Mikrofon“ „Erlauben“ wählen.\",\n blockedApp: \"Diese App darf das Mikrofon nicht nutzen. Erlaube ihr das Mikrofon und versuche es dann erneut.\",\n retry: \"Erneut versuchen\",\n quotaTitle: \"Dein Diktat-Kontingent für heute ist aufgebraucht\",\n quotaBody: ({ time }: { time: string }) => `Ab ${time} kannst du wieder diktieren. Tippen geht natürlich weiter.`,\n quotaBodyTomorrow: ({ time }: { time: string }) => `Ab morgen, ${time}, kannst du wieder diktieren. Tippen geht natürlich weiter.`,\n overloadedTitle: \"Live-Diktat ist gerade ausgelastet\",\n overloadedBody: \"Versuch es in einem Moment noch mal.\",\n elsewhereTitle: \"Du diktierst gerade in einem anderen Tab\",\n elsewhereBody: \"Beende es dort, dann kannst du hier diktieren.\",\n unavailableTitle: \"Kein Mikrofon gefunden\",\n unavailableBody: \"Schließ ein Mikrofon an oder wähl ein anderes, dann versuch es noch mal.\",\n notAvailableTitle: \"Diktieren ist hier nicht verfügbar\",\n notAvailableBody: \"Tippen geht natürlich weiter.\",\n ok: \"OK\",\n timeLeft: ({ time }: { time: string }) => `noch ${time}`,\n },\n },\n});\n"],"mappings":"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","ignoreList":[]}
|