@k2b/ui 0.18.0 → 0.20.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 (204) hide show
  1. package/README.md +3 -2
  2. package/dist/browser/actions/ContextMenu.js +3 -1
  3. package/dist/browser/actions/ContextMenu.js.map +1 -1
  4. package/dist/browser/actions/Dropdown.js +91 -46
  5. package/dist/browser/actions/Dropdown.js.map +1 -1
  6. package/dist/browser/actions/FilterChip.js +4 -1
  7. package/dist/browser/actions/FilterChip.js.map +1 -1
  8. package/dist/browser/actions/GestureMenu.js +467 -0
  9. package/dist/browser/actions/GestureMenu.js.map +1 -0
  10. package/dist/browser/actions/index.js +1 -0
  11. package/dist/browser/actions/index.js.map +1 -1
  12. package/dist/browser/chat/ChatComposer.js +1255 -534
  13. package/dist/browser/chat/ChatComposer.js.map +1 -1
  14. package/dist/browser/chat/ChatPrimitives.js +9 -3
  15. package/dist/browser/chat/ChatPrimitives.js.map +1 -1
  16. package/dist/browser/chat/ChatTimeline.js +19 -1
  17. package/dist/browser/chat/ChatTimeline.js.map +1 -1
  18. package/dist/browser/chat/chat-behavior.js +9 -0
  19. package/dist/browser/chat/chat-behavior.js.map +1 -1
  20. package/dist/browser/chat/index.js.map +1 -1
  21. package/dist/browser/chat/types.js.map +1 -1
  22. package/dist/browser/content/Calendar.js +579 -533
  23. package/dist/browser/content/Calendar.js.map +1 -1
  24. package/dist/browser/content/Lightbox.js +76 -40
  25. package/dist/browser/content/Lightbox.js.map +1 -1
  26. package/dist/browser/content/MessageRow.js +2 -2
  27. package/dist/browser/content/MessageRow.js.map +1 -1
  28. package/dist/browser/content/PdfPreview.js +146 -79
  29. package/dist/browser/content/PdfPreview.js.map +1 -1
  30. package/dist/browser/content/Timeline.js +1038 -0
  31. package/dist/browser/content/Timeline.js.map +1 -0
  32. package/dist/browser/content/VideoPlayer.js +29 -9
  33. package/dist/browser/content/VideoPlayer.js.map +1 -1
  34. package/dist/browser/content/chart-inspection.js +7 -2
  35. package/dist/browser/content/chart-inspection.js.map +1 -1
  36. package/dist/browser/content/index.js +1 -0
  37. package/dist/browser/content/index.js.map +1 -1
  38. package/dist/browser/content/timeline-model.js +579 -0
  39. package/dist/browser/content/timeline-model.js.map +1 -0
  40. package/dist/browser/feedback/dialog-core.js +26 -14
  41. package/dist/browser/feedback/dialog-core.js.map +1 -1
  42. package/dist/browser/inputs/ChoiceChips.js +66 -0
  43. package/dist/browser/inputs/ChoiceChips.js.map +1 -0
  44. package/dist/browser/inputs/ChoiceGroups.js +53 -12
  45. package/dist/browser/inputs/ChoiceGroups.js.map +1 -1
  46. package/dist/browser/inputs/FileInputs.js +48 -33
  47. package/dist/browser/inputs/FileInputs.js.map +1 -1
  48. package/dist/browser/inputs/SignatureInput.js +558 -0
  49. package/dist/browser/inputs/SignatureInput.js.map +1 -0
  50. package/dist/browser/inputs/TextInput.js +13 -1
  51. package/dist/browser/inputs/TextInput.js.map +1 -1
  52. package/dist/browser/inputs/emoji/EmojiPicker.js +841 -0
  53. package/dist/browser/inputs/emoji/EmojiPicker.js.map +1 -0
  54. package/dist/browser/inputs/emoji/emoji-data.js +1903 -0
  55. package/dist/browser/inputs/emoji/emoji-data.js.map +1 -0
  56. package/dist/browser/inputs/emoji/emoji-index.js +209 -0
  57. package/dist/browser/inputs/emoji/emoji-index.js.map +1 -0
  58. package/dist/browser/inputs/emoji/emoji-messages.js +64 -0
  59. package/dist/browser/inputs/emoji/emoji-messages.js.map +1 -0
  60. package/dist/browser/inputs/index.js +5 -0
  61. package/dist/browser/inputs/index.js.map +1 -1
  62. package/dist/browser/inputs/markdown/actions.js +6 -2
  63. package/dist/browser/inputs/markdown/actions.js.map +1 -1
  64. package/dist/browser/inputs/markdown/code-zone.js +38 -2
  65. package/dist/browser/inputs/markdown/code-zone.js.map +1 -1
  66. package/dist/browser/inputs/signature-messages.js +39 -0
  67. package/dist/browser/inputs/signature-messages.js.map +1 -0
  68. package/dist/browser/inputs/signature.js +208 -0
  69. package/dist/browser/inputs/signature.js.map +1 -0
  70. package/dist/browser/internal/render-error.js +49 -0
  71. package/dist/browser/internal/render-error.js.map +1 -0
  72. package/dist/browser/intl/messages.js +102 -0
  73. package/dist/browser/intl/messages.js.map +1 -1
  74. package/dist/browser/layout/AppWorkspace.js +321 -222
  75. package/dist/browser/layout/AppWorkspace.js.map +1 -1
  76. package/dist/browser/layout/FloatingWindow.js +4 -1
  77. package/dist/browser/layout/FloatingWindow.js.map +1 -1
  78. package/dist/browser/layout/SidebarItemPreview.js +5 -1
  79. package/dist/browser/layout/SidebarItemPreview.js.map +1 -1
  80. package/dist/browser/layout/index.js.map +1 -1
  81. package/dist/browser/surfaces/ResourceCard.js +212 -0
  82. package/dist/browser/surfaces/ResourceCard.js.map +1 -0
  83. package/dist/browser/surfaces/index.js +1 -0
  84. package/dist/browser/surfaces/index.js.map +1 -1
  85. package/dist/licenses/emojibase-data.txt +21 -0
  86. package/dist/ssr/actions/ContextMenu.js +3 -1
  87. package/dist/ssr/actions/ContextMenu.js.map +1 -1
  88. package/dist/ssr/actions/Dropdown.js +49 -12
  89. package/dist/ssr/actions/Dropdown.js.map +1 -1
  90. package/dist/ssr/actions/FilterChip.js +4 -1
  91. package/dist/ssr/actions/FilterChip.js.map +1 -1
  92. package/dist/ssr/actions/GestureMenu.js +411 -0
  93. package/dist/ssr/actions/GestureMenu.js.map +1 -0
  94. package/dist/ssr/actions/index.js +1 -0
  95. package/dist/ssr/actions/index.js.map +1 -1
  96. package/dist/ssr/chat/ChatComposer.js +767 -214
  97. package/dist/ssr/chat/ChatComposer.js.map +1 -1
  98. package/dist/ssr/chat/ChatPrimitives.js +9 -3
  99. package/dist/ssr/chat/ChatPrimitives.js.map +1 -1
  100. package/dist/ssr/chat/ChatTimeline.js +19 -1
  101. package/dist/ssr/chat/ChatTimeline.js.map +1 -1
  102. package/dist/ssr/chat/chat-behavior.js +9 -0
  103. package/dist/ssr/chat/chat-behavior.js.map +1 -1
  104. package/dist/ssr/chat/index.js.map +1 -1
  105. package/dist/ssr/chat/types.js.map +1 -1
  106. package/dist/ssr/content/Calendar.js +183 -142
  107. package/dist/ssr/content/Calendar.js.map +1 -1
  108. package/dist/ssr/content/Lightbox.js +19 -5
  109. package/dist/ssr/content/Lightbox.js.map +1 -1
  110. package/dist/ssr/content/MessageRow.js +2 -2
  111. package/dist/ssr/content/MessageRow.js.map +1 -1
  112. package/dist/ssr/content/PdfPreview.js +77 -36
  113. package/dist/ssr/content/PdfPreview.js.map +1 -1
  114. package/dist/ssr/content/Timeline.js +804 -0
  115. package/dist/ssr/content/Timeline.js.map +1 -0
  116. package/dist/ssr/content/VideoPlayer.js +29 -9
  117. package/dist/ssr/content/VideoPlayer.js.map +1 -1
  118. package/dist/ssr/content/chart-inspection.js +7 -2
  119. package/dist/ssr/content/chart-inspection.js.map +1 -1
  120. package/dist/ssr/content/index.js +1 -0
  121. package/dist/ssr/content/index.js.map +1 -1
  122. package/dist/ssr/content/timeline-model.js +579 -0
  123. package/dist/ssr/content/timeline-model.js.map +1 -0
  124. package/dist/ssr/feedback/dialog-core.js +26 -14
  125. package/dist/ssr/feedback/dialog-core.js.map +1 -1
  126. package/dist/ssr/inputs/ChoiceChips.js +66 -0
  127. package/dist/ssr/inputs/ChoiceChips.js.map +1 -0
  128. package/dist/ssr/inputs/ChoiceGroups.js +12 -4
  129. package/dist/ssr/inputs/ChoiceGroups.js.map +1 -1
  130. package/dist/ssr/inputs/FileInputs.js +19 -4
  131. package/dist/ssr/inputs/FileInputs.js.map +1 -1
  132. package/dist/ssr/inputs/SignatureInput.js +404 -0
  133. package/dist/ssr/inputs/SignatureInput.js.map +1 -0
  134. package/dist/ssr/inputs/TextInput.js +13 -1
  135. package/dist/ssr/inputs/TextInput.js.map +1 -1
  136. package/dist/ssr/inputs/emoji/EmojiPicker.js +551 -0
  137. package/dist/ssr/inputs/emoji/EmojiPicker.js.map +1 -0
  138. package/dist/ssr/inputs/emoji/emoji-data.js +1903 -0
  139. package/dist/ssr/inputs/emoji/emoji-data.js.map +1 -0
  140. package/dist/ssr/inputs/emoji/emoji-index.js +209 -0
  141. package/dist/ssr/inputs/emoji/emoji-index.js.map +1 -0
  142. package/dist/ssr/inputs/emoji/emoji-messages.js +64 -0
  143. package/dist/ssr/inputs/emoji/emoji-messages.js.map +1 -0
  144. package/dist/ssr/inputs/index.js +5 -0
  145. package/dist/ssr/inputs/index.js.map +1 -1
  146. package/dist/ssr/inputs/markdown/actions.js +6 -2
  147. package/dist/ssr/inputs/markdown/actions.js.map +1 -1
  148. package/dist/ssr/inputs/markdown/code-zone.js +38 -2
  149. package/dist/ssr/inputs/markdown/code-zone.js.map +1 -1
  150. package/dist/ssr/inputs/signature-messages.js +39 -0
  151. package/dist/ssr/inputs/signature-messages.js.map +1 -0
  152. package/dist/ssr/inputs/signature.js +208 -0
  153. package/dist/ssr/inputs/signature.js.map +1 -0
  154. package/dist/ssr/internal/render-error.js +49 -0
  155. package/dist/ssr/internal/render-error.js.map +1 -0
  156. package/dist/ssr/intl/messages.js +102 -0
  157. package/dist/ssr/intl/messages.js.map +1 -1
  158. package/dist/ssr/layout/AppWorkspace.js +112 -41
  159. package/dist/ssr/layout/AppWorkspace.js.map +1 -1
  160. package/dist/ssr/layout/FloatingWindow.js +4 -1
  161. package/dist/ssr/layout/FloatingWindow.js.map +1 -1
  162. package/dist/ssr/layout/SidebarItemPreview.js +5 -1
  163. package/dist/ssr/layout/SidebarItemPreview.js.map +1 -1
  164. package/dist/ssr/layout/index.js.map +1 -1
  165. package/dist/ssr/surfaces/ResourceCard.js +115 -0
  166. package/dist/ssr/surfaces/ResourceCard.js.map +1 -0
  167. package/dist/ssr/surfaces/index.js +1 -0
  168. package/dist/ssr/surfaces/index.js.map +1 -1
  169. package/dist/styles.css +1 -1
  170. package/dist/types/actions/Dropdown.d.ts +13 -1
  171. package/dist/types/actions/FilterChip.d.ts +5 -0
  172. package/dist/types/actions/GestureMenu.d.ts +35 -0
  173. package/dist/types/actions/index.d.ts +2 -0
  174. package/dist/types/chat/ChatComposer.d.ts +27 -1
  175. package/dist/types/chat/chat-behavior.d.ts +15 -0
  176. package/dist/types/chat/index.d.ts +1 -1
  177. package/dist/types/chat/types.d.ts +34 -0
  178. package/dist/types/content/Calendar.d.ts +28 -8
  179. package/dist/types/content/Lightbox.d.ts +8 -0
  180. package/dist/types/content/Timeline.d.ts +49 -0
  181. package/dist/types/content/index.d.ts +4 -2
  182. package/dist/types/content/timeline-model.d.ts +148 -0
  183. package/dist/types/feedback/dialog-core.d.ts +1 -1
  184. package/dist/types/inputs/ChoiceChips.d.ts +20 -0
  185. package/dist/types/inputs/ChoiceGroups.d.ts +11 -2
  186. package/dist/types/inputs/FileInputs.d.ts +6 -0
  187. package/dist/types/inputs/SignatureInput.d.ts +22 -0
  188. package/dist/types/inputs/emoji/EmojiPicker.d.ts +42 -0
  189. package/dist/types/inputs/emoji/emoji-data.d.ts +2 -0
  190. package/dist/types/inputs/emoji/emoji-index.d.ts +109 -0
  191. package/dist/types/inputs/emoji/emoji-messages.d.ts +30 -0
  192. package/dist/types/inputs/index.d.ts +10 -0
  193. package/dist/types/inputs/markdown/actions.d.ts +2 -0
  194. package/dist/types/inputs/markdown/code-zone.d.ts +7 -0
  195. package/dist/types/inputs/signature-messages.d.ts +11 -0
  196. package/dist/types/inputs/signature.d.ts +72 -0
  197. package/dist/types/internal/render-error.d.ts +13 -0
  198. package/dist/types/intl/messages.d.ts +51 -0
  199. package/dist/types/layout/AppWorkspace.d.ts +17 -0
  200. package/dist/types/layout/SidebarItemPreview.d.ts +2 -0
  201. package/dist/types/layout/index.d.ts +1 -1
  202. package/dist/types/surfaces/ResourceCard.d.ts +31 -0
  203. package/dist/types/surfaces/index.d.ts +2 -0
  204. package/package.json +6 -5
@@ -1,66 +1,128 @@
1
1
  import { template as _$template } from "solid-js/web";
2
2
  import { delegateEvents as _$delegateEvents } from "solid-js/web";
3
3
  import { mergeProps as _$mergeProps } from "solid-js/web";
4
- import { className as _$className } from "solid-js/web";
5
- import { runHydrationEvents as _$runHydrationEvents } from "solid-js/web";
6
- import { setProperty as _$setProperty } from "solid-js/web";
7
4
  import { setStyleProperty as _$setStyleProperty } from "solid-js/web";
5
+ import { runHydrationEvents as _$runHydrationEvents } from "solid-js/web";
8
6
  import { getNextMarker as _$getNextMarker } from "solid-js/web";
7
+ import { memo as _$memo } from "solid-js/web";
8
+ import { className as _$className } from "solid-js/web";
9
9
  import { createComponent as _$createComponent } from "solid-js/web";
10
+ import { setProperty as _$setProperty } from "solid-js/web";
10
11
  import { use as _$use } from "solid-js/web";
11
- import { memo as _$memo } from "solid-js/web";
12
12
  import { setAttribute as _$setAttribute } from "solid-js/web";
13
13
  import { effect as _$effect } from "solid-js/web";
14
14
  import { getNextElement as _$getNextElement } from "solid-js/web";
15
15
  import { insert as _$insert } from "solid-js/web";
16
16
  var _tmpl$ = /*#__PURE__*/_$template(`<span><strong>`),
17
- _tmpl$2 = /*#__PURE__*/_$template(`<div role=status class=k2b-chat-composer__loading><i class="ti ti-loader-2 k2b-spin"aria-hidden=true></i><strong>`),
18
- _tmpl$3 = /*#__PURE__*/_$template(`<div role=status><i class="ti ti-alert-circle"></i> <!$><!/>`),
19
- _tmpl$4 = /*#__PURE__*/_$template(`<div role=status>`),
20
- _tmpl$5 = /*#__PURE__*/_$template(`<div class=k2b-chat-composer-accessory><div class=k2b-chat-composer__commands role=listbox><!$><!/><!$><!/><!$><!/><!$><!/>`),
21
- _tmpl$6 = /*#__PURE__*/_$template(`<div class=k2b-chat-composer-slot><div></div><!$><!/>`),
22
- _tmpl$7 = /*#__PURE__*/_$template(`<div class=k2b-chat-composer__attachments role=list tabindex=0>`),
23
- _tmpl$8 = /*#__PURE__*/_$template(`<div class=k2b-chat-composer__highlight aria-hidden=true><!$><!/>\n`),
24
- _tmpl$9 = /*#__PURE__*/_$template(`<div class=k2b-chat-composer__error role=alert><i class="ti ti-alert-circle"aria-hidden=true></i><!$><!/>`),
25
- _tmpl$0 = /*#__PURE__*/_$template(`<div class=k2b-chat-composer-shell><!$><!/><section role=group><!$><!/><div class=k2b-chat-composer__input role=group><!$><!/><textarea rows=1></textarea></div><!$><!/><footer class=k2b-chat-composer__footer></footer><!$><!/>`),
26
- _tmpl$1 = /*#__PURE__*/_$template(`<button type=button role=option tabindex=-1><i aria-hidden=true></i><strong></strong><small>`),
27
- _tmpl$10 = /*#__PURE__*/_$template(`<button type=button class=k2b-chat-composer__attachment-remove><i class="ti ti-x"aria-hidden=true>`),
28
- _tmpl$11 = /*#__PURE__*/_$template(`<div class=k2b-chat-composer__attachment role=listitem><div class=k2b-chat-composer__attachment-content><!$><!/><!$><!/></div><!$><!/>`),
29
- _tmpl$12 = /*#__PURE__*/_$template(`<img>`),
30
- _tmpl$13 = /*#__PURE__*/_$template(`<div class=k2b-chat-composer__attachment-identity><!$><!/><!$><!/>`),
31
- _tmpl$14 = /*#__PURE__*/_$template(`<i aria-hidden=true>`),
32
- _tmpl$15 = /*#__PURE__*/_$template(`<a class=k2b-chat-composer__attachment-link target=_blank rel="noopener noreferrer"><!$><!/><!$><!/>`),
33
- _tmpl$16 = /*#__PURE__*/_$template(`<button type=button class=k2b-chat-composer__attachment-action><!$><!/><!$><!/>`),
34
- _tmpl$17 = /*#__PURE__*/_$template(`<span>`),
35
- _tmpl$18 = /*#__PURE__*/_$template(`<i class="ti ti-plus"aria-hidden=true>`),
36
- _tmpl$19 = /*#__PURE__*/_$template(`<input class=k2b-sr-only type=file tabindex=-1 aria-hidden=true>`),
37
- _tmpl$20 = /*#__PURE__*/_$template(`<div class=k2b-chat-composer__tools><!$><!/><!$><!/><!$><!/><!$><!/><!$><!/>`),
38
- _tmpl$21 = /*#__PURE__*/_$template(`<div class=k2b-chat-composer__submit><!$><!/><!$><!/><!$><!/><!$><!/>`);
17
+ _tmpl$2 = /*#__PURE__*/_$template(`<input class=k2b-sr-only type=file tabindex=-1 aria-hidden=true>`),
18
+ _tmpl$3 = /*#__PURE__*/_$template(`<i aria-hidden=true>`),
19
+ _tmpl$4 = /*#__PURE__*/_$template(`<i class="ti ti-letter-case"aria-hidden=true>`),
20
+ _tmpl$5 = /*#__PURE__*/_$template(`<div class=k2b-chat-composer__format role=group>`),
21
+ _tmpl$6 = /*#__PURE__*/_$template(`<i class="ti ti-mood-smile"aria-hidden=true>`),
22
+ _tmpl$7 = /*#__PURE__*/_$template(`<i class="ti ti-chevron-up"aria-hidden=true>`),
23
+ _tmpl$8 = /*#__PURE__*/_$template(`<div class=k2b-chat-composer__microphone><!$><!/><!$><!/>`),
24
+ _tmpl$9 = /*#__PURE__*/_$template(`<div class=k2b-chat-composer__highlight aria-hidden=true><!$><!/>\n`),
25
+ _tmpl$0 = /*#__PURE__*/_$template(`<textarea class=k2b-chat-composer__measure rows=1 tabindex=-1 aria-hidden=true readonly>`),
26
+ _tmpl$1 = /*#__PURE__*/_$template(`<div class=k2b-chat-composer__input role=group><!$><!/><textarea rows=1></textarea><!$><!/>`),
27
+ _tmpl$10 = /*#__PURE__*/_$template(`<span>`),
28
+ _tmpl$11 = /*#__PURE__*/_$template(`<div class=k2b-chat-composer-accessory><div class=k2b-chat-composer__commands role=listbox>`),
29
+ _tmpl$12 = /*#__PURE__*/_$template(`<div role=status class=k2b-chat-composer__loading><i class="ti ti-loader-2 k2b-spin"aria-hidden=true></i><strong>`),
30
+ _tmpl$13 = /*#__PURE__*/_$template(`<div role=status><i class="ti ti-alert-circle"></i> <!$><!/>`),
31
+ _tmpl$14 = /*#__PURE__*/_$template(`<div role=status>`),
32
+ _tmpl$15 = /*#__PURE__*/_$template(`<div class=k2b-chat-composer-accessory><div class=k2b-chat-composer__commands role=listbox><!$><!/><!$><!/><!$><!/><!$><!/>`),
33
+ _tmpl$16 = /*#__PURE__*/_$template(`<div class=k2b-chat-composer-slot><div></div><!$><!/><!$><!/>`),
34
+ _tmpl$17 = /*#__PURE__*/_$template(`<div class=k2b-chat-composer__hint aria-live=polite>`),
35
+ _tmpl$18 = /*#__PURE__*/_$template(`<div class=k2b-chat-composer__attachments role=list tabindex=0>`),
36
+ _tmpl$19 = /*#__PURE__*/_$template(`<div class=k2b-chat-composer__error role=alert><i class="ti ti-alert-circle"aria-hidden=true></i><!$><!/>`),
37
+ _tmpl$20 = /*#__PURE__*/_$template(`<div class=k2b-chat-composer__row><!$><!/><!$><!/><div class=k2b-chat-composer__field><!$><!/><div class=k2b-chat-composer__field-tools><!$><!/><!$><!/><!$><!/></div></div><!$><!/>`),
38
+ _tmpl$21 = /*#__PURE__*/_$template(`<div class=k2b-chat-composer-shell><!$><!/><section role=group><!$><!/><!$><!/><!$><!/><!$><!/>`),
39
+ _tmpl$22 = /*#__PURE__*/_$template(`<button type=button role=option tabindex=-1><span class=k2b-chat-composer__emoji-glyph aria-hidden=true></span><strong></strong><!$><!/>`),
40
+ _tmpl$23 = /*#__PURE__*/_$template(`<small>:<!$><!/>:`),
41
+ _tmpl$24 = /*#__PURE__*/_$template(`<button type=button role=option tabindex=-1><i aria-hidden=true></i><strong></strong><small>`),
42
+ _tmpl$25 = /*#__PURE__*/_$template(`<span class=k2b-chat-composer__hint-text>`),
43
+ _tmpl$26 = /*#__PURE__*/_$template(`<span class=k2b-chat-composer__dictation><i aria-hidden=true></i><span>`),
44
+ _tmpl$27 = /*#__PURE__*/_$template(`<button type=button class=k2b-chat-composer__hint-action>`),
45
+ _tmpl$28 = /*#__PURE__*/_$template(`<button type=button class=k2b-chat-composer__attachment-remove><i class="ti ti-x"aria-hidden=true>`),
46
+ _tmpl$29 = /*#__PURE__*/_$template(`<div class=k2b-chat-composer__attachment role=listitem><div class=k2b-chat-composer__attachment-content><!$><!/><!$><!/></div><!$><!/>`),
47
+ _tmpl$30 = /*#__PURE__*/_$template(`<img>`),
48
+ _tmpl$31 = /*#__PURE__*/_$template(`<div class=k2b-chat-composer__attachment-identity><!$><!/><!$><!/>`),
49
+ _tmpl$32 = /*#__PURE__*/_$template(`<a class=k2b-chat-composer__attachment-link target=_blank rel="noopener noreferrer"><!$><!/><!$><!/>`),
50
+ _tmpl$33 = /*#__PURE__*/_$template(`<button type=button class=k2b-chat-composer__attachment-action><!$><!/><!$><!/>`),
51
+ _tmpl$34 = /*#__PURE__*/_$template(`<footer class=k2b-chat-composer__footer>`),
52
+ _tmpl$35 = /*#__PURE__*/_$template(`<div class=k2b-chat-composer__tools><!$><!/><!$><!/><!$><!/><!$><!/><!$><!/><!$><!/><!$><!/>`),
53
+ _tmpl$36 = /*#__PURE__*/_$template(`<div class=k2b-chat-composer__submit><!$><!/><!$><!/><!$><!/><!$><!/><!$><!/>`);
39
54
  import { children, createEffect, createMemo, createSignal, createUniqueId, For, onCleanup, onMount, Show, untrack } from "solid-js";
40
55
  import { Dropdown } from "../actions/Dropdown";
41
56
  import { Tooltip } from "../feedback/Tooltip";
57
+ import { replaceTextareaRange } from "../inputs/editor-dom";
58
+ import { completedEmojiShortcode, emojiInTone, emojiName, emojiShortcodeQuery, loadEmojiIndex, suggestEmoji } from "../inputs/emoji/emoji-index";
42
59
  import { FileDropTarget } from "../inputs/FileDropTarget";
60
+ import { toggleBulletList, toggleInlineMarker } from "../inputs/markdown/actions";
61
+ import { openCodeFence } from "../inputs/markdown/code-zone";
43
62
  import { SelectChip } from "../inputs/SelectChip";
63
+ import { useLocale } from "../intl/locale";
44
64
  import { useUiMessages } from "../intl/messages";
45
65
  import { ChatContextUsage as ContextUsage } from "./ChatPrimitives";
46
- import { executeChatAction, nextChatCommandIndex, reportChatFailure, runChatSubmission } from "./chat-behavior";
66
+ import { conversationEnterAction, executeChatAction, nextChatCommandIndex, reportChatFailure, runChatSubmission } from "./chat-behavior";
47
67
  import { chatCommandQuery, chatMentionSegments, reconcileChatMentions } from "./composer-document";
48
68
  const composerMaxInputHeight = 309;
69
+ /** Emoji suggestions for a `:shortcode`, as many as fit the list without scrolling on a phone. */
70
+ const emojiSuggestionLimit = 8;
49
71
  // Keep editor undo text within approximately 2 MiB, plus the current edit.
50
72
  const composerUndoBudgetChars = 1_000_000;
73
+ /** The row stays short: what a chat message needs. Other Markdown, typed by hand, keeps working. */
74
+ const formatTools = [{
75
+ id: "bold",
76
+ icon: "ti ti-bold",
77
+ label: m => m.boldShortcut,
78
+ run: textarea => toggleInlineMarker(textarea, "**"),
79
+ key: "b"
80
+ }, {
81
+ id: "italic",
82
+ icon: "ti ti-italic",
83
+ label: m => m.italicShortcut,
84
+ run: textarea => toggleInlineMarker(textarea, "*"),
85
+ key: "i"
86
+ }, {
87
+ id: "bullet-list",
88
+ icon: "ti ti-list",
89
+ label: m => m.bulletListShortcut,
90
+ run: toggleBulletList,
91
+ shiftCode: "Digit8"
92
+ }];
93
+ const formatShortcut = event => {
94
+ if (event.altKey || !(event.ctrlKey || event.metaKey)) return undefined;
95
+ return formatTools.find(tool => event.shiftKey ? tool.shiftCode === event.code : tool.key === event.key.toLowerCase());
96
+ };
97
+ const touchOnlyQuery = "(any-pointer: coarse) and (not (any-pointer: fine))";
98
+ const isTouchOnly = () => typeof matchMedia === "function" && matchMedia(touchOnlyQuery).matches;
99
+ /** How long a press on the microphone lasts before it asks for a voice message instead of dictation. */
100
+ const microphoneHoldMs = 500;
101
+ /** Keeps the field focused (and a phone's keyboard open) when a composer button is pressed with a mouse or finger. */
102
+ const keepFieldFocus = event => event.preventDefault();
51
103
  const attachmentIcon = attachment => attachment.icon ?? (attachment.kind === "image" ? "ti ti-photo" : attachment.kind === "resource" ? "ti ti-link" : "ti ti-file");
104
+ const hasContent = items => items.some(item => item != null && typeof item !== "boolean" && item !== "");
52
105
  export function ChatComposer(props) {
53
106
  const accessory = children(() => props.accessory);
54
- const hasAccessory = () => accessory.toArray().some(item => item != null && typeof item !== "boolean" && item !== "");
107
+ const hasAccessory = () => hasContent(accessory.toArray());
108
+ const hint = children(() => props.hint);
55
109
  const messages = useUiMessages();
56
110
  const commandListId = `k2b-chat-commands-${createUniqueId().replace(/[^A-Za-z0-9_-]/g, "-")}`;
111
+ const formatGroupId = `${commandListId}-format`;
57
112
  const [selectedCommandIndex, setSelectedCommandIndex] = createSignal(0);
58
113
  const [addingFiles, setAddingFiles] = createSignal(false);
59
114
  const [submitting, setSubmitting] = createSignal(false);
60
115
  let composerRef;
61
116
  let textareaRef;
62
117
  let fileInputRef;
118
+ let measureRef;
119
+ let microphoneRef;
63
120
  let sawRunning = props.state === "running";
121
+ const conversation = () => props.variant === "conversation";
122
+ const [formattingOpen, setFormattingOpen] = createSignal(false);
123
+ const [microphoneMenuOpen, setMicrophoneMenuOpen] = createSignal(false);
124
+ const dictation = () => props.microphone?.dictation ?? null;
125
+ const showHint = () => conversation() || dictation() !== null || hasContent(hint.toArray());
64
126
  const state = () => props.state ?? "idle";
65
127
  const running = () => state() === "running";
66
128
  const stopping = () => state() === "stopping";
@@ -77,15 +139,29 @@ export function ChatComposer(props) {
77
139
  let highlightRef;
78
140
  let commandListRef;
79
141
  const mentions = () => props.mentions ?? [];
142
+ const locale = useLocale();
143
+ const [emojiIndex, setEmojiIndex] = createSignal();
144
+ const emojiQuery = createMemo(() => !props.emoji || dismissed() || composing() ? null : emojiShortcodeQuery(props.value, caret(), selectionEnd()));
145
+ // The emoji data loads with the first `:shortcode`; a failed load only means no suggestions.
146
+ createEffect(() => {
147
+ if (emojiQuery() && !emojiIndex()) loadEmojiIndex().then(setEmojiIndex, () => undefined);
148
+ });
149
+ const emojiMatches = createMemo(() => {
150
+ const token = emojiQuery();
151
+ const index = emojiIndex();
152
+ return token && index ? suggestEmoji(index, token.query, emojiSuggestionLimit) : [];
153
+ });
154
+ const emojiOpen = () => emojiMatches().length > 0;
80
155
  const commandQuery = createMemo(() => dismissed() || composing() ? null : chatCommandQuery(props.value, caret(), selectionEnd()));
81
156
  const commandMatches = createMemo(() => {
82
157
  const token = commandQuery();
83
158
  if (!token) return [];
84
159
  return [...(props.commands ?? []).filter(command => command.name.toLowerCase().includes(token.query.toLowerCase())), ...searchResults()];
85
160
  });
86
- const commandsOpen = () => Boolean(commandQuery() && (props.commands?.length || props.searchCommands));
161
+ const commandsOpen = () => Boolean(!emojiOpen() && commandQuery() && (props.commands?.length || props.searchCommands));
162
+ const suggestionsOpen = () => commandsOpen() || emojiOpen();
87
163
  createEffect(() => {
88
- if (!commandsOpen()) return;
164
+ if (!suggestionsOpen()) return;
89
165
  let disposed = false;
90
166
  const measure = () => {
91
167
  if (disposed || !commandListRef) return;
@@ -182,7 +258,10 @@ export function ChatComposer(props) {
182
258
  setSelectionEnd(textareaRef?.selectionEnd ?? props.value.length);
183
259
  };
184
260
  const selectedCommand = () => commandMatches()[selectedCommandIndex()];
185
- const blocked = () => Boolean(props.disabled || stopping() || state() === "submitting" || executing() || addingFiles() || submitting());
261
+ const busy = () => Boolean(props.disabled || stopping() || state() === "submitting" || executing() || addingFiles());
262
+ const blocked = () => busy() || submitting();
263
+ /** The conversation field stays editable while a message is sent, so it keeps the focus and a phone its keyboard. */
264
+ const editBlocked = () => conversation() ? busy() : blocked();
186
265
  const hasDraft = () => Boolean(props.value.trim() || !running() && attachments().length > 0);
187
266
  const canSubmit = () => !blocked() && hasDraft() && !(running() && runningSubmitIntent() === "steer" && mentions().length);
188
267
  const canSelectFiles = () => Boolean(props.fileSelection && !props.fileSelection.disabled && !running() && !blocked());
@@ -202,7 +281,7 @@ export function ChatComposer(props) {
202
281
  icon: addingFiles() ? "ti ti-loader-2 k2b-spin" : "ti ti-paperclip",
203
282
  label: props.fileSelection.label ?? messages().attachFiles,
204
283
  disabled: !canSelectFiles(),
205
- action: () => fileInputRef?.click()
284
+ action: () => chooseFiles()
206
285
  });
207
286
  }
208
287
  for (const action of props.menuActions ?? []) {
@@ -218,6 +297,14 @@ export function ChatComposer(props) {
218
297
  };
219
298
  const autoResize = () => {
220
299
  if (!textareaRef) return;
300
+ if (conversation()) {
301
+ // A hidden copy measures the text. Collapsing the field itself would shrink the composer for a frame, and
302
+ // WebKit then clamps the scroll position of the conversation above it. CSS caps the height.
303
+ if (!measureRef) return;
304
+ measureRef.value = textareaRef.value;
305
+ textareaRef.style.height = `${measureRef.scrollHeight}px`;
306
+ return;
307
+ }
221
308
  textareaRef.style.height = "auto";
222
309
  textareaRef.style.height = `${Math.min(textareaRef.scrollHeight, composerMaxInputHeight)}px`;
223
310
  };
@@ -225,14 +312,22 @@ export function ChatComposer(props) {
225
312
  onMount(() => {
226
313
  autoResize();
227
314
  if (props.focusToken !== undefined) focus();
315
+ // The copy follows the field's width, so a narrower composer measures more lines.
316
+ if (measureRef && typeof ResizeObserver === "function") {
317
+ const observer = new ResizeObserver(() => autoResize());
318
+ observer.observe(measureRef);
319
+ onCleanup(() => observer.disconnect());
320
+ }
228
321
  });
229
322
  createEffect(() => {
230
323
  commandMatches();
324
+ emojiMatches();
231
325
  setSelectedCommandIndex(0);
232
326
  });
233
327
  createEffect(() => {
234
328
  const index = selectedCommandIndex();
235
329
  commandMatches();
330
+ emojiMatches();
236
331
  queueMicrotask(() => {
237
332
  const list = commandListRef;
238
333
  const item = list?.querySelector(`[id="${commandListId}-${index}"]`);
@@ -268,6 +363,13 @@ export function ChatComposer(props) {
268
363
  _$effect(() => _$setAttribute(_el$2, "title", attachment.name));
269
364
  return _el$;
270
365
  })();
366
+ const chooseFiles = () => {
367
+ const selection = props.fileSelection;
368
+ if (!selection?.choose) return fileInputRef?.click();
369
+ selection.choose().then(
370
+ // A single-file composer keeps the first chosen file, as its file dialog and drops do.
371
+ files => void runFiles(selection.multiple === false ? files.slice(0, 1) : files), error => (props.fileSelection?.onError ?? props.onError)?.(error));
372
+ };
271
373
  const runFiles = async files => {
272
374
  if (!canSelectFiles()) return;
273
375
  const selected = Array.from(files);
@@ -305,8 +407,17 @@ export function ChatComposer(props) {
305
407
  },
306
408
  perform: () => props.onSubmit(input),
307
409
  restore: () => {
308
- props.onValueChange(previousValue);
309
- props.onMentionsChange?.(previousMentions);
410
+ // Text typed while the submission ran stays, after the returned draft. Its mentions are read first, because
411
+ // an application may already move them when the text changes.
412
+ const typed = props.value;
413
+ const typedMentions = mentions();
414
+ const shift = previousValue.length + 1;
415
+ props.onValueChange(typed ? `${previousValue}\n${typed}` : previousValue);
416
+ props.onMentionsChange?.(typed ? [...previousMentions, ...typedMentions.map(mention => ({
417
+ ...mention,
418
+ start: mention.start + shift,
419
+ end: mention.end + shift
420
+ }))] : previousMentions);
310
421
  if (intent !== "steer") setAttachments(previousAttachments);
311
422
  },
312
423
  onError: props.onError
@@ -363,13 +474,74 @@ export function ChatComposer(props) {
363
474
  focus();
364
475
  });
365
476
  };
477
+
478
+ /** Replaces `start`–`end` with the emoji through the editing path, so the browser's undo restores the shortcode. */
479
+ const insertEmoji = (start, end, emoji) => {
480
+ if (!textareaRef || editBlocked()) return;
481
+ replaceTextareaRange(textareaRef, start, end, emoji);
482
+ syncCaret();
483
+ reportChatFailure(() => props.emoji?.onPick?.(emoji), props.onError);
484
+ };
485
+ const pickEmojiSuggestion = position => {
486
+ const token = emojiQuery();
487
+ const entry = emojiMatches()[position];
488
+ if (!token || !entry) return;
489
+ insertEmoji(token.start, token.end, emojiInTone(entry, props.emoji?.skinTone ?? 0));
490
+ };
491
+ /**
492
+ * A typed colon loads the emoji data, and the closing colon of a known `:shortcode:` turns it into its emoji. A
493
+ * shortcode closed before the data arrived turns when it arrives, as long as nothing changed in the meantime.
494
+ */
495
+ const completeShortcode = () => {
496
+ const textarea = textareaRef;
497
+ if (!props.emoji || !textarea) return;
498
+ const {
499
+ value,
500
+ selectionStart: caret
501
+ } = textarea;
502
+ const completed = completedEmojiShortcode(value, caret);
503
+ const convert = index => {
504
+ const entry = completed && index.byShortcode.get(completed.shortcode.toLowerCase());
505
+ if (completed && entry) insertEmoji(completed.start, completed.end, emojiInTone(entry, props.emoji?.skinTone ?? 0));
506
+ };
507
+ const index = emojiIndex();
508
+ if (index) {
509
+ convert(index);
510
+ return;
511
+ }
512
+ loadEmojiIndex().then(loaded => {
513
+ setEmojiIndex(loaded);
514
+ const untouched = textarea.value === value && textarea.selectionStart === caret && textarea.selectionEnd === caret;
515
+ if (untouched && textarea.matches(":focus")) convert(loaded);
516
+ }, () => undefined);
517
+ };
366
518
  const onKeyDown = event => {
367
- if (event.isComposing || composing()) return;
519
+ // WebKit ends the composition before the keydown of the Enter that confirms it; that keydown keeps keyCode 229.
520
+ if (event.isComposing || event.keyCode === 229 || composing()) return;
368
521
  if ((event.ctrlKey || event.metaKey) && event.key.toLowerCase() === "z") {
369
522
  event.preventDefault();
370
523
  restoreHistory(event.shiftKey ? 1 : -1);
371
524
  return;
372
525
  }
526
+ if (emojiOpen()) {
527
+ if (event.key === "ArrowUp" || event.key === "ArrowDown") {
528
+ event.preventDefault();
529
+ setSelectedCommandIndex(index => nextChatCommandIndex(index, emojiMatches().length, event.key === "ArrowUp" ? -1 : 1));
530
+ return;
531
+ }
532
+ // Only a plain Enter or Tab picks: Shift+Enter still breaks the line, Shift+Tab still moves the focus back.
533
+ const plain = !event.shiftKey && !event.altKey && !event.ctrlKey && !event.metaKey;
534
+ if (plain && (event.key === "Enter" || event.key === "Tab")) {
535
+ event.preventDefault();
536
+ pickEmojiSuggestion(selectedCommandIndex());
537
+ return;
538
+ }
539
+ if (event.key === "Escape") {
540
+ event.preventDefault();
541
+ setDismissed(true);
542
+ return;
543
+ }
544
+ }
373
545
  const matches = commandMatches();
374
546
  if (commandsOpen()) {
375
547
  if (event.key === "ArrowUp" || event.key === "ArrowDown") {
@@ -377,7 +549,8 @@ export function ChatComposer(props) {
377
549
  setSelectedCommandIndex(index => nextChatCommandIndex(index, matches.length, event.key === "ArrowUp" ? -1 : 1));
378
550
  return;
379
551
  }
380
- if ((event.key === "Enter" || event.key === "Tab") && matches.length > 0) {
552
+ // Ctrl/⌘+Enter sends, also while suggestions are open.
553
+ if ((event.key === "Tab" || event.key === "Enter" && !event.ctrlKey && !event.metaKey) && matches.length > 0) {
381
554
  event.preventDefault();
382
555
  const command = selectedCommand();
383
556
  if (command) void executeCommand(command);
@@ -389,79 +562,700 @@ export function ChatComposer(props) {
389
562
  return;
390
563
  }
391
564
  }
392
- if (event.key === "Enter" && !event.shiftKey && !event.isComposing) {
565
+ const format = props.formatting && textareaRef ? formatShortcut(event) : undefined;
566
+ if (format && textareaRef) {
567
+ event.preventDefault();
568
+ format.run(textareaRef);
569
+ return;
570
+ }
571
+ if (event.key !== "Enter") return;
572
+ if (conversation()) {
573
+ const action = conversationEnterAction(event, {
574
+ sendKey: props.sendKey ?? "enter",
575
+ touchOnly: isTouchOnly(),
576
+ inCodeBlock: openCodeFence(props.value, textareaRef?.selectionStart ?? props.value.length) !== null
577
+ });
578
+ if (action === "send") {
579
+ event.preventDefault();
580
+ void submit();
581
+ }
582
+ return;
583
+ }
584
+ const send = props.sendKey === "mod-enter" ? event.ctrlKey || event.metaKey : !event.shiftKey;
585
+ if (send && !event.isComposing) {
393
586
  event.preventDefault();
394
587
  void submit();
395
588
  }
396
589
  };
590
+ const insertText = text => {
591
+ if (!textareaRef || editBlocked()) return;
592
+ replaceTextareaRange(textareaRef, textareaRef.selectionStart, textareaRef.selectionEnd, text);
593
+ };
594
+ let holdTimer;
595
+ let held = false;
596
+ const releaseHold = () => {
597
+ clearTimeout(holdTimer);
598
+ holdTimer = undefined;
599
+ };
600
+ onCleanup(releaseHold);
601
+ const microphoneDisabled = () => Boolean(props.microphone?.disabled || blocked() || dictation() === "refining");
602
+ const microphoneItems = () => {
603
+ const microphone = props.microphone;
604
+ const items = [];
605
+ if (microphone?.onDictate) {
606
+ const dictate = microphone.onDictate;
607
+ items.push({
608
+ icon: "ti ti-microphone",
609
+ label: messages().dictate,
610
+ action: () => reportChatFailure(dictate, props.onError)
611
+ });
612
+ }
613
+ if (microphone?.onVoiceMessage) {
614
+ const record = microphone.onVoiceMessage;
615
+ items.push({
616
+ icon: "ti ti-player-record",
617
+ label: messages().recordVoiceMessage,
618
+ action: () => reportChatFailure(record, props.onError)
619
+ });
620
+ }
621
+ return items;
622
+ };
623
+ const dictationStatus = () => {
624
+ switch (dictation()) {
625
+ case "listening":
626
+ return {
627
+ icon: "ti ti-microphone",
628
+ text: messages().dictationListening
629
+ };
630
+ case "refining":
631
+ return {
632
+ icon: "ti ti-loader-2 k2b-spin",
633
+ text: messages().dictationRefining
634
+ };
635
+ case "refined":
636
+ return {
637
+ icon: "ti ti-sparkles",
638
+ text: messages().dictationRefined
639
+ };
640
+ case "unrefined":
641
+ return {
642
+ icon: "ti ti-microphone",
643
+ text: messages().dictationUnrefined
644
+ };
645
+ case "interrupted":
646
+ return {
647
+ icon: "ti ti-alert-triangle",
648
+ text: messages().dictationInterrupted
649
+ };
650
+ default:
651
+ return null;
652
+ }
653
+ };
654
+ const fileInput = () => _$createComponent(Show, {
655
+ get when() {
656
+ return props.fileSelection;
657
+ },
658
+ get children() {
659
+ var _el$3 = _$getNextElement(_tmpl$2);
660
+ _el$3.addEventListener("change", event => {
661
+ if (event.currentTarget.files?.length) void runFiles(event.currentTarget.files);
662
+ });
663
+ var _ref$ = fileInputRef;
664
+ typeof _ref$ === "function" ? _$use(_ref$, _el$3) : fileInputRef = _el$3;
665
+ _$effect(_p$ => {
666
+ var _v$ = props.fileSelection?.accept,
667
+ _v$2 = props.fileSelection?.multiple ?? true;
668
+ _v$ !== _p$.e && _$setAttribute(_el$3, "accept", _p$.e = _v$);
669
+ _v$2 !== _p$.t && _$setProperty(_el$3, "multiple", _p$.t = _v$2);
670
+ return _p$;
671
+ }, {
672
+ e: undefined,
673
+ t: undefined
674
+ });
675
+ return _el$3;
676
+ }
677
+ });
678
+ const addMenu = (icon, extraClass = "") => _$createComponent(Dropdown.Root, {
679
+ position: "top-right",
680
+ get label() {
681
+ return messages().addToChat;
682
+ },
683
+ get items() {
684
+ return menuItems();
685
+ },
686
+ get disabled() {
687
+ return blocked();
688
+ },
689
+ get children() {
690
+ return _$createComponent(Dropdown.Trigger, {
691
+ appearance: "plain",
692
+ "class": `k2b-chat-composer__icon-action${extraClass}`,
693
+ get label() {
694
+ return messages().addToChat;
695
+ },
696
+ get tooltip() {
697
+ return messages().addToChat;
698
+ },
699
+ get children() {
700
+ var _el$4 = _$getNextElement(_tmpl$3);
701
+ _$className(_el$4, icon);
702
+ return _el$4;
703
+ }
704
+ });
705
+ }
706
+ });
707
+
708
+ /** The conversation's attach button opens the file choice directly; other actions turn it into the add menu. */
709
+ const attachControl = () => _$createComponent(Show, {
710
+ get when() {
711
+ return props.menuActions?.length;
712
+ },
713
+ get fallback() {
714
+ return _$createComponent(Show, {
715
+ get when() {
716
+ return props.fileSelection;
717
+ },
718
+ children: selection => _$createComponent(Tooltip.Trigger, {
719
+ type: "button",
720
+ "class": "k2b-chat-composer__icon-action k2b-chat-composer__attach",
721
+ get ["aria-label"]() {
722
+ return selection().label ?? messages().attachFiles;
723
+ },
724
+ get content() {
725
+ return selection().label ?? messages().attachFiles;
726
+ },
727
+ get disabled() {
728
+ return !canSelectFiles();
729
+ },
730
+ onClick: chooseFiles,
731
+ get children() {
732
+ var _el$5 = _$getNextElement(_tmpl$3);
733
+ _$effect(() => _$className(_el$5, addingFiles() ? "ti ti-loader-2 k2b-spin" : "ti ti-plus"));
734
+ return _el$5;
735
+ }
736
+ })
737
+ });
738
+ },
739
+ get children() {
740
+ return addMenu("ti ti-plus", " k2b-chat-composer__attach");
741
+ }
742
+ });
743
+ const formatToggle = () => _$createComponent(Show, {
744
+ get when() {
745
+ return props.formatting;
746
+ },
747
+ get children() {
748
+ return _$createComponent(Tooltip.Trigger, {
749
+ type: "button",
750
+ "class": "k2b-chat-composer__icon-action k2b-chat-composer__format-toggle",
751
+ get ["aria-label"]() {
752
+ return messages().composerFormatting;
753
+ },
754
+ get ["aria-pressed"]() {
755
+ return formattingOpen();
756
+ },
757
+ get ["aria-controls"]() {
758
+ return formattingOpen() ? formatGroupId : undefined;
759
+ },
760
+ get content() {
761
+ return messages().composerFormatting;
762
+ },
763
+ onMouseDown: keepFieldFocus,
764
+ onClick: () => setFormattingOpen(open => !open),
765
+ get children() {
766
+ return _$getNextElement(_tmpl$4);
767
+ }
768
+ });
769
+ }
770
+ });
771
+
772
+ /** One row of fixed height. It shows every button at once, also on a phone, so nothing hides behind a scroll. */
773
+ const formatRow = () => _$createComponent(Show, {
774
+ get when() {
775
+ return _$memo(() => !!props.formatting)() && formattingOpen();
776
+ },
777
+ get children() {
778
+ var _el$7 = _$getNextElement(_tmpl$5);
779
+ _$setAttribute(_el$7, "id", formatGroupId);
780
+ _$insert(_el$7, _$createComponent(For, {
781
+ each: formatTools,
782
+ children: tool => _$createComponent(Tooltip.Trigger, {
783
+ type: "button",
784
+ "class": "k2b-chat-composer__icon-action",
785
+ get ["aria-label"]() {
786
+ return tool.label(messages());
787
+ },
788
+ get content() {
789
+ return tool.label(messages());
790
+ },
791
+ get disabled() {
792
+ return editBlocked();
793
+ },
794
+ onMouseDown: keepFieldFocus,
795
+ onClick: () => {
796
+ if (textareaRef) tool.run(textareaRef);
797
+ },
798
+ get children() {
799
+ var _el$8 = _$getNextElement(_tmpl$3);
800
+ _$effect(() => _$className(_el$8, tool.icon));
801
+ return _el$8;
802
+ }
803
+ })
804
+ }));
805
+ _$effect(() => _$setAttribute(_el$7, "aria-label", messages().composerFormatting));
806
+ return _el$7;
807
+ }
808
+ });
809
+ const emojiButton = () => _$createComponent(Show, {
810
+ get when() {
811
+ return props.emoji;
812
+ },
813
+ children: emoji => _$createComponent(Tooltip.Trigger, {
814
+ type: "button",
815
+ "class": "k2b-chat-composer__icon-action k2b-chat-composer__emoji",
816
+ get ["aria-label"]() {
817
+ return messages().insertEmoji;
818
+ },
819
+ get content() {
820
+ return messages().insertEmoji;
821
+ },
822
+ get disabled() {
823
+ return editBlocked();
824
+ },
825
+ onMouseDown: keepFieldFocus,
826
+ onClick: event => {
827
+ const anchor = event.currentTarget;
828
+ reportChatFailure(() => emoji().onOpen({
829
+ anchor,
830
+ insert: insertText
831
+ }), props.onError);
832
+ },
833
+ get children() {
834
+ return _$getNextElement(_tmpl$6);
835
+ }
836
+ })
837
+ });
838
+ const microphoneControl = () => _$createComponent(Show, {
839
+ get when() {
840
+ return _$memo(() => !!(props.microphone?.onDictate || props.microphone?.onVoiceMessage))() ? props.microphone : undefined;
841
+ },
842
+ children: microphone => (() => {
843
+ var _el$0 = _$getNextElement(_tmpl$8),
844
+ _el$11 = _el$0.firstChild,
845
+ [_el$12, _co$] = _$getNextMarker(_el$11.nextSibling),
846
+ _el$13 = _el$12.nextSibling,
847
+ [_el$14, _co$2] = _$getNextMarker(_el$13.nextSibling);
848
+ var _ref$2 = microphoneRef;
849
+ typeof _ref$2 === "function" ? _$use(_ref$2, _el$0) : microphoneRef = _el$0;
850
+ _$insert(_el$0, _$createComponent(Tooltip.Trigger, {
851
+ type: "button",
852
+ "class": "k2b-chat-composer__icon-action k2b-chat-composer__microphone-button",
853
+ get ["data-state"]() {
854
+ return dictation() ?? undefined;
855
+ },
856
+ get disabled() {
857
+ return microphoneDisabled();
858
+ },
859
+ get ["aria-pressed"]() {
860
+ return _$memo(() => !!microphone().onDictate)() ? dictation() === "listening" : undefined;
861
+ },
862
+ get ["aria-haspopup"]() {
863
+ return microphone().onDictate ? undefined : "menu";
864
+ },
865
+ get ["aria-expanded"]() {
866
+ return _$memo(() => !!microphone().onDictate)() ? undefined : microphoneMenuOpen();
867
+ },
868
+ get ["aria-label"]() {
869
+ return _$memo(() => !!microphone().onDictate)() ? messages().dictate : messages().recordVoiceMessage;
870
+ },
871
+ get content() {
872
+ return _$memo(() => dictation() === "listening")() ? messages().stopDictation : _$memo(() => !!microphone().onDictate)() ? _$memo(() => !!microphone().onVoiceMessage)() ? messages().dictateOrHold : messages().dictate : messages().recordVoiceMessage;
873
+ },
874
+ onMouseDown: keepFieldFocus,
875
+ onContextMenu: event => event.preventDefault(),
876
+ onPointerDown: event => {
877
+ held = false;
878
+ releaseHold();
879
+ const record = microphone().onVoiceMessage;
880
+ if (event.button !== 0 || !record || dictation() === "listening") return;
881
+ holdTimer = setTimeout(() => {
882
+ // The composer may have become blocked, or recording withdrawn, during the press.
883
+ const current = props.microphone?.onVoiceMessage;
884
+ if (!current || microphoneDisabled()) return;
885
+ held = true;
886
+ reportChatFailure(current, props.onError);
887
+ }, microphoneHoldMs);
888
+ },
889
+ onPointerUp: releaseHold,
890
+ onPointerCancel: releaseHold,
891
+ onPointerLeave: releaseHold,
892
+ onClick: event => {
893
+ // A press that already asked for a voice message ends here; a key press never holds.
894
+ if (held) {
895
+ held = false;
896
+ if (event.detail > 0) return;
897
+ }
898
+ const dictate = microphone().onDictate;
899
+ if (dictate) {
900
+ reportChatFailure(dictate, props.onError);
901
+ return;
902
+ }
903
+ setMicrophoneMenuOpen(true);
904
+ // From the keyboard it opens the menu like a menu button: the focus moves to the first item.
905
+ if (event.detail === 0) {
906
+ queueMicrotask(() => microphoneRef?.querySelector('[role="menuitem"]:not(:disabled)')?.focus());
907
+ }
908
+ },
909
+ get children() {
910
+ var _el$1 = _$getNextElement(_tmpl$3);
911
+ _$effect(() => _$className(_el$1, dictation() === "listening" ? "ti ti-player-stop" : dictation() === "refining" ? "ti ti-loader-2 k2b-spin" : "ti ti-microphone"));
912
+ return _el$1;
913
+ }
914
+ }), _el$12, _co$);
915
+ _$insert(_el$0, _$createComponent(Show, {
916
+ get when() {
917
+ return microphone().onVoiceMessage;
918
+ },
919
+ get children() {
920
+ return _$createComponent(Dropdown.Root, {
921
+ position: "top-left",
922
+ get label() {
923
+ return messages().microphoneOptions;
924
+ },
925
+ get items() {
926
+ return microphoneItems();
927
+ },
928
+ get disabled() {
929
+ return microphoneDisabled();
930
+ },
931
+ get open() {
932
+ return microphoneMenuOpen();
933
+ },
934
+ onOpenChange: setMicrophoneMenuOpen,
935
+ get children() {
936
+ return _$createComponent(Dropdown.Trigger, {
937
+ appearance: "plain",
938
+ "class": "k2b-chat-composer__icon-action k2b-chat-composer__microphone-menu",
939
+ get label() {
940
+ return messages().microphoneOptions;
941
+ },
942
+ get tooltip() {
943
+ return messages().microphoneOptions;
944
+ },
945
+ get children() {
946
+ return _$getNextElement(_tmpl$7);
947
+ }
948
+ });
949
+ }
950
+ });
951
+ }
952
+ }), _el$14, _co$2);
953
+ return _el$0;
954
+ })()
955
+ });
956
+ const sendControl = () => _$createComponent(Show, {
957
+ get when() {
958
+ return _$memo(() => !!(running() && !hasDraft()))() && props.onStop;
959
+ },
960
+ get fallback() {
961
+ return _$createComponent(Tooltip.Trigger, {
962
+ type: "button",
963
+ "class": "k2b-chat-composer__send",
964
+ get disabled() {
965
+ return !canSubmit();
966
+ },
967
+ onMouseDown: event => {
968
+ if (conversation()) keepFieldFocus(event);
969
+ },
970
+ get ["aria-label"]() {
971
+ 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;
972
+ },
973
+ get content() {
974
+ return _$memo(() => !!running())() ? _$memo(() => runningSubmitIntent() === "queue")() ? messages().queueMessage : messages().steerResponse : messages().sendMessage;
975
+ },
976
+ onClick: () => void submit(),
977
+ get children() {
978
+ var _el$16 = _$getNextElement(_tmpl$3);
979
+ _$effect(() => _$className(_el$16, submitting() ? "ti ti-loader-2 k2b-spin" : conversation() ? "ti ti-send" : "ti ti-arrow-up"));
980
+ return _el$16;
981
+ }
982
+ });
983
+ },
984
+ get children() {
985
+ return _$createComponent(Tooltip.Trigger, {
986
+ type: "button",
987
+ "class": "k2b-chat-composer__stop",
988
+ get disabled() {
989
+ return stopping();
990
+ },
991
+ get ["aria-label"]() {
992
+ return _$memo(() => !!stopping())() ? messages().stopping : messages().stopResponse;
993
+ },
994
+ get content() {
995
+ return messages().stopResponse;
996
+ },
997
+ onClick: () => reportChatFailure(() => props.onStop?.(), props.onError),
998
+ get children() {
999
+ var _el$15 = _$getNextElement(_tmpl$3);
1000
+ _$effect(() => _$className(_el$15, stopping() ? "ti ti-loader-2 k2b-spin" : "ti ti-player-stop"));
1001
+ return _el$15;
1002
+ }
1003
+ });
1004
+ }
1005
+ });
1006
+ const field = () => (() => {
1007
+ var _el$17 = _$getNextElement(_tmpl$1),
1008
+ _el$24 = _el$17.firstChild,
1009
+ [_el$25, _co$4] = _$getNextMarker(_el$24.nextSibling),
1010
+ _el$22 = _el$25.nextSibling,
1011
+ _el$26 = _el$22.nextSibling,
1012
+ [_el$27, _co$5] = _$getNextMarker(_el$26.nextSibling);
1013
+ _$insert(_el$17, _$createComponent(Show, {
1014
+ get when() {
1015
+ return mentions().length > 0;
1016
+ },
1017
+ get children() {
1018
+ var _el$18 = _$getNextElement(_tmpl$9),
1019
+ _el$20 = _el$18.firstChild,
1020
+ [_el$21, _co$3] = _$getNextMarker(_el$20.nextSibling),
1021
+ _el$19 = _el$21.nextSibling;
1022
+ var _ref$3 = highlightRef;
1023
+ typeof _ref$3 === "function" ? _$use(_ref$3, _el$18) : highlightRef = _el$18;
1024
+ _$insert(_el$18, _$createComponent(For, {
1025
+ get each() {
1026
+ return chatMentionSegments(props.value, mentions());
1027
+ },
1028
+ children: part => (() => {
1029
+ var _el$28 = _$getNextElement(_tmpl$10);
1030
+ _$insert(_el$28, () => part.text);
1031
+ _$effect(() => _el$28.classList.toggle("k2b-chat-composer__mention", !!Boolean(part.mention)));
1032
+ return _el$28;
1033
+ })()
1034
+ }), _el$21, _co$3);
1035
+ return _el$18;
1036
+ }
1037
+ }), _el$25, _co$4);
1038
+ _el$22.$$keydown = onKeyDown;
1039
+ _el$22.$$beforeinput = event => {
1040
+ if (event.inputType === "historyUndo" || event.inputType === "historyRedo") {
1041
+ event.preventDefault();
1042
+ restoreHistory(event.inputType === "historyUndo" ? -1 : 1);
1043
+ }
1044
+ };
1045
+ _el$22.addEventListener("scroll", () => {
1046
+ if (highlightRef && textareaRef) highlightRef.scrollTop = textareaRef.scrollTop;
1047
+ });
1048
+ _el$22.addEventListener("compositionend", () => {
1049
+ setComposing(false);
1050
+ syncCaret();
1051
+ });
1052
+ _el$22.addEventListener("compositionstart", () => setComposing(true));
1053
+ _el$22.$$keyup = syncCaret;
1054
+ _el$22.$$click = () => {
1055
+ setDismissed(false);
1056
+ syncCaret();
1057
+ };
1058
+ _el$22.addEventListener("blur", () => setDismissed(true));
1059
+ _el$22.addEventListener("select", syncCaret);
1060
+ _el$22.addEventListener("paste", event => {
1061
+ const clipboardData = event.clipboardData;
1062
+ if (canSelectFiles() && clipboardData?.files.length) {
1063
+ event.preventDefault();
1064
+ void runFiles(clipboardData.files);
1065
+ return;
1066
+ }
1067
+ props.onPaste?.(event);
1068
+ });
1069
+ _el$22.$$input = event => {
1070
+ edit(event.currentTarget.value);
1071
+ syncCaret();
1072
+ autoResize();
1073
+ const input = event;
1074
+ if (input.inputType === "insertText" && input.data === ":") queueMicrotask(completeShortcode);
1075
+ };
1076
+ var _ref$4 = textareaRef;
1077
+ typeof _ref$4 === "function" ? _$use(_ref$4, _el$22) : textareaRef = _el$22;
1078
+ _$insert(_el$17, _$createComponent(Show, {
1079
+ get when() {
1080
+ return conversation();
1081
+ },
1082
+ get children() {
1083
+ var _el$23 = _$getNextElement(_tmpl$0);
1084
+ var _ref$5 = measureRef;
1085
+ typeof _ref$5 === "function" ? _$use(_ref$5, _el$23) : measureRef = _el$23;
1086
+ return _el$23;
1087
+ }
1088
+ }), _el$27, _co$5);
1089
+ _$effect(_p$ => {
1090
+ var _v$3 = messages().messageInput,
1091
+ _v$4 = !!(mentions().length > 0),
1092
+ _v$5 = editBlocked(),
1093
+ _v$6 = conversation() ? "enter" : undefined,
1094
+ _v$7 = props.placeholder ?? (running() ? messages().addGuidance : conversation() ? messages().writeConversationMessage : messages().writeMessage),
1095
+ _v$8 = props.inputLabel ?? messages().message,
1096
+ _v$9 = suggestionsOpen() ? "combobox" : undefined,
1097
+ _v$0 = suggestionsOpen() ? "list" : undefined,
1098
+ _v$1 = suggestionsOpen() ? commandListId : undefined,
1099
+ _v$10 = suggestionsOpen() ? "true" : undefined,
1100
+ _v$11 = (emojiOpen() ? emojiMatches()[selectedCommandIndex()] : selectedCommand()) ? `${commandListId}-${selectedCommandIndex()}` : undefined;
1101
+ _v$3 !== _p$.e && _$setAttribute(_el$17, "aria-label", _p$.e = _v$3);
1102
+ _v$4 !== _p$.t && _el$22.classList.toggle("k2b-chat-composer__textarea--highlighted", _p$.t = _v$4);
1103
+ _v$5 !== _p$.a && _$setProperty(_el$22, "disabled", _p$.a = _v$5);
1104
+ _v$6 !== _p$.o && _$setAttribute(_el$22, "enterkeyhint", _p$.o = _v$6);
1105
+ _v$7 !== _p$.i && _$setAttribute(_el$22, "placeholder", _p$.i = _v$7);
1106
+ _v$8 !== _p$.n && _$setAttribute(_el$22, "aria-label", _p$.n = _v$8);
1107
+ _v$9 !== _p$.s && _$setAttribute(_el$22, "role", _p$.s = _v$9);
1108
+ _v$0 !== _p$.h && _$setAttribute(_el$22, "aria-autocomplete", _p$.h = _v$0);
1109
+ _v$1 !== _p$.r && _$setAttribute(_el$22, "aria-controls", _p$.r = _v$1);
1110
+ _v$10 !== _p$.d && _$setAttribute(_el$22, "aria-expanded", _p$.d = _v$10);
1111
+ _v$11 !== _p$.l && _$setAttribute(_el$22, "aria-activedescendant", _p$.l = _v$11);
1112
+ return _p$;
1113
+ }, {
1114
+ e: undefined,
1115
+ t: undefined,
1116
+ a: undefined,
1117
+ o: undefined,
1118
+ i: undefined,
1119
+ n: undefined,
1120
+ s: undefined,
1121
+ h: undefined,
1122
+ r: undefined,
1123
+ d: undefined,
1124
+ l: undefined
1125
+ });
1126
+ _$effect(() => _$setProperty(_el$22, "value", props.value));
1127
+ _$runHydrationEvents();
1128
+ return _el$17;
1129
+ })();
397
1130
  return (() => {
398
- var _el$3 = _$getNextElement(_tmpl$0),
399
- _el$46 = _el$3.firstChild,
400
- [_el$47, _co$11] = _$getNextMarker(_el$46.nextSibling),
401
- _el$25 = _el$47.nextSibling,
402
- _el$40 = _el$25.firstChild,
403
- [_el$41, _co$0] = _$getNextMarker(_el$40.nextSibling),
404
- _el$27 = _el$41.nextSibling,
405
- _el$33 = _el$27.firstChild,
406
- [_el$34, _co$8] = _$getNextMarker(_el$33.nextSibling),
407
- _el$32 = _el$34.nextSibling,
408
- _el$42 = _el$27.nextSibling,
409
- [_el$43, _co$1] = _$getNextMarker(_el$42.nextSibling),
410
- _el$39 = _el$43.nextSibling,
411
- _el$44 = _el$39.nextSibling,
412
- [_el$45, _co$10] = _$getNextMarker(_el$44.nextSibling);
413
- _$insert(_el$3, _$createComponent(Show, {
1131
+ var _el$29 = _$getNextElement(_tmpl$21),
1132
+ _el$89 = _el$29.firstChild,
1133
+ [_el$90, _co$23] = _$getNextMarker(_el$89.nextSibling),
1134
+ _el$57 = _el$90.nextSibling,
1135
+ _el$81 = _el$57.firstChild,
1136
+ [_el$82, _co$19] = _$getNextMarker(_el$81.nextSibling),
1137
+ _el$83 = _el$82.nextSibling,
1138
+ [_el$84, _co$20] = _$getNextMarker(_el$83.nextSibling),
1139
+ _el$85 = _el$84.nextSibling,
1140
+ [_el$86, _co$21] = _$getNextMarker(_el$85.nextSibling),
1141
+ _el$87 = _el$86.nextSibling,
1142
+ [_el$88, _co$22] = _$getNextMarker(_el$87.nextSibling);
1143
+ _$insert(_el$29, _$createComponent(Show, {
414
1144
  get when() {
415
- return commandsOpen() || hasAccessory();
1145
+ return suggestionsOpen() || hasAccessory();
416
1146
  },
417
1147
  get children() {
418
- var _el$4 = _$getNextElement(_tmpl$6),
419
- _el$5 = _el$4.firstChild,
420
- _el$23 = _el$5.nextSibling,
421
- [_el$24, _co$6] = _$getNextMarker(_el$23.nextSibling);
422
- _$insert(_el$5, accessory);
423
- _$insert(_el$4, _$createComponent(Show, {
1148
+ var _el$30 = _$getNextElement(_tmpl$16),
1149
+ _el$31 = _el$30.firstChild,
1150
+ _el$53 = _el$31.nextSibling,
1151
+ [_el$54, _co$1] = _$getNextMarker(_el$53.nextSibling),
1152
+ _el$55 = _el$54.nextSibling,
1153
+ [_el$56, _co$10] = _$getNextMarker(_el$55.nextSibling);
1154
+ _$insert(_el$31, accessory);
1155
+ _$insert(_el$30, _$createComponent(Show, {
1156
+ get when() {
1157
+ return emojiOpen();
1158
+ },
1159
+ get children() {
1160
+ var _el$32 = _$getNextElement(_tmpl$11),
1161
+ _el$33 = _el$32.firstChild;
1162
+ var _ref$6 = commandListRef;
1163
+ typeof _ref$6 === "function" ? _$use(_ref$6, _el$33) : commandListRef = _el$33;
1164
+ _$setAttribute(_el$33, "id", commandListId);
1165
+ _$insert(_el$33, _$createComponent(For, {
1166
+ get each() {
1167
+ return emojiMatches();
1168
+ },
1169
+ children: (entry, index) => (() => {
1170
+ var _el$91 = _$getNextElement(_tmpl$22),
1171
+ _el$92 = _el$91.firstChild,
1172
+ _el$93 = _el$92.nextSibling,
1173
+ _el$94 = _el$93.nextSibling,
1174
+ [_el$95, _co$24] = _$getNextMarker(_el$94.nextSibling);
1175
+ _el$91.$$click = () => pickEmojiSuggestion(index());
1176
+ _el$91.$$pointerdown = event => event.preventDefault();
1177
+ _$insert(_el$92, () => emojiInTone(entry, props.emoji?.skinTone ?? 0));
1178
+ _$insert(_el$93, () => emojiName(entry, locale()));
1179
+ _$insert(_el$91, _$createComponent(Show, {
1180
+ get when() {
1181
+ return entry.shortcodes[0];
1182
+ },
1183
+ children: code => (() => {
1184
+ var _el$96 = _$getNextElement(_tmpl$23),
1185
+ _el$97 = _el$96.firstChild,
1186
+ _el$99 = _el$97.nextSibling,
1187
+ [_el$100, _co$25] = _$getNextMarker(_el$99.nextSibling),
1188
+ _el$98 = _el$100.nextSibling;
1189
+ _$insert(_el$96, code, _el$100, _co$25);
1190
+ return _el$96;
1191
+ })()
1192
+ }), _el$95, _co$24);
1193
+ _$effect(_p$ => {
1194
+ var _v$19 = `${commandListId}-${index()}`,
1195
+ _v$20 = index() === selectedCommandIndex(),
1196
+ _v$21 = emojiName(entry, locale()),
1197
+ _v$22 = index() === selectedCommandIndex() ? "true" : undefined;
1198
+ _v$19 !== _p$.e && _$setAttribute(_el$91, "id", _p$.e = _v$19);
1199
+ _v$20 !== _p$.t && _$setAttribute(_el$91, "aria-selected", _p$.t = _v$20);
1200
+ _v$21 !== _p$.a && _$setAttribute(_el$91, "aria-label", _p$.a = _v$21);
1201
+ _v$22 !== _p$.o && _$setAttribute(_el$91, "data-active", _p$.o = _v$22);
1202
+ return _p$;
1203
+ }, {
1204
+ e: undefined,
1205
+ t: undefined,
1206
+ a: undefined,
1207
+ o: undefined
1208
+ });
1209
+ _$runHydrationEvents();
1210
+ return _el$91;
1211
+ })()
1212
+ }));
1213
+ _$effect(() => _$setAttribute(_el$33, "aria-label", messages().emojiSuggestions));
1214
+ return _el$32;
1215
+ }
1216
+ }), _el$54, _co$1);
1217
+ _$insert(_el$30, _$createComponent(Show, {
424
1218
  get when() {
425
1219
  return commandsOpen();
426
1220
  },
427
1221
  get children() {
428
- var _el$6 = _$getNextElement(_tmpl$5),
429
- _el$7 = _el$6.firstChild,
430
- _el$15 = _el$7.firstChild,
431
- [_el$16, _co$2] = _$getNextMarker(_el$15.nextSibling),
432
- _el$17 = _el$16.nextSibling,
433
- [_el$18, _co$3] = _$getNextMarker(_el$17.nextSibling),
434
- _el$19 = _el$18.nextSibling,
435
- [_el$20, _co$4] = _$getNextMarker(_el$19.nextSibling),
436
- _el$21 = _el$20.nextSibling,
437
- [_el$22, _co$5] = _$getNextMarker(_el$21.nextSibling);
438
- var _ref$ = commandListRef;
439
- typeof _ref$ === "function" ? _$use(_ref$, _el$7) : commandListRef = _el$7;
440
- _$setAttribute(_el$7, "id", commandListId);
441
- _$insert(_el$7, _$createComponent(For, {
1222
+ var _el$34 = _$getNextElement(_tmpl$15),
1223
+ _el$35 = _el$34.firstChild,
1224
+ _el$45 = _el$35.firstChild,
1225
+ [_el$46, _co$7] = _$getNextMarker(_el$45.nextSibling),
1226
+ _el$47 = _el$46.nextSibling,
1227
+ [_el$48, _co$8] = _$getNextMarker(_el$47.nextSibling),
1228
+ _el$49 = _el$48.nextSibling,
1229
+ [_el$50, _co$9] = _$getNextMarker(_el$49.nextSibling),
1230
+ _el$51 = _el$50.nextSibling,
1231
+ [_el$52, _co$0] = _$getNextMarker(_el$51.nextSibling);
1232
+ var _ref$7 = commandListRef;
1233
+ typeof _ref$7 === "function" ? _$use(_ref$7, _el$35) : commandListRef = _el$35;
1234
+ _$setAttribute(_el$35, "id", commandListId);
1235
+ _$insert(_el$35, _$createComponent(For, {
442
1236
  get each() {
443
1237
  return commandMatches();
444
1238
  },
445
1239
  children: (command, index) => (() => {
446
- var _el$48 = _$getNextElement(_tmpl$1),
447
- _el$49 = _el$48.firstChild,
448
- _el$50 = _el$49.nextSibling,
449
- _el$51 = _el$50.nextSibling;
450
- _el$48.$$click = () => void executeCommand(command);
451
- _el$48.$$pointerdown = event => event.preventDefault();
452
- _$insert(_el$50, () => command.label ?? `/${command.name}`);
453
- _$insert(_el$51, () => command.description);
1240
+ var _el$101 = _$getNextElement(_tmpl$24),
1241
+ _el$102 = _el$101.firstChild,
1242
+ _el$103 = _el$102.nextSibling,
1243
+ _el$104 = _el$103.nextSibling;
1244
+ _el$101.$$click = () => void executeCommand(command);
1245
+ _el$101.$$pointerdown = event => event.preventDefault();
1246
+ _$insert(_el$103, () => command.label ?? `/${command.name}`);
1247
+ _$insert(_el$104, () => command.description);
454
1248
  _$effect(_p$ => {
455
- var _v$14 = `${commandListId}-${index()}`,
456
- _v$15 = index() === selectedCommandIndex(),
457
- _v$16 = command.disabled,
458
- _v$17 = index() === selectedCommandIndex() ? "true" : undefined,
459
- _v$18 = command.icon ?? "ti ti-slash";
460
- _v$14 !== _p$.e && _$setAttribute(_el$48, "id", _p$.e = _v$14);
461
- _v$15 !== _p$.t && _$setAttribute(_el$48, "aria-selected", _p$.t = _v$15);
462
- _v$16 !== _p$.a && _$setAttribute(_el$48, "aria-disabled", _p$.a = _v$16);
463
- _v$17 !== _p$.o && _$setAttribute(_el$48, "data-active", _p$.o = _v$17);
464
- _v$18 !== _p$.i && _$className(_el$49, _p$.i = _v$18);
1249
+ var _v$23 = `${commandListId}-${index()}`,
1250
+ _v$24 = index() === selectedCommandIndex(),
1251
+ _v$25 = command.disabled,
1252
+ _v$26 = index() === selectedCommandIndex() ? "true" : undefined,
1253
+ _v$27 = command.icon ?? "ti ti-slash";
1254
+ _v$23 !== _p$.e && _$setAttribute(_el$101, "id", _p$.e = _v$23);
1255
+ _v$24 !== _p$.t && _$setAttribute(_el$101, "aria-selected", _p$.t = _v$24);
1256
+ _v$25 !== _p$.a && _$setAttribute(_el$101, "aria-disabled", _p$.a = _v$25);
1257
+ _v$26 !== _p$.o && _$setAttribute(_el$101, "data-active", _p$.o = _v$26);
1258
+ _v$27 !== _p$.i && _$className(_el$102, _p$.i = _v$27);
465
1259
  return _p$;
466
1260
  }, {
467
1261
  e: undefined,
@@ -471,526 +1265,482 @@ export function ChatComposer(props) {
471
1265
  i: undefined
472
1266
  });
473
1267
  _$runHydrationEvents();
474
- return _el$48;
1268
+ return _el$101;
475
1269
  })()
476
- }), _el$16, _co$2);
477
- _$insert(_el$7, _$createComponent(Show, {
1270
+ }), _el$46, _co$7);
1271
+ _$insert(_el$35, _$createComponent(Show, {
478
1272
  get when() {
479
1273
  return searching();
480
1274
  },
481
1275
  get children() {
482
- var _el$8 = _$getNextElement(_tmpl$2),
483
- _el$9 = _el$8.firstChild,
484
- _el$0 = _el$9.nextSibling;
485
- _$insert(_el$0, () => messages().loading);
486
- return _el$8;
1276
+ var _el$36 = _$getNextElement(_tmpl$12),
1277
+ _el$37 = _el$36.firstChild,
1278
+ _el$38 = _el$37.nextSibling;
1279
+ _$insert(_el$38, () => messages().loading);
1280
+ return _el$36;
487
1281
  }
488
- }), _el$18, _co$3);
489
- _$insert(_el$7, _$createComponent(Show, {
1282
+ }), _el$48, _co$8);
1283
+ _$insert(_el$35, _$createComponent(Show, {
490
1284
  get when() {
491
1285
  return searchError();
492
1286
  },
493
1287
  get children() {
494
- var _el$1 = _$getNextElement(_tmpl$3),
495
- _el$10 = _el$1.firstChild,
496
- _el$11 = _el$10.nextSibling,
497
- _el$12 = _el$11.nextSibling,
498
- [_el$13, _co$] = _$getNextMarker(_el$12.nextSibling);
499
- _$insert(_el$1, () => messages().error, _el$13, _co$);
500
- return _el$1;
1288
+ var _el$39 = _$getNextElement(_tmpl$13),
1289
+ _el$40 = _el$39.firstChild,
1290
+ _el$41 = _el$40.nextSibling,
1291
+ _el$42 = _el$41.nextSibling,
1292
+ [_el$43, _co$6] = _$getNextMarker(_el$42.nextSibling);
1293
+ _$insert(_el$39, () => messages().error, _el$43, _co$6);
1294
+ return _el$39;
501
1295
  }
502
- }), _el$20, _co$4);
503
- _$insert(_el$7, _$createComponent(Show, {
1296
+ }), _el$50, _co$9);
1297
+ _$insert(_el$35, _$createComponent(Show, {
504
1298
  get when() {
505
1299
  return _$memo(() => !!(!searching() && !searchError()))() && commandMatches().length === 0;
506
1300
  },
507
1301
  get children() {
508
- var _el$14 = _$getNextElement(_tmpl$4);
509
- _$insert(_el$14, () => messages().noResults);
510
- return _el$14;
1302
+ var _el$44 = _$getNextElement(_tmpl$14);
1303
+ _$insert(_el$44, () => messages().noResults);
1304
+ return _el$44;
511
1305
  }
512
- }), _el$22, _co$5);
513
- _$effect(() => _$setAttribute(_el$7, "aria-label", messages().commands));
514
- return _el$6;
1306
+ }), _el$52, _co$0);
1307
+ _$effect(() => _$setAttribute(_el$35, "aria-label", messages().commands));
1308
+ return _el$34;
515
1309
  }
516
- }), _el$24, _co$6);
1310
+ }), _el$56, _co$10);
517
1311
  _$effect(_p$ => {
518
- var _v$ = commandsOpen() ? "hidden" : undefined,
519
- _v$2 = commandsOpen();
520
- _v$ !== _p$.e && _$setStyleProperty(_el$5, "visibility", _p$.e = _v$);
521
- _v$2 !== _p$.t && _$setProperty(_el$5, "inert", _p$.t = _v$2);
1312
+ var _v$12 = hasAccessory() ? undefined : "true",
1313
+ _v$13 = suggestionsOpen() ? "hidden" : undefined,
1314
+ _v$14 = suggestionsOpen();
1315
+ _v$12 !== _p$.e && _$setAttribute(_el$30, "data-overlay", _p$.e = _v$12);
1316
+ _v$13 !== _p$.t && _$setStyleProperty(_el$31, "visibility", _p$.t = _v$13);
1317
+ _v$14 !== _p$.a && _$setProperty(_el$31, "inert", _p$.a = _v$14);
522
1318
  return _p$;
523
1319
  }, {
524
1320
  e: undefined,
525
- t: undefined
1321
+ t: undefined,
1322
+ a: undefined
526
1323
  });
527
- return _el$4;
1324
+ return _el$30;
1325
+ }
1326
+ }), _el$90, _co$23);
1327
+ var _ref$8 = composerRef;
1328
+ typeof _ref$8 === "function" ? _$use(_ref$8, _el$57) : composerRef = _el$57;
1329
+ _$insert(_el$57, _$createComponent(Show, {
1330
+ get when() {
1331
+ return showHint();
1332
+ },
1333
+ get children() {
1334
+ var _el$58 = _$getNextElement(_tmpl$17);
1335
+ _$insert(_el$58, _$createComponent(Show, {
1336
+ get when() {
1337
+ return dictationStatus();
1338
+ },
1339
+ get fallback() {
1340
+ return (() => {
1341
+ var _el$105 = _$getNextElement(_tmpl$25);
1342
+ _$insert(_el$105, hint);
1343
+ return _el$105;
1344
+ })();
1345
+ },
1346
+ children: status => [(() => {
1347
+ var _el$106 = _$getNextElement(_tmpl$26),
1348
+ _el$107 = _el$106.firstChild,
1349
+ _el$108 = _el$107.nextSibling;
1350
+ _$insert(_el$108, () => status().text);
1351
+ _$effect(_p$ => {
1352
+ var _v$28 = dictation() ?? undefined,
1353
+ _v$29 = status().icon;
1354
+ _v$28 !== _p$.e && _$setAttribute(_el$106, "data-state", _p$.e = _v$28);
1355
+ _v$29 !== _p$.t && _$className(_el$107, _p$.t = _v$29);
1356
+ return _p$;
1357
+ }, {
1358
+ e: undefined,
1359
+ t: undefined
1360
+ });
1361
+ return _el$106;
1362
+ })(), _$createComponent(Show, {
1363
+ get when() {
1364
+ return _$memo(() => dictation() === "refined")() ? props.microphone?.onRestoreOriginal : undefined;
1365
+ },
1366
+ children: restore => (() => {
1367
+ var _el$109 = _$getNextElement(_tmpl$27);
1368
+ _el$109.$$click = () => reportChatFailure(restore(), props.onError);
1369
+ _el$109.$$mousedown = keepFieldFocus;
1370
+ _$insert(_el$109, () => messages().restoreOriginal);
1371
+ _$effect(() => _$setProperty(_el$109, "disabled", microphoneDisabled()));
1372
+ _$runHydrationEvents();
1373
+ return _el$109;
1374
+ })()
1375
+ })]
1376
+ }));
1377
+ return _el$58;
528
1378
  }
529
- }), _el$47, _co$11);
530
- var _ref$2 = composerRef;
531
- typeof _ref$2 === "function" ? _$use(_ref$2, _el$25) : composerRef = _el$25;
532
- _$insert(_el$25, _$createComponent(Show, {
1379
+ }), _el$82, _co$19);
1380
+ _$insert(_el$57, _$createComponent(Show, {
533
1381
  get when() {
534
1382
  return attachments().length > 0;
535
1383
  },
536
1384
  get children() {
537
- var _el$26 = _$getNextElement(_tmpl$7);
538
- _$insert(_el$26, _$createComponent(For, {
1385
+ var _el$59 = _$getNextElement(_tmpl$18);
1386
+ _$insert(_el$59, _$createComponent(For, {
539
1387
  get each() {
540
1388
  return attachments();
541
1389
  },
542
1390
  children: attachment => (() => {
543
- var _el$52 = _$getNextElement(_tmpl$11),
544
- _el$53 = _el$52.firstChild,
545
- _el$54 = _el$53.firstChild,
546
- [_el$55, _co$12] = _$getNextMarker(_el$54.nextSibling),
547
- _el$56 = _el$55.nextSibling,
548
- [_el$57, _co$13] = _$getNextMarker(_el$56.nextSibling),
549
- _el$59 = _el$53.nextSibling,
550
- [_el$60, _co$14] = _$getNextMarker(_el$59.nextSibling);
551
- _$insert(_el$53, _$createComponent(Show, {
1391
+ var _el$110 = _$getNextElement(_tmpl$29),
1392
+ _el$111 = _el$110.firstChild,
1393
+ _el$112 = _el$111.firstChild,
1394
+ [_el$113, _co$26] = _$getNextMarker(_el$112.nextSibling),
1395
+ _el$114 = _el$113.nextSibling,
1396
+ [_el$115, _co$27] = _$getNextMarker(_el$114.nextSibling),
1397
+ _el$117 = _el$111.nextSibling,
1398
+ [_el$118, _co$28] = _$getNextMarker(_el$117.nextSibling);
1399
+ _$insert(_el$111, _$createComponent(Show, {
552
1400
  get when() {
553
1401
  return attachment.href;
554
1402
  },
555
1403
  get fallback() {
556
1404
  return (() => {
557
- var _el$61 = _$getNextElement(_tmpl$13),
558
- _el$63 = _el$61.firstChild,
559
- [_el$64, _co$15] = _$getNextMarker(_el$63.nextSibling),
560
- _el$65 = _el$64.nextSibling,
561
- [_el$66, _co$16] = _$getNextMarker(_el$65.nextSibling);
562
- _$insert(_el$61, _$createComponent(Show, {
1405
+ var _el$119 = _$getNextElement(_tmpl$31),
1406
+ _el$121 = _el$119.firstChild,
1407
+ [_el$122, _co$29] = _$getNextMarker(_el$121.nextSibling),
1408
+ _el$123 = _el$122.nextSibling,
1409
+ [_el$124, _co$30] = _$getNextMarker(_el$123.nextSibling);
1410
+ _$insert(_el$119, _$createComponent(Show, {
563
1411
  get when() {
564
1412
  return _$memo(() => attachment.kind === "image")() && attachment.previewUrl;
565
1413
  },
566
1414
  get fallback() {
567
1415
  return (() => {
568
- var _el$67 = _$getNextElement(_tmpl$14);
569
- _$effect(() => _$className(_el$67, attachmentIcon(attachment)));
570
- return _el$67;
1416
+ var _el$125 = _$getNextElement(_tmpl$3);
1417
+ _$effect(() => _$className(_el$125, attachmentIcon(attachment)));
1418
+ return _el$125;
571
1419
  })();
572
1420
  },
573
1421
  get children() {
574
- var _el$62 = _$getNextElement(_tmpl$12);
1422
+ var _el$120 = _$getNextElement(_tmpl$30);
575
1423
  _$effect(_p$ => {
576
- var _v$21 = attachment.previewUrl,
577
- _v$22 = attachment.alt ?? "";
578
- _v$21 !== _p$.e && _$setAttribute(_el$62, "src", _p$.e = _v$21);
579
- _v$22 !== _p$.t && _$setAttribute(_el$62, "alt", _p$.t = _v$22);
1424
+ var _v$32 = attachment.previewUrl,
1425
+ _v$33 = attachment.alt ?? "";
1426
+ _v$32 !== _p$.e && _$setAttribute(_el$120, "src", _p$.e = _v$32);
1427
+ _v$33 !== _p$.t && _$setAttribute(_el$120, "alt", _p$.t = _v$33);
580
1428
  return _p$;
581
1429
  }, {
582
1430
  e: undefined,
583
1431
  t: undefined
584
1432
  });
585
- return _el$62;
1433
+ return _el$120;
586
1434
  }
587
- }), _el$64, _co$15);
588
- _$insert(_el$61, () => renderAttachmentCopy(attachment), _el$66, _co$16);
589
- return _el$61;
1435
+ }), _el$122, _co$29);
1436
+ _$insert(_el$119, () => renderAttachmentCopy(attachment), _el$124, _co$30);
1437
+ return _el$119;
590
1438
  })();
591
1439
  },
592
1440
  children: href => (() => {
593
- var _el$68 = _$getNextElement(_tmpl$15),
594
- _el$70 = _el$68.firstChild,
595
- [_el$71, _co$17] = _$getNextMarker(_el$70.nextSibling),
596
- _el$72 = _el$71.nextSibling,
597
- [_el$73, _co$18] = _$getNextMarker(_el$72.nextSibling);
598
- _$insert(_el$68, _$createComponent(Show, {
1441
+ var _el$126 = _$getNextElement(_tmpl$32),
1442
+ _el$128 = _el$126.firstChild,
1443
+ [_el$129, _co$31] = _$getNextMarker(_el$128.nextSibling),
1444
+ _el$130 = _el$129.nextSibling,
1445
+ [_el$131, _co$32] = _$getNextMarker(_el$130.nextSibling);
1446
+ _$insert(_el$126, _$createComponent(Show, {
599
1447
  get when() {
600
1448
  return _$memo(() => attachment.kind === "image")() && attachment.previewUrl;
601
1449
  },
602
1450
  get fallback() {
603
1451
  return (() => {
604
- var _el$74 = _$getNextElement(_tmpl$14);
605
- _$effect(() => _$className(_el$74, attachmentIcon(attachment)));
606
- return _el$74;
1452
+ var _el$132 = _$getNextElement(_tmpl$3);
1453
+ _$effect(() => _$className(_el$132, attachmentIcon(attachment)));
1454
+ return _el$132;
607
1455
  })();
608
1456
  },
609
1457
  get children() {
610
- var _el$69 = _$getNextElement(_tmpl$12);
1458
+ var _el$127 = _$getNextElement(_tmpl$30);
611
1459
  _$effect(_p$ => {
612
- var _v$23 = attachment.previewUrl,
613
- _v$24 = attachment.alt ?? "";
614
- _v$23 !== _p$.e && _$setAttribute(_el$69, "src", _p$.e = _v$23);
615
- _v$24 !== _p$.t && _$setAttribute(_el$69, "alt", _p$.t = _v$24);
1460
+ var _v$34 = attachment.previewUrl,
1461
+ _v$35 = attachment.alt ?? "";
1462
+ _v$34 !== _p$.e && _$setAttribute(_el$127, "src", _p$.e = _v$34);
1463
+ _v$35 !== _p$.t && _$setAttribute(_el$127, "alt", _p$.t = _v$35);
616
1464
  return _p$;
617
1465
  }, {
618
1466
  e: undefined,
619
1467
  t: undefined
620
1468
  });
621
- return _el$69;
1469
+ return _el$127;
622
1470
  }
623
- }), _el$71, _co$17);
624
- _$insert(_el$68, () => renderAttachmentCopy(attachment), _el$73, _co$18);
1471
+ }), _el$129, _co$31);
1472
+ _$insert(_el$126, () => renderAttachmentCopy(attachment), _el$131, _co$32);
625
1473
  _$effect(_p$ => {
626
- var _v$25 = href(),
627
- _v$26 = messages().openInNewTab({
1474
+ var _v$36 = href(),
1475
+ _v$37 = messages().openInNewTab({
628
1476
  name: attachment.name
629
1477
  });
630
- _v$25 !== _p$.e && _$setAttribute(_el$68, "href", _p$.e = _v$25);
631
- _v$26 !== _p$.t && _$setAttribute(_el$68, "aria-label", _p$.t = _v$26);
1478
+ _v$36 !== _p$.e && _$setAttribute(_el$126, "href", _p$.e = _v$36);
1479
+ _v$37 !== _p$.t && _$setAttribute(_el$126, "aria-label", _p$.t = _v$37);
632
1480
  return _p$;
633
1481
  }, {
634
1482
  e: undefined,
635
1483
  t: undefined
636
1484
  });
637
- return _el$68;
1485
+ return _el$126;
638
1486
  })()
639
- }), _el$55, _co$12);
640
- _$insert(_el$53, _$createComponent(Show, {
1487
+ }), _el$113, _co$26);
1488
+ _$insert(_el$111, _$createComponent(Show, {
641
1489
  get when() {
642
1490
  return attachment.action;
643
1491
  },
644
1492
  children: action => (() => {
645
- var _el$75 = _$getNextElement(_tmpl$16),
646
- _el$76 = _el$75.firstChild,
647
- [_el$77, _co$19] = _$getNextMarker(_el$76.nextSibling),
648
- _el$78 = _el$77.nextSibling,
649
- [_el$79, _co$20] = _$getNextMarker(_el$78.nextSibling);
650
- _el$75.$$click = () => reportChatFailure(() => executeChatAction(action()), props.onError);
651
- _$insert(_el$75, _$createComponent(Show, {
1493
+ var _el$133 = _$getNextElement(_tmpl$33),
1494
+ _el$134 = _el$133.firstChild,
1495
+ [_el$135, _co$33] = _$getNextMarker(_el$134.nextSibling),
1496
+ _el$136 = _el$135.nextSibling,
1497
+ [_el$137, _co$34] = _$getNextMarker(_el$136.nextSibling);
1498
+ _el$133.$$click = () => reportChatFailure(() => executeChatAction(action()), props.onError);
1499
+ _$insert(_el$133, _$createComponent(Show, {
652
1500
  get when() {
653
1501
  return action().icon;
654
1502
  },
655
1503
  children: icon => (() => {
656
- var _el$80 = _$getNextElement(_tmpl$14);
657
- _$effect(() => _$className(_el$80, icon()));
658
- return _el$80;
1504
+ var _el$138 = _$getNextElement(_tmpl$3);
1505
+ _$effect(() => _$className(_el$138, icon()));
1506
+ return _el$138;
659
1507
  })()
660
- }), _el$77, _co$19);
661
- _$insert(_el$75, () => action().label, _el$79, _co$20);
662
- _$effect(() => _$setProperty(_el$75, "disabled", blocked() || action().disabled));
1508
+ }), _el$135, _co$33);
1509
+ _$insert(_el$133, () => action().label, _el$137, _co$34);
1510
+ _$effect(() => _$setProperty(_el$133, "disabled", blocked() || action().disabled));
663
1511
  _$runHydrationEvents();
664
- return _el$75;
1512
+ return _el$133;
665
1513
  })()
666
- }), _el$57, _co$13);
667
- _$insert(_el$52, _$createComponent(Show, {
1514
+ }), _el$115, _co$27);
1515
+ _$insert(_el$110, _$createComponent(Show, {
668
1516
  get when() {
669
1517
  return props.onAttachmentsChange;
670
1518
  },
671
1519
  get children() {
672
- var _el$58 = _$getNextElement(_tmpl$10);
673
- _el$58.$$click = () => setAttachments(attachments().filter(candidate => candidate.id !== attachment.id));
1520
+ var _el$116 = _$getNextElement(_tmpl$28);
1521
+ _el$116.$$click = () => setAttachments(attachments().filter(candidate => candidate.id !== attachment.id));
674
1522
  _$effect(_p$ => {
675
- var _v$19 = messages().removeNamed({
1523
+ var _v$30 = messages().removeNamed({
676
1524
  name: attachment.name
677
1525
  }),
678
- _v$20 = blocked();
679
- _v$19 !== _p$.e && _$setAttribute(_el$58, "aria-label", _p$.e = _v$19);
680
- _v$20 !== _p$.t && _$setProperty(_el$58, "disabled", _p$.t = _v$20);
1526
+ _v$31 = blocked();
1527
+ _v$30 !== _p$.e && _$setAttribute(_el$116, "aria-label", _p$.e = _v$30);
1528
+ _v$31 !== _p$.t && _$setProperty(_el$116, "disabled", _p$.t = _v$31);
681
1529
  return _p$;
682
1530
  }, {
683
1531
  e: undefined,
684
1532
  t: undefined
685
1533
  });
686
1534
  _$runHydrationEvents();
687
- return _el$58;
1535
+ return _el$116;
688
1536
  }
689
- }), _el$60, _co$14);
690
- _$effect(() => _el$53.classList.toggle("k2b-chat-composer__attachment-content--action", !!Boolean(attachment.action)));
691
- return _el$52;
1537
+ }), _el$118, _co$28);
1538
+ _$effect(() => _el$111.classList.toggle("k2b-chat-composer__attachment-content--action", !!Boolean(attachment.action)));
1539
+ return _el$110;
692
1540
  })()
693
1541
  }));
694
- _$effect(() => _$setAttribute(_el$26, "aria-label", messages().attachments));
695
- return _el$26;
1542
+ _$effect(() => _$setAttribute(_el$59, "aria-label", messages().attachments));
1543
+ return _el$59;
696
1544
  }
697
- }), _el$41, _co$0);
698
- _$insert(_el$27, _$createComponent(Show, {
1545
+ }), _el$84, _co$20);
1546
+ _$insert(_el$57, _$createComponent(Show, {
699
1547
  get when() {
700
- return mentions().length > 0;
701
- },
702
- get children() {
703
- var _el$28 = _$getNextElement(_tmpl$8),
704
- _el$30 = _el$28.firstChild,
705
- [_el$31, _co$7] = _$getNextMarker(_el$30.nextSibling),
706
- _el$29 = _el$31.nextSibling;
707
- var _ref$3 = highlightRef;
708
- typeof _ref$3 === "function" ? _$use(_ref$3, _el$28) : highlightRef = _el$28;
709
- _$insert(_el$28, _$createComponent(For, {
710
- get each() {
711
- return chatMentionSegments(props.value, mentions());
712
- },
713
- children: part => (() => {
714
- var _el$81 = _$getNextElement(_tmpl$17);
715
- _$insert(_el$81, () => part.text);
716
- _$effect(() => _el$81.classList.toggle("k2b-chat-composer__mention", !!Boolean(part.mention)));
717
- return _el$81;
718
- })()
719
- }), _el$31, _co$7);
720
- return _el$28;
721
- }
722
- }), _el$34, _co$8);
723
- _el$32.$$keydown = onKeyDown;
724
- _el$32.$$beforeinput = event => {
725
- if (event.inputType === "historyUndo" || event.inputType === "historyRedo") {
726
- event.preventDefault();
727
- restoreHistory(event.inputType === "historyUndo" ? -1 : 1);
728
- }
729
- };
730
- _el$32.addEventListener("scroll", () => {
731
- if (highlightRef && textareaRef) highlightRef.scrollTop = textareaRef.scrollTop;
732
- });
733
- _el$32.addEventListener("compositionend", () => {
734
- setComposing(false);
735
- syncCaret();
736
- });
737
- _el$32.addEventListener("compositionstart", () => setComposing(true));
738
- _el$32.$$keyup = syncCaret;
739
- _el$32.$$click = () => {
740
- setDismissed(false);
741
- syncCaret();
742
- };
743
- _el$32.addEventListener("blur", () => setDismissed(true));
744
- _el$32.addEventListener("select", syncCaret);
745
- _el$32.addEventListener("paste", event => {
746
- const clipboardData = event.clipboardData;
747
- if (canSelectFiles() && clipboardData?.files.length) {
748
- event.preventDefault();
749
- void runFiles(clipboardData.files);
750
- return;
751
- }
752
- props.onPaste?.(event);
753
- });
754
- _el$32.$$input = event => {
755
- edit(event.currentTarget.value);
756
- syncCaret();
757
- autoResize();
758
- };
759
- var _ref$4 = textareaRef;
760
- typeof _ref$4 === "function" ? _$use(_ref$4, _el$32) : textareaRef = _el$32;
761
- _$insert(_el$25, _$createComponent(Show, {
762
- get when() {
763
- return props.error;
764
- },
765
- get children() {
766
- var _el$35 = _$getNextElement(_tmpl$9),
767
- _el$36 = _el$35.firstChild,
768
- _el$37 = _el$36.nextSibling,
769
- [_el$38, _co$9] = _$getNextMarker(_el$37.nextSibling);
770
- _$insert(_el$35, () => props.error, _el$38, _co$9);
771
- return _el$35;
772
- }
773
- }), _el$43, _co$1);
774
- _$insert(_el$39, _$createComponent(Show, {
775
- get when() {
776
- return props.footerContent;
1548
+ return conversation();
777
1549
  },
778
1550
  get fallback() {
779
- return [(() => {
780
- var _el$82 = _$getNextElement(_tmpl$20),
781
- _el$85 = _el$82.firstChild,
782
- [_el$86, _co$21] = _$getNextMarker(_el$85.nextSibling),
783
- _el$87 = _el$86.nextSibling,
784
- [_el$88, _co$22] = _$getNextMarker(_el$87.nextSibling),
785
- _el$89 = _el$88.nextSibling,
786
- [_el$90, _co$23] = _$getNextMarker(_el$89.nextSibling),
787
- _el$91 = _el$90.nextSibling,
788
- [_el$92, _co$24] = _$getNextMarker(_el$91.nextSibling),
789
- _el$93 = _el$92.nextSibling,
790
- [_el$94, _co$25] = _$getNextMarker(_el$93.nextSibling);
791
- _$insert(_el$82, () => props.footerTools, _el$86, _co$21);
792
- _$insert(_el$82, _$createComponent(Show, {
1551
+ return [_$memo(field), _$createComponent(Show, {
1552
+ get when() {
1553
+ return props.error;
1554
+ },
1555
+ get children() {
1556
+ var _el$139 = _$getNextElement(_tmpl$19),
1557
+ _el$140 = _el$139.firstChild,
1558
+ _el$141 = _el$140.nextSibling,
1559
+ [_el$142, _co$35] = _$getNextMarker(_el$141.nextSibling);
1560
+ _$insert(_el$139, () => props.error, _el$142, _co$35);
1561
+ return _el$139;
1562
+ }
1563
+ }), _$memo(formatRow), (() => {
1564
+ var _el$143 = _$getNextElement(_tmpl$34);
1565
+ _$insert(_el$143, _$createComponent(Show, {
793
1566
  get when() {
794
- return hasAddMenu();
1567
+ return props.footerContent;
795
1568
  },
796
- get children() {
797
- return _$createComponent(Dropdown.Root, {
798
- position: "top-right",
799
- get label() {
800
- return messages().addToChat;
801
- },
802
- get items() {
803
- return menuItems();
804
- },
805
- get disabled() {
806
- return blocked();
807
- },
808
- get children() {
809
- return _$createComponent(Dropdown.Trigger, {
810
- appearance: "plain",
1569
+ get fallback() {
1570
+ return [(() => {
1571
+ var _el$144 = _$getNextElement(_tmpl$35),
1572
+ _el$145 = _el$144.firstChild,
1573
+ [_el$146, _co$36] = _$getNextMarker(_el$145.nextSibling),
1574
+ _el$147 = _el$146.nextSibling,
1575
+ [_el$148, _co$37] = _$getNextMarker(_el$147.nextSibling),
1576
+ _el$149 = _el$148.nextSibling,
1577
+ [_el$150, _co$38] = _$getNextMarker(_el$149.nextSibling),
1578
+ _el$151 = _el$150.nextSibling,
1579
+ [_el$152, _co$39] = _$getNextMarker(_el$151.nextSibling),
1580
+ _el$153 = _el$152.nextSibling,
1581
+ [_el$154, _co$40] = _$getNextMarker(_el$153.nextSibling),
1582
+ _el$155 = _el$154.nextSibling,
1583
+ [_el$156, _co$41] = _$getNextMarker(_el$155.nextSibling),
1584
+ _el$157 = _el$156.nextSibling,
1585
+ [_el$158, _co$42] = _$getNextMarker(_el$157.nextSibling);
1586
+ _$insert(_el$144, () => props.footerTools, _el$146, _co$36);
1587
+ _$insert(_el$144, _$createComponent(Show, {
1588
+ get when() {
1589
+ return hasAddMenu();
1590
+ },
1591
+ get children() {
1592
+ return addMenu("ti ti-plus");
1593
+ }
1594
+ }), _el$148, _co$37);
1595
+ _$insert(_el$144, fileInput, _el$150, _co$38);
1596
+ _$insert(_el$144, formatToggle, _el$152, _co$39);
1597
+ _$insert(_el$144, emojiButton, _el$154, _co$40);
1598
+ _$insert(_el$144, _$createComponent(Show, {
1599
+ get when() {
1600
+ return (props.models?.length ?? 0) > 0;
1601
+ },
1602
+ get children() {
1603
+ return _$createComponent(SelectChip, {
1604
+ get ["aria-label"]() {
1605
+ return messages().chooseModel;
1606
+ },
1607
+ position: "top-right",
1608
+ "class": "k2b-chat-composer__model",
1609
+ menuWidth: "15rem",
1610
+ get placeholder() {
1611
+ return messages().model;
1612
+ },
1613
+ value: () => props.selectedModelId ?? "",
1614
+ get options() {
1615
+ return (props.models ?? []).map(model => ({
1616
+ value: model.id,
1617
+ label: model.label,
1618
+ description: model.description,
1619
+ icon: model.icon,
1620
+ image: model.image
1621
+ }));
1622
+ },
1623
+ get disabled() {
1624
+ return blocked() || running() || !props.onModelChange;
1625
+ },
1626
+ onValueChange: modelId => {
1627
+ props.onModelChange?.(modelId);
1628
+ queueMicrotask(focus);
1629
+ }
1630
+ });
1631
+ }
1632
+ }), _el$156, _co$41);
1633
+ _$insert(_el$144, () => props.modelDetails, _el$158, _co$42);
1634
+ return _el$144;
1635
+ })(), (() => {
1636
+ var _el$159 = _$getNextElement(_tmpl$36),
1637
+ _el$160 = _el$159.firstChild,
1638
+ [_el$161, _co$43] = _$getNextMarker(_el$160.nextSibling),
1639
+ _el$162 = _el$161.nextSibling,
1640
+ [_el$163, _co$44] = _$getNextMarker(_el$162.nextSibling),
1641
+ _el$164 = _el$163.nextSibling,
1642
+ [_el$165, _co$45] = _$getNextMarker(_el$164.nextSibling),
1643
+ _el$166 = _el$165.nextSibling,
1644
+ [_el$167, _co$46] = _$getNextMarker(_el$166.nextSibling),
1645
+ _el$168 = _el$167.nextSibling,
1646
+ [_el$169, _co$47] = _$getNextMarker(_el$168.nextSibling);
1647
+ _$insert(_el$159, _$createComponent(For, {
1648
+ get each() {
1649
+ return props.contextActions;
1650
+ },
1651
+ children: action => _$createComponent(Tooltip.Trigger, {
1652
+ type: "button",
811
1653
  "class": "k2b-chat-composer__icon-action",
812
- get label() {
813
- return messages().addToChat;
1654
+ get ["data-tone"]() {
1655
+ return action.variant === "danger" ? "danger" : undefined;
1656
+ },
1657
+ get disabled() {
1658
+ return action.disabled;
1659
+ },
1660
+ get ["aria-pressed"]() {
1661
+ return action.pressed;
814
1662
  },
815
- get tooltip() {
816
- return messages().addToChat;
1663
+ get ["aria-label"]() {
1664
+ return action.label;
817
1665
  },
1666
+ get content() {
1667
+ return action.label;
1668
+ },
1669
+ onClick: () => reportChatFailure(() => executeChatAction(action), props.onError),
818
1670
  get children() {
819
- return _$getNextElement(_tmpl$18);
1671
+ var _el$170 = _$getNextElement(_tmpl$3);
1672
+ _$effect(() => _$className(_el$170, action.icon ?? "ti ti-dots"));
1673
+ return _el$170;
820
1674
  }
821
- });
822
- }
823
- });
824
- }
825
- }), _el$88, _co$22);
826
- _$insert(_el$82, _$createComponent(Show, {
827
- get when() {
828
- return props.fileSelection;
829
- },
830
- get children() {
831
- var _el$84 = _$getNextElement(_tmpl$19);
832
- _el$84.addEventListener("change", event => {
833
- if (event.currentTarget.files?.length) void runFiles(event.currentTarget.files);
834
- });
835
- var _ref$5 = fileInputRef;
836
- typeof _ref$5 === "function" ? _$use(_ref$5, _el$84) : fileInputRef = _el$84;
837
- _$effect(_p$ => {
838
- var _v$27 = props.fileSelection?.accept,
839
- _v$28 = props.fileSelection?.multiple ?? true;
840
- _v$27 !== _p$.e && _$setAttribute(_el$84, "accept", _p$.e = _v$27);
841
- _v$28 !== _p$.t && _$setProperty(_el$84, "multiple", _p$.t = _v$28);
842
- return _p$;
843
- }, {
844
- e: undefined,
845
- t: undefined
846
- });
847
- return _el$84;
848
- }
849
- }), _el$90, _co$23);
850
- _$insert(_el$82, _$createComponent(Show, {
851
- get when() {
852
- return (props.models?.length ?? 0) > 0;
853
- },
854
- get children() {
855
- return _$createComponent(SelectChip, {
856
- get ["aria-label"]() {
857
- return messages().chooseModel;
858
- },
859
- position: "top-right",
860
- "class": "k2b-chat-composer__model",
861
- menuWidth: "15rem",
862
- get placeholder() {
863
- return messages().model;
864
- },
865
- value: () => props.selectedModelId ?? "",
866
- get options() {
867
- return (props.models ?? []).map(model => ({
868
- value: model.id,
869
- label: model.label,
870
- description: model.description,
871
- icon: model.icon,
872
- image: model.image
873
- }));
874
- },
875
- get disabled() {
876
- return blocked() || running() || !props.onModelChange;
877
- },
878
- onValueChange: modelId => {
879
- props.onModelChange?.(modelId);
880
- queueMicrotask(focus);
881
- }
882
- });
883
- }
884
- }), _el$92, _co$24);
885
- _$insert(_el$82, () => props.modelDetails, _el$94, _co$25);
886
- return _el$82;
887
- })(), (() => {
888
- var _el$95 = _$getNextElement(_tmpl$21),
889
- _el$97 = _el$95.firstChild,
890
- [_el$98, _co$26] = _$getNextMarker(_el$97.nextSibling),
891
- _el$99 = _el$98.nextSibling,
892
- [_el$100, _co$27] = _$getNextMarker(_el$99.nextSibling),
893
- _el$101 = _el$100.nextSibling,
894
- [_el$102, _co$28] = _$getNextMarker(_el$101.nextSibling),
895
- _el$103 = _el$102.nextSibling,
896
- [_el$104, _co$29] = _$getNextMarker(_el$103.nextSibling);
897
- _$insert(_el$95, _$createComponent(For, {
898
- get each() {
899
- return props.contextActions;
900
- },
901
- children: action => _$createComponent(Tooltip.Trigger, {
902
- type: "button",
903
- "class": "k2b-chat-composer__icon-action",
904
- get ["data-tone"]() {
905
- return action.variant === "danger" ? "danger" : undefined;
906
- },
907
- get disabled() {
908
- return action.disabled;
909
- },
910
- get ["aria-pressed"]() {
911
- return action.pressed;
912
- },
913
- get ["aria-label"]() {
914
- return action.label;
915
- },
916
- get content() {
917
- return action.label;
918
- },
919
- onClick: () => reportChatFailure(() => executeChatAction(action), props.onError),
920
- get children() {
921
- var _el$105 = _$getNextElement(_tmpl$14);
922
- _$effect(() => _$className(_el$105, action.icon ?? "ti ti-dots"));
923
- return _el$105;
924
- }
925
- })
926
- }), _el$98, _co$26);
927
- _$insert(_el$95, _$createComponent(Show, {
928
- get when() {
929
- return _$memo(() => !!hasContextUsage())() ? props.contextUsage ?? {} : undefined;
930
- },
931
- children: usage => _$createComponent(ContextUsage, _$mergeProps(usage, {
932
- get action() {
933
- return props.contextPopupAction;
934
- },
935
- get onActionError() {
936
- return props.onError;
937
- }
938
- }))
939
- }), _el$100, _co$27);
940
- _$insert(_el$95, () => props.submitTools, _el$102, _co$28);
941
- _$insert(_el$95, _$createComponent(Show, {
942
- get when() {
943
- return _$memo(() => !!(running() && !hasDraft()))() && props.onStop;
944
- },
945
- get fallback() {
946
- return _$createComponent(Tooltip.Trigger, {
947
- type: "button",
948
- "class": "k2b-chat-composer__send",
949
- get disabled() {
950
- return !canSubmit();
951
- },
952
- get ["aria-label"]() {
953
- 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;
954
- },
955
- get content() {
956
- return _$memo(() => !!running())() ? _$memo(() => runningSubmitIntent() === "queue")() ? messages().queueMessage : messages().steerResponse : messages().sendMessage;
957
- },
958
- onClick: () => void submit(),
959
- get children() {
960
- var _el$106 = _$getNextElement(_tmpl$14);
961
- _$effect(() => _$className(_el$106, submitting() ? "ti ti-loader-2 k2b-spin" : "ti ti-arrow-up"));
962
- return _el$106;
963
- }
964
- });
1675
+ })
1676
+ }), _el$161, _co$43);
1677
+ _$insert(_el$159, _$createComponent(Show, {
1678
+ get when() {
1679
+ return _$memo(() => !!hasContextUsage())() ? props.contextUsage ?? {} : undefined;
1680
+ },
1681
+ children: usage => _$createComponent(ContextUsage, _$mergeProps(usage, {
1682
+ get action() {
1683
+ return props.contextPopupAction;
1684
+ },
1685
+ get onActionError() {
1686
+ return props.onError;
1687
+ }
1688
+ }))
1689
+ }), _el$163, _co$44);
1690
+ _$insert(_el$159, () => props.submitTools, _el$165, _co$45);
1691
+ _$insert(_el$159, microphoneControl, _el$167, _co$46);
1692
+ _$insert(_el$159, sendControl, _el$169, _co$47);
1693
+ return _el$159;
1694
+ })()];
965
1695
  },
966
- get children() {
967
- return _$createComponent(Tooltip.Trigger, {
968
- type: "button",
969
- "class": "k2b-chat-composer__stop",
970
- get disabled() {
971
- return stopping();
972
- },
973
- get ["aria-label"]() {
974
- return _$memo(() => !!stopping())() ? messages().stopping : messages().stopResponse;
975
- },
976
- get content() {
977
- return messages().stopResponse;
978
- },
979
- onClick: () => reportChatFailure(() => props.onStop?.(), props.onError),
980
- get children() {
981
- var _el$96 = _$getNextElement(_tmpl$14);
982
- _$effect(() => _$className(_el$96, stopping() ? "ti ti-loader-2 k2b-spin" : "ti ti-player-stop"));
983
- return _el$96;
984
- }
985
- });
986
- }
987
- }), _el$104, _co$29);
988
- return _el$95;
1696
+ children: content => content()
1697
+ }));
1698
+ return _el$143;
989
1699
  })()];
990
1700
  },
991
- children: content => content()
992
- }));
993
- _$insert(_el$25, _$createComponent(Show, {
1701
+ get children() {
1702
+ return [_$createComponent(Show, {
1703
+ get when() {
1704
+ return props.error;
1705
+ },
1706
+ get children() {
1707
+ var _el$60 = _$getNextElement(_tmpl$19),
1708
+ _el$61 = _el$60.firstChild,
1709
+ _el$62 = _el$61.nextSibling,
1710
+ [_el$63, _co$11] = _$getNextMarker(_el$62.nextSibling);
1711
+ _$insert(_el$60, () => props.error, _el$63, _co$11);
1712
+ return _el$60;
1713
+ }
1714
+ }), _$memo(() => formatRow()), (() => {
1715
+ var _el$64 = _$getNextElement(_tmpl$20),
1716
+ _el$75 = _el$64.firstChild,
1717
+ [_el$76, _co$16] = _$getNextMarker(_el$75.nextSibling),
1718
+ _el$77 = _el$76.nextSibling,
1719
+ [_el$78, _co$17] = _$getNextMarker(_el$77.nextSibling),
1720
+ _el$65 = _el$78.nextSibling,
1721
+ _el$73 = _el$65.firstChild,
1722
+ [_el$74, _co$15] = _$getNextMarker(_el$73.nextSibling),
1723
+ _el$66 = _el$74.nextSibling,
1724
+ _el$67 = _el$66.firstChild,
1725
+ [_el$68, _co$12] = _$getNextMarker(_el$67.nextSibling),
1726
+ _el$69 = _el$68.nextSibling,
1727
+ [_el$70, _co$13] = _$getNextMarker(_el$69.nextSibling),
1728
+ _el$71 = _el$70.nextSibling,
1729
+ [_el$72, _co$14] = _$getNextMarker(_el$71.nextSibling),
1730
+ _el$79 = _el$65.nextSibling,
1731
+ [_el$80, _co$18] = _$getNextMarker(_el$79.nextSibling);
1732
+ _$insert(_el$64, attachControl, _el$76, _co$16);
1733
+ _$insert(_el$64, fileInput, _el$78, _co$17);
1734
+ _$insert(_el$65, field, _el$74, _co$15);
1735
+ _$insert(_el$66, formatToggle, _el$68, _co$12);
1736
+ _$insert(_el$66, emojiButton, _el$70, _co$13);
1737
+ _$insert(_el$66, microphoneControl, _el$72, _co$14);
1738
+ _$insert(_el$64, sendControl, _el$80, _co$18);
1739
+ return _el$64;
1740
+ })()];
1741
+ }
1742
+ }), _el$86, _co$21);
1743
+ _$insert(_el$57, _$createComponent(Show, {
994
1744
  get when() {
995
1745
  return props.fileSelection;
996
1746
  },
@@ -1009,54 +1759,25 @@ export function ChatComposer(props) {
1009
1759
  },
1010
1760
  onDrop: files => void runFiles(files)
1011
1761
  })
1012
- }), _el$45, _co$10);
1762
+ }), _el$88, _co$22);
1013
1763
  _$effect(_p$ => {
1014
- var _v$3 = `k2b-chat-composer ${props.class ?? ""}`,
1015
- _v$4 = running() ? "true" : undefined,
1016
- _v$5 = props.label ?? messages().messageComposer,
1017
- _v$6 = messages().messageInput,
1018
- _v$7 = !!(mentions().length > 0),
1019
- _v$8 = blocked(),
1020
- _v$9 = props.placeholder ?? (running() ? messages().addGuidance : messages().writeMessage),
1021
- _v$0 = props.inputLabel ?? messages().message,
1022
- _v$1 = commandsOpen() ? "combobox" : undefined,
1023
- _v$10 = commandsOpen() ? "list" : undefined,
1024
- _v$11 = commandsOpen() ? commandListId : undefined,
1025
- _v$12 = commandsOpen() ? "true" : undefined,
1026
- _v$13 = selectedCommand() ? `${commandListId}-${selectedCommandIndex()}` : undefined;
1027
- _v$3 !== _p$.e && _$className(_el$25, _p$.e = _v$3);
1028
- _v$4 !== _p$.t && _$setAttribute(_el$25, "data-running", _p$.t = _v$4);
1029
- _v$5 !== _p$.a && _$setAttribute(_el$25, "aria-label", _p$.a = _v$5);
1030
- _v$6 !== _p$.o && _$setAttribute(_el$27, "aria-label", _p$.o = _v$6);
1031
- _v$7 !== _p$.i && _el$32.classList.toggle("k2b-chat-composer__textarea--highlighted", _p$.i = _v$7);
1032
- _v$8 !== _p$.n && _$setProperty(_el$32, "disabled", _p$.n = _v$8);
1033
- _v$9 !== _p$.s && _$setAttribute(_el$32, "placeholder", _p$.s = _v$9);
1034
- _v$0 !== _p$.h && _$setAttribute(_el$32, "aria-label", _p$.h = _v$0);
1035
- _v$1 !== _p$.r && _$setAttribute(_el$32, "role", _p$.r = _v$1);
1036
- _v$10 !== _p$.d && _$setAttribute(_el$32, "aria-autocomplete", _p$.d = _v$10);
1037
- _v$11 !== _p$.l && _$setAttribute(_el$32, "aria-controls", _p$.l = _v$11);
1038
- _v$12 !== _p$.u && _$setAttribute(_el$32, "aria-expanded", _p$.u = _v$12);
1039
- _v$13 !== _p$.c && _$setAttribute(_el$32, "aria-activedescendant", _p$.c = _v$13);
1764
+ var _v$15 = `k2b-chat-composer ${props.class ?? ""}`,
1765
+ _v$16 = running() ? "true" : undefined,
1766
+ _v$17 = conversation() ? "conversation" : undefined,
1767
+ _v$18 = props.label ?? messages().messageComposer;
1768
+ _v$15 !== _p$.e && _$className(_el$57, _p$.e = _v$15);
1769
+ _v$16 !== _p$.t && _$setAttribute(_el$57, "data-running", _p$.t = _v$16);
1770
+ _v$17 !== _p$.a && _$setAttribute(_el$57, "data-variant", _p$.a = _v$17);
1771
+ _v$18 !== _p$.o && _$setAttribute(_el$57, "aria-label", _p$.o = _v$18);
1040
1772
  return _p$;
1041
1773
  }, {
1042
1774
  e: undefined,
1043
1775
  t: undefined,
1044
1776
  a: undefined,
1045
- o: undefined,
1046
- i: undefined,
1047
- n: undefined,
1048
- s: undefined,
1049
- h: undefined,
1050
- r: undefined,
1051
- d: undefined,
1052
- l: undefined,
1053
- u: undefined,
1054
- c: undefined
1777
+ o: undefined
1055
1778
  });
1056
- _$effect(() => _$setProperty(_el$32, "value", props.value));
1057
- _$runHydrationEvents();
1058
- return _el$3;
1779
+ return _el$29;
1059
1780
  })();
1060
1781
  }
1061
- _$delegateEvents(["input", "click", "keyup", "beforeinput", "keydown", "pointerdown"]);
1782
+ _$delegateEvents(["input", "click", "keyup", "beforeinput", "keydown", "pointerdown", "mousedown"]);
1062
1783
  //# sourceMappingURL=ChatComposer.js.map