@k2b/ui 0.36.0 → 0.37.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser/actions/Dropdown.js +132 -116
- package/dist/browser/actions/Dropdown.js.map +1 -1
- package/dist/browser/actions/Tabs.js +18 -15
- package/dist/browser/actions/Tabs.js.map +1 -1
- package/dist/browser/chat/ChatComposer.js +58 -25
- package/dist/browser/chat/ChatComposer.js.map +1 -1
- package/dist/browser/content/MessageRow.js +164 -152
- package/dist/browser/content/MessageRow.js.map +1 -1
- package/dist/browser/feedback/prompts.js +23 -9
- package/dist/browser/feedback/prompts.js.map +1 -1
- package/dist/browser/inputs/Combobox.js +56 -51
- package/dist/browser/inputs/Combobox.js.map +1 -1
- package/dist/browser/inputs/RichSelect.js +86 -67
- package/dist/browser/inputs/RichSelect.js.map +1 -1
- package/dist/browser/internal/keyed-for.js +47 -0
- package/dist/browser/internal/keyed-for.js.map +1 -0
- package/dist/browser/text-editor/engine.js +13 -10
- package/dist/browser/text-editor/engine.js.map +1 -1
- package/dist/ssr/actions/Dropdown.js +101 -85
- package/dist/ssr/actions/Dropdown.js.map +1 -1
- package/dist/ssr/actions/Tabs.js +12 -9
- package/dist/ssr/actions/Tabs.js.map +1 -1
- package/dist/ssr/chat/ChatComposer.js +41 -15
- package/dist/ssr/chat/ChatComposer.js.map +1 -1
- package/dist/ssr/content/MessageRow.js +9 -2
- package/dist/ssr/content/MessageRow.js.map +1 -1
- package/dist/ssr/feedback/prompts.js +22 -8
- package/dist/ssr/feedback/prompts.js.map +1 -1
- package/dist/ssr/inputs/Combobox.js +18 -13
- package/dist/ssr/inputs/Combobox.js.map +1 -1
- package/dist/ssr/inputs/RichSelect.js +47 -28
- package/dist/ssr/inputs/RichSelect.js.map +1 -1
- package/dist/ssr/internal/keyed-for.js +47 -0
- package/dist/ssr/internal/keyed-for.js.map +1 -0
- package/dist/ssr/text-editor/engine.js +13 -10
- package/dist/ssr/text-editor/engine.js.map +1 -1
- package/dist/types/content/MessageRow.d.ts +1 -1
- package/dist/types/feedback/prompts.d.ts +5 -0
- package/dist/types/internal/keyed-for.d.ts +13 -0
- package/dist/types/text-editor/engine.d.ts +1 -1
- package/package.json +3 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":[],"sources":["inputs/RichSelect.tsx"],"sourcesContent":["import {\n createEffect,\n createMemo,\n createSignal,\n createUniqueId,\n For,\n type JSX,\n Match,\n onCleanup,\n onMount,\n Show,\n Switch,\n untrack,\n} from \"solid-js\";\nimport { Button } from \"../actions/Button\";\nimport { dialogCore } from \"../feedback/dialog-core\";\nimport { createFieldMeta, Field, fieldControlAria } from \"../internal/field\";\nimport { LocaleProvider, useLocale } from \"../intl/locale\";\nimport BottomSheet, { bottomSheetOptions } from \"../layout/BottomSheet\";\nimport { createChoicePopover, filterChoiceOptions, nextEnabledChoiceIndex } from \"./choice\";\nimport type { ValueFieldProps } from \"./field-contract\";\nimport { commitFieldValue, resolveMaybeAccessor } from \"./field-contract\";\nimport { type RichSelectMessages, useRichSelectMessages } from \"./rich-select-messages\";\nimport type { ChoiceAppearance } from \"./Select\";\n\n/** One option: a name plus at most one short line. */\nexport type RichSelectItem = {\n value: string;\n /** Wraps; never truncated. */\n label: string;\n /** At most one short line that says what the choice changes. */\n description?: string;\n /** Icon class shown before the name. */\n icon?: string;\n /** Color dot shown before the name, such as a space color. Replaces `icon`. */\n color?: string;\n /** Creates a fresh visual for each render location. Replaces `icon` and `color`. */\n visual?: () => JSX.Element;\n /** Makes the row unavailable. The reason replaces `description`; the arrow keys still reach the row. */\n disabledReason?: string;\n /** Section id. Headings show only from eight options; keep each section's items together. */\n section?: string;\n /** Extra search terms that are not shown. */\n keywords?: readonly string[];\n};\n\nexport type RichSelectSection = { id: string; label: string };\n\nexport type RichSelectStatus = \"ready\" | \"loading\" | \"error\";\n\nexport type RichSelectFooter =\n | { label: string; icon?: string; onActivate: () => void }\n | { label: string; icon?: string; create: { placeholder: string; onCreate: (name: string) => void } };\n\nexport type RichSelectFact = {\n icon: string;\n text: JSX.Element;\n tone?: \"default\" | \"warning\";\n};\n\nexport type RichSelectProps = ValueFieldProps<string | null> & {\n items: readonly RichSelectItem[];\n /** Labels for the `section` ids of the items. */\n sections?: readonly RichSelectSection[];\n /** Names the list: the heading of a list without preview, the phone sheet title, and the listbox label. */\n title?: string;\n placeholder?: string;\n /** Replaces the selected item's name in the trigger, such as \"Name · address\". */\n triggerLabel?: string;\n /** Icon class for the trigger while no item with its own visual is selected. */\n icon?: string;\n tone?: \"default\" | \"warning\";\n /** Custom content inside the shared trigger button, which keeps the combobox semantics. */\n renderTrigger?: (selected: RichSelectItem | undefined) => JSX.Element;\n /**\n * The body of the preview beside the list, for options whose consequences differ.\n * Without it the picker shows only the list. Keep it to at most three facts.\n */\n renderPreview?: (item: RichSelectItem) => JSX.Element;\n searchPlaceholder?: string;\n status?: RichSelectStatus;\n onRetry?: () => void;\n /** Shown when the list is ready and has no items. */\n empty?: JSX.Element;\n footer?: RichSelectFooter;\n appearance?: ChoiceAppearance;\n placement?: \"bottom-start\" | \"top-start\";\n /** CSS lengths for the desktop popover. */\n size?: { width?: string; height?: string };\n name?: string;\n};\n\n/** Search and section headings appear from this many options. */\nexport const RICH_SELECT_SEARCH_FROM = 8;\nconst PHONE_QUERY = \"(max-width: 47.999rem)\";\nconst PLACEHOLDER_ROWS = 4;\n\ntype Row = { kind: \"heading\"; id: string; label: string } | { kind: \"item\"; item: RichSelectItem; index: number };\n\nconst isPhone = () => typeof matchMedia === \"function\" && matchMedia(PHONE_QUERY).matches;\n\nfunction RichSelectVisual(props: { item: RichSelectItem }): JSX.Element {\n return (\n <Switch>\n <Match when={props.item.visual}>{(visual) => <span class=\"k2b-rich-select__visual\">{visual()()}</span>}</Match>\n <Match when={props.item.color}>\n {(color) => (\n <span class=\"k2b-rich-select__visual\" aria-hidden=\"true\">\n <span class=\"k2b-rich-select__dot\" style={{ \"background-color\": color() }} />\n </span>\n )}\n </Match>\n <Match when={props.item.icon}>\n {(icon) => (\n <span class=\"k2b-rich-select__visual\" aria-hidden=\"true\">\n <i class={icon()} />\n </span>\n )}\n </Match>\n </Switch>\n );\n}\n\nconst hasVisual = (item: RichSelectItem) => Boolean(item.visual || item.color || item.icon);\n\n/** Name and second line. The reason of an unavailable row replaces the description. */\nfunction RichSelectRowText(props: { item: RichSelectItem; labelId: string; lineId: string }): JSX.Element {\n return (\n <span class=\"k2b-rich-select__text\">\n <span id={props.labelId} class=\"k2b-rich-select__label\">\n {props.item.label}\n </span>\n <Show when={props.item.disabledReason ?? props.item.description}>\n {(line) => (\n <span id={props.lineId} class=\"k2b-rich-select__line\" data-reason={props.item.disabledReason ? \"true\" : undefined}>\n {line()}\n </span>\n )}\n </Show>\n </span>\n );\n}\n\nfunction RichSelectPlaceholders(props: { visual: boolean }): JSX.Element {\n return (\n <For each={Array.from({ length: PLACEHOLDER_ROWS }, (_, index) => index)}>\n {(index) => (\n <div class=\"k2b-rich-select__placeholder\" data-visual={props.visual ? \"true\" : undefined} aria-hidden=\"true\">\n <Show when={props.visual}>\n <span class=\"k2b-rich-select__placeholder-visual\" />\n </Show>\n <span class=\"k2b-rich-select__placeholder-lines\">\n <span style={{ width: `${[58, 46, 66, 50][index % 4]}%` }} />\n <span style={{ width: `${[34, 28, 40, 30][index % 4]}%` }} />\n </span>\n </div>\n )}\n </For>\n );\n}\n\nfunction RichSelectState(props: {\n status: \"error\" | \"empty\";\n messages: RichSelectMessages;\n empty?: JSX.Element;\n onRetry?: () => void;\n restoreFocus?: () => void;\n}): JSX.Element {\n let retryButton: HTMLButtonElement | undefined;\n onCleanup(() => {\n if (retryButton && document.activeElement === retryButton) queueMicrotask(() => props.restoreFocus?.());\n });\n return (\n <div class=\"k2b-rich-select__state\" data-status={props.status} role={props.status === \"error\" ? \"alert\" : \"status\"}>\n <span class=\"k2b-rich-select__state-icon\" aria-hidden=\"true\">\n <i class={props.status === \"error\" ? \"ti ti-alert-triangle\" : \"ti ti-list-search\"} />\n </span>\n <Show\n when={props.status === \"error\"}\n fallback={<div class=\"k2b-rich-select__state-text\">{props.empty ?? props.messages.noOptions}</div>}\n >\n <div class=\"k2b-rich-select__state-text\">{props.messages.couldNotLoad}</div>\n <Show when={props.onRetry}>\n {(retry) => (\n <Button ref={retryButton} variant=\"secondary\" size=\"sm\" onClick={() => retry()()}>\n <i class=\"ti ti-refresh\" aria-hidden=\"true\" />\n {props.messages.retry}\n </Button>\n )}\n </Show>\n </Show>\n </div>\n );\n}\n\nfunction RichSelectPreview(props: { item: RichSelectItem; render: (item: RichSelectItem) => JSX.Element; id?: string }): JSX.Element {\n return (\n <div id={props.id}>\n <h3 class=\"k2b-rich-select__preview-title\">\n <RichSelectVisual item={props.item} />\n <span>{props.item.label}</span>\n </h3>\n {props.render(props.item)}\n </div>\n );\n}\n\n/** Up to three short facts for a preview, each with an icon; warnings in the warning tone. */\nexport function RichSelectFacts(props: { facts: readonly RichSelectFact[] }): JSX.Element {\n return (\n <ul class=\"k2b-rich-select__facts\">\n <For each={props.facts.slice(0, 3)}>\n {(fact) => (\n <li data-tone={fact.tone === \"warning\" ? \"warning\" : undefined}>\n <i class={fact.icon} aria-hidden=\"true\" />\n <span>{fact.text}</span>\n </li>\n )}\n </For>\n </ul>\n );\n}\n\nfunction RichSelectFooterControl(props: {\n footer: RichSelectFooter;\n initialName: () => string;\n messages: RichSelectMessages;\n done: (run: () => void) => void;\n restoreFocus: () => void;\n}): JSX.Element {\n const [creating, setCreating] = createSignal(false);\n const [name, setName] = createSignal(\"\");\n let input: HTMLInputElement | undefined;\n let start: HTMLButtonElement | undefined;\n let controls: HTMLDivElement | undefined;\n onCleanup(() => {\n if (controls?.contains(document.activeElement)) queueMicrotask(props.restoreFocus);\n });\n const create = () => {\n const footer = props.footer;\n const value = name().trim();\n if (!(\"create\" in footer) || !value) return;\n props.done(() => footer.create.onCreate(value));\n };\n return (\n <div ref={controls} class=\"k2b-rich-select__footer\">\n <Show\n when={creating() && \"create\" in props.footer ? props.footer.create : undefined}\n fallback={\n <button\n ref={start}\n type=\"button\"\n class=\"k2b-rich-select__footer-action\"\n onClick={() => {\n const footer = props.footer;\n if (\"create\" in footer) {\n setName(props.initialName());\n setCreating(true);\n queueMicrotask(() => input?.focus());\n } else props.done(footer.onActivate);\n }}\n >\n <span class=\"k2b-rich-select__visual\" aria-hidden=\"true\">\n <i class={props.footer.icon ?? \"ti ti-plus\"} />\n </span>\n <span class=\"k2b-rich-select__label\">{props.footer.label}</span>\n </button>\n }\n >\n {(create_) => (\n <div class=\"k2b-rich-select__create\">\n <input\n ref={input}\n class=\"k2b-rich-select__create-input\"\n value={name()}\n placeholder={create_().placeholder}\n aria-label={props.footer.label}\n autocomplete=\"off\"\n onInput={(event) => setName(event.currentTarget.value)}\n onKeyDown={(event) => {\n event.stopPropagation();\n if (event.key === \"Escape\") {\n event.preventDefault();\n setCreating(false);\n queueMicrotask(() => start?.focus());\n } else if (event.key === \"Enter\" && !event.isComposing) {\n event.preventDefault();\n create();\n }\n }}\n />\n <Button type=\"button\" variant=\"primary\" size=\"sm\" disabled={!name().trim()} onClick={create}>\n {props.messages.create}\n </Button>\n </div>\n )}\n </Show>\n </div>\n );\n}\n\n/**\n * A dropdown whose rows explain each choice: a name plus one short line, an\n * unavailable row with its reason, and an optional preview of what a choice\n * changes. Desktop opens a popover beside the trigger; a phone opens a bottom\n * sheet whose info buttons show the preview as a second level.\n */\nexport function RichSelect(props: RichSelectProps): JSX.Element {\n const messages = useRichSelectMessages();\n const locale = useLocale();\n const meta = createFieldMeta(props.id);\n const listboxId = `${meta.controlId}-listbox`;\n const previewId = `${meta.controlId}-preview`;\n const [query, setQuery] = createSignal(\"\");\n const [active, setActive] = createSignal(-1);\n const [height, setHeight] = createSignal<string>();\n const [sheetOpen, setSheetOpen] = createSignal(false);\n const [phone, setPhone] = createSignal(false);\n const [sheetId, setSheetId] = createSignal<string>();\n onMount(() => {\n const media = window.matchMedia(PHONE_QUERY);\n setPhone(media.matches);\n const update = () => setPhone(media.matches);\n media.addEventListener(\"change\", update);\n onCleanup(() => media.removeEventListener(\"change\", update));\n });\n let searchRef: HTMLInputElement | undefined;\n let closeSheet: (() => void) | undefined;\n const value = () => resolveMaybeAccessor(props.value) ?? null;\n const error = () => resolveMaybeAccessor(props.error);\n const status = () => props.status ?? \"ready\";\n const withPreview = () => Boolean(props.renderPreview);\n const title = () =>\n props.title ?? (typeof props.label === \"string\" ? props.label : (props[\"aria-label\"] ?? props.placeholder ?? messages().chooseOption));\n const searchable = () => status() === \"ready\" && props.items.length >= RICH_SELECT_SEARCH_FROM;\n const visible = createMemo(() => (searchable() ? filterChoiceOptions(props.items, query()) : props.items));\n const anyVisual = createMemo(() => props.items.some(hasVisual));\n const rows = createMemo<Row[]>(() => {\n const headings = props.items.length >= RICH_SELECT_SEARCH_FROM && props.sections ? props.sections : undefined;\n const result: Row[] = [];\n let section: string | undefined;\n visible().forEach((item, index) => {\n if (headings && item.section && item.section !== section) {\n const heading = headings.find((candidate) => candidate.id === item.section);\n if (heading) result.push({ kind: \"heading\", id: heading.id, label: heading.label });\n }\n section = item.section;\n result.push({ kind: \"item\", item, index });\n });\n return result;\n });\n const selected = createMemo(() => {\n const current = value();\n return current === null ? undefined : props.items.find((item) => item.value === current);\n });\n const activeItem = () => (status() === \"ready\" ? visible()[active()] : undefined);\n const optionId = (index: number) => `${listboxId}-${index}`;\n const popover = createChoicePopover(\n () => Boolean(props.disabled),\n () => ({ width: \"own\", side: props.placement === \"top-start\" ? \"above\" : \"below\" }),\n );\n const expanded = () => popover.open() || sheetOpen();\n const restorePopoverFocus = () => {\n if (popover.open()) (searchable() ? searchRef : popover.trigger())?.focus();\n };\n\n createEffect(() => {\n if (props.disabled) {\n popover.hide();\n closeSheet?.();\n }\n });\n createEffect(() => {\n const count = visible().length;\n if (!popover.open() || status() !== \"ready\") return;\n const current = untrack(active);\n if (current < 0 || current >= count) setActive(startIndex());\n });\n\n const scrollToActive = () => {\n const element = document.getElementById(optionId(active()));\n element?.scrollIntoView({ block: \"nearest\" });\n };\n const move = (next: number) => {\n if (next < 0) return;\n setActive(next);\n queueMicrotask(scrollToActive);\n };\n const startIndex = () => {\n const index = visible().findIndex((item) => item.value === value());\n return index >= 0 ? index : visible().length > 0 ? 0 : -1;\n };\n\n const openPopover = () => {\n setQuery(\"\");\n setActive(startIndex());\n // The preview popover keeps one height while it is open, so moving\n // through rows, filtering, or the end of loading never resizes it.\n const rowsTall = status() === \"ready\" ? props.items.length : PLACEHOLDER_ROWS;\n const rem = Math.min(27.5, Math.max(18.75, rowsTall * 3.625 + 1.5));\n setHeight(props.size?.height ?? (withPreview() ? `${rem}rem` : undefined));\n popover.show();\n if (searchable()) queueMicrotask(() => searchRef?.focus());\n queueMicrotask(scrollToActive);\n };\n const open = () => {\n if (props.disabled || expanded()) return;\n if (isPhone()) openSheet();\n else openPopover();\n };\n const close = (restoreFocus = false) => {\n popover.hide(restoreFocus);\n setQuery(\"\");\n setActive(-1);\n };\n const choose = (item: RichSelectItem | undefined) => {\n if (props.disabled || status() !== \"ready\" || !item || item.disabledReason) return;\n // Hide first: the old list must never stay visible with the next value.\n close(true);\n commitFieldValue(props, item.value);\n };\n const runFooter = (run: () => void) => {\n close(true);\n run();\n };\n\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.isComposing) return;\n const target = event.target;\n if (\n event.key !== \"Escape\" &&\n target instanceof Element &&\n target !== popover.trigger() &&\n target !== searchRef &&\n target.closest(\"input, button, textarea, a, [contenteditable]\")\n )\n return;\n const isOpen = popover.open();\n const count = visible().length;\n if (event.key === \"ArrowDown\" || event.key === \"ArrowUp\") {\n event.preventDefault();\n if (!isOpen) open();\n else if (status() === \"ready\") move(nextEnabledChoiceIndex(visible(), active(), event.key === \"ArrowDown\" ? 1 : -1));\n } else if ((event.key === \"Home\" || event.key === \"End\") && isOpen) {\n event.preventDefault();\n if (status() === \"ready\" && count > 0) move(event.key === \"Home\" ? 0 : count - 1);\n } else if ((event.key === \"Enter\" || event.key === \" \") && !isOpen && event.target === popover.trigger()) {\n event.preventDefault();\n open();\n } else if (event.key === \"Enter\" && isOpen) {\n // Enter on an unavailable row does nothing; the list stays open.\n event.preventDefault();\n choose(activeItem());\n } else if (event.key === \"Escape\" && isOpen) {\n // A closed picker lets Escape reach an enclosing dialog.\n event.preventDefault();\n event.stopPropagation();\n close(true);\n } else if (\n isOpen &&\n searchable() &&\n event.key.length === 1 &&\n !event.ctrlKey &&\n !event.metaKey &&\n !event.altKey &&\n event.target !== searchRef\n ) {\n // Typing anywhere in the open picker goes to the search field.\n event.preventDefault();\n setQuery(query() + event.key);\n setActive(visible().length > 0 ? 0 : -1);\n searchRef?.focus();\n }\n };\n const onFocusOut = (event: FocusEvent) => {\n const next = event.relatedTarget;\n if (!popover.open() || !(next instanceof Node)) return;\n if (popover.trigger()?.contains(next) || popoverElement?.contains(next)) return;\n close();\n };\n\n let popoverElement: HTMLDivElement | undefined;\n\n const openSheet = () => {\n const current = locale();\n const lifetime = new AbortController();\n // dialogCore can wait for a previous sheet's history traversal. Disabling\n // or unmounting the field must also cancel an opening that is still queued.\n closeSheet = () => lifetime.abort();\n let after: (() => void) | undefined;\n setSheetOpen(true);\n void dialogCore\n .open<void>(\n (closeDialog, context) => {\n context.dialog.id ||= `${meta.controlId}-sheet`;\n setSheetId(context.dialog.id);\n return (\n <LocaleProvider locale={current}>\n <BottomSheet onDismiss={context.requestDismiss}>\n <RichSelectSheet\n props={props}\n title={title()}\n value={value}\n dialog={context.dialog}\n close={() => closeDialog()}\n done={(run) => {\n after = run;\n closeDialog();\n }}\n />\n </BottomSheet>\n </LocaleProvider>\n );\n },\n {\n ...bottomSheetOptions,\n history: true,\n signal: lifetime.signal,\n // A phone keyboard must not cover the list as it opens: focus starts on the sheet.\n initialFocus: (dialog) => {\n dialog.tabIndex = -1;\n return dialog;\n },\n },\n )\n .then(() => {\n if (!lifetime.signal.aborted) after?.();\n })\n .finally(() => {\n closeSheet = undefined;\n setSheetOpen(false);\n });\n };\n onCleanup(() => closeSheet?.());\n\n const triggerText = () => props.triggerLabel ?? selected()?.label ?? props.placeholder ?? messages().chooseOption;\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\n class=\"k2b-choice-control k2b-rich-select\"\n data-appearance={props.appearance ?? \"field\"}\n data-invalid={error() ? \"true\" : undefined}\n onFocusOut={onFocusOut}\n >\n <button\n ref={popover.setTrigger}\n id={meta.controlId}\n type=\"button\"\n class=\"k2b-choice-trigger k2b-rich-select__trigger\"\n role=\"combobox\"\n aria-haspopup={sheetOpen() || (!popover.open() && phone()) ? \"dialog\" : \"listbox\"}\n aria-expanded={expanded()}\n aria-controls={sheetOpen() ? sheetId() : popover.open() ? listboxId : undefined}\n aria-activedescendant={popover.open() && activeItem() ? optionId(active()) : undefined}\n data-tone={props.tone === \"warning\" ? \"warning\" : undefined}\n {...fieldControlAria(meta, {\n ...props,\n \"aria-label\": props[\"aria-label\"] ?? (typeof props.label === \"string\" ? undefined : title()),\n })}\n disabled={props.disabled}\n onClick={() => (popover.open() ? close() : open())}\n onKeyDown={onKeyDown}\n >\n <Show\n when={props.renderTrigger}\n fallback={\n <>\n <Show\n when={selected() && hasVisual(selected()!) ? selected() : undefined}\n fallback={<Show when={props.icon}>{(icon) => <i class={icon()} aria-hidden=\"true\" />}</Show>}\n >\n {(item) => <RichSelectVisual item={item()} />}\n </Show>\n <span class=\"k2b-choice-trigger__value\" data-placeholder={selected() || props.triggerLabel ? undefined : \"true\"}>\n {triggerText()}\n </span>\n <i class=\"ti ti-selector k2b-choice-trigger__chevron\" aria-hidden=\"true\" />\n </>\n }\n >\n {(render) => render()(selected())}\n </Show>\n </button>\n <Show when={props.name}>{(name) => <input type=\"hidden\" name={name()} value={value() ?? \"\"} />}</Show>\n <div\n ref={(element) => {\n popoverElement = element;\n popover.setPopover(element);\n }}\n popover=\"manual\"\n class=\"k2b-choice-popover k2b-rich-select__popover\"\n role=\"group\"\n aria-label={title()}\n data-preview={withPreview() ? \"true\" : undefined}\n data-status={status()}\n style={{ width: props.size?.width, height: height() }}\n onKeyDown={onKeyDown}\n onPointerDown={(event) => {\n // Keep focus on the trigger or search field, so the keys keep working after a click on the preview.\n if (!(event.target as Element).closest(\"input, button, textarea, a\")) event.preventDefault();\n }}\n >\n <Show when={!withPreview()}>\n <div class=\"k2b-rich-select__title\" aria-hidden=\"true\">\n {title()}\n </div>\n </Show>\n <Switch>\n <Match when={status() === \"error\"}>\n <div id={listboxId} role=\"listbox\" aria-label={title()} />\n <RichSelectState status=\"error\" messages={messages()} onRetry={props.onRetry} restoreFocus={restorePopoverFocus} />\n </Match>\n <Match when={status() === \"ready\" && props.items.length === 0}>\n <div id={listboxId} role=\"listbox\" aria-label={title()} />\n <RichSelectState status=\"empty\" messages={messages()} empty={props.empty} />\n <Show when={props.footer}>\n {(footer) => (\n <RichSelectFooterControl\n footer={footer()}\n initialName={query}\n messages={messages()}\n done={runFooter}\n restoreFocus={restorePopoverFocus}\n />\n )}\n </Show>\n </Match>\n <Match when>\n <div class=\"k2b-rich-select__body\">\n <div class=\"k2b-rich-select__column\">\n <Show when={searchable()}>\n <div class=\"k2b-choice-search k2b-rich-select__search\">\n <i class=\"ti ti-search\" aria-hidden=\"true\" />\n <input\n ref={(input) => {\n searchRef = input;\n onCleanup(() => {\n if (document.activeElement === input)\n queueMicrotask(() => {\n if (popover.open()) popover.trigger()?.focus();\n });\n });\n }}\n type=\"search\"\n role=\"combobox\"\n aria-expanded={popover.open()}\n aria-autocomplete=\"list\"\n value={query()}\n placeholder={props.searchPlaceholder ?? messages().search}\n aria-label={props.searchPlaceholder ?? messages().search}\n aria-controls={listboxId}\n aria-activedescendant={activeItem() ? optionId(active()) : undefined}\n autocomplete=\"off\"\n onInput={(event) => {\n setQuery(event.currentTarget.value);\n setActive(visible().length > 0 ? 0 : -1);\n }}\n />\n </div>\n </Show>\n <div\n id={listboxId}\n class=\"k2b-rich-select__list\"\n role=\"listbox\"\n aria-label={title()}\n aria-busy={status() === \"loading\" ? \"true\" : undefined}\n data-visual={anyVisual() ? \"true\" : undefined}\n data-choice-scroll\n >\n <Show when={status() === \"loading\"}>\n <span class=\"k2b-sr-only\">{messages().loading}</span>\n <RichSelectPlaceholders visual={anyVisual() || props.items.length === 0} />\n </Show>\n <Show when={status() === \"ready\"}>\n <For each={rows()} fallback={<div class=\"k2b-rich-select__no-results\">{messages().noResults}</div>}>\n {(row) =>\n row.kind === \"heading\" ? (\n <div class=\"k2b-rich-select__heading\" role=\"presentation\">\n {row.label}\n </div>\n ) : (\n // biome-ignore lint/a11y/useKeyWithClickEvents: the trigger or search field handles the keys through aria-activedescendant.\n <div\n id={optionId(row.index)}\n class=\"k2b-rich-select__option\"\n role=\"option\"\n aria-selected={row.item.value === value()}\n aria-disabled={row.item.disabledReason ? \"true\" : undefined}\n aria-labelledby={`${optionId(row.index)}-label`}\n aria-describedby={\n [\n row.item.disabledReason || row.item.description ? `${optionId(row.index)}-line` : \"\",\n withPreview() && row.index === active() ? previewId : \"\",\n ]\n .filter(Boolean)\n .join(\" \") || undefined\n }\n data-active={row.index === active() ? \"true\" : undefined}\n onPointerMove={() => {\n if (active() !== row.index) setActive(row.index);\n }}\n onClick={() => choose(row.item)}\n >\n <Show when={anyVisual()}>\n <Show when={hasVisual(row.item)} fallback={<span class=\"k2b-rich-select__visual\" />}>\n <RichSelectVisual item={row.item} />\n </Show>\n </Show>\n <RichSelectRowText\n item={row.item}\n labelId={`${optionId(row.index)}-label`}\n lineId={`${optionId(row.index)}-line`}\n />\n <i class=\"ti ti-check k2b-rich-select__check\" aria-hidden=\"true\" />\n </div>\n )\n }\n </For>\n </Show>\n </div>\n <Show when={props.footer && status() === \"ready\"}>\n <RichSelectFooterControl\n footer={props.footer!}\n initialName={query}\n messages={messages()}\n done={runFooter}\n restoreFocus={restorePopoverFocus}\n />\n </Show>\n </div>\n <Show when={props.renderPreview}>\n {(render) => (\n <div class=\"k2b-rich-select__preview\" data-choice-scroll>\n <Show when={status() === \"loading\"}>\n <div class=\"k2b-rich-select__preview-placeholder\" aria-hidden=\"true\">\n <span />\n <span style={{ width: \"86%\" }} />\n <span style={{ width: \"72%\" }} />\n <span style={{ width: \"80%\" }} />\n </div>\n </Show>\n <Show when={activeItem()}>{(item) => <RichSelectPreview id={previewId} item={item()} render={render()} />}</Show>\n </div>\n )}\n </Show>\n </div>\n </Match>\n </Switch>\n </div>\n </div>\n </Field>\n );\n}\n\n/**\n * The phone presentation: a bottom sheet with the list. With a preview, an\n * info button beside each row, unavailable rows included, opens the preview as\n * a second level with Back and Choose.\n */\nfunction RichSelectSheet(sheet: {\n props: RichSelectProps;\n title: string;\n value: () => string | null;\n dialog: HTMLDialogElement;\n close: () => void;\n done: (run: () => void) => void;\n}): JSX.Element {\n const messages = useRichSelectMessages();\n const props = sheet.props;\n const uid = createUniqueId();\n const [query, setQuery] = createSignal(\"\");\n const [detailValue, setDetailValue] = createSignal<string>();\n // Resolve from the current snapshot: access and availability can change while\n // the detail level is open.\n const detail = createMemo(() => props.items.find((item) => item.value === detailValue()));\n let back: HTMLButtonElement | undefined;\n let returnValue: string | undefined;\n const status = () => props.status ?? \"ready\";\n const searchable = () => status() === \"ready\" && props.items.length >= RICH_SELECT_SEARCH_FROM;\n const visible = createMemo(() => (searchable() ? filterChoiceOptions(props.items, query()) : props.items));\n const anyVisual = createMemo(() => props.items.some(hasVisual));\n const headings = () => (props.items.length >= RICH_SELECT_SEARCH_FROM && props.sections ? props.sections : undefined);\n const restoreSheetFocus = () => {\n if (sheet.dialog.open) sheet.dialog.focus();\n };\n const headingBefore = (index: number) => {\n const item = visible()[index];\n const list = headings();\n if (!list || !item?.section || visible()[index - 1]?.section === item.section) return undefined;\n return list.find((candidate) => candidate.id === item.section)?.label;\n };\n const choose = (item: RichSelectItem) => {\n if (props.disabled || status() !== \"ready\" || item.disabledReason) return;\n sheet.done(() => {\n const current = props.items.find((candidate) => candidate.value === item.value);\n if (!props.disabled && status() === \"ready\" && current && !current.disabledReason) commitFieldValue(props, current.value);\n });\n };\n const rowId = (index: number) => `k2b-rich-select-sheet-${uid}-${index}`;\n const showDetail = (item: RichSelectItem) => {\n returnValue = item.value;\n // The second level keeps the sheet's height, so Back and Choose stay where they are.\n sheet.dialog.style.minHeight = `${sheet.dialog.getBoundingClientRect().height}px`;\n setDetailValue(item.value);\n queueMicrotask(() => back?.focus());\n };\n const leaveDetail = () => {\n sheet.dialog.style.minHeight = \"\";\n setDetailValue(undefined);\n const value = returnValue;\n queueMicrotask(() => {\n const index = visible().findIndex((item) => item.value === value);\n const original = index >= 0 ? document.getElementById(`${rowId(index)}-info`) : undefined;\n const fallback = sheet.dialog.querySelector<HTMLButtonElement>(\".k2b-rich-select__sheet-row > button\");\n (original ?? fallback ?? sheet.dialog).focus();\n });\n };\n createEffect(() => {\n if (detailValue() !== undefined && (!detail() || status() !== \"ready\")) leaveDetail();\n });\n // Escape on the second level goes back to the list instead of closing the sheet.\n const onEscape = (event: KeyboardEvent) => {\n if (event.key !== \"Escape\" || !detail()) return;\n event.preventDefault();\n event.stopPropagation();\n leaveDetail();\n };\n onMount(() => {\n sheet.dialog.addEventListener(\"keydown\", onEscape, true);\n onCleanup(() => {\n sheet.dialog.removeEventListener(\"keydown\", onEscape, true);\n // dialogCore may reuse the dialog element for the next dialog.\n sheet.dialog.style.minHeight = \"\";\n });\n });\n\n return (\n <>\n <header class=\"k2b-rich-select__sheet-header\">\n <Show when={detail()}>\n <button ref={back} type=\"button\" class=\"k2b-dialog__close\" aria-label={messages().back} onClick={leaveDetail}>\n <i class=\"ti ti-chevron-left\" aria-hidden=\"true\" />\n </button>\n </Show>\n <h2>{detail()?.label ?? sheet.title}</h2>\n <button type=\"button\" class=\"k2b-dialog__close\" aria-label={messages().close} onClick={sheet.close}>\n <i class=\"ti ti-x\" aria-hidden=\"true\" />\n </button>\n </header>\n <Show\n when={detail()}\n fallback={\n <BottomSheet.Body>\n <Switch>\n <Match when={status() === \"error\"}>\n <RichSelectState status=\"error\" messages={messages()} onRetry={props.onRetry} restoreFocus={restoreSheetFocus} />\n </Match>\n <Match when={status() === \"ready\" && props.items.length === 0}>\n <RichSelectState status=\"empty\" messages={messages()} empty={props.empty} />\n <Show when={props.footer}>\n {(footer) => (\n <RichSelectFooterControl\n footer={footer()}\n initialName={query}\n messages={messages()}\n done={sheet.done}\n restoreFocus={restoreSheetFocus}\n />\n )}\n </Show>\n </Match>\n <Match when>\n <Show when={searchable()}>\n <div class=\"k2b-choice-search k2b-rich-select__search\">\n <i class=\"ti ti-search\" aria-hidden=\"true\" />\n <input\n ref={(input) => {\n onCleanup(() => {\n if (document.activeElement === input) queueMicrotask(restoreSheetFocus);\n });\n }}\n type=\"search\"\n value={query()}\n placeholder={props.searchPlaceholder ?? messages().search}\n aria-label={props.searchPlaceholder ?? messages().search}\n autocomplete=\"off\"\n onInput={(event) => setQuery(event.currentTarget.value)}\n />\n </div>\n </Show>\n <div\n class=\"k2b-rich-select__list\"\n role=\"list\"\n aria-label={sheet.title}\n aria-busy={status() === \"loading\" ? \"true\" : undefined}\n data-visual={anyVisual() ? \"true\" : undefined}\n >\n <Show when={status() === \"loading\"}>\n <span class=\"k2b-sr-only\">{messages().loading}</span>\n <RichSelectPlaceholders visual={anyVisual() || props.items.length === 0} />\n </Show>\n <Show when={status() === \"ready\"}>\n <For each={visible()} fallback={<div class=\"k2b-rich-select__no-results\">{messages().noResults}</div>}>\n {(item, index) => (\n <>\n <Show when={headingBefore(index())}>{(label) => <div class=\"k2b-rich-select__heading\">{label()}</div>}</Show>\n <div class=\"k2b-rich-select__sheet-row\" role=\"listitem\" data-info={props.renderPreview ? \"true\" : undefined}>\n <button\n id={rowId(index())}\n type=\"button\"\n class=\"k2b-rich-select__option\"\n aria-current={item.value === sheet.value() ? \"true\" : undefined}\n aria-disabled={item.disabledReason ? \"true\" : undefined}\n aria-labelledby={`${rowId(index())}-label`}\n aria-describedby={item.disabledReason || item.description ? `${rowId(index())}-line` : undefined}\n onClick={() => choose(item)}\n >\n <Show when={anyVisual()}>\n <Show when={hasVisual(item)} fallback={<span class=\"k2b-rich-select__visual\" />}>\n <RichSelectVisual item={item} />\n </Show>\n </Show>\n <RichSelectRowText item={item} labelId={`${rowId(index())}-label`} lineId={`${rowId(index())}-line`} />\n <i class=\"ti ti-check k2b-rich-select__check\" aria-hidden=\"true\" />\n </button>\n <Show when={props.renderPreview}>\n <button\n id={`${rowId(index())}-info`}\n type=\"button\"\n class=\"k2b-rich-select__info\"\n aria-label={messages().detailsFor({ name: item.label })}\n onClick={() => showDetail(item)}\n >\n <i class=\"ti ti-info-circle\" aria-hidden=\"true\" />\n </button>\n </Show>\n </div>\n </>\n )}\n </For>\n </Show>\n </div>\n <Show when={props.footer && status() === \"ready\"}>\n <RichSelectFooterControl\n footer={props.footer!}\n initialName={query}\n messages={messages()}\n done={sheet.done}\n restoreFocus={restoreSheetFocus}\n />\n </Show>\n </Match>\n </Switch>\n </BottomSheet.Body>\n }\n >\n {(item) => (\n <>\n <BottomSheet.Body>\n <div class=\"k2b-rich-select__preview\" data-level=\"detail\">\n <RichSelectPreview item={item()} render={props.renderPreview!} />\n </div>\n </BottomSheet.Body>\n <BottomSheet.Footer>\n <Button\n variant=\"primary\"\n size=\"lg\"\n class=\"k2b-rich-select__choose\"\n disabled={Boolean(item().disabledReason)}\n onClick={() => choose(item())}\n >\n <i class=\"ti ti-check\" aria-hidden=\"true\" />\n {messages().choose}\n </Button>\n </BottomSheet.Footer>\n </>\n )}\n </Show>\n </>\n );\n}\n\nexport default RichSelect;\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":[],"sources":["inputs/RichSelect.tsx"],"sourcesContent":["import {\n createEffect,\n createMemo,\n createSignal,\n createUniqueId,\n For,\n type JSX,\n Match,\n onCleanup,\n onMount,\n Show,\n Switch,\n untrack,\n} from \"solid-js\";\nimport { Button } from \"../actions/Button\";\nimport { dialogCore } from \"../feedback/dialog-core\";\nimport { createFieldMeta, Field, fieldControlAria } from \"../internal/field\";\nimport { LocaleProvider, useLocale } from \"../intl/locale\";\nimport BottomSheet, { bottomSheetOptions } from \"../layout/BottomSheet\";\nimport { createChoicePopover, filterChoiceOptions, nextEnabledChoiceIndex } from \"./choice\";\nimport type { ValueFieldProps } from \"./field-contract\";\nimport { commitFieldValue, resolveMaybeAccessor } from \"./field-contract\";\nimport { type RichSelectMessages, useRichSelectMessages } from \"./rich-select-messages\";\nimport type { ChoiceAppearance } from \"./Select\";\n\n/** One option: a name plus at most one short line. */\nexport type RichSelectItem = {\n value: string;\n /** Wraps; never truncated. */\n label: string;\n /** At most one short line that says what the choice changes. */\n description?: string;\n /** Icon class shown before the name. */\n icon?: string;\n /** Color dot shown before the name, such as a space color. Replaces `icon`. */\n color?: string;\n /** Creates a fresh visual for each render location. Replaces `icon` and `color`. */\n visual?: () => JSX.Element;\n /** Makes the row unavailable. The reason replaces `description`; the arrow keys still reach the row. */\n disabledReason?: string;\n /** Section id. Headings show only from eight options; keep each section's items together. */\n section?: string;\n /** Extra search terms that are not shown. */\n keywords?: readonly string[];\n};\n\nexport type RichSelectSection = { id: string; label: string };\n\nexport type RichSelectStatus = \"ready\" | \"loading\" | \"error\";\n\nexport type RichSelectFooter =\n | { label: string; icon?: string; onActivate: () => void }\n | { label: string; icon?: string; create: { placeholder: string; onCreate: (name: string) => void } };\n\nexport type RichSelectFact = {\n icon: string;\n text: JSX.Element;\n tone?: \"default\" | \"warning\";\n};\n\nexport type RichSelectProps = ValueFieldProps<string | null> & {\n items: readonly RichSelectItem[];\n /** Labels for the `section` ids of the items. */\n sections?: readonly RichSelectSection[];\n /** Names the list: the heading of a list without preview, the phone sheet title, and the listbox label. */\n title?: string;\n placeholder?: string;\n /** Replaces the selected item's name in the trigger, such as \"Name · address\". */\n triggerLabel?: string;\n /** Icon class for the trigger while no item with its own visual is selected. */\n icon?: string;\n tone?: \"default\" | \"warning\";\n /** Custom content inside the shared trigger button, which keeps the combobox semantics. */\n renderTrigger?: (selected: RichSelectItem | undefined) => JSX.Element;\n /**\n * The body of the preview beside the list, for options whose consequences differ.\n * Without it the picker shows only the list. Keep it to at most three facts.\n */\n renderPreview?: (item: RichSelectItem) => JSX.Element;\n searchPlaceholder?: string;\n status?: RichSelectStatus;\n onRetry?: () => void;\n /** Shown when the list is ready and has no items. */\n empty?: JSX.Element;\n footer?: RichSelectFooter;\n appearance?: ChoiceAppearance;\n placement?: \"bottom-start\" | \"top-start\";\n /** CSS lengths for the desktop popover. */\n size?: { width?: string; height?: string };\n name?: string;\n};\n\n/** Search and section headings appear from this many options. */\nexport const RICH_SELECT_SEARCH_FROM = 8;\nconst PHONE_QUERY = \"(max-width: 47.999rem)\";\nconst PLACEHOLDER_ROWS = 4;\n\ntype Row = { kind: \"heading\"; id: string; label: string } | { kind: \"item\"; item: RichSelectItem; index: number };\n\nconst rowKey = (row: Row) => (row.kind === \"heading\" ? `heading:${row.id}` : `item:${row.item.value}`);\n\nconst isPhone = () => typeof matchMedia === \"function\" && matchMedia(PHONE_QUERY).matches;\n\nfunction RichSelectVisual(props: { item: RichSelectItem }): JSX.Element {\n return (\n <Switch>\n <Match when={props.item.visual}>{(visual) => <span class=\"k2b-rich-select__visual\">{visual()()}</span>}</Match>\n <Match when={props.item.color}>\n {(color) => (\n <span class=\"k2b-rich-select__visual\" aria-hidden=\"true\">\n <span class=\"k2b-rich-select__dot\" style={{ \"background-color\": color() }} />\n </span>\n )}\n </Match>\n <Match when={props.item.icon}>\n {(icon) => (\n <span class=\"k2b-rich-select__visual\" aria-hidden=\"true\">\n <i class={icon()} />\n </span>\n )}\n </Match>\n </Switch>\n );\n}\n\nconst hasVisual = (item: RichSelectItem) => Boolean(item.visual || item.color || item.icon);\n\n/** Name and second line. The reason of an unavailable row replaces the description. */\nfunction RichSelectRowText(props: { item: RichSelectItem; labelId: string; lineId: string }): JSX.Element {\n return (\n <span class=\"k2b-rich-select__text\">\n <span id={props.labelId} class=\"k2b-rich-select__label\">\n {props.item.label}\n </span>\n <Show when={props.item.disabledReason ?? props.item.description}>\n {(line) => (\n <span id={props.lineId} class=\"k2b-rich-select__line\" data-reason={props.item.disabledReason ? \"true\" : undefined}>\n {line()}\n </span>\n )}\n </Show>\n </span>\n );\n}\n\nfunction RichSelectPlaceholders(props: { visual: boolean }): JSX.Element {\n return (\n <For each={Array.from({ length: PLACEHOLDER_ROWS }, (_, index) => index)}>\n {(index) => (\n <div class=\"k2b-rich-select__placeholder\" data-visual={props.visual ? \"true\" : undefined} aria-hidden=\"true\">\n <Show when={props.visual}>\n <span class=\"k2b-rich-select__placeholder-visual\" />\n </Show>\n <span class=\"k2b-rich-select__placeholder-lines\">\n <span style={{ width: `${[58, 46, 66, 50][index % 4]}%` }} />\n <span style={{ width: `${[34, 28, 40, 30][index % 4]}%` }} />\n </span>\n </div>\n )}\n </For>\n );\n}\n\nfunction RichSelectState(props: {\n status: \"error\" | \"empty\";\n messages: RichSelectMessages;\n empty?: JSX.Element;\n onRetry?: () => void;\n restoreFocus?: () => void;\n}): JSX.Element {\n let retryButton: HTMLButtonElement | undefined;\n onCleanup(() => {\n if (retryButton && document.activeElement === retryButton) queueMicrotask(() => props.restoreFocus?.());\n });\n return (\n <div class=\"k2b-rich-select__state\" data-status={props.status} role={props.status === \"error\" ? \"alert\" : \"status\"}>\n <span class=\"k2b-rich-select__state-icon\" aria-hidden=\"true\">\n <i class={props.status === \"error\" ? \"ti ti-alert-triangle\" : \"ti ti-list-search\"} />\n </span>\n <Show\n when={props.status === \"error\"}\n fallback={<div class=\"k2b-rich-select__state-text\">{props.empty ?? props.messages.noOptions}</div>}\n >\n <div class=\"k2b-rich-select__state-text\">{props.messages.couldNotLoad}</div>\n <Show when={props.onRetry}>\n {(retry) => (\n <Button ref={retryButton} variant=\"secondary\" size=\"sm\" onClick={() => retry()()}>\n <i class=\"ti ti-refresh\" aria-hidden=\"true\" />\n {props.messages.retry}\n </Button>\n )}\n </Show>\n </Show>\n </div>\n );\n}\n\nfunction RichSelectPreview(props: { item: RichSelectItem; render: (item: RichSelectItem) => JSX.Element; id?: string }): JSX.Element {\n return (\n <div id={props.id}>\n <h3 class=\"k2b-rich-select__preview-title\">\n <RichSelectVisual item={props.item} />\n <span>{props.item.label}</span>\n </h3>\n {props.render(props.item)}\n </div>\n );\n}\n\n/** Up to three short facts for a preview, each with an icon; warnings in the warning tone. */\nexport function RichSelectFacts(props: { facts: readonly RichSelectFact[] }): JSX.Element {\n return (\n <ul class=\"k2b-rich-select__facts\">\n <For each={props.facts.slice(0, 3)}>\n {(fact) => (\n <li data-tone={fact.tone === \"warning\" ? \"warning\" : undefined}>\n <i class={fact.icon} aria-hidden=\"true\" />\n <span>{fact.text}</span>\n </li>\n )}\n </For>\n </ul>\n );\n}\n\nfunction RichSelectFooterControl(props: {\n footer: RichSelectFooter;\n initialName: () => string;\n messages: RichSelectMessages;\n done: (run: () => void) => void;\n restoreFocus: () => void;\n}): JSX.Element {\n const [creating, setCreating] = createSignal(false);\n const [name, setName] = createSignal(\"\");\n let input: HTMLInputElement | undefined;\n let start: HTMLButtonElement | undefined;\n let controls: HTMLDivElement | undefined;\n onCleanup(() => {\n if (controls?.contains(document.activeElement)) queueMicrotask(props.restoreFocus);\n });\n const create = () => {\n const footer = props.footer;\n const value = name().trim();\n if (!(\"create\" in footer) || !value) return;\n props.done(() => footer.create.onCreate(value));\n };\n return (\n <div ref={controls} class=\"k2b-rich-select__footer\">\n <Show\n when={creating() && \"create\" in props.footer ? props.footer.create : undefined}\n fallback={\n <button\n ref={start}\n type=\"button\"\n class=\"k2b-rich-select__footer-action\"\n onClick={() => {\n const footer = props.footer;\n if (\"create\" in footer) {\n setName(props.initialName());\n setCreating(true);\n queueMicrotask(() => input?.focus());\n } else props.done(footer.onActivate);\n }}\n >\n <span class=\"k2b-rich-select__visual\" aria-hidden=\"true\">\n <i class={props.footer.icon ?? \"ti ti-plus\"} />\n </span>\n <span class=\"k2b-rich-select__label\">{props.footer.label}</span>\n </button>\n }\n >\n {(create_) => (\n <div class=\"k2b-rich-select__create\">\n <input\n ref={input}\n class=\"k2b-rich-select__create-input\"\n value={name()}\n placeholder={create_().placeholder}\n aria-label={props.footer.label}\n autocomplete=\"off\"\n onInput={(event) => setName(event.currentTarget.value)}\n onKeyDown={(event) => {\n event.stopPropagation();\n if (event.key === \"Escape\") {\n event.preventDefault();\n setCreating(false);\n queueMicrotask(() => start?.focus());\n } else if (event.key === \"Enter\" && !event.isComposing) {\n event.preventDefault();\n create();\n }\n }}\n />\n <Button type=\"button\" variant=\"primary\" size=\"sm\" disabled={!name().trim()} onClick={create}>\n {props.messages.create}\n </Button>\n </div>\n )}\n </Show>\n </div>\n );\n}\n\n/**\n * A dropdown whose rows explain each choice: a name plus one short line, an\n * unavailable row with its reason, and an optional preview of what a choice\n * changes. Desktop opens a popover beside the trigger; a phone opens a bottom\n * sheet whose info buttons show the preview as a second level.\n */\nexport function RichSelect(props: RichSelectProps): JSX.Element {\n const messages = useRichSelectMessages();\n const locale = useLocale();\n const meta = createFieldMeta(props.id);\n const listboxId = `${meta.controlId}-listbox`;\n const previewId = `${meta.controlId}-preview`;\n const [query, setQuery] = createSignal(\"\");\n const [active, setActive] = createSignal(-1);\n const [height, setHeight] = createSignal<string>();\n const [sheetOpen, setSheetOpen] = createSignal(false);\n const [phone, setPhone] = createSignal(false);\n const [sheetId, setSheetId] = createSignal<string>();\n onMount(() => {\n const media = window.matchMedia(PHONE_QUERY);\n setPhone(media.matches);\n const update = () => setPhone(media.matches);\n media.addEventListener(\"change\", update);\n onCleanup(() => media.removeEventListener(\"change\", update));\n });\n let searchRef: HTMLInputElement | undefined;\n let closeSheet: (() => void) | undefined;\n const value = () => resolveMaybeAccessor(props.value) ?? null;\n const error = () => resolveMaybeAccessor(props.error);\n const status = () => props.status ?? \"ready\";\n const withPreview = () => Boolean(props.renderPreview);\n const title = () =>\n props.title ?? (typeof props.label === \"string\" ? props.label : (props[\"aria-label\"] ?? props.placeholder ?? messages().chooseOption));\n const searchable = () => status() === \"ready\" && props.items.length >= RICH_SELECT_SEARCH_FROM;\n const visible = createMemo(() => (searchable() ? filterChoiceOptions(props.items, query()) : props.items));\n const anyVisual = createMemo(() => props.items.some(hasVisual));\n const rows = createMemo<Row[]>(() => {\n const headings = props.items.length >= RICH_SELECT_SEARCH_FROM && props.sections ? props.sections : undefined;\n const result: Row[] = [];\n let section: string | undefined;\n visible().forEach((item, index) => {\n if (headings && item.section && item.section !== section) {\n const heading = headings.find((candidate) => candidate.id === item.section);\n if (heading) result.push({ kind: \"heading\", id: heading.id, label: heading.label });\n }\n section = item.section;\n result.push({ kind: \"item\", item, index });\n });\n return result;\n });\n // Rows are keyed by heading and value, not by object: a host that rebuilds equal items must not replace the option\n // under a press, which would swallow its click.\n const rowsByKey = createMemo(() => new Map(rows().map((row) => [rowKey(row), row])));\n const selected = createMemo(() => {\n const current = value();\n return current === null ? undefined : props.items.find((item) => item.value === current);\n });\n const activeItem = () => (status() === \"ready\" ? visible()[active()] : undefined);\n const optionId = (index: number) => `${listboxId}-${index}`;\n const popover = createChoicePopover(\n () => Boolean(props.disabled),\n () => ({ width: \"own\", side: props.placement === \"top-start\" ? \"above\" : \"below\" }),\n );\n const expanded = () => popover.open() || sheetOpen();\n const restorePopoverFocus = () => {\n if (popover.open()) (searchable() ? searchRef : popover.trigger())?.focus();\n };\n\n createEffect(() => {\n if (props.disabled) {\n popover.hide();\n closeSheet?.();\n }\n });\n createEffect(() => {\n const count = visible().length;\n if (!popover.open() || status() !== \"ready\") return;\n const current = untrack(active);\n if (current < 0 || current >= count) setActive(startIndex());\n });\n\n const scrollToActive = () => {\n const element = document.getElementById(optionId(active()));\n element?.scrollIntoView({ block: \"nearest\" });\n };\n const move = (next: number) => {\n if (next < 0) return;\n setActive(next);\n queueMicrotask(scrollToActive);\n };\n const startIndex = () => {\n const index = visible().findIndex((item) => item.value === value());\n return index >= 0 ? index : visible().length > 0 ? 0 : -1;\n };\n\n const openPopover = () => {\n setQuery(\"\");\n setActive(startIndex());\n // The preview popover keeps one height while it is open, so moving\n // through rows, filtering, or the end of loading never resizes it.\n const rowsTall = status() === \"ready\" ? props.items.length : PLACEHOLDER_ROWS;\n const rem = Math.min(27.5, Math.max(18.75, rowsTall * 3.625 + 1.5));\n setHeight(props.size?.height ?? (withPreview() ? `${rem}rem` : undefined));\n popover.show();\n if (searchable()) queueMicrotask(() => searchRef?.focus());\n queueMicrotask(scrollToActive);\n };\n const open = () => {\n if (props.disabled || expanded()) return;\n if (isPhone()) openSheet();\n else openPopover();\n };\n const close = (restoreFocus = false) => {\n popover.hide(restoreFocus);\n setQuery(\"\");\n setActive(-1);\n };\n const choose = (item: RichSelectItem | undefined) => {\n if (props.disabled || status() !== \"ready\" || !item || item.disabledReason) return;\n // Hide first: the old list must never stay visible with the next value.\n close(true);\n commitFieldValue(props, item.value);\n };\n const runFooter = (run: () => void) => {\n close(true);\n run();\n };\n\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.isComposing) return;\n const target = event.target;\n if (\n event.key !== \"Escape\" &&\n target instanceof Element &&\n target !== popover.trigger() &&\n target !== searchRef &&\n target.closest(\"input, button, textarea, a, [contenteditable]\")\n )\n return;\n const isOpen = popover.open();\n const count = visible().length;\n if (event.key === \"ArrowDown\" || event.key === \"ArrowUp\") {\n event.preventDefault();\n if (!isOpen) open();\n else if (status() === \"ready\") move(nextEnabledChoiceIndex(visible(), active(), event.key === \"ArrowDown\" ? 1 : -1));\n } else if ((event.key === \"Home\" || event.key === \"End\") && isOpen) {\n event.preventDefault();\n if (status() === \"ready\" && count > 0) move(event.key === \"Home\" ? 0 : count - 1);\n } else if ((event.key === \"Enter\" || event.key === \" \") && !isOpen && event.target === popover.trigger()) {\n event.preventDefault();\n open();\n } else if (event.key === \"Enter\" && isOpen) {\n // Enter on an unavailable row does nothing; the list stays open.\n event.preventDefault();\n choose(activeItem());\n } else if (event.key === \"Escape\" && isOpen) {\n // A closed picker lets Escape reach an enclosing dialog.\n event.preventDefault();\n event.stopPropagation();\n close(true);\n } else if (\n isOpen &&\n searchable() &&\n event.key.length === 1 &&\n !event.ctrlKey &&\n !event.metaKey &&\n !event.altKey &&\n event.target !== searchRef\n ) {\n // Typing anywhere in the open picker goes to the search field.\n event.preventDefault();\n setQuery(query() + event.key);\n setActive(visible().length > 0 ? 0 : -1);\n searchRef?.focus();\n }\n };\n const onFocusOut = (event: FocusEvent) => {\n const next = event.relatedTarget;\n if (!popover.open() || !(next instanceof Node)) return;\n if (popover.trigger()?.contains(next) || popoverElement?.contains(next)) return;\n close();\n };\n\n let popoverElement: HTMLDivElement | undefined;\n\n const openSheet = () => {\n const current = locale();\n const lifetime = new AbortController();\n // dialogCore can wait for a previous sheet's history traversal. Disabling\n // or unmounting the field must also cancel an opening that is still queued.\n closeSheet = () => lifetime.abort();\n let after: (() => void) | undefined;\n setSheetOpen(true);\n void dialogCore\n .open<void>(\n (closeDialog, context) => {\n context.dialog.id ||= `${meta.controlId}-sheet`;\n setSheetId(context.dialog.id);\n return (\n <LocaleProvider locale={current}>\n <BottomSheet onDismiss={context.requestDismiss}>\n <RichSelectSheet\n props={props}\n title={title()}\n value={value}\n dialog={context.dialog}\n close={() => closeDialog()}\n done={(run) => {\n after = run;\n closeDialog();\n }}\n />\n </BottomSheet>\n </LocaleProvider>\n );\n },\n {\n ...bottomSheetOptions,\n history: true,\n signal: lifetime.signal,\n // A phone keyboard must not cover the list as it opens: focus starts on the sheet.\n initialFocus: (dialog) => {\n dialog.tabIndex = -1;\n return dialog;\n },\n },\n )\n .then(() => {\n if (!lifetime.signal.aborted) after?.();\n })\n .finally(() => {\n closeSheet = undefined;\n setSheetOpen(false);\n });\n };\n onCleanup(() => closeSheet?.());\n\n const triggerText = () => props.triggerLabel ?? selected()?.label ?? props.placeholder ?? messages().chooseOption;\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\n class=\"k2b-choice-control k2b-rich-select\"\n data-appearance={props.appearance ?? \"field\"}\n data-invalid={error() ? \"true\" : undefined}\n onFocusOut={onFocusOut}\n >\n <button\n ref={popover.setTrigger}\n id={meta.controlId}\n type=\"button\"\n class=\"k2b-choice-trigger k2b-rich-select__trigger\"\n role=\"combobox\"\n aria-haspopup={sheetOpen() || (!popover.open() && phone()) ? \"dialog\" : \"listbox\"}\n aria-expanded={expanded()}\n aria-controls={sheetOpen() ? sheetId() : popover.open() ? listboxId : undefined}\n aria-activedescendant={popover.open() && activeItem() ? optionId(active()) : undefined}\n data-tone={props.tone === \"warning\" ? \"warning\" : undefined}\n {...fieldControlAria(meta, {\n ...props,\n \"aria-label\": props[\"aria-label\"] ?? (typeof props.label === \"string\" ? undefined : title()),\n })}\n disabled={props.disabled}\n onClick={() => (popover.open() ? close() : open())}\n onKeyDown={onKeyDown}\n >\n <Show\n when={props.renderTrigger}\n fallback={\n <>\n <Show\n when={selected() && hasVisual(selected()!) ? selected() : undefined}\n fallback={<Show when={props.icon}>{(icon) => <i class={icon()} aria-hidden=\"true\" />}</Show>}\n >\n {(item) => <RichSelectVisual item={item()} />}\n </Show>\n <span class=\"k2b-choice-trigger__value\" data-placeholder={selected() || props.triggerLabel ? undefined : \"true\"}>\n {triggerText()}\n </span>\n <i class=\"ti ti-selector k2b-choice-trigger__chevron\" aria-hidden=\"true\" />\n </>\n }\n >\n {(render) => render()(selected())}\n </Show>\n </button>\n <Show when={props.name}>{(name) => <input type=\"hidden\" name={name()} value={value() ?? \"\"} />}</Show>\n <div\n ref={(element) => {\n popoverElement = element;\n popover.setPopover(element);\n }}\n popover=\"manual\"\n class=\"k2b-choice-popover k2b-rich-select__popover\"\n role=\"group\"\n aria-label={title()}\n data-preview={withPreview() ? \"true\" : undefined}\n data-status={status()}\n style={{ width: props.size?.width, height: height() }}\n onKeyDown={onKeyDown}\n onPointerDown={(event) => {\n // Keep focus on the trigger or search field, so the keys keep working after a click on the preview.\n if (!(event.target as Element).closest(\"input, button, textarea, a\")) event.preventDefault();\n }}\n >\n <Show when={!withPreview()}>\n <div class=\"k2b-rich-select__title\" aria-hidden=\"true\">\n {title()}\n </div>\n </Show>\n <Switch>\n <Match when={status() === \"error\"}>\n <div id={listboxId} role=\"listbox\" aria-label={title()} />\n <RichSelectState status=\"error\" messages={messages()} onRetry={props.onRetry} restoreFocus={restorePopoverFocus} />\n </Match>\n <Match when={status() === \"ready\" && props.items.length === 0}>\n <div id={listboxId} role=\"listbox\" aria-label={title()} />\n <RichSelectState status=\"empty\" messages={messages()} empty={props.empty} />\n <Show when={props.footer}>\n {(footer) => (\n <RichSelectFooterControl\n footer={footer()}\n initialName={query}\n messages={messages()}\n done={runFooter}\n restoreFocus={restorePopoverFocus}\n />\n )}\n </Show>\n </Match>\n <Match when>\n <div class=\"k2b-rich-select__body\">\n <div class=\"k2b-rich-select__column\">\n <Show when={searchable()}>\n <div class=\"k2b-choice-search k2b-rich-select__search\">\n <i class=\"ti ti-search\" aria-hidden=\"true\" />\n <input\n ref={(input) => {\n searchRef = input;\n onCleanup(() => {\n if (document.activeElement === input)\n queueMicrotask(() => {\n if (popover.open()) popover.trigger()?.focus();\n });\n });\n }}\n type=\"search\"\n role=\"combobox\"\n aria-expanded={popover.open()}\n aria-autocomplete=\"list\"\n value={query()}\n placeholder={props.searchPlaceholder ?? messages().search}\n aria-label={props.searchPlaceholder ?? messages().search}\n aria-controls={listboxId}\n aria-activedescendant={activeItem() ? optionId(active()) : undefined}\n autocomplete=\"off\"\n onInput={(event) => {\n setQuery(event.currentTarget.value);\n setActive(visible().length > 0 ? 0 : -1);\n }}\n />\n </div>\n </Show>\n <div\n id={listboxId}\n class=\"k2b-rich-select__list\"\n role=\"listbox\"\n aria-label={title()}\n aria-busy={status() === \"loading\" ? \"true\" : undefined}\n data-visual={anyVisual() ? \"true\" : undefined}\n data-choice-scroll\n >\n <Show when={status() === \"loading\"}>\n <span class=\"k2b-sr-only\">{messages().loading}</span>\n <RichSelectPlaceholders visual={anyVisual() || props.items.length === 0} />\n </Show>\n <Show when={status() === \"ready\"}>\n <For each={rows().map(rowKey)} fallback={<div class=\"k2b-rich-select__no-results\">{messages().noResults}</div>}>\n {(key) => {\n const first = rowsByKey().get(key)!;\n if (first.kind === \"heading\") {\n const label = () => {\n const current = rowsByKey().get(key);\n return current?.kind === \"heading\" ? current.label : first.label;\n };\n return (\n <div class=\"k2b-rich-select__heading\" role=\"presentation\">\n {label()}\n </div>\n );\n }\n const entry = () => {\n const current = rowsByKey().get(key);\n return current?.kind === \"item\" ? current : first;\n };\n return (\n // biome-ignore lint/a11y/useKeyWithClickEvents: the trigger or search field handles the keys through aria-activedescendant.\n <div\n id={optionId(entry().index)}\n class=\"k2b-rich-select__option\"\n role=\"option\"\n aria-selected={entry().item.value === value()}\n aria-disabled={entry().item.disabledReason ? \"true\" : undefined}\n aria-labelledby={`${optionId(entry().index)}-label`}\n aria-describedby={\n [\n entry().item.disabledReason || entry().item.description ? `${optionId(entry().index)}-line` : \"\",\n withPreview() && entry().index === active() ? previewId : \"\",\n ]\n .filter(Boolean)\n .join(\" \") || undefined\n }\n data-active={entry().index === active() ? \"true\" : undefined}\n onPointerMove={() => {\n if (active() !== entry().index) setActive(entry().index);\n }}\n onClick={() => choose(entry().item)}\n >\n <Show when={anyVisual()}>\n <Show when={hasVisual(entry().item)} fallback={<span class=\"k2b-rich-select__visual\" />}>\n <RichSelectVisual item={entry().item} />\n </Show>\n </Show>\n <RichSelectRowText\n item={entry().item}\n labelId={`${optionId(entry().index)}-label`}\n lineId={`${optionId(entry().index)}-line`}\n />\n <i class=\"ti ti-check k2b-rich-select__check\" aria-hidden=\"true\" />\n </div>\n );\n }}\n </For>\n </Show>\n </div>\n <Show when={props.footer && status() === \"ready\"}>\n <RichSelectFooterControl\n footer={props.footer!}\n initialName={query}\n messages={messages()}\n done={runFooter}\n restoreFocus={restorePopoverFocus}\n />\n </Show>\n </div>\n <Show when={props.renderPreview}>\n {(render) => (\n <div class=\"k2b-rich-select__preview\" data-choice-scroll>\n <Show when={status() === \"loading\"}>\n <div class=\"k2b-rich-select__preview-placeholder\" aria-hidden=\"true\">\n <span />\n <span style={{ width: \"86%\" }} />\n <span style={{ width: \"72%\" }} />\n <span style={{ width: \"80%\" }} />\n </div>\n </Show>\n <Show when={activeItem()}>{(item) => <RichSelectPreview id={previewId} item={item()} render={render()} />}</Show>\n </div>\n )}\n </Show>\n </div>\n </Match>\n </Switch>\n </div>\n </div>\n </Field>\n );\n}\n\n/**\n * The phone presentation: a bottom sheet with the list. With a preview, an\n * info button beside each row, unavailable rows included, opens the preview as\n * a second level with Back and Choose.\n */\nfunction RichSelectSheet(sheet: {\n props: RichSelectProps;\n title: string;\n value: () => string | null;\n dialog: HTMLDialogElement;\n close: () => void;\n done: (run: () => void) => void;\n}): JSX.Element {\n const messages = useRichSelectMessages();\n const props = sheet.props;\n const uid = createUniqueId();\n const [query, setQuery] = createSignal(\"\");\n const [detailValue, setDetailValue] = createSignal<string>();\n // Resolve from the current snapshot: access and availability can change while\n // the detail level is open.\n const detail = createMemo(() => props.items.find((item) => item.value === detailValue()));\n let back: HTMLButtonElement | undefined;\n let returnValue: string | undefined;\n const status = () => props.status ?? \"ready\";\n const searchable = () => status() === \"ready\" && props.items.length >= RICH_SELECT_SEARCH_FROM;\n const visible = createMemo(() => (searchable() ? filterChoiceOptions(props.items, query()) : props.items));\n const anyVisual = createMemo(() => props.items.some(hasVisual));\n const headings = () => (props.items.length >= RICH_SELECT_SEARCH_FROM && props.sections ? props.sections : undefined);\n const restoreSheetFocus = () => {\n if (sheet.dialog.open) sheet.dialog.focus();\n };\n const headingBefore = (index: number) => {\n const item = visible()[index];\n const list = headings();\n if (!list || !item?.section || visible()[index - 1]?.section === item.section) return undefined;\n return list.find((candidate) => candidate.id === item.section)?.label;\n };\n const choose = (item: RichSelectItem) => {\n if (props.disabled || status() !== \"ready\" || item.disabledReason) return;\n sheet.done(() => {\n const current = props.items.find((candidate) => candidate.value === item.value);\n if (!props.disabled && status() === \"ready\" && current && !current.disabledReason) commitFieldValue(props, current.value);\n });\n };\n const rowId = (index: number) => `k2b-rich-select-sheet-${uid}-${index}`;\n const showDetail = (item: RichSelectItem) => {\n returnValue = item.value;\n // The second level keeps the sheet's height, so Back and Choose stay where they are.\n sheet.dialog.style.minHeight = `${sheet.dialog.getBoundingClientRect().height}px`;\n setDetailValue(item.value);\n queueMicrotask(() => back?.focus());\n };\n const leaveDetail = () => {\n sheet.dialog.style.minHeight = \"\";\n setDetailValue(undefined);\n const value = returnValue;\n queueMicrotask(() => {\n const index = visible().findIndex((item) => item.value === value);\n const original = index >= 0 ? document.getElementById(`${rowId(index)}-info`) : undefined;\n const fallback = sheet.dialog.querySelector<HTMLButtonElement>(\".k2b-rich-select__sheet-row > button\");\n (original ?? fallback ?? sheet.dialog).focus();\n });\n };\n createEffect(() => {\n if (detailValue() !== undefined && (!detail() || status() !== \"ready\")) leaveDetail();\n });\n // Escape on the second level goes back to the list instead of closing the sheet.\n const onEscape = (event: KeyboardEvent) => {\n if (event.key !== \"Escape\" || !detail()) return;\n event.preventDefault();\n event.stopPropagation();\n leaveDetail();\n };\n onMount(() => {\n sheet.dialog.addEventListener(\"keydown\", onEscape, true);\n onCleanup(() => {\n sheet.dialog.removeEventListener(\"keydown\", onEscape, true);\n // dialogCore may reuse the dialog element for the next dialog.\n sheet.dialog.style.minHeight = \"\";\n });\n });\n\n return (\n <>\n <header class=\"k2b-rich-select__sheet-header\">\n <Show when={detail()}>\n <button ref={back} type=\"button\" class=\"k2b-dialog__close\" aria-label={messages().back} onClick={leaveDetail}>\n <i class=\"ti ti-chevron-left\" aria-hidden=\"true\" />\n </button>\n </Show>\n <h2>{detail()?.label ?? sheet.title}</h2>\n <button type=\"button\" class=\"k2b-dialog__close\" aria-label={messages().close} onClick={sheet.close}>\n <i class=\"ti ti-x\" aria-hidden=\"true\" />\n </button>\n </header>\n <Show\n when={detail()}\n fallback={\n <BottomSheet.Body>\n <Switch>\n <Match when={status() === \"error\"}>\n <RichSelectState status=\"error\" messages={messages()} onRetry={props.onRetry} restoreFocus={restoreSheetFocus} />\n </Match>\n <Match when={status() === \"ready\" && props.items.length === 0}>\n <RichSelectState status=\"empty\" messages={messages()} empty={props.empty} />\n <Show when={props.footer}>\n {(footer) => (\n <RichSelectFooterControl\n footer={footer()}\n initialName={query}\n messages={messages()}\n done={sheet.done}\n restoreFocus={restoreSheetFocus}\n />\n )}\n </Show>\n </Match>\n <Match when>\n <Show when={searchable()}>\n <div class=\"k2b-choice-search k2b-rich-select__search\">\n <i class=\"ti ti-search\" aria-hidden=\"true\" />\n <input\n ref={(input) => {\n onCleanup(() => {\n if (document.activeElement === input) queueMicrotask(restoreSheetFocus);\n });\n }}\n type=\"search\"\n value={query()}\n placeholder={props.searchPlaceholder ?? messages().search}\n aria-label={props.searchPlaceholder ?? messages().search}\n autocomplete=\"off\"\n onInput={(event) => setQuery(event.currentTarget.value)}\n />\n </div>\n </Show>\n <div\n class=\"k2b-rich-select__list\"\n role=\"list\"\n aria-label={sheet.title}\n aria-busy={status() === \"loading\" ? \"true\" : undefined}\n data-visual={anyVisual() ? \"true\" : undefined}\n >\n <Show when={status() === \"loading\"}>\n <span class=\"k2b-sr-only\">{messages().loading}</span>\n <RichSelectPlaceholders visual={anyVisual() || props.items.length === 0} />\n </Show>\n <Show when={status() === \"ready\"}>\n <For each={visible()} fallback={<div class=\"k2b-rich-select__no-results\">{messages().noResults}</div>}>\n {(item, index) => (\n <>\n <Show when={headingBefore(index())}>{(label) => <div class=\"k2b-rich-select__heading\">{label()}</div>}</Show>\n <div class=\"k2b-rich-select__sheet-row\" role=\"listitem\" data-info={props.renderPreview ? \"true\" : undefined}>\n <button\n id={rowId(index())}\n type=\"button\"\n class=\"k2b-rich-select__option\"\n aria-current={item.value === sheet.value() ? \"true\" : undefined}\n aria-disabled={item.disabledReason ? \"true\" : undefined}\n aria-labelledby={`${rowId(index())}-label`}\n aria-describedby={item.disabledReason || item.description ? `${rowId(index())}-line` : undefined}\n onClick={() => choose(item)}\n >\n <Show when={anyVisual()}>\n <Show when={hasVisual(item)} fallback={<span class=\"k2b-rich-select__visual\" />}>\n <RichSelectVisual item={item} />\n </Show>\n </Show>\n <RichSelectRowText item={item} labelId={`${rowId(index())}-label`} lineId={`${rowId(index())}-line`} />\n <i class=\"ti ti-check k2b-rich-select__check\" aria-hidden=\"true\" />\n </button>\n <Show when={props.renderPreview}>\n <button\n id={`${rowId(index())}-info`}\n type=\"button\"\n class=\"k2b-rich-select__info\"\n aria-label={messages().detailsFor({ name: item.label })}\n onClick={() => showDetail(item)}\n >\n <i class=\"ti ti-info-circle\" aria-hidden=\"true\" />\n </button>\n </Show>\n </div>\n </>\n )}\n </For>\n </Show>\n </div>\n <Show when={props.footer && status() === \"ready\"}>\n <RichSelectFooterControl\n footer={props.footer!}\n initialName={query}\n messages={messages()}\n done={sheet.done}\n restoreFocus={restoreSheetFocus}\n />\n </Show>\n </Match>\n </Switch>\n </BottomSheet.Body>\n }\n >\n {(item) => (\n <>\n <BottomSheet.Body>\n <div class=\"k2b-rich-select__preview\" data-level=\"detail\">\n <RichSelectPreview item={item()} render={props.renderPreview!} />\n </div>\n </BottomSheet.Body>\n <BottomSheet.Footer>\n <Button\n variant=\"primary\"\n size=\"lg\"\n class=\"k2b-rich-select__choose\"\n disabled={Boolean(item().disabledReason)}\n onClick={() => choose(item())}\n >\n <i class=\"ti ti-check\" aria-hidden=\"true\" />\n {messages().choose}\n </Button>\n </BottomSheet.Footer>\n </>\n )}\n </Show>\n </>\n );\n}\n\nexport default RichSelect;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,SACE,YAAY,EACZ,UAAU,EACV,YAAY,EACZ,cAAc,EACd,GAAG,EAEH,KAAK,EACL,SAAS,EACT,OAAO,EACP,IAAI,EACJ,MAAM,EACN,OAAO,QACF,UAAU;AACjB,SAAS,MAAM,QAAQ,mBAAmB;AAC1C,SAAS,UAAU,QAAQ,yBAAyB;AACpD,SAAS,eAAe,EAAE,KAAK,EAAE,gBAAgB,QAAQ,mBAAmB;AAC5E,SAAS,cAAc,EAAE,SAAS,QAAQ,gBAAgB;AAC1D,OAAO,WAAW,IAAI,kBAAkB,QAAQ,uBAAuB;AACvE,SAAS,mBAAmB,EAAE,mBAAmB,EAAE,sBAAsB,QAAQ,UAAU;AAE3F,SAAS,gBAAgB,EAAE,oBAAoB,QAAQ,kBAAkB;AACzE,SAAkC,qBAAqB,QAAQ,wBAAwB;;AAGvF;;AAmEA;AACA,OAAO,MAAM,uBAAuB,GAAG,CAAC;AACxC,MAAM,WAAW,GAAG,wBAAwB;AAC5C,MAAM,gBAAgB,GAAG,CAAC;AAI1B,MAAM,MAAM,GAAI,GAAQ,IAAM,GAAG,CAAC,IAAI,KAAK,SAAS,GAAG,WAAW,GAAG,CAAC,EAAE,EAAE,GAAG,QAAQ,GAAG,CAAC,IAAI,CAAC,KAAK,EAAG;AAEtG,MAAM,OAAO,GAAG,MAAM,OAAO,UAAU,KAAK,UAAU,IAAI,UAAU,CAAC,WAAW,CAAC,CAAC,OAAO;AAEzF,SAAS,gBAAgB,CAAC,KAA+B,EAAe;EACtE,yBACG,MAAM;IAAA;MAAA,0BACJ,KAAK;QAAA,IAAC,IAAI;UAAA,OAAE,KAAK,CAAC,IAAI,CAAC,MAAM;QAAA;QAAA,UAAI,MAAM,2BAA4C,MAAM,CAAC,CAAC,CAAC,CAAC;MAAQ,sBACrG,KAAK;QAAA,IAAC,IAAI;UAAA,OAAE,KAAK,CAAC,IAAI,CAAC,KAAK;QAAA;QAAA,UACzB,KAAK,oEAE6D,KAAK,CAAC,CAAC;MAE1E,sBAEF,KAAK;QAAA,IAAC,IAAI;UAAA,OAAE,KAAK,CAAC,IAAI,CAAC,IAAI;QAAA;QAAA,UACxB,IAAI,oDAEQ,IAAI,CAAC,CAAC;MAEnB;IAAA;EAAA;AAIT;AAEA,MAAM,SAAS,GAAI,IAAoB,IAAK,OAAO,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC;;AAE3F;AACA,SAAS,iBAAiB,CAAC,KAAgE,EAAe;EACxG,oDAEc,KAAK,CAAC,OAAO,0BACpB,KAAK,CAAC,IAAI,CAAC,KAAK,8BAElB,IAAI;IAAA,IAAC,IAAI;MAAA,OAAE,KAAK,CAAC,IAAI,CAAC,cAAc,IAAI,KAAK,CAAC,IAAI,CAAC,WAAW;IAAA;IAAA,UAC3D,IAAI,iDACM,KAAK,CAAC,MAAM,+CAA6C,KAAK,CAAC,IAAI,CAAC,cAAc,GAAG,MAAM,YAAG,SAAS,0BAC9G,IAAI,CAAC,CAAC;EAEV;AAIT;AAEA,SAAS,sBAAsB,CAAC,KAA0B,EAAe;EACvE,yBACG,GAAG;IAAA,IAAC,IAAI;MAAA,OAAE,KAAK,CAAC,IAAI,CAAC;QAAE,MAAM,EAAE;MAAiB,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,KAAK,KAAK,CAAC;IAAA;IAAA,UACpE,KAAK,iDACkD,KAAK,CAAC,MAAM,GAAG,MAAM,YAAG,SAAS,4CACrF,IAAI;MAAA,IAAC,IAAI;QAAA,OAAE,KAAK,CAAC,MAAM;MAAA;MAAA;QAAA;MAAA;IAAA,kCAIA,YAAG,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,UAAG,gCACjC,YAAG,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,UAAG;EAG5D;AAGP;AAEA,SAAS,eAAe,CAAC,KAMxB,EAAe;EACd,IAAI,WAA0C;EAC9C,SAAS,CAAC,MAAM;IACd,IAAI,WAAW,IAAI,QAAQ,CAAC,aAAa,KAAK,WAAW,EAAE,cAAc,CAAC,MAAM,KAAK,CAAC,YAAY,GAAG,CAAC,CAAC;EACzG,CAAC,CAAC;EACF,6DACmD,KAAK,CAAC,MAAM,yCAAQ,KAAK,CAAC,MAAM,KAAK,OAAO,GAAG,OAAO,GAAG,QAAQ,kCAEpG,KAAK,CAAC,MAAM,KAAK,OAAO,GAAG,sBAAsB,GAAG,mBAAmB,qCAElF,IAAI;IAAA,IACH,IAAI;MAAA,OAAE,KAAK,CAAC,MAAM,KAAK,OAAO;IAAA;IAAA,IAC9B,QAAQ;MAAA,+BAA4C,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,QAAQ,CAAC,SAAS;IAAA;IAAA;MAAA,gCAEjD,KAAK,CAAC,QAAQ,CAAC,YAAY,sBACpE,IAAI;QAAA,IAAC,IAAI;UAAA,OAAE,KAAK,CAAC,OAAO;QAAA;QAAA,UACrB,KAAK,sBACJ,MAAM;UAAmB,OAAO;UAAa,IAAI;UAAM,OAAO,EAAE,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC;UAAA;YAAA,wBAE7E,KAAK,CAAC,QAAQ,CAAC,KAAK;UAAA;QAAA;MAExB;IAAA;EAAA;AAKX;AAEA,SAAS,iBAAiB,CAAC,KAA2F,EAAe;EACnI,oDACW,KAAK,CAAC,EAAE,4CAEZ,gBAAgB;IAAA,IAAC,IAAI;MAAA,OAAE,KAAK,CAAC,IAAI;IAAA;EAAA,cAC3B,KAAK,CAAC,IAAI,CAAC,KAAK,YAExB,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC;AAG/B;;AAEA;AACA,OAAO,SAAS,eAAe,CAAC,KAA2C,EAAe;EACxF,kDAEK,GAAG;IAAA,IAAC,IAAI;MAAA,OAAE,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;IAAA;IAAA,UAC9B,IAAI,gDACW,IAAI,CAAC,IAAI,KAAK,SAAS,GAAG,SAAS,YAAG,SAAS,kDAClD,IAAI,CAAC,IAAI,0BACZ,IAAI,CAAC,IAAI;EAEnB;AAIT;AAEA,SAAS,uBAAuB,CAAC,KAMhC,EAAe;EACd,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,YAAY,CAAC,KAAK,CAAC;EACnD,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,YAAY,CAAC,EAAE,CAAC;EACxC,IAAI,KAAmC;EACvC,IAAI,KAAoC;EACxC,IAAI,QAAoC;EACxC,SAAS,CAAC,MAAM;IACd,IAAI,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,cAAc,CAAC,KAAK,CAAC,YAAY,CAAC;EACpF,CAAC,CAAC;EACF,MAAM,MAAM,GAAG,MAAM;IACnB,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM;IAC3B,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAC3B,IAAI,EAAE,QAAQ,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE;IACrC,KAAK,CAAC,IAAI,CAAC,MAAM,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;EACjD,CAAC;EACD,kDAEK,IAAI;IAAA,IACH,IAAI;MAAA,OAAE,wBAAQ,CAAC,CAAC,IAAI,QAAQ,IAAI,KAAK,CAAC,MAAM,OAAG,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,SAAS;IAAA;IAAA,IAC9E,QAAQ;MAAA,wDAeQ,KAAK,CAAC,MAAM,CAAC,IAAI,IAAI,YAAY,0BAEP,KAAK,CAAC,MAAM,CAAC,KAAK;IAAA;IAAA,UAI1D,OAAO,qDAKI,IAAI,CAAC,CAAC,yDACA,OAAO,CAAC,CAAC,CAAC,WAAW,wDACtB,KAAK,CAAC,MAAM,CAAC,KAAK,4CAe/B,MAAM;MAAC,IAAI;MAAU,OAAO;MAAW,IAAI;MAAA,IAAM,QAAQ;QAAA,OAAE,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;MAAA;MAAE,OAAO,EAAE,MAAM;MAAA;QAAA,OACxF,KAAK,CAAC,QAAQ,CAAC,MAAM;MAAA;IAAA;EAG3B;AAIT;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAAS,UAAU,CAAC,KAAsB,EAAe;EAC9D,MAAM,QAAQ,GAAG,qBAAqB,CAAC,CAAC;EACxC,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC;EAC1B,MAAM,IAAI,GAAG,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC;EACtC,MAAM,SAAS,GAAG,GAAG,IAAI,CAAC,SAAS,UAAU;EAC7C,MAAM,SAAS,GAAG,GAAG,IAAI,CAAC,SAAS,UAAU;EAC7C,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,YAAY,CAAC,EAAE,CAAC;EAC1C,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;EAC5C,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,YAAY,CAAS,CAAC;EAClD,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,YAAY,CAAC,KAAK,CAAC;EACrD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,YAAY,CAAC,KAAK,CAAC;EAC7C,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,YAAY,CAAS,CAAC;EACpD,OAAO,CAAC,MAAM;IACZ,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC,WAAW,CAAC;IAC5C,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC;IACvB,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC;IAC5C,KAAK,CAAC,gBAAgB,CAAC,QAAQ,EAAE,MAAM,CAAC;IACxC,SAAS,CAAC,MAAM,KAAK,CAAC,mBAAmB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;EAC9D,CAAC,CAAC;EACF,IAAI,SAAuC;EAC3C,IAAI,UAAoC;EACxC,MAAM,KAAK,GAAG,MAAM,oBAAoB,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,IAAI;EAC7D,MAAM,KAAK,GAAG,MAAM,oBAAoB,CAAC,KAAK,CAAC,KAAK,CAAC;EACrD,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,MAAM,IAAI,OAAO;EAC5C,MAAM,WAAW,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC;EACtD,MAAM,KAAK,GAAG,MACZ,KAAK,CAAC,KAAK,KAAK,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ,GAAG,KAAK,CAAC,KAAK,GAAI,KAAK,CAAC,YAAY,CAAC,IAAI,KAAK,CAAC,WAAW,IAAI,QAAQ,CAAC,CAAC,CAAC,YAAa,CAAC;EACxI,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,CAAC,KAAK,OAAO,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,IAAI,uBAAuB;EAC9F,MAAM,OAAO,GAAG,UAAU,CAAC,MAAO,UAAU,CAAC,CAAC,GAAG,mBAAmB,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,KAAM,CAAC;EAC1G,MAAM,SAAS,GAAG,UAAU,CAAC,MAAM,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;EAC/D,MAAM,IAAI,GAAG,UAAU,CAAQ,MAAM;IACnC,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,IAAI,uBAAuB,IAAI,KAAK,CAAC,QAAQ,GAAG,KAAK,CAAC,QAAQ,GAAG,SAAS;IAC7G,MAAM,MAAa,GAAG,EAAE;IACxB,IAAI,OAA2B;IAC/B,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,KAAK;MACjC,IAAI,QAAQ,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,KAAK,OAAO,EAAE;QACxD,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAE,SAAS,IAAK,SAAS,CAAC,EAAE,KAAK,IAAI,CAAC,OAAO,CAAC;QAC3E,IAAI,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC;UAAE,IAAI,EAAE,SAAS;UAAE,EAAE,EAAE,OAAO,CAAC,EAAE;UAAE,KAAK,EAAE,OAAO,CAAC;QAAM,CAAC,CAAC;MACrF;MACA,OAAO,GAAG,IAAI,CAAC,OAAO;MACtB,MAAM,CAAC,IAAI,CAAC;QAAE,IAAI,EAAE,MAAM;QAAE,IAAI;QAAE;MAAM,CAAC,CAAC;IAC5C,CAAC,CAAC;IACF,OAAO,MAAM;EACf,CAAC,CAAC;EACF;EACA;EACA,MAAM,SAAS,GAAG,UAAU,CAAC,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAE,GAAG,IAAK,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;EACpF,MAAM,QAAQ,GAAG,UAAU,CAAC,MAAM;IAChC,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC;IACvB,OAAO,OAAO,KAAK,IAAI,GAAG,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAE,IAAI,IAAK,IAAI,CAAC,KAAK,KAAK,OAAO,CAAC;EAC1F,CAAC,CAAC;EACF,MAAM,UAAU,GAAG,MAAO,MAAM,CAAC,CAAC,KAAK,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,SAAU;EACjF,MAAM,QAAQ,GAAI,KAAa,IAAK,GAAG,SAAS,IAAI,KAAK,EAAE;EAC3D,MAAM,OAAO,GAAG,mBAAmB,CACjC,MAAM,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,EAC7B,OAAO;IAAE,KAAK,EAAE,KAAK;IAAE,IAAI,EAAE,KAAK,CAAC,SAAS,KAAK,WAAW,GAAG,OAAO,GAAG;EAAQ,CAAC,CACpF,CAAC;EACD,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC;EACpD,MAAM,mBAAmB,GAAG,MAAM;IAChC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,GAAG,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC;EAC7E,CAAC;EAED,YAAY,CAAC,MAAM;IACjB,IAAI,KAAK,CAAC,QAAQ,EAAE;MAClB,OAAO,CAAC,IAAI,CAAC,CAAC;MACd,UAAU,GAAG,CAAC;IAChB;EACF,CAAC,CAAC;EACF,YAAY,CAAC,MAAM;IACjB,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,MAAM;IAC9B,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,KAAK,OAAO,EAAE;IAC7C,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC;IAC/B,IAAI,OAAO,GAAG,CAAC,IAAI,OAAO,IAAI,KAAK,EAAE,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC;EAC9D,CAAC,CAAC;EAEF,MAAM,cAAc,GAAG,MAAM;IAC3B,MAAM,OAAO,GAAG,QAAQ,CAAC,cAAc,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAC3D,OAAO,EAAE,cAAc,CAAC;MAAE,KAAK,EAAE;IAAU,CAAC,CAAC;EAC/C,CAAC;EACD,MAAM,IAAI,GAAI,IAAY,IAAK;IAC7B,IAAI,IAAI,GAAG,CAAC,EAAE;IACd,SAAS,CAAC,IAAI,CAAC;IACf,cAAc,CAAC,cAAc,CAAC;EAChC,CAAC;EACD,MAAM,UAAU,GAAG,MAAM;IACvB,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,SAAS,CAAE,IAAI,IAAK,IAAI,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC,CAAC;IACnE,OAAO,KAAK,IAAI,CAAC,GAAG,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;EAC3D,CAAC;EAED,MAAM,WAAW,GAAG,MAAM;IACxB,QAAQ,CAAC,EAAE,CAAC;IACZ,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC;IACvB;IACA;IACA,MAAM,QAAQ,GAAG,MAAM,CAAC,CAAC,KAAK,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,gBAAgB;IAC7E,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,GAAG,KAAK,GAAG,GAAG,CAAC,CAAC;IACnE,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,KAAK,WAAW,CAAC,CAAC,GAAG,GAAG,GAAG,KAAK,GAAG,SAAS,CAAC,CAAC;IAC1E,OAAO,CAAC,IAAI,CAAC,CAAC;IACd,IAAI,UAAU,CAAC,CAAC,EAAE,cAAc,CAAC,MAAM,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC;IAC1D,cAAc,CAAC,cAAc,CAAC;EAChC,CAAC;EACD,MAAM,IAAI,GAAG,MAAM;IACjB,IAAI,KAAK,CAAC,QAAQ,IAAI,QAAQ,CAAC,CAAC,EAAE;IAClC,IAAI,OAAO,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,KACtB,WAAW,CAAC,CAAC;EACpB,CAAC;EACD,MAAM,KAAK,GAAG,CAAC,YAAY,GAAG,KAAK,KAAK;IACtC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC;IAC1B,QAAQ,CAAC,EAAE,CAAC;IACZ,SAAS,CAAC,CAAC,CAAC,CAAC;EACf,CAAC;EACD,MAAM,MAAM,GAAI,IAAgC,IAAK;IACnD,IAAI,KAAK,CAAC,QAAQ,IAAI,MAAM,CAAC,CAAC,KAAK,OAAO,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,cAAc,EAAE;IAC5E;IACA,KAAK,CAAC,IAAI,CAAC;IACX,gBAAgB,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC;EACrC,CAAC;EACD,MAAM,SAAS,GAAI,GAAe,IAAK;IACrC,KAAK,CAAC,IAAI,CAAC;IACX,GAAG,CAAC,CAAC;EACP,CAAC;EAED,MAAM,SAAS,GAAI,KAAoB,IAAK;IAC1C,IAAI,KAAK,CAAC,WAAW,EAAE;IACvB,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM;IAC3B,IACE,KAAK,CAAC,GAAG,KAAK,QAAQ,IACtB,MAAM,YAAY,OAAO,IACzB,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC,IAC5B,MAAM,KAAK,SAAS,IACpB,MAAM,CAAC,OAAO,CAAC,+CAA+C,CAAC,EAE/D;IACF,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,MAAM;IAC9B,IAAI,KAAK,CAAC,GAAG,KAAK,WAAW,IAAI,KAAK,CAAC,GAAG,KAAK,SAAS,EAAE;MACxD,KAAK,CAAC,cAAc,CAAC,CAAC;MACtB,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,KACf,IAAI,MAAM,CAAC,CAAC,KAAK,OAAO,EAAE,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,KAAK,WAAW,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACtH,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,KAAK,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,KAAK,KAAK,MAAM,EAAE;MAClE,KAAK,CAAC,cAAc,CAAC,CAAC;MACtB,IAAI,MAAM,CAAC,CAAC,KAAK,OAAO,IAAI,KAAK,GAAG,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,KAAK,MAAM,GAAG,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC;IACnF,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,KAAK,OAAO,IAAI,KAAK,CAAC,GAAG,KAAK,GAAG,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC,EAAE;MACxG,KAAK,CAAC,cAAc,CAAC,CAAC;MACtB,IAAI,CAAC,CAAC;IACR,CAAC,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,OAAO,IAAI,MAAM,EAAE;MAC1C;MACA,KAAK,CAAC,cAAc,CAAC,CAAC;MACtB,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC;IACtB,CAAC,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,QAAQ,IAAI,MAAM,EAAE;MAC3C;MACA,KAAK,CAAC,cAAc,CAAC,CAAC;MACtB,KAAK,CAAC,eAAe,CAAC,CAAC;MACvB,KAAK,CAAC,IAAI,CAAC;IACb,CAAC,MAAM,IACL,MAAM,IACN,UAAU,CAAC,CAAC,IACZ,KAAK,CAAC,GAAG,CAAC,MAAM,KAAK,CAAC,IACtB,CAAC,KAAK,CAAC,OAAO,IACd,CAAC,KAAK,CAAC,OAAO,IACd,CAAC,KAAK,CAAC,MAAM,IACb,KAAK,CAAC,MAAM,KAAK,SAAS,EAC1B;MACA;MACA,KAAK,CAAC,cAAc,CAAC,CAAC;MACtB,QAAQ,CAAC,KAAK,CAAC,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC;MAC7B,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;MACxC,SAAS,EAAE,KAAK,CAAC,CAAC;IACpB;EACF,CAAC;EACD,MAAM,UAAU,GAAI,KAAiB,IAAK;IACxC,MAAM,IAAI,GAAG,KAAK,CAAC,aAAa;IAChC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,IAAI,YAAY,IAAI,CAAC,EAAE;IAChD,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC,EAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,cAAc,EAAE,QAAQ,CAAC,IAAI,CAAC,EAAE;IACzE,KAAK,CAAC,CAAC;EACT,CAAC;EAED,IAAI,cAA0C;EAE9C,MAAM,SAAS,GAAG,MAAM;IACtB,MAAM,OAAO,GAAG,MAAM,CAAC,CAAC;IACxB,MAAM,QAAQ,GAAG,IAAI,eAAe,CAAC,CAAC;IACtC;IACA;IACA,UAAU,GAAG,MAAM,QAAQ,CAAC,KAAK,CAAC,CAAC;IACnC,IAAI,KAA+B;IACnC,YAAY,CAAC,IAAI,CAAC;IAClB,KAAK,UAAU,CACZ,IAAI,CACH,CAAC,WAAW,EAAE,OAAO,KAAK;MACxB,OAAO,CAAC,MAAM,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,SAAS,QAAQ;MAC/C,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;MAC7B,yBACG,cAAc;QAAC,MAAM,EAAE,OAAO;QAAA;UAAA,yBAC5B,WAAW;YAAA,IAAC,SAAS;cAAA,OAAE,OAAO,CAAC,cAAc;YAAA;YAAA;cAAA,yBAC3C,eAAe;gBACd,KAAK,EAAE,KAAK;gBAAA,IACZ,KAAK;kBAAA,OAAE,KAAK,CAAC,CAAC;gBAAA;gBACd,KAAK,EAAE,KAAK;gBAAA,IACZ,MAAM;kBAAA,OAAE,OAAO,CAAC,MAAM;gBAAA;gBACtB,KAAK,EAAE,MAAM,WAAW,CAAC,CAAC;gBAC1B,IAAI,EAAG,GAAG,IAAK;kBACb,KAAK,GAAG,GAAG;kBACX,WAAW,CAAC,CAAC;gBACf;cAAC;YAAA;UAAA;QAAA;MAAA;IAKX,CAAC,EACD;MACE,GAAG,kBAAkB;MACrB,OAAO,EAAE,IAAI;MACb,MAAM,EAAE,QAAQ,CAAC,MAAM;MACvB;MACA,YAAY,EAAG,MAAM,IAAK;QACxB,MAAM,CAAC,QAAQ,GAAG,CAAC,CAAC;QACpB,OAAO,MAAM;MACf;IACF,CACF,CAAC,CACA,IAAI,CAAC,MAAM;MACV,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,GAAG,CAAC;IACzC,CAAC,CAAC,CACD,OAAO,CAAC,MAAM;MACb,UAAU,GAAG,SAAS;MACtB,YAAY,CAAC,KAAK,CAAC;IACrB,CAAC,CAAC;EACN,CAAC;EACD,SAAS,CAAC,MAAM,UAAU,GAAG,CAAC,CAAC;EAE/B,MAAM,WAAW,GAAG,MAAM,KAAK,CAAC,YAAY,IAAI,QAAQ,CAAC,CAAC,EAAE,KAAK,IAAI,KAAK,CAAC,WAAW,IAAI,QAAQ,CAAC,CAAC,CAAC,YAAY;EAEjH,yBACG,KAAK;IAAA;MAAA,OACG,KAAK,CAAC,KAAK;IAAA;IAAA,IAClB,KAAK;MAAA,OAAE,KAAK,CAAC,KAAK;IAAA;IAAA,IAClB,WAAW;MAAA,OAAE,KAAK,CAAC,WAAW;IAAA;IAAA,IAC9B,KAAK;MAAA,OAAE,KAAK,CAAC,CAAC;IAAA;IACd,IAAI,EAAE,IAAI;IAAA,IACV,QAAQ;MAAA,OAAE,KAAK,CAAC,QAAQ;IAAA;IAAA,IACxB,QAAQ;MAAA,OAAE,KAAK,CAAC,QAAQ;IAAA;IAAA;MAAA,kEAIL,KAAK,CAAC,UAAU,IAAI,OAAO,iDAC9B,KAAK,CAAC,CAAC,GAAG,MAAM,YAAG,SAAS;QAAA,IAKxC,EAAE;UAAA,OAAE,IAAI,CAAC,SAAS;QAAA;QAClB,IAAI,EAAC,QAAQ;QAAA,SACP,6CAA6C;QACnD,IAAI,EAAC,UAAU;QAAA;UAAA,OACA,SAAS,CAAC,CAAC,IAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,CAAE,GAAG,QAAQ,GAAG,SAAS;QAAA;QAAA;UAAA,OAClE,QAAQ,CAAC,CAAC;QAAA;QAAA;UAAA,OACV,SAAS,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,SAAS,GAAG,SAAS;QAAA;QAAA;UAAA,OACxD,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,UAAU,CAAC,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,SAAS;QAAA;QAAA;UAAA,OAC3E,KAAK,CAAC,IAAI,KAAK,SAAS,GAAG,SAAS,GAAG,SAAS;QAAA;MAAA,SACvD,gBAAgB,CAAC,IAAI,EAAE;QACzB,GAAG,KAAK;QACR,YAAY,EAAE,KAAK,CAAC,YAAY,CAAC,KAAK,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ,GAAG,SAAS,GAAG,KAAK,CAAC,CAAC;MAC7F,CAAC,CAAC;QAAA,IACF,QAAQ;UAAA,OAAE,KAAK,CAAC,QAAQ;QAAA;MAAA,+BAIvB,IAAI;QAAA,IACH,IAAI;UAAA,OAAE,KAAK,CAAC,aAAa;QAAA;QAAA,IACzB,QAAQ;UAAA,0BAEH,IAAI;YAAA,IACH,IAAI;cAAA,OAAE,wBAAQ,CAAC,CAAC,IAAI,SAAS,CAAC,QAAQ,CAAC,CAAE,CAAC,OAAG,QAAQ,CAAC,CAAC,GAAG,SAAS;YAAA;YAAA,IACnE,QAAQ;cAAA,yBAAG,IAAI;gBAAA,IAAC,IAAI;kBAAA,OAAE,KAAK,CAAC,IAAI;gBAAA;gBAAA,UAAI,IAAI,qDAAe,IAAI,CAAC,CAAC;cAAuB;YAAA;YAAA,UAElF,IAAI,sBAAM,gBAAgB;cAAA,IAAC,IAAI;gBAAA,OAAE,IAAI,CAAC,CAAC;cAAA;YAAA;UAAI,uDAEW,QAAQ,CAAC,CAAC,IAAI,KAAK,CAAC,YAAY,YAAG,SAAS,UAAG,MAAM,mBAC5G,WAAW,CAAC,CAAC;QAAA;QAAA,UAMlB,MAAM,IAAK,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;MAAC,wCAGpC,IAAI;QAAA,IAAC,IAAI;UAAA,OAAE,KAAK,CAAC,IAAI;QAAA;QAAA,UAAI,IAAI,oDAAgC,IAAI,CAAC,CAAC,mDAAS,KAAK,CAAC,CAAC,IAAI,EAAE;MAAI,2CAShF,KAAK,CAAC,CAAC,iDACL,WAAW,CAAC,CAAC,GAAG,MAAM,YAAG,SAAS,yDACnC,MAAM,CAAC,CAAC,uDACL,KAAK,CAAC,IAAI,EAAE,KAAK,mDAAU,MAAM,CAAC,CAAC,qCAOlD,IAAI;QAAA,IAAC,IAAI;UAAA,OAAE,CAAC,WAAW,CAAC,CAAC;QAAA;QAAA;UAAA,gCAErB,KAAK,CAAC,CAAC;QAAA;MAAA,gCAGX,MAAM;QAAA;UAAA,0BACJ,KAAK;YAAA,IAAC,IAAI;cAAA,OAAE,MAAM,CAAC,CAAC,KAAK,OAAO;YAAA;YAAA;cAAA,sDACtB,SAAS,uDAA6B,KAAK,CAAC,CAAC,oCACrD,eAAe;gBAAC,MAAM;gBAAA,IAAS,QAAQ;kBAAA,OAAE,QAAQ,CAAC,CAAC;gBAAA;gBAAA,IAAE,OAAO;kBAAA,OAAE,KAAK,CAAC,OAAO;gBAAA;gBAAE,YAAY,EAAE;cAAmB;YAAA;UAAA,sBAEhH,KAAK;YAAA,IAAC,IAAI;cAAA,OAAE,mBAAM,CAAC,CAAC,KAAK,OAAO,OAAI,KAAK,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC;YAAA;YAAA;cAAA,sDAClD,SAAS,uDAA6B,KAAK,CAAC,CAAC,oCACrD,eAAe;gBAAC,MAAM;gBAAA,IAAS,QAAQ;kBAAA,OAAE,QAAQ,CAAC,CAAC;gBAAA;gBAAA,IAAE,KAAK;kBAAA,OAAE,KAAK,CAAC,KAAK;gBAAA;cAAA,sBACvE,IAAI;gBAAA,IAAC,IAAI;kBAAA,OAAE,KAAK,CAAC,MAAM;gBAAA;gBAAA,UACpB,MAAM,sBACL,uBAAuB;kBAAA,IACtB,MAAM;oBAAA,OAAE,MAAM,CAAC,CAAC;kBAAA;kBAChB,WAAW,EAAE,KAAK;kBAAA,IAClB,QAAQ;oBAAA,OAAE,QAAQ,CAAC,CAAC;kBAAA;kBACpB,IAAI,EAAE,SAAS;kBACf,YAAY,EAAE;gBAAmB;cAEpC;YAAA;UAAA,sBAGJ,KAAK;YAAC,IAAI;YAAA;cAAA,kDAGJ,IAAI;gBAAA,IAAC,IAAI;kBAAA,OAAE,UAAU,CAAC,CAAC;gBAAA;gBAAA;kBAAA,gEAeH,OAAO,CAAC,IAAI,CAAC,CAAC,kDAEtB,KAAK,CAAC,CAAC,yDACD,KAAK,CAAC,iBAAiB,IAAI,QAAQ,CAAC,CAAC,CAAC,MAAM,wDAC7C,KAAK,CAAC,iBAAiB,IAAI,QAAQ,CAAC,CAAC,CAAC,MAAM,2DACzC,SAAS,0DACD,UAAU,CAAC,CAAC,YAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,mBAAG,SAAS;gBAAA;cAAA,mCAUpE,SAAS,uDAGD,KAAK,CAAC,CAAC,8CACR,MAAM,CAAC,CAAC,KAAK,SAAS,GAAG,MAAM,YAAG,SAAS,gDACzC,SAAS,CAAC,CAAC,GAAG,MAAM,YAAG,SAAS,4CAG5C,IAAI;gBAAA,IAAC,IAAI;kBAAA,OAAE,MAAM,CAAC,CAAC,KAAK,SAAS;gBAAA;gBAAA;kBAAA,iCACL,QAAQ,CAAC,CAAC,CAAC,OAAO,sBAC5C,sBAAsB;oBAAA,IAAC,MAAM;sBAAA,OAAE,SAAS,CAAC,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC;oBAAA;kBAAA;gBAAA;cAAA,gCAExE,IAAI;gBAAA,IAAC,IAAI;kBAAA,OAAE,MAAM,CAAC,CAAC,KAAK,OAAO;gBAAA;gBAAA;kBAAA,yBAC7B,GAAG;oBAAA,IAAC,IAAI;sBAAA,OAAE,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC;oBAAA;oBAAA,IAAE,QAAQ;sBAAA,gCAA4C,QAAQ,CAAC,CAAC,CAAC,SAAS;oBAAA;oBAAA,UACnG,GAAG,IAAK;sBACR,MAAM,KAAK,GAAG,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAE;sBACnC,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,EAAE;wBAC5B,MAAM,KAAK,GAAG,MAAM;0BAClB,MAAM,OAAO,GAAG,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;0BACpC,OAAO,OAAO,EAAE,IAAI,KAAK,SAAS,GAAG,OAAO,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK;wBAClE,CAAC;wBACD,gCAEK,KAAK,CAAC,CAAC;sBAGd;sBACA,MAAM,KAAK,GAAG,MAAM;wBAClB,MAAM,OAAO,GAAG,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;wBACpC,OAAO,OAAO,EAAE,IAAI,KAAK,MAAM,GAAG,OAAO,GAAG,KAAK;sBACnD,CAAC;sBACD,QACE;wBAAA,8CAEM,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,iDAGZ,cAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,qBAAK,KAAK,CAAC,CAAC,kDAC9B,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,GAAG,MAAM,YAAG,SAAS,iBAC9C,YAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,eAAQ,8CAEjD,CACE,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,EAChG,WAAW,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,KAAK,MAAM,CAAC,CAAC,GAAG,SAAS,GAAG,EAAE,CAC7D,CACE,MAAM,CAAC,OAAO,CAAC,CACf,IAAI,CAAC,GAAG,CAAC,IAAI,SAAS,gDAEd,KAAK,CAAC,CAAC,CAAC,KAAK,KAAK,MAAM,CAAC,CAAC,GAAG,MAAM,YAAG,SAAS,4CAM3D,IAAI;0BAAA,IAAC,IAAI;4BAAA,OAAE,SAAS,CAAC,CAAC;0BAAA;0BAAA;4BAAA,yBACpB,IAAI;8BAAA,IAAC,IAAI;gCAAA,OAAE,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;8BAAA;8BAAA,IAAE,QAAQ;gCAAA;8BAAA;8BAAA;gCAAA,yBAC1C,gBAAgB;kCAAA,IAAC,IAAI;oCAAA,OAAE,KAAK,CAAC,CAAC,CAAC,IAAI;kCAAA;gCAAA;8BAAA;4BAAA;0BAAA;wBAAA,gCAGvC,iBAAiB;0BAAA,IAChB,IAAI;4BAAA,OAAE,KAAK,CAAC,CAAC,CAAC,IAAI;0BAAA;0BAAA,IAClB,OAAO;4BAAA,OAAE,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ;0BAAA;0BAAA,IAC3C,MAAM;4BAAA,OAAE,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO;0BAAA;wBAAA;sBAAA;oBAKjD;kBAAC;gBAAA;cAAA,gCAIN,IAAI;gBAAA,IAAC,IAAI;kBAAA,OAAE,oBAAK,CAAC,MAAM,OAAI,MAAM,CAAC,CAAC,KAAK,OAAO;gBAAA;gBAAA;kBAAA,yBAC7C,uBAAuB;oBAAA,IACtB,MAAM;sBAAA,OAAE,KAAK,CAAC,MAAM;oBAAA;oBACpB,WAAW,EAAE,KAAK;oBAAA,IAClB,QAAQ;sBAAA,OAAE,QAAQ,CAAC,CAAC;oBAAA;oBACpB,IAAI,EAAE,SAAS;oBACf,YAAY,EAAE;kBAAmB;gBAAA;cAAA,gCAItC,IAAI;gBAAA,IAAC,IAAI;kBAAA,OAAE,KAAK,CAAC,aAAa;gBAAA;gBAAA,UAC3B,MAAM,+CAEH,IAAI;kBAAA,IAAC,IAAI;oBAAA,OAAE,MAAM,CAAC,CAAC,KAAK,SAAS;kBAAA;kBAAA;oBAAA;kBAAA;gBAAA,gCAQjC,IAAI;kBAAA,IAAC,IAAI;oBAAA,OAAE,UAAU,CAAC,CAAC;kBAAA;kBAAA,UAAI,IAAI,sBAAM,iBAAiB;oBAAC,EAAE,EAAE,SAAS;oBAAA,IAAE,IAAI;sBAAA,OAAE,IAAI,CAAC,CAAC;oBAAA;oBAAA,IAAE,MAAM;sBAAA,OAAE,MAAM,CAAC,CAAC;oBAAA;kBAAA;gBAAI;cAE5G;YAAA;UAAA;QAAA;MAAA;IAAA;EAAA;AASnB;;AAEA;AACA;AACA;AACA;AACA;AACA,SAAS,eAAe,CAAC,KAOxB,EAAe;EACd,MAAM,QAAQ,GAAG,qBAAqB,CAAC,CAAC;EACxC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK;EACzB,MAAM,GAAG,GAAG,cAAc,CAAC,CAAC;EAC5B,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,YAAY,CAAC,EAAE,CAAC;EAC1C,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,YAAY,CAAS,CAAC;EAC5D;EACA;EACA,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,KAAK,CAAC,KAAK,CAAC,IAAI,CAAE,IAAI,IAAK,IAAI,CAAC,KAAK,KAAK,WAAW,CAAC,CAAC,CAAC,CAAC;EACzF,IAAI,IAAmC;EACvC,IAAI,WAA+B;EACnC,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,MAAM,IAAI,OAAO;EAC5C,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,CAAC,KAAK,OAAO,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,IAAI,uBAAuB;EAC9F,MAAM,OAAO,GAAG,UAAU,CAAC,MAAO,UAAU,CAAC,CAAC,GAAG,mBAAmB,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,KAAM,CAAC;EAC1G,MAAM,SAAS,GAAG,UAAU,CAAC,MAAM,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;EAC/D,MAAM,QAAQ,GAAG,MAAO,KAAK,CAAC,KAAK,CAAC,MAAM,IAAI,uBAAuB,IAAI,KAAK,CAAC,QAAQ,GAAG,KAAK,CAAC,QAAQ,GAAG,SAAU;EACrH,MAAM,iBAAiB,GAAG,MAAM;IAC9B,IAAI,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;EAC7C,CAAC;EACD,MAAM,aAAa,GAAI,KAAa,IAAK;IACvC,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;IAC7B,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC;IACvB,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,OAAO,IAAI,OAAO,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC,OAAO,EAAE,OAAO,SAAS;IAC/F,OAAO,IAAI,CAAC,IAAI,CAAE,SAAS,IAAK,SAAS,CAAC,EAAE,KAAK,IAAI,CAAC,OAAO,CAAC,EAAE,KAAK;EACvE,CAAC;EACD,MAAM,MAAM,GAAI,IAAoB,IAAK;IACvC,IAAI,KAAK,CAAC,QAAQ,IAAI,MAAM,CAAC,CAAC,KAAK,OAAO,IAAI,IAAI,CAAC,cAAc,EAAE;IACnE,KAAK,CAAC,IAAI,CAAC,MAAM;MACf,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAE,SAAS,IAAK,SAAS,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,CAAC;MAC/E,IAAI,CAAC,KAAK,CAAC,QAAQ,IAAI,MAAM,CAAC,CAAC,KAAK,OAAO,IAAI,OAAO,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,gBAAgB,CAAC,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC;IAC3H,CAAC,CAAC;EACJ,CAAC;EACD,MAAM,KAAK,GAAI,KAAa,IAAK,yBAAyB,GAAG,IAAI,KAAK,EAAE;EACxE,MAAM,UAAU,GAAI,IAAoB,IAAK;IAC3C,WAAW,GAAG,IAAI,CAAC,KAAK;IACxB;IACA,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC,CAAC,MAAM,IAAI;IACjF,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC;IAC1B,cAAc,CAAC,MAAM,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;EACrC,CAAC;EACD,MAAM,WAAW,GAAG,MAAM;IACxB,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,GAAG,EAAE;IACjC,cAAc,CAAC,SAAS,CAAC;IACzB,MAAM,KAAK,GAAG,WAAW;IACzB,cAAc,CAAC,MAAM;MACnB,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,SAAS,CAAE,IAAI,IAAK,IAAI,CAAC,KAAK,KAAK,KAAK,CAAC;MACjE,MAAM,QAAQ,GAAG,KAAK,IAAI,CAAC,GAAG,QAAQ,CAAC,cAAc,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,SAAS;MACzF,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,aAAa,CAAoB,sCAAsC,CAAC;MACtG,CAAC,QAAQ,IAAI,QAAQ,IAAI,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAChD,CAAC,CAAC;EACJ,CAAC;EACD,YAAY,CAAC,MAAM;IACjB,IAAI,WAAW,CAAC,CAAC,KAAK,SAAS,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,KAAK,OAAO,CAAC,EAAE,WAAW,CAAC,CAAC;EACvF,CAAC,CAAC;EACF;EACA,MAAM,QAAQ,GAAI,KAAoB,IAAK;IACzC,IAAI,KAAK,CAAC,GAAG,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE;IACzC,KAAK,CAAC,cAAc,CAAC,CAAC;IACtB,KAAK,CAAC,eAAe,CAAC,CAAC;IACvB,WAAW,CAAC,CAAC;EACf,CAAC;EACD,OAAO,CAAC,MAAM;IACZ,KAAK,CAAC,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,QAAQ,EAAE,IAAI,CAAC;IACxD,SAAS,CAAC,MAAM;MACd,KAAK,CAAC,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,QAAQ,EAAE,IAAI,CAAC;MAC3D;MACA,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,GAAG,EAAE;IACnC,CAAC,CAAC;EACJ,CAAC,CAAC;EAEF,mDAGO,IAAI;IAAA,IAAC,IAAI;MAAA,OAAE,MAAM,CAAC,CAAC;IAAA;IAAA;MAAA,6DACqD,QAAQ,CAAC,CAAC,CAAC,IAAI;IAAA;EAAA,cAInF,MAAM,CAAC,CAAC,EAAE,KAAK,IAAI,KAAK,CAAC,KAAK,yCACyB,QAAQ,CAAC,CAAC,CAAC,KAAK,oCAI7E,IAAI;IAAA,IACH,IAAI;MAAA,OAAE,MAAM,CAAC,CAAC;IAAA;IAAA,IACd,QAAQ;MAAA,yBACL,WAAW,CAAC,IAAI;QAAA;UAAA,yBACd,MAAM;YAAA;cAAA,0BACJ,KAAK;gBAAA,IAAC,IAAI;kBAAA,OAAE,MAAM,CAAC,CAAC,KAAK,OAAO;gBAAA;gBAAA;kBAAA,yBAC9B,eAAe;oBAAC,MAAM;oBAAA,IAAS,QAAQ;sBAAA,OAAE,QAAQ,CAAC,CAAC;oBAAA;oBAAA,IAAE,OAAO;sBAAA,OAAE,KAAK,CAAC,OAAO;oBAAA;oBAAE,YAAY,EAAE;kBAAiB;gBAAA;cAAA,sBAE9G,KAAK;gBAAA,IAAC,IAAI;kBAAA,OAAE,mBAAM,CAAC,CAAC,KAAK,OAAO,OAAI,KAAK,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC;gBAAA;gBAAA;kBAAA,0BAC1D,eAAe;oBAAC,MAAM;oBAAA,IAAS,QAAQ;sBAAA,OAAE,QAAQ,CAAC,CAAC;oBAAA;oBAAA,IAAE,KAAK;sBAAA,OAAE,KAAK,CAAC,KAAK;oBAAA;kBAAA,sBACvE,IAAI;oBAAA,IAAC,IAAI;sBAAA,OAAE,KAAK,CAAC,MAAM;oBAAA;oBAAA,UACpB,MAAM,sBACL,uBAAuB;sBAAA,IACtB,MAAM;wBAAA,OAAE,MAAM,CAAC,CAAC;sBAAA;sBAChB,WAAW,EAAE,KAAK;sBAAA,IAClB,QAAQ;wBAAA,OAAE,QAAQ,CAAC,CAAC;sBAAA;sBAAA,IACpB,IAAI;wBAAA,OAAE,KAAK,CAAC,IAAI;sBAAA;sBAChB,YAAY,EAAE;oBAAiB;kBAElC;gBAAA;cAAA,sBAGJ,KAAK;gBAAC,IAAI;gBAAA;kBAAA,0BACR,IAAI;oBAAA,IAAC,IAAI;sBAAA,OAAE,UAAU,CAAC,CAAC;oBAAA;oBAAA;sBAAA,wDAUX,KAAK,CAAC,CAAC,yDACD,KAAK,CAAC,iBAAiB,IAAI,QAAQ,CAAC,CAAC,CAAC,MAAM,wDAC7C,KAAK,CAAC,iBAAiB,IAAI,QAAQ,CAAC,CAAC,CAAC,MAAM;oBAAA;kBAAA,0DAShD,KAAK,CAAC,KAAK,8CACZ,MAAM,CAAC,CAAC,KAAK,SAAS,GAAG,MAAM,YAAG,SAAS,gDACzC,SAAS,CAAC,CAAC,GAAG,MAAM,YAAG,SAAS,4CAE5C,IAAI;oBAAA,IAAC,IAAI;sBAAA,OAAE,MAAM,CAAC,CAAC,KAAK,SAAS;oBAAA;oBAAA;sBAAA,iCACL,QAAQ,CAAC,CAAC,CAAC,OAAO,sBAC5C,sBAAsB;wBAAA,IAAC,MAAM;0BAAA,OAAE,SAAS,CAAC,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC;wBAAA;sBAAA;oBAAA;kBAAA,gCAExE,IAAI;oBAAA,IAAC,IAAI;sBAAA,OAAE,MAAM,CAAC,CAAC,KAAK,OAAO;oBAAA;oBAAA;sBAAA,yBAC7B,GAAG;wBAAA,IAAC,IAAI;0BAAA,OAAE,OAAO,CAAC,CAAC;wBAAA;wBAAA,IAAE,QAAQ;0BAAA,gCAA4C,QAAQ,CAAC,CAAC,CAAC,SAAS;wBAAA;wBAAA,UAC3F,CAAC,IAAI,EAAE,KAAK,wBAER,IAAI;0BAAA,IAAC,IAAI;4BAAA,OAAE,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;0BAAA;0BAAA,UAAI,KAAK,6BAA4C,KAAK,CAAC,CAAC;wBAAO,gDAClC,KAAK,CAAC,aAAa,GAAG,MAAM,YAAG,SAAS,+CAEnG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,gDAGJ,IAAI,CAAC,KAAK,KAAK,KAAK,CAAC,KAAK,CAAC,CAAC,GAAG,MAAM,YAAG,SAAS,kDAChD,IAAI,CAAC,cAAc,GAAG,MAAM,YAAG,SAAS,iBACtC,YAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,eAAQ,qCACxB,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,WAAW,GAAG,YAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,cAAO,YAAG,SAAS,4CAG/F,IAAI;0BAAA,IAAC,IAAI;4BAAA,OAAE,SAAS,CAAC,CAAC;0BAAA;0BAAA;4BAAA,yBACpB,IAAI;8BAAA,IAAC,IAAI;gCAAA,OAAE,SAAS,CAAC,IAAI,CAAC;8BAAA;8BAAA,IAAE,QAAQ;gCAAA;8BAAA;8BAAA;gCAAA,yBAClC,gBAAgB;kCAAC,IAAI,EAAE;gCAAI;8BAAA;4BAAA;0BAAA;wBAAA,gCAG/B,iBAAiB;0BAAC,IAAI,EAAE,IAAI;0BAAA,IAAE,OAAO;4BAAA,OAAE,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ;0BAAA;0BAAA,IAAE,MAAM;4BAAA,OAAE,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO;0BAAA;wBAAA,gCAGpG,IAAI;0BAAA,IAAC,IAAI;4BAAA,OAAE,KAAK,CAAC,aAAa;0BAAA;0BAAA;4BAAA,uBAEvB,YAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,cAAO,wCAGhB,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC;8BAAE,IAAI,EAAE,IAAI,CAAC;4BAAM,CAAC,CAAC;0BAAA;wBAAA;sBAQhE;oBAAA;kBAAA,wBAIN,IAAI;oBAAA,IAAC,IAAI;sBAAA,OAAE,oBAAK,CAAC,MAAM,OAAI,MAAM,CAAC,CAAC,KAAK,OAAO;oBAAA;oBAAA;sBAAA,yBAC7C,uBAAuB;wBAAA,IACtB,MAAM;0BAAA,OAAE,KAAK,CAAC,MAAM;wBAAA;wBACpB,WAAW,EAAE,KAAK;wBAAA,IAClB,QAAQ;0BAAA,OAAE,QAAQ,CAAC,CAAC;wBAAA;wBAAA,IACpB,IAAI;0BAAA,OAAE,KAAK,CAAC,IAAI;wBAAA;wBAChB,YAAY,EAAE;sBAAiB;oBAAA;kBAAA;gBAAA;cAAA;YAAA;UAAA;QAAA;MAAA;IAAA;IAAA,UAQzC,IAAI,uBAED,WAAW,CAAC,IAAI;MAAA;QAAA,kDAEZ,iBAAiB;UAAA,IAAC,IAAI;YAAA,OAAE,IAAI,CAAC,CAAC;UAAA;UAAA,IAAE,MAAM;YAAA,OAAE,KAAK,CAAC,aAAa;UAAA;QAAA;MAAA;IAAA,sBAG/D,WAAW,CAAC,MAAM;MAAA;QAAA,yBAChB,MAAM;UACL,OAAO;UACP,IAAI;UAAA;UAAA,IAEJ,QAAQ;YAAA,OAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC;UAAA;UACxC,OAAO,EAAE,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;UAAA;YAAA,yBAG5B,QAAQ,CAAC,CAAC,CAAC,MAAM;UAAA;QAAA;MAAA;IAAA;EAIzB;AAIT;AAEA,eAAe,UAAU","ignoreList":[]}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { createComponent as _$createComponent } from "solid-js/web";
|
|
2
|
+
import { createMemo, For, untrack } from "solid-js";
|
|
3
|
+
/**
|
|
4
|
+
* `<For>` that keeps a row's element while its item stays the same: the same object, also when its getters change, or
|
|
5
|
+
* a new object with the same identity (`by`). Hosts rebuild equal items whenever their inputs change; `<For>` would
|
|
6
|
+
* then replace each row, and a row replaced between press and release swallows the click (#2140).
|
|
7
|
+
* Each row reads its current item.
|
|
8
|
+
*/
|
|
9
|
+
export function KeyedFor(props) {
|
|
10
|
+
let previous = [];
|
|
11
|
+
let counter = 0;
|
|
12
|
+
const entries = createMemo(() => {
|
|
13
|
+
const byObject = new Map(previous.map(entry => [entry.item, entry.key]));
|
|
14
|
+
const byIdentity = new Map();
|
|
15
|
+
for (const entry of previous) byIdentity.set(entry.identity, [...(byIdentity.get(entry.identity) ?? []), entry.key]);
|
|
16
|
+
const used = new Set();
|
|
17
|
+
const next = props.each.map(item => {
|
|
18
|
+
// Only a new list reconciles rows; a getter behind the identity changing alone must not re-read the list.
|
|
19
|
+
const identity = untrack(() => props.by(item));
|
|
20
|
+
const same = byObject.get(item);
|
|
21
|
+
const equal = byIdentity.get(identity)?.find(key => !used.has(key));
|
|
22
|
+
const key = same !== undefined && !used.has(same) ? same : equal ?? `row-${counter++}`;
|
|
23
|
+
used.add(key);
|
|
24
|
+
return {
|
|
25
|
+
item,
|
|
26
|
+
key,
|
|
27
|
+
identity
|
|
28
|
+
};
|
|
29
|
+
});
|
|
30
|
+
previous = next;
|
|
31
|
+
return next;
|
|
32
|
+
});
|
|
33
|
+
const byKey = createMemo(() => new Map(entries().map(entry => [entry.key, entry.item])));
|
|
34
|
+
return _$createComponent(For, {
|
|
35
|
+
get each() {
|
|
36
|
+
return entries().map(entry => entry.key);
|
|
37
|
+
},
|
|
38
|
+
get fallback() {
|
|
39
|
+
return props.fallback;
|
|
40
|
+
},
|
|
41
|
+
children: (key, index) => {
|
|
42
|
+
const first = byKey().get(key);
|
|
43
|
+
return props.children(() => byKey().get(key) ?? first, index);
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=keyed-for.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":[],"sources":["internal/keyed-for.tsx"],"sourcesContent":["import { createMemo, For, type JSX, untrack } from \"solid-js\";\n\ntype Entry<T> = { item: T; key: string; identity: string };\n\n/**\n * `<For>` that keeps a row's element while its item stays the same: the same object, also when its getters change, or\n * a new object with the same identity (`by`). Hosts rebuild equal items whenever their inputs change; `<For>` would\n * then replace each row, and a row replaced between press and release swallows the click (#2140).\n * Each row reads its current item.\n */\nexport function KeyedFor<T>(props: {\n each: readonly T[];\n by: (item: T) => string;\n fallback?: JSX.Element;\n children: (item: () => T, index: () => number) => JSX.Element;\n}): JSX.Element {\n let previous: Entry<T>[] = [];\n let counter = 0;\n const entries = createMemo(() => {\n const byObject = new Map(previous.map((entry) => [entry.item, entry.key]));\n const byIdentity = new Map<string, string[]>();\n for (const entry of previous) byIdentity.set(entry.identity, [...(byIdentity.get(entry.identity) ?? []), entry.key]);\n const used = new Set<string>();\n const next = props.each.map((item): Entry<T> => {\n // Only a new list reconciles rows; a getter behind the identity changing alone must not re-read the list.\n const identity = untrack(() => props.by(item));\n const same = byObject.get(item);\n const equal = byIdentity.get(identity)?.find((key) => !used.has(key));\n const key = same !== undefined && !used.has(same) ? same : (equal ?? `row-${counter++}`);\n used.add(key);\n return { item, key, identity };\n });\n previous = next;\n return next;\n });\n const byKey = createMemo(() => new Map(entries().map((entry) => [entry.key, entry.item])));\n return (\n <For each={entries().map((entry) => entry.key)} fallback={props.fallback}>\n {(key, index) => {\n const first = byKey().get(key)!;\n return props.children(() => byKey().get(key) ?? first, index);\n }}\n </For>\n );\n}\n"],"mappings":";AAAA,SAAS,UAAU,EAAE,GAAG,EAAY,OAAO,QAAQ,UAAU;AAI7D;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAAS,QAAQ,CAAI,KAK3B,EAAe;EACd,IAAI,QAAoB,GAAG,EAAE;EAC7B,IAAI,OAAO,GAAG,CAAC;EACf,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM;IAC/B,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAE,KAAK,IAAK,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1E,MAAM,UAAU,GAAG,IAAI,GAAG,CAAmB,CAAC;IAC9C,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,IAAI,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;IACpH,MAAM,IAAI,GAAG,IAAI,GAAG,CAAS,CAAC;IAC9B,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAE,IAAI,IAAe;MAC9C;MACA,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;MAC9C,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;MAC/B,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAE,GAAG,IAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;MACrE,MAAM,GAAG,GAAG,IAAI,KAAK,SAAS,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,GAAI,KAAK,IAAI,OAAO,OAAO,EAAE,EAAG;MACxF,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;MACb,OAAO;QAAE,IAAI;QAAE,GAAG;QAAE;MAAS,CAAC;IAChC,CAAC,CAAC;IACF,QAAQ,GAAG,IAAI;IACf,OAAO,IAAI;EACb,CAAC,CAAC;EACF,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAE,KAAK,IAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;EAC1F,yBACG,GAAG;IAAA,IAAC,IAAI;MAAA,OAAE,OAAO,CAAC,CAAC,CAAC,GAAG,CAAE,KAAK,IAAK,KAAK,CAAC,GAAG,CAAC;IAAA;IAAA,IAAE,QAAQ;MAAA,OAAE,KAAK,CAAC,QAAQ;IAAA;IAAA,UACrE,CAAC,GAAG,EAAE,KAAK,KAAK;MACf,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAE;MAC/B,OAAO,KAAK,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,KAAK,EAAE,KAAK,CAAC;IAC/D;EAAC;AAGP","ignoreList":[]}
|
|
@@ -1,14 +1,17 @@
|
|
|
1
1
|
import { standardKeymap } from "@codemirror/commands";
|
|
2
|
-
import { defaultHighlightStyle, syntaxHighlighting } from "@codemirror/language";
|
|
2
|
+
import { defaultHighlightStyle, HighlightStyle, syntaxHighlighting } from "@codemirror/language";
|
|
3
3
|
import { Compartment, EditorState, Prec, Text } from "@codemirror/state";
|
|
4
4
|
import { drawSelection, EditorView, keymap, placeholder, runScopeHandlers } from "@codemirror/view";
|
|
5
|
+
import { tags } from "@lezer/highlight";
|
|
5
6
|
import { clipboardLoading } from "./clipboard-loading";
|
|
6
7
|
import { commands } from "./format";
|
|
7
8
|
import { formattedView } from "./formatted";
|
|
8
9
|
import { markdown } from "./language";
|
|
9
10
|
import { cleanPaste } from "./paste";
|
|
10
11
|
import { tableGrid, tableHost } from "./table";
|
|
11
|
-
|
|
12
|
+
// CodeMirror's default style underlines headings; heading lines carry their own size and weight instead.
|
|
13
|
+
const highlightStyle = HighlightStyle.define(defaultHighlightStyle.specs.filter(spec => spec.tag !== tags.heading));
|
|
14
|
+
const builtInPresentation = mode => [markdown(), syntaxHighlighting(highlightStyle, {
|
|
12
15
|
fallback: true
|
|
13
16
|
}), mode === "formatted" ? formattedView : EditorView.contentAttributes.of({
|
|
14
17
|
class: "k2b-ste-source"
|
|
@@ -30,7 +33,8 @@ const builtInPresentation = mode => [markdown(), syntaxHighlighting(defaultHighl
|
|
|
30
33
|
export function createTextEditor(options) {
|
|
31
34
|
const modeSlot = new Compartment();
|
|
32
35
|
const readOnlySlot = new Compartment();
|
|
33
|
-
|
|
36
|
+
// The label is read on every view update; changing it never dispatches, so a host may set it during an update.
|
|
37
|
+
let label = options.label;
|
|
34
38
|
const presentation = options.presentation ?? builtInPresentation;
|
|
35
39
|
const runHistory = (view, direction) => {
|
|
36
40
|
view.state.facet(tableHost)?.[direction]();
|
|
@@ -42,8 +46,8 @@ export function createTextEditor(options) {
|
|
|
42
46
|
parent: options.parent,
|
|
43
47
|
state: EditorState.create({
|
|
44
48
|
doc: Text.of((options.doc ?? "").split("\n")),
|
|
45
|
-
extensions: [drawSelection(), EditorView.lineWrapping, placeholder(options.placeholder ?? ""),
|
|
46
|
-
"aria-label":
|
|
49
|
+
extensions: [drawSelection(), EditorView.lineWrapping, placeholder(options.placeholder ?? ""), EditorView.contentAttributes.of(() => ({
|
|
50
|
+
"aria-label": label
|
|
47
51
|
})), Prec.highest([keymap.of([{
|
|
48
52
|
key: "Mod-z",
|
|
49
53
|
run: view => runHistory(view, "undo"),
|
|
@@ -104,11 +108,10 @@ export function createTextEditor(options) {
|
|
|
104
108
|
setMode: mode => view.dispatch({
|
|
105
109
|
effects: modeSlot.reconfigure(modeExtensions(mode))
|
|
106
110
|
}),
|
|
107
|
-
setLabel:
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
}),
|
|
111
|
+
setLabel: next => {
|
|
112
|
+
label = next;
|
|
113
|
+
view.contentDOM.setAttribute("aria-label", next);
|
|
114
|
+
},
|
|
112
115
|
// Hosts re-run this from reactive state that may change inside an editor update; an unchanged value must not dispatch.
|
|
113
116
|
setReadOnly: readOnly => {
|
|
114
117
|
if (view.state.readOnly === readOnly && view.state.facet(EditorView.editable) === !readOnly) return;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":[],"sources":["text-editor/engine.ts"],"sourcesContent":["import { standardKeymap } from \"@codemirror/commands\";\nimport { defaultHighlightStyle, syntaxHighlighting } from \"@codemirror/language\";\nimport { Compartment, EditorState, type Extension, Prec, Text } from \"@codemirror/state\";\nimport { drawSelection, EditorView, keymap, placeholder, runScopeHandlers } from \"@codemirror/view\";\nimport { clipboardLoading } from \"./clipboard-loading\";\nimport { commands } from \"./format\";\nimport { formattedView } from \"./formatted\";\nimport { markdown } from \"./language\";\nimport { cleanPaste } from \"./paste\";\nimport { type TableHost, tableGrid, tableHost } from \"./table\";\n\nexport type TextEditorMode = \"formatted\" | \"source\" | \"plain\";\nexport type TextEditorOptions = {\n parent: HTMLElement;\n /** Initial Markdown. Subsequent collaborative changes arrive through extensions. */\n doc?: string;\n mode?: TextEditorMode;\n readOnly?: boolean;\n placeholder?: string;\n label: string;\n extensions?: Extension;\n /**\n * Replaces the built-in Markdown language, highlighting, formatted markers and\n * formatting keys of the formatted and source modes. The engine keeps the\n * table grid, clean paste, limits and history routing in every mode.\n */\n presentation?: (mode: Exclude<TextEditorMode, \"plain\">) => Extension;\n /** The host owns history; collaboration bindings supply theirs. */\n host: TableHost;\n onChange?: (text: string) => void;\n onDroppedImages?: (count: number, files: File[]) => void;\n};\n\nconst builtInPresentation = (mode: Exclude<TextEditorMode, \"plain\">): Extension => [\n markdown(),\n syntaxHighlighting(defaultHighlightStyle, { fallback: true }),\n mode === \"formatted\" ? formattedView : EditorView.contentAttributes.of({ class: \"k2b-ste-source\" }),\n keymap.of([\n { key: \"Mod-b\", run: commands.bold },\n { key: \"Mod-i\", run: commands.italic },\n { key: \"Mod-k\", run: commands.link },\n { key: \"Mod-Shift-x\", run: commands.strike },\n ]),\n];\n\n/** Shared engine; application extensions own transport, awareness and domain features. */\nexport function createTextEditor(options: TextEditorOptions) {\n const modeSlot = new Compartment();\n const readOnlySlot = new Compartment();\n const labelSlot = new Compartment();\n const presentation = options.presentation ?? builtInPresentation;\n const runHistory = (view: EditorView, direction: \"undo\" | \"redo\") => {\n view.state.facet(tableHost)?.[direction]();\n // Consume even an empty or read-only history, so another binding cannot handle it again.\n return true;\n };\n const modeExtensions = (mode: TextEditorMode): Extension =>\n mode === \"plain\"\n ? [clipboardLoading(() => options.host), cleanPaste(options.onDroppedImages, true)]\n : [\n presentation(mode),\n mode === \"formatted\" ? tableGrid() : clipboardLoading(() => options.host),\n cleanPaste(options.onDroppedImages),\n ];\n const view = new EditorView({\n parent: options.parent,\n state: EditorState.create({\n doc: Text.of((options.doc ?? \"\").split(\"\\n\")),\n extensions: [\n drawSelection(),\n EditorView.lineWrapping,\n placeholder(options.placeholder ?? \"\"),\n labelSlot.of(EditorView.contentAttributes.of({ \"aria-label\": options.label })),\n Prec.highest([\n keymap.of([\n { key: \"Mod-z\", run: (view) => runHistory(view, \"undo\"), shift: (view) => runHistory(view, \"redo\"), preventDefault: true },\n { key: \"Mod-y\", run: (view) => runHistory(view, \"redo\"), preventDefault: true },\n ]),\n EditorView.domEventHandlers({\n beforeinput(event, view) {\n if (event.inputType === \"historyUndo\") return runHistory(view, \"undo\");\n if (event.inputType === \"historyRedo\") return runHistory(view, \"redo\");\n return false;\n },\n }),\n ]),\n keymap.of(standardKeymap),\n tableHost.of({\n ...options.host,\n onDroppedImages: options.onDroppedImages,\n undo: () => {\n if (!view.state.readOnly) options.host.undo();\n },\n redo: () => {\n if (!view.state.readOnly) options.host.redo();\n },\n }),\n EditorState.transactionFilter.of((tr) => {\n // Only growth is refused: an over-limit text stays editable so it can be shortened.\n if (\n tr.docChanged &&\n tr.isUserEvent(\"input\") &&\n tr.newDoc.length > options.host.maxLength &&\n tr.newDoc.length > tr.startState.doc.length\n ) {\n const inserted: string[] = [];\n tr.changes.iterChanges((_from, _to, _newFrom, _newTo, text) => {\n if (text.length) inserted.push(text.toString());\n });\n queueMicrotask(() => {\n if (inserted.length) options.host.onRecovery(inserted.join(\"\\n\"));\n options.host.onError(\"textTooLarge\");\n });\n return [];\n }\n return tr;\n }),\n EditorView.updateListener.of((update) => {\n if (update.docChanged) options.onChange?.(update.state.doc.toString());\n }),\n modeSlot.of(modeExtensions(options.mode ?? \"formatted\")),\n readOnlySlot.of([EditorState.readOnly.of(options.readOnly ?? false), EditorView.editable.of(!options.readOnly)]),\n options.extensions ?? [],\n ],\n }),\n });\n // CM's Android DOM-input deferral can lose a physical Enter when the next\n // EditContext update arrives before its animation frame. Run the public\n // keymap synchronously only for that reliable, non-composing key event.\n const enter = (event: KeyboardEvent) => {\n if (\n event.target !== view.contentDOM ||\n event.key !== \"Enter\" ||\n event.keyCode !== 13 ||\n event.isComposing ||\n view.composing ||\n event.defaultPrevented ||\n !/Android/.test(view.dom.ownerDocument.defaultView?.navigator.userAgent ?? \"\") ||\n !(\"editContext\" in view.contentDOM && view.contentDOM.editContext)\n )\n return;\n if (runScopeHandlers(view, event, \"editor\")) {\n event.preventDefault();\n event.stopImmediatePropagation();\n }\n };\n view.contentDOM.addEventListener(\"keydown\", enter, true);\n return {\n view,\n /** Also re-reads `presentation`, so a host can refresh it, e.g. after a theme change. */\n setMode: (mode: TextEditorMode) => view.dispatch({ effects: modeSlot.reconfigure(modeExtensions(mode)) }),\n setLabel: (label: string) =>\n view.dispatch({ effects: labelSlot.reconfigure(EditorView.contentAttributes.of({ \"aria-label\": label })) }),\n // Hosts re-run this from reactive state that may change inside an editor update; an unchanged value must not dispatch.\n setReadOnly: (readOnly: boolean) => {\n if (view.state.readOnly === readOnly && view.state.facet(EditorView.editable) === !readOnly) return;\n view.dispatch({ effects: readOnlySlot.reconfigure([EditorState.readOnly.of(readOnly), EditorView.editable.of(!readOnly)]) });\n },\n destroy: () => {\n view.contentDOM.removeEventListener(\"keydown\", enter, true);\n view.destroy();\n },\n };\n}\nexport type TextEditorController = ReturnType<typeof createTextEditor>;\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":[],"sources":["text-editor/engine.ts"],"sourcesContent":["import { standardKeymap } from \"@codemirror/commands\";\nimport { defaultHighlightStyle, HighlightStyle, syntaxHighlighting } from \"@codemirror/language\";\nimport { Compartment, EditorState, type Extension, Prec, Text } from \"@codemirror/state\";\nimport { drawSelection, EditorView, keymap, placeholder, runScopeHandlers } from \"@codemirror/view\";\nimport { tags } from \"@lezer/highlight\";\nimport { clipboardLoading } from \"./clipboard-loading\";\nimport { commands } from \"./format\";\nimport { formattedView } from \"./formatted\";\nimport { markdown } from \"./language\";\nimport { cleanPaste } from \"./paste\";\nimport { type TableHost, tableGrid, tableHost } from \"./table\";\n\nexport type TextEditorMode = \"formatted\" | \"source\" | \"plain\";\nexport type TextEditorOptions = {\n parent: HTMLElement;\n /** Initial Markdown. Subsequent collaborative changes arrive through extensions. */\n doc?: string;\n mode?: TextEditorMode;\n readOnly?: boolean;\n placeholder?: string;\n label: string;\n extensions?: Extension;\n /**\n * Replaces the built-in Markdown language, highlighting, formatted markers and\n * formatting keys of the formatted and source modes. The engine keeps the\n * table grid, clean paste, limits and history routing in every mode.\n */\n presentation?: (mode: Exclude<TextEditorMode, \"plain\">) => Extension;\n /** The host owns history; collaboration bindings supply theirs. */\n host: TableHost;\n onChange?: (text: string) => void;\n onDroppedImages?: (count: number, files: File[]) => void;\n};\n\n// CodeMirror's default style underlines headings; heading lines carry their own size and weight instead.\nconst highlightStyle = HighlightStyle.define(defaultHighlightStyle.specs.filter((spec) => spec.tag !== tags.heading));\n\nconst builtInPresentation = (mode: Exclude<TextEditorMode, \"plain\">): Extension => [\n markdown(),\n syntaxHighlighting(highlightStyle, { fallback: true }),\n mode === \"formatted\" ? formattedView : EditorView.contentAttributes.of({ class: \"k2b-ste-source\" }),\n keymap.of([\n { key: \"Mod-b\", run: commands.bold },\n { key: \"Mod-i\", run: commands.italic },\n { key: \"Mod-k\", run: commands.link },\n { key: \"Mod-Shift-x\", run: commands.strike },\n ]),\n];\n\n/** Shared engine; application extensions own transport, awareness and domain features. */\nexport function createTextEditor(options: TextEditorOptions) {\n const modeSlot = new Compartment();\n const readOnlySlot = new Compartment();\n // The label is read on every view update; changing it never dispatches, so a host may set it during an update.\n let label = options.label;\n const presentation = options.presentation ?? builtInPresentation;\n const runHistory = (view: EditorView, direction: \"undo\" | \"redo\") => {\n view.state.facet(tableHost)?.[direction]();\n // Consume even an empty or read-only history, so another binding cannot handle it again.\n return true;\n };\n const modeExtensions = (mode: TextEditorMode): Extension =>\n mode === \"plain\"\n ? [clipboardLoading(() => options.host), cleanPaste(options.onDroppedImages, true)]\n : [\n presentation(mode),\n mode === \"formatted\" ? tableGrid() : clipboardLoading(() => options.host),\n cleanPaste(options.onDroppedImages),\n ];\n const view = new EditorView({\n parent: options.parent,\n state: EditorState.create({\n doc: Text.of((options.doc ?? \"\").split(\"\\n\")),\n extensions: [\n drawSelection(),\n EditorView.lineWrapping,\n placeholder(options.placeholder ?? \"\"),\n EditorView.contentAttributes.of(() => ({ \"aria-label\": label })),\n Prec.highest([\n keymap.of([\n { key: \"Mod-z\", run: (view) => runHistory(view, \"undo\"), shift: (view) => runHistory(view, \"redo\"), preventDefault: true },\n { key: \"Mod-y\", run: (view) => runHistory(view, \"redo\"), preventDefault: true },\n ]),\n EditorView.domEventHandlers({\n beforeinput(event, view) {\n if (event.inputType === \"historyUndo\") return runHistory(view, \"undo\");\n if (event.inputType === \"historyRedo\") return runHistory(view, \"redo\");\n return false;\n },\n }),\n ]),\n keymap.of(standardKeymap),\n tableHost.of({\n ...options.host,\n onDroppedImages: options.onDroppedImages,\n undo: () => {\n if (!view.state.readOnly) options.host.undo();\n },\n redo: () => {\n if (!view.state.readOnly) options.host.redo();\n },\n }),\n EditorState.transactionFilter.of((tr) => {\n // Only growth is refused: an over-limit text stays editable so it can be shortened.\n if (\n tr.docChanged &&\n tr.isUserEvent(\"input\") &&\n tr.newDoc.length > options.host.maxLength &&\n tr.newDoc.length > tr.startState.doc.length\n ) {\n const inserted: string[] = [];\n tr.changes.iterChanges((_from, _to, _newFrom, _newTo, text) => {\n if (text.length) inserted.push(text.toString());\n });\n queueMicrotask(() => {\n if (inserted.length) options.host.onRecovery(inserted.join(\"\\n\"));\n options.host.onError(\"textTooLarge\");\n });\n return [];\n }\n return tr;\n }),\n EditorView.updateListener.of((update) => {\n if (update.docChanged) options.onChange?.(update.state.doc.toString());\n }),\n modeSlot.of(modeExtensions(options.mode ?? \"formatted\")),\n readOnlySlot.of([EditorState.readOnly.of(options.readOnly ?? false), EditorView.editable.of(!options.readOnly)]),\n options.extensions ?? [],\n ],\n }),\n });\n // CM's Android DOM-input deferral can lose a physical Enter when the next\n // EditContext update arrives before its animation frame. Run the public\n // keymap synchronously only for that reliable, non-composing key event.\n const enter = (event: KeyboardEvent) => {\n if (\n event.target !== view.contentDOM ||\n event.key !== \"Enter\" ||\n event.keyCode !== 13 ||\n event.isComposing ||\n view.composing ||\n event.defaultPrevented ||\n !/Android/.test(view.dom.ownerDocument.defaultView?.navigator.userAgent ?? \"\") ||\n !(\"editContext\" in view.contentDOM && view.contentDOM.editContext)\n )\n return;\n if (runScopeHandlers(view, event, \"editor\")) {\n event.preventDefault();\n event.stopImmediatePropagation();\n }\n };\n view.contentDOM.addEventListener(\"keydown\", enter, true);\n return {\n view,\n /** Also re-reads `presentation`, so a host can refresh it, e.g. after a theme change. */\n setMode: (mode: TextEditorMode) => view.dispatch({ effects: modeSlot.reconfigure(modeExtensions(mode)) }),\n setLabel: (next: string) => {\n label = next;\n view.contentDOM.setAttribute(\"aria-label\", next);\n },\n // Hosts re-run this from reactive state that may change inside an editor update; an unchanged value must not dispatch.\n setReadOnly: (readOnly: boolean) => {\n if (view.state.readOnly === readOnly && view.state.facet(EditorView.editable) === !readOnly) return;\n view.dispatch({ effects: readOnlySlot.reconfigure([EditorState.readOnly.of(readOnly), EditorView.editable.of(!readOnly)]) });\n },\n destroy: () => {\n view.contentDOM.removeEventListener(\"keydown\", enter, true);\n view.destroy();\n },\n };\n}\nexport type TextEditorController = ReturnType<typeof createTextEditor>;\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -113,7 +113,7 @@ export type MessageRowProps = {
|
|
|
113
113
|
* the author and time. Defaults to true; `startsMessageGroup` decides it from the previous message.
|
|
114
114
|
*/
|
|
115
115
|
groupStart?: boolean;
|
|
116
|
-
/** Shown next to the name at the start of a group, for example the kind of account. */
|
|
116
|
+
/** Shown next to the name (or own-message time) at the start of a group, for example the kind of account. */
|
|
117
117
|
badge?: JSX.Element;
|
|
118
118
|
/** Send state. Sets a line of fixed height below the message: a clock, a check, or "Not sent" with "Retry". */
|
|
119
119
|
status?: MessageRowStatus;
|
|
@@ -21,6 +21,11 @@ export interface ConfirmOptions extends DialogOptions {
|
|
|
21
21
|
}
|
|
22
22
|
type PromptContent = string | HTMLElement | JSX.Element;
|
|
23
23
|
export type PromptSearchItem<T = unknown> = {
|
|
24
|
+
/**
|
|
25
|
+
* Stable identity of the result, such as its record ID. With it, a newer answer that contains the same result keeps
|
|
26
|
+
* its row, so a click in progress still lands. Without it, each answer replaces the rows.
|
|
27
|
+
*/
|
|
28
|
+
id?: string;
|
|
24
29
|
label: string;
|
|
25
30
|
desc?: string;
|
|
26
31
|
icon?: string;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { type JSX } from "solid-js";
|
|
2
|
+
/**
|
|
3
|
+
* `<For>` that keeps a row's element while its item stays the same: the same object, also when its getters change, or
|
|
4
|
+
* a new object with the same identity (`by`). Hosts rebuild equal items whenever their inputs change; `<For>` would
|
|
5
|
+
* then replace each row, and a row replaced between press and release swallows the click (#2140).
|
|
6
|
+
* Each row reads its current item.
|
|
7
|
+
*/
|
|
8
|
+
export declare function KeyedFor<T>(props: {
|
|
9
|
+
each: readonly T[];
|
|
10
|
+
by: (item: T) => string;
|
|
11
|
+
fallback?: JSX.Element;
|
|
12
|
+
children: (item: () => T, index: () => number) => JSX.Element;
|
|
13
|
+
}): JSX.Element;
|
|
@@ -27,7 +27,7 @@ export declare function createTextEditor(options: TextEditorOptions): {
|
|
|
27
27
|
view: EditorView;
|
|
28
28
|
/** Also re-reads `presentation`, so a host can refresh it, e.g. after a theme change. */
|
|
29
29
|
setMode: (mode: TextEditorMode) => void;
|
|
30
|
-
setLabel: (
|
|
30
|
+
setLabel: (next: string) => void;
|
|
31
31
|
setReadOnly: (readOnly: boolean) => void;
|
|
32
32
|
destroy: () => void;
|
|
33
33
|
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@k2b/ui",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.37.0",
|
|
4
4
|
"description": "Production-ready components for SolidJS applications.",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -73,6 +73,7 @@
|
|
|
73
73
|
"@fontsource/ibm-plex-mono": "5.3.0",
|
|
74
74
|
"@fontsource/ibm-plex-sans": "5.3.0",
|
|
75
75
|
"@k2b/stdlib": "0.30.0",
|
|
76
|
+
"@lezer/highlight": "1.2.4",
|
|
76
77
|
"@lezer/markdown": "1.7.2",
|
|
77
78
|
"@tabler/icons-webfont": "3.48.0",
|
|
78
79
|
"dompurify": "3.4.17",
|
|
@@ -88,7 +89,7 @@
|
|
|
88
89
|
"devDependencies": {
|
|
89
90
|
"@babel/core": "8.0.6",
|
|
90
91
|
"@babel/preset-typescript": "8.0.1",
|
|
91
|
-
"@k2b/ssr": "0.20.
|
|
92
|
+
"@k2b/ssr": "0.20.2",
|
|
92
93
|
"@types/babel__core": "7.20.5",
|
|
93
94
|
"@types/bun": "1.4.2",
|
|
94
95
|
"axe-core": "4.11.0",
|