@k2b/ui 0.30.0 → 0.32.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (186) hide show
  1. package/README.md +1 -1
  2. package/dist/base.css +2 -0
  3. package/dist/browser/actions/Toolbar.js +2 -0
  4. package/dist/browser/actions/Toolbar.js.map +1 -1
  5. package/dist/browser/actions/ViewTabs.js +8 -0
  6. package/dist/browser/actions/ViewTabs.js.map +1 -1
  7. package/dist/browser/chat/ChatDecision.js +28 -2
  8. package/dist/browser/chat/ChatDecision.js.map +1 -1
  9. package/dist/browser/content/Chart.js +104 -55
  10. package/dist/browser/content/Chart.js.map +1 -1
  11. package/dist/browser/content/ChartExplorer.js +5 -3
  12. package/dist/browser/content/ChartExplorer.js.map +1 -1
  13. package/dist/browser/content/MapAttribution.js +27 -0
  14. package/dist/browser/content/MapAttribution.js.map +1 -0
  15. package/dist/browser/content/MapView.js +553 -0
  16. package/dist/browser/content/MapView.js.map +1 -0
  17. package/dist/browser/content/MapViewFrame.js +395 -0
  18. package/dist/browser/content/MapViewFrame.js.map +1 -0
  19. package/dist/browser/content/chart-inspection-core.js +4 -1
  20. package/dist/browser/content/chart-inspection-core.js.map +1 -1
  21. package/dist/browser/content/code-highlight.js +66 -0
  22. package/dist/browser/content/code-highlight.js.map +1 -1
  23. package/dist/browser/content/index.js +6 -0
  24. package/dist/browser/content/index.js.map +1 -1
  25. package/dist/browser/content/map-palette.js +39 -0
  26. package/dist/browser/content/map-palette.js.map +1 -0
  27. package/dist/browser/content/map-style.js +276 -0
  28. package/dist/browser/content/map-style.js.map +1 -0
  29. package/dist/browser/content/map-view-geometry.js +269 -0
  30. package/dist/browser/content/map-view-geometry.js.map +1 -0
  31. package/dist/browser/content/map-view-live.js +65 -0
  32. package/dist/browser/content/map-view-live.js.map +1 -0
  33. package/dist/browser/content/map-view-messages.js +53 -0
  34. package/dist/browser/content/map-view-messages.js.map +1 -0
  35. package/dist/browser/content/map-view-types.js +2 -0
  36. package/dist/browser/content/map-view-types.js.map +1 -0
  37. package/dist/browser/content/map-view-worker.js +10 -0
  38. package/dist/browser/feedback/dialog-core.js +19 -0
  39. package/dist/browser/feedback/dialog-core.js.map +1 -1
  40. package/dist/browser/inputs/AutocompleteEditor.js +167 -104
  41. package/dist/browser/inputs/AutocompleteEditor.js.map +1 -1
  42. package/dist/browser/inputs/RichSelect.js +1474 -0
  43. package/dist/browser/inputs/RichSelect.js.map +1 -0
  44. package/dist/browser/inputs/TextInput.js +95 -60
  45. package/dist/browser/inputs/TextInput.js.map +1 -1
  46. package/dist/browser/inputs/choice.js +19 -8
  47. package/dist/browser/inputs/choice.js.map +1 -1
  48. package/dist/browser/inputs/index.js +1 -0
  49. package/dist/browser/inputs/index.js.map +1 -1
  50. package/dist/browser/inputs/rich-select-messages.js +46 -0
  51. package/dist/browser/inputs/rich-select-messages.js.map +1 -0
  52. package/dist/browser/layout/AppWorkspace.js +194 -144
  53. package/dist/browser/layout/AppWorkspace.js.map +1 -1
  54. package/dist/browser/layout/DetailPanel.js +10 -1
  55. package/dist/browser/layout/DetailPanel.js.map +1 -1
  56. package/dist/browser/layout/Navigation.js +14 -5
  57. package/dist/browser/layout/Navigation.js.map +1 -1
  58. package/dist/browser/layout/PageTitle.js +9 -3
  59. package/dist/browser/layout/PageTitle.js.map +1 -1
  60. package/dist/browser/layout/ResizeSeparator.js +8 -2
  61. package/dist/browser/layout/ResizeSeparator.js.map +1 -1
  62. package/dist/browser/layout/app-workspace-controller.js +301 -34
  63. package/dist/browser/layout/app-workspace-controller.js.map +1 -1
  64. package/dist/browser/layout/app-workspace-width.js +26 -0
  65. package/dist/browser/layout/app-workspace-width.js.map +1 -0
  66. package/dist/browser/layout/index.js +1 -1
  67. package/dist/browser/layout/index.js.map +1 -1
  68. package/dist/browser/layout/navigation-model.js.map +1 -1
  69. package/dist/browser/layout/resize-separator.js +25 -1
  70. package/dist/browser/layout/resize-separator.js.map +1 -1
  71. package/dist/browser/surfaces/Skeleton.js +14 -0
  72. package/dist/browser/surfaces/Skeleton.js.map +1 -0
  73. package/dist/browser/surfaces/index.js +1 -0
  74. package/dist/browser/surfaces/index.js.map +1 -1
  75. package/dist/licenses/maplibre-gl.txt +116 -0
  76. package/dist/ssr/actions/Toolbar.js +2 -0
  77. package/dist/ssr/actions/Toolbar.js.map +1 -1
  78. package/dist/ssr/actions/ViewTabs.js +8 -0
  79. package/dist/ssr/actions/ViewTabs.js.map +1 -1
  80. package/dist/ssr/chat/ChatDecision.js +11 -0
  81. package/dist/ssr/chat/ChatDecision.js.map +1 -1
  82. package/dist/ssr/content/Chart.js +27 -7
  83. package/dist/ssr/content/Chart.js.map +1 -1
  84. package/dist/ssr/content/ChartExplorer.js +5 -3
  85. package/dist/ssr/content/ChartExplorer.js.map +1 -1
  86. package/dist/ssr/content/MapAttribution.js +19 -0
  87. package/dist/ssr/content/MapAttribution.js.map +1 -0
  88. package/dist/ssr/content/MapView.js +474 -0
  89. package/dist/ssr/content/MapView.js.map +1 -0
  90. package/dist/ssr/content/MapViewFrame.js +193 -0
  91. package/dist/ssr/content/MapViewFrame.js.map +1 -0
  92. package/dist/ssr/content/chart-inspection-core.js +4 -1
  93. package/dist/ssr/content/chart-inspection-core.js.map +1 -1
  94. package/dist/ssr/content/code-highlight.js +66 -0
  95. package/dist/ssr/content/code-highlight.js.map +1 -1
  96. package/dist/ssr/content/index.js +6 -0
  97. package/dist/ssr/content/index.js.map +1 -1
  98. package/dist/ssr/content/map-palette.js +39 -0
  99. package/dist/ssr/content/map-palette.js.map +1 -0
  100. package/dist/ssr/content/map-style.js +276 -0
  101. package/dist/ssr/content/map-style.js.map +1 -0
  102. package/dist/ssr/content/map-view-geometry.js +269 -0
  103. package/dist/ssr/content/map-view-geometry.js.map +1 -0
  104. package/dist/ssr/content/map-view-live.js +1 -0
  105. package/dist/ssr/content/map-view-messages.js +53 -0
  106. package/dist/ssr/content/map-view-messages.js.map +1 -0
  107. package/dist/ssr/content/map-view-types.js +2 -0
  108. package/dist/ssr/content/map-view-types.js.map +1 -0
  109. package/dist/ssr/feedback/dialog-core.js +19 -0
  110. package/dist/ssr/feedback/dialog-core.js.map +1 -1
  111. package/dist/ssr/inputs/AutocompleteEditor.js +64 -24
  112. package/dist/ssr/inputs/AutocompleteEditor.js.map +1 -1
  113. package/dist/ssr/inputs/RichSelect.js +950 -0
  114. package/dist/ssr/inputs/RichSelect.js.map +1 -0
  115. package/dist/ssr/inputs/TextInput.js +40 -16
  116. package/dist/ssr/inputs/TextInput.js.map +1 -1
  117. package/dist/ssr/inputs/choice.js +19 -8
  118. package/dist/ssr/inputs/choice.js.map +1 -1
  119. package/dist/ssr/inputs/index.js +1 -0
  120. package/dist/ssr/inputs/index.js.map +1 -1
  121. package/dist/ssr/inputs/rich-select-messages.js +46 -0
  122. package/dist/ssr/inputs/rich-select-messages.js.map +1 -0
  123. package/dist/ssr/layout/AppWorkspace.js +53 -16
  124. package/dist/ssr/layout/AppWorkspace.js.map +1 -1
  125. package/dist/ssr/layout/DetailPanel.js +1 -1
  126. package/dist/ssr/layout/DetailPanel.js.map +1 -1
  127. package/dist/ssr/layout/Navigation.js +1 -1
  128. package/dist/ssr/layout/Navigation.js.map +1 -1
  129. package/dist/ssr/layout/PageTitle.js +9 -3
  130. package/dist/ssr/layout/PageTitle.js.map +1 -1
  131. package/dist/ssr/layout/ResizeSeparator.js +4 -1
  132. package/dist/ssr/layout/ResizeSeparator.js.map +1 -1
  133. package/dist/ssr/layout/app-workspace-controller.js +301 -34
  134. package/dist/ssr/layout/app-workspace-controller.js.map +1 -1
  135. package/dist/ssr/layout/app-workspace-width.js +26 -0
  136. package/dist/ssr/layout/app-workspace-width.js.map +1 -0
  137. package/dist/ssr/layout/index.js +1 -1
  138. package/dist/ssr/layout/index.js.map +1 -1
  139. package/dist/ssr/layout/navigation-model.js.map +1 -1
  140. package/dist/ssr/layout/resize-separator.js +25 -1
  141. package/dist/ssr/layout/resize-separator.js.map +1 -1
  142. package/dist/ssr/surfaces/Skeleton.js +8 -0
  143. package/dist/ssr/surfaces/Skeleton.js.map +1 -0
  144. package/dist/ssr/surfaces/index.js +1 -0
  145. package/dist/ssr/surfaces/index.js.map +1 -1
  146. package/dist/styles.css +1 -1
  147. package/dist/types/content/Chart.d.ts +4 -2
  148. package/dist/types/content/ChartExplorer.d.ts +0 -1
  149. package/dist/types/content/MapAttribution.d.ts +6 -0
  150. package/dist/types/content/MapView.d.ts +5 -0
  151. package/dist/types/content/MapViewFrame.d.ts +31 -0
  152. package/dist/types/content/code-highlight.d.ts +3 -1
  153. package/dist/types/content/index.d.ts +7 -0
  154. package/dist/types/content/map-palette.d.ts +58 -0
  155. package/dist/types/content/map-style.d.ts +29 -0
  156. package/dist/types/content/map-view-geometry.d.ts +55 -0
  157. package/dist/types/content/map-view-live.d.ts +2 -0
  158. package/dist/types/content/map-view-messages.d.ts +21 -0
  159. package/dist/types/content/map-view-types.d.ts +63 -0
  160. package/dist/types/feedback/dialog-core.d.ts +1 -0
  161. package/dist/types/inputs/AutocompleteEditor.d.ts +6 -1
  162. package/dist/types/inputs/RichSelect.d.ts +93 -0
  163. package/dist/types/inputs/TextInput.d.ts +5 -2
  164. package/dist/types/inputs/choice.d.ts +24 -4
  165. package/dist/types/inputs/index.d.ts +2 -0
  166. package/dist/types/inputs/rich-select-messages.d.ts +21 -0
  167. package/dist/types/layout/AppWorkspace.d.ts +14 -3
  168. package/dist/types/layout/DetailPanel.d.ts +2 -0
  169. package/dist/types/layout/app-workspace-controller.d.ts +2 -0
  170. package/dist/types/layout/app-workspace-width.d.ts +13 -0
  171. package/dist/types/layout/index.d.ts +2 -2
  172. package/dist/types/layout/navigation-model.d.ts +2 -0
  173. package/dist/types/layout/resize-separator.d.ts +1 -0
  174. package/dist/types/surfaces/Skeleton.d.ts +6 -0
  175. package/dist/types/surfaces/index.d.ts +1 -0
  176. package/map-glyphs/IBM Plex Sans Medium/0-255.pbf +0 -0
  177. package/map-glyphs/IBM Plex Sans Medium/1024-1279.pbf +0 -0
  178. package/map-glyphs/IBM Plex Sans Medium/256-511.pbf +0 -0
  179. package/map-glyphs/IBM Plex Sans Medium/512-767.pbf +0 -0
  180. package/map-glyphs/IBM Plex Sans Medium/768-1023.pbf +0 -0
  181. package/map-glyphs/IBM Plex Sans Medium/7680-7935.pbf +0 -0
  182. package/map-glyphs/IBM Plex Sans Medium/8192-8447.pbf +0 -0
  183. package/map-glyphs/IBM Plex Sans Medium/8448-8703.pbf +0 -0
  184. package/map-glyphs/IBM Plex Sans Medium/8704-8959.pbf +0 -0
  185. package/map-glyphs/OFL.txt +93 -0
  186. package/package.json +11 -6
@@ -0,0 +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":[]}
@@ -6,11 +6,13 @@ import { ssrAttribute as _$ssrAttribute } from "solid-js/web";
6
6
  import { escape as _$escape } from "solid-js/web";
7
7
  import { createComponent as _$createComponent } from "solid-js/web";
8
8
  import { memo as _$memo } from "solid-js/web";
9
- var _tmpl$ = ["<span class=\"k2b-input-shell__affix\">", "</span>"],
10
- _tmpl$2 = ["<button type=\"button\" class=\"k2b-input-shell__clear k2b-input-clear-action\"", "><i class=\"ti ti-x\" aria-hidden=\"true\"></i></button>"],
11
- _tmpl$3 = ["<button type=\"button\" class=\"k2b-input-shell__clear\"", "", "><i", " aria-hidden=\"true\"></i></button>"],
12
- _tmpl$4 = ["<div class=\"k2b-input-shell k2b-text-input\"", " style=\"", "\"><span class=\"k2b-input-shell__icon k2b-text-input__icon\" aria-hidden=\"true\"><i", "></i><i", "></i></span>", "", "", "", "", "</div>"];
9
+ var _tmpl$ = ["<span class=\"k2b-input-shell__icon k2b-text-input__icon\" aria-hidden=\"true\"><i", "></i><i", "></i></span>"],
10
+ _tmpl$2 = ["<span class=\"k2b-input-shell__affix\">", "</span>"],
11
+ _tmpl$3 = ["<button type=\"button\" class=\"k2b-input-shell__clear k2b-input-clear-action\"", "><i class=\"ti ti-x\" aria-hidden=\"true\"></i></button>"],
12
+ _tmpl$4 = ["<button type=\"button\" class=\"k2b-input-shell__clear\"", "", "><i", " aria-hidden=\"true\"></i></button>"],
13
+ _tmpl$5 = ["<div class=\"k2b-input-shell k2b-text-input\"", " style=\"", "\">", "", "", "", "", "", "</div>"];
13
14
  import { createSignal, Show, splitProps } from "solid-js";
15
+ import { isServer } from "solid-js/web";
14
16
  import { createFieldMeta, Field, fieldControlAria } from "../internal/field";
15
17
  import { useUiMessages } from "../intl/messages";
16
18
  import { commitFieldValue, resolveMaybeAccessor } from "./field-contract";
@@ -19,15 +21,27 @@ import { MarkdownEditor } from "./markdown/MarkdownEditor";
19
21
  export function TextInput(props) {
20
22
  const messages = useUiMessages();
21
23
  const inputMessages = useInputMessages();
22
- const [local, rest] = splitProps(props, ["activeIcon", "aria-describedby", "aria-label", "class", "clearLabel", "clearable", "completions", "description", "error", "icon", "id", "label", "lines", "markdown", "minLength", "maxLength", "monospace", "multiline", "onClear", "onValueCommit", "onSubmit", "onValueChange", "password", "prefix", "required", "suffix", "type", "value", "variant", "abbreviations"]);
24
+ const [local, rest] = splitProps(props, ["activeIcon", "aria-describedby", "aria-label", "class", "clearLabel", "clearable", "completions", "description", "error", "externalErrorId", "icon", "id", "label", "lines", "markdown", "minLength", "maxLength", "monospace", "multiline", "onClear", "onValueCommit", "onSubmit", "onValueChange", "password", "prefix", "required", "suffix", "type", "value", "variant", "abbreviations"]);
23
25
  const meta = createFieldMeta(local.id);
24
26
  const value = () => resolveMaybeAccessor(local.value) ?? "";
25
27
  const error = () => resolveMaybeAccessor(local.error);
28
+ // HTML IDs are single nonempty tokens; numeric starts and punctuation are valid.
29
+ const externalErrorId = () => {
30
+ const id = local.externalErrorId;
31
+ return id && !/[\t\n\f\r ]/.test(id) ? id : undefined;
32
+ };
33
+ const controlMeta = {
34
+ ...meta,
35
+ get errorId() {
36
+ return externalErrorId() ?? meta.errorId;
37
+ }
38
+ };
26
39
  const [passwordVisible, setPasswordVisible] = createSignal(false);
27
40
  const multiline = () => Boolean(local.multiline || local.markdown);
28
- const icon = () => local.icon ?? (local.variant === "ai" ? "ti ti-sparkles" : local.markdown ? "ti ti-markdown" : "ti ti-cursor-text");
41
+ const compact = () => local.variant === "compact";
42
+ const icon = () => local.icon === false ? "" : local.icon ?? (local.variant === "ai" ? "ti ti-sparkles" : local.markdown ? "ti ti-markdown" : "ti ti-cursor-text");
29
43
  // A custom icon stays while typing (a search field keeps its magnifier); only the default icon switches to the pencil.
30
- const activeIcon = () => local.activeIcon ?? local.icon ?? (local.variant === "ai" ? "ti ti-sparkles" : "ti ti-pencil");
44
+ const activeIcon = () => local.activeIcon ?? (local.icon || undefined) ?? (local.variant === "ai" ? "ti ti-sparkles" : "ti ti-pencil");
31
45
  // Names, addresses and passwords are typed exactly: phone keyboards must not capitalize or "correct" them.
32
46
  const verbatim = () => local.password || local.type === "email" || local.type === "url" || /\b(username|email|url)\b/.test(String(rest.autocomplete ?? ""));
33
47
  const input = next => local.onValueChange?.(next);
@@ -55,7 +69,7 @@ export function TextInput(props) {
55
69
  return local.description;
56
70
  },
57
71
  get error() {
58
- return error();
72
+ return _$memo(() => !!externalErrorId())() ? undefined : error();
59
73
  },
60
74
  meta: meta,
61
75
  get required() {
@@ -65,14 +79,21 @@ export function TextInput(props) {
65
79
  return rest.disabled;
66
80
  },
67
81
  get children() {
68
- return _$ssr(_tmpl$4, _$ssrAttribute("data-invalid", error() ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-ai", local.variant === "ai" ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-multiline", multiline() ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-monospace", local.monospace ? "true" : _$escape(undefined, true), false), _$ssrStyle(multiline() ? {
82
+ return _$ssr(_tmpl$5, _$ssrAttribute("data-variant", compact() ? "compact" : _$escape(undefined, true), false) + _$ssrAttribute("data-invalid", error() ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-ai", local.variant === "ai" ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-multiline", multiline() ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-monospace", local.monospace ? "true" : _$escape(undefined, true), false), _$ssrStyle(multiline() ? {
69
83
  "--k2b-editor-lines": String(local.lines ?? 3)
70
- } : undefined), _$ssrAttribute("class", _$escape(icon(), true), false), _$ssrAttribute("class", _$escape(activeIcon(), true), false), _$escape(_$createComponent(Show, {
84
+ } : undefined), _$escape(_$createComponent(Show, {
85
+ get when() {
86
+ return _$memo(() => !!!compact())() && local.icon !== false;
87
+ },
88
+ get children() {
89
+ return _$ssr(_tmpl$, _$ssrAttribute("class", _$escape(icon(), true), false), _$ssrAttribute("class", _$escape(activeIcon(), true), false));
90
+ }
91
+ })), _$escape(_$createComponent(Show, {
71
92
  get when() {
72
93
  return local.prefix;
73
94
  },
74
95
  get children() {
75
- return _$ssr(_tmpl$, _$escape(local.prefix));
96
+ return _$ssr(_tmpl$2, _$escape(local.prefix));
76
97
  }
77
98
  })), _$escape(_$createComponent(Show, {
78
99
  get when() {
@@ -94,6 +115,9 @@ export function TextInput(props) {
94
115
  return meta.controlId;
95
116
  },
96
117
  "class": "k2b-input",
118
+ get size() {
119
+ return rest.size ?? (compact() ? 9 : undefined);
120
+ },
97
121
  get type() {
98
122
  return local.password && !passwordVisible() ? "password" : local.type ?? "text";
99
123
  },
@@ -109,7 +133,7 @@ export function TextInput(props) {
109
133
  get required() {
110
134
  return local.required;
111
135
  }
112
- }, () => fieldControlAria(meta, local)), undefined, false);
136
+ }, () => fieldControlAria(controlMeta, local)), undefined, false);
113
137
  },
114
138
  get children() {
115
139
  return _$ssrElement("textarea", _$mergeProps(rest, {
@@ -132,28 +156,28 @@ export function TextInput(props) {
132
156
  get maxlength() {
133
157
  return local.maxLength;
134
158
  }
135
- }, () => fieldControlAria(meta, local)), undefined, false);
159
+ }, () => fieldControlAria(controlMeta, local)), isServer ? `\n${_$escape(value())}` : _$escape(undefined), false);
136
160
  }
137
161
  })), _$escape(_$createComponent(Show, {
138
162
  get when() {
139
163
  return local.suffix;
140
164
  },
141
165
  get children() {
142
- return _$ssr(_tmpl$, _$escape(local.suffix));
166
+ return _$ssr(_tmpl$2, _$escape(local.suffix));
143
167
  }
144
168
  })), _$escape(_$createComponent(Show, {
145
169
  get when() {
146
170
  return _$memo(() => !!(local.clearable && value() && !multiline() && !local.password && !rest.disabled))() && !rest.readOnly;
147
171
  },
148
172
  get children() {
149
- return _$ssr(_tmpl$2, _$ssrAttribute("aria-label", _$escape(local.clearLabel ?? messages().clear, true), false));
173
+ return _$ssr(_tmpl$3, _$ssrAttribute("aria-label", _$escape(local.clearLabel ?? messages().clear, true), false));
150
174
  }
151
175
  })), _$escape(_$createComponent(Show, {
152
176
  get when() {
153
177
  return _$memo(() => !!local.password)() && !multiline();
154
178
  },
155
179
  get children() {
156
- return _$ssr(_tmpl$3, _$ssrAttribute("aria-label", passwordVisible() ? _$escape(inputMessages().hidePassword, true) : _$escape(inputMessages().showPassword, true), false) + _$ssrAttribute("aria-pressed", _$escape(passwordVisible(), true), false), _$ssrAttribute("disabled", rest.disabled, true), _$ssrAttribute("class", passwordVisible() ? "ti ti-eye-off" : "ti ti-eye", false));
180
+ return _$ssr(_tmpl$4, _$ssrAttribute("aria-label", passwordVisible() ? _$escape(inputMessages().hidePassword, true) : _$escape(inputMessages().showPassword, true), false) + _$ssrAttribute("aria-pressed", _$escape(passwordVisible(), true), false), _$ssrAttribute("disabled", rest.disabled, true), _$ssrAttribute("class", passwordVisible() ? "ti ti-eye-off" : "ti ti-eye", false));
157
181
  }
158
182
  })));
159
183
  }
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["inputs/TextInput.tsx"],"sourcesContent":["import { createSignal, type JSX, Show, splitProps } from \"solid-js\";\nimport { createFieldMeta, Field, fieldControlAria } from \"../internal/field\";\nimport { useUiMessages } from \"../intl/messages\";\nimport type { Completion } from \"./completion\";\nimport type { ValueFieldProps } from \"./field-contract\";\nimport { commitFieldValue, resolveMaybeAccessor } from \"./field-contract\";\nimport { useInputMessages } from \"./input-messages\";\nimport { MarkdownEditor } from \"./markdown/MarkdownEditor\";\n\nexport type TextInputProps = Omit<\n JSX.InputHTMLAttributes<HTMLInputElement>,\n \"onChange\" | \"onInput\" | \"prefix\" | \"suffix\" | \"type\" | \"value\" | keyof ValueFieldProps<string>\n> &\n ValueFieldProps<string> & {\n minLength?: number;\n maxLength?: number;\n type?: \"text\" | \"search\" | \"email\" | \"url\" | \"tel\";\n variant?: \"default\" | \"ai\";\n icon?: string;\n activeIcon?: string;\n prefix?: JSX.Element;\n suffix?: JSX.Element;\n clearable?: boolean;\n onClear?: () => void;\n clearLabel?: string;\n multiline?: boolean;\n monospace?: boolean;\n password?: boolean;\n markdown?: boolean;\n onSubmit?: () => void;\n lines?: number;\n abbreviations?: Record<string, string>;\n completions?: readonly Completion[];\n };\n\nexport function TextInput(props: TextInputProps): JSX.Element {\n const messages = useUiMessages();\n const inputMessages = useInputMessages();\n const [local, rest] = splitProps(props, [\n \"activeIcon\",\n \"aria-describedby\",\n \"aria-label\",\n \"class\",\n \"clearLabel\",\n \"clearable\",\n \"completions\",\n \"description\",\n \"error\",\n \"icon\",\n \"id\",\n \"label\",\n \"lines\",\n \"markdown\",\n \"minLength\",\n \"maxLength\",\n \"monospace\",\n \"multiline\",\n \"onClear\",\n \"onValueCommit\",\n \"onSubmit\",\n \"onValueChange\",\n \"password\",\n \"prefix\",\n \"required\",\n \"suffix\",\n \"type\",\n \"value\",\n \"variant\",\n \"abbreviations\",\n ]);\n const meta = createFieldMeta(local.id);\n const value = () => resolveMaybeAccessor(local.value) ?? \"\";\n const error = () => resolveMaybeAccessor(local.error);\n const [passwordVisible, setPasswordVisible] = createSignal(false);\n const multiline = () => Boolean(local.multiline || local.markdown);\n const icon = () => local.icon ?? (local.variant === \"ai\" ? \"ti ti-sparkles\" : local.markdown ? \"ti ti-markdown\" : \"ti ti-cursor-text\");\n // A custom icon stays while typing (a search field keeps its magnifier); only the default icon switches to the pencil.\n const activeIcon = () => local.activeIcon ?? local.icon ?? (local.variant === \"ai\" ? \"ti ti-sparkles\" : \"ti ti-pencil\");\n // Names, addresses and passwords are typed exactly: phone keyboards must not capitalize or \"correct\" them.\n const verbatim = () =>\n local.password || local.type === \"email\" || local.type === \"url\" || /\\b(username|email|url)\\b/.test(String(rest.autocomplete ?? \"\"));\n const input = (next: string) => local.onValueChange?.(next);\n const commit = (next: string) => local.onValueCommit?.(next);\n const clear = () => {\n if (local.onClear) {\n local.onClear();\n return;\n }\n commitFieldValue(local, \"\");\n };\n\n return (\n <Show\n when={local.markdown}\n fallback={\n <Field\n class={local.class}\n label={local.label}\n description={local.description}\n error={error()}\n meta={meta}\n required={local.required}\n disabled={rest.disabled}\n >\n <div\n class=\"k2b-input-shell k2b-text-input\"\n data-invalid={error() ? \"true\" : undefined}\n data-ai={local.variant === \"ai\" ? \"true\" : undefined}\n data-multiline={multiline() ? \"true\" : undefined}\n data-monospace={local.monospace ? \"true\" : undefined}\n style={multiline() ? { \"--k2b-editor-lines\": String(local.lines ?? 3) } : undefined}\n >\n <span class=\"k2b-input-shell__icon k2b-text-input__icon\" aria-hidden=\"true\">\n <i class={icon()} />\n <i class={activeIcon()} />\n </span>\n <Show when={local.prefix}>\n <span class=\"k2b-input-shell__affix\">{local.prefix}</span>\n </Show>\n <Show\n when={multiline()}\n fallback={\n <input\n autocapitalize={verbatim() ? \"none\" : undefined}\n autocorrect={verbatim() ? \"off\" : undefined}\n spellcheck={verbatim() ? false : undefined}\n {...rest}\n id={meta.controlId}\n class=\"k2b-input\"\n type={local.password && !passwordVisible() ? \"password\" : (local.type ?? \"text\")}\n value={value()}\n minlength={local.minLength}\n maxlength={local.maxLength}\n required={local.required}\n {...fieldControlAria(meta, local)}\n onInput={(event) => {\n input(event.currentTarget.value);\n }}\n onChange={(event) => commit(event.currentTarget.value)}\n onKeyDown={(event) => {\n if (local.onSubmit && event.key === \"Enter\" && !event.shiftKey && !event.metaKey) {\n event.preventDefault();\n local.onSubmit();\n }\n }}\n />\n }\n >\n <textarea\n {...(rest as unknown as JSX.TextareaHTMLAttributes<HTMLTextAreaElement>)}\n id={meta.controlId}\n class=\"k2b-input k2b-text-input__textarea\"\n value={value()}\n rows={local.lines ?? 3}\n required={local.required}\n minlength={local.minLength}\n maxlength={local.maxLength}\n {...fieldControlAria(meta, local)}\n onInput={(event) => {\n input(event.currentTarget.value);\n }}\n onChange={(event) => commit(event.currentTarget.value)}\n onKeyDown={(event) => {\n if (local.onSubmit && event.key === \"Enter\" && !event.shiftKey && !event.metaKey) {\n event.preventDefault();\n local.onSubmit();\n }\n }}\n />\n </Show>\n <Show when={local.suffix}>\n <span class=\"k2b-input-shell__affix\">{local.suffix}</span>\n </Show>\n <Show when={local.clearable && value() && !multiline() && !local.password && !rest.disabled && !rest.readOnly}>\n <button\n type=\"button\"\n class=\"k2b-input-shell__clear k2b-input-clear-action\"\n aria-label={local.clearLabel ?? messages().clear}\n onClick={clear}\n >\n <i class=\"ti ti-x\" aria-hidden=\"true\" />\n </button>\n </Show>\n <Show when={local.password && !multiline()}>\n <button\n type=\"button\"\n class=\"k2b-input-shell__clear\"\n aria-label={passwordVisible() ? inputMessages().hidePassword : inputMessages().showPassword}\n aria-pressed={passwordVisible()}\n disabled={rest.disabled}\n onClick={() => setPasswordVisible((visible) => !visible)}\n >\n <i class={passwordVisible() ? \"ti ti-eye-off\" : \"ti ti-eye\"} aria-hidden=\"true\" />\n </button>\n </Show>\n </div>\n </Field>\n }\n >\n <MarkdownEditor\n class={local.class}\n label={local.label}\n description={local.description}\n error={error()}\n id={meta.controlId}\n name={rest.name}\n value={value()}\n onValueChange={input}\n onValueCommit={local.onValueCommit}\n onSubmit={local.onSubmit}\n placeholder={rest.placeholder}\n disabled={rest.disabled}\n required={local.required}\n lines={local.lines}\n maxLength={local.maxLength}\n spellcheck={rest.spellcheck === undefined ? undefined : rest.spellcheck === true || rest.spellcheck === \"true\"}\n abbreviations={local.abbreviations}\n completions={local.completions}\n aria-label={local[\"aria-label\"]}\n aria-describedby={local[\"aria-describedby\"]}\n />\n </Show>\n );\n}\n\nexport default TextInput;\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":[],"sources":["inputs/TextInput.tsx"],"sourcesContent":["import { createSignal, type JSX, Show, splitProps } from \"solid-js\";\nimport { isServer } from \"solid-js/web\";\nimport { createFieldMeta, Field, fieldControlAria } from \"../internal/field\";\nimport { useUiMessages } from \"../intl/messages\";\nimport type { Completion } from \"./completion\";\nimport type { ValueFieldProps } from \"./field-contract\";\nimport { commitFieldValue, resolveMaybeAccessor } from \"./field-contract\";\nimport { useInputMessages } from \"./input-messages\";\nimport { MarkdownEditor } from \"./markdown/MarkdownEditor\";\n\nexport type TextInputProps = Omit<\n JSX.InputHTMLAttributes<HTMLInputElement>,\n \"onChange\" | \"onInput\" | \"prefix\" | \"suffix\" | \"type\" | \"value\" | keyof ValueFieldProps<string>\n> &\n ValueFieldProps<string> & {\n minLength?: number;\n maxLength?: number;\n type?: \"text\" | \"search\" | \"email\" | \"url\" | \"tel\";\n variant?: \"default\" | \"ai\" | \"compact\";\n /** Set false for a plain field without a leading icon. */\n icon?: string | false;\n activeIcon?: string;\n /** ID of a consumer-owned visible error; caller owns its announcement. Native controls only. */\n externalErrorId?: string;\n prefix?: JSX.Element;\n suffix?: JSX.Element;\n clearable?: boolean;\n onClear?: () => void;\n clearLabel?: string;\n multiline?: boolean;\n monospace?: boolean;\n password?: boolean;\n markdown?: boolean;\n onSubmit?: () => void;\n lines?: number;\n abbreviations?: Record<string, string>;\n completions?: readonly Completion[];\n };\n\nexport function TextInput(props: TextInputProps): JSX.Element {\n const messages = useUiMessages();\n const inputMessages = useInputMessages();\n const [local, rest] = splitProps(props, [\n \"activeIcon\",\n \"aria-describedby\",\n \"aria-label\",\n \"class\",\n \"clearLabel\",\n \"clearable\",\n \"completions\",\n \"description\",\n \"error\",\n \"externalErrorId\",\n \"icon\",\n \"id\",\n \"label\",\n \"lines\",\n \"markdown\",\n \"minLength\",\n \"maxLength\",\n \"monospace\",\n \"multiline\",\n \"onClear\",\n \"onValueCommit\",\n \"onSubmit\",\n \"onValueChange\",\n \"password\",\n \"prefix\",\n \"required\",\n \"suffix\",\n \"type\",\n \"value\",\n \"variant\",\n \"abbreviations\",\n ]);\n const meta = createFieldMeta(local.id);\n const value = () => resolveMaybeAccessor(local.value) ?? \"\";\n const error = () => resolveMaybeAccessor(local.error);\n // HTML IDs are single nonempty tokens; numeric starts and punctuation are valid.\n const externalErrorId = () => {\n const id = local.externalErrorId;\n return id && !/[\\t\\n\\f\\r ]/.test(id) ? id : undefined;\n };\n const controlMeta = {\n ...meta,\n get errorId() {\n return externalErrorId() ?? meta.errorId;\n },\n };\n const [passwordVisible, setPasswordVisible] = createSignal(false);\n const multiline = () => Boolean(local.multiline || local.markdown);\n const compact = () => local.variant === \"compact\";\n const icon = () =>\n local.icon === false\n ? \"\"\n : (local.icon ?? (local.variant === \"ai\" ? \"ti ti-sparkles\" : local.markdown ? \"ti ti-markdown\" : \"ti ti-cursor-text\"));\n // A custom icon stays while typing (a search field keeps its magnifier); only the default icon switches to the pencil.\n const activeIcon = () => local.activeIcon ?? (local.icon || undefined) ?? (local.variant === \"ai\" ? \"ti ti-sparkles\" : \"ti ti-pencil\");\n // Names, addresses and passwords are typed exactly: phone keyboards must not capitalize or \"correct\" them.\n const verbatim = () =>\n local.password || local.type === \"email\" || local.type === \"url\" || /\\b(username|email|url)\\b/.test(String(rest.autocomplete ?? \"\"));\n const input = (next: string) => local.onValueChange?.(next);\n const commit = (next: string) => local.onValueCommit?.(next);\n const clear = () => {\n if (local.onClear) {\n local.onClear();\n return;\n }\n commitFieldValue(local, \"\");\n };\n\n return (\n <Show\n when={local.markdown}\n fallback={\n <Field\n class={local.class}\n label={local.label}\n description={local.description}\n error={externalErrorId() ? undefined : error()}\n meta={meta}\n required={local.required}\n disabled={rest.disabled}\n >\n <div\n class=\"k2b-input-shell k2b-text-input\"\n data-variant={compact() ? \"compact\" : undefined}\n data-invalid={error() ? \"true\" : undefined}\n data-ai={local.variant === \"ai\" ? \"true\" : undefined}\n data-multiline={multiline() ? \"true\" : undefined}\n data-monospace={local.monospace ? \"true\" : undefined}\n style={multiline() ? { \"--k2b-editor-lines\": String(local.lines ?? 3) } : undefined}\n >\n <Show when={!compact() && local.icon !== false}>\n <span class=\"k2b-input-shell__icon k2b-text-input__icon\" aria-hidden=\"true\">\n <i class={icon()} />\n <i class={activeIcon()} />\n </span>\n </Show>\n <Show when={local.prefix}>\n <span class=\"k2b-input-shell__affix\">{local.prefix}</span>\n </Show>\n <Show\n when={multiline()}\n fallback={\n <input\n autocapitalize={verbatim() ? \"none\" : undefined}\n autocorrect={verbatim() ? \"off\" : undefined}\n spellcheck={verbatim() ? false : undefined}\n {...rest}\n id={meta.controlId}\n class=\"k2b-input\"\n size={rest.size ?? (compact() ? 9 : undefined)}\n type={local.password && !passwordVisible() ? \"password\" : (local.type ?? \"text\")}\n value={value()}\n minlength={local.minLength}\n maxlength={local.maxLength}\n required={local.required}\n {...fieldControlAria(controlMeta, local)}\n onInput={(event) => {\n input(event.currentTarget.value);\n }}\n onChange={(event) => commit(event.currentTarget.value)}\n onKeyDown={(event) => {\n if (local.onSubmit && event.key === \"Enter\" && !event.shiftKey && !event.metaKey) {\n event.preventDefault();\n local.onSubmit();\n }\n }}\n />\n }\n >\n <textarea\n {...(rest as unknown as JSX.TextareaHTMLAttributes<HTMLTextAreaElement>)}\n id={meta.controlId}\n class=\"k2b-input k2b-text-input__textarea\"\n value={value()}\n rows={local.lines ?? 3}\n required={local.required}\n minlength={local.minLength}\n maxlength={local.maxLength}\n {...fieldControlAria(controlMeta, local)}\n onInput={(event) => {\n input(event.currentTarget.value);\n }}\n onChange={(event) => commit(event.currentTarget.value)}\n onKeyDown={(event) => {\n if (local.onSubmit && event.key === \"Enter\" && !event.shiftKey && !event.metaKey) {\n event.preventDefault();\n local.onSubmit();\n }\n }}\n >\n {/* HTML consumes one leading newline in textarea content. */}\n {isServer ? `\\n${value()}` : undefined}\n </textarea>\n </Show>\n <Show when={local.suffix}>\n <span class=\"k2b-input-shell__affix\">{local.suffix}</span>\n </Show>\n <Show when={local.clearable && value() && !multiline() && !local.password && !rest.disabled && !rest.readOnly}>\n <button\n type=\"button\"\n class=\"k2b-input-shell__clear k2b-input-clear-action\"\n aria-label={local.clearLabel ?? messages().clear}\n onClick={clear}\n >\n <i class=\"ti ti-x\" aria-hidden=\"true\" />\n </button>\n </Show>\n <Show when={local.password && !multiline()}>\n <button\n type=\"button\"\n class=\"k2b-input-shell__clear\"\n aria-label={passwordVisible() ? inputMessages().hidePassword : inputMessages().showPassword}\n aria-pressed={passwordVisible()}\n disabled={rest.disabled}\n onClick={() => setPasswordVisible((visible) => !visible)}\n >\n <i class={passwordVisible() ? \"ti ti-eye-off\" : \"ti ti-eye\"} aria-hidden=\"true\" />\n </button>\n </Show>\n </div>\n </Field>\n }\n >\n <MarkdownEditor\n class={local.class}\n label={local.label}\n description={local.description}\n error={error()}\n id={meta.controlId}\n name={rest.name}\n value={value()}\n onValueChange={input}\n onValueCommit={local.onValueCommit}\n onSubmit={local.onSubmit}\n placeholder={rest.placeholder}\n disabled={rest.disabled}\n required={local.required}\n lines={local.lines}\n maxLength={local.maxLength}\n spellcheck={rest.spellcheck === undefined ? undefined : rest.spellcheck === true || rest.spellcheck === \"true\"}\n abbreviations={local.abbreviations}\n completions={local.completions}\n aria-label={local[\"aria-label\"]}\n aria-describedby={local[\"aria-describedby\"]}\n />\n </Show>\n );\n}\n\nexport default TextInput;\n"],"mappings":"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","ignoreList":[]}
@@ -1,10 +1,17 @@
1
1
  import { createEffect, createSignal, onCleanup } from "solid-js";
2
2
  import { returnFocus, ringOnReturn } from "../internal/focus-return";
3
+ /** Matches label, description, value, and optional extra keywords. */
3
4
  export const filterChoiceOptions = (options, query) => {
4
5
  const normalized = query.trim().toLocaleLowerCase();
5
6
  if (!normalized) return options;
6
- return options.filter(option => [option.label, option.description, option.value].some(part => part?.toLocaleLowerCase().includes(normalized)));
7
+ return options.filter(option => [option.label, option.description, option.value, ...(option.keywords ?? [])].some(part => part?.toLocaleLowerCase().includes(normalized)));
7
8
  };
9
+
10
+ /**
11
+ * Moves through the options and wraps at the ends, skipping `disabled` ones. A
12
+ * RichSelect row that cannot be chosen carries a `disabledReason` instead, so
13
+ * the arrow keys still reach it and its reason can be read.
14
+ */
8
15
  export const nextEnabledChoiceIndex = (options, current, direction) => {
9
16
  if (options.length === 0 || options.every(option => option.disabled)) return -1;
10
17
  let index = current;
@@ -108,25 +115,26 @@ const popoverIsOpen = popover => {
108
115
  return false;
109
116
  }
110
117
  };
111
- export const placeChoicePopover = (trigger, popover) => {
118
+ export const placeChoicePopover = (trigger, popover, placement = {}) => {
112
119
  const margin = 8;
113
120
  const gap = 4;
114
121
  const triggerRect = trigger.getBoundingClientRect();
115
122
  // Cloud sizes its dropdowns to the trigger exactly (`dialog.style.width =
116
123
  // rect.width`). Keep that so a narrow toolbar select does not open a wide
117
124
  // panel that no longer lines up with the control it belongs to.
118
- const width = Math.min(triggerRect.width, window.innerWidth - margin * 2);
119
- popover.style.width = `${width}px`;
125
+ const triggerWidth = Math.min(triggerRect.width, window.innerWidth - margin * 2);
126
+ if (placement.width !== "own") popover.style.width = `${triggerWidth}px`;
120
127
  const popoverRect = popover.getBoundingClientRect();
128
+ const width = placement.width === "own" ? popoverRect.width : triggerWidth;
121
129
  const left = Math.max(margin, Math.min(triggerRect.left, window.innerWidth - width - margin));
122
130
  const roomBelow = window.innerHeight - triggerRect.bottom - gap - margin;
123
131
  const roomAbove = triggerRect.top - gap - margin;
124
- const opensAbove = popoverRect.height > roomBelow && roomAbove > roomBelow;
132
+ const opensAbove = placement.side === "above" ? popoverRect.height <= roomAbove || roomAbove > roomBelow : popoverRect.height > roomBelow && roomAbove > roomBelow;
125
133
  const top = opensAbove ? Math.max(margin, triggerRect.top - popoverRect.height - gap) : Math.min(triggerRect.bottom + gap, window.innerHeight - popoverRect.height - margin);
126
134
  popover.style.left = `${left}px`;
127
135
  popover.style.top = `${Math.max(margin, top)}px`;
128
136
  };
129
- export function createChoicePopover(disabled) {
137
+ export function createChoicePopover(disabled, placement = () => ({})) {
130
138
  const [open, setOpen] = createSignal(false);
131
139
  const [trigger, setTrigger] = createSignal();
132
140
  const [popover, setPopover] = createSignal();
@@ -134,7 +142,7 @@ export function createChoicePopover(disabled) {
134
142
  const place = () => {
135
143
  const triggerElement = trigger();
136
144
  const popoverElement = popover();
137
- if (triggerElement && popoverElement && open()) placeChoicePopover(triggerElement, popoverElement);
145
+ if (triggerElement && popoverElement && open()) placeChoicePopover(triggerElement, popoverElement, placement());
138
146
  };
139
147
  const show = () => {
140
148
  const popoverElement = popover();
@@ -166,7 +174,10 @@ export function createChoicePopover(disabled) {
166
174
  groups.scrollLeft += horizontalDelta * unit;
167
175
  return;
168
176
  }
169
- const options = popoverElement.querySelector(".k2b-choice-options");
177
+
178
+ // A popover with more than one scrolling region, such as a list beside a
179
+ // preview, marks them; the wheel scrolls the one under the pointer.
180
+ const options = target?.closest("[data-choice-scroll]") ?? popoverElement.querySelector(".k2b-choice-options");
170
181
  if (!options || options.scrollHeight <= options.clientHeight) return;
171
182
  const unit = event.deltaMode === 1 ? 16 : event.deltaMode === 2 ? options.clientHeight : 1;
172
183
  options.scrollTop += event.deltaY * unit;
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["inputs/choice.ts"],"sourcesContent":["import { createEffect, createSignal, onCleanup, type Setter } from \"solid-js\";\nimport { returnFocus, ringOnReturn } from \"../internal/focus-return\";\n\nexport type ChoiceOption<T extends string = string> = {\n value: T;\n label: string;\n description?: string;\n icon?: string;\n color?: string;\n disabled?: boolean;\n /** Optional overlapping groups used by choice controls that expose group filtering. */\n groups?: readonly string[];\n};\n\nexport type ChoiceOptionsLoader<T extends string = string> = (query: string, signal: AbortSignal) => Promise<readonly ChoiceOption<T>[]>;\n\nexport const filterChoiceOptions = <T extends string>(options: readonly ChoiceOption<T>[], query: string): readonly ChoiceOption<T>[] => {\n const normalized = query.trim().toLocaleLowerCase();\n if (!normalized) return options;\n return options.filter((option) =>\n [option.label, option.description, option.value].some((part) => part?.toLocaleLowerCase().includes(normalized)),\n );\n};\n\nexport const nextEnabledChoiceIndex = <T extends string>(\n options: readonly ChoiceOption<T>[],\n current: number,\n direction: 1 | -1,\n): number => {\n if (options.length === 0 || options.every((option) => option.disabled)) return -1;\n\n let index = current;\n for (let visited = 0; visited < options.length; visited += 1) {\n index = (index + direction + options.length) % options.length;\n if (!options[index]?.disabled) return index;\n }\n return -1;\n};\n\n/**\n * Counts the leading pills that fit into `available` pixels and measures the\n * whole row. When not all of them fit, the rest collapse into a summary pill\n * of width `more`; the first pill always stays and truncates when even it does\n * not fit. Without a measured width (no layout yet) every pill stays. Half a\n * pixel of slack absorbs layout rounding, so a row given exactly its own\n * `rowWidth` always fits.\n */\nexport const fitChoicePills = (\n available: number,\n widths: readonly number[],\n gap: number,\n more: number,\n): { visible: number; rowWidth: number } => {\n const rowWidth = widths.reduce((sum, width) => sum + width, 0) + gap * Math.max(0, widths.length - 1);\n if (available <= 0 || rowWidth <= available + 0.5) return { visible: widths.length, rowWidth };\n let used = more;\n let visible = 0;\n for (const width of widths) {\n used += gap + width;\n if (used > available) break;\n visible += 1;\n }\n return { visible: Math.max(1, visible), rowWidth };\n};\n\nconst errorMessage = (error: unknown): string => (error instanceof Error ? error.message : \"Failed to load options\");\n\nexport function createChoiceLoader<T extends string>(\n loader: () => ChoiceOptionsLoader<T> | undefined,\n debounceMs: () => number,\n): {\n options: () => readonly ChoiceOption<T>[];\n loading: () => boolean;\n error: () => string | undefined;\n load: (query: string, immediate?: boolean) => void;\n retry: () => void;\n cancel: () => void;\n} {\n const [options, setOptions] = createSignal<readonly ChoiceOption<T>[]>([]);\n const [loading, setLoading] = createSignal(false);\n const [error, setError] = createSignal<string>();\n let controller: AbortController | undefined;\n let timer: ReturnType<typeof setTimeout> | undefined;\n let request = 0;\n let lastQuery = \"\";\n\n const cancel = () => {\n if (timer) clearTimeout(timer);\n timer = undefined;\n controller?.abort();\n controller = undefined;\n };\n\n const run = async (query: string) => {\n const loadOptions = loader();\n if (!loadOptions) return;\n\n controller?.abort();\n controller = new AbortController();\n const currentController = controller;\n const currentRequest = ++request;\n setLoading(true);\n setError(undefined);\n\n try {\n const next = await loadOptions(query, currentController.signal);\n if (currentRequest === request && !currentController.signal.aborted) setOptions(next);\n } catch (reason) {\n if (currentRequest === request && !currentController.signal.aborted) {\n setOptions([]);\n setError(errorMessage(reason));\n }\n } finally {\n if (currentRequest === request) setLoading(false);\n }\n };\n\n const load = (query: string, immediate = false) => {\n lastQuery = query;\n if (timer) clearTimeout(timer);\n timer = undefined;\n if (immediate || debounceMs() <= 0) {\n void run(query);\n return;\n }\n timer = setTimeout(() => {\n timer = undefined;\n void run(query);\n }, debounceMs());\n };\n\n onCleanup(cancel);\n return { options, loading, error, load, retry: () => load(lastQuery, true), cancel };\n}\n\nconst popoverIsOpen = (popover: HTMLElement | undefined): boolean => {\n if (!popover) return false;\n try {\n return popover.matches(\":popover-open\");\n } catch {\n return false;\n }\n};\n\nexport const placeChoicePopover = (trigger: HTMLElement, popover: HTMLElement): void => {\n const margin = 8;\n const gap = 4;\n const triggerRect = trigger.getBoundingClientRect();\n // Cloud sizes its dropdowns to the trigger exactly (`dialog.style.width =\n // rect.width`). Keep that so a narrow toolbar select does not open a wide\n // panel that no longer lines up with the control it belongs to.\n const width = Math.min(triggerRect.width, window.innerWidth - margin * 2);\n popover.style.width = `${width}px`;\n\n const popoverRect = popover.getBoundingClientRect();\n const left = Math.max(margin, Math.min(triggerRect.left, window.innerWidth - width - margin));\n const roomBelow = window.innerHeight - triggerRect.bottom - gap - margin;\n const roomAbove = triggerRect.top - gap - margin;\n const opensAbove = popoverRect.height > roomBelow && roomAbove > roomBelow;\n const top = opensAbove\n ? Math.max(margin, triggerRect.top - popoverRect.height - gap)\n : Math.min(triggerRect.bottom + gap, window.innerHeight - popoverRect.height - margin);\n\n popover.style.left = `${left}px`;\n popover.style.top = `${Math.max(margin, top)}px`;\n};\n\nexport function createChoicePopover(disabled: () => boolean): {\n open: () => boolean;\n setTrigger: Setter<HTMLElement | undefined>;\n setPopover: Setter<HTMLElement | undefined>;\n show: () => void;\n hide: (restoreFocus?: boolean) => void;\n toggle: () => void;\n trigger: () => HTMLElement | undefined;\n} {\n const [open, setOpen] = createSignal(false);\n const [trigger, setTrigger] = createSignal<HTMLElement>();\n const [popover, setPopover] = createSignal<HTMLElement>();\n let triggerRing = true;\n\n const place = () => {\n const triggerElement = trigger();\n const popoverElement = popover();\n if (triggerElement && popoverElement && open()) placeChoicePopover(triggerElement, popoverElement);\n };\n\n const show = () => {\n const popoverElement = popover();\n if (disabled() || !popoverElement || popoverIsOpen(popoverElement)) return;\n triggerRing = ringOnReturn(trigger());\n popoverElement.showPopover();\n setOpen(true);\n queueMicrotask(place);\n };\n\n const hide = (restoreFocus = false) => {\n const popoverElement = popover();\n // Before hiding, so the popover does not return focus on its own.\n if (restoreFocus) returnFocus(trigger(), triggerRing);\n if (popoverIsOpen(popoverElement)) popoverElement?.hidePopover();\n setOpen(false);\n };\n\n createEffect(() => {\n const popoverElement = popover();\n if (!popoverElement) return;\n const syncOpenState = () => setOpen(popoverIsOpen(popoverElement));\n const containWheel = (event: WheelEvent) => {\n if (event.ctrlKey) return;\n event.preventDefault();\n\n const target = event.target instanceof Element ? event.target : undefined;\n const groups = target?.closest<HTMLElement>(\".k2b-choice-groups\");\n const horizontalDelta = event.shiftKey && event.deltaX === 0 ? event.deltaY : event.deltaX;\n if (groups && (event.shiftKey || Math.abs(event.deltaX) > Math.abs(event.deltaY)) && groups.scrollWidth > groups.clientWidth) {\n const unit = event.deltaMode === 1 ? 16 : event.deltaMode === 2 ? groups.clientWidth : 1;\n groups.scrollLeft += horizontalDelta * unit;\n return;\n }\n\n const options = popoverElement.querySelector<HTMLElement>(\".k2b-choice-options\");\n if (!options || options.scrollHeight <= options.clientHeight) return;\n const unit = event.deltaMode === 1 ? 16 : event.deltaMode === 2 ? options.clientHeight : 1;\n options.scrollTop += event.deltaY * unit;\n };\n popoverElement.addEventListener(\"toggle\", syncOpenState);\n popoverElement.addEventListener(\"wheel\", containWheel, { passive: false });\n onCleanup(() => {\n popoverElement.removeEventListener(\"toggle\", syncOpenState);\n popoverElement.removeEventListener(\"wheel\", containWheel);\n });\n });\n\n createEffect(() => {\n if (!open()) return;\n\n const dismiss = (event: PointerEvent) => {\n const target = event.target;\n if (!(target instanceof Node) || trigger()?.contains(target) || popover()?.contains(target)) return;\n hide();\n };\n const reposition = () => place();\n\n // Async option lists arrive after the popover is already open, so the first\n // placement measures an empty panel. Re-place whenever the panel resizes,\n // otherwise a dropdown that grows past the viewport bottom stays clipped.\n const popoverElement = popover();\n const observer = popoverElement && typeof ResizeObserver !== \"undefined\" ? new ResizeObserver(reposition) : undefined;\n if (popoverElement) observer?.observe(popoverElement);\n\n document.addEventListener(\"pointerdown\", dismiss, true);\n window.addEventListener(\"resize\", reposition);\n window.addEventListener(\"scroll\", reposition, true);\n onCleanup(() => {\n observer?.disconnect();\n document.removeEventListener(\"pointerdown\", dismiss, true);\n window.removeEventListener(\"resize\", reposition);\n window.removeEventListener(\"scroll\", reposition, true);\n });\n });\n\n onCleanup(() => hide());\n return {\n open,\n setTrigger,\n setPopover,\n show,\n hide,\n toggle: () => (open() ? hide() : show()),\n trigger,\n };\n}\n"],"mappings":"AAAA,SAAS,YAAY,EAAE,YAAY,EAAE,SAAS,QAAqB,UAAU;AAC7E,SAAS,WAAW,EAAE,YAAY,QAAQ,0BAA0B;AAepE,OAAO,MAAM,mBAAmB,GAAG,CAAmB,OAAmC,EAAE,KAAa,KAAiC;EACvI,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC;EACnD,IAAI,CAAC,UAAU,EAAE,OAAO,OAAO;EAC/B,OAAO,OAAO,CAAC,MAAM,CAAE,MAAM,IAC3B,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAE,IAAI,IAAK,IAAI,EAAE,iBAAiB,CAAC,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,CAChH,CAAC;AACH,CAAC;AAED,OAAO,MAAM,sBAAsB,GAAG,CACpC,OAAmC,EACnC,OAAe,EACf,SAAiB,KACN;EACX,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,CAAC,KAAK,CAAE,MAAM,IAAK,MAAM,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC,CAAC;EAEjF,IAAI,KAAK,GAAG,OAAO;EACnB,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,EAAE,OAAO,IAAI,CAAC,EAAE;IAC5D,KAAK,GAAG,CAAC,KAAK,GAAG,SAAS,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM;IAC7D,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,OAAO,KAAK;EAC7C;EACA,OAAO,CAAC,CAAC;AACX,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,MAAM,cAAc,GAAG,CAC5B,SAAiB,EACjB,MAAyB,EACzB,GAAW,EACX,IAAY,KAC8B;EAC1C,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,KAAK,KAAK,GAAG,GAAG,KAAK,EAAE,CAAC,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;EACrG,IAAI,SAAS,IAAI,CAAC,IAAI,QAAQ,IAAI,SAAS,GAAG,GAAG,EAAE,OAAO;IAAE,OAAO,EAAE,MAAM,CAAC,MAAM;IAAE;EAAS,CAAC;EAC9F,IAAI,IAAI,GAAG,IAAI;EACf,IAAI,OAAO,GAAG,CAAC;EACf,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE;IAC1B,IAAI,IAAI,GAAG,GAAG,KAAK;IACnB,IAAI,IAAI,GAAG,SAAS,EAAE;IACtB,OAAO,IAAI,CAAC;EACd;EACA,OAAO;IAAE,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC;IAAE;EAAS,CAAC;AACpD,CAAC;AAED,MAAM,YAAY,GAAI,KAAc,IAAc,KAAK,YAAY,KAAK,GAAG,KAAK,CAAC,OAAO,GAAG,wBAAyB;AAEpH,OAAO,SAAS,kBAAkB,CAChC,MAAgD,EAChD,UAAwB,EAQxB;EACA,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,YAAY,CAA6B,EAAE,CAAC;EAC1E,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,YAAY,CAAC,KAAK,CAAC;EACjD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,YAAY,CAAS,CAAC;EAChD,IAAI,UAAuC;EAC3C,IAAI,KAAgD;EACpD,IAAI,OAAO,GAAG,CAAC;EACf,IAAI,SAAS,GAAG,EAAE;EAElB,MAAM,MAAM,GAAG,MAAM;IACnB,IAAI,KAAK,EAAE,YAAY,CAAC,KAAK,CAAC;IAC9B,KAAK,GAAG,SAAS;IACjB,UAAU,EAAE,KAAK,CAAC,CAAC;IACnB,UAAU,GAAG,SAAS;EACxB,CAAC;EAED,MAAM,GAAG,GAAG,MAAO,KAAa,IAAK;IACnC,MAAM,WAAW,GAAG,MAAM,CAAC,CAAC;IAC5B,IAAI,CAAC,WAAW,EAAE;IAElB,UAAU,EAAE,KAAK,CAAC,CAAC;IACnB,UAAU,GAAG,IAAI,eAAe,CAAC,CAAC;IAClC,MAAM,iBAAiB,GAAG,UAAU;IACpC,MAAM,cAAc,GAAG,EAAE,OAAO;IAChC,UAAU,CAAC,IAAI,CAAC;IAChB,QAAQ,CAAC,SAAS,CAAC;IAEnB,IAAI;MACF,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,KAAK,EAAE,iBAAiB,CAAC,MAAM,CAAC;MAC/D,IAAI,cAAc,KAAK,OAAO,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,IAAI,CAAC;IACvF,CAAC,CAAC,OAAO,MAAM,EAAE;MACf,IAAI,cAAc,KAAK,OAAO,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,OAAO,EAAE;QACnE,UAAU,CAAC,EAAE,CAAC;QACd,QAAQ,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;MAChC;IACF,CAAC,SAAS;MACR,IAAI,cAAc,KAAK,OAAO,EAAE,UAAU,CAAC,KAAK,CAAC;IACnD;EACF,CAAC;EAED,MAAM,IAAI,GAAG,CAAC,KAAa,EAAE,SAAS,GAAG,KAAK,KAAK;IACjD,SAAS,GAAG,KAAK;IACjB,IAAI,KAAK,EAAE,YAAY,CAAC,KAAK,CAAC;IAC9B,KAAK,GAAG,SAAS;IACjB,IAAI,SAAS,IAAI,UAAU,CAAC,CAAC,IAAI,CAAC,EAAE;MAClC,KAAK,GAAG,CAAC,KAAK,CAAC;MACf;IACF;IACA,KAAK,GAAG,UAAU,CAAC,MAAM;MACvB,KAAK,GAAG,SAAS;MACjB,KAAK,GAAG,CAAC,KAAK,CAAC;IACjB,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC;EAClB,CAAC;EAED,SAAS,CAAC,MAAM,CAAC;EACjB,OAAO;IAAE,OAAO;IAAE,OAAO;IAAE,KAAK;IAAE,IAAI;IAAE,KAAK,EAAE,MAAM,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC;IAAE;EAAO,CAAC;AACtF;AAEA,MAAM,aAAa,GAAI,OAAgC,IAAc;EACnE,IAAI,CAAC,OAAO,EAAE,OAAO,KAAK;EAC1B,IAAI;IACF,OAAO,OAAO,CAAC,OAAO,CAAC,eAAe,CAAC;EACzC,CAAC,CAAC,MAAM;IACN,OAAO,KAAK;EACd;AACF,CAAC;AAED,OAAO,MAAM,kBAAkB,GAAG,CAAC,OAAoB,EAAE,OAAoB,KAAW;EACtF,MAAM,MAAM,GAAG,CAAC;EAChB,MAAM,GAAG,GAAG,CAAC;EACb,MAAM,WAAW,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAAC;EACnD;EACA;EACA;EACA,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,KAAK,EAAE,MAAM,CAAC,UAAU,GAAG,MAAM,GAAG,CAAC,CAAC;EACzE,OAAO,CAAC,KAAK,CAAC,KAAK,GAAG,GAAG,KAAK,IAAI;EAElC,MAAM,WAAW,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAAC;EACnD,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,UAAU,GAAG,KAAK,GAAG,MAAM,CAAC,CAAC;EAC7F,MAAM,SAAS,GAAG,MAAM,CAAC,WAAW,GAAG,WAAW,CAAC,MAAM,GAAG,GAAG,GAAG,MAAM;EACxE,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,GAAG,GAAG,GAAG,MAAM;EAChD,MAAM,UAAU,GAAG,WAAW,CAAC,MAAM,GAAG,SAAS,IAAI,SAAS,GAAG,SAAS;EAC1E,MAAM,GAAG,GAAG,UAAU,GAClB,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,GAAG,GAAG,WAAW,CAAC,MAAM,GAAG,GAAG,CAAC,GAC5D,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,MAAM,GAAG,GAAG,EAAE,MAAM,CAAC,WAAW,GAAG,WAAW,CAAC,MAAM,GAAG,MAAM,CAAC;EAExF,OAAO,CAAC,KAAK,CAAC,IAAI,GAAG,GAAG,IAAI,IAAI;EAChC,OAAO,CAAC,KAAK,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI;AAClD,CAAC;AAED,OAAO,SAAS,mBAAmB,CAAC,QAAuB,EAQzD;EACA,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,YAAY,CAAC,KAAK,CAAC;EAC3C,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,YAAY,CAAc,CAAC;EACzD,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,YAAY,CAAc,CAAC;EACzD,IAAI,WAAW,GAAG,IAAI;EAEtB,MAAM,KAAK,GAAG,MAAM;IAClB,MAAM,cAAc,GAAG,OAAO,CAAC,CAAC;IAChC,MAAM,cAAc,GAAG,OAAO,CAAC,CAAC;IAChC,IAAI,cAAc,IAAI,cAAc,IAAI,IAAI,CAAC,CAAC,EAAE,kBAAkB,CAAC,cAAc,EAAE,cAAc,CAAC;EACpG,CAAC;EAED,MAAM,IAAI,GAAG,MAAM;IACjB,MAAM,cAAc,GAAG,OAAO,CAAC,CAAC;IAChC,IAAI,QAAQ,CAAC,CAAC,IAAI,CAAC,cAAc,IAAI,aAAa,CAAC,cAAc,CAAC,EAAE;IACpE,WAAW,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC;IACrC,cAAc,CAAC,WAAW,CAAC,CAAC;IAC5B,OAAO,CAAC,IAAI,CAAC;IACb,cAAc,CAAC,KAAK,CAAC;EACvB,CAAC;EAED,MAAM,IAAI,GAAG,CAAC,YAAY,GAAG,KAAK,KAAK;IACrC,MAAM,cAAc,GAAG,OAAO,CAAC,CAAC;IAChC;IACA,IAAI,YAAY,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC,EAAE,WAAW,CAAC;IACrD,IAAI,aAAa,CAAC,cAAc,CAAC,EAAE,cAAc,EAAE,WAAW,CAAC,CAAC;IAChE,OAAO,CAAC,KAAK,CAAC;EAChB,CAAC;EAED,YAAY,CAAC,MAAM;IACjB,MAAM,cAAc,GAAG,OAAO,CAAC,CAAC;IAChC,IAAI,CAAC,cAAc,EAAE;IACrB,MAAM,aAAa,GAAG,MAAM,OAAO,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC;IAClE,MAAM,YAAY,GAAI,KAAiB,IAAK;MAC1C,IAAI,KAAK,CAAC,OAAO,EAAE;MACnB,KAAK,CAAC,cAAc,CAAC,CAAC;MAEtB,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,YAAY,OAAO,GAAG,KAAK,CAAC,MAAM,GAAG,SAAS;MACzE,MAAM,MAAM,GAAG,MAAM,EAAE,OAAO,CAAc,oBAAoB,CAAC;MACjE,MAAM,eAAe,GAAG,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM;MAC1F,IAAI,MAAM,KAAK,KAAK,CAAC,QAAQ,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,MAAM,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,EAAE;QAC5H,MAAM,IAAI,GAAG,KAAK,CAAC,SAAS,KAAK,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,SAAS,KAAK,CAAC,GAAG,MAAM,CAAC,WAAW,GAAG,CAAC;QACxF,MAAM,CAAC,UAAU,IAAI,eAAe,GAAG,IAAI;QAC3C;MACF;MAEA,MAAM,OAAO,GAAG,cAAc,CAAC,aAAa,CAAc,qBAAqB,CAAC;MAChF,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,YAAY,IAAI,OAAO,CAAC,YAAY,EAAE;MAC9D,MAAM,IAAI,GAAG,KAAK,CAAC,SAAS,KAAK,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,SAAS,KAAK,CAAC,GAAG,OAAO,CAAC,YAAY,GAAG,CAAC;MAC1F,OAAO,CAAC,SAAS,IAAI,KAAK,CAAC,MAAM,GAAG,IAAI;IAC1C,CAAC;IACD,cAAc,CAAC,gBAAgB,CAAC,QAAQ,EAAE,aAAa,CAAC;IACxD,cAAc,CAAC,gBAAgB,CAAC,OAAO,EAAE,YAAY,EAAE;MAAE,OAAO,EAAE;IAAM,CAAC,CAAC;IAC1E,SAAS,CAAC,MAAM;MACd,cAAc,CAAC,mBAAmB,CAAC,QAAQ,EAAE,aAAa,CAAC;MAC3D,cAAc,CAAC,mBAAmB,CAAC,OAAO,EAAE,YAAY,CAAC;IAC3D,CAAC,CAAC;EACJ,CAAC,CAAC;EAEF,YAAY,CAAC,MAAM;IACjB,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE;IAEb,MAAM,OAAO,GAAI,KAAmB,IAAK;MACvC,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM;MAC3B,IAAI,EAAE,MAAM,YAAY,IAAI,CAAC,IAAI,OAAO,CAAC,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,IAAI,OAAO,CAAC,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,EAAE;MAC7F,IAAI,CAAC,CAAC;IACR,CAAC;IACD,MAAM,UAAU,GAAG,MAAM,KAAK,CAAC,CAAC;;IAEhC;IACA;IACA;IACA,MAAM,cAAc,GAAG,OAAO,CAAC,CAAC;IAChC,MAAM,QAAQ,GAAG,cAAc,IAAI,OAAO,cAAc,KAAK,WAAW,GAAG,IAAI,cAAc,CAAC,UAAU,CAAC,GAAG,SAAS;IACrH,IAAI,cAAc,EAAE,QAAQ,EAAE,OAAO,CAAC,cAAc,CAAC;IAErD,QAAQ,CAAC,gBAAgB,CAAC,aAAa,EAAE,OAAO,EAAE,IAAI,CAAC;IACvD,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,UAAU,CAAC;IAC7C,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,UAAU,EAAE,IAAI,CAAC;IACnD,SAAS,CAAC,MAAM;MACd,QAAQ,EAAE,UAAU,CAAC,CAAC;MACtB,QAAQ,CAAC,mBAAmB,CAAC,aAAa,EAAE,OAAO,EAAE,IAAI,CAAC;MAC1D,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,UAAU,CAAC;MAChD,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,UAAU,EAAE,IAAI,CAAC;IACxD,CAAC,CAAC;EACJ,CAAC,CAAC;EAEF,SAAS,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC;EACvB,OAAO;IACL,IAAI;IACJ,UAAU;IACV,UAAU;IACV,IAAI;IACJ,IAAI;IACJ,MAAM,EAAE,MAAO,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAE;IACxC;EACF,CAAC;AACH","ignoreList":[]}
1
+ {"version":3,"names":[],"sources":["inputs/choice.ts"],"sourcesContent":["import { createEffect, createSignal, onCleanup, type Setter } from \"solid-js\";\nimport { returnFocus, ringOnReturn } from \"../internal/focus-return\";\n\nexport type ChoiceOption<T extends string = string> = {\n value: T;\n label: string;\n description?: string;\n icon?: string;\n color?: string;\n disabled?: boolean;\n /** Optional overlapping groups used by choice controls that expose group filtering. */\n groups?: readonly string[];\n};\n\nexport type ChoiceOptionsLoader<T extends string = string> = (query: string, signal: AbortSignal) => Promise<readonly ChoiceOption<T>[]>;\n\n/** Matches label, description, value, and optional extra keywords. */\nexport const filterChoiceOptions = <\n O extends Pick<ChoiceOption<string>, \"label\" | \"description\" | \"value\"> & { keywords?: readonly string[] },\n>(\n options: readonly O[],\n query: string,\n): readonly O[] => {\n const normalized = query.trim().toLocaleLowerCase();\n if (!normalized) return options;\n return options.filter((option) =>\n [option.label, option.description, option.value, ...(option.keywords ?? [])].some((part) =>\n part?.toLocaleLowerCase().includes(normalized),\n ),\n );\n};\n\n/**\n * Moves through the options and wraps at the ends, skipping `disabled` ones. A\n * RichSelect row that cannot be chosen carries a `disabledReason` instead, so\n * the arrow keys still reach it and its reason can be read.\n */\nexport const nextEnabledChoiceIndex = <O extends { label: string; disabled?: boolean }>(\n options: readonly O[],\n current: number,\n direction: 1 | -1,\n): number => {\n if (options.length === 0 || options.every((option) => option.disabled)) return -1;\n\n let index = current;\n for (let visited = 0; visited < options.length; visited += 1) {\n index = (index + direction + options.length) % options.length;\n if (!options[index]?.disabled) return index;\n }\n return -1;\n};\n\n/**\n * Counts the leading pills that fit into `available` pixels and measures the\n * whole row. When not all of them fit, the rest collapse into a summary pill\n * of width `more`; the first pill always stays and truncates when even it does\n * not fit. Without a measured width (no layout yet) every pill stays. Half a\n * pixel of slack absorbs layout rounding, so a row given exactly its own\n * `rowWidth` always fits.\n */\nexport const fitChoicePills = (\n available: number,\n widths: readonly number[],\n gap: number,\n more: number,\n): { visible: number; rowWidth: number } => {\n const rowWidth = widths.reduce((sum, width) => sum + width, 0) + gap * Math.max(0, widths.length - 1);\n if (available <= 0 || rowWidth <= available + 0.5) return { visible: widths.length, rowWidth };\n let used = more;\n let visible = 0;\n for (const width of widths) {\n used += gap + width;\n if (used > available) break;\n visible += 1;\n }\n return { visible: Math.max(1, visible), rowWidth };\n};\n\nconst errorMessage = (error: unknown): string => (error instanceof Error ? error.message : \"Failed to load options\");\n\nexport function createChoiceLoader<T extends string>(\n loader: () => ChoiceOptionsLoader<T> | undefined,\n debounceMs: () => number,\n): {\n options: () => readonly ChoiceOption<T>[];\n loading: () => boolean;\n error: () => string | undefined;\n load: (query: string, immediate?: boolean) => void;\n retry: () => void;\n cancel: () => void;\n} {\n const [options, setOptions] = createSignal<readonly ChoiceOption<T>[]>([]);\n const [loading, setLoading] = createSignal(false);\n const [error, setError] = createSignal<string>();\n let controller: AbortController | undefined;\n let timer: ReturnType<typeof setTimeout> | undefined;\n let request = 0;\n let lastQuery = \"\";\n\n const cancel = () => {\n if (timer) clearTimeout(timer);\n timer = undefined;\n controller?.abort();\n controller = undefined;\n };\n\n const run = async (query: string) => {\n const loadOptions = loader();\n if (!loadOptions) return;\n\n controller?.abort();\n controller = new AbortController();\n const currentController = controller;\n const currentRequest = ++request;\n setLoading(true);\n setError(undefined);\n\n try {\n const next = await loadOptions(query, currentController.signal);\n if (currentRequest === request && !currentController.signal.aborted) setOptions(next);\n } catch (reason) {\n if (currentRequest === request && !currentController.signal.aborted) {\n setOptions([]);\n setError(errorMessage(reason));\n }\n } finally {\n if (currentRequest === request) setLoading(false);\n }\n };\n\n const load = (query: string, immediate = false) => {\n lastQuery = query;\n if (timer) clearTimeout(timer);\n timer = undefined;\n if (immediate || debounceMs() <= 0) {\n void run(query);\n return;\n }\n timer = setTimeout(() => {\n timer = undefined;\n void run(query);\n }, debounceMs());\n };\n\n onCleanup(cancel);\n return { options, loading, error, load, retry: () => load(lastQuery, true), cancel };\n}\n\nconst popoverIsOpen = (popover: HTMLElement | undefined): boolean => {\n if (!popover) return false;\n try {\n return popover.matches(\":popover-open\");\n } catch {\n return false;\n }\n};\n\nexport type ChoicePopoverPlacement = {\n /**\n * `trigger` (default) gives the popover the trigger's width; `own` keeps the\n * width its stylesheet sets, such as a RichSelect with a preview.\n */\n width?: \"trigger\" | \"own\";\n /** The side tried first. The popover flips when the other side has more room. */\n side?: \"below\" | \"above\";\n};\n\nexport const placeChoicePopover = (trigger: HTMLElement, popover: HTMLElement, placement: ChoicePopoverPlacement = {}): void => {\n const margin = 8;\n const gap = 4;\n const triggerRect = trigger.getBoundingClientRect();\n // Cloud sizes its dropdowns to the trigger exactly (`dialog.style.width =\n // rect.width`). Keep that so a narrow toolbar select does not open a wide\n // panel that no longer lines up with the control it belongs to.\n const triggerWidth = Math.min(triggerRect.width, window.innerWidth - margin * 2);\n if (placement.width !== \"own\") popover.style.width = `${triggerWidth}px`;\n\n const popoverRect = popover.getBoundingClientRect();\n const width = placement.width === \"own\" ? popoverRect.width : triggerWidth;\n const left = Math.max(margin, Math.min(triggerRect.left, window.innerWidth - width - margin));\n const roomBelow = window.innerHeight - triggerRect.bottom - gap - margin;\n const roomAbove = triggerRect.top - gap - margin;\n const opensAbove =\n placement.side === \"above\"\n ? popoverRect.height <= roomAbove || roomAbove > roomBelow\n : popoverRect.height > roomBelow && roomAbove > roomBelow;\n const top = opensAbove\n ? Math.max(margin, triggerRect.top - popoverRect.height - gap)\n : Math.min(triggerRect.bottom + gap, window.innerHeight - popoverRect.height - margin);\n\n popover.style.left = `${left}px`;\n popover.style.top = `${Math.max(margin, top)}px`;\n};\n\nexport function createChoicePopover(\n disabled: () => boolean,\n placement: () => ChoicePopoverPlacement = () => ({}),\n): {\n open: () => boolean;\n setTrigger: Setter<HTMLElement | undefined>;\n setPopover: Setter<HTMLElement | undefined>;\n show: () => void;\n hide: (restoreFocus?: boolean) => void;\n toggle: () => void;\n trigger: () => HTMLElement | undefined;\n} {\n const [open, setOpen] = createSignal(false);\n const [trigger, setTrigger] = createSignal<HTMLElement>();\n const [popover, setPopover] = createSignal<HTMLElement>();\n let triggerRing = true;\n\n const place = () => {\n const triggerElement = trigger();\n const popoverElement = popover();\n if (triggerElement && popoverElement && open()) placeChoicePopover(triggerElement, popoverElement, placement());\n };\n\n const show = () => {\n const popoverElement = popover();\n if (disabled() || !popoverElement || popoverIsOpen(popoverElement)) return;\n triggerRing = ringOnReturn(trigger());\n popoverElement.showPopover();\n setOpen(true);\n queueMicrotask(place);\n };\n\n const hide = (restoreFocus = false) => {\n const popoverElement = popover();\n // Before hiding, so the popover does not return focus on its own.\n if (restoreFocus) returnFocus(trigger(), triggerRing);\n if (popoverIsOpen(popoverElement)) popoverElement?.hidePopover();\n setOpen(false);\n };\n\n createEffect(() => {\n const popoverElement = popover();\n if (!popoverElement) return;\n const syncOpenState = () => setOpen(popoverIsOpen(popoverElement));\n const containWheel = (event: WheelEvent) => {\n if (event.ctrlKey) return;\n event.preventDefault();\n\n const target = event.target instanceof Element ? event.target : undefined;\n const groups = target?.closest<HTMLElement>(\".k2b-choice-groups\");\n const horizontalDelta = event.shiftKey && event.deltaX === 0 ? event.deltaY : event.deltaX;\n if (groups && (event.shiftKey || Math.abs(event.deltaX) > Math.abs(event.deltaY)) && groups.scrollWidth > groups.clientWidth) {\n const unit = event.deltaMode === 1 ? 16 : event.deltaMode === 2 ? groups.clientWidth : 1;\n groups.scrollLeft += horizontalDelta * unit;\n return;\n }\n\n // A popover with more than one scrolling region, such as a list beside a\n // preview, marks them; the wheel scrolls the one under the pointer.\n const options =\n target?.closest<HTMLElement>(\"[data-choice-scroll]\") ?? popoverElement.querySelector<HTMLElement>(\".k2b-choice-options\");\n if (!options || options.scrollHeight <= options.clientHeight) return;\n const unit = event.deltaMode === 1 ? 16 : event.deltaMode === 2 ? options.clientHeight : 1;\n options.scrollTop += event.deltaY * unit;\n };\n popoverElement.addEventListener(\"toggle\", syncOpenState);\n popoverElement.addEventListener(\"wheel\", containWheel, { passive: false });\n onCleanup(() => {\n popoverElement.removeEventListener(\"toggle\", syncOpenState);\n popoverElement.removeEventListener(\"wheel\", containWheel);\n });\n });\n\n createEffect(() => {\n if (!open()) return;\n\n const dismiss = (event: PointerEvent) => {\n const target = event.target;\n if (!(target instanceof Node) || trigger()?.contains(target) || popover()?.contains(target)) return;\n hide();\n };\n const reposition = () => place();\n\n // Async option lists arrive after the popover is already open, so the first\n // placement measures an empty panel. Re-place whenever the panel resizes,\n // otherwise a dropdown that grows past the viewport bottom stays clipped.\n const popoverElement = popover();\n const observer = popoverElement && typeof ResizeObserver !== \"undefined\" ? new ResizeObserver(reposition) : undefined;\n if (popoverElement) observer?.observe(popoverElement);\n\n document.addEventListener(\"pointerdown\", dismiss, true);\n window.addEventListener(\"resize\", reposition);\n window.addEventListener(\"scroll\", reposition, true);\n onCleanup(() => {\n observer?.disconnect();\n document.removeEventListener(\"pointerdown\", dismiss, true);\n window.removeEventListener(\"resize\", reposition);\n window.removeEventListener(\"scroll\", reposition, true);\n });\n });\n\n onCleanup(() => hide());\n return {\n open,\n setTrigger,\n setPopover,\n show,\n hide,\n toggle: () => (open() ? hide() : show()),\n trigger,\n };\n}\n"],"mappings":"AAAA,SAAS,YAAY,EAAE,YAAY,EAAE,SAAS,QAAqB,UAAU;AAC7E,SAAS,WAAW,EAAE,YAAY,QAAQ,0BAA0B;AAepE;AACA,OAAO,MAAM,mBAAmB,GAAG,CAGjC,OAAqB,EACrB,KAAa,KACI;EACjB,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC;EACnD,IAAI,CAAC,UAAU,EAAE,OAAO,OAAO;EAC/B,OAAO,OAAO,CAAC,MAAM,CAAE,MAAM,IAC3B,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,KAAK,EAAE,IAAI,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAE,IAAI,IACrF,IAAI,EAAE,iBAAiB,CAAC,CAAC,CAAC,QAAQ,CAAC,UAAU,CAC/C,CACF,CAAC;AACH,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA,OAAO,MAAM,sBAAsB,GAAG,CACpC,OAAqB,EACrB,OAAe,EACf,SAAiB,KACN;EACX,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,CAAC,KAAK,CAAE,MAAM,IAAK,MAAM,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC,CAAC;EAEjF,IAAI,KAAK,GAAG,OAAO;EACnB,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,EAAE,OAAO,IAAI,CAAC,EAAE;IAC5D,KAAK,GAAG,CAAC,KAAK,GAAG,SAAS,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM;IAC7D,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,OAAO,KAAK;EAC7C;EACA,OAAO,CAAC,CAAC;AACX,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,MAAM,cAAc,GAAG,CAC5B,SAAiB,EACjB,MAAyB,EACzB,GAAW,EACX,IAAY,KAC8B;EAC1C,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,KAAK,KAAK,GAAG,GAAG,KAAK,EAAE,CAAC,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;EACrG,IAAI,SAAS,IAAI,CAAC,IAAI,QAAQ,IAAI,SAAS,GAAG,GAAG,EAAE,OAAO;IAAE,OAAO,EAAE,MAAM,CAAC,MAAM;IAAE;EAAS,CAAC;EAC9F,IAAI,IAAI,GAAG,IAAI;EACf,IAAI,OAAO,GAAG,CAAC;EACf,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE;IAC1B,IAAI,IAAI,GAAG,GAAG,KAAK;IACnB,IAAI,IAAI,GAAG,SAAS,EAAE;IACtB,OAAO,IAAI,CAAC;EACd;EACA,OAAO;IAAE,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC;IAAE;EAAS,CAAC;AACpD,CAAC;AAED,MAAM,YAAY,GAAI,KAAc,IAAc,KAAK,YAAY,KAAK,GAAG,KAAK,CAAC,OAAO,GAAG,wBAAyB;AAEpH,OAAO,SAAS,kBAAkB,CAChC,MAAgD,EAChD,UAAwB,EAQxB;EACA,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,YAAY,CAA6B,EAAE,CAAC;EAC1E,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,YAAY,CAAC,KAAK,CAAC;EACjD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,YAAY,CAAS,CAAC;EAChD,IAAI,UAAuC;EAC3C,IAAI,KAAgD;EACpD,IAAI,OAAO,GAAG,CAAC;EACf,IAAI,SAAS,GAAG,EAAE;EAElB,MAAM,MAAM,GAAG,MAAM;IACnB,IAAI,KAAK,EAAE,YAAY,CAAC,KAAK,CAAC;IAC9B,KAAK,GAAG,SAAS;IACjB,UAAU,EAAE,KAAK,CAAC,CAAC;IACnB,UAAU,GAAG,SAAS;EACxB,CAAC;EAED,MAAM,GAAG,GAAG,MAAO,KAAa,IAAK;IACnC,MAAM,WAAW,GAAG,MAAM,CAAC,CAAC;IAC5B,IAAI,CAAC,WAAW,EAAE;IAElB,UAAU,EAAE,KAAK,CAAC,CAAC;IACnB,UAAU,GAAG,IAAI,eAAe,CAAC,CAAC;IAClC,MAAM,iBAAiB,GAAG,UAAU;IACpC,MAAM,cAAc,GAAG,EAAE,OAAO;IAChC,UAAU,CAAC,IAAI,CAAC;IAChB,QAAQ,CAAC,SAAS,CAAC;IAEnB,IAAI;MACF,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,KAAK,EAAE,iBAAiB,CAAC,MAAM,CAAC;MAC/D,IAAI,cAAc,KAAK,OAAO,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,IAAI,CAAC;IACvF,CAAC,CAAC,OAAO,MAAM,EAAE;MACf,IAAI,cAAc,KAAK,OAAO,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,OAAO,EAAE;QACnE,UAAU,CAAC,EAAE,CAAC;QACd,QAAQ,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;MAChC;IACF,CAAC,SAAS;MACR,IAAI,cAAc,KAAK,OAAO,EAAE,UAAU,CAAC,KAAK,CAAC;IACnD;EACF,CAAC;EAED,MAAM,IAAI,GAAG,CAAC,KAAa,EAAE,SAAS,GAAG,KAAK,KAAK;IACjD,SAAS,GAAG,KAAK;IACjB,IAAI,KAAK,EAAE,YAAY,CAAC,KAAK,CAAC;IAC9B,KAAK,GAAG,SAAS;IACjB,IAAI,SAAS,IAAI,UAAU,CAAC,CAAC,IAAI,CAAC,EAAE;MAClC,KAAK,GAAG,CAAC,KAAK,CAAC;MACf;IACF;IACA,KAAK,GAAG,UAAU,CAAC,MAAM;MACvB,KAAK,GAAG,SAAS;MACjB,KAAK,GAAG,CAAC,KAAK,CAAC;IACjB,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC;EAClB,CAAC;EAED,SAAS,CAAC,MAAM,CAAC;EACjB,OAAO;IAAE,OAAO;IAAE,OAAO;IAAE,KAAK;IAAE,IAAI;IAAE,KAAK,EAAE,MAAM,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC;IAAE;EAAO,CAAC;AACtF;AAEA,MAAM,aAAa,GAAI,OAAgC,IAAc;EACnE,IAAI,CAAC,OAAO,EAAE,OAAO,KAAK;EAC1B,IAAI;IACF,OAAO,OAAO,CAAC,OAAO,CAAC,eAAe,CAAC;EACzC,CAAC,CAAC,MAAM;IACN,OAAO,KAAK;EACd;AACF,CAAC;AAYD,OAAO,MAAM,kBAAkB,GAAG,CAAC,OAAoB,EAAE,OAAoB,EAAE,SAAiC,GAAG,CAAC,CAAC,KAAW;EAC9H,MAAM,MAAM,GAAG,CAAC;EAChB,MAAM,GAAG,GAAG,CAAC;EACb,MAAM,WAAW,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAAC;EACnD;EACA;EACA;EACA,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,KAAK,EAAE,MAAM,CAAC,UAAU,GAAG,MAAM,GAAG,CAAC,CAAC;EAChF,IAAI,SAAS,CAAC,KAAK,KAAK,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,KAAK,GAAG,GAAG,YAAY,IAAI;EAExE,MAAM,WAAW,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAAC;EACnD,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,KAAK,KAAK,GAAG,WAAW,CAAC,KAAK,GAAG,YAAY;EAC1E,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,UAAU,GAAG,KAAK,GAAG,MAAM,CAAC,CAAC;EAC7F,MAAM,SAAS,GAAG,MAAM,CAAC,WAAW,GAAG,WAAW,CAAC,MAAM,GAAG,GAAG,GAAG,MAAM;EACxE,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,GAAG,GAAG,GAAG,MAAM;EAChD,MAAM,UAAU,GACd,SAAS,CAAC,IAAI,KAAK,OAAO,GACtB,WAAW,CAAC,MAAM,IAAI,SAAS,IAAI,SAAS,GAAG,SAAS,GACxD,WAAW,CAAC,MAAM,GAAG,SAAS,IAAI,SAAS,GAAG,SAAS;EAC7D,MAAM,GAAG,GAAG,UAAU,GAClB,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,GAAG,GAAG,WAAW,CAAC,MAAM,GAAG,GAAG,CAAC,GAC5D,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,MAAM,GAAG,GAAG,EAAE,MAAM,CAAC,WAAW,GAAG,WAAW,CAAC,MAAM,GAAG,MAAM,CAAC;EAExF,OAAO,CAAC,KAAK,CAAC,IAAI,GAAG,GAAG,IAAI,IAAI;EAChC,OAAO,CAAC,KAAK,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI;AAClD,CAAC;AAED,OAAO,SAAS,mBAAmB,CACjC,QAAuB,EACvB,SAAuC,GAAG,OAAO,CAAC,CAAC,CAAC,EASpD;EACA,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,YAAY,CAAC,KAAK,CAAC;EAC3C,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,YAAY,CAAc,CAAC;EACzD,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,YAAY,CAAc,CAAC;EACzD,IAAI,WAAW,GAAG,IAAI;EAEtB,MAAM,KAAK,GAAG,MAAM;IAClB,MAAM,cAAc,GAAG,OAAO,CAAC,CAAC;IAChC,MAAM,cAAc,GAAG,OAAO,CAAC,CAAC;IAChC,IAAI,cAAc,IAAI,cAAc,IAAI,IAAI,CAAC,CAAC,EAAE,kBAAkB,CAAC,cAAc,EAAE,cAAc,EAAE,SAAS,CAAC,CAAC,CAAC;EACjH,CAAC;EAED,MAAM,IAAI,GAAG,MAAM;IACjB,MAAM,cAAc,GAAG,OAAO,CAAC,CAAC;IAChC,IAAI,QAAQ,CAAC,CAAC,IAAI,CAAC,cAAc,IAAI,aAAa,CAAC,cAAc,CAAC,EAAE;IACpE,WAAW,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC;IACrC,cAAc,CAAC,WAAW,CAAC,CAAC;IAC5B,OAAO,CAAC,IAAI,CAAC;IACb,cAAc,CAAC,KAAK,CAAC;EACvB,CAAC;EAED,MAAM,IAAI,GAAG,CAAC,YAAY,GAAG,KAAK,KAAK;IACrC,MAAM,cAAc,GAAG,OAAO,CAAC,CAAC;IAChC;IACA,IAAI,YAAY,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC,EAAE,WAAW,CAAC;IACrD,IAAI,aAAa,CAAC,cAAc,CAAC,EAAE,cAAc,EAAE,WAAW,CAAC,CAAC;IAChE,OAAO,CAAC,KAAK,CAAC;EAChB,CAAC;EAED,YAAY,CAAC,MAAM;IACjB,MAAM,cAAc,GAAG,OAAO,CAAC,CAAC;IAChC,IAAI,CAAC,cAAc,EAAE;IACrB,MAAM,aAAa,GAAG,MAAM,OAAO,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC;IAClE,MAAM,YAAY,GAAI,KAAiB,IAAK;MAC1C,IAAI,KAAK,CAAC,OAAO,EAAE;MACnB,KAAK,CAAC,cAAc,CAAC,CAAC;MAEtB,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,YAAY,OAAO,GAAG,KAAK,CAAC,MAAM,GAAG,SAAS;MACzE,MAAM,MAAM,GAAG,MAAM,EAAE,OAAO,CAAc,oBAAoB,CAAC;MACjE,MAAM,eAAe,GAAG,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM;MAC1F,IAAI,MAAM,KAAK,KAAK,CAAC,QAAQ,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,MAAM,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,EAAE;QAC5H,MAAM,IAAI,GAAG,KAAK,CAAC,SAAS,KAAK,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,SAAS,KAAK,CAAC,GAAG,MAAM,CAAC,WAAW,GAAG,CAAC;QACxF,MAAM,CAAC,UAAU,IAAI,eAAe,GAAG,IAAI;QAC3C;MACF;;MAEA;MACA;MACA,MAAM,OAAO,GACX,MAAM,EAAE,OAAO,CAAc,sBAAsB,CAAC,IAAI,cAAc,CAAC,aAAa,CAAc,qBAAqB,CAAC;MAC1H,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,YAAY,IAAI,OAAO,CAAC,YAAY,EAAE;MAC9D,MAAM,IAAI,GAAG,KAAK,CAAC,SAAS,KAAK,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,SAAS,KAAK,CAAC,GAAG,OAAO,CAAC,YAAY,GAAG,CAAC;MAC1F,OAAO,CAAC,SAAS,IAAI,KAAK,CAAC,MAAM,GAAG,IAAI;IAC1C,CAAC;IACD,cAAc,CAAC,gBAAgB,CAAC,QAAQ,EAAE,aAAa,CAAC;IACxD,cAAc,CAAC,gBAAgB,CAAC,OAAO,EAAE,YAAY,EAAE;MAAE,OAAO,EAAE;IAAM,CAAC,CAAC;IAC1E,SAAS,CAAC,MAAM;MACd,cAAc,CAAC,mBAAmB,CAAC,QAAQ,EAAE,aAAa,CAAC;MAC3D,cAAc,CAAC,mBAAmB,CAAC,OAAO,EAAE,YAAY,CAAC;IAC3D,CAAC,CAAC;EACJ,CAAC,CAAC;EAEF,YAAY,CAAC,MAAM;IACjB,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE;IAEb,MAAM,OAAO,GAAI,KAAmB,IAAK;MACvC,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM;MAC3B,IAAI,EAAE,MAAM,YAAY,IAAI,CAAC,IAAI,OAAO,CAAC,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,IAAI,OAAO,CAAC,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,EAAE;MAC7F,IAAI,CAAC,CAAC;IACR,CAAC;IACD,MAAM,UAAU,GAAG,MAAM,KAAK,CAAC,CAAC;;IAEhC;IACA;IACA;IACA,MAAM,cAAc,GAAG,OAAO,CAAC,CAAC;IAChC,MAAM,QAAQ,GAAG,cAAc,IAAI,OAAO,cAAc,KAAK,WAAW,GAAG,IAAI,cAAc,CAAC,UAAU,CAAC,GAAG,SAAS;IACrH,IAAI,cAAc,EAAE,QAAQ,EAAE,OAAO,CAAC,cAAc,CAAC;IAErD,QAAQ,CAAC,gBAAgB,CAAC,aAAa,EAAE,OAAO,EAAE,IAAI,CAAC;IACvD,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,UAAU,CAAC;IAC7C,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,UAAU,EAAE,IAAI,CAAC;IACnD,SAAS,CAAC,MAAM;MACd,QAAQ,EAAE,UAAU,CAAC,CAAC;MACtB,QAAQ,CAAC,mBAAmB,CAAC,aAAa,EAAE,OAAO,EAAE,IAAI,CAAC;MAC1D,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,UAAU,CAAC;MAChD,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,UAAU,EAAE,IAAI,CAAC;IACxD,CAAC,CAAC;EACJ,CAAC,CAAC;EAEF,SAAS,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC;EACvB,OAAO;IACL,IAAI;IACJ,UAAU;IACV,UAAU;IACV,IAAI;IACJ,IAAI;IACJ,MAAM,EAAE,MAAO,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAE;IACxC;EACF,CAAC;AACH","ignoreList":[]}
@@ -17,6 +17,7 @@ export { MultiSelectInput } from "./MultiSelectInput";
17
17
  export { MarkdownEditor } from "./markdown/MarkdownEditor";
18
18
  export { NumberInput } from "./NumberInput";
19
19
  export { QrScanner } from "./QrScanner";
20
+ export { RichSelect, RichSelectFacts } from "./RichSelect";
20
21
  export { Select } from "./Select";
21
22
  export { SelectChip } from "./SelectChip";
22
23
  export { SignatureInput } from "./SignatureInput";
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["inputs/index.ts"],"sourcesContent":["export type { AutocompleteEditorProps } from \"./AutocompleteEditor\";\nexport { AutocompleteEditor } from \"./AutocompleteEditor\";\nexport type {\n AutocompleteSelectOption,\n AutocompleteSelectProps,\n AutocompleteSelectSearchResult,\n} from \"./AutocompleteSelect\";\nexport { AutocompleteSelect } from \"./AutocompleteSelect\";\nexport type { CheckboxProps } from \"./Checkbox\";\nexport { Checkbox } from \"./Checkbox\";\nexport type { CheckboxCardProps } from \"./CheckboxCard\";\nexport { CheckboxCard } from \"./CheckboxCard\";\nexport type { ChoiceChipOption, ChoiceChipsProps } from \"./ChoiceChips\";\nexport { ChoiceChips } from \"./ChoiceChips\";\nexport type {\n ColorInputProps,\n PinInputProps,\n SliderProps,\n} from \"./ChoiceInputs\";\nexport { ColorInput, PinInput, Slider } from \"./ChoiceInputs\";\nexport type { ComboboxOption, ComboboxProps } from \"./Combobox\";\nexport { Combobox } from \"./Combobox\";\nexport type { ChoiceOption, ChoiceOptionsLoader } from \"./choice\";\nexport type {\n Completion,\n QueryContext,\n SuggestContext,\n Suggestion,\n} from \"./completion\";\nexport { abbreviations } from \"./completion\";\nexport type {\n DatePickerBaseProps,\n DatePickerProps,\n DatePreset,\n DateRangePickerProps,\n DateRangeValue,\n DateTimePickerProps,\n DurationPreset,\n} from \"./DatePicker\";\nexport { DatePicker, DateRangePicker, DateTimePicker } from \"./DatePicker\";\nexport type { EmojiPickerPopoverProps, EmojiPickerProps } from \"./emoji/EmojiPicker\";\nexport { EmojiPicker } from \"./emoji/EmojiPicker\";\nexport type { EmojiSkinTone } from \"./emoji/emoji-index\";\nexport { rememberEmoji } from \"./emoji/emoji-index\";\nexport type { FileDropDetails, FileDropOptions, FileDropRejection, FileDropTargetProps } from \"./FileDropTarget\";\nexport { FileDropTarget, fileDropTarget } from \"./FileDropTarget\";\nexport type { FileDropzoneProps, ImageCropperProps, ImageInputProps } from \"./FileInputs\";\nexport { FileDropzone, ImageCropper, ImageInput } from \"./FileInputs\";\nexport type { DateContext, FieldProps, MaybeAccessor, ValueFieldProps } from \"./field-contract\";\nexport { DEFAULT_ICON_GROUPS, DEFAULT_ICON_OPTIONS } from \"./icon-options\";\nexport type {\n ImageCropAspect,\n ImageCropOutput,\n ImageCropRect,\n ImageCropRotation,\n ImageCropSize,\n ImageCropSource,\n ImageCropState,\n} from \"./image-crop\";\nexport {\n clampImageCropRect,\n createCroppedImageCanvas,\n createCroppedImageDataUrl,\n getInitialImageCropRect,\n imageCropRectToPixels,\n normalizeImageCropRotation,\n resizeImageCropAroundCenter,\n rotateImageCropRight,\n} from \"./image-crop\";\nexport type {\n MultiSelectFetchDataFn,\n MultiSelectInputProps,\n MultiSelectOption,\n} from \"./MultiSelectInput\";\nexport { MultiSelectInput } from \"./MultiSelectInput\";\nexport type { MarkdownEditorProps } from \"./markdown/MarkdownEditor\";\nexport { MarkdownEditor } from \"./markdown/MarkdownEditor\";\nexport type { NumberInputProps } from \"./NumberInput\";\nexport { NumberInput } from \"./NumberInput\";\nexport type { QrScannerError, QrScannerProps } from \"./QrScanner\";\nexport { QrScanner } from \"./QrScanner\";\nexport type { ChoiceAppearance, SelectGridSize, SelectGroup, SelectOption, SelectProps, SelectSourceOption, SelectView } from \"./Select\";\nexport { Select } from \"./Select\";\nexport type { SelectChipOption, SelectChipProps } from \"./SelectChip\";\nexport { SelectChip } from \"./SelectChip\";\nexport type { SignatureInputProps } from \"./SignatureInput\";\nexport { SignatureInput } from \"./SignatureInput\";\nexport type { IconInputProps, IconOption } from \"./SpecialInputs\";\nexport { IconInput } from \"./SpecialInputs\";\nexport type { SwitchProps } from \"./Switch\";\nexport { Switch } from \"./Switch\";\nexport type { SignaturePngOptions, SignatureValue } from \"./signature\";\nexport { parseSignature, signatureToPng } from \"./signature\";\nexport type { TagEditorItem, TagEditorLabels, TagEditorProps, TagEditorValue } from \"./TagEditor\";\nexport { TagEditor } from \"./TagEditor\";\nexport type { TagsInputProps } from \"./TagsInput\";\nexport { TagsInput } from \"./TagsInput\";\nexport type {\n TemplateEditorLayout,\n TemplateEditorProps,\n TemplatePreviewProps,\n TemplateSampleDataProps,\n TemplateVariable,\n TemplateVariableKind,\n} from \"./TemplateEditor\";\nexport {\n createTemplateEditorPanesLayout,\n TemplateEditor,\n TemplatePreview,\n TemplateSampleData,\n} from \"./TemplateEditor\";\nexport type { TextInputProps } from \"./TextInput\";\nexport { TextInput } from \"./TextInput\";\n"],"mappings":"AACA,SAAS,kBAAkB,QAAQ,sBAAsB;AAMzD,SAAS,kBAAkB,QAAQ,sBAAsB;AAEzD,SAAS,QAAQ,QAAQ,YAAY;AAErC,SAAS,YAAY,QAAQ,gBAAgB;AAE7C,SAAS,WAAW,QAAQ,eAAe;AAM3C,SAAS,UAAU,EAAE,QAAQ,EAAE,MAAM,QAAQ,gBAAgB;AAE7D,SAAS,QAAQ,QAAQ,YAAY;AAQrC,SAAS,aAAa,QAAQ,cAAc;AAU5C,SAAS,UAAU,EAAE,eAAe,EAAE,cAAc,QAAQ,cAAc;AAE1E,SAAS,WAAW,QAAQ,qBAAqB;AAEjD,SAAS,aAAa,QAAQ,qBAAqB;AAEnD,SAAS,cAAc,EAAE,cAAc,QAAQ,kBAAkB;AAEjE,SAAS,YAAY,EAAE,YAAY,EAAE,UAAU,QAAQ,cAAc;AAErE,SAAS,mBAAmB,EAAE,oBAAoB,QAAQ,gBAAgB;AAU1E,SACE,kBAAkB,EAClB,wBAAwB,EACxB,yBAAyB,EACzB,uBAAuB,EACvB,qBAAqB,EACrB,0BAA0B,EAC1B,2BAA2B,EAC3B,oBAAoB,QACf,cAAc;AAMrB,SAAS,gBAAgB,QAAQ,oBAAoB;AAErD,SAAS,cAAc,QAAQ,2BAA2B;AAE1D,SAAS,WAAW,QAAQ,eAAe;AAE3C,SAAS,SAAS,QAAQ,aAAa;AAEvC,SAAS,MAAM,QAAQ,UAAU;AAEjC,SAAS,UAAU,QAAQ,cAAc;AAEzC,SAAS,cAAc,QAAQ,kBAAkB;AAEjD,SAAS,SAAS,QAAQ,iBAAiB;AAE3C,SAAS,MAAM,QAAQ,UAAU;AAEjC,SAAS,cAAc,EAAE,cAAc,QAAQ,aAAa;AAE5D,SAAS,SAAS,QAAQ,aAAa;AAEvC,SAAS,SAAS,QAAQ,aAAa;AASvC,SACE,+BAA+B,EAC/B,cAAc,EACd,eAAe,EACf,kBAAkB,QACb,kBAAkB;AAEzB,SAAS,SAAS,QAAQ,aAAa","ignoreList":[]}
1
+ {"version":3,"names":[],"sources":["inputs/index.ts"],"sourcesContent":["export type { AutocompleteEditorProps } from \"./AutocompleteEditor\";\nexport { AutocompleteEditor } from \"./AutocompleteEditor\";\nexport type {\n AutocompleteSelectOption,\n AutocompleteSelectProps,\n AutocompleteSelectSearchResult,\n} from \"./AutocompleteSelect\";\nexport { AutocompleteSelect } from \"./AutocompleteSelect\";\nexport type { CheckboxProps } from \"./Checkbox\";\nexport { Checkbox } from \"./Checkbox\";\nexport type { CheckboxCardProps } from \"./CheckboxCard\";\nexport { CheckboxCard } from \"./CheckboxCard\";\nexport type { ChoiceChipOption, ChoiceChipsProps } from \"./ChoiceChips\";\nexport { ChoiceChips } from \"./ChoiceChips\";\nexport type {\n ColorInputProps,\n PinInputProps,\n SliderProps,\n} from \"./ChoiceInputs\";\nexport { ColorInput, PinInput, Slider } from \"./ChoiceInputs\";\nexport type { ComboboxOption, ComboboxProps } from \"./Combobox\";\nexport { Combobox } from \"./Combobox\";\nexport type { ChoiceOption, ChoiceOptionsLoader } from \"./choice\";\nexport type {\n Completion,\n QueryContext,\n SuggestContext,\n Suggestion,\n} from \"./completion\";\nexport { abbreviations } from \"./completion\";\nexport type {\n DatePickerBaseProps,\n DatePickerProps,\n DatePreset,\n DateRangePickerProps,\n DateRangeValue,\n DateTimePickerProps,\n DurationPreset,\n} from \"./DatePicker\";\nexport { DatePicker, DateRangePicker, DateTimePicker } from \"./DatePicker\";\nexport type { EmojiPickerPopoverProps, EmojiPickerProps } from \"./emoji/EmojiPicker\";\nexport { EmojiPicker } from \"./emoji/EmojiPicker\";\nexport type { EmojiSkinTone } from \"./emoji/emoji-index\";\nexport { rememberEmoji } from \"./emoji/emoji-index\";\nexport type { FileDropDetails, FileDropOptions, FileDropRejection, FileDropTargetProps } from \"./FileDropTarget\";\nexport { FileDropTarget, fileDropTarget } from \"./FileDropTarget\";\nexport type { FileDropzoneProps, ImageCropperProps, ImageInputProps } from \"./FileInputs\";\nexport { FileDropzone, ImageCropper, ImageInput } from \"./FileInputs\";\nexport type { DateContext, FieldProps, MaybeAccessor, ValueFieldProps } from \"./field-contract\";\nexport { DEFAULT_ICON_GROUPS, DEFAULT_ICON_OPTIONS } from \"./icon-options\";\nexport type {\n ImageCropAspect,\n ImageCropOutput,\n ImageCropRect,\n ImageCropRotation,\n ImageCropSize,\n ImageCropSource,\n ImageCropState,\n} from \"./image-crop\";\nexport {\n clampImageCropRect,\n createCroppedImageCanvas,\n createCroppedImageDataUrl,\n getInitialImageCropRect,\n imageCropRectToPixels,\n normalizeImageCropRotation,\n resizeImageCropAroundCenter,\n rotateImageCropRight,\n} from \"./image-crop\";\nexport type {\n MultiSelectFetchDataFn,\n MultiSelectInputProps,\n MultiSelectOption,\n} from \"./MultiSelectInput\";\nexport { MultiSelectInput } from \"./MultiSelectInput\";\nexport type { MarkdownEditorProps } from \"./markdown/MarkdownEditor\";\nexport { MarkdownEditor } from \"./markdown/MarkdownEditor\";\nexport type { NumberInputProps } from \"./NumberInput\";\nexport { NumberInput } from \"./NumberInput\";\nexport type { QrScannerError, QrScannerProps } from \"./QrScanner\";\nexport { QrScanner } from \"./QrScanner\";\nexport type {\n RichSelectFact,\n RichSelectFooter,\n RichSelectItem,\n RichSelectProps,\n RichSelectSection,\n RichSelectStatus,\n} from \"./RichSelect\";\nexport { RichSelect, RichSelectFacts } from \"./RichSelect\";\nexport type { ChoiceAppearance, SelectGridSize, SelectGroup, SelectOption, SelectProps, SelectSourceOption, SelectView } from \"./Select\";\nexport { Select } from \"./Select\";\nexport type { SelectChipOption, SelectChipProps } from \"./SelectChip\";\nexport { SelectChip } from \"./SelectChip\";\nexport type { SignatureInputProps } from \"./SignatureInput\";\nexport { SignatureInput } from \"./SignatureInput\";\nexport type { IconInputProps, IconOption } from \"./SpecialInputs\";\nexport { IconInput } from \"./SpecialInputs\";\nexport type { SwitchProps } from \"./Switch\";\nexport { Switch } from \"./Switch\";\nexport type { SignaturePngOptions, SignatureValue } from \"./signature\";\nexport { parseSignature, signatureToPng } from \"./signature\";\nexport type { TagEditorItem, TagEditorLabels, TagEditorProps, TagEditorValue } from \"./TagEditor\";\nexport { TagEditor } from \"./TagEditor\";\nexport type { TagsInputProps } from \"./TagsInput\";\nexport { TagsInput } from \"./TagsInput\";\nexport type {\n TemplateEditorLayout,\n TemplateEditorProps,\n TemplatePreviewProps,\n TemplateSampleDataProps,\n TemplateVariable,\n TemplateVariableKind,\n} from \"./TemplateEditor\";\nexport {\n createTemplateEditorPanesLayout,\n TemplateEditor,\n TemplatePreview,\n TemplateSampleData,\n} from \"./TemplateEditor\";\nexport type { TextInputProps } from \"./TextInput\";\nexport { TextInput } from \"./TextInput\";\n"],"mappings":"AACA,SAAS,kBAAkB,QAAQ,sBAAsB;AAMzD,SAAS,kBAAkB,QAAQ,sBAAsB;AAEzD,SAAS,QAAQ,QAAQ,YAAY;AAErC,SAAS,YAAY,QAAQ,gBAAgB;AAE7C,SAAS,WAAW,QAAQ,eAAe;AAM3C,SAAS,UAAU,EAAE,QAAQ,EAAE,MAAM,QAAQ,gBAAgB;AAE7D,SAAS,QAAQ,QAAQ,YAAY;AAQrC,SAAS,aAAa,QAAQ,cAAc;AAU5C,SAAS,UAAU,EAAE,eAAe,EAAE,cAAc,QAAQ,cAAc;AAE1E,SAAS,WAAW,QAAQ,qBAAqB;AAEjD,SAAS,aAAa,QAAQ,qBAAqB;AAEnD,SAAS,cAAc,EAAE,cAAc,QAAQ,kBAAkB;AAEjE,SAAS,YAAY,EAAE,YAAY,EAAE,UAAU,QAAQ,cAAc;AAErE,SAAS,mBAAmB,EAAE,oBAAoB,QAAQ,gBAAgB;AAU1E,SACE,kBAAkB,EAClB,wBAAwB,EACxB,yBAAyB,EACzB,uBAAuB,EACvB,qBAAqB,EACrB,0BAA0B,EAC1B,2BAA2B,EAC3B,oBAAoB,QACf,cAAc;AAMrB,SAAS,gBAAgB,QAAQ,oBAAoB;AAErD,SAAS,cAAc,QAAQ,2BAA2B;AAE1D,SAAS,WAAW,QAAQ,eAAe;AAE3C,SAAS,SAAS,QAAQ,aAAa;AASvC,SAAS,UAAU,EAAE,eAAe,QAAQ,cAAc;AAE1D,SAAS,MAAM,QAAQ,UAAU;AAEjC,SAAS,UAAU,QAAQ,cAAc;AAEzC,SAAS,cAAc,QAAQ,kBAAkB;AAEjD,SAAS,SAAS,QAAQ,iBAAiB;AAE3C,SAAS,MAAM,QAAQ,UAAU;AAEjC,SAAS,cAAc,EAAE,cAAc,QAAQ,aAAa;AAE5D,SAAS,SAAS,QAAQ,aAAa;AAEvC,SAAS,SAAS,QAAQ,aAAa;AASvC,SACE,+BAA+B,EAC/B,cAAc,EACd,eAAe,EACf,kBAAkB,QACb,kBAAkB;AAEzB,SAAS,SAAS,QAAQ,aAAa","ignoreList":[]}