@k2b/ui 0.9.0 → 0.10.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 (181) hide show
  1. package/dist/browser/actions/Button.js +15 -7
  2. package/dist/browser/actions/Button.js.map +1 -1
  3. package/dist/browser/actions/ContextMenu.js +55 -15
  4. package/dist/browser/actions/ContextMenu.js.map +1 -1
  5. package/dist/browser/actions/Dropdown.js +39 -15
  6. package/dist/browser/actions/Dropdown.js.map +1 -1
  7. package/dist/browser/actions/FilterChip.js +1 -7
  8. package/dist/browser/actions/FilterChip.js.map +1 -1
  9. package/dist/browser/actions/SplitButton.js +0 -3
  10. package/dist/browser/actions/SplitButton.js.map +1 -1
  11. package/dist/browser/chat/ChatComposer.js +78 -91
  12. package/dist/browser/chat/ChatComposer.js.map +1 -1
  13. package/dist/browser/chat/ChatContextPopup.js +47 -21
  14. package/dist/browser/chat/ChatContextPopup.js.map +1 -1
  15. package/dist/browser/chat/ChatPrimitives.js +221 -232
  16. package/dist/browser/chat/ChatPrimitives.js.map +1 -1
  17. package/dist/browser/chat/index.js +3 -2
  18. package/dist/browser/chat/index.js.map +1 -1
  19. package/dist/browser/content/Chart.js +99 -106
  20. package/dist/browser/content/Chart.js.map +1 -1
  21. package/dist/browser/content/ChartExplorer.js +3 -6
  22. package/dist/browser/content/ChartExplorer.js.map +1 -1
  23. package/dist/browser/content/FileBrowser.js +1 -1
  24. package/dist/browser/content/FileBrowser.js.map +1 -1
  25. package/dist/browser/content/FileTree.js +1 -1
  26. package/dist/browser/content/FileTree.js.map +1 -1
  27. package/dist/browser/content/FileView.js +304 -287
  28. package/dist/browser/content/FileView.js.map +1 -1
  29. package/dist/browser/content/Lightbox.js +18 -0
  30. package/dist/browser/content/Lightbox.js.map +1 -1
  31. package/dist/browser/content/MarkdownView.js +8 -1
  32. package/dist/browser/content/MarkdownView.js.map +1 -1
  33. package/dist/browser/content/PdfPreview.js +68 -43
  34. package/dist/browser/content/PdfPreview.js.map +1 -1
  35. package/dist/browser/content/ZoomPanViewport.js +51 -52
  36. package/dist/browser/content/ZoomPanViewport.js.map +1 -1
  37. package/dist/browser/feedback/HoverPreview.js +391 -0
  38. package/dist/browser/feedback/HoverPreview.js.map +1 -0
  39. package/dist/browser/feedback/Tooltip.js +50 -8
  40. package/dist/browser/feedback/Tooltip.js.map +1 -1
  41. package/dist/browser/feedback/dialog-core.js +21 -3
  42. package/dist/browser/feedback/dialog-core.js.map +1 -1
  43. package/dist/browser/feedback/index.js +1 -0
  44. package/dist/browser/feedback/index.js.map +1 -1
  45. package/dist/browser/inputs/AutocompleteEditor.js +5 -4
  46. package/dist/browser/inputs/AutocompleteEditor.js.map +1 -1
  47. package/dist/browser/inputs/DatePicker.js +10 -0
  48. package/dist/browser/inputs/DatePicker.js.map +1 -1
  49. package/dist/browser/inputs/FileInputs.js +46 -36
  50. package/dist/browser/inputs/FileInputs.js.map +1 -1
  51. package/dist/browser/inputs/SelectChip.js +2 -1
  52. package/dist/browser/inputs/SelectChip.js.map +1 -1
  53. package/dist/browser/inputs/choice.js +5 -1
  54. package/dist/browser/inputs/choice.js.map +1 -1
  55. package/dist/browser/inputs/markdown/MarkdownEditor.js +173 -173
  56. package/dist/browser/inputs/markdown/MarkdownEditor.js.map +1 -1
  57. package/dist/browser/inputs/markdown/Toolbar.js +31 -34
  58. package/dist/browser/inputs/markdown/Toolbar.js.map +1 -1
  59. package/dist/browser/internal/focus-return.js +61 -0
  60. package/dist/browser/internal/focus-return.js.map +1 -0
  61. package/dist/browser/layout/AppOverview.js +1 -1
  62. package/dist/browser/layout/AppOverview.js.map +1 -1
  63. package/dist/browser/layout/DetailPanel.js +16 -15
  64. package/dist/browser/layout/DetailPanel.js.map +1 -1
  65. package/dist/browser/layout/FloatingWindow.js +3 -1
  66. package/dist/browser/layout/FloatingWindow.js.map +1 -1
  67. package/dist/browser/layout/PanelDialog.js +10 -9
  68. package/dist/browser/layout/PanelDialog.js.map +1 -1
  69. package/dist/browser/layout/Panes.js +82 -81
  70. package/dist/browser/layout/Panes.js.map +1 -1
  71. package/dist/browser/layout/SidebarItemPreview.js +48 -136
  72. package/dist/browser/layout/SidebarItemPreview.js.map +1 -1
  73. package/dist/browser/layout/app-workspace-controller.js +5 -2
  74. package/dist/browser/layout/app-workspace-controller.js.map +1 -1
  75. package/dist/browser/surfaces/ProgressBar.js.map +1 -1
  76. package/dist/browser/surfaces/ProgressRing.js +72 -0
  77. package/dist/browser/surfaces/ProgressRing.js.map +1 -0
  78. package/dist/browser/surfaces/index.js +1 -0
  79. package/dist/browser/surfaces/index.js.map +1 -1
  80. package/dist/ssr/actions/Button.js +15 -7
  81. package/dist/ssr/actions/Button.js.map +1 -1
  82. package/dist/ssr/actions/ContextMenu.js +55 -15
  83. package/dist/ssr/actions/ContextMenu.js.map +1 -1
  84. package/dist/ssr/actions/Dropdown.js +31 -12
  85. package/dist/ssr/actions/Dropdown.js.map +1 -1
  86. package/dist/ssr/actions/FilterChip.js +1 -7
  87. package/dist/ssr/actions/FilterChip.js.map +1 -1
  88. package/dist/ssr/actions/SplitButton.js +0 -3
  89. package/dist/ssr/actions/SplitButton.js.map +1 -1
  90. package/dist/ssr/chat/ChatComposer.js +61 -10
  91. package/dist/ssr/chat/ChatComposer.js.map +1 -1
  92. package/dist/ssr/chat/ChatContextPopup.js +19 -5
  93. package/dist/ssr/chat/ChatContextPopup.js.map +1 -1
  94. package/dist/ssr/chat/ChatPrimitives.js +104 -74
  95. package/dist/ssr/chat/ChatPrimitives.js.map +1 -1
  96. package/dist/ssr/chat/index.js +3 -2
  97. package/dist/ssr/chat/index.js.map +1 -1
  98. package/dist/ssr/content/Chart.js +22 -11
  99. package/dist/ssr/content/Chart.js.map +1 -1
  100. package/dist/ssr/content/ChartExplorer.js +3 -6
  101. package/dist/ssr/content/ChartExplorer.js.map +1 -1
  102. package/dist/ssr/content/FileBrowser.js +1 -1
  103. package/dist/ssr/content/FileBrowser.js.map +1 -1
  104. package/dist/ssr/content/FileTree.js +1 -1
  105. package/dist/ssr/content/FileTree.js.map +1 -1
  106. package/dist/ssr/content/FileView.js +105 -33
  107. package/dist/ssr/content/FileView.js.map +1 -1
  108. package/dist/ssr/content/Lightbox.js +17 -0
  109. package/dist/ssr/content/Lightbox.js.map +1 -1
  110. package/dist/ssr/content/MarkdownView.js +8 -1
  111. package/dist/ssr/content/MarkdownView.js.map +1 -1
  112. package/dist/ssr/content/PdfPreview.js +44 -14
  113. package/dist/ssr/content/PdfPreview.js.map +1 -1
  114. package/dist/ssr/content/ZoomPanViewport.js +11 -3
  115. package/dist/ssr/content/ZoomPanViewport.js.map +1 -1
  116. package/dist/ssr/feedback/HoverPreview.js +360 -0
  117. package/dist/ssr/feedback/HoverPreview.js.map +1 -0
  118. package/dist/ssr/feedback/Tooltip.js +50 -8
  119. package/dist/ssr/feedback/Tooltip.js.map +1 -1
  120. package/dist/ssr/feedback/dialog-core.js +21 -3
  121. package/dist/ssr/feedback/dialog-core.js.map +1 -1
  122. package/dist/ssr/feedback/index.js +1 -0
  123. package/dist/ssr/feedback/index.js.map +1 -1
  124. package/dist/ssr/inputs/AutocompleteEditor.js +5 -4
  125. package/dist/ssr/inputs/AutocompleteEditor.js.map +1 -1
  126. package/dist/ssr/inputs/DatePicker.js +5 -0
  127. package/dist/ssr/inputs/DatePicker.js.map +1 -1
  128. package/dist/ssr/inputs/FileInputs.js +29 -11
  129. package/dist/ssr/inputs/FileInputs.js.map +1 -1
  130. package/dist/ssr/inputs/SelectChip.js +2 -1
  131. package/dist/ssr/inputs/SelectChip.js.map +1 -1
  132. package/dist/ssr/inputs/choice.js +5 -1
  133. package/dist/ssr/inputs/choice.js.map +1 -1
  134. package/dist/ssr/inputs/markdown/MarkdownEditor.js +46 -10
  135. package/dist/ssr/inputs/markdown/MarkdownEditor.js.map +1 -1
  136. package/dist/ssr/inputs/markdown/Toolbar.js +30 -2
  137. package/dist/ssr/inputs/markdown/Toolbar.js.map +1 -1
  138. package/dist/ssr/internal/focus-return.js +61 -0
  139. package/dist/ssr/internal/focus-return.js.map +1 -0
  140. package/dist/ssr/layout/AppOverview.js +1 -1
  141. package/dist/ssr/layout/AppOverview.js.map +1 -1
  142. package/dist/ssr/layout/DetailPanel.js +16 -15
  143. package/dist/ssr/layout/DetailPanel.js.map +1 -1
  144. package/dist/ssr/layout/FloatingWindow.js +3 -1
  145. package/dist/ssr/layout/FloatingWindow.js.map +1 -1
  146. package/dist/ssr/layout/PanelDialog.js +10 -9
  147. package/dist/ssr/layout/PanelDialog.js.map +1 -1
  148. package/dist/ssr/layout/Panes.js +39 -8
  149. package/dist/ssr/layout/Panes.js.map +1 -1
  150. package/dist/ssr/layout/SidebarItemPreview.js +36 -108
  151. package/dist/ssr/layout/SidebarItemPreview.js.map +1 -1
  152. package/dist/ssr/layout/app-workspace-controller.js +5 -2
  153. package/dist/ssr/layout/app-workspace-controller.js.map +1 -1
  154. package/dist/ssr/surfaces/ProgressBar.js.map +1 -1
  155. package/dist/ssr/surfaces/ProgressRing.js +31 -0
  156. package/dist/ssr/surfaces/ProgressRing.js.map +1 -0
  157. package/dist/ssr/surfaces/index.js +1 -0
  158. package/dist/ssr/surfaces/index.js.map +1 -1
  159. package/dist/styles.css +1 -1
  160. package/dist/tabler-icons-15sezdfp.woff2 +0 -0
  161. package/dist/tabler.css +2 -2
  162. package/dist/types/actions/Button.d.ts +5 -0
  163. package/dist/types/actions/Dropdown.d.ts +5 -1
  164. package/dist/types/actions/SplitButton.d.ts +1 -0
  165. package/dist/types/chat/ChatContextPopup.d.ts +8 -0
  166. package/dist/types/chat/index.d.ts +3 -2
  167. package/dist/types/feedback/HoverPreview.d.ts +83 -0
  168. package/dist/types/feedback/Tooltip.d.ts +6 -0
  169. package/dist/types/feedback/index.d.ts +2 -0
  170. package/dist/types/feedback/prompts.d.ts +9 -6
  171. package/dist/types/inputs/SelectChip.d.ts +1 -0
  172. package/dist/types/inputs/completion/overlay.d.ts +3 -1
  173. package/dist/types/internal/focus-return.d.ts +20 -0
  174. package/dist/types/intl/Format.d.ts +16 -8
  175. package/dist/types/layout/BottomSheet.d.ts +6 -1
  176. package/dist/types/layout/SidebarItemPreview.d.ts +1 -1
  177. package/dist/types/surfaces/ProgressBar.d.ts +1 -1
  178. package/dist/types/surfaces/ProgressRing.d.ts +13 -0
  179. package/dist/types/surfaces/index.d.ts +2 -0
  180. package/package.json +9 -8
  181. package/dist/tabler-icons-q30jt7jk.woff2 +0 -0
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["actions/Dropdown.tsx"],"sourcesContent":["import {\n createContext,\n createEffect,\n createSignal,\n createUniqueId,\n For,\n type JSX,\n onCleanup,\n onMount,\n Show,\n splitProps,\n useContext,\n} from \"solid-js\";\nimport { Tooltip, type TooltipPlacement } from \"../feedback/Tooltip\";\nimport { useUiMessages } from \"../intl/messages\";\nimport { Button, type ButtonProps, type ButtonSize, type ButtonVariant } from \"./Button\";\n\n// Resolved outside JSX: a conditional attribute compiles to a lazy memo, which would be created inside the click handler.\nconst selectAction = (item: { action?: () => void }) => item.action;\n\nexport type DropdownPosition = \"bottom-right\" | \"bottom-left\" | \"top-right\" | \"top-left\" | \"right-start\";\n\nexport type DropdownActionBase = {\n class?: string;\n disabled?: boolean;\n icon?: string;\n image?: string;\n label: string;\n description?: string;\n variant?: \"danger\";\n};\n\nexport type DropdownAction =\n | (DropdownActionBase & {\n action: () => void;\n href?: never;\n external?: never;\n })\n | (DropdownActionBase & {\n href: string;\n external?: boolean;\n action?: never;\n })\n | (DropdownActionBase & {\n disabled: true;\n action?: never;\n href?: never;\n external?: never;\n });\n\n/** Declarative radio or checkbox row for compact action menus. */\nexport type DropdownChoice = DropdownActionBase & {\n action: () => void;\n checked: boolean | (() => boolean);\n choice: \"checkbox\" | \"radio\";\n closeOnSelect?: boolean;\n color?: string;\n};\n\nexport type DropdownSection = {\n sectionLabel?: string;\n items: readonly (DropdownAction | DropdownChoice)[];\n};\n\nexport type DropdownItem = DropdownAction | DropdownChoice | DropdownSection;\n\nexport type DropdownProps = {\n items: readonly DropdownItem[];\n children: JSX.Element;\n position?: DropdownPosition | (() => DropdownPosition);\n /** Larger menu rows and typography for touch. Defaults to `default`. */\n variant?: \"default\" | \"touch\";\n /** Menu width as a CSS length. Defaults to `12rem`, or `18rem` for touch. */\n width?: string;\n class?: string;\n menuClass?: string;\n onClose?: () => void;\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n disabled?: boolean;\n label?: string;\n align?: \"start\" | \"end\";\n};\n\nexport type DropdownTriggerProps = Omit<\n ButtonProps,\n \"aria-controls\" | \"aria-expanded\" | \"aria-haspopup\" | \"children\" | \"disabled\" | \"onClick\" | \"onKeyDown\"\n> & {\n children: JSX.Element;\n /** Use `plain` when a specialized component class owns the complete visual treatment. */\n appearance?: \"button\" | \"plain\";\n disabled?: boolean;\n iconOnly?: boolean;\n label?: string;\n size?: ButtonSize;\n tooltip?: JSX.Element | false;\n tooltipDelay?: number;\n tooltipPlacement?: TooltipPlacement;\n variant?: ButtonVariant;\n};\n\nexport type DropdownItemProps = {\n children: JSX.Element;\n icon?: string;\n image?: string;\n description?: string;\n disabled?: boolean;\n danger?: boolean;\n variant?: \"danger\";\n href?: string;\n external?: boolean;\n onSelect?: () => void;\n class?: string;\n};\n\ntype MenuContextValue = {\n close: (restoreFocus?: boolean) => void;\n};\n\ntype DropdownContextValue = {\n disabled: () => boolean;\n menuId: string;\n open: () => boolean;\n registerTrigger: (element: HTMLButtonElement) => void;\n toggle: () => void;\n triggerKeyDown: JSX.EventHandlerUnion<HTMLButtonElement, KeyboardEvent>;\n};\n\nconst MenuContext = createContext<MenuContextValue>();\nconst DropdownContext = createContext<DropdownContextValue>();\n\nconst actionableItems = (menu: HTMLElement | undefined): HTMLElement[] =>\n menu\n ? Array.from(\n menu.querySelectorAll<HTMLElement>(\n [\n \"[role='menuitem']:not([aria-disabled='true'])\",\n \"[role='menuitemcheckbox']:not([aria-disabled='true'])\",\n \"[role='menuitemradio']:not([aria-disabled='true'])\",\n ].join(\", \"),\n ),\n )\n : [];\n\nconst focusMenuItem = (menu: HTMLElement | undefined, index: number): void => {\n const items = actionableItems(menu);\n if (items.length === 0) return;\n items[(index + items.length) % items.length]?.focus();\n};\n\nexport const dropdownPosition = (\n trigger: DOMRect,\n menu: Pick<DOMRect, \"width\" | \"height\">,\n position: DropdownPosition,\n viewport: { width: number; height: number },\n gap = 4,\n): { left: number; top: number } => {\n let left = trigger.left;\n let top = trigger.bottom + gap;\n\n if (position === \"bottom-left\" || position === \"top-left\") left = trigger.right - menu.width;\n if (position === \"top-right\" || position === \"top-left\") top = trigger.top - menu.height - gap;\n if (position === \"right-start\") {\n left = trigger.right + gap;\n top = trigger.top;\n }\n\n return {\n left: Math.max(8, Math.min(left, viewport.width - menu.width - 8)),\n top: Math.max(8, Math.min(top, viewport.height - menu.height - 8)),\n };\n};\n\nconst itemContent = (props: { description?: string; icon?: string; image?: string; children: JSX.Element }): JSX.Element => (\n <>\n <Show when={props.image} fallback={<Show when={props.icon}>{(icon) => <i class={icon()} aria-hidden=\"true\" />}</Show>}>\n {(image) => <img class=\"k2b-dropdown__image\" src={image()} alt=\"\" />}\n </Show>\n <span class=\"k2b-dropdown__copy\">\n <span>{props.children}</span>\n <Show when={props.description}>{(description) => <small>{description()}</small>}</Show>\n </span>\n </>\n);\n\nexport function DropdownItem(props: DropdownItemProps): JSX.Element {\n const menu = useContext(MenuContext);\n const danger = () => props.danger || props.variant === \"danger\";\n const content = itemContent(props);\n\n return (\n <Show\n when={!props.disabled ? props.href : undefined}\n fallback={\n <button\n type=\"button\"\n role=\"menuitem\"\n tabIndex={-1}\n class={`k2b-dropdown__item ${props.class ?? \"\"}`}\n data-danger={danger() ? \"true\" : undefined}\n disabled={props.disabled}\n aria-disabled={props.disabled ? \"true\" : undefined}\n onClick={(event) => {\n event.preventDefault();\n event.stopPropagation();\n menu?.close();\n props.onSelect?.();\n }}\n >\n {content}\n </button>\n }\n >\n {(href) => (\n <a\n href={href()}\n target={props.external ? \"_blank\" : undefined}\n rel={props.external ? \"noopener noreferrer\" : undefined}\n role=\"menuitem\"\n tabIndex={-1}\n class={`k2b-dropdown__item ${props.class ?? \"\"}`}\n data-danger={danger() ? \"true\" : undefined}\n onClick={() => {\n menu?.close(false);\n props.onSelect?.();\n }}\n >\n {content}\n </a>\n )}\n </Show>\n );\n}\n\nfunction DropdownChoiceItem(props: DropdownChoice): JSX.Element {\n const menu = useContext(MenuContext);\n const checked = () => (typeof props.checked === \"function\" ? props.checked() : props.checked);\n return (\n // biome-ignore lint/a11y/useAriaPropsSupportedByRole: the runtime role is always menuitemcheckbox or menuitemradio, both of which support aria-checked.\n <button\n type=\"button\"\n role={props.choice === \"checkbox\" ? \"menuitemcheckbox\" : \"menuitemradio\"}\n aria-checked={checked()}\n aria-disabled={props.disabled ? \"true\" : undefined}\n tabIndex={-1}\n class={`k2b-dropdown__item ${props.class ?? \"\"}`}\n data-selected={checked() ? \"true\" : undefined}\n disabled={props.disabled}\n onClick={(event) => {\n event.preventDefault();\n event.stopPropagation();\n if (props.closeOnSelect !== false) menu?.close();\n props.action();\n }}\n >\n <Show when={props.choice === \"checkbox\"}>\n <span class=\"k2b-dropdown__checkbox\" aria-hidden=\"true\">\n <Show when={checked()}>\n <i class=\"ti ti-check\" />\n </Show>\n </span>\n </Show>\n <Show when={props.image} fallback={<Show when={props.icon}>{(icon) => <i class={icon()} aria-hidden=\"true\" />}</Show>}>\n {(image) => <img class=\"k2b-dropdown__image\" src={image()} alt=\"\" />}\n </Show>\n <Show when={props.color}>\n {(color) => <span class=\"k2b-dropdown__color\" style={{ \"--k2b-dropdown-color\": color() }} aria-hidden=\"true\" />}\n </Show>\n <span class=\"k2b-dropdown__copy\">\n <span>{props.label}</span>\n <Show when={props.description}>{(description) => <small>{description()}</small>}</Show>\n </span>\n <Show when={props.choice === \"radio\" && checked()}>\n <i class=\"ti ti-check k2b-dropdown__check\" aria-hidden=\"true\" />\n </Show>\n </button>\n );\n}\n\nexport function DropdownItems(props: { items: readonly DropdownItem[]; close: (restoreFocus?: boolean) => void }): JSX.Element {\n const messages = useUiMessages();\n const renderItem = (item: DropdownAction | DropdownChoice): JSX.Element =>\n \"choice\" in item ? (\n <DropdownChoiceItem {...item} />\n ) : (\n <DropdownItem\n icon={item.icon}\n image={item.image}\n description={item.description}\n variant={item.variant}\n disabled={item.disabled}\n class={item.class}\n href={\"href\" in item ? item.href : undefined}\n external={\"external\" in item ? item.external : undefined}\n onSelect={selectAction(item)}\n >\n {item.label}\n </DropdownItem>\n );\n\n return (\n <MenuContext.Provider value={{ close: props.close }}>\n <For each={props.items}>\n {(item, index) => (\n <Show when={\"items\" in item} fallback={renderItem(item as DropdownAction | DropdownChoice)}>\n <div\n class=\"k2b-dropdown__section\"\n data-divided={index() > 0 ? \"true\" : undefined}\n role=\"group\"\n aria-label={(item as DropdownSection).sectionLabel ?? messages().actions}\n >\n <Show when={(item as DropdownSection).sectionLabel}>{(label) => <div class=\"k2b-dropdown__label\">{label()}</div>}</Show>\n <For each={(item as DropdownSection).items}>{renderItem}</For>\n </div>\n </Show>\n )}\n </For>\n </MenuContext.Provider>\n );\n}\n\nfunction DropdownTrigger(props: DropdownTriggerProps): JSX.Element {\n const context = useContext(DropdownContext);\n if (!context) throw new Error(\"Dropdown.Trigger must be used inside Dropdown.Root\");\n const [local, rest] = splitProps(props, [\n \"appearance\",\n \"children\",\n \"class\",\n \"disabled\",\n \"iconOnly\",\n \"label\",\n \"ref\",\n \"size\",\n \"tabIndex\",\n \"tooltip\",\n \"tooltipDelay\",\n \"tooltipPlacement\",\n \"type\",\n \"variant\",\n ]);\n let target: HTMLButtonElement | undefined;\n const disabled = () => Boolean(context.disabled() || local.disabled);\n const register = (element: HTMLButtonElement) => {\n target = element;\n context.registerTrigger(element);\n if (typeof local.ref === \"function\") local.ref(element);\n };\n const click: JSX.EventHandlerUnion<HTMLButtonElement, MouseEvent> = (event) => {\n event.stopPropagation();\n context.toggle();\n };\n\n if (local.appearance !== \"plain\") {\n return (\n <Button\n {...rest}\n ref={register}\n aria-controls={context.menuId}\n aria-expanded={context.open()}\n aria-haspopup=\"menu\"\n aria-label={local.label}\n disabled={disabled()}\n tabIndex={disabled() ? -1 : local.tabIndex}\n onClick={click}\n onKeyDown={context.triggerKeyDown}\n type={local.type ?? \"button\"}\n class={`${local.iconOnly ? \"k2b-icon-button\" : \"\"} k2b-dropdown__trigger ${local.class ?? \"\"}`}\n size={local.size}\n variant={local.variant ?? (local.iconOnly ? \"ghost\" : undefined)}\n tooltip={local.tooltip}\n tooltipDelay={local.tooltipDelay}\n tooltipPlacement={local.tooltipPlacement}\n >\n {local.children}\n </Button>\n );\n }\n\n return (\n <>\n <button\n {...rest}\n ref={register}\n aria-controls={context.menuId}\n aria-expanded={context.open()}\n aria-haspopup=\"menu\"\n aria-label={local.label}\n disabled={disabled()}\n tabIndex={disabled() ? -1 : local.tabIndex}\n onClick={click}\n onKeyDown={context.triggerKeyDown}\n type={local.type ?? \"button\"}\n class={`k2b-dropdown__trigger ${local.class ?? \"\"}`}\n >\n {local.children}\n </button>\n <Show when={local.tooltip !== false && local.tooltip !== undefined}>\n <Tooltip\n content={local.tooltip as JSX.Element}\n target={() => target}\n delay={local.tooltipDelay}\n disabled={disabled()}\n placement={local.tooltipPlacement}\n />\n </Show>\n </>\n );\n}\n\n/** Accessible top-layer menu with explicit trigger ownership. */\nfunction DropdownRoot(props: DropdownProps): JSX.Element {\n const messages = useUiMessages();\n const id = createUniqueId().replace(/[^a-zA-Z0-9_-]/g, \"-\");\n const menuId = `k2b-dropdown-${id}`;\n const [internalOpen, setInternalOpen] = createSignal(false);\n let triggerRef: HTMLButtonElement | undefined;\n let menuRef: HTMLDivElement | undefined;\n let mounted = false;\n let viewportListenersAttached = false;\n\n const isOpen = () => props.open ?? internalOpen();\n const position = (): DropdownPosition =>\n typeof props.position === \"function\" ? props.position() : (props.position ?? (props.align === \"end\" ? \"bottom-left\" : \"bottom-right\"));\n\n const place = () => {\n if (!triggerRef || !menuRef) return;\n const rect = dropdownPosition(triggerRef.getBoundingClientRect(), menuRef.getBoundingClientRect(), position(), {\n width: window.innerWidth,\n height: window.innerHeight,\n });\n menuRef.style.left = `${rect.left}px`;\n menuRef.style.top = `${rect.top}px`;\n };\n const reposition = () => {\n if (isOpen()) place();\n };\n const attachViewportListeners = () => {\n if (viewportListenersAttached) return;\n viewportListenersAttached = true;\n window.addEventListener(\"resize\", reposition);\n window.addEventListener(\"scroll\", reposition, true);\n };\n const detachViewportListeners = () => {\n if (!viewportListenersAttached) return;\n viewportListenersAttached = false;\n window.removeEventListener(\"resize\", reposition);\n window.removeEventListener(\"scroll\", reposition, true);\n };\n const close = (restoreFocus = true) => {\n if (menuRef?.matches(\":popover-open\")) menuRef.hidePopover();\n detachViewportListeners();\n if (restoreFocus) queueMicrotask(() => triggerRef?.focus());\n };\n const open = (focus: \"first\" | \"last\" | false = \"first\") => {\n if (props.disabled || !menuRef || menuRef.matches(\":popover-open\")) return;\n menuRef.showPopover();\n // The toggle event arrives a task later; expose the open state before focus moves into the menu.\n setInternalOpen(true);\n attachViewportListeners();\n place();\n queueMicrotask(() => {\n if (focus) focusMenuItem(menuRef, focus === \"first\" ? 0 : -1);\n });\n };\n const requestOpen = (next: boolean, focus: \"first\" | \"last\" | false = \"first\") => {\n if (props.disabled && next) return;\n if (props.open !== undefined) {\n props.onOpenChange?.(next);\n return;\n }\n if (next) open(focus);\n else close(false);\n };\n const handleMenuKeyDown = (event: KeyboardEvent) => {\n const items = actionableItems(menuRef);\n const current = items.indexOf(document.activeElement as HTMLElement);\n if (event.key === \"ArrowDown\" || event.key === \"ArrowUp\") {\n event.preventDefault();\n focusMenuItem(menuRef, current + (event.key === \"ArrowDown\" ? 1 : -1));\n } else if (event.key === \"Home\" || event.key === \"End\") {\n event.preventDefault();\n focusMenuItem(menuRef, event.key === \"Home\" ? 0 : -1);\n } else if (event.key === \"Escape\") {\n event.preventDefault();\n requestOpen(false);\n queueMicrotask(() => triggerRef?.focus());\n } else if (event.key === \"Tab\") {\n requestOpen(false);\n }\n };\n\n const context: DropdownContextValue = {\n disabled: () => Boolean(props.disabled),\n menuId,\n open: isOpen,\n registerTrigger: (element) => {\n triggerRef = element;\n },\n toggle: () => requestOpen(!isOpen()),\n triggerKeyDown: (event) => {\n if (![\"Enter\", \" \", \"ArrowDown\", \"ArrowUp\"].includes(event.key)) return;\n event.preventDefault();\n event.stopPropagation();\n if (isOpen()) {\n focusMenuItem(menuRef, event.key === \"ArrowUp\" ? -1 : 0);\n return;\n }\n requestOpen(true, event.key === \"ArrowUp\" ? \"last\" : \"first\");\n },\n };\n\n createEffect(() => {\n const controlled = props.open;\n if (!mounted || controlled === undefined || !menuRef) return;\n if (controlled && !menuRef.matches(\":popover-open\")) open(false);\n if (!controlled && menuRef.matches(\":popover-open\")) close(false);\n });\n createEffect(() => {\n if (mounted && props.disabled) close(false);\n });\n onMount(() => {\n mounted = true;\n if (props.open) open(false);\n onCleanup(detachViewportListeners);\n });\n\n return (\n <DropdownContext.Provider value={context}>\n <span class={`k2b-dropdown ${props.class ?? \"\"}`}>\n {props.children}\n <div\n ref={menuRef}\n id={menuId}\n popover=\"auto\"\n role=\"menu\"\n aria-label={props.label ?? messages().dropdownMenu}\n class={`k2b-dropdown__menu ${props.menuClass ?? \"\"}`}\n style={props.width ? { \"--k2b-dropdown-width\": props.width } : undefined}\n data-variant={props.variant ?? \"default\"}\n data-position={position()}\n onKeyDown={handleMenuKeyDown}\n onToggle={(event) => {\n const nextOpen = (event as ToggleEvent).newState === \"open\";\n const wasOpen = internalOpen();\n setInternalOpen(nextOpen);\n if (nextOpen) attachViewportListeners();\n else detachViewportListeners();\n if (props.open === undefined || props.open !== nextOpen) props.onOpenChange?.(nextOpen);\n if (wasOpen && !nextOpen) props.onClose?.();\n if (!nextOpen && props.open === true) queueMicrotask(() => props.open === true && open(false));\n }}\n >\n <DropdownItems items={props.items} close={close} />\n </div>\n </span>\n </DropdownContext.Provider>\n );\n}\n\ntype DropdownComponent = ((props: DropdownProps) => JSX.Element) & {\n Root: (props: DropdownProps) => JSX.Element;\n Trigger: (props: DropdownTriggerProps) => JSX.Element;\n Item: (props: DropdownItemProps) => JSX.Element;\n};\n\nexport const Dropdown = DropdownRoot as DropdownComponent;\nDropdown.Root = DropdownRoot;\nDropdown.Trigger = DropdownTrigger;\nDropdown.Item = DropdownItem;\n\nexport default Dropdown;\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":[],"sources":["actions/Dropdown.tsx"],"sourcesContent":["import {\n createContext,\n createEffect,\n createSignal,\n createUniqueId,\n For,\n type JSX,\n onCleanup,\n onMount,\n Show,\n splitProps,\n useContext,\n} from \"solid-js\";\nimport { Tooltip, type TooltipPlacement, useLabelTooltip } from \"../feedback/Tooltip\";\nimport { returnFocus, ringOnReturn } from \"../internal/focus-return\";\nimport { useUiMessages } from \"../intl/messages\";\nimport { Button, type ButtonProps, type ButtonSize, type ButtonVariant, iconTitle } from \"./Button\";\n\n// Resolved outside JSX: a conditional attribute compiles to a lazy memo, which would be created inside the click handler.\nconst selectAction = (item: { action?: () => void }) => item.action;\n\nexport type DropdownPosition = \"bottom-right\" | \"bottom-left\" | \"top-right\" | \"top-left\" | \"right-start\";\n\nexport type DropdownActionBase = {\n class?: string;\n disabled?: boolean;\n icon?: string;\n image?: string;\n label: string;\n description?: string;\n variant?: \"danger\";\n};\n\nexport type DropdownAction =\n | (DropdownActionBase & {\n action: () => void;\n href?: never;\n external?: never;\n })\n | (DropdownActionBase & {\n href: string;\n external?: boolean;\n action?: never;\n })\n | (DropdownActionBase & {\n disabled: true;\n action?: never;\n href?: never;\n external?: never;\n });\n\n/** Declarative radio or checkbox row for compact action menus. */\nexport type DropdownChoice = DropdownActionBase & {\n action: () => void;\n checked: boolean | (() => boolean);\n choice: \"checkbox\" | \"radio\";\n closeOnSelect?: boolean;\n color?: string;\n};\n\nexport type DropdownSection = {\n sectionLabel?: string;\n items: readonly (DropdownAction | DropdownChoice)[];\n};\n\nexport type DropdownItem = DropdownAction | DropdownChoice | DropdownSection;\n\nexport type DropdownProps = {\n items: readonly DropdownItem[];\n children: JSX.Element;\n position?: DropdownPosition | (() => DropdownPosition);\n /** Larger menu rows and typography for touch. Defaults to `default`. */\n variant?: \"default\" | \"touch\";\n /**\n * Exact menu width as a CSS length. Without it the menu sizes to its longest\n * entry: at least `12rem` (`18rem` for touch), at most the viewport width\n * less `1rem` per side, where longer entries wrap.\n */\n width?: string;\n class?: string;\n menuClass?: string;\n onClose?: () => void;\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n disabled?: boolean;\n label?: string;\n align?: \"start\" | \"end\";\n};\n\nexport type DropdownTriggerProps = Omit<\n ButtonProps,\n \"aria-controls\" | \"aria-expanded\" | \"aria-haspopup\" | \"children\" | \"disabled\" | \"onClick\" | \"onKeyDown\"\n> & {\n children: JSX.Element;\n /** Use `plain` when a specialized component class owns the complete visual treatment. */\n appearance?: \"button\" | \"plain\";\n disabled?: boolean;\n iconOnly?: boolean;\n label?: string;\n size?: ButtonSize;\n tooltip?: JSX.Element | false;\n tooltipDelay?: number;\n tooltipPlacement?: TooltipPlacement;\n variant?: ButtonVariant;\n};\n\nexport type DropdownItemProps = {\n children: JSX.Element;\n icon?: string;\n image?: string;\n description?: string;\n disabled?: boolean;\n danger?: boolean;\n variant?: \"danger\";\n href?: string;\n external?: boolean;\n onSelect?: () => void;\n class?: string;\n};\n\ntype MenuContextValue = {\n close: (restoreFocus?: boolean) => void;\n};\n\ntype DropdownContextValue = {\n disabled: () => boolean;\n menuId: string;\n open: () => boolean;\n registerTrigger: (element: HTMLButtonElement) => void;\n toggle: () => void;\n triggerKeyDown: JSX.EventHandlerUnion<HTMLButtonElement, KeyboardEvent>;\n};\n\nconst MenuContext = createContext<MenuContextValue>();\nconst DropdownContext = createContext<DropdownContextValue>();\n\nconst actionableItems = (menu: HTMLElement | undefined): HTMLElement[] =>\n menu\n ? Array.from(\n menu.querySelectorAll<HTMLElement>(\n [\n \"[role='menuitem']:not([aria-disabled='true'])\",\n \"[role='menuitemcheckbox']:not([aria-disabled='true'])\",\n \"[role='menuitemradio']:not([aria-disabled='true'])\",\n ].join(\", \"),\n ),\n )\n : [];\n\nconst focusMenuItem = (menu: HTMLElement | undefined, index: number): void => {\n const items = actionableItems(menu);\n if (items.length === 0) return;\n items[(index + items.length) % items.length]?.focus();\n};\n\nexport const dropdownPosition = (\n trigger: DOMRect,\n menu: Pick<DOMRect, \"width\" | \"height\">,\n position: DropdownPosition,\n viewport: { width: number; height: number },\n gap = 4,\n): { left: number; top: number } => {\n let left = trigger.left;\n let top = trigger.bottom + gap;\n\n if (position === \"bottom-left\" || position === \"top-left\") left = trigger.right - menu.width;\n if (position === \"top-right\" || position === \"top-left\") top = trigger.top - menu.height - gap;\n if (position === \"right-start\") {\n left = trigger.right + gap;\n top = trigger.top;\n }\n\n return {\n left: Math.max(8, Math.min(left, viewport.width - menu.width - 8)),\n top: Math.max(8, Math.min(top, viewport.height - menu.height - 8)),\n };\n};\n\nconst itemContent = (props: { description?: string; icon?: string; image?: string; children: JSX.Element }): JSX.Element => (\n <>\n <Show when={props.image} fallback={<Show when={props.icon}>{(icon) => <i class={icon()} aria-hidden=\"true\" />}</Show>}>\n {(image) => <img class=\"k2b-dropdown__image\" src={image()} alt=\"\" />}\n </Show>\n <span class=\"k2b-dropdown__copy\">\n <span>{props.children}</span>\n <Show when={props.description}>{(description) => <small>{description()}</small>}</Show>\n </span>\n </>\n);\n\nexport function DropdownItem(props: DropdownItemProps): JSX.Element {\n const menu = useContext(MenuContext);\n const danger = () => props.danger || props.variant === \"danger\";\n const content = itemContent(props);\n\n return (\n <Show\n when={!props.disabled ? props.href : undefined}\n fallback={\n <button\n type=\"button\"\n role=\"menuitem\"\n tabIndex={-1}\n class={`k2b-dropdown__item ${props.class ?? \"\"}`}\n data-danger={danger() ? \"true\" : undefined}\n disabled={props.disabled}\n aria-disabled={props.disabled ? \"true\" : undefined}\n onClick={(event) => {\n event.preventDefault();\n event.stopPropagation();\n menu?.close();\n props.onSelect?.();\n }}\n >\n {content}\n </button>\n }\n >\n {(href) => (\n <a\n href={href()}\n target={props.external ? \"_blank\" : undefined}\n rel={props.external ? \"noopener noreferrer\" : undefined}\n role=\"menuitem\"\n tabIndex={-1}\n class={`k2b-dropdown__item ${props.class ?? \"\"}`}\n data-danger={danger() ? \"true\" : undefined}\n onClick={() => {\n menu?.close(false);\n props.onSelect?.();\n }}\n >\n {content}\n </a>\n )}\n </Show>\n );\n}\n\nfunction DropdownChoiceItem(props: DropdownChoice): JSX.Element {\n const menu = useContext(MenuContext);\n const checked = () => (typeof props.checked === \"function\" ? props.checked() : props.checked);\n return (\n // biome-ignore lint/a11y/useAriaPropsSupportedByRole: the runtime role is always menuitemcheckbox or menuitemradio, both of which support aria-checked.\n <button\n type=\"button\"\n role={props.choice === \"checkbox\" ? \"menuitemcheckbox\" : \"menuitemradio\"}\n aria-checked={checked()}\n aria-disabled={props.disabled ? \"true\" : undefined}\n tabIndex={-1}\n class={`k2b-dropdown__item ${props.class ?? \"\"}`}\n data-selected={checked() ? \"true\" : undefined}\n disabled={props.disabled}\n onClick={(event) => {\n event.preventDefault();\n event.stopPropagation();\n if (props.closeOnSelect !== false) menu?.close();\n props.action();\n }}\n >\n <Show when={props.choice === \"checkbox\"}>\n <span class=\"k2b-dropdown__checkbox\" aria-hidden=\"true\">\n <Show when={checked()}>\n <i class=\"ti ti-check\" />\n </Show>\n </span>\n </Show>\n <Show when={props.image} fallback={<Show when={props.icon}>{(icon) => <i class={icon()} aria-hidden=\"true\" />}</Show>}>\n {(image) => <img class=\"k2b-dropdown__image\" src={image()} alt=\"\" />}\n </Show>\n <Show when={props.color}>\n {(color) => <span class=\"k2b-dropdown__color\" style={{ \"--k2b-dropdown-color\": color() }} aria-hidden=\"true\" />}\n </Show>\n <span class=\"k2b-dropdown__copy\">\n <span>{props.label}</span>\n <Show when={props.description}>{(description) => <small>{description()}</small>}</Show>\n </span>\n {/* Always present for radios, so selecting the widest entry cannot widen a content-sized menu. */}\n <Show when={props.choice === \"radio\"}>\n <i class=\"ti ti-check k2b-dropdown__check\" data-hidden={checked() ? undefined : \"true\"} aria-hidden=\"true\" />\n </Show>\n </button>\n );\n}\n\nexport function DropdownItems(props: { items: readonly DropdownItem[]; close: (restoreFocus?: boolean) => void }): JSX.Element {\n const messages = useUiMessages();\n const renderItem = (item: DropdownAction | DropdownChoice): JSX.Element =>\n \"choice\" in item ? (\n <DropdownChoiceItem {...item} />\n ) : (\n <DropdownItem\n icon={item.icon}\n image={item.image}\n description={item.description}\n variant={item.variant}\n disabled={item.disabled}\n class={item.class}\n href={\"href\" in item ? item.href : undefined}\n external={\"external\" in item ? item.external : undefined}\n onSelect={selectAction(item)}\n >\n {item.label}\n </DropdownItem>\n );\n\n return (\n <MenuContext.Provider value={{ close: props.close }}>\n <For each={props.items}>\n {(item, index) => (\n <Show when={\"items\" in item} fallback={renderItem(item as DropdownAction | DropdownChoice)}>\n <div\n class=\"k2b-dropdown__section\"\n data-divided={index() > 0 ? \"true\" : undefined}\n role=\"group\"\n aria-label={(item as DropdownSection).sectionLabel ?? messages().actions}\n >\n <Show when={(item as DropdownSection).sectionLabel}>{(label) => <div class=\"k2b-dropdown__label\">{label()}</div>}</Show>\n <For each={(item as DropdownSection).items}>{renderItem}</For>\n </div>\n </Show>\n )}\n </For>\n </MenuContext.Provider>\n );\n}\n\nfunction DropdownTrigger(props: DropdownTriggerProps): JSX.Element {\n const context = useContext(DropdownContext);\n if (!context) throw new Error(\"Dropdown.Trigger must be used inside Dropdown.Root\");\n const [local, rest] = splitProps(props, [\n \"appearance\",\n \"children\",\n \"class\",\n \"disabled\",\n \"iconOnly\",\n \"label\",\n \"ref\",\n \"size\",\n \"tabIndex\",\n \"title\",\n \"tooltip\",\n \"tooltipDelay\",\n \"tooltipPlacement\",\n \"type\",\n \"variant\",\n ]);\n let target: HTMLButtonElement | undefined;\n const disabled = () => Boolean(context.disabled() || local.disabled);\n // An icon-only trigger shows its label as a hint, like IconButton.\n const tooltip = useLabelTooltip(\n () => local.tooltip,\n () => (local.iconOnly ? (local.title ?? local.label) : undefined),\n );\n const register = (element: HTMLButtonElement) => {\n target = element;\n context.registerTrigger(element);\n if (typeof local.ref === \"function\") local.ref(element);\n };\n const click: JSX.EventHandlerUnion<HTMLButtonElement, MouseEvent> = (event) => {\n event.stopPropagation();\n context.toggle();\n };\n\n if (local.appearance !== \"plain\") {\n return (\n <Button\n {...rest}\n ref={register}\n aria-controls={context.menuId}\n aria-expanded={context.open()}\n aria-haspopup=\"menu\"\n aria-label={local.label}\n disabled={disabled()}\n tabIndex={disabled() ? -1 : local.tabIndex}\n onClick={click}\n onKeyDown={context.triggerKeyDown}\n type={local.type ?? \"button\"}\n class={`${local.iconOnly ? \"k2b-icon-button\" : \"\"} k2b-dropdown__trigger ${local.class ?? \"\"}`}\n size={local.size}\n variant={local.variant ?? (local.iconOnly ? \"ghost\" : undefined)}\n title={iconTitle(local.title, tooltip())}\n tooltip={tooltip()}\n tooltipDelay={local.tooltipDelay}\n tooltipPlacement={local.tooltipPlacement}\n >\n {local.children}\n </Button>\n );\n }\n\n return (\n <>\n <button\n {...rest}\n ref={register}\n aria-controls={context.menuId}\n aria-expanded={context.open()}\n aria-haspopup=\"menu\"\n aria-label={local.label}\n disabled={disabled()}\n tabIndex={disabled() ? -1 : local.tabIndex}\n onClick={click}\n onKeyDown={context.triggerKeyDown}\n type={local.type ?? \"button\"}\n class={`k2b-dropdown__trigger ${local.class ?? \"\"}`}\n title={iconTitle(local.title, tooltip())}\n >\n {local.children}\n </button>\n <Show when={tooltip() !== false && tooltip() !== undefined}>\n <Tooltip\n content={tooltip() as JSX.Element}\n target={() => target}\n delay={local.tooltipDelay}\n disabled={disabled()}\n placement={local.tooltipPlacement}\n />\n </Show>\n </>\n );\n}\n\n/** Accessible top-layer menu with explicit trigger ownership. */\nfunction DropdownRoot(props: DropdownProps): JSX.Element {\n const messages = useUiMessages();\n const id = createUniqueId().replace(/[^a-zA-Z0-9_-]/g, \"-\");\n const menuId = `k2b-dropdown-${id}`;\n const [internalOpen, setInternalOpen] = createSignal(false);\n let triggerRef: HTMLButtonElement | undefined;\n let menuRef: HTMLDivElement | undefined;\n let triggerRing = true;\n let mounted = false;\n let viewportListenersAttached = false;\n let resizeObserver: ResizeObserver | undefined;\n\n const isOpen = () => props.open ?? internalOpen();\n const position = (): DropdownPosition =>\n typeof props.position === \"function\" ? props.position() : (props.position ?? (props.align === \"end\" ? \"bottom-left\" : \"bottom-right\"));\n\n const place = () => {\n if (!triggerRef || !menuRef) return;\n const rect = dropdownPosition(triggerRef.getBoundingClientRect(), menuRef.getBoundingClientRect(), position(), {\n width: window.innerWidth,\n height: window.innerHeight,\n });\n menuRef.style.left = `${rect.left}px`;\n menuRef.style.top = `${rect.top}px`;\n };\n const reposition = () => {\n if (isOpen()) place();\n };\n const attachViewportListeners = () => {\n if (viewportListenersAttached) return;\n viewportListenersAttached = true;\n window.addEventListener(\"resize\", reposition);\n window.addEventListener(\"scroll\", reposition, true);\n // A content-sized menu changes size when its items change while it is open.\n if (menuRef && typeof ResizeObserver !== \"undefined\") {\n resizeObserver ??= new ResizeObserver(reposition);\n resizeObserver.observe(menuRef);\n }\n };\n const detachViewportListeners = () => {\n if (!viewportListenersAttached) return;\n viewportListenersAttached = false;\n window.removeEventListener(\"resize\", reposition);\n window.removeEventListener(\"scroll\", reposition, true);\n resizeObserver?.disconnect();\n };\n const close = (restoreFocus = true) => {\n // Before hiding, so the popover does not return focus on its own.\n if (restoreFocus) returnFocus(triggerRef, triggerRing);\n if (menuRef?.matches(\":popover-open\")) menuRef.hidePopover();\n detachViewportListeners();\n };\n const open = (focus: \"first\" | \"last\" | false = \"first\") => {\n if (props.disabled || !menuRef || menuRef.matches(\":popover-open\")) return;\n triggerRing = ringOnReturn(triggerRef);\n menuRef.showPopover();\n // The toggle event arrives a task later; expose the open state before focus moves into the menu.\n setInternalOpen(true);\n attachViewportListeners();\n place();\n queueMicrotask(() => {\n if (focus) focusMenuItem(menuRef, focus === \"first\" ? 0 : -1);\n });\n };\n const requestOpen = (next: boolean, focus: \"first\" | \"last\" | false = \"first\") => {\n if (props.disabled && next) return;\n if (props.open !== undefined) {\n props.onOpenChange?.(next);\n return;\n }\n if (next) open(focus);\n else close(false);\n };\n const handleMenuKeyDown = (event: KeyboardEvent) => {\n const items = actionableItems(menuRef);\n const current = items.indexOf(document.activeElement as HTMLElement);\n if (event.key === \"ArrowDown\" || event.key === \"ArrowUp\") {\n event.preventDefault();\n focusMenuItem(menuRef, current + (event.key === \"ArrowDown\" ? 1 : -1));\n } else if (event.key === \"Home\" || event.key === \"End\") {\n event.preventDefault();\n focusMenuItem(menuRef, event.key === \"Home\" ? 0 : -1);\n } else if (event.key === \"Escape\") {\n event.preventDefault();\n returnFocus(triggerRef, triggerRing);\n requestOpen(false);\n } else if (event.key === \"Tab\") {\n requestOpen(false);\n }\n };\n\n const context: DropdownContextValue = {\n disabled: () => Boolean(props.disabled),\n menuId,\n open: isOpen,\n registerTrigger: (element) => {\n triggerRef = element;\n },\n toggle: () => requestOpen(!isOpen()),\n triggerKeyDown: (event) => {\n if (![\"Enter\", \" \", \"ArrowDown\", \"ArrowUp\"].includes(event.key)) return;\n event.preventDefault();\n event.stopPropagation();\n if (isOpen()) {\n focusMenuItem(menuRef, event.key === \"ArrowUp\" ? -1 : 0);\n return;\n }\n requestOpen(true, event.key === \"ArrowUp\" ? \"last\" : \"first\");\n },\n };\n\n createEffect(() => {\n const controlled = props.open;\n if (!mounted || controlled === undefined || !menuRef) return;\n if (controlled && !menuRef.matches(\":popover-open\")) open(false);\n if (!controlled && menuRef.matches(\":popover-open\")) close(false);\n });\n createEffect(() => {\n if (mounted && props.disabled) close(false);\n });\n onMount(() => {\n mounted = true;\n if (props.open) open(false);\n onCleanup(detachViewportListeners);\n });\n\n return (\n <DropdownContext.Provider value={context}>\n <span class={`k2b-dropdown ${props.class ?? \"\"}`}>\n {props.children}\n <div\n ref={menuRef}\n id={menuId}\n popover=\"auto\"\n role=\"menu\"\n aria-label={props.label ?? messages().dropdownMenu}\n class={`k2b-dropdown__menu ${props.menuClass ?? \"\"}`}\n style={props.width ? { \"--k2b-dropdown-width\": props.width } : undefined}\n data-width={props.width ? \"fixed\" : undefined}\n data-variant={props.variant ?? \"default\"}\n data-position={position()}\n onKeyDown={handleMenuKeyDown}\n onToggle={(event) => {\n const nextOpen = (event as ToggleEvent).newState === \"open\";\n const wasOpen = internalOpen();\n setInternalOpen(nextOpen);\n if (nextOpen) attachViewportListeners();\n else detachViewportListeners();\n if (props.open === undefined || props.open !== nextOpen) props.onOpenChange?.(nextOpen);\n if (wasOpen && !nextOpen) props.onClose?.();\n if (!nextOpen && props.open === true) queueMicrotask(() => props.open === true && open(false));\n }}\n >\n <DropdownItems items={props.items} close={close} />\n </div>\n </span>\n </DropdownContext.Provider>\n );\n}\n\ntype DropdownComponent = ((props: DropdownProps) => JSX.Element) & {\n Root: (props: DropdownProps) => JSX.Element;\n Trigger: (props: DropdownTriggerProps) => JSX.Element;\n Item: (props: DropdownItemProps) => JSX.Element;\n};\n\nexport const Dropdown = DropdownRoot as DropdownComponent;\nDropdown.Root = DropdownRoot;\nDropdown.Trigger = DropdownTrigger;\nDropdown.Item = DropdownItem;\n\nexport default Dropdown;\n"],"mappings":"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","ignoreList":[]}
@@ -86,7 +86,7 @@ export function FilterChip(props) {
86
86
  get position() {
87
87
  return props.position ?? "bottom-left";
88
88
  },
89
- width: "13rem",
89
+ menuClass: "k2b-filter-chip__menu",
90
90
  get label() {
91
91
  return props.label;
92
92
  },
@@ -101,9 +101,6 @@ export function FilterChip(props) {
101
101
  get iconOnly() {
102
102
  return props.iconOnly;
103
103
  },
104
- get tooltip() {
105
- return _$memo(() => !!(props.variant && props.iconOnly))() ? props.label : undefined;
106
- },
107
104
  get ["class"]() {
108
105
  return _$memo(() => !!props.variant)() ? props.class : `k2b-filter-chip ${props.class ?? ""}`;
109
106
  },
@@ -119,9 +116,6 @@ export function FilterChip(props) {
119
116
  get label() {
120
117
  return props.label;
121
118
  },
122
- get title() {
123
- return _$memo(() => !!props.iconOnly)() ? props.label : undefined;
124
- },
125
119
  get children() {
126
120
  return [_$ssr(_tmpl$, _$ssrAttribute("class", _$escape(props.icon, true), false)), _$createComponent(Show, {
127
121
  get when() {
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["actions/FilterChip.tsx"],"sourcesContent":["import { createMemo, type JSX, Show } from \"solid-js\";\nimport { useUiMessages } from \"../intl/messages\";\nimport type { ButtonVariant } from \"./Button\";\nimport Dropdown, { type DropdownItem } from \"./Dropdown\";\n\nexport type FilterChipOption = {\n value: string;\n label: string;\n icon?: string;\n color?: string;\n};\n\nexport type FilterChipSection = {\n label?: string;\n options: readonly FilterChipOption[];\n multiple?: boolean;\n};\n\nexport type FilterChipProps = {\n label: string;\n icon: string;\n options: readonly FilterChipSection[];\n value: readonly string[];\n onValueChange: (value: string[]) => void;\n isActive?: boolean;\n position?: \"bottom-left\" | \"bottom-right\";\n defaultValue?: readonly string[];\n iconOnly?: boolean;\n /** Use a standard button appearance instead of the default filter field. */\n variant?: ButtonVariant;\n disabled?: boolean;\n class?: string;\n};\n\n/** Section-aware controlled filter with immediate single- and multi-select commits. */\nexport function FilterChip(props: FilterChipProps): JSX.Element {\n const messages = useUiMessages();\n const selectedValues = createMemo(() => new Set(props.value));\n const defaultValues = createMemo(() => new Set(props.defaultValue ?? []));\n const sectionByValue = createMemo(() => {\n const sections = new Map<string, FilterChipSection>();\n for (const section of props.options) {\n for (const option of section.options) sections.set(option.value, section);\n }\n return sections;\n });\n const hasDefault = () => (props.defaultValue?.length ?? 0) > 0;\n const selected = (value: string) => selectedValues().has(value);\n const active = () => props.isActive ?? props.value.length > 0;\n const atDefault = () => {\n if (!props.defaultValue) return false;\n const current = props.value;\n return current.length === props.defaultValue.length && current.every((value) => defaultValues().has(value));\n };\n const emit = (value: string[]) => props.onValueChange(value);\n const toggle = (value: string) => {\n const section = sectionByValue().get(value);\n if (!section) return;\n const current = props.value;\n if (section.multiple) {\n emit(selected(value) ? current.filter((entry) => entry !== value) : [...current, value]);\n return;\n }\n const sectionValues = new Set(section.options.map((option) => option.value));\n const otherValues = current.filter((entry) => !sectionValues.has(entry));\n emit(selected(value) ? otherValues : [...otherValues, value]);\n };\n const reset = () => emit(props.defaultValue ? [...props.defaultValue] : []);\n const showReset = () => (hasDefault() && !atDefault()) || (!hasDefault() && props.value.length > 0);\n const optionItems = createMemo<DropdownItem[]>(() => {\n const result: DropdownItem[] = [];\n for (const section of props.options) {\n const items = section.options.map((option) => ({\n action: () => toggle(option.value),\n checked: () => props.value.includes(option.value),\n choice: section.multiple ? (\"checkbox\" as const) : (\"radio\" as const),\n class: \"k2b-filter-chip__option\",\n closeOnSelect: false,\n color: option.color,\n icon: !section.multiple ? option.icon : undefined,\n label: option.label,\n }));\n if (section.label) result.push({ sectionLabel: section.label, items });\n else result.push(...items);\n }\n return result;\n });\n const items = createMemo<DropdownItem[]>(() => {\n if (!showReset()) return optionItems();\n return [\n ...optionItems(),\n {\n sectionLabel: messages().filterActions,\n items: [\n {\n action: reset,\n icon: hasDefault() ? \"ti ti-refresh\" : \"ti ti-x\",\n label: hasDefault() ? messages().reset : messages().clear,\n variant: \"danger\",\n },\n ],\n },\n ];\n });\n\n return (\n <Dropdown.Root disabled={props.disabled} items={items()} position={props.position ?? \"bottom-left\"} width=\"13rem\" label={props.label}>\n <Dropdown.Trigger\n appearance={props.variant ? \"button\" : \"plain\"}\n variant={props.variant}\n iconOnly={props.iconOnly}\n tooltip={props.variant && props.iconOnly ? props.label : undefined}\n class={props.variant ? props.class : `k2b-filter-chip ${props.class ?? \"\"}`}\n data-state={active() ? \"active\" : \"idle\"}\n data-active={active() ? \"true\" : undefined}\n data-icon-only={props.iconOnly ? \"true\" : undefined}\n label={props.label}\n title={props.iconOnly ? props.label : undefined}\n >\n <i class={props.icon} aria-hidden=\"true\" />\n <Show when={!props.iconOnly}>\n <span>\n {props.label}\n <Show when={!hasDefault() && props.value.length > 0}>{` (${props.value.length})`}</Show>\n </span>\n <i class=\"ti ti-chevron-down k2b-filter-chip__chevron\" aria-hidden=\"true\" />\n </Show>\n </Dropdown.Trigger>\n </Dropdown.Root>\n );\n}\n\nexport default FilterChip;\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":[],"sources":["actions/FilterChip.tsx"],"sourcesContent":["import { createMemo, type JSX, Show } from \"solid-js\";\nimport { useUiMessages } from \"../intl/messages\";\nimport type { ButtonVariant } from \"./Button\";\nimport Dropdown, { type DropdownItem } from \"./Dropdown\";\n\nexport type FilterChipOption = {\n value: string;\n label: string;\n icon?: string;\n color?: string;\n};\n\nexport type FilterChipSection = {\n label?: string;\n options: readonly FilterChipOption[];\n multiple?: boolean;\n};\n\nexport type FilterChipProps = {\n label: string;\n icon: string;\n options: readonly FilterChipSection[];\n value: readonly string[];\n onValueChange: (value: string[]) => void;\n isActive?: boolean;\n position?: \"bottom-left\" | \"bottom-right\";\n defaultValue?: readonly string[];\n iconOnly?: boolean;\n /** Use a standard button appearance instead of the default filter field. */\n variant?: ButtonVariant;\n disabled?: boolean;\n class?: string;\n};\n\n/** Section-aware controlled filter with immediate single- and multi-select commits. */\nexport function FilterChip(props: FilterChipProps): JSX.Element {\n const messages = useUiMessages();\n const selectedValues = createMemo(() => new Set(props.value));\n const defaultValues = createMemo(() => new Set(props.defaultValue ?? []));\n const sectionByValue = createMemo(() => {\n const sections = new Map<string, FilterChipSection>();\n for (const section of props.options) {\n for (const option of section.options) sections.set(option.value, section);\n }\n return sections;\n });\n const hasDefault = () => (props.defaultValue?.length ?? 0) > 0;\n const selected = (value: string) => selectedValues().has(value);\n const active = () => props.isActive ?? props.value.length > 0;\n const atDefault = () => {\n if (!props.defaultValue) return false;\n const current = props.value;\n return current.length === props.defaultValue.length && current.every((value) => defaultValues().has(value));\n };\n const emit = (value: string[]) => props.onValueChange(value);\n const toggle = (value: string) => {\n const section = sectionByValue().get(value);\n if (!section) return;\n const current = props.value;\n if (section.multiple) {\n emit(selected(value) ? current.filter((entry) => entry !== value) : [...current, value]);\n return;\n }\n const sectionValues = new Set(section.options.map((option) => option.value));\n const otherValues = current.filter((entry) => !sectionValues.has(entry));\n emit(selected(value) ? otherValues : [...otherValues, value]);\n };\n const reset = () => emit(props.defaultValue ? [...props.defaultValue] : []);\n const showReset = () => (hasDefault() && !atDefault()) || (!hasDefault() && props.value.length > 0);\n const optionItems = createMemo<DropdownItem[]>(() => {\n const result: DropdownItem[] = [];\n for (const section of props.options) {\n const items = section.options.map((option) => ({\n action: () => toggle(option.value),\n checked: () => props.value.includes(option.value),\n choice: section.multiple ? (\"checkbox\" as const) : (\"radio\" as const),\n class: \"k2b-filter-chip__option\",\n closeOnSelect: false,\n color: option.color,\n icon: !section.multiple ? option.icon : undefined,\n label: option.label,\n }));\n if (section.label) result.push({ sectionLabel: section.label, items });\n else result.push(...items);\n }\n return result;\n });\n const items = createMemo<DropdownItem[]>(() => {\n if (!showReset()) return optionItems();\n return [\n ...optionItems(),\n {\n sectionLabel: messages().filterActions,\n items: [\n {\n action: reset,\n icon: hasDefault() ? \"ti ti-refresh\" : \"ti ti-x\",\n label: hasDefault() ? messages().reset : messages().clear,\n variant: \"danger\",\n },\n ],\n },\n ];\n });\n\n return (\n <Dropdown.Root\n disabled={props.disabled}\n items={items()}\n position={props.position ?? \"bottom-left\"}\n menuClass=\"k2b-filter-chip__menu\"\n label={props.label}\n >\n <Dropdown.Trigger\n appearance={props.variant ? \"button\" : \"plain\"}\n variant={props.variant}\n iconOnly={props.iconOnly}\n class={props.variant ? props.class : `k2b-filter-chip ${props.class ?? \"\"}`}\n data-state={active() ? \"active\" : \"idle\"}\n data-active={active() ? \"true\" : undefined}\n data-icon-only={props.iconOnly ? \"true\" : undefined}\n label={props.label}\n >\n <i class={props.icon} aria-hidden=\"true\" />\n <Show when={!props.iconOnly}>\n <span>\n {props.label}\n <Show when={!hasDefault() && props.value.length > 0}>{` (${props.value.length})`}</Show>\n </span>\n <i class=\"ti ti-chevron-down k2b-filter-chip__chevron\" aria-hidden=\"true\" />\n </Show>\n </Dropdown.Trigger>\n </Dropdown.Root>\n );\n}\n\nexport default FilterChip;\n"],"mappings":"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","ignoreList":[]}
@@ -106,9 +106,6 @@ export function SplitButton(props) {
106
106
  get size() {
107
107
  return local.size;
108
108
  },
109
- get title() {
110
- return local.menuLabel;
111
- },
112
109
  get variant() {
113
110
  return local.variant ?? "primary";
114
111
  },
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["actions/SplitButton.tsx"],"sourcesContent":["import { type JSX, Show, splitProps } from \"solid-js\";\nimport { Button, type ButtonProps } from \"./Button\";\nimport { Dropdown, type DropdownItem, type DropdownPosition } from \"./Dropdown\";\n\nexport type SplitButtonProps = Omit<ButtonProps, \"align\"> & {\n /** Actions shown from the secondary menu trigger. */\n items: readonly DropdownItem[];\n /** Optional selection menu in place of the primary immediate action. */\n primaryItems?: readonly DropdownItem[];\n /** Accessible name for the primary selection menu. */\n primaryMenuLabel?: string;\n /** Secondary menu glyph; defaults to a chevron. */\n menuIcon?: JSX.Element;\n /** Accessible name and title for the icon-only menu trigger. */\n menuLabel: string;\n menuPosition?: DropdownPosition | (() => DropdownPosition);\n menuWidth?: string;\n};\n\n/** One primary button action with a separate menu of related alternatives. */\nexport function SplitButton(props: SplitButtonProps): JSX.Element {\n const [local, buttonProps] = splitProps(props, [\n \"children\",\n \"primaryItems\",\n \"primaryMenuLabel\",\n \"menuIcon\",\n \"class\",\n \"disabled\",\n \"items\",\n \"loading\",\n \"menuLabel\",\n \"menuPosition\",\n \"menuWidth\",\n \"size\",\n \"variant\",\n ]);\n const disabled = () => Boolean(local.disabled || local.loading);\n\n return (\n <Dropdown.Root\n class=\"k2b-split-button\"\n disabled={disabled()}\n items={local.items}\n label={local.menuLabel}\n position={local.menuPosition ?? \"bottom-left\"}\n width={local.menuWidth}\n >\n <Show\n when={local.primaryItems}\n fallback={\n <Button\n {...buttonProps}\n class={`k2b-split-button__primary ${local.class ?? \"\"}`}\n disabled={local.disabled}\n loading={local.loading}\n size={local.size}\n variant={local.variant ?? \"primary\"}\n >\n {local.children}\n </Button>\n }\n >\n {(items) => (\n <Dropdown.Root\n items={items()}\n disabled={disabled()}\n class=\"k2b-split-button__primary-menu\"\n position={local.menuPosition ?? \"bottom-left\"}\n width={local.menuWidth}\n >\n <Dropdown.Trigger\n wrap={buttonProps.wrap}\n disabled={disabled()}\n size={local.size}\n variant={local.variant ?? \"primary\"}\n label={local.primaryMenuLabel}\n class={`k2b-split-button__primary ${local.class ?? \"\"}`}\n >\n {local.children}\n </Dropdown.Trigger>\n </Dropdown.Root>\n )}\n </Show>\n <Dropdown.Trigger\n class=\"k2b-split-button__menu-trigger\"\n disabled={disabled()}\n iconOnly\n label={local.menuLabel}\n size={local.size}\n title={local.menuLabel}\n variant={local.variant ?? \"primary\"}\n >\n {local.menuIcon ?? <i class=\"ti ti-chevron-down\" aria-hidden=\"true\" />}\n </Dropdown.Trigger>\n </Dropdown.Root>\n );\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":[],"sources":["actions/SplitButton.tsx"],"sourcesContent":["import { type JSX, Show, splitProps } from \"solid-js\";\nimport { Button, type ButtonProps } from \"./Button\";\nimport { Dropdown, type DropdownItem, type DropdownPosition } from \"./Dropdown\";\n\nexport type SplitButtonProps = Omit<ButtonProps, \"align\"> & {\n /** Actions shown from the secondary menu trigger. */\n items: readonly DropdownItem[];\n /** Optional selection menu in place of the primary immediate action. */\n primaryItems?: readonly DropdownItem[];\n /** Accessible name for the primary selection menu. */\n primaryMenuLabel?: string;\n /** Secondary menu glyph; defaults to a chevron. */\n menuIcon?: JSX.Element;\n /** Accessible name and title for the icon-only menu trigger. */\n menuLabel: string;\n menuPosition?: DropdownPosition | (() => DropdownPosition);\n /** Exact width of both menus as a CSS length. Without it the menus size to their entries. */\n menuWidth?: string;\n};\n\n/** One primary button action with a separate menu of related alternatives. */\nexport function SplitButton(props: SplitButtonProps): JSX.Element {\n const [local, buttonProps] = splitProps(props, [\n \"children\",\n \"primaryItems\",\n \"primaryMenuLabel\",\n \"menuIcon\",\n \"class\",\n \"disabled\",\n \"items\",\n \"loading\",\n \"menuLabel\",\n \"menuPosition\",\n \"menuWidth\",\n \"size\",\n \"variant\",\n ]);\n const disabled = () => Boolean(local.disabled || local.loading);\n\n return (\n <Dropdown.Root\n class=\"k2b-split-button\"\n disabled={disabled()}\n items={local.items}\n label={local.menuLabel}\n position={local.menuPosition ?? \"bottom-left\"}\n width={local.menuWidth}\n >\n <Show\n when={local.primaryItems}\n fallback={\n <Button\n {...buttonProps}\n class={`k2b-split-button__primary ${local.class ?? \"\"}`}\n disabled={local.disabled}\n loading={local.loading}\n size={local.size}\n variant={local.variant ?? \"primary\"}\n >\n {local.children}\n </Button>\n }\n >\n {(items) => (\n <Dropdown.Root\n items={items()}\n disabled={disabled()}\n class=\"k2b-split-button__primary-menu\"\n position={local.menuPosition ?? \"bottom-left\"}\n width={local.menuWidth}\n >\n <Dropdown.Trigger\n wrap={buttonProps.wrap}\n disabled={disabled()}\n size={local.size}\n variant={local.variant ?? \"primary\"}\n label={local.primaryMenuLabel}\n class={`k2b-split-button__primary ${local.class ?? \"\"}`}\n >\n {local.children}\n </Dropdown.Trigger>\n </Dropdown.Root>\n )}\n </Show>\n <Dropdown.Trigger\n class=\"k2b-split-button__menu-trigger\"\n disabled={disabled()}\n iconOnly\n label={local.menuLabel}\n size={local.size}\n variant={local.variant ?? \"primary\"}\n >\n {local.menuIcon ?? <i class=\"ti ti-chevron-down\" aria-hidden=\"true\" />}\n </Dropdown.Trigger>\n </Dropdown.Root>\n );\n}\n"],"mappings":"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","ignoreList":[]}
@@ -28,12 +28,10 @@ var _tmpl$ = ["<span><strong", ">", "</strong></span>"],
28
28
  _tmpl$19 = "<i class=\"ti ti-plus\" aria-hidden=\"true\"></i>",
29
29
  _tmpl$20 = ["<input class=\"k2b-sr-only\" type=\"file\" tabindex=\"-1\" aria-hidden=\"true\"", "", ">"],
30
30
  _tmpl$21 = ["<div class=\"k2b-chat-composer__tools\">", "", "", "", "", "</div>"],
31
- _tmpl$22 = ["<button type=\"button\" class=\"k2b-chat-composer__stop\"", "><i", " aria-hidden=\"true\"></i></button>"],
32
- _tmpl$23 = ["<div class=\"k2b-chat-composer__submit\">", "", "", "", "</div>"],
33
- _tmpl$24 = ["<button type=\"button\" class=\"k2b-chat-composer__icon-action\"", "", "><i", " aria-hidden=\"true\"></i></button>"],
34
- _tmpl$25 = ["<button type=\"button\" class=\"k2b-chat-composer__send\"", "><i", " aria-hidden=\"true\"></i></button>"];
31
+ _tmpl$22 = ["<div class=\"k2b-chat-composer__submit\">", "", "", "", "</div>"];
35
32
  import { children, createEffect, createMemo, createSignal, createUniqueId, For, onCleanup, onMount, Show, untrack } from "solid-js";
36
33
  import { Dropdown } from "../actions/Dropdown";
34
+ import { Tooltip } from "../feedback/Tooltip";
37
35
  import { SelectChip } from "../inputs/SelectChip";
38
36
  import { useUiMessages } from "../intl/messages";
39
37
  import { ChatContextUsage as ContextUsage } from "./ChatPrimitives";
@@ -522,7 +520,6 @@ export function ChatComposer(props) {
522
520
  get children() {
523
521
  return _$createComponent(Dropdown.Root, {
524
522
  position: "top-right",
525
- width: "12rem",
526
523
  get label() {
527
524
  return messages().addToChat;
528
525
  },
@@ -539,7 +536,7 @@ export function ChatComposer(props) {
539
536
  get label() {
540
537
  return messages().addToChat;
541
538
  },
542
- get title() {
539
+ get tooltip() {
543
540
  return messages().addToChat;
544
541
  },
545
542
  get children() {
@@ -590,11 +587,33 @@ export function ChatComposer(props) {
590
587
  }
591
588
  });
592
589
  }
593
- })), _$escape(props.modelDetails)), _$ssr(_tmpl$23, _$escape(_$createComponent(For, {
590
+ })), _$escape(props.modelDetails)), _$ssr(_tmpl$22, _$escape(_$createComponent(For, {
594
591
  get each() {
595
592
  return props.contextActions;
596
593
  },
597
- children: action => _$ssr(_tmpl$24, _$ssrAttribute("data-tone", action.variant === "danger" ? "danger" : _$escape(undefined, true), false), _$ssrAttribute("disabled", action.disabled, true) + _$ssrAttribute("aria-pressed", _$escape(action.pressed, true), false) + _$ssrAttribute("aria-label", _$escape(action.label, true), false) + _$ssrAttribute("title", _$escape(action.label, true), false), _$ssrAttribute("class", _$escape(action.icon ?? "ti ti-dots", true), false))
594
+ children: action => _$createComponent(Tooltip.Trigger, {
595
+ type: "button",
596
+ "class": "k2b-chat-composer__icon-action",
597
+ get ["data-tone"]() {
598
+ return action.variant === "danger" ? "danger" : undefined;
599
+ },
600
+ get disabled() {
601
+ return action.disabled;
602
+ },
603
+ get ["aria-pressed"]() {
604
+ return action.pressed;
605
+ },
606
+ get ["aria-label"]() {
607
+ return action.label;
608
+ },
609
+ get content() {
610
+ return action.label;
611
+ },
612
+ onClick: () => reportChatFailure(() => executeChatAction(action), props.onError),
613
+ get children() {
614
+ return _$ssr(_tmpl$15, _$ssrAttribute("class", _$escape(action.icon ?? "ti ti-dots", true), false));
615
+ }
616
+ })
598
617
  })), _$escape(_$createComponent(Show, {
599
618
  get when() {
600
619
  return _$memo(() => !!hasContextUsage())() ? props.contextUsage ?? {} : undefined;
@@ -612,10 +631,42 @@ export function ChatComposer(props) {
612
631
  return _$memo(() => !!(running() && !hasDraft()))() && props.onStop;
613
632
  },
614
633
  get fallback() {
615
- return _$ssr(_tmpl$25, _$ssrAttribute("disabled", !canSubmit(), true) + _$ssrAttribute("aria-label", submitting() ? running() ? runningSubmitIntent() === "queue" ? _$escape(messages().queueing, true) : _$escape(messages().steering, true) : _$escape(messages().sending, true) : running() ? runningSubmitIntent() === "queue" ? _$escape(messages().queueMessage, true) : _$escape(messages().steerResponse, true) : _$escape(messages().sendMessage, true), false) + _$ssrAttribute("title", running() ? runningSubmitIntent() === "queue" ? _$escape(messages().queueMessage, true) : _$escape(messages().steerResponse, true) : _$escape(messages().sendMessage, true), false), _$ssrAttribute("class", submitting() ? "ti ti-loader-2 k2b-spin" : "ti ti-arrow-up", false));
634
+ return _$createComponent(Tooltip.Trigger, {
635
+ type: "button",
636
+ "class": "k2b-chat-composer__send",
637
+ get disabled() {
638
+ return !canSubmit();
639
+ },
640
+ get ["aria-label"]() {
641
+ return _$memo(() => !!submitting())() ? _$memo(() => !!running())() ? _$memo(() => runningSubmitIntent() === "queue")() ? messages().queueing : messages().steering : messages().sending : _$memo(() => !!running())() ? _$memo(() => runningSubmitIntent() === "queue")() ? messages().queueMessage : messages().steerResponse : messages().sendMessage;
642
+ },
643
+ get content() {
644
+ return _$memo(() => !!running())() ? _$memo(() => runningSubmitIntent() === "queue")() ? messages().queueMessage : messages().steerResponse : messages().sendMessage;
645
+ },
646
+ onClick: () => void submit(),
647
+ get children() {
648
+ return _$ssr(_tmpl$15, _$ssrAttribute("class", submitting() ? "ti ti-loader-2 k2b-spin" : "ti ti-arrow-up", false));
649
+ }
650
+ });
616
651
  },
617
652
  get children() {
618
- return _$ssr(_tmpl$22, _$ssrAttribute("disabled", stopping(), true) + _$ssrAttribute("aria-label", stopping() ? _$escape(messages().stopping, true) : _$escape(messages().stopResponse, true), false) + _$ssrAttribute("title", stopping() ? _$escape(messages().stopping, true) : _$escape(messages().stopResponse, true), false), _$ssrAttribute("class", stopping() ? "ti ti-loader-2 k2b-spin" : "ti ti-player-stop", false));
653
+ return _$createComponent(Tooltip.Trigger, {
654
+ type: "button",
655
+ "class": "k2b-chat-composer__stop",
656
+ get disabled() {
657
+ return stopping();
658
+ },
659
+ get ["aria-label"]() {
660
+ return _$memo(() => !!stopping())() ? messages().stopping : messages().stopResponse;
661
+ },
662
+ get content() {
663
+ return messages().stopResponse;
664
+ },
665
+ onClick: () => reportChatFailure(() => props.onStop?.(), props.onError),
666
+ get children() {
667
+ return _$ssr(_tmpl$15, _$ssrAttribute("class", stopping() ? "ti ti-loader-2 k2b-spin" : "ti ti-player-stop", false));
668
+ }
669
+ });
619
670
  }
620
671
  })))];
621
672
  },