@k2b/ui 0.46.0 → 0.48.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 +244 -193
- package/dist/browser/chat/ChatComposer.js.map +1 -1
- package/dist/browser/chat/ChatDecision.js +10 -6
- package/dist/browser/chat/ChatDecision.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/VirtualFeed.js +26 -21
- package/dist/browser/content/VirtualFeed.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/inputs/Combobox.js +14 -6
- package/dist/browser/inputs/Combobox.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/AnchoredPopover.js +2 -1
- package/dist/browser/layout/AnchoredPopover.js.map +1 -1
- package/dist/browser/layout/AppWorkspace.js +340 -440
- package/dist/browser/layout/AppWorkspace.js.map +1 -1
- package/dist/browser/layout/AppWorkspaceSidebarItemStatus.js +113 -0
- package/dist/browser/layout/AppWorkspaceSidebarItemStatus.js.map +1 -0
- package/dist/browser/layout/DetailPanel.js +1 -1
- package/dist/browser/layout/DetailPanel.js.map +1 -1
- package/dist/browser/layout/DetailSections.js +236 -132
- package/dist/browser/layout/DetailSections.js.map +1 -1
- package/dist/browser/layout/MobileShell.js +30 -13
- package/dist/browser/layout/MobileShell.js.map +1 -1
- package/dist/browser/layout/detail-sections-messages.js +4 -0
- package/dist/browser/layout/detail-sections-messages.js.map +1 -1
- package/dist/browser/layout/index.js +1 -0
- package/dist/browser/layout/index.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/ChatDecision.js +10 -6
- package/dist/ssr/chat/ChatDecision.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/VirtualFeed.js +26 -21
- package/dist/ssr/content/VirtualFeed.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/inputs/Combobox.js +6 -3
- package/dist/ssr/inputs/Combobox.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/AnchoredPopover.js +2 -1
- package/dist/ssr/layout/AnchoredPopover.js.map +1 -1
- package/dist/ssr/layout/AppWorkspace.js +61 -127
- package/dist/ssr/layout/AppWorkspace.js.map +1 -1
- package/dist/ssr/layout/AppWorkspaceSidebarItemStatus.js +76 -0
- package/dist/ssr/layout/AppWorkspaceSidebarItemStatus.js.map +1 -0
- package/dist/ssr/layout/DetailPanel.js +1 -1
- package/dist/ssr/layout/DetailPanel.js.map +1 -1
- package/dist/ssr/layout/DetailSections.js +126 -50
- package/dist/ssr/layout/DetailSections.js.map +1 -1
- package/dist/ssr/layout/MobileShell.js +16 -2
- package/dist/ssr/layout/MobileShell.js.map +1 -1
- package/dist/ssr/layout/detail-sections-messages.js +4 -0
- package/dist/ssr/layout/detail-sections-messages.js.map +1 -1
- package/dist/ssr/layout/index.js +1 -0
- package/dist/ssr/layout/index.js.map +1 -1
- package/dist/styles.css +1 -1
- package/dist/types/chat/ChatDecision.d.ts +5 -0
- 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/inputs/Combobox.d.ts +2 -0
- package/dist/types/inputs/dictation/dictation-messages.d.ts +1 -0
- package/dist/types/layout/AppWorkspace.d.ts +2 -28
- package/dist/types/layout/AppWorkspaceSidebarItemStatus.d.ts +30 -0
- package/dist/types/layout/DetailSections.d.ts +32 -2
- package/dist/types/layout/MobileShell.d.ts +12 -0
- package/dist/types/layout/detail-sections-messages.d.ts +2 -0
- package/dist/types/layout/index.d.ts +1 -0
- package/package.json +1 -1
|
@@ -89,7 +89,10 @@ export function Combobox(props) {
|
|
|
89
89
|
};
|
|
90
90
|
createEffect(on(options, list => {
|
|
91
91
|
const index = props.autoHighlight;
|
|
92
|
-
if (index
|
|
92
|
+
if (index === undefined || focusedIndex() >= 0 || !popover.open() || list.length === 0) return;
|
|
93
|
+
// A result that cannot be picked is never the one Enter takes: the next one that can, or none.
|
|
94
|
+
const start = Math.min(index, list.length - 1);
|
|
95
|
+
setFocusedIndex(list[start]?.disabled ? nextEnabledChoiceIndex(list, start, 1) : start);
|
|
93
96
|
}));
|
|
94
97
|
createEffect(() => {
|
|
95
98
|
if (props.readOnly) {
|
|
@@ -99,7 +102,7 @@ export function Combobox(props) {
|
|
|
99
102
|
}
|
|
100
103
|
});
|
|
101
104
|
const select = option => {
|
|
102
|
-
if (props.disabled || props.readOnly) return;
|
|
105
|
+
if (props.disabled || props.readOnly || option.disabled) return;
|
|
103
106
|
popover.hide();
|
|
104
107
|
props.onSelect({
|
|
105
108
|
id: option.value,
|
|
@@ -316,7 +319,9 @@ export function Combobox(props) {
|
|
|
316
319
|
[_el$33, _co$7] = _$getNextMarker(_el$32.nextSibling);
|
|
317
320
|
_el$29.$$click = () => select(option());
|
|
318
321
|
_el$29.$$pointerdown = event => event.preventDefault();
|
|
319
|
-
_el$29.$$pointermove = () =>
|
|
322
|
+
_el$29.$$pointermove = () => {
|
|
323
|
+
if (!option().disabled) focus(index());
|
|
324
|
+
};
|
|
320
325
|
_$use(element => optionRefs[index()] = element, _el$29);
|
|
321
326
|
_$insert(_el$29, _$createComponent(Show, {
|
|
322
327
|
get when() {
|
|
@@ -342,15 +347,18 @@ export function Combobox(props) {
|
|
|
342
347
|
_$effect(_p$ => {
|
|
343
348
|
var _v$ = `${listboxId}-${index()}`,
|
|
344
349
|
_v$2 = index() === focusedIndex(),
|
|
345
|
-
_v$3 =
|
|
350
|
+
_v$3 = option().disabled ? "true" : undefined,
|
|
351
|
+
_v$4 = index() === focusedIndex() ? "true" : undefined;
|
|
346
352
|
_v$ !== _p$.e && _$setAttribute(_el$29, "id", _p$.e = _v$);
|
|
347
353
|
_v$2 !== _p$.t && _$setAttribute(_el$29, "aria-selected", _p$.t = _v$2);
|
|
348
|
-
_v$3 !== _p$.a && _$setAttribute(_el$29, "
|
|
354
|
+
_v$3 !== _p$.a && _$setAttribute(_el$29, "aria-disabled", _p$.a = _v$3);
|
|
355
|
+
_v$4 !== _p$.o && _$setAttribute(_el$29, "data-focused", _p$.o = _v$4);
|
|
349
356
|
return _p$;
|
|
350
357
|
}, {
|
|
351
358
|
e: undefined,
|
|
352
359
|
t: undefined,
|
|
353
|
-
a: undefined
|
|
360
|
+
a: undefined,
|
|
361
|
+
o: undefined
|
|
354
362
|
});
|
|
355
363
|
_$runHydrationEvents();
|
|
356
364
|
return _el$29;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":[],"sources":["inputs/Combobox.tsx"],"sourcesContent":["import { createEffect, createMemo, createSignal, For, type JSX, on, Show } from \"solid-js\";\nimport { createFieldMeta, Field, fieldControlAria } from \"../internal/field\";\nimport { useUiMessages } from \"../intl/messages\";\nimport { type ChoiceOption, createChoiceLoader, createChoicePopover, nextEnabledChoiceIndex } from \"./choice\";\nimport type { FieldProps, MaybeAccessor } from \"./field-contract\";\nimport { resolveMaybeAccessor } from \"./field-contract\";\nimport { useSelectMessages } from \"./select-messages\";\n\nexport type ComboboxOption = { id: string; label: string; description?: string; icon?: string };\nexport type ComboboxProps = FieldProps & {\n readOnly?: boolean;\n query?: MaybeAccessor<string>;\n onQueryChange?: (query: string) => void;\n placeholder?: string;\n fetchData: (query: string, signal: AbortSignal) => Promise<ComboboxOption[]>;\n onSelect: (option: ComboboxOption) => void;\n debounceMs?: number;\n /** The query is the field's own value: picking or closing keeps the typed text, and Enter without an active option only closes the list. */\n freeText?: boolean;\n /** Below this many characters nothing loads and the list stays closed. */\n minQueryLength?: number;\n /** This result (by position) is active as soon as results arrive, so Enter takes it. */\n autoHighlight?: number;\n /** Replaces the results with a host-owned notice, such as an exhausted quota; nothing loads while it is set. */\n status?: JSX.Element;\n /** Shown instead of the default text when a search finds nothing. */\n empty?: JSX.Element;\n /** One line under the results, such as their source. */\n footer?: JSX.Element;\n};\n\nconst iconClass = (icon: string) => (icon.split(/\\s+/).includes(\"ti\") ? icon : `ti ${icon}`);\n\nexport function Combobox(props: ComboboxProps): JSX.Element {\n const messages = useUiMessages();\n const selectMessages = useSelectMessages();\n const meta = createFieldMeta(props.id);\n const listboxId = `${meta.controlId}-listbox`;\n const [localQuery, setLocalQuery] = createSignal(\"\");\n const query = () => resolveMaybeAccessor(props.query) ?? localQuery();\n const setQuery = (value: string) => {\n setLocalQuery(value);\n props.onQueryChange?.(value);\n };\n const error = () => resolveMaybeAccessor(props.error);\n const [focusedIndex, setFocusedIndex] = createSignal(-1);\n let inputRef: HTMLInputElement | undefined;\n let optionRefs: HTMLButtonElement[] = [];\n const loader = createChoiceLoader(\n () => async (value, signal) => (await props.fetchData(value, signal)).map((option) => ({ ...option, value: option.id })),\n // Cloud debounces at 200ms and then pads the response with a 200ms minimum\n // load time to stop the spinner flickering. The spinner here sits in the\n // chevron slot and stale results stay visible, so there is nothing to pad —\n // 150ms keeps typing responsive without hammering the loader.\n () => props.debounceMs ?? 150,\n );\n const popover = createChoicePopover(() => Boolean(props.disabled || props.readOnly));\n // A host notice or an error replaces the results; hidden results are never selectable.\n const options = () => (props.status || loader.error() ? [] : loader.options());\n const optionsById = createMemo(() => new Map(options().map((option) => [option.value, option])));\n const focusedOption = () => options()[focusedIndex()];\n const searchable = (value: string) => value.trim().length >= (props.minQueryLength ?? 0);\n const focus = (index: number) => {\n setFocusedIndex(index);\n optionRefs[index]?.scrollIntoView({ block: \"nearest\" });\n };\n /** `eager` loads the currently controlled query on open; typing supplies its\n * own query, so opening from `onInput` skips the duplicate request. */\n const open = (eager = true) => {\n if (props.disabled || props.readOnly || popover.open() || !searchable(query())) return;\n popover.show();\n if (eager && !props.status) loader.load(query(), true);\n focus(-1);\n };\n const reset = () => {\n loader.cancel();\n setQuery(\"\");\n focus(-1);\n };\n const close = () => {\n popover.hide();\n if (!props.freeText) return reset();\n loader.cancel();\n focus(-1);\n };\n createEffect(\n on(options, (list) => {\n const index = props.autoHighlight;\n if (index !== undefined && focusedIndex() < 0 && popover.open() && list.length > 0) setFocusedIndex(Math.min(index, list.length - 1));\n }),\n );\n createEffect(() => {\n if (props.readOnly) {\n popover.hide();\n loader.cancel();\n setFocusedIndex(-1);\n }\n });\n const select = (option: ChoiceOption<string>) => {\n if (props.disabled || props.readOnly) return;\n popover.hide();\n props.onSelect({ id: option.value, label: option.label, description: option.description, icon: option.icon });\n if (props.freeText) {\n loader.cancel();\n focus(-1);\n } else reset();\n inputRef?.focus();\n };\n const onKeyDown = (event: KeyboardEvent) => {\n if (props.disabled || props.readOnly) return;\n if (event.key === \"ArrowDown\" || event.key === \"ArrowUp\") {\n event.preventDefault();\n if (!popover.open()) open();\n else focus(nextEnabledChoiceIndex(options(), focusedIndex(), event.key === \"ArrowDown\" ? 1 : -1));\n } else if (event.key === \"Enter\" && popover.open()) {\n // While the results are open, Enter belongs to them: it never submits an enclosing form, even with no option active.\n event.preventDefault();\n const option = options()[focusedIndex()];\n if (option) select(option);\n else if (props.freeText) close();\n } else if ((event.key === \"Escape\" || event.key === \"Tab\") && popover.open()) {\n // Escape is only ours while the list is open; otherwise it has to reach an\n // enclosing dialog or drawer.\n if (event.key === \"Escape\") event.preventDefault();\n close();\n }\n };\n\n return (\n <Field\n class={props.class}\n label={props.label}\n description={props.description}\n error={error()}\n meta={meta}\n required={props.required}\n disabled={props.disabled}\n >\n <div class=\"k2b-combobox\" data-invalid={error() ? \"true\" : undefined}>\n <div ref={popover.setTrigger} class=\"k2b-combobox__input\">\n <i class=\"ti ti-search\" aria-hidden=\"true\" />\n {/* A click, typing, or an arrow key opens the list. Focus alone (Tab, a dialog's initial focus) does not, so Escape still closes the enclosing dialog. */}\n <input\n ref={(element) => {\n inputRef = element;\n }}\n id={meta.controlId}\n type=\"text\"\n value={query()}\n placeholder={props.placeholder ?? messages().search}\n disabled={props.disabled}\n readOnly={props.readOnly}\n aria-readonly={props.readOnly ? \"true\" : undefined}\n role=\"combobox\"\n autocomplete=\"off\"\n aria-autocomplete=\"list\"\n aria-expanded={popover.open()}\n aria-controls={listboxId}\n aria-activedescendant={focusedOption() ? `${listboxId}-${focusedIndex()}` : undefined}\n {...fieldControlAria(meta, props)}\n onClick={() => open()}\n onInput={(event) => {\n if (props.disabled || props.readOnly) {\n event.currentTarget.value = query();\n return;\n }\n const value = event.currentTarget.value;\n setQuery(value);\n focus(-1);\n if (!searchable(value)) {\n popover.hide();\n loader.cancel();\n return;\n }\n open(false);\n if (!props.status) loader.load(value);\n }}\n onKeyDown={onKeyDown}\n />\n <Show when={loader.loading()} fallback={<i class=\"ti ti-chevron-down\" aria-hidden=\"true\" />}>\n <i class=\"ti ti-loader-2 k2b-spin\" aria-hidden=\"true\" />\n </Show>\n </div>\n <div ref={popover.setPopover} popover=\"manual\" class=\"k2b-choice-popover\">\n <div class=\"k2b-choice-options\" role=\"listbox\" id={listboxId}>\n <Show when={props.status}>{(status) => <div class=\"k2b-choice-status\">{status()}</div>}</Show>\n <Show when={!props.status && loader.error()}>\n {(message) => (\n <div class=\"k2b-choice-status\" data-tone=\"danger\">\n <span>{message()}</span>\n <button type=\"button\" onClick={loader.retry}>\n {messages().retry}\n </button>\n </div>\n )}\n </Show>\n {/* Keyed by option ID, not object: each fetch returns new objects, and a row replaced between press and release\n would swallow the click. */}\n <For\n each={options().map((option) => option.value)}\n fallback={\n <Show when={!props.status && !loader.error()}>\n <Show\n when={loader.loading()}\n fallback={\n <div class=\"k2b-choice-status\">\n {query().length >= 2 ? (props.empty ?? selectMessages().noResultsFound) : selectMessages().typeToSearch}\n </div>\n }\n >\n {/* The first search has nothing to keep visible yet: rows of the final size wait in its place. */}\n <div class=\"k2b-choice-loading\" role=\"status\">\n <span class=\"k2b-sr-only\">{messages().loading}</span>\n <For each={[62, 48, 55]}>\n {(width) => (\n <div class=\"k2b-choice-loading__row\" aria-hidden=\"true\">\n <span class=\"k2b-skeleton\" />\n <span class=\"k2b-skeleton\" style={{ width: `${width}%` }} />\n </div>\n )}\n </For>\n </div>\n </Show>\n </Show>\n }\n >\n {(id, index) => {\n const first = optionsById().get(id)!;\n const option = () => optionsById().get(id) ?? first;\n return (\n <button\n ref={(element) => (optionRefs[index()] = element)}\n type=\"button\"\n id={`${listboxId}-${index()}`}\n class=\"k2b-choice-option\"\n role=\"option\"\n aria-selected={index() === focusedIndex()}\n data-focused={index() === focusedIndex() ? \"true\" : undefined}\n onPointerMove={() => focus(index())}\n onPointerDown={(event) => event.preventDefault()}\n onClick={() => select(option())}\n >\n <Show when={option().icon}>{(icon) => <i class={iconClass(icon())} aria-hidden=\"true\" />}</Show>\n <span>\n <strong>{option().label}</strong>\n <Show when={option().description}>{(description) => <small>{description()}</small>}</Show>\n </span>\n </button>\n );\n }}\n </For>\n </div>\n <Show when={props.footer}>{(footer) => <div class=\"k2b-choice-footer\">{footer()}</div>}</Show>\n </div>\n </div>\n </Field>\n );\n}\n\nexport default Combobox;\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":[],"sources":["inputs/Combobox.tsx"],"sourcesContent":["import { createEffect, createMemo, createSignal, For, type JSX, on, Show } from \"solid-js\";\nimport { createFieldMeta, Field, fieldControlAria } from \"../internal/field\";\nimport { useUiMessages } from \"../intl/messages\";\nimport { type ChoiceOption, createChoiceLoader, createChoicePopover, nextEnabledChoiceIndex } from \"./choice\";\nimport type { FieldProps, MaybeAccessor } from \"./field-contract\";\nimport { resolveMaybeAccessor } from \"./field-contract\";\nimport { useSelectMessages } from \"./select-messages\";\n\nexport type ComboboxOption = {\n id: string;\n label: string;\n description?: string;\n icon?: string;\n /** Shown but cannot be picked, such as someone who is already on the list; say why in `description`. */\n disabled?: boolean;\n};\nexport type ComboboxProps = FieldProps & {\n readOnly?: boolean;\n query?: MaybeAccessor<string>;\n onQueryChange?: (query: string) => void;\n placeholder?: string;\n fetchData: (query: string, signal: AbortSignal) => Promise<ComboboxOption[]>;\n onSelect: (option: ComboboxOption) => void;\n debounceMs?: number;\n /** The query is the field's own value: picking or closing keeps the typed text, and Enter without an active option only closes the list. */\n freeText?: boolean;\n /** Below this many characters nothing loads and the list stays closed. */\n minQueryLength?: number;\n /** This result (by position) is active as soon as results arrive, so Enter takes it. */\n autoHighlight?: number;\n /** Replaces the results with a host-owned notice, such as an exhausted quota; nothing loads while it is set. */\n status?: JSX.Element;\n /** Shown instead of the default text when a search finds nothing. */\n empty?: JSX.Element;\n /** One line under the results, such as their source. */\n footer?: JSX.Element;\n};\n\nconst iconClass = (icon: string) => (icon.split(/\\s+/).includes(\"ti\") ? icon : `ti ${icon}`);\n\nexport function Combobox(props: ComboboxProps): JSX.Element {\n const messages = useUiMessages();\n const selectMessages = useSelectMessages();\n const meta = createFieldMeta(props.id);\n const listboxId = `${meta.controlId}-listbox`;\n const [localQuery, setLocalQuery] = createSignal(\"\");\n const query = () => resolveMaybeAccessor(props.query) ?? localQuery();\n const setQuery = (value: string) => {\n setLocalQuery(value);\n props.onQueryChange?.(value);\n };\n const error = () => resolveMaybeAccessor(props.error);\n const [focusedIndex, setFocusedIndex] = createSignal(-1);\n let inputRef: HTMLInputElement | undefined;\n let optionRefs: HTMLButtonElement[] = [];\n const loader = createChoiceLoader(\n () => async (value, signal) => (await props.fetchData(value, signal)).map((option) => ({ ...option, value: option.id })),\n // Cloud debounces at 200ms and then pads the response with a 200ms minimum\n // load time to stop the spinner flickering. The spinner here sits in the\n // chevron slot and stale results stay visible, so there is nothing to pad —\n // 150ms keeps typing responsive without hammering the loader.\n () => props.debounceMs ?? 150,\n );\n const popover = createChoicePopover(() => Boolean(props.disabled || props.readOnly));\n // A host notice or an error replaces the results; hidden results are never selectable.\n const options = () => (props.status || loader.error() ? [] : loader.options());\n const optionsById = createMemo(() => new Map(options().map((option) => [option.value, option])));\n const focusedOption = () => options()[focusedIndex()];\n const searchable = (value: string) => value.trim().length >= (props.minQueryLength ?? 0);\n const focus = (index: number) => {\n setFocusedIndex(index);\n optionRefs[index]?.scrollIntoView({ block: \"nearest\" });\n };\n /** `eager` loads the currently controlled query on open; typing supplies its\n * own query, so opening from `onInput` skips the duplicate request. */\n const open = (eager = true) => {\n if (props.disabled || props.readOnly || popover.open() || !searchable(query())) return;\n popover.show();\n if (eager && !props.status) loader.load(query(), true);\n focus(-1);\n };\n const reset = () => {\n loader.cancel();\n setQuery(\"\");\n focus(-1);\n };\n const close = () => {\n popover.hide();\n if (!props.freeText) return reset();\n loader.cancel();\n focus(-1);\n };\n createEffect(\n on(options, (list) => {\n const index = props.autoHighlight;\n if (index === undefined || focusedIndex() >= 0 || !popover.open() || list.length === 0) return;\n // A result that cannot be picked is never the one Enter takes: the next one that can, or none.\n const start = Math.min(index, list.length - 1);\n setFocusedIndex(list[start]?.disabled ? nextEnabledChoiceIndex(list, start, 1) : start);\n }),\n );\n createEffect(() => {\n if (props.readOnly) {\n popover.hide();\n loader.cancel();\n setFocusedIndex(-1);\n }\n });\n const select = (option: ChoiceOption<string>) => {\n if (props.disabled || props.readOnly || option.disabled) return;\n popover.hide();\n props.onSelect({ id: option.value, label: option.label, description: option.description, icon: option.icon });\n if (props.freeText) {\n loader.cancel();\n focus(-1);\n } else reset();\n inputRef?.focus();\n };\n const onKeyDown = (event: KeyboardEvent) => {\n if (props.disabled || props.readOnly) return;\n if (event.key === \"ArrowDown\" || event.key === \"ArrowUp\") {\n event.preventDefault();\n if (!popover.open()) open();\n else focus(nextEnabledChoiceIndex(options(), focusedIndex(), event.key === \"ArrowDown\" ? 1 : -1));\n } else if (event.key === \"Enter\" && popover.open()) {\n // While the results are open, Enter belongs to them: it never submits an enclosing form, even with no option active.\n event.preventDefault();\n const option = options()[focusedIndex()];\n if (option) select(option);\n else if (props.freeText) close();\n } else if ((event.key === \"Escape\" || event.key === \"Tab\") && popover.open()) {\n // Escape is only ours while the list is open; otherwise it has to reach an\n // enclosing dialog or drawer.\n if (event.key === \"Escape\") event.preventDefault();\n close();\n }\n };\n\n return (\n <Field\n class={props.class}\n label={props.label}\n description={props.description}\n error={error()}\n meta={meta}\n required={props.required}\n disabled={props.disabled}\n >\n <div class=\"k2b-combobox\" data-invalid={error() ? \"true\" : undefined}>\n <div ref={popover.setTrigger} class=\"k2b-combobox__input\">\n <i class=\"ti ti-search\" aria-hidden=\"true\" />\n {/* A click, typing, or an arrow key opens the list. Focus alone (Tab, a dialog's initial focus) does not, so Escape still closes the enclosing dialog. */}\n <input\n ref={(element) => {\n inputRef = element;\n }}\n id={meta.controlId}\n type=\"text\"\n value={query()}\n placeholder={props.placeholder ?? messages().search}\n disabled={props.disabled}\n readOnly={props.readOnly}\n aria-readonly={props.readOnly ? \"true\" : undefined}\n role=\"combobox\"\n autocomplete=\"off\"\n aria-autocomplete=\"list\"\n aria-expanded={popover.open()}\n aria-controls={listboxId}\n aria-activedescendant={focusedOption() ? `${listboxId}-${focusedIndex()}` : undefined}\n {...fieldControlAria(meta, props)}\n onClick={() => open()}\n onInput={(event) => {\n if (props.disabled || props.readOnly) {\n event.currentTarget.value = query();\n return;\n }\n const value = event.currentTarget.value;\n setQuery(value);\n focus(-1);\n if (!searchable(value)) {\n popover.hide();\n loader.cancel();\n return;\n }\n open(false);\n if (!props.status) loader.load(value);\n }}\n onKeyDown={onKeyDown}\n />\n <Show when={loader.loading()} fallback={<i class=\"ti ti-chevron-down\" aria-hidden=\"true\" />}>\n <i class=\"ti ti-loader-2 k2b-spin\" aria-hidden=\"true\" />\n </Show>\n </div>\n <div ref={popover.setPopover} popover=\"manual\" class=\"k2b-choice-popover\">\n <div class=\"k2b-choice-options\" role=\"listbox\" id={listboxId}>\n <Show when={props.status}>{(status) => <div class=\"k2b-choice-status\">{status()}</div>}</Show>\n <Show when={!props.status && loader.error()}>\n {(message) => (\n <div class=\"k2b-choice-status\" data-tone=\"danger\">\n <span>{message()}</span>\n <button type=\"button\" onClick={loader.retry}>\n {messages().retry}\n </button>\n </div>\n )}\n </Show>\n {/* Keyed by option ID, not object: each fetch returns new objects, and a row replaced between press and release\n would swallow the click. */}\n <For\n each={options().map((option) => option.value)}\n fallback={\n <Show when={!props.status && !loader.error()}>\n <Show\n when={loader.loading()}\n fallback={\n <div class=\"k2b-choice-status\">\n {query().length >= 2 ? (props.empty ?? selectMessages().noResultsFound) : selectMessages().typeToSearch}\n </div>\n }\n >\n {/* The first search has nothing to keep visible yet: rows of the final size wait in its place. */}\n <div class=\"k2b-choice-loading\" role=\"status\">\n <span class=\"k2b-sr-only\">{messages().loading}</span>\n <For each={[62, 48, 55]}>\n {(width) => (\n <div class=\"k2b-choice-loading__row\" aria-hidden=\"true\">\n <span class=\"k2b-skeleton\" />\n <span class=\"k2b-skeleton\" style={{ width: `${width}%` }} />\n </div>\n )}\n </For>\n </div>\n </Show>\n </Show>\n }\n >\n {(id, index) => {\n const first = optionsById().get(id)!;\n const option = () => optionsById().get(id) ?? first;\n return (\n <button\n ref={(element) => (optionRefs[index()] = element)}\n type=\"button\"\n id={`${listboxId}-${index()}`}\n class=\"k2b-choice-option\"\n role=\"option\"\n aria-selected={index() === focusedIndex()}\n aria-disabled={option().disabled ? \"true\" : undefined}\n data-focused={index() === focusedIndex() ? \"true\" : undefined}\n onPointerMove={() => {\n if (!option().disabled) focus(index());\n }}\n onPointerDown={(event) => event.preventDefault()}\n onClick={() => select(option())}\n >\n <Show when={option().icon}>{(icon) => <i class={iconClass(icon())} aria-hidden=\"true\" />}</Show>\n <span>\n <strong>{option().label}</strong>\n <Show when={option().description}>{(description) => <small>{description()}</small>}</Show>\n </span>\n </button>\n );\n }}\n </For>\n </div>\n <Show when={props.footer}>{(footer) => <div class=\"k2b-choice-footer\">{footer()}</div>}</Show>\n </div>\n </div>\n </Field>\n );\n}\n\nexport default Combobox;\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -139,17 +139,23 @@ function DictationCard(props) {
|
|
|
139
139
|
return {
|
|
140
140
|
icon: "ti-microphone-off",
|
|
141
141
|
title: t().blockedTitle,
|
|
142
|
-
|
|
142
|
+
// An installed app has no address bar, and where a device keeps the app's permissions differs, so its
|
|
143
|
+
// card names no path.
|
|
144
|
+
body: matchMedia("(display-mode: standalone)").matches ? (() => {
|
|
143
145
|
var _el$2 = _$getNextElement(_tmpl$2);
|
|
144
|
-
_$insert(_el$2, () => t().
|
|
146
|
+
_$insert(_el$2, () => t().blockedApp);
|
|
145
147
|
return _el$2;
|
|
146
|
-
})()
|
|
147
|
-
var _el$3 = _$getNextElement(_tmpl$
|
|
148
|
-
|
|
149
|
-
_el$5 = _el$4.nextSibling;
|
|
150
|
-
_$insert(_el$4, () => t().blockedStep1);
|
|
151
|
-
_$insert(_el$5, () => t().blockedStep2);
|
|
148
|
+
})() : [(() => {
|
|
149
|
+
var _el$3 = _$getNextElement(_tmpl$2);
|
|
150
|
+
_$insert(_el$3, () => t().blockedBody);
|
|
152
151
|
return _el$3;
|
|
152
|
+
})(), (() => {
|
|
153
|
+
var _el$4 = _$getNextElement(_tmpl$3),
|
|
154
|
+
_el$5 = _el$4.firstChild,
|
|
155
|
+
_el$6 = _el$5.nextSibling;
|
|
156
|
+
_$insert(_el$5, () => t().blockedStep1);
|
|
157
|
+
_$insert(_el$6, () => t().blockedStep2);
|
|
158
|
+
return _el$4;
|
|
153
159
|
})()],
|
|
154
160
|
retry: true
|
|
155
161
|
};
|
|
@@ -158,9 +164,9 @@ function DictationCard(props) {
|
|
|
158
164
|
icon: "ti-hourglass",
|
|
159
165
|
title: t().quotaTitle,
|
|
160
166
|
body: (() => {
|
|
161
|
-
var _el$
|
|
162
|
-
_$insert(_el$
|
|
163
|
-
return _el$
|
|
167
|
+
var _el$7 = _$getNextElement(_tmpl$2);
|
|
168
|
+
_$insert(_el$7, resetTime);
|
|
169
|
+
return _el$7;
|
|
164
170
|
})(),
|
|
165
171
|
retry: false
|
|
166
172
|
};
|
|
@@ -169,9 +175,9 @@ function DictationCard(props) {
|
|
|
169
175
|
icon: "ti-hourglass",
|
|
170
176
|
title: t().overloadedTitle,
|
|
171
177
|
body: (() => {
|
|
172
|
-
var _el$
|
|
173
|
-
_$insert(_el$
|
|
174
|
-
return _el$
|
|
178
|
+
var _el$8 = _$getNextElement(_tmpl$2);
|
|
179
|
+
_$insert(_el$8, () => props.dictation.alternative?.note ?? t().overloadedBody);
|
|
180
|
+
return _el$8;
|
|
175
181
|
})(),
|
|
176
182
|
retry: true
|
|
177
183
|
};
|
|
@@ -180,9 +186,9 @@ function DictationCard(props) {
|
|
|
180
186
|
icon: "ti-microphone",
|
|
181
187
|
title: t().elsewhereTitle,
|
|
182
188
|
body: (() => {
|
|
183
|
-
var _el$
|
|
184
|
-
_$insert(_el$
|
|
185
|
-
return _el$
|
|
189
|
+
var _el$9 = _$getNextElement(_tmpl$2);
|
|
190
|
+
_$insert(_el$9, () => t().elsewhereBody);
|
|
191
|
+
return _el$9;
|
|
186
192
|
})(),
|
|
187
193
|
retry: false
|
|
188
194
|
};
|
|
@@ -191,9 +197,9 @@ function DictationCard(props) {
|
|
|
191
197
|
icon: "ti-microphone-off",
|
|
192
198
|
title: t().unavailableTitle,
|
|
193
199
|
body: (() => {
|
|
194
|
-
var _el$
|
|
195
|
-
_$insert(_el$
|
|
196
|
-
return _el$
|
|
200
|
+
var _el$0 = _$getNextElement(_tmpl$2);
|
|
201
|
+
_$insert(_el$0, () => t().unavailableBody);
|
|
202
|
+
return _el$0;
|
|
197
203
|
})(),
|
|
198
204
|
retry: true
|
|
199
205
|
};
|
|
@@ -202,9 +208,9 @@ function DictationCard(props) {
|
|
|
202
208
|
icon: "ti-microphone-off",
|
|
203
209
|
title: t().notAvailableTitle,
|
|
204
210
|
body: (() => {
|
|
205
|
-
var _el$
|
|
206
|
-
_$insert(_el$
|
|
207
|
-
return _el$
|
|
211
|
+
var _el$1 = _$getNextElement(_tmpl$2);
|
|
212
|
+
_$insert(_el$1, () => t().notAvailableBody);
|
|
213
|
+
return _el$1;
|
|
208
214
|
})(),
|
|
209
215
|
retry: false
|
|
210
216
|
};
|
|
@@ -225,24 +231,24 @@ function DictationCard(props) {
|
|
|
225
231
|
"class": "k2b-dictation-card",
|
|
226
232
|
get children() {
|
|
227
233
|
return [(() => {
|
|
228
|
-
var _el$
|
|
229
|
-
_el$
|
|
230
|
-
_el$
|
|
231
|
-
[_el$
|
|
232
|
-
_$insert(_el$
|
|
233
|
-
_$effect(() => _$className(_el$
|
|
234
|
-
return _el$
|
|
234
|
+
var _el$10 = _$getNextElement(_tmpl$4),
|
|
235
|
+
_el$11 = _el$10.firstChild,
|
|
236
|
+
_el$12 = _el$11.nextSibling,
|
|
237
|
+
[_el$13, _co$] = _$getNextMarker(_el$12.nextSibling);
|
|
238
|
+
_$insert(_el$10, () => content().title, _el$13, _co$);
|
|
239
|
+
_$effect(() => _$className(_el$11, `ti ${content().icon}`));
|
|
240
|
+
return _el$10;
|
|
235
241
|
})(), (() => {
|
|
236
|
-
var _el$
|
|
237
|
-
_$insert(_el$
|
|
238
|
-
return _el$
|
|
242
|
+
var _el$14 = _$getNextElement(_tmpl$5);
|
|
243
|
+
_$insert(_el$14, () => content().body);
|
|
244
|
+
return _el$14;
|
|
239
245
|
})(), (() => {
|
|
240
|
-
var _el$
|
|
241
|
-
_el$
|
|
242
|
-
[_el$
|
|
243
|
-
_el$
|
|
244
|
-
[_el$
|
|
245
|
-
_$insert(_el$
|
|
246
|
+
var _el$15 = _$getNextElement(_tmpl$6),
|
|
247
|
+
_el$16 = _el$15.firstChild,
|
|
248
|
+
[_el$17, _co$2] = _$getNextMarker(_el$16.nextSibling),
|
|
249
|
+
_el$18 = _el$17.nextSibling,
|
|
250
|
+
[_el$19, _co$3] = _$getNextMarker(_el$18.nextSibling);
|
|
251
|
+
_$insert(_el$15, _$createComponent(Show, {
|
|
246
252
|
get when() {
|
|
247
253
|
return _$memo(() => props.notice.kind === "overloaded")() ? props.dictation.alternative : undefined;
|
|
248
254
|
},
|
|
@@ -257,8 +263,8 @@ function DictationCard(props) {
|
|
|
257
263
|
return alternative().label;
|
|
258
264
|
}
|
|
259
265
|
})
|
|
260
|
-
}), _el$
|
|
261
|
-
_$insert(_el$
|
|
266
|
+
}), _el$17, _co$2);
|
|
267
|
+
_$insert(_el$15, _$createComponent(Show, {
|
|
262
268
|
get when() {
|
|
263
269
|
return content().retry;
|
|
264
270
|
},
|
|
@@ -286,8 +292,8 @@ function DictationCard(props) {
|
|
|
286
292
|
}
|
|
287
293
|
});
|
|
288
294
|
}
|
|
289
|
-
}), _el$
|
|
290
|
-
return _el$
|
|
295
|
+
}), _el$19, _co$3);
|
|
296
|
+
return _el$15;
|
|
291
297
|
})()];
|
|
292
298
|
}
|
|
293
299
|
});
|
|
@@ -342,22 +348,22 @@ export function DictationBar(props) {
|
|
|
342
348
|
}))
|
|
343
349
|
}];
|
|
344
350
|
return (() => {
|
|
345
|
-
var _el$
|
|
346
|
-
_$insert(_el$
|
|
351
|
+
var _el$20 = _$getNextElement(_tmpl$10);
|
|
352
|
+
_$insert(_el$20, _$createComponent(Switch, {
|
|
347
353
|
get children() {
|
|
348
354
|
return [_$createComponent(Match, {
|
|
349
355
|
get when() {
|
|
350
356
|
return status() === "finishing";
|
|
351
357
|
},
|
|
352
358
|
get children() {
|
|
353
|
-
var _el$
|
|
354
|
-
_el$
|
|
355
|
-
[_el$
|
|
356
|
-
_el$
|
|
357
|
-
_el$
|
|
358
|
-
_el$
|
|
359
|
-
_el$
|
|
360
|
-
_$insert(_el$
|
|
359
|
+
var _el$21 = _$getNextElement(_tmpl$8),
|
|
360
|
+
_el$27 = _el$21.firstChild,
|
|
361
|
+
[_el$28, _co$4] = _$getNextMarker(_el$27.nextSibling),
|
|
362
|
+
_el$23 = _el$28.nextSibling,
|
|
363
|
+
_el$24 = _el$23.firstChild,
|
|
364
|
+
_el$25 = _el$24.nextSibling,
|
|
365
|
+
_el$26 = _el$23.nextSibling;
|
|
366
|
+
_$insert(_el$21, _$createComponent(IconButton, {
|
|
361
367
|
size: "sm",
|
|
362
368
|
get label() {
|
|
363
369
|
return t().discard;
|
|
@@ -367,27 +373,27 @@ export function DictationBar(props) {
|
|
|
367
373
|
get children() {
|
|
368
374
|
return _$getNextElement(_tmpl$7);
|
|
369
375
|
}
|
|
370
|
-
}), _el$
|
|
371
|
-
_$insert(_el$
|
|
372
|
-
_$insert(_el$
|
|
373
|
-
_$effect(() => _$setAttribute(_el$
|
|
374
|
-
return _el$
|
|
376
|
+
}), _el$28, _co$4);
|
|
377
|
+
_$insert(_el$25, () => t().finishing);
|
|
378
|
+
_$insert(_el$26, () => clock(props.dictation.elapsedMs()));
|
|
379
|
+
_$effect(() => _$setAttribute(_el$21, "aria-label", t().finishingGroup));
|
|
380
|
+
return _el$21;
|
|
375
381
|
}
|
|
376
382
|
}), _$createComponent(Match, {
|
|
377
383
|
get when() {
|
|
378
384
|
return status() === "live" || status() === "starting";
|
|
379
385
|
},
|
|
380
386
|
get children() {
|
|
381
|
-
var _el$
|
|
382
|
-
_el$
|
|
383
|
-
[_el$
|
|
384
|
-
_el$
|
|
385
|
-
_el$31 = _el$30.nextSibling,
|
|
387
|
+
var _el$29 = _$getNextElement(_tmpl$1),
|
|
388
|
+
_el$38 = _el$29.firstChild,
|
|
389
|
+
[_el$39, _co$5] = _$getNextMarker(_el$38.nextSibling),
|
|
390
|
+
_el$31 = _el$39.nextSibling,
|
|
386
391
|
_el$32 = _el$31.nextSibling,
|
|
387
|
-
_el$
|
|
388
|
-
|
|
389
|
-
_el$
|
|
390
|
-
|
|
392
|
+
_el$33 = _el$32.nextSibling,
|
|
393
|
+
_el$40 = _el$33.nextSibling,
|
|
394
|
+
[_el$41, _co$6] = _$getNextMarker(_el$40.nextSibling),
|
|
395
|
+
_el$37 = _el$41.nextSibling;
|
|
396
|
+
_$insert(_el$29, _$createComponent(IconButton, {
|
|
391
397
|
size: "sm",
|
|
392
398
|
get label() {
|
|
393
399
|
return t().discard;
|
|
@@ -397,22 +403,22 @@ export function DictationBar(props) {
|
|
|
397
403
|
get children() {
|
|
398
404
|
return _$getNextElement(_tmpl$7);
|
|
399
405
|
}
|
|
400
|
-
}), _el$
|
|
401
|
-
_$insert(_el$
|
|
406
|
+
}), _el$39, _co$5);
|
|
407
|
+
_$insert(_el$32, _$createComponent(Index, {
|
|
402
408
|
get each() {
|
|
403
409
|
return bars();
|
|
404
410
|
},
|
|
405
411
|
children: level => (() => {
|
|
406
|
-
var _el$
|
|
407
|
-
_$effect(_$p => _$setStyleProperty(_el$
|
|
408
|
-
return _el$
|
|
412
|
+
var _el$42 = _$getNextElement(_tmpl$11);
|
|
413
|
+
_$effect(_$p => _$setStyleProperty(_el$42, "--k2b-dictation-level", String(0.1 + level() * 0.9)));
|
|
414
|
+
return _el$42;
|
|
409
415
|
})()
|
|
410
416
|
}));
|
|
411
|
-
_$insert(_el$
|
|
417
|
+
_$insert(_el$33, (() => {
|
|
412
418
|
var _c$ = _$memo(() => status() === "starting");
|
|
413
419
|
return () => _c$() ? clock(0) : time();
|
|
414
420
|
})());
|
|
415
|
-
_$insert(_el$
|
|
421
|
+
_$insert(_el$29, _$createComponent(Dropdown, {
|
|
416
422
|
get items() {
|
|
417
423
|
return deviceItems();
|
|
418
424
|
},
|
|
@@ -432,20 +438,20 @@ export function DictationBar(props) {
|
|
|
432
438
|
},
|
|
433
439
|
get children() {
|
|
434
440
|
return [(() => {
|
|
435
|
-
var _el$
|
|
436
|
-
_$effect(() => _$className(_el$
|
|
437
|
-
return _el$33;
|
|
438
|
-
})(), (() => {
|
|
439
|
-
var _el$34 = _$getNextElement(_tmpl$9);
|
|
440
|
-
_$insert(_el$34, deviceLabel);
|
|
441
|
+
var _el$34 = _$getNextElement(_tmpl$);
|
|
442
|
+
_$effect(() => _$className(_el$34, `ti ${deviceIcon(props.dictation.device())}`));
|
|
441
443
|
return _el$34;
|
|
444
|
+
})(), (() => {
|
|
445
|
+
var _el$35 = _$getNextElement(_tmpl$9);
|
|
446
|
+
_$insert(_el$35, deviceLabel);
|
|
447
|
+
return _el$35;
|
|
442
448
|
})(), _$getNextElement(_tmpl$0)];
|
|
443
449
|
}
|
|
444
450
|
});
|
|
445
451
|
}
|
|
446
|
-
}), _el$
|
|
447
|
-
_el$
|
|
448
|
-
_$use(bindStop, _el$
|
|
452
|
+
}), _el$41, _co$6);
|
|
453
|
+
_el$37.$$click = () => void props.dictation.stop();
|
|
454
|
+
_$use(bindStop, _el$37);
|
|
449
455
|
_$effect(_p$ => {
|
|
450
456
|
var _v$ = status(),
|
|
451
457
|
_v$2 = t().running,
|
|
@@ -453,12 +459,12 @@ export function DictationBar(props) {
|
|
|
453
459
|
_v$4 = warning() ? "true" : undefined,
|
|
454
460
|
_v$5 = t().stop,
|
|
455
461
|
_v$6 = t().stop;
|
|
456
|
-
_v$ !== _p$.e && _$setAttribute(_el$
|
|
457
|
-
_v$2 !== _p$.t && _$setAttribute(_el$
|
|
458
|
-
_v$3 !== _p$.a && _$setAttribute(_el$
|
|
459
|
-
_v$4 !== _p$.o && _$setAttribute(_el$
|
|
460
|
-
_v$5 !== _p$.i && _$setAttribute(_el$
|
|
461
|
-
_v$6 !== _p$.n && _$setAttribute(_el$
|
|
462
|
+
_v$ !== _p$.e && _$setAttribute(_el$29, "data-state", _p$.e = _v$);
|
|
463
|
+
_v$2 !== _p$.t && _$setAttribute(_el$29, "aria-label", _p$.t = _v$2);
|
|
464
|
+
_v$3 !== _p$.a && _$setAttribute(_el$31, "data-live", _p$.a = _v$3);
|
|
465
|
+
_v$4 !== _p$.o && _$setAttribute(_el$33, "data-warning", _p$.o = _v$4);
|
|
466
|
+
_v$5 !== _p$.i && _$setAttribute(_el$37, "aria-label", _p$.i = _v$5);
|
|
467
|
+
_v$6 !== _p$.n && _$setAttribute(_el$37, "title", _p$.n = _v$6);
|
|
462
468
|
return _p$;
|
|
463
469
|
}, {
|
|
464
470
|
e: undefined,
|
|
@@ -469,7 +475,7 @@ export function DictationBar(props) {
|
|
|
469
475
|
n: undefined
|
|
470
476
|
});
|
|
471
477
|
_$runHydrationEvents();
|
|
472
|
-
return _el$
|
|
478
|
+
return _el$29;
|
|
473
479
|
}
|
|
474
480
|
}), _$createComponent(Match, {
|
|
475
481
|
get when() {
|
|
@@ -488,20 +494,20 @@ export function DictationBar(props) {
|
|
|
488
494
|
minutes: minutes()
|
|
489
495
|
});
|
|
490
496
|
return (() => {
|
|
491
|
-
var _el$
|
|
492
|
-
_el$43 = _el$42.firstChild,
|
|
497
|
+
var _el$43 = _$getNextElement(_tmpl$12),
|
|
493
498
|
_el$44 = _el$43.firstChild,
|
|
494
|
-
_el$45 = _el$44.
|
|
499
|
+
_el$45 = _el$44.firstChild,
|
|
495
500
|
_el$46 = _el$45.nextSibling,
|
|
496
501
|
_el$47 = _el$46.nextSibling,
|
|
497
|
-
_el$
|
|
498
|
-
|
|
499
|
-
_el$51 = _el$50.nextSibling,
|
|
500
|
-
|
|
501
|
-
|
|
502
|
+
_el$48 = _el$47.nextSibling,
|
|
503
|
+
_el$50 = _el$44.nextSibling,
|
|
504
|
+
[_el$51, _co$7] = _$getNextMarker(_el$50.nextSibling),
|
|
505
|
+
_el$52 = _el$51.nextSibling,
|
|
506
|
+
[_el$53, _co$8] = _$getNextMarker(_el$52.nextSibling);
|
|
502
507
|
_$insert(_el$46, long);
|
|
503
|
-
_$insert(_el$47,
|
|
504
|
-
_$insert(_el$
|
|
508
|
+
_$insert(_el$47, long);
|
|
509
|
+
_$insert(_el$48, short);
|
|
510
|
+
_$insert(_el$43, _$createComponent(Button, {
|
|
505
511
|
ref: bindContinue,
|
|
506
512
|
size: "sm",
|
|
507
513
|
variant: "ghost",
|
|
@@ -510,8 +516,8 @@ export function DictationBar(props) {
|
|
|
510
516
|
get children() {
|
|
511
517
|
return t().continue;
|
|
512
518
|
}
|
|
513
|
-
}), _el$
|
|
514
|
-
_$insert(_el$
|
|
519
|
+
}), _el$51, _co$7);
|
|
520
|
+
_$insert(_el$43, _$createComponent(IconButton, {
|
|
515
521
|
size: "sm",
|
|
516
522
|
get label() {
|
|
517
523
|
return t().dismiss;
|
|
@@ -521,25 +527,25 @@ export function DictationBar(props) {
|
|
|
521
527
|
get children() {
|
|
522
528
|
return _$getNextElement(_tmpl$7);
|
|
523
529
|
}
|
|
524
|
-
}), _el$
|
|
530
|
+
}), _el$53, _co$8);
|
|
525
531
|
_$effect(_p$ => {
|
|
526
532
|
var _v$7 = ended() ? undefined : "danger",
|
|
527
533
|
_v$8 = `ti ${ended() ? "ti-clock" : "ti-alert-circle"}`;
|
|
528
|
-
_v$7 !== _p$.e && _$setAttribute(_el$
|
|
529
|
-
_v$8 !== _p$.t && _$className(_el$
|
|
534
|
+
_v$7 !== _p$.e && _$setAttribute(_el$44, "data-tone", _p$.e = _v$7);
|
|
535
|
+
_v$8 !== _p$.t && _$className(_el$45, _p$.t = _v$8);
|
|
530
536
|
return _p$;
|
|
531
537
|
}, {
|
|
532
538
|
e: undefined,
|
|
533
539
|
t: undefined
|
|
534
540
|
});
|
|
535
|
-
return _el$
|
|
541
|
+
return _el$43;
|
|
536
542
|
})();
|
|
537
543
|
}
|
|
538
544
|
})];
|
|
539
545
|
}
|
|
540
546
|
}));
|
|
541
|
-
_$effect(() => _$className(_el$
|
|
542
|
-
return _el$
|
|
547
|
+
_$effect(() => _$className(_el$20, `k2b-dictation-bar ${props.class ?? ""}`));
|
|
548
|
+
return _el$20;
|
|
543
549
|
})();
|
|
544
550
|
}
|
|
545
551
|
_$delegateEvents(["click"]);
|