@k2b/ui 0.39.0 → 0.41.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/chat/ChatComposer.js +759 -570
- package/dist/browser/chat/ChatComposer.js.map +1 -1
- package/dist/browser/inputs/ChoiceGroups.js +30 -18
- package/dist/browser/inputs/ChoiceGroups.js.map +1 -1
- package/dist/browser/inputs/Select.js +32 -19
- package/dist/browser/inputs/Select.js.map +1 -1
- package/dist/browser/inputs/SpecialInputs.js +54 -25
- package/dist/browser/inputs/SpecialInputs.js.map +1 -1
- package/dist/browser/inputs/choice.js +4 -1
- package/dist/browser/inputs/choice.js.map +1 -1
- package/dist/browser/inputs/dictation/Dictation.js +546 -0
- package/dist/browser/inputs/dictation/Dictation.js.map +1 -0
- package/dist/browser/inputs/dictation/create-dictation.js +324 -0
- package/dist/browser/inputs/dictation/create-dictation.js.map +1 -0
- package/dist/browser/inputs/dictation/dictation-messages.js +115 -0
- package/dist/browser/inputs/dictation/dictation-messages.js.map +1 -0
- package/dist/browser/inputs/dictation/text-dictation.js +152 -0
- package/dist/browser/inputs/dictation/text-dictation.js.map +1 -0
- package/dist/browser/inputs/dictation/types.js +2 -0
- package/dist/browser/inputs/dictation/types.js.map +1 -0
- package/dist/browser/inputs/icon-messages.js +29 -2
- package/dist/browser/inputs/icon-messages.js.map +1 -1
- package/dist/browser/inputs/icon-texts.js +172 -0
- package/dist/browser/inputs/icon-texts.js.map +1 -0
- package/dist/browser/inputs/index.js +2 -0
- package/dist/browser/inputs/index.js.map +1 -1
- package/dist/browser/layout/AnchoredPopover.js +1 -1
- package/dist/browser/layout/AnchoredPopover.js.map +1 -1
- package/dist/browser/layout/AppWorkspace.js +31 -17
- package/dist/browser/layout/AppWorkspace.js.map +1 -1
- package/dist/browser/layout/SettingsModal.js +10 -5
- package/dist/browser/layout/SettingsModal.js.map +1 -1
- package/dist/browser/layout/app-workspace-controller.js +49 -5
- package/dist/browser/layout/app-workspace-controller.js.map +1 -1
- package/dist/browser/text-editor/TextEditor.js +74 -25
- package/dist/browser/text-editor/TextEditor.js.map +1 -1
- package/dist/browser/text-editor/dictation.js +166 -0
- package/dist/browser/text-editor/dictation.js.map +1 -0
- package/dist/browser/text-editor.js +1 -0
- package/dist/browser/text-editor.js.map +1 -1
- package/dist/ssr/chat/ChatComposer.js +271 -99
- package/dist/ssr/chat/ChatComposer.js.map +1 -1
- package/dist/ssr/inputs/ChoiceGroups.js +12 -3
- package/dist/ssr/inputs/ChoiceGroups.js.map +1 -1
- package/dist/ssr/inputs/Select.js +8 -2
- package/dist/ssr/inputs/Select.js.map +1 -1
- package/dist/ssr/inputs/SpecialInputs.js +54 -25
- package/dist/ssr/inputs/SpecialInputs.js.map +1 -1
- package/dist/ssr/inputs/choice.js +4 -1
- package/dist/ssr/inputs/choice.js.map +1 -1
- package/dist/ssr/inputs/dictation/Dictation.js +386 -0
- package/dist/ssr/inputs/dictation/Dictation.js.map +1 -0
- package/dist/ssr/inputs/dictation/create-dictation.js +324 -0
- package/dist/ssr/inputs/dictation/create-dictation.js.map +1 -0
- package/dist/ssr/inputs/dictation/dictation-messages.js +115 -0
- package/dist/ssr/inputs/dictation/dictation-messages.js.map +1 -0
- package/dist/ssr/inputs/dictation/text-dictation.js +152 -0
- package/dist/ssr/inputs/dictation/text-dictation.js.map +1 -0
- package/dist/ssr/inputs/dictation/types.js +2 -0
- package/dist/ssr/inputs/dictation/types.js.map +1 -0
- package/dist/ssr/inputs/icon-messages.js +29 -2
- package/dist/ssr/inputs/icon-messages.js.map +1 -1
- package/dist/ssr/inputs/icon-texts.js +172 -0
- package/dist/ssr/inputs/icon-texts.js.map +1 -0
- package/dist/ssr/inputs/index.js +2 -0
- package/dist/ssr/inputs/index.js.map +1 -1
- package/dist/ssr/layout/AnchoredPopover.js +1 -1
- package/dist/ssr/layout/AnchoredPopover.js.map +1 -1
- package/dist/ssr/layout/AppWorkspace.js +31 -17
- package/dist/ssr/layout/AppWorkspace.js.map +1 -1
- package/dist/ssr/layout/SettingsModal.js +10 -5
- package/dist/ssr/layout/SettingsModal.js.map +1 -1
- package/dist/ssr/layout/app-workspace-controller.js +49 -5
- package/dist/ssr/layout/app-workspace-controller.js.map +1 -1
- package/dist/ssr/text-editor/TextEditor.js +74 -25
- package/dist/ssr/text-editor/TextEditor.js.map +1 -1
- package/dist/ssr/text-editor/dictation.js +166 -0
- package/dist/ssr/text-editor/dictation.js.map +1 -0
- package/dist/ssr/text-editor.js +1 -0
- package/dist/ssr/text-editor.js.map +1 -1
- package/dist/styles.css +1 -1
- package/dist/types/chat/ChatComposer.d.ts +9 -0
- package/dist/types/inputs/SpecialInputs.d.ts +8 -0
- package/dist/types/inputs/dictation/Dictation.d.ts +26 -0
- package/dist/types/inputs/dictation/create-dictation.d.ts +77 -0
- package/dist/types/inputs/dictation/dictation-messages.d.ts +54 -0
- package/dist/types/inputs/dictation/text-dictation.d.ts +36 -0
- package/dist/types/inputs/dictation/types.d.ts +74 -0
- package/dist/types/inputs/icon-messages.d.ts +14 -0
- package/dist/types/inputs/icon-texts.d.ts +13 -0
- package/dist/types/inputs/index.d.ts +5 -0
- package/dist/types/layout/AnchoredPopover.d.ts +5 -0
- package/dist/types/layout/AppWorkspace.d.ts +14 -0
- package/dist/types/layout/app-workspace-controller.d.ts +2 -0
- package/dist/types/text-editor/TextEditor.d.ts +10 -1
- package/dist/types/text-editor/dictation.d.ts +20 -0
- package/dist/types/text-editor.d.ts +1 -0
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":[],"sources":["inputs/choice.ts"],"sourcesContent":["import { createEffect, createSignal, onCleanup, type Setter } from \"solid-js\";\nimport { returnFocus, ringOnReturn } from \"../internal/focus-return\";\n\nexport type ChoiceOption<T extends string = string> = {\n value: T;\n label: string;\n description?: string;\n icon?: string;\n color?: string;\n disabled?: boolean;\n /** Optional overlapping groups used by choice controls that expose group filtering. */\n groups?: readonly string[];\n};\n\nexport type ChoiceOptionsLoader<T extends string = string> = (query: string, signal: AbortSignal) => Promise<readonly ChoiceOption<T>[]>;\n\n/** Matches label, description, value, and optional extra keywords. */\nexport const filterChoiceOptions = <\n O extends Pick<ChoiceOption<string>, \"label\" | \"description\" | \"value\"> & { keywords?: readonly string[] },\n>(\n options: readonly O[],\n query: string,\n): readonly O[] => {\n const normalized = query.trim().toLocaleLowerCase();\n if (!normalized) return options;\n return options.filter((option) =>\n [option.label, option.description, option.value, ...(option.keywords ?? [])].some((part) =>\n part?.toLocaleLowerCase().includes(normalized),\n ),\n );\n};\n\n/**\n * Moves through the options and wraps at the ends, skipping `disabled` ones. A\n * RichSelect row that cannot be chosen carries a `disabledReason` instead, so\n * the arrow keys still reach it and its reason can be read.\n */\nexport const nextEnabledChoiceIndex = <O extends { label: string; disabled?: boolean }>(\n options: readonly O[],\n current: number,\n direction: 1 | -1,\n): number => {\n if (options.length === 0 || options.every((option) => option.disabled)) return -1;\n\n let index = current;\n for (let visited = 0; visited < options.length; visited += 1) {\n index = (index + direction + options.length) % options.length;\n if (!options[index]?.disabled) return index;\n }\n return -1;\n};\n\n/**\n * Counts the leading pills that fit into `available` pixels and measures the\n * whole row. When not all of them fit, the rest collapse into a summary pill\n * of width `more`; the first pill always stays and truncates when even it does\n * not fit. Without a measured width (no layout yet) every pill stays. Half a\n * pixel of slack absorbs layout rounding, so a row given exactly its own\n * `rowWidth` always fits.\n */\nexport const fitChoicePills = (\n available: number,\n widths: readonly number[],\n gap: number,\n more: number,\n): { visible: number; rowWidth: number } => {\n const rowWidth = widths.reduce((sum, width) => sum + width, 0) + gap * Math.max(0, widths.length - 1);\n if (available <= 0 || rowWidth <= available + 0.5) return { visible: widths.length, rowWidth };\n let used = more;\n let visible = 0;\n for (const width of widths) {\n used += gap + width;\n if (used > available) break;\n visible += 1;\n }\n return { visible: Math.max(1, visible), rowWidth };\n};\n\nconst errorMessage = (error: unknown): string => (error instanceof Error ? error.message : \"Failed to load options\");\n\nexport function createChoiceLoader<T extends string>(\n loader: () => ChoiceOptionsLoader<T> | undefined,\n debounceMs: () => number,\n): {\n options: () => readonly ChoiceOption<T>[];\n loading: () => boolean;\n error: () => string | undefined;\n load: (query: string, immediate?: boolean) => void;\n retry: () => void;\n cancel: () => void;\n} {\n const [options, setOptions] = createSignal<readonly ChoiceOption<T>[]>([]);\n const [loading, setLoading] = createSignal(false);\n const [error, setError] = createSignal<string>();\n let controller: AbortController | undefined;\n let timer: ReturnType<typeof setTimeout> | undefined;\n let request = 0;\n let lastQuery = \"\";\n\n const cancel = () => {\n if (timer) clearTimeout(timer);\n timer = undefined;\n controller?.abort();\n controller = undefined;\n };\n\n const run = async (query: string) => {\n const loadOptions = loader();\n if (!loadOptions) return;\n\n controller?.abort();\n controller = new AbortController();\n const currentController = controller;\n const currentRequest = ++request;\n setLoading(true);\n setError(undefined);\n\n try {\n const next = await loadOptions(query, currentController.signal);\n if (currentRequest === request && !currentController.signal.aborted) setOptions(next);\n } catch (reason) {\n if (currentRequest === request && !currentController.signal.aborted) {\n setOptions([]);\n setError(errorMessage(reason));\n }\n } finally {\n if (currentRequest === request) setLoading(false);\n }\n };\n\n const load = (query: string, immediate = false) => {\n lastQuery = query;\n if (timer) clearTimeout(timer);\n timer = undefined;\n if (immediate || debounceMs() <= 0) {\n void run(query);\n return;\n }\n timer = setTimeout(() => {\n timer = undefined;\n void run(query);\n }, debounceMs());\n };\n\n onCleanup(cancel);\n return { options, loading, error, load, retry: () => load(lastQuery, true), cancel };\n}\n\nconst popoverIsOpen = (popover: HTMLElement | undefined): boolean => {\n if (!popover) return false;\n try {\n return popover.matches(\":popover-open\");\n } catch {\n return false;\n }\n};\n\nexport type ChoicePopoverPlacement = {\n /**\n * `trigger` (default) gives the popover the trigger's width; `own` keeps the\n * width its stylesheet sets, such as a RichSelect with a preview.\n */\n width?: \"trigger\" | \"own\";\n /** The side tried first. The popover flips when the other side has more room. */\n side?: \"below\" | \"above\";\n};\n\nexport const placeChoicePopover = (trigger: HTMLElement, popover: HTMLElement, placement: ChoicePopoverPlacement = {}): void => {\n const margin = 8;\n const gap = 4;\n const triggerRect = trigger.getBoundingClientRect();\n // Cloud sizes its dropdowns to the trigger exactly (`dialog.style.width =\n // rect.width`). Keep that so a narrow toolbar select does not open a wide\n // panel that no longer lines up with the control it belongs to.\n const triggerWidth = Math.min(triggerRect.width, window.innerWidth - margin * 2);\n if (placement.width !== \"own\") popover.style.width = `${triggerWidth}px`;\n\n const popoverRect = popover.getBoundingClientRect();\n const width = placement.width === \"own\" ? popoverRect.width : triggerWidth;\n const left = Math.max(margin, Math.min(triggerRect.left, window.innerWidth - width - margin));\n const roomBelow = window.innerHeight - triggerRect.bottom - gap - margin;\n const roomAbove = triggerRect.top - gap - margin;\n const opensAbove =\n placement.side === \"above\"\n ? popoverRect.height <= roomAbove || roomAbove > roomBelow\n : popoverRect.height > roomBelow && roomAbove > roomBelow;\n const top = opensAbove\n ? Math.max(margin, triggerRect.top - popoverRect.height - gap)\n : Math.min(triggerRect.bottom + gap, window.innerHeight - popoverRect.height - margin);\n\n popover.style.left = `${left}px`;\n popover.style.top = `${Math.max(margin, top)}px`;\n};\n\nexport function createChoicePopover(\n disabled: () => boolean,\n placement: () => ChoicePopoverPlacement = () => ({}),\n): {\n open: () => boolean;\n setTrigger: Setter<HTMLElement | undefined>;\n setPopover: Setter<HTMLElement | undefined>;\n show: () => void;\n hide: (restoreFocus?: boolean) => void;\n toggle: () => void;\n trigger: () => HTMLElement | undefined;\n} {\n const [open, setOpen] = createSignal(false);\n const [trigger, setTrigger] = createSignal<HTMLElement>();\n const [popover, setPopover] = createSignal<HTMLElement>();\n let triggerRing = true;\n\n const place = () => {\n const triggerElement = trigger();\n const popoverElement = popover();\n if (triggerElement && popoverElement && open()) placeChoicePopover(triggerElement, popoverElement, placement());\n };\n\n const show = () => {\n const popoverElement = popover();\n if (disabled() || !popoverElement || popoverIsOpen(popoverElement)) return;\n triggerRing = ringOnReturn(trigger());\n popoverElement.showPopover();\n setOpen(true);\n queueMicrotask(place);\n };\n\n const hide = (restoreFocus = false) => {\n const popoverElement = popover();\n // Before hiding, so the popover does not return focus on its own.\n if (restoreFocus) returnFocus(trigger(), triggerRing);\n if (popoverIsOpen(popoverElement)) popoverElement?.hidePopover();\n setOpen(false);\n };\n\n createEffect(() => {\n const popoverElement = popover();\n if (!popoverElement) return;\n const syncOpenState = () => setOpen(popoverIsOpen(popoverElement));\n const containWheel = (event: WheelEvent) => {\n if (event.ctrlKey) return;\n event.preventDefault();\n\n const target = event.target instanceof Element ? event.target : undefined;\n const groups = target?.closest<HTMLElement>(\".k2b-choice-groups\");\n const horizontalDelta = event.shiftKey && event.deltaX === 0 ? event.deltaY : event.deltaX;\n if (groups && (event.shiftKey || Math.abs(event.deltaX) > Math.abs(event.deltaY)) && groups.scrollWidth > groups.clientWidth) {\n const unit = event.deltaMode === 1 ? 16 : event.deltaMode === 2 ? groups.clientWidth : 1;\n groups.scrollLeft += horizontalDelta * unit;\n return;\n }\n\n // A popover with more than one scrolling region, such as a list beside a\n // preview, marks them; the wheel scrolls the one under the pointer.\n const options =\n target?.closest<HTMLElement>(\"[data-choice-scroll]\") ?? popoverElement.querySelector<HTMLElement>(\".k2b-choice-options\");\n if (!options || options.scrollHeight <= options.clientHeight) return;\n const unit = event.deltaMode === 1 ? 16 : event.deltaMode === 2 ? options.clientHeight : 1;\n options.scrollTop += event.deltaY * unit;\n };\n popoverElement.addEventListener(\"toggle\", syncOpenState);\n popoverElement.addEventListener(\"wheel\", containWheel, { passive: false });\n onCleanup(() => {\n popoverElement.removeEventListener(\"toggle\", syncOpenState);\n popoverElement.removeEventListener(\"wheel\", containWheel);\n });\n });\n\n createEffect(() => {\n if (!open()) return;\n\n const dismiss = (event: PointerEvent) => {\n const target = event.target;\n if (!(target instanceof Node) || trigger()?.contains(target) || popover()?.contains(target)) return;\n hide();\n };\n const reposition = () => place();\n\n // Async option lists arrive after the popover is already open, so the first\n // placement measures an empty panel. Re-place whenever the panel resizes,\n // otherwise a dropdown that grows past the viewport bottom stays clipped.\n const popoverElement = popover();\n const observer = popoverElement && typeof ResizeObserver !== \"undefined\" ? new ResizeObserver(reposition) : undefined;\n if (popoverElement) observer?.observe(popoverElement);\n\n document.addEventListener(\"pointerdown\", dismiss, true);\n window.addEventListener(\"resize\", reposition);\n window.addEventListener(\"scroll\", reposition, true);\n onCleanup(() => {\n observer?.disconnect();\n document.removeEventListener(\"pointerdown\", dismiss, true);\n window.removeEventListener(\"resize\", reposition);\n window.removeEventListener(\"scroll\", reposition, true);\n });\n });\n\n onCleanup(() => hide());\n return {\n open,\n setTrigger,\n setPopover,\n show,\n hide,\n toggle: () => (open() ? hide() : show()),\n trigger,\n };\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":[],"sources":["inputs/choice.ts"],"sourcesContent":["import { createEffect, createSignal, onCleanup, type Setter } from \"solid-js\";\nimport { returnFocus, ringOnReturn } from \"../internal/focus-return\";\n\nexport type ChoiceOption<T extends string = string> = {\n value: T;\n label: string;\n description?: string;\n icon?: string;\n color?: string;\n disabled?: boolean;\n /** Optional overlapping groups used by choice controls that expose group filtering. */\n groups?: readonly string[];\n};\n\nexport type ChoiceOptionsLoader<T extends string = string> = (query: string, signal: AbortSignal) => Promise<readonly ChoiceOption<T>[]>;\n\n/** Matches label, description, value, and optional extra keywords. */\nexport const filterChoiceOptions = <\n O extends Pick<ChoiceOption<string>, \"label\" | \"description\" | \"value\"> & { keywords?: readonly string[] },\n>(\n options: readonly O[],\n query: string,\n): readonly O[] => {\n const normalized = query.trim().toLocaleLowerCase();\n if (!normalized) return options;\n return options.filter((option) =>\n [option.label, option.description, option.value, ...(option.keywords ?? [])].some((part) =>\n part?.toLocaleLowerCase().includes(normalized),\n ),\n );\n};\n\n/**\n * Moves through the options and wraps at the ends, skipping `disabled` ones. A\n * RichSelect row that cannot be chosen carries a `disabledReason` instead, so\n * the arrow keys still reach it and its reason can be read.\n */\nexport const nextEnabledChoiceIndex = <O extends { label: string; disabled?: boolean }>(\n options: readonly O[],\n current: number,\n direction: 1 | -1,\n): number => {\n if (options.length === 0 || options.every((option) => option.disabled)) return -1;\n\n let index = current;\n for (let visited = 0; visited < options.length; visited += 1) {\n index = (index + direction + options.length) % options.length;\n if (!options[index]?.disabled) return index;\n }\n return -1;\n};\n\n/**\n * Counts the leading pills that fit into `available` pixels and measures the\n * whole row. When not all of them fit, the rest collapse into a summary pill\n * of width `more`; the first pill always stays and truncates when even it does\n * not fit. Without a measured width (no layout yet) every pill stays. Half a\n * pixel of slack absorbs layout rounding, so a row given exactly its own\n * `rowWidth` always fits.\n */\nexport const fitChoicePills = (\n available: number,\n widths: readonly number[],\n gap: number,\n more: number,\n): { visible: number; rowWidth: number } => {\n const rowWidth = widths.reduce((sum, width) => sum + width, 0) + gap * Math.max(0, widths.length - 1);\n if (available <= 0 || rowWidth <= available + 0.5) return { visible: widths.length, rowWidth };\n let used = more;\n let visible = 0;\n for (const width of widths) {\n used += gap + width;\n if (used > available) break;\n visible += 1;\n }\n return { visible: Math.max(1, visible), rowWidth };\n};\n\nconst errorMessage = (error: unknown): string => (error instanceof Error ? error.message : \"Failed to load options\");\n\nexport function createChoiceLoader<T extends string>(\n loader: () => ChoiceOptionsLoader<T> | undefined,\n debounceMs: () => number,\n): {\n options: () => readonly ChoiceOption<T>[];\n loading: () => boolean;\n error: () => string | undefined;\n load: (query: string, immediate?: boolean) => void;\n retry: () => void;\n cancel: () => void;\n} {\n const [options, setOptions] = createSignal<readonly ChoiceOption<T>[]>([]);\n const [loading, setLoading] = createSignal(false);\n const [error, setError] = createSignal<string>();\n let controller: AbortController | undefined;\n let timer: ReturnType<typeof setTimeout> | undefined;\n let request = 0;\n let lastQuery = \"\";\n\n const cancel = () => {\n if (timer) clearTimeout(timer);\n timer = undefined;\n controller?.abort();\n controller = undefined;\n };\n\n const run = async (query: string) => {\n const loadOptions = loader();\n if (!loadOptions) return;\n\n controller?.abort();\n controller = new AbortController();\n const currentController = controller;\n const currentRequest = ++request;\n setLoading(true);\n setError(undefined);\n\n try {\n const next = await loadOptions(query, currentController.signal);\n if (currentRequest === request && !currentController.signal.aborted) setOptions(next);\n } catch (reason) {\n if (currentRequest === request && !currentController.signal.aborted) {\n setOptions([]);\n setError(errorMessage(reason));\n }\n } finally {\n if (currentRequest === request) setLoading(false);\n }\n };\n\n const load = (query: string, immediate = false) => {\n lastQuery = query;\n if (timer) clearTimeout(timer);\n timer = undefined;\n if (immediate || debounceMs() <= 0) {\n void run(query);\n return;\n }\n timer = setTimeout(() => {\n timer = undefined;\n void run(query);\n }, debounceMs());\n };\n\n onCleanup(cancel);\n return { options, loading, error, load, retry: () => load(lastQuery, true), cancel };\n}\n\nconst popoverIsOpen = (popover: HTMLElement | undefined): boolean => {\n if (!popover) return false;\n try {\n return popover.matches(\":popover-open\");\n } catch {\n return false;\n }\n};\n\nexport type ChoicePopoverPlacement = {\n /**\n * `trigger` (default) gives the popover the trigger's width; `own` keeps the\n * width its stylesheet sets, such as a RichSelect with a preview.\n */\n width?: \"trigger\" | \"own\";\n /** The side tried first. The popover flips when the other side has more room. */\n side?: \"below\" | \"above\";\n};\n\nexport const placeChoicePopover = (trigger: HTMLElement, popover: HTMLElement, placement: ChoicePopoverPlacement = {}): void => {\n const margin = 8;\n const gap = 4;\n const triggerRect = trigger.getBoundingClientRect();\n // Cloud sizes its dropdowns to the trigger exactly (`dialog.style.width =\n // rect.width`). Keep that so a narrow toolbar select does not open a wide\n // panel that no longer lines up with the control it belongs to.\n const triggerWidth = Math.min(triggerRect.width, window.innerWidth - margin * 2);\n if (placement.width !== \"own\") popover.style.width = `${triggerWidth}px`;\n\n // A stylesheet minimum, such as a popover with filter chips, can make it\n // wider than the trigger, so the clamp below uses the rendered width.\n const popoverRect = popover.getBoundingClientRect();\n const width = popoverRect.width;\n const left = Math.max(margin, Math.min(triggerRect.left, window.innerWidth - width - margin));\n const roomBelow = window.innerHeight - triggerRect.bottom - gap - margin;\n const roomAbove = triggerRect.top - gap - margin;\n const opensAbove =\n placement.side === \"above\"\n ? popoverRect.height <= roomAbove || roomAbove > roomBelow\n : popoverRect.height > roomBelow && roomAbove > roomBelow;\n const top = opensAbove\n ? Math.max(margin, triggerRect.top - popoverRect.height - gap)\n : Math.min(triggerRect.bottom + gap, window.innerHeight - popoverRect.height - margin);\n\n popover.style.left = `${left}px`;\n popover.style.top = `${Math.max(margin, top)}px`;\n};\n\nexport function createChoicePopover(\n disabled: () => boolean,\n placement: () => ChoicePopoverPlacement = () => ({}),\n): {\n open: () => boolean;\n setTrigger: Setter<HTMLElement | undefined>;\n setPopover: Setter<HTMLElement | undefined>;\n show: () => void;\n hide: (restoreFocus?: boolean) => void;\n toggle: () => void;\n trigger: () => HTMLElement | undefined;\n} {\n const [open, setOpen] = createSignal(false);\n const [trigger, setTrigger] = createSignal<HTMLElement>();\n const [popover, setPopover] = createSignal<HTMLElement>();\n let triggerRing = true;\n\n const place = () => {\n const triggerElement = trigger();\n const popoverElement = popover();\n if (triggerElement && popoverElement && open()) placeChoicePopover(triggerElement, popoverElement, placement());\n };\n\n const show = () => {\n const popoverElement = popover();\n if (disabled() || !popoverElement || popoverIsOpen(popoverElement)) return;\n triggerRing = ringOnReturn(trigger());\n popoverElement.showPopover();\n setOpen(true);\n queueMicrotask(place);\n };\n\n const hide = (restoreFocus = false) => {\n const popoverElement = popover();\n // Before hiding, so the popover does not return focus on its own.\n if (restoreFocus) returnFocus(trigger(), triggerRing);\n if (popoverIsOpen(popoverElement)) popoverElement?.hidePopover();\n setOpen(false);\n };\n\n createEffect(() => {\n const popoverElement = popover();\n if (!popoverElement) return;\n const syncOpenState = () => setOpen(popoverIsOpen(popoverElement));\n const containWheel = (event: WheelEvent) => {\n if (event.ctrlKey) return;\n event.preventDefault();\n\n const target = event.target instanceof Element ? event.target : undefined;\n const groups = target?.closest<HTMLElement>(\".k2b-choice-groups\");\n const horizontalDelta = event.shiftKey && event.deltaX === 0 ? event.deltaY : event.deltaX;\n if (groups && (event.shiftKey || Math.abs(event.deltaX) > Math.abs(event.deltaY)) && groups.scrollWidth > groups.clientWidth) {\n const unit = event.deltaMode === 1 ? 16 : event.deltaMode === 2 ? groups.clientWidth : 1;\n groups.scrollLeft += horizontalDelta * unit;\n return;\n }\n\n // A popover with more than one scrolling region, such as a list beside a\n // preview, marks them; the wheel scrolls the one under the pointer.\n const options =\n target?.closest<HTMLElement>(\"[data-choice-scroll]\") ?? popoverElement.querySelector<HTMLElement>(\".k2b-choice-options\");\n if (!options || options.scrollHeight <= options.clientHeight) return;\n const unit = event.deltaMode === 1 ? 16 : event.deltaMode === 2 ? options.clientHeight : 1;\n options.scrollTop += event.deltaY * unit;\n };\n popoverElement.addEventListener(\"toggle\", syncOpenState);\n popoverElement.addEventListener(\"wheel\", containWheel, { passive: false });\n onCleanup(() => {\n popoverElement.removeEventListener(\"toggle\", syncOpenState);\n popoverElement.removeEventListener(\"wheel\", containWheel);\n });\n });\n\n createEffect(() => {\n if (!open()) return;\n\n const dismiss = (event: PointerEvent) => {\n const target = event.target;\n if (!(target instanceof Node) || trigger()?.contains(target) || popover()?.contains(target)) return;\n hide();\n };\n const reposition = () => place();\n\n // Async option lists arrive after the popover is already open, so the first\n // placement measures an empty panel. Re-place whenever the panel resizes,\n // otherwise a dropdown that grows past the viewport bottom stays clipped.\n const popoverElement = popover();\n const observer = popoverElement && typeof ResizeObserver !== \"undefined\" ? new ResizeObserver(reposition) : undefined;\n if (popoverElement) observer?.observe(popoverElement);\n\n document.addEventListener(\"pointerdown\", dismiss, true);\n window.addEventListener(\"resize\", reposition);\n window.addEventListener(\"scroll\", reposition, true);\n onCleanup(() => {\n observer?.disconnect();\n document.removeEventListener(\"pointerdown\", dismiss, true);\n window.removeEventListener(\"resize\", reposition);\n window.removeEventListener(\"scroll\", reposition, true);\n });\n });\n\n onCleanup(() => hide());\n return {\n open,\n setTrigger,\n setPopover,\n show,\n hide,\n toggle: () => (open() ? hide() : show()),\n trigger,\n };\n}\n"],"mappings":"AAAA,SAAS,YAAY,EAAE,YAAY,EAAE,SAAS,QAAqB,UAAU;AAC7E,SAAS,WAAW,EAAE,YAAY,QAAQ,0BAA0B;AAepE;AACA,OAAO,MAAM,mBAAmB,GAAG,CAGjC,OAAqB,EACrB,KAAa,KACI;EACjB,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC;EACnD,IAAI,CAAC,UAAU,EAAE,OAAO,OAAO;EAC/B,OAAO,OAAO,CAAC,MAAM,CAAE,MAAM,IAC3B,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,KAAK,EAAE,IAAI,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAE,IAAI,IACrF,IAAI,EAAE,iBAAiB,CAAC,CAAC,CAAC,QAAQ,CAAC,UAAU,CAC/C,CACF,CAAC;AACH,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA,OAAO,MAAM,sBAAsB,GAAG,CACpC,OAAqB,EACrB,OAAe,EACf,SAAiB,KACN;EACX,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,CAAC,KAAK,CAAE,MAAM,IAAK,MAAM,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC,CAAC;EAEjF,IAAI,KAAK,GAAG,OAAO;EACnB,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,EAAE,OAAO,IAAI,CAAC,EAAE;IAC5D,KAAK,GAAG,CAAC,KAAK,GAAG,SAAS,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM;IAC7D,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,OAAO,KAAK;EAC7C;EACA,OAAO,CAAC,CAAC;AACX,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,MAAM,cAAc,GAAG,CAC5B,SAAiB,EACjB,MAAyB,EACzB,GAAW,EACX,IAAY,KAC8B;EAC1C,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,KAAK,KAAK,GAAG,GAAG,KAAK,EAAE,CAAC,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;EACrG,IAAI,SAAS,IAAI,CAAC,IAAI,QAAQ,IAAI,SAAS,GAAG,GAAG,EAAE,OAAO;IAAE,OAAO,EAAE,MAAM,CAAC,MAAM;IAAE;EAAS,CAAC;EAC9F,IAAI,IAAI,GAAG,IAAI;EACf,IAAI,OAAO,GAAG,CAAC;EACf,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE;IAC1B,IAAI,IAAI,GAAG,GAAG,KAAK;IACnB,IAAI,IAAI,GAAG,SAAS,EAAE;IACtB,OAAO,IAAI,CAAC;EACd;EACA,OAAO;IAAE,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC;IAAE;EAAS,CAAC;AACpD,CAAC;AAED,MAAM,YAAY,GAAI,KAAc,IAAc,KAAK,YAAY,KAAK,GAAG,KAAK,CAAC,OAAO,GAAG,wBAAyB;AAEpH,OAAO,SAAS,kBAAkB,CAChC,MAAgD,EAChD,UAAwB,EAQxB;EACA,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,YAAY,CAA6B,EAAE,CAAC;EAC1E,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,YAAY,CAAC,KAAK,CAAC;EACjD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,YAAY,CAAS,CAAC;EAChD,IAAI,UAAuC;EAC3C,IAAI,KAAgD;EACpD,IAAI,OAAO,GAAG,CAAC;EACf,IAAI,SAAS,GAAG,EAAE;EAElB,MAAM,MAAM,GAAG,MAAM;IACnB,IAAI,KAAK,EAAE,YAAY,CAAC,KAAK,CAAC;IAC9B,KAAK,GAAG,SAAS;IACjB,UAAU,EAAE,KAAK,CAAC,CAAC;IACnB,UAAU,GAAG,SAAS;EACxB,CAAC;EAED,MAAM,GAAG,GAAG,MAAO,KAAa,IAAK;IACnC,MAAM,WAAW,GAAG,MAAM,CAAC,CAAC;IAC5B,IAAI,CAAC,WAAW,EAAE;IAElB,UAAU,EAAE,KAAK,CAAC,CAAC;IACnB,UAAU,GAAG,IAAI,eAAe,CAAC,CAAC;IAClC,MAAM,iBAAiB,GAAG,UAAU;IACpC,MAAM,cAAc,GAAG,EAAE,OAAO;IAChC,UAAU,CAAC,IAAI,CAAC;IAChB,QAAQ,CAAC,SAAS,CAAC;IAEnB,IAAI;MACF,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,KAAK,EAAE,iBAAiB,CAAC,MAAM,CAAC;MAC/D,IAAI,cAAc,KAAK,OAAO,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,IAAI,CAAC;IACvF,CAAC,CAAC,OAAO,MAAM,EAAE;MACf,IAAI,cAAc,KAAK,OAAO,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,OAAO,EAAE;QACnE,UAAU,CAAC,EAAE,CAAC;QACd,QAAQ,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;MAChC;IACF,CAAC,SAAS;MACR,IAAI,cAAc,KAAK,OAAO,EAAE,UAAU,CAAC,KAAK,CAAC;IACnD;EACF,CAAC;EAED,MAAM,IAAI,GAAG,CAAC,KAAa,EAAE,SAAS,GAAG,KAAK,KAAK;IACjD,SAAS,GAAG,KAAK;IACjB,IAAI,KAAK,EAAE,YAAY,CAAC,KAAK,CAAC;IAC9B,KAAK,GAAG,SAAS;IACjB,IAAI,SAAS,IAAI,UAAU,CAAC,CAAC,IAAI,CAAC,EAAE;MAClC,KAAK,GAAG,CAAC,KAAK,CAAC;MACf;IACF;IACA,KAAK,GAAG,UAAU,CAAC,MAAM;MACvB,KAAK,GAAG,SAAS;MACjB,KAAK,GAAG,CAAC,KAAK,CAAC;IACjB,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC;EAClB,CAAC;EAED,SAAS,CAAC,MAAM,CAAC;EACjB,OAAO;IAAE,OAAO;IAAE,OAAO;IAAE,KAAK;IAAE,IAAI;IAAE,KAAK,EAAE,MAAM,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC;IAAE;EAAO,CAAC;AACtF;AAEA,MAAM,aAAa,GAAI,OAAgC,IAAc;EACnE,IAAI,CAAC,OAAO,EAAE,OAAO,KAAK;EAC1B,IAAI;IACF,OAAO,OAAO,CAAC,OAAO,CAAC,eAAe,CAAC;EACzC,CAAC,CAAC,MAAM;IACN,OAAO,KAAK;EACd;AACF,CAAC;AAYD,OAAO,MAAM,kBAAkB,GAAG,CAAC,OAAoB,EAAE,OAAoB,EAAE,SAAiC,GAAG,CAAC,CAAC,KAAW;EAC9H,MAAM,MAAM,GAAG,CAAC;EAChB,MAAM,GAAG,GAAG,CAAC;EACb,MAAM,WAAW,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAAC;EACnD;EACA;EACA;EACA,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,KAAK,EAAE,MAAM,CAAC,UAAU,GAAG,MAAM,GAAG,CAAC,CAAC;EAChF,IAAI,SAAS,CAAC,KAAK,KAAK,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,KAAK,GAAG,GAAG,YAAY,IAAI;;EAExE;EACA;EACA,MAAM,WAAW,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAAC;EACnD,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK;EAC/B,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,UAAU,GAAG,KAAK,GAAG,MAAM,CAAC,CAAC;EAC7F,MAAM,SAAS,GAAG,MAAM,CAAC,WAAW,GAAG,WAAW,CAAC,MAAM,GAAG,GAAG,GAAG,MAAM;EACxE,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,GAAG,GAAG,GAAG,MAAM;EAChD,MAAM,UAAU,GACd,SAAS,CAAC,IAAI,KAAK,OAAO,GACtB,WAAW,CAAC,MAAM,IAAI,SAAS,IAAI,SAAS,GAAG,SAAS,GACxD,WAAW,CAAC,MAAM,GAAG,SAAS,IAAI,SAAS,GAAG,SAAS;EAC7D,MAAM,GAAG,GAAG,UAAU,GAClB,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,GAAG,GAAG,WAAW,CAAC,MAAM,GAAG,GAAG,CAAC,GAC5D,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,MAAM,GAAG,GAAG,EAAE,MAAM,CAAC,WAAW,GAAG,WAAW,CAAC,MAAM,GAAG,MAAM,CAAC;EAExF,OAAO,CAAC,KAAK,CAAC,IAAI,GAAG,GAAG,IAAI,IAAI;EAChC,OAAO,CAAC,KAAK,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI;AAClD,CAAC;AAED,OAAO,SAAS,mBAAmB,CACjC,QAAuB,EACvB,SAAuC,GAAG,OAAO,CAAC,CAAC,CAAC,EASpD;EACA,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,YAAY,CAAC,KAAK,CAAC;EAC3C,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,YAAY,CAAc,CAAC;EACzD,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,YAAY,CAAc,CAAC;EACzD,IAAI,WAAW,GAAG,IAAI;EAEtB,MAAM,KAAK,GAAG,MAAM;IAClB,MAAM,cAAc,GAAG,OAAO,CAAC,CAAC;IAChC,MAAM,cAAc,GAAG,OAAO,CAAC,CAAC;IAChC,IAAI,cAAc,IAAI,cAAc,IAAI,IAAI,CAAC,CAAC,EAAE,kBAAkB,CAAC,cAAc,EAAE,cAAc,EAAE,SAAS,CAAC,CAAC,CAAC;EACjH,CAAC;EAED,MAAM,IAAI,GAAG,MAAM;IACjB,MAAM,cAAc,GAAG,OAAO,CAAC,CAAC;IAChC,IAAI,QAAQ,CAAC,CAAC,IAAI,CAAC,cAAc,IAAI,aAAa,CAAC,cAAc,CAAC,EAAE;IACpE,WAAW,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC;IACrC,cAAc,CAAC,WAAW,CAAC,CAAC;IAC5B,OAAO,CAAC,IAAI,CAAC;IACb,cAAc,CAAC,KAAK,CAAC;EACvB,CAAC;EAED,MAAM,IAAI,GAAG,CAAC,YAAY,GAAG,KAAK,KAAK;IACrC,MAAM,cAAc,GAAG,OAAO,CAAC,CAAC;IAChC;IACA,IAAI,YAAY,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC,EAAE,WAAW,CAAC;IACrD,IAAI,aAAa,CAAC,cAAc,CAAC,EAAE,cAAc,EAAE,WAAW,CAAC,CAAC;IAChE,OAAO,CAAC,KAAK,CAAC;EAChB,CAAC;EAED,YAAY,CAAC,MAAM;IACjB,MAAM,cAAc,GAAG,OAAO,CAAC,CAAC;IAChC,IAAI,CAAC,cAAc,EAAE;IACrB,MAAM,aAAa,GAAG,MAAM,OAAO,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC;IAClE,MAAM,YAAY,GAAI,KAAiB,IAAK;MAC1C,IAAI,KAAK,CAAC,OAAO,EAAE;MACnB,KAAK,CAAC,cAAc,CAAC,CAAC;MAEtB,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,YAAY,OAAO,GAAG,KAAK,CAAC,MAAM,GAAG,SAAS;MACzE,MAAM,MAAM,GAAG,MAAM,EAAE,OAAO,CAAc,oBAAoB,CAAC;MACjE,MAAM,eAAe,GAAG,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM;MAC1F,IAAI,MAAM,KAAK,KAAK,CAAC,QAAQ,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,MAAM,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,EAAE;QAC5H,MAAM,IAAI,GAAG,KAAK,CAAC,SAAS,KAAK,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,SAAS,KAAK,CAAC,GAAG,MAAM,CAAC,WAAW,GAAG,CAAC;QACxF,MAAM,CAAC,UAAU,IAAI,eAAe,GAAG,IAAI;QAC3C;MACF;;MAEA;MACA;MACA,MAAM,OAAO,GACX,MAAM,EAAE,OAAO,CAAc,sBAAsB,CAAC,IAAI,cAAc,CAAC,aAAa,CAAc,qBAAqB,CAAC;MAC1H,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,YAAY,IAAI,OAAO,CAAC,YAAY,EAAE;MAC9D,MAAM,IAAI,GAAG,KAAK,CAAC,SAAS,KAAK,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,SAAS,KAAK,CAAC,GAAG,OAAO,CAAC,YAAY,GAAG,CAAC;MAC1F,OAAO,CAAC,SAAS,IAAI,KAAK,CAAC,MAAM,GAAG,IAAI;IAC1C,CAAC;IACD,cAAc,CAAC,gBAAgB,CAAC,QAAQ,EAAE,aAAa,CAAC;IACxD,cAAc,CAAC,gBAAgB,CAAC,OAAO,EAAE,YAAY,EAAE;MAAE,OAAO,EAAE;IAAM,CAAC,CAAC;IAC1E,SAAS,CAAC,MAAM;MACd,cAAc,CAAC,mBAAmB,CAAC,QAAQ,EAAE,aAAa,CAAC;MAC3D,cAAc,CAAC,mBAAmB,CAAC,OAAO,EAAE,YAAY,CAAC;IAC3D,CAAC,CAAC;EACJ,CAAC,CAAC;EAEF,YAAY,CAAC,MAAM;IACjB,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE;IAEb,MAAM,OAAO,GAAI,KAAmB,IAAK;MACvC,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM;MAC3B,IAAI,EAAE,MAAM,YAAY,IAAI,CAAC,IAAI,OAAO,CAAC,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,IAAI,OAAO,CAAC,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,EAAE;MAC7F,IAAI,CAAC,CAAC;IACR,CAAC;IACD,MAAM,UAAU,GAAG,MAAM,KAAK,CAAC,CAAC;;IAEhC;IACA;IACA;IACA,MAAM,cAAc,GAAG,OAAO,CAAC,CAAC;IAChC,MAAM,QAAQ,GAAG,cAAc,IAAI,OAAO,cAAc,KAAK,WAAW,GAAG,IAAI,cAAc,CAAC,UAAU,CAAC,GAAG,SAAS;IACrH,IAAI,cAAc,EAAE,QAAQ,EAAE,OAAO,CAAC,cAAc,CAAC;IAErD,QAAQ,CAAC,gBAAgB,CAAC,aAAa,EAAE,OAAO,EAAE,IAAI,CAAC;IACvD,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,UAAU,CAAC;IAC7C,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,UAAU,EAAE,IAAI,CAAC;IACnD,SAAS,CAAC,MAAM;MACd,QAAQ,EAAE,UAAU,CAAC,CAAC;MACtB,QAAQ,CAAC,mBAAmB,CAAC,aAAa,EAAE,OAAO,EAAE,IAAI,CAAC;MAC1D,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,UAAU,CAAC;MAChD,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,UAAU,EAAE,IAAI,CAAC;IACxD,CAAC,CAAC;EACJ,CAAC,CAAC;EAEF,SAAS,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC;EACvB,OAAO;IACL,IAAI;IACJ,UAAU;IACV,UAAU;IACV,IAAI;IACJ,IAAI;IACJ,MAAM,EAAE,MAAO,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAE;IACxC;EACF,CAAC;AACH","ignoreList":[]}
|
|
@@ -0,0 +1,546 @@
|
|
|
1
|
+
import { template as _$template } from "solid-js/web";
|
|
2
|
+
import { delegateEvents as _$delegateEvents } from "solid-js/web";
|
|
3
|
+
import { setStyleProperty as _$setStyleProperty } from "solid-js/web";
|
|
4
|
+
import { runHydrationEvents as _$runHydrationEvents } from "solid-js/web";
|
|
5
|
+
import { use as _$use } from "solid-js/web";
|
|
6
|
+
import { setAttribute as _$setAttribute } from "solid-js/web";
|
|
7
|
+
import { getNextMarker as _$getNextMarker } from "solid-js/web";
|
|
8
|
+
import { insert as _$insert } from "solid-js/web";
|
|
9
|
+
import { createComponent as _$createComponent } from "solid-js/web";
|
|
10
|
+
import { className as _$className } from "solid-js/web";
|
|
11
|
+
import { effect as _$effect } from "solid-js/web";
|
|
12
|
+
import { getNextElement as _$getNextElement } from "solid-js/web";
|
|
13
|
+
import { memo as _$memo } from "solid-js/web";
|
|
14
|
+
var _tmpl$ = /*#__PURE__*/_$template(`<i aria-hidden=true>`),
|
|
15
|
+
_tmpl$2 = /*#__PURE__*/_$template(`<p>`),
|
|
16
|
+
_tmpl$3 = /*#__PURE__*/_$template(`<ol><li></li><li>`),
|
|
17
|
+
_tmpl$4 = /*#__PURE__*/_$template(`<h3 class=k2b-dictation-card__title><i aria-hidden=true></i><!$><!/>`),
|
|
18
|
+
_tmpl$5 = /*#__PURE__*/_$template(`<div class=k2b-dictation-card__body>`),
|
|
19
|
+
_tmpl$6 = /*#__PURE__*/_$template(`<div class=k2b-dictation-card__actions><!$><!/><!$><!/>`),
|
|
20
|
+
_tmpl$7 = /*#__PURE__*/_$template(`<i class="ti ti-x"aria-hidden=true>`),
|
|
21
|
+
_tmpl$8 = /*#__PURE__*/_$template(`<div class=k2b-dictation-bar__row data-state=finishing role=group><!$><!/><div class=k2b-dictation-bar__status role=status><i class="ti ti-loader-2 k2b-spin"aria-hidden=true></i><span class=k2b-dictation-bar__message></span></div><span class=k2b-dictation-bar__time></span><span class=k2b-dictation-bar__stop data-disabled=true aria-hidden=true><span>`),
|
|
22
|
+
_tmpl$9 = /*#__PURE__*/_$template(`<span class=k2b-dictation-bar__device-name>`),
|
|
23
|
+
_tmpl$0 = /*#__PURE__*/_$template(`<i class="ti ti-chevron-down k2b-dictation-bar__device-chevron"aria-hidden=true>`),
|
|
24
|
+
_tmpl$1 = /*#__PURE__*/_$template(`<div class=k2b-dictation-bar__row role=group><!$><!/><span class=k2b-dictation-bar__dot aria-hidden=true></span><div class=k2b-dictation-bar__wave aria-hidden=true></div><span class=k2b-dictation-bar__time></span><!$><!/><button type=button class=k2b-dictation-bar__stop><span aria-hidden=true>`),
|
|
25
|
+
_tmpl$10 = /*#__PURE__*/_$template(`<div>`),
|
|
26
|
+
_tmpl$11 = /*#__PURE__*/_$template(`<span>`),
|
|
27
|
+
_tmpl$12 = /*#__PURE__*/_$template(`<div class=k2b-dictation-bar__row data-state=notice><div class=k2b-dictation-bar__status role=status><i aria-hidden=true></i><span class=k2b-sr-only></span><span class="k2b-dictation-bar__message k2b-dictation-bar__message--long"aria-hidden=true></span><span class="k2b-dictation-bar__message k2b-dictation-bar__message--short"aria-hidden=true></span></div><!$><!/><!$><!/>`);
|
|
28
|
+
import { createEffect, createSignal, Index, Match, onCleanup, Show, Switch } from "solid-js";
|
|
29
|
+
import { Button, IconButton } from "../../actions/Button";
|
|
30
|
+
import { Dropdown } from "../../actions/Dropdown";
|
|
31
|
+
import { useLocale } from "../../intl/locale";
|
|
32
|
+
import { AnchoredPopover } from "../../layout/AnchoredPopover";
|
|
33
|
+
import { isBarNotice } from "./create-dictation";
|
|
34
|
+
import { dictationMessages } from "./dictation-messages";
|
|
35
|
+
const useDictationMessages = () => {
|
|
36
|
+
const locale = useLocale();
|
|
37
|
+
return () => dictationMessages.resolve([locale()]).t;
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
/** Whether the bar stands in for the host's controls: while dictating, finishing, or showing a bar notice. */
|
|
41
|
+
export const dictationBarShown = dictation => dictation.active() || isBarNotice(dictation.notice());
|
|
42
|
+
const clock = ms => {
|
|
43
|
+
const seconds = Math.max(0, Math.floor(ms / 1000));
|
|
44
|
+
return `${Math.floor(seconds / 60)}:${String(seconds % 60).padStart(2, "0")}`;
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
/** The quiet countdown starts one minute before the end. */
|
|
48
|
+
const warnMs = 60_000;
|
|
49
|
+
const deviceIcon = device => {
|
|
50
|
+
const label = device?.label ?? "";
|
|
51
|
+
if (/airpods|buds|headset|headphone|kopfhörer/i.test(label)) return "ti-headphones";
|
|
52
|
+
if (/iphone|android|phone|handy|mobile/i.test(label)) return "ti-device-mobile";
|
|
53
|
+
if (/macbook|laptop|built-in|internal|intern/i.test(label) || !label) return "ti-device-laptop";
|
|
54
|
+
return "ti-microphone";
|
|
55
|
+
};
|
|
56
|
+
/**
|
|
57
|
+
* The microphone at its fixed place. A press starts live dictation; offline it stays focusable and says why it waits.
|
|
58
|
+
* Notices that need a decision, such as a blocked microphone or a used-up allowance, open as cards above it.
|
|
59
|
+
*/
|
|
60
|
+
export function DictationButton(props) {
|
|
61
|
+
const t = useDictationMessages();
|
|
62
|
+
const [button, setButton] = createSignal();
|
|
63
|
+
const card = () => {
|
|
64
|
+
const notice = props.dictation.notice();
|
|
65
|
+
return notice && !isBarNotice(notice) ? notice : null;
|
|
66
|
+
};
|
|
67
|
+
createEffect(() => props.dictation.bind("microphone", button()));
|
|
68
|
+
onCleanup(() => props.dictation.bind("microphone", undefined));
|
|
69
|
+
return [_$createComponent(IconButton, {
|
|
70
|
+
ref: setButton,
|
|
71
|
+
get size() {
|
|
72
|
+
return props.size ?? "sm";
|
|
73
|
+
},
|
|
74
|
+
get ["class"]() {
|
|
75
|
+
return `k2b-dictation-button ${props.class ?? ""}`;
|
|
76
|
+
},
|
|
77
|
+
get label() {
|
|
78
|
+
return _$memo(() => !!props.dictation.offline())() ? t().dictateOffline : t().dictate;
|
|
79
|
+
},
|
|
80
|
+
get tooltip() {
|
|
81
|
+
return _$memo(() => !!props.dictation.offline())() ? t().offline : t().dictate;
|
|
82
|
+
},
|
|
83
|
+
get ["aria-pressed"]() {
|
|
84
|
+
return props.dictation.active() ? "true" : "false";
|
|
85
|
+
},
|
|
86
|
+
get ["aria-disabled"]() {
|
|
87
|
+
return props.dictation.offline() || !props.dictation.active() && props.dictation.disabled() ? "true" : undefined;
|
|
88
|
+
},
|
|
89
|
+
get ["data-notice"]() {
|
|
90
|
+
return card()?.kind;
|
|
91
|
+
},
|
|
92
|
+
onClick: () => {
|
|
93
|
+
if (props.dictation.offline() || !props.dictation.active() && props.dictation.disabled()) return;
|
|
94
|
+
if (props.dictation.active()) void props.dictation.stop();else props.dictation.start();
|
|
95
|
+
},
|
|
96
|
+
get children() {
|
|
97
|
+
var _el$ = _$getNextElement(_tmpl$);
|
|
98
|
+
_$effect(() => _$className(_el$, `ti ${card()?.kind === "blocked" ? "ti-microphone-off" : "ti-microphone"}`));
|
|
99
|
+
return _el$;
|
|
100
|
+
}
|
|
101
|
+
}), _$createComponent(Show, {
|
|
102
|
+
get when() {
|
|
103
|
+
return card();
|
|
104
|
+
},
|
|
105
|
+
children: notice => _$createComponent(DictationCard, {
|
|
106
|
+
get dictation() {
|
|
107
|
+
return props.dictation;
|
|
108
|
+
},
|
|
109
|
+
get notice() {
|
|
110
|
+
return notice();
|
|
111
|
+
},
|
|
112
|
+
get anchor() {
|
|
113
|
+
return props.cardAnchor?.() ?? button();
|
|
114
|
+
}
|
|
115
|
+
})
|
|
116
|
+
})];
|
|
117
|
+
}
|
|
118
|
+
function DictationCard(props) {
|
|
119
|
+
const t = useDictationMessages();
|
|
120
|
+
const locale = useLocale();
|
|
121
|
+
const resetTime = () => {
|
|
122
|
+
const notice = props.notice;
|
|
123
|
+
const at = notice.kind === "quota" && notice.resetsAt ? new Date(notice.resetsAt) : null;
|
|
124
|
+
const time = (at ?? new Date(new Date().setHours(24, 0, 0, 0))).toLocaleTimeString(locale(), {
|
|
125
|
+
hour: "2-digit",
|
|
126
|
+
minute: "2-digit"
|
|
127
|
+
});
|
|
128
|
+
const today = new Date();
|
|
129
|
+
const tomorrow = !at || at.toDateString() !== today.toDateString();
|
|
130
|
+
return tomorrow ? t().quotaBodyTomorrow({
|
|
131
|
+
time
|
|
132
|
+
}) : t().quotaBody({
|
|
133
|
+
time
|
|
134
|
+
});
|
|
135
|
+
};
|
|
136
|
+
const content = () => {
|
|
137
|
+
switch (props.notice.kind) {
|
|
138
|
+
case "blocked":
|
|
139
|
+
return {
|
|
140
|
+
icon: "ti-microphone-off",
|
|
141
|
+
title: t().blockedTitle,
|
|
142
|
+
body: [(() => {
|
|
143
|
+
var _el$2 = _$getNextElement(_tmpl$2);
|
|
144
|
+
_$insert(_el$2, () => t().blockedBody);
|
|
145
|
+
return _el$2;
|
|
146
|
+
})(), (() => {
|
|
147
|
+
var _el$3 = _$getNextElement(_tmpl$3),
|
|
148
|
+
_el$4 = _el$3.firstChild,
|
|
149
|
+
_el$5 = _el$4.nextSibling;
|
|
150
|
+
_$insert(_el$4, () => t().blockedStep1);
|
|
151
|
+
_$insert(_el$5, () => t().blockedStep2);
|
|
152
|
+
return _el$3;
|
|
153
|
+
})()],
|
|
154
|
+
retry: true
|
|
155
|
+
};
|
|
156
|
+
case "quota":
|
|
157
|
+
return {
|
|
158
|
+
icon: "ti-hourglass",
|
|
159
|
+
title: t().quotaTitle,
|
|
160
|
+
body: (() => {
|
|
161
|
+
var _el$6 = _$getNextElement(_tmpl$2);
|
|
162
|
+
_$insert(_el$6, resetTime);
|
|
163
|
+
return _el$6;
|
|
164
|
+
})(),
|
|
165
|
+
retry: false
|
|
166
|
+
};
|
|
167
|
+
case "overloaded":
|
|
168
|
+
return {
|
|
169
|
+
icon: "ti-hourglass",
|
|
170
|
+
title: t().overloadedTitle,
|
|
171
|
+
body: (() => {
|
|
172
|
+
var _el$7 = _$getNextElement(_tmpl$2);
|
|
173
|
+
_$insert(_el$7, () => props.dictation.alternative?.note ?? t().overloadedBody);
|
|
174
|
+
return _el$7;
|
|
175
|
+
})(),
|
|
176
|
+
retry: true
|
|
177
|
+
};
|
|
178
|
+
case "elsewhere":
|
|
179
|
+
return {
|
|
180
|
+
icon: "ti-microphone",
|
|
181
|
+
title: t().elsewhereTitle,
|
|
182
|
+
body: (() => {
|
|
183
|
+
var _el$8 = _$getNextElement(_tmpl$2);
|
|
184
|
+
_$insert(_el$8, () => t().elsewhereBody);
|
|
185
|
+
return _el$8;
|
|
186
|
+
})(),
|
|
187
|
+
retry: false
|
|
188
|
+
};
|
|
189
|
+
case "unavailable":
|
|
190
|
+
return {
|
|
191
|
+
icon: "ti-microphone-off",
|
|
192
|
+
title: t().unavailableTitle,
|
|
193
|
+
body: (() => {
|
|
194
|
+
var _el$9 = _$getNextElement(_tmpl$2);
|
|
195
|
+
_$insert(_el$9, () => t().unavailableBody);
|
|
196
|
+
return _el$9;
|
|
197
|
+
})(),
|
|
198
|
+
retry: true
|
|
199
|
+
};
|
|
200
|
+
default:
|
|
201
|
+
return {
|
|
202
|
+
icon: "ti-microphone-off",
|
|
203
|
+
title: t().notAvailableTitle,
|
|
204
|
+
body: (() => {
|
|
205
|
+
var _el$0 = _$getNextElement(_tmpl$2);
|
|
206
|
+
_$insert(_el$0, () => t().notAvailableBody);
|
|
207
|
+
return _el$0;
|
|
208
|
+
})(),
|
|
209
|
+
retry: false
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
};
|
|
213
|
+
return _$createComponent(AnchoredPopover, {
|
|
214
|
+
get anchor() {
|
|
215
|
+
return props.anchor;
|
|
216
|
+
},
|
|
217
|
+
onClose: () => props.dictation.dismiss(),
|
|
218
|
+
get label() {
|
|
219
|
+
return content().title;
|
|
220
|
+
},
|
|
221
|
+
side: "above",
|
|
222
|
+
align: "end",
|
|
223
|
+
width: "20rem",
|
|
224
|
+
sheet: false,
|
|
225
|
+
"class": "k2b-dictation-card",
|
|
226
|
+
get children() {
|
|
227
|
+
return [(() => {
|
|
228
|
+
var _el$1 = _$getNextElement(_tmpl$4),
|
|
229
|
+
_el$10 = _el$1.firstChild,
|
|
230
|
+
_el$11 = _el$10.nextSibling,
|
|
231
|
+
[_el$12, _co$] = _$getNextMarker(_el$11.nextSibling);
|
|
232
|
+
_$insert(_el$1, () => content().title, _el$12, _co$);
|
|
233
|
+
_$effect(() => _$className(_el$10, `ti ${content().icon}`));
|
|
234
|
+
return _el$1;
|
|
235
|
+
})(), (() => {
|
|
236
|
+
var _el$13 = _$getNextElement(_tmpl$5);
|
|
237
|
+
_$insert(_el$13, () => content().body);
|
|
238
|
+
return _el$13;
|
|
239
|
+
})(), (() => {
|
|
240
|
+
var _el$14 = _$getNextElement(_tmpl$6),
|
|
241
|
+
_el$15 = _el$14.firstChild,
|
|
242
|
+
[_el$16, _co$2] = _$getNextMarker(_el$15.nextSibling),
|
|
243
|
+
_el$17 = _el$16.nextSibling,
|
|
244
|
+
[_el$18, _co$3] = _$getNextMarker(_el$17.nextSibling);
|
|
245
|
+
_$insert(_el$14, _$createComponent(Show, {
|
|
246
|
+
get when() {
|
|
247
|
+
return _$memo(() => props.notice.kind === "overloaded")() ? props.dictation.alternative : undefined;
|
|
248
|
+
},
|
|
249
|
+
children: alternative => _$createComponent(Button, {
|
|
250
|
+
size: "sm",
|
|
251
|
+
variant: "ghost",
|
|
252
|
+
onClick: () => {
|
|
253
|
+
props.dictation.dismiss();
|
|
254
|
+
alternative().run();
|
|
255
|
+
},
|
|
256
|
+
get children() {
|
|
257
|
+
return alternative().label;
|
|
258
|
+
}
|
|
259
|
+
})
|
|
260
|
+
}), _el$16, _co$2);
|
|
261
|
+
_$insert(_el$14, _$createComponent(Show, {
|
|
262
|
+
get when() {
|
|
263
|
+
return content().retry;
|
|
264
|
+
},
|
|
265
|
+
get fallback() {
|
|
266
|
+
return _$createComponent(Button, {
|
|
267
|
+
size: "sm",
|
|
268
|
+
variant: "ghost",
|
|
269
|
+
get ["class"]() {
|
|
270
|
+
return props.notice.kind === "elsewhere" ? "k2b-dictation-card__primary" : undefined;
|
|
271
|
+
},
|
|
272
|
+
onClick: () => props.dictation.dismiss(),
|
|
273
|
+
get children() {
|
|
274
|
+
return t().ok;
|
|
275
|
+
}
|
|
276
|
+
});
|
|
277
|
+
},
|
|
278
|
+
get children() {
|
|
279
|
+
return _$createComponent(Button, {
|
|
280
|
+
size: "sm",
|
|
281
|
+
variant: "ghost",
|
|
282
|
+
"class": "k2b-dictation-card__primary",
|
|
283
|
+
onClick: () => props.dictation.start(),
|
|
284
|
+
get children() {
|
|
285
|
+
return t().retry;
|
|
286
|
+
}
|
|
287
|
+
});
|
|
288
|
+
}
|
|
289
|
+
}), _el$18, _co$3);
|
|
290
|
+
return _el$14;
|
|
291
|
+
})()];
|
|
292
|
+
}
|
|
293
|
+
});
|
|
294
|
+
}
|
|
295
|
+
/**
|
|
296
|
+
* The row that stands in for the host's controls while dictating, at the same place and height: Discard, level, time,
|
|
297
|
+
* microphone and Stop; then "Finishing …" until the last words arrived; and a notice with "Continue" when the session
|
|
298
|
+
* ended early. Render it where `dictationBarShown()` is true. Escape stops, after closing an open menu.
|
|
299
|
+
*/
|
|
300
|
+
export function DictationBar(props) {
|
|
301
|
+
const t = useDictationMessages();
|
|
302
|
+
const status = () => props.dictation.status();
|
|
303
|
+
const remaining = () => props.dictation.maxMs() - props.dictation.elapsedMs();
|
|
304
|
+
const warning = () => status() === "live" && remaining() <= warnMs;
|
|
305
|
+
const time = () => warning() ? t().timeLeft({
|
|
306
|
+
time: clock(remaining())
|
|
307
|
+
}) : clock(props.dictation.elapsedMs());
|
|
308
|
+
const slots = 160;
|
|
309
|
+
const bars = () => {
|
|
310
|
+
const levels = props.dictation.levels();
|
|
311
|
+
return Array.from({
|
|
312
|
+
length: slots
|
|
313
|
+
}, (_, index) => levels[levels.length - slots + index] ?? 0);
|
|
314
|
+
};
|
|
315
|
+
const deviceLabel = () => props.dictation.device()?.label || t().microphone;
|
|
316
|
+
const onKey = event => {
|
|
317
|
+
if (event.key !== "Escape" || event.defaultPrevented || status() !== "live") return;
|
|
318
|
+
event.preventDefault();
|
|
319
|
+
void props.dictation.stop();
|
|
320
|
+
};
|
|
321
|
+
createEffect(() => {
|
|
322
|
+
if (status() !== "live") return;
|
|
323
|
+
document.addEventListener("keydown", onKey);
|
|
324
|
+
onCleanup(() => document.removeEventListener("keydown", onKey));
|
|
325
|
+
});
|
|
326
|
+
const bindStop = element => {
|
|
327
|
+
props.dictation.bind("stop", element);
|
|
328
|
+
onCleanup(() => props.dictation.bind("stop", undefined));
|
|
329
|
+
};
|
|
330
|
+
const bindContinue = element => {
|
|
331
|
+
props.dictation.bind("continue", element);
|
|
332
|
+
onCleanup(() => props.dictation.bind("continue", undefined));
|
|
333
|
+
};
|
|
334
|
+
const deviceItems = () => [{
|
|
335
|
+
sectionLabel: t().microphone,
|
|
336
|
+
items: (props.dictation.devices().length ? props.dictation.devices() : props.dictation.device() ? [props.dictation.device()] : []).map(device => ({
|
|
337
|
+
choice: "radio",
|
|
338
|
+
icon: `ti ${deviceIcon(device)}`,
|
|
339
|
+
label: device.id === "default" ? `${device.label || t().microphone} · ${t().systemDefault}` : device.label || t().microphone,
|
|
340
|
+
checked: () => (props.dictation.deviceId() ?? props.dictation.device()?.id) === device.id,
|
|
341
|
+
action: () => props.dictation.chooseDevice(device.id)
|
|
342
|
+
}))
|
|
343
|
+
}];
|
|
344
|
+
return (() => {
|
|
345
|
+
var _el$19 = _$getNextElement(_tmpl$10);
|
|
346
|
+
_$insert(_el$19, _$createComponent(Switch, {
|
|
347
|
+
get children() {
|
|
348
|
+
return [_$createComponent(Match, {
|
|
349
|
+
get when() {
|
|
350
|
+
return status() === "finishing";
|
|
351
|
+
},
|
|
352
|
+
get children() {
|
|
353
|
+
var _el$20 = _$getNextElement(_tmpl$8),
|
|
354
|
+
_el$26 = _el$20.firstChild,
|
|
355
|
+
[_el$27, _co$4] = _$getNextMarker(_el$26.nextSibling),
|
|
356
|
+
_el$22 = _el$27.nextSibling,
|
|
357
|
+
_el$23 = _el$22.firstChild,
|
|
358
|
+
_el$24 = _el$23.nextSibling,
|
|
359
|
+
_el$25 = _el$22.nextSibling;
|
|
360
|
+
_$insert(_el$20, _$createComponent(IconButton, {
|
|
361
|
+
size: "sm",
|
|
362
|
+
get label() {
|
|
363
|
+
return t().discard;
|
|
364
|
+
},
|
|
365
|
+
"aria-disabled": "true",
|
|
366
|
+
"class": "k2b-dictation-bar__icon",
|
|
367
|
+
get children() {
|
|
368
|
+
return _$getNextElement(_tmpl$7);
|
|
369
|
+
}
|
|
370
|
+
}), _el$27, _co$4);
|
|
371
|
+
_$insert(_el$24, () => t().finishing);
|
|
372
|
+
_$insert(_el$25, () => clock(props.dictation.elapsedMs()));
|
|
373
|
+
_$effect(() => _$setAttribute(_el$20, "aria-label", t().finishingGroup));
|
|
374
|
+
return _el$20;
|
|
375
|
+
}
|
|
376
|
+
}), _$createComponent(Match, {
|
|
377
|
+
get when() {
|
|
378
|
+
return status() === "live" || status() === "starting";
|
|
379
|
+
},
|
|
380
|
+
get children() {
|
|
381
|
+
var _el$28 = _$getNextElement(_tmpl$1),
|
|
382
|
+
_el$37 = _el$28.firstChild,
|
|
383
|
+
[_el$38, _co$5] = _$getNextMarker(_el$37.nextSibling),
|
|
384
|
+
_el$30 = _el$38.nextSibling,
|
|
385
|
+
_el$31 = _el$30.nextSibling,
|
|
386
|
+
_el$32 = _el$31.nextSibling,
|
|
387
|
+
_el$39 = _el$32.nextSibling,
|
|
388
|
+
[_el$40, _co$6] = _$getNextMarker(_el$39.nextSibling),
|
|
389
|
+
_el$36 = _el$40.nextSibling;
|
|
390
|
+
_$insert(_el$28, _$createComponent(IconButton, {
|
|
391
|
+
size: "sm",
|
|
392
|
+
get label() {
|
|
393
|
+
return t().discard;
|
|
394
|
+
},
|
|
395
|
+
"class": "k2b-dictation-bar__icon",
|
|
396
|
+
onClick: () => props.dictation.discard(),
|
|
397
|
+
get children() {
|
|
398
|
+
return _$getNextElement(_tmpl$7);
|
|
399
|
+
}
|
|
400
|
+
}), _el$38, _co$5);
|
|
401
|
+
_$insert(_el$31, _$createComponent(Index, {
|
|
402
|
+
get each() {
|
|
403
|
+
return bars();
|
|
404
|
+
},
|
|
405
|
+
children: level => (() => {
|
|
406
|
+
var _el$41 = _$getNextElement(_tmpl$11);
|
|
407
|
+
_$effect(_$p => _$setStyleProperty(_el$41, "--k2b-dictation-level", String(0.1 + level() * 0.9)));
|
|
408
|
+
return _el$41;
|
|
409
|
+
})()
|
|
410
|
+
}));
|
|
411
|
+
_$insert(_el$32, (() => {
|
|
412
|
+
var _c$ = _$memo(() => status() === "starting");
|
|
413
|
+
return () => _c$() ? clock(0) : time();
|
|
414
|
+
})());
|
|
415
|
+
_$insert(_el$28, _$createComponent(Dropdown, {
|
|
416
|
+
get items() {
|
|
417
|
+
return deviceItems();
|
|
418
|
+
},
|
|
419
|
+
position: "top-left",
|
|
420
|
+
width: "16.25rem",
|
|
421
|
+
onOpenChange: open => {
|
|
422
|
+
if (open) void props.dictation.loadDevices();
|
|
423
|
+
},
|
|
424
|
+
get children() {
|
|
425
|
+
return _$createComponent(Dropdown.Trigger, {
|
|
426
|
+
appearance: "plain",
|
|
427
|
+
"class": "k2b-dictation-bar__device",
|
|
428
|
+
get label() {
|
|
429
|
+
return t().microphoneNamed({
|
|
430
|
+
name: deviceLabel()
|
|
431
|
+
});
|
|
432
|
+
},
|
|
433
|
+
get children() {
|
|
434
|
+
return [(() => {
|
|
435
|
+
var _el$33 = _$getNextElement(_tmpl$);
|
|
436
|
+
_$effect(() => _$className(_el$33, `ti ${deviceIcon(props.dictation.device())}`));
|
|
437
|
+
return _el$33;
|
|
438
|
+
})(), (() => {
|
|
439
|
+
var _el$34 = _$getNextElement(_tmpl$9);
|
|
440
|
+
_$insert(_el$34, deviceLabel);
|
|
441
|
+
return _el$34;
|
|
442
|
+
})(), _$getNextElement(_tmpl$0)];
|
|
443
|
+
}
|
|
444
|
+
});
|
|
445
|
+
}
|
|
446
|
+
}), _el$40, _co$6);
|
|
447
|
+
_el$36.$$click = () => void props.dictation.stop();
|
|
448
|
+
_$use(bindStop, _el$36);
|
|
449
|
+
_$effect(_p$ => {
|
|
450
|
+
var _v$ = status(),
|
|
451
|
+
_v$2 = t().running,
|
|
452
|
+
_v$3 = status() === "live" ? "true" : undefined,
|
|
453
|
+
_v$4 = warning() ? "true" : undefined,
|
|
454
|
+
_v$5 = t().stop,
|
|
455
|
+
_v$6 = t().stop;
|
|
456
|
+
_v$ !== _p$.e && _$setAttribute(_el$28, "data-state", _p$.e = _v$);
|
|
457
|
+
_v$2 !== _p$.t && _$setAttribute(_el$28, "aria-label", _p$.t = _v$2);
|
|
458
|
+
_v$3 !== _p$.a && _$setAttribute(_el$30, "data-live", _p$.a = _v$3);
|
|
459
|
+
_v$4 !== _p$.o && _$setAttribute(_el$32, "data-warning", _p$.o = _v$4);
|
|
460
|
+
_v$5 !== _p$.i && _$setAttribute(_el$36, "aria-label", _p$.i = _v$5);
|
|
461
|
+
_v$6 !== _p$.n && _$setAttribute(_el$36, "title", _p$.n = _v$6);
|
|
462
|
+
return _p$;
|
|
463
|
+
}, {
|
|
464
|
+
e: undefined,
|
|
465
|
+
t: undefined,
|
|
466
|
+
a: undefined,
|
|
467
|
+
o: undefined,
|
|
468
|
+
i: undefined,
|
|
469
|
+
n: undefined
|
|
470
|
+
});
|
|
471
|
+
_$runHydrationEvents();
|
|
472
|
+
return _el$28;
|
|
473
|
+
}
|
|
474
|
+
}), _$createComponent(Match, {
|
|
475
|
+
get when() {
|
|
476
|
+
return _$memo(() => !!isBarNotice(props.dictation.notice()))() ? props.dictation.notice() : undefined;
|
|
477
|
+
},
|
|
478
|
+
children: notice => {
|
|
479
|
+
const ended = () => {
|
|
480
|
+
const value = notice();
|
|
481
|
+
return value.kind === "ended" ? value : undefined;
|
|
482
|
+
};
|
|
483
|
+
const minutes = () => Math.round((ended()?.maxMs ?? 600_000) / 60_000);
|
|
484
|
+
const long = () => !ended() ? t().interrupted : ended().reason === "silence" ? t().silenceDone : t().maxDone({
|
|
485
|
+
minutes: minutes()
|
|
486
|
+
});
|
|
487
|
+
const short = () => !ended() ? t().interruptedShort : ended().reason === "silence" ? t().silenceDoneShort : t().maxDoneShort({
|
|
488
|
+
minutes: minutes()
|
|
489
|
+
});
|
|
490
|
+
return (() => {
|
|
491
|
+
var _el$42 = _$getNextElement(_tmpl$12),
|
|
492
|
+
_el$43 = _el$42.firstChild,
|
|
493
|
+
_el$44 = _el$43.firstChild,
|
|
494
|
+
_el$45 = _el$44.nextSibling,
|
|
495
|
+
_el$46 = _el$45.nextSibling,
|
|
496
|
+
_el$47 = _el$46.nextSibling,
|
|
497
|
+
_el$49 = _el$43.nextSibling,
|
|
498
|
+
[_el$50, _co$7] = _$getNextMarker(_el$49.nextSibling),
|
|
499
|
+
_el$51 = _el$50.nextSibling,
|
|
500
|
+
[_el$52, _co$8] = _$getNextMarker(_el$51.nextSibling);
|
|
501
|
+
_$insert(_el$45, long);
|
|
502
|
+
_$insert(_el$46, long);
|
|
503
|
+
_$insert(_el$47, short);
|
|
504
|
+
_$insert(_el$42, _$createComponent(Button, {
|
|
505
|
+
ref: bindContinue,
|
|
506
|
+
size: "sm",
|
|
507
|
+
variant: "ghost",
|
|
508
|
+
"class": "k2b-dictation-bar__continue",
|
|
509
|
+
onClick: () => props.dictation.start(),
|
|
510
|
+
get children() {
|
|
511
|
+
return t().continue;
|
|
512
|
+
}
|
|
513
|
+
}), _el$50, _co$7);
|
|
514
|
+
_$insert(_el$42, _$createComponent(IconButton, {
|
|
515
|
+
size: "sm",
|
|
516
|
+
get label() {
|
|
517
|
+
return t().dismiss;
|
|
518
|
+
},
|
|
519
|
+
"class": "k2b-dictation-bar__icon",
|
|
520
|
+
onClick: () => props.dictation.dismiss(),
|
|
521
|
+
get children() {
|
|
522
|
+
return _$getNextElement(_tmpl$7);
|
|
523
|
+
}
|
|
524
|
+
}), _el$52, _co$8);
|
|
525
|
+
_$effect(_p$ => {
|
|
526
|
+
var _v$7 = ended() ? undefined : "danger",
|
|
527
|
+
_v$8 = `ti ${ended() ? "ti-clock" : "ti-alert-circle"}`;
|
|
528
|
+
_v$7 !== _p$.e && _$setAttribute(_el$43, "data-tone", _p$.e = _v$7);
|
|
529
|
+
_v$8 !== _p$.t && _$className(_el$44, _p$.t = _v$8);
|
|
530
|
+
return _p$;
|
|
531
|
+
}, {
|
|
532
|
+
e: undefined,
|
|
533
|
+
t: undefined
|
|
534
|
+
});
|
|
535
|
+
return _el$42;
|
|
536
|
+
})();
|
|
537
|
+
}
|
|
538
|
+
})];
|
|
539
|
+
}
|
|
540
|
+
}));
|
|
541
|
+
_$effect(() => _$className(_el$19, `k2b-dictation-bar ${props.class ?? ""}`));
|
|
542
|
+
return _el$19;
|
|
543
|
+
})();
|
|
544
|
+
}
|
|
545
|
+
_$delegateEvents(["click"]);
|
|
546
|
+
//# sourceMappingURL=Dictation.js.map
|