@k2b/ui 0.28.0 → 0.30.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 (278) hide show
  1. package/README.md +1 -1
  2. package/dist/base.css +2 -2
  3. package/dist/browser/actions/ContextMenu.js +5 -0
  4. package/dist/browser/actions/ContextMenu.js.map +1 -1
  5. package/dist/browser/actions/DragAndDrop.js +89 -0
  6. package/dist/browser/actions/DragAndDrop.js.map +1 -0
  7. package/dist/browser/actions/Dropdown.js +6 -3
  8. package/dist/browser/actions/Dropdown.js.map +1 -1
  9. package/dist/browser/actions/FilterChip.js +137 -7
  10. package/dist/browser/actions/FilterChip.js.map +1 -1
  11. package/dist/browser/actions/GestureMenu.js +26 -3
  12. package/dist/browser/actions/GestureMenu.js.map +1 -1
  13. package/dist/browser/actions/SegmentedControl.js +5 -9
  14. package/dist/browser/actions/SegmentedControl.js.map +1 -1
  15. package/dist/browser/actions/SpotlightSearch.js +6 -3
  16. package/dist/browser/actions/SpotlightSearch.js.map +1 -1
  17. package/dist/browser/actions/Tabs.js +5 -2
  18. package/dist/browser/actions/Tabs.js.map +1 -1
  19. package/dist/browser/actions/ViewTabs.js +294 -0
  20. package/dist/browser/actions/ViewTabs.js.map +1 -0
  21. package/dist/browser/actions/drag-and-drop-messages.js +75 -0
  22. package/dist/browser/actions/drag-and-drop-messages.js.map +1 -0
  23. package/dist/browser/actions/drag-and-drop.js +692 -0
  24. package/dist/browser/actions/drag-and-drop.js.map +1 -0
  25. package/dist/browser/actions/filter-messages.js +6 -2
  26. package/dist/browser/actions/filter-messages.js.map +1 -1
  27. package/dist/browser/actions/index.js +3 -1
  28. package/dist/browser/actions/index.js.map +1 -1
  29. package/dist/browser/chat/ChatComposer.js +1229 -605
  30. package/dist/browser/chat/ChatComposer.js.map +1 -1
  31. package/dist/browser/chat/ChatDecision.js +814 -0
  32. package/dist/browser/chat/ChatDecision.js.map +1 -0
  33. package/dist/browser/chat/ChatPrimitives.js +292 -153
  34. package/dist/browser/chat/ChatPrimitives.js.map +1 -1
  35. package/dist/browser/chat/ChatTimeline.js.map +1 -1
  36. package/dist/browser/chat/chat-messages.js +14 -0
  37. package/dist/browser/chat/chat-messages.js.map +1 -1
  38. package/dist/browser/chat/command-search.js +35 -17
  39. package/dist/browser/chat/command-search.js.map +1 -1
  40. package/dist/browser/chat/index.js +10 -3
  41. package/dist/browser/chat/index.js.map +1 -1
  42. package/dist/browser/chat/types.js.map +1 -1
  43. package/dist/browser/content/Calendar.js +146 -119
  44. package/dist/browser/content/Calendar.js.map +1 -1
  45. package/dist/browser/content/CalendarWeekView.js +291 -266
  46. package/dist/browser/content/CalendarWeekView.js.map +1 -1
  47. package/dist/browser/content/Chart.js +54 -71
  48. package/dist/browser/content/Chart.js.map +1 -1
  49. package/dist/browser/content/DataTable.js +224 -155
  50. package/dist/browser/content/DataTable.js.map +1 -1
  51. package/dist/browser/content/FileBrowser.js +2 -2
  52. package/dist/browser/content/FileBrowser.js.map +1 -1
  53. package/dist/browser/content/FileTree.js +42 -36
  54. package/dist/browser/content/FileTree.js.map +1 -1
  55. package/dist/browser/content/FileTypeIcon.js +72 -0
  56. package/dist/browser/content/FileTypeIcon.js.map +1 -0
  57. package/dist/browser/content/FileView.js +2 -2
  58. package/dist/browser/content/FileView.js.map +1 -1
  59. package/dist/browser/content/ReferenceChip.js +162 -0
  60. package/dist/browser/content/ReferenceChip.js.map +1 -0
  61. package/dist/browser/content/calendar-pointer.js +9 -0
  62. package/dist/browser/content/calendar-pointer.js.map +1 -1
  63. package/dist/browser/content/calendar-time-view.js +6 -3
  64. package/dist/browser/content/calendar-time-view.js.map +1 -1
  65. package/dist/browser/content/data-table-messages.js +4 -2
  66. package/dist/browser/content/data-table-messages.js.map +1 -1
  67. package/dist/browser/content/index.js +2 -0
  68. package/dist/browser/content/index.js.map +1 -1
  69. package/dist/browser/feedback/MovedHint.js +197 -0
  70. package/dist/browser/feedback/MovedHint.js.map +1 -0
  71. package/dist/browser/feedback/dialog-core.js +66 -9
  72. package/dist/browser/feedback/dialog-core.js.map +1 -1
  73. package/dist/browser/feedback/index.js +1 -0
  74. package/dist/browser/feedback/index.js.map +1 -1
  75. package/dist/browser/feedback/prompts.js +6 -1
  76. package/dist/browser/feedback/prompts.js.map +1 -1
  77. package/dist/browser/inputs/DatePicker.js +337 -212
  78. package/dist/browser/inputs/DatePicker.js.map +1 -1
  79. package/dist/browser/inputs/date-picker.js +59 -5
  80. package/dist/browser/inputs/date-picker.js.map +1 -1
  81. package/dist/browser/intl/messages.js +12 -0
  82. package/dist/browser/intl/messages.js.map +1 -1
  83. package/dist/browser/intl/weekend.js +39 -0
  84. package/dist/browser/intl/weekend.js.map +1 -0
  85. package/dist/browser/layout/AppOverview.js +1 -2
  86. package/dist/browser/layout/AppOverview.js.map +1 -1
  87. package/dist/browser/layout/AppWorkspace.js +947 -531
  88. package/dist/browser/layout/AppWorkspace.js.map +1 -1
  89. package/dist/browser/layout/PageTitle.js +3 -2
  90. package/dist/browser/layout/PageTitle.js.map +1 -1
  91. package/dist/browser/layout/PanelDialog.js +88 -86
  92. package/dist/browser/layout/PanelDialog.js.map +1 -1
  93. package/dist/browser/layout/ResizeSeparator.js +81 -0
  94. package/dist/browser/layout/ResizeSeparator.js.map +1 -0
  95. package/dist/browser/layout/SettingsModal.js +2 -2
  96. package/dist/browser/layout/SettingsModal.js.map +1 -1
  97. package/dist/browser/layout/SidebarSwitcher.js +19 -11
  98. package/dist/browser/layout/SidebarSwitcher.js.map +1 -1
  99. package/dist/browser/layout/TabBar.js +16 -13
  100. package/dist/browser/layout/TabBar.js.map +1 -1
  101. package/dist/browser/layout/app-host-width.js +44 -0
  102. package/dist/browser/layout/app-host-width.js.map +1 -0
  103. package/dist/browser/layout/app-workspace-controller.js +337 -44
  104. package/dist/browser/layout/app-workspace-controller.js.map +1 -1
  105. package/dist/browser/layout/index.js +4 -1
  106. package/dist/browser/layout/index.js.map +1 -1
  107. package/dist/browser/layout/resize-separator.js +90 -0
  108. package/dist/browser/layout/resize-separator.js.map +1 -0
  109. package/dist/browser/layout/workspace-messages.js +12 -2
  110. package/dist/browser/layout/workspace-messages.js.map +1 -1
  111. package/dist/browser/surfaces/LinkCard.js +1 -1
  112. package/dist/browser/surfaces/LinkCard.js.map +1 -1
  113. package/dist/browser/surfaces/Placeholder.js +45 -11
  114. package/dist/browser/surfaces/Placeholder.js.map +1 -1
  115. package/dist/browser/surfaces/StatCell.js +23 -0
  116. package/dist/browser/surfaces/StatCell.js.map +1 -1
  117. package/dist/browser/widgets/Widget.js +1 -1
  118. package/dist/browser/widgets/Widget.js.map +1 -1
  119. package/dist/ssr/actions/ContextMenu.js +5 -0
  120. package/dist/ssr/actions/ContextMenu.js.map +1 -1
  121. package/dist/ssr/actions/DragAndDrop.js +63 -0
  122. package/dist/ssr/actions/DragAndDrop.js.map +1 -0
  123. package/dist/ssr/actions/Dropdown.js +5 -2
  124. package/dist/ssr/actions/Dropdown.js.map +1 -1
  125. package/dist/ssr/actions/FilterChip.js +59 -7
  126. package/dist/ssr/actions/FilterChip.js.map +1 -1
  127. package/dist/ssr/actions/GestureMenu.js +26 -3
  128. package/dist/ssr/actions/GestureMenu.js.map +1 -1
  129. package/dist/ssr/actions/SegmentedControl.js +1 -2
  130. package/dist/ssr/actions/SegmentedControl.js.map +1 -1
  131. package/dist/ssr/actions/SpotlightSearch.js +2 -2
  132. package/dist/ssr/actions/SpotlightSearch.js.map +1 -1
  133. package/dist/ssr/actions/Tabs.js +2 -2
  134. package/dist/ssr/actions/Tabs.js.map +1 -1
  135. package/dist/ssr/actions/ViewTabs.js +211 -0
  136. package/dist/ssr/actions/ViewTabs.js.map +1 -0
  137. package/dist/ssr/actions/drag-and-drop-messages.js +75 -0
  138. package/dist/ssr/actions/drag-and-drop-messages.js.map +1 -0
  139. package/dist/ssr/actions/drag-and-drop.js +692 -0
  140. package/dist/ssr/actions/drag-and-drop.js.map +1 -0
  141. package/dist/ssr/actions/filter-messages.js +6 -2
  142. package/dist/ssr/actions/filter-messages.js.map +1 -1
  143. package/dist/ssr/actions/index.js +3 -1
  144. package/dist/ssr/actions/index.js.map +1 -1
  145. package/dist/ssr/chat/ChatComposer.js +668 -136
  146. package/dist/ssr/chat/ChatComposer.js.map +1 -1
  147. package/dist/ssr/chat/ChatDecision.js +479 -0
  148. package/dist/ssr/chat/ChatDecision.js.map +1 -0
  149. package/dist/ssr/chat/ChatPrimitives.js +95 -24
  150. package/dist/ssr/chat/ChatPrimitives.js.map +1 -1
  151. package/dist/ssr/chat/ChatTimeline.js.map +1 -1
  152. package/dist/ssr/chat/chat-messages.js +14 -0
  153. package/dist/ssr/chat/chat-messages.js.map +1 -1
  154. package/dist/ssr/chat/command-search.js +35 -17
  155. package/dist/ssr/chat/command-search.js.map +1 -1
  156. package/dist/ssr/chat/index.js +10 -3
  157. package/dist/ssr/chat/index.js.map +1 -1
  158. package/dist/ssr/chat/types.js.map +1 -1
  159. package/dist/ssr/content/Calendar.js +112 -103
  160. package/dist/ssr/content/Calendar.js.map +1 -1
  161. package/dist/ssr/content/CalendarWeekView.js +42 -28
  162. package/dist/ssr/content/CalendarWeekView.js.map +1 -1
  163. package/dist/ssr/content/Chart.js +19 -23
  164. package/dist/ssr/content/Chart.js.map +1 -1
  165. package/dist/ssr/content/DataTable.js +78 -31
  166. package/dist/ssr/content/DataTable.js.map +1 -1
  167. package/dist/ssr/content/FileBrowser.js +2 -2
  168. package/dist/ssr/content/FileBrowser.js.map +1 -1
  169. package/dist/ssr/content/FileTree.js +21 -14
  170. package/dist/ssr/content/FileTree.js.map +1 -1
  171. package/dist/ssr/content/FileTypeIcon.js +50 -0
  172. package/dist/ssr/content/FileTypeIcon.js.map +1 -0
  173. package/dist/ssr/content/FileView.js +2 -2
  174. package/dist/ssr/content/FileView.js.map +1 -1
  175. package/dist/ssr/content/ReferenceChip.js +121 -0
  176. package/dist/ssr/content/ReferenceChip.js.map +1 -0
  177. package/dist/ssr/content/calendar-pointer.js +9 -0
  178. package/dist/ssr/content/calendar-pointer.js.map +1 -1
  179. package/dist/ssr/content/calendar-time-view.js +6 -3
  180. package/dist/ssr/content/calendar-time-view.js.map +1 -1
  181. package/dist/ssr/content/data-table-messages.js +4 -2
  182. package/dist/ssr/content/data-table-messages.js.map +1 -1
  183. package/dist/ssr/content/index.js +2 -0
  184. package/dist/ssr/content/index.js.map +1 -1
  185. package/dist/ssr/feedback/MovedHint.js +166 -0
  186. package/dist/ssr/feedback/MovedHint.js.map +1 -0
  187. package/dist/ssr/feedback/dialog-core.js +66 -9
  188. package/dist/ssr/feedback/dialog-core.js.map +1 -1
  189. package/dist/ssr/feedback/index.js +1 -0
  190. package/dist/ssr/feedback/index.js.map +1 -1
  191. package/dist/ssr/feedback/prompts.js +6 -1
  192. package/dist/ssr/feedback/prompts.js.map +1 -1
  193. package/dist/ssr/inputs/DatePicker.js +138 -69
  194. package/dist/ssr/inputs/DatePicker.js.map +1 -1
  195. package/dist/ssr/inputs/date-picker.js +59 -5
  196. package/dist/ssr/inputs/date-picker.js.map +1 -1
  197. package/dist/ssr/intl/messages.js +12 -0
  198. package/dist/ssr/intl/messages.js.map +1 -1
  199. package/dist/ssr/intl/weekend.js +39 -0
  200. package/dist/ssr/intl/weekend.js.map +1 -0
  201. package/dist/ssr/layout/AppOverview.js +1 -2
  202. package/dist/ssr/layout/AppOverview.js.map +1 -1
  203. package/dist/ssr/layout/AppWorkspace.js +457 -116
  204. package/dist/ssr/layout/AppWorkspace.js.map +1 -1
  205. package/dist/ssr/layout/PageTitle.js +3 -2
  206. package/dist/ssr/layout/PageTitle.js.map +1 -1
  207. package/dist/ssr/layout/PanelDialog.js +7 -6
  208. package/dist/ssr/layout/PanelDialog.js.map +1 -1
  209. package/dist/ssr/layout/ResizeSeparator.js +45 -0
  210. package/dist/ssr/layout/ResizeSeparator.js.map +1 -0
  211. package/dist/ssr/layout/SettingsModal.js +2 -2
  212. package/dist/ssr/layout/SettingsModal.js.map +1 -1
  213. package/dist/ssr/layout/SidebarSwitcher.js +19 -11
  214. package/dist/ssr/layout/SidebarSwitcher.js.map +1 -1
  215. package/dist/ssr/layout/TabBar.js +2 -2
  216. package/dist/ssr/layout/TabBar.js.map +1 -1
  217. package/dist/ssr/layout/app-host-width.js +44 -0
  218. package/dist/ssr/layout/app-host-width.js.map +1 -0
  219. package/dist/ssr/layout/app-workspace-controller.js +337 -44
  220. package/dist/ssr/layout/app-workspace-controller.js.map +1 -1
  221. package/dist/ssr/layout/index.js +4 -1
  222. package/dist/ssr/layout/index.js.map +1 -1
  223. package/dist/ssr/layout/resize-separator.js +90 -0
  224. package/dist/ssr/layout/resize-separator.js.map +1 -0
  225. package/dist/ssr/layout/workspace-messages.js +12 -2
  226. package/dist/ssr/layout/workspace-messages.js.map +1 -1
  227. package/dist/ssr/surfaces/LinkCard.js +1 -1
  228. package/dist/ssr/surfaces/LinkCard.js.map +1 -1
  229. package/dist/ssr/surfaces/Placeholder.js +25 -6
  230. package/dist/ssr/surfaces/Placeholder.js.map +1 -1
  231. package/dist/ssr/surfaces/StatCell.js +23 -0
  232. package/dist/ssr/surfaces/StatCell.js.map +1 -1
  233. package/dist/ssr/widgets/Widget.js +1 -1
  234. package/dist/ssr/widgets/Widget.js.map +1 -1
  235. package/dist/styles.css +1 -1
  236. package/dist/types/actions/ContextMenu.d.ts +1 -0
  237. package/dist/types/actions/DragAndDrop.d.ts +29 -0
  238. package/dist/types/actions/Dropdown.d.ts +4 -0
  239. package/dist/types/actions/FilterChip.d.ts +22 -0
  240. package/dist/types/actions/ViewTabs.d.ts +30 -0
  241. package/dist/types/actions/drag-and-drop-messages.d.ts +35 -0
  242. package/dist/types/actions/drag-and-drop.d.ts +36 -0
  243. package/dist/types/actions/filter-messages.d.ts +2 -0
  244. package/dist/types/actions/index.d.ts +6 -2
  245. package/dist/types/chat/ChatComposer.d.ts +71 -1
  246. package/dist/types/chat/ChatDecision.d.ts +149 -0
  247. package/dist/types/chat/ChatPrimitives.d.ts +14 -1
  248. package/dist/types/chat/ChatTimeline.d.ts +2 -1
  249. package/dist/types/chat/chat-messages.d.ts +7 -0
  250. package/dist/types/chat/command-search.d.ts +5 -0
  251. package/dist/types/chat/index.d.ts +28 -5
  252. package/dist/types/chat/types.d.ts +54 -1
  253. package/dist/types/content/Chart.d.ts +9 -3
  254. package/dist/types/content/DataTable.d.ts +3 -0
  255. package/dist/types/content/FileTypeIcon.d.ts +27 -0
  256. package/dist/types/content/ReferenceChip.d.ts +49 -0
  257. package/dist/types/content/calendar-pointer.d.ts +6 -0
  258. package/dist/types/content/data-table-messages.d.ts +1 -0
  259. package/dist/types/content/index.d.ts +3 -0
  260. package/dist/types/feedback/MovedHint.d.ts +25 -0
  261. package/dist/types/feedback/dialog-core.d.ts +5 -2
  262. package/dist/types/feedback/index.d.ts +2 -0
  263. package/dist/types/feedback/prompts.d.ts +2 -0
  264. package/dist/types/inputs/DatePicker.d.ts +7 -0
  265. package/dist/types/inputs/date-picker.d.ts +25 -1
  266. package/dist/types/intl/messages.d.ts +6 -0
  267. package/dist/types/intl/weekend.d.ts +12 -0
  268. package/dist/types/layout/AppWorkspace.d.ts +48 -10
  269. package/dist/types/layout/ResizeSeparator.d.ts +9 -0
  270. package/dist/types/layout/TabBar.d.ts +7 -0
  271. package/dist/types/layout/app-host-width.d.ts +6 -0
  272. package/dist/types/layout/app-workspace-controller.d.ts +2 -0
  273. package/dist/types/layout/index.d.ts +5 -2
  274. package/dist/types/layout/resize-separator.d.ts +18 -0
  275. package/dist/types/layout/workspace-messages.d.ts +5 -0
  276. package/dist/types/surfaces/Placeholder.d.ts +2 -1
  277. package/dist/types/surfaces/StatCell.d.ts +6 -0
  278. package/package.json +5 -5
@@ -0,0 +1,814 @@
1
+ import { template as _$template } from "solid-js/web";
2
+ import { delegateEvents as _$delegateEvents } from "solid-js/web";
3
+ import { spread as _$spread } from "solid-js/web";
4
+ import { mergeProps as _$mergeProps } from "solid-js/web";
5
+ import { style as _$style } from "solid-js/web";
6
+ import { runHydrationEvents as _$runHydrationEvents } from "solid-js/web";
7
+ import { className as _$className } from "solid-js/web";
8
+ import { effect as _$effect } from "solid-js/web";
9
+ import { getNextElement as _$getNextElement } from "solid-js/web";
10
+ import { getNextMarker as _$getNextMarker } from "solid-js/web";
11
+ import { createComponent as _$createComponent } from "solid-js/web";
12
+ import { memo as _$memo } from "solid-js/web";
13
+ import { insert as _$insert } from "solid-js/web";
14
+ import { setAttribute as _$setAttribute } from "solid-js/web";
15
+ import { use as _$use } from "solid-js/web";
16
+ var _tmpl$ = /*#__PURE__*/_$template(`<section class=k2b-chat-decision__card><p class=k2b-chat-decision__sentence tabindex=-1></p><p class="k2b-chat-line k2b-chat-decision__reason"><i aria-hidden=true></i><span class=k2b-chat-line__text></span></p><!$><!/><div class=k2b-chat-decision__answers><!$><!/><!$><!/><!$><!/>`),
17
+ _tmpl$2 = /*#__PURE__*/_$template(`<div>`),
18
+ _tmpl$3 = /*#__PURE__*/_$template(`<i aria-hidden=true>`),
19
+ _tmpl$4 = /*#__PURE__*/_$template(`<div tabindex=-1><span class=k2b-chat-outcome__icon aria-hidden=true><i></i></span><div class=k2b-chat-outcome__cell></div><span class=k2b-sr-only role=status aria-live=polite>`),
20
+ _tmpl$5 = /*#__PURE__*/_$template(`<div class=k2b-chat-outcome__text><!$><!/><!$><!/><!$><!/><!$><!/><!$><!/>`),
21
+ _tmpl$6 = /*#__PURE__*/_$template(`<span class=k2b-chat-outcome__detail>`),
22
+ _tmpl$7 = /*#__PURE__*/_$template(`<span class=k2b-chat-outcome__time>`),
23
+ _tmpl$8 = /*#__PURE__*/_$template(`<div class=k2b-chat-outcome__actions>`),
24
+ _tmpl$9 = /*#__PURE__*/_$template(`<span class=k2b-chat-preview__person><!$><!/><!$><!/>`),
25
+ _tmpl$0 = /*#__PURE__*/_$template(`<b>`),
26
+ _tmpl$1 = /*#__PURE__*/_$template(`<span class=k2b-chat-preview__address>`),
27
+ _tmpl$10 = /*#__PURE__*/_$template(`<div class=k2b-chat-preview__header><dl></dl><!$><!/>`),
28
+ _tmpl$11 = /*#__PURE__*/_$template(`<div><dt></dt><dd><!$><!/><!$><!/>`),
29
+ _tmpl$12 = /*#__PURE__*/_$template(`<p>`),
30
+ _tmpl$13 = /*#__PURE__*/_$template(`<p class=k2b-chat-preview__title-line><span class=k2b-chat-preview__title></span><!$><!/>`),
31
+ _tmpl$14 = /*#__PURE__*/_$template(`<span class=k2b-chat-preview__meta>`),
32
+ _tmpl$15 = /*#__PURE__*/_$template(`<p class=k2b-chat-preview__sentence>`),
33
+ _tmpl$16 = /*#__PURE__*/_$template(`<p class=k2b-chat-preview__excerpt>`),
34
+ _tmpl$17 = /*#__PURE__*/_$template(`<button type=button class=k2b-chat-preview__more aria-expanded=false>`),
35
+ _tmpl$18 = /*#__PURE__*/_$template(`<a class=k2b-chat-preview__more>`),
36
+ _tmpl$19 = /*#__PURE__*/_$template(`<ul class=k2b-chat-preview__lines>`),
37
+ _tmpl$20 = /*#__PURE__*/_$template(`<span class=k2b-chat-line__text><span class=k2b-chat-mark><!$><!/><!$><!/></span><!$><!/>`),
38
+ _tmpl$21 = /*#__PURE__*/_$template(`<span class=k2b-sr-only><!$><!/> `),
39
+ _tmpl$22 = /*#__PURE__*/_$template(`<li>`),
40
+ _tmpl$23 = /*#__PURE__*/_$template(`<p class=k2b-chat-preview__people><span class=k2b-chat-preview__faces aria-hidden=true></span><span>`),
41
+ _tmpl$24 = /*#__PURE__*/_$template(`<del class=k2b-chat-mark data-change=removed><span class=k2b-sr-only><!$><!/> </span><!$><!/>`),
42
+ _tmpl$25 = /*#__PURE__*/_$template(`<mark class=k2b-chat-mark data-change=added><span class=k2b-sr-only><!$><!/> </span><!$><!/>`);
43
+ import { createContext, createEffect, createMemo, createSignal, createUniqueId, For, on, onCleanup, onMount, Show, untrack, useContext } from "solid-js";
44
+ import { Button } from "../actions/Button";
45
+ import { Avatar } from "../surfaces/Avatar";
46
+ import { useChatMessages } from "./chat-messages";
47
+
48
+ // ---------------------------------------------------------------------------
49
+ // Decision
50
+ // ---------------------------------------------------------------------------
51
+
52
+ /** What an outcome inside a question needs from it: whether it was just answered here, and a link press inside it. */
53
+ const DecisionScope = createContext();
54
+ const reasonIcon = reason => reason.icon ?? "ti ti-info-circle";
55
+
56
+ /**
57
+ * A question the person answers in the conversation: one sentence, why it is asked, the thing itself, and two answers.
58
+ * An answer collapses it at once to its outcome line, which takes the focus and is announced.
59
+ */
60
+ export function ChatDecision(props) {
61
+ const id = createUniqueId();
62
+ const sentenceId = `k2b-chat-decision-${id}-sentence`;
63
+ const reasonId = `k2b-chat-decision-${id}-reason`;
64
+ let root;
65
+ let sentence;
66
+ // An answer given here moves the focus to the outcome; a click in the outcome that reopens the question moves it
67
+ // back to the sentence. A state change from elsewhere moves no focus.
68
+ const [answeredHere, setAnsweredHere] = createSignal(false);
69
+ const [arrive, setArrive] = createSignal(false);
70
+ let reopenedHere = false;
71
+ // A press counts only while its action runs: a reopen from elsewhere later must not take the focus.
72
+ const scope = {
73
+ answered: answeredHere,
74
+ pressed: () => {
75
+ reopenedHere = true;
76
+ },
77
+ released: () => {
78
+ reopenedHere = false;
79
+ }
80
+ };
81
+
82
+ // Read once: an object literal from the host builds its JSX again on every read.
83
+ const reason = createMemo(() => props.unavailable ?? props.reason);
84
+ const open = () => props.state === "open";
85
+ const answer = (choice, enabled) => {
86
+ if (!enabled || !open() || answeredHere()) return;
87
+ setAnsweredHere(true);
88
+ try {
89
+ const result = choice.onSelect();
90
+ if (result instanceof Promise) result.catch(error => props.onAnswerError?.(error));
91
+ } catch (error) {
92
+ props.onAnswerError?.(error);
93
+ }
94
+ // A host that keeps the question open (it could not take the answer) gets working buttons back.
95
+ queueMicrotask(() => {
96
+ if (open()) setAnsweredHere(false);
97
+ });
98
+ };
99
+ createEffect(on(() => props.state, (state, previous) => {
100
+ if (state !== "open" && previous === "open" && answeredHere()) {
101
+ root?.querySelector(".k2b-chat-outcome")?.focus({
102
+ preventScroll: true
103
+ });
104
+ }
105
+ if (state === "open" && previous !== undefined && previous !== "open") {
106
+ // A host that could not take an answer given here returns the question from `sending`; the outcome that held
107
+ // the focus is gone, so the focus goes back to the sentence instead of the page.
108
+ const active = document.activeElement;
109
+ const failedHere = answeredHere() && previous === "sending" && (!active || active === document.body);
110
+ setAnsweredHere(false);
111
+ if (reopenedHere || failedHere) {
112
+ sentence?.focus({
113
+ preventScroll: true
114
+ });
115
+ setArrive(true);
116
+ }
117
+ // Handled. Until then the marker holds through states in between, such as `sending` while a reopen loads.
118
+ reopenedHere = false;
119
+ }
120
+ }));
121
+ return (() => {
122
+ var _el$ = _$getNextElement(_tmpl$2);
123
+ var _ref$ = root;
124
+ typeof _ref$ === "function" ? _$use(_ref$, _el$) : root = _el$;
125
+ _$insert(_el$, _$createComponent(Show, {
126
+ get when() {
127
+ return open();
128
+ },
129
+ get fallback() {
130
+ return _$createComponent(DecisionScope.Provider, {
131
+ value: scope,
132
+ get children() {
133
+ return props.outcome;
134
+ }
135
+ });
136
+ },
137
+ get children() {
138
+ var _el$2 = _$getNextElement(_tmpl$),
139
+ _el$3 = _el$2.firstChild,
140
+ _el$4 = _el$3.nextSibling,
141
+ _el$5 = _el$4.firstChild,
142
+ _el$6 = _el$5.nextSibling,
143
+ _el$12 = _el$4.nextSibling,
144
+ [_el$13, _co$4] = _$getNextMarker(_el$12.nextSibling),
145
+ _el$7 = _el$13.nextSibling,
146
+ _el$8 = _el$7.firstChild,
147
+ [_el$9, _co$] = _$getNextMarker(_el$8.nextSibling),
148
+ _el$0 = _el$9.nextSibling,
149
+ [_el$1, _co$2] = _$getNextMarker(_el$0.nextSibling),
150
+ _el$10 = _el$1.nextSibling,
151
+ [_el$11, _co$3] = _$getNextMarker(_el$10.nextSibling);
152
+ _$setAttribute(_el$2, "aria-labelledby", sentenceId);
153
+ _$setAttribute(_el$2, "aria-describedby", reasonId);
154
+ _el$3.addEventListener("animationend", () => setArrive(false));
155
+ var _ref$2 = sentence;
156
+ typeof _ref$2 === "function" ? _$use(_ref$2, _el$3) : sentence = _el$3;
157
+ _$setAttribute(_el$3, "id", sentenceId);
158
+ _$insert(_el$3, () => props.sentence);
159
+ _$setAttribute(_el$4, "id", reasonId);
160
+ _$insert(_el$6, () => reason().text);
161
+ _$insert(_el$2, () => props.preview, _el$13, _co$4);
162
+ _$insert(_el$7, _$createComponent(Button, {
163
+ "class": "k2b-chat-decision__answer",
164
+ wrap: true,
165
+ get variant() {
166
+ return props.confirm.variant ?? "ai";
167
+ },
168
+ get disabled() {
169
+ return Boolean(props.unavailable);
170
+ },
171
+ onClick: () => answer(props.confirm, !props.unavailable),
172
+ get children() {
173
+ return [_$createComponent(Show, {
174
+ get when() {
175
+ return props.confirm.icon;
176
+ },
177
+ children: icon => (() => {
178
+ var _el$14 = _$getNextElement(_tmpl$3);
179
+ _$effect(() => _$className(_el$14, icon()));
180
+ return _el$14;
181
+ })()
182
+ }), _$memo(() => props.confirm.label)];
183
+ }
184
+ }), _el$9, _co$);
185
+ _$insert(_el$7, _$createComponent(Button, {
186
+ "class": "k2b-chat-decision__answer",
187
+ wrap: true,
188
+ variant: "subtle",
189
+ onClick: () => answer(props.decline, true),
190
+ get children() {
191
+ return [_$createComponent(Show, {
192
+ get when() {
193
+ return props.decline.icon;
194
+ },
195
+ children: icon => (() => {
196
+ var _el$15 = _$getNextElement(_tmpl$3);
197
+ _$effect(() => _$className(_el$15, icon()));
198
+ return _el$15;
199
+ })()
200
+ }), _$memo(() => props.decline.label)];
201
+ }
202
+ }), _el$1, _co$2);
203
+ _$insert(_el$7, _$createComponent(Show, {
204
+ get when() {
205
+ return props.remember;
206
+ },
207
+ children: remember => _$createComponent(Button, {
208
+ "class": "k2b-chat-decision__remember",
209
+ wrap: true,
210
+ variant: "text",
211
+ get disabled() {
212
+ return Boolean(props.unavailable);
213
+ },
214
+ onClick: () => answer(remember(), !props.unavailable),
215
+ get children() {
216
+ return remember().label;
217
+ }
218
+ })
219
+ }), _el$11, _co$3);
220
+ _$effect(_p$ => {
221
+ var _v$ = arrive() ? "true" : undefined,
222
+ _v$2 = reason().tone ?? "neutral",
223
+ _v$3 = `k2b-chat-line__icon ${reasonIcon(reason())}`;
224
+ _v$ !== _p$.e && _$setAttribute(_el$3, "data-arrive", _p$.e = _v$);
225
+ _v$2 !== _p$.t && _$setAttribute(_el$4, "data-tone", _p$.t = _v$2);
226
+ _v$3 !== _p$.a && _$className(_el$5, _p$.a = _v$3);
227
+ return _p$;
228
+ }, {
229
+ e: undefined,
230
+ t: undefined,
231
+ a: undefined
232
+ });
233
+ return _el$2;
234
+ }
235
+ }));
236
+ _$effect(_p$ => {
237
+ var _v$4 = `k2b-chat-decision ${props.class ?? ""}`,
238
+ _v$5 = props.state,
239
+ _v$6 = props.anchorId !== undefined ? String(props.anchorId) : undefined;
240
+ _v$4 !== _p$.e && _$className(_el$, _p$.e = _v$4);
241
+ _v$5 !== _p$.t && _$setAttribute(_el$, "data-state", _p$.t = _v$5);
242
+ _v$6 !== _p$.a && _$setAttribute(_el$, "data-chat-anchor", _p$.a = _v$6);
243
+ return _p$;
244
+ }, {
245
+ e: undefined,
246
+ t: undefined,
247
+ a: undefined
248
+ });
249
+ return _el$;
250
+ })();
251
+ }
252
+
253
+ // ---------------------------------------------------------------------------
254
+ // Outcome
255
+ // ---------------------------------------------------------------------------
256
+
257
+ const OUTCOME_ICONS = {
258
+ running: "ti ti-loader-2 k2b-spin",
259
+ done: "ti ti-check",
260
+ off: "ti ti-circle-off",
261
+ waiting: "ti ti-clock",
262
+ warning: "ti ti-alert-triangle",
263
+ error: "ti ti-alert-circle"
264
+ };
265
+
266
+ /** The visible words of a line, without what screen readers do not hear. */
267
+ const spokenText = element => {
268
+ const copy = element.cloneNode(true);
269
+ // Buttons under the line are controls, not part of what happened.
270
+ for (const hidden of copy.querySelectorAll('[aria-hidden="true"], .k2b-chat-outcome__actions')) hidden.remove();
271
+ // The time and the link stand apart by margin only; spoken, they need a space.
272
+ for (const part of copy.querySelectorAll(".k2b-chat-outcome__time, .k2b-chat-outcome__link")) part.before(" ");
273
+ return (copy.textContent ?? "").replace(/\s+/g, " ").trim();
274
+ };
275
+
276
+ /**
277
+ * One line that says what happened: running, done, off, waiting, warning, or error. Changes are announced through a
278
+ * polite live region; the line itself can take the focus.
279
+ */
280
+ export function ChatOutcome(props) {
281
+ const scope = useContext(DecisionScope);
282
+ // Only a line that replaces a question just answered here fades in; history renders final.
283
+ const entering = untrack(() => scope?.answered() ?? false);
284
+ const [live, setLive] = createSignal("");
285
+ let root;
286
+ let cell;
287
+ let pending = false;
288
+ let timer;
289
+ // Read once: an object literal from the host builds its JSX again on every read.
290
+ const lines = createMemo(() => props.lines);
291
+ const line = () => lines()[props.current];
292
+ const tone = () => line()?.tone ?? "off";
293
+ const keys = () => {
294
+ const all = Object.keys(lines());
295
+ return all.includes(props.current) ? all : [props.current, ...all];
296
+ };
297
+
298
+ // Empty the region first, so the same words spoken again are a change too.
299
+ const announce = () => {
300
+ setLive("");
301
+ if (timer) clearTimeout(timer);
302
+ timer = setTimeout(() => {
303
+ const current = cell?.querySelector('[data-current="true"]');
304
+ setLive(current ? spokenText(current) : "");
305
+ }, 40);
306
+ };
307
+ onMount(() => {
308
+ if (untrack(() => scope?.answered())) announce();
309
+ });
310
+ createEffect(on(() => props.current, () => {
311
+ // A link pressed in a line that is now hidden would leave the focus on an invisible button, which the browser
312
+ // then drops to the page. The line itself keeps it instead.
313
+ const active = document.activeElement;
314
+ const hidden = active && cell?.contains(active) && !active.closest('[data-current="true"]');
315
+ if (hidden || pending && active === document.body) root?.focus({
316
+ preventScroll: true
317
+ });
318
+ announce();
319
+ }, {
320
+ defer: true
321
+ }));
322
+ onCleanup(() => {
323
+ if (timer) clearTimeout(timer);
324
+ });
325
+ return (() => {
326
+ var _el$16 = _$getNextElement(_tmpl$4),
327
+ _el$17 = _el$16.firstChild,
328
+ _el$18 = _el$17.firstChild,
329
+ _el$19 = _el$17.nextSibling,
330
+ _el$20 = _el$19.nextSibling;
331
+ var _ref$3 = root;
332
+ typeof _ref$3 === "function" ? _$use(_ref$3, _el$16) : root = _el$16;
333
+ _$setAttribute(_el$16, "data-enter", entering ? "true" : undefined);
334
+ var _ref$4 = cell;
335
+ typeof _ref$4 === "function" ? _$use(_ref$4, _el$19) : cell = _el$19;
336
+ _$insert(_el$19, _$createComponent(For, {
337
+ get each() {
338
+ return keys();
339
+ },
340
+ children: key => {
341
+ const entry = () => lines()[key];
342
+ const current = () => key === props.current;
343
+ return _$createComponent(Show, {
344
+ get when() {
345
+ return entry();
346
+ },
347
+ children: item => (() => {
348
+ var _el$21 = _$getNextElement(_tmpl$5),
349
+ _el$22 = _el$21.firstChild,
350
+ [_el$23, _co$5] = _$getNextMarker(_el$22.nextSibling),
351
+ _el$24 = _el$23.nextSibling,
352
+ [_el$25, _co$6] = _$getNextMarker(_el$24.nextSibling),
353
+ _el$26 = _el$25.nextSibling,
354
+ [_el$27, _co$7] = _$getNextMarker(_el$26.nextSibling),
355
+ _el$28 = _el$27.nextSibling,
356
+ [_el$29, _co$8] = _$getNextMarker(_el$28.nextSibling),
357
+ _el$30 = _el$29.nextSibling,
358
+ [_el$31, _co$9] = _$getNextMarker(_el$30.nextSibling);
359
+ _$insert(_el$21, () => item().text, _el$23, _co$5);
360
+ _$insert(_el$21, _$createComponent(Show, {
361
+ get when() {
362
+ return item().detail;
363
+ },
364
+ children: detail => [" ", (() => {
365
+ var _el$32 = _$getNextElement(_tmpl$6);
366
+ _$insert(_el$32, detail);
367
+ return _el$32;
368
+ })()]
369
+ }), _el$25, _co$6);
370
+ _$insert(_el$21, _$createComponent(Show, {
371
+ get when() {
372
+ return item().time;
373
+ },
374
+ children: time => (() => {
375
+ var _el$33 = _$getNextElement(_tmpl$7);
376
+ _$insert(_el$33, time);
377
+ return _el$33;
378
+ })()
379
+ }), _el$27, _co$7);
380
+ _$insert(_el$21, _$createComponent(Show, {
381
+ get when() {
382
+ return item().action;
383
+ },
384
+ children: action => _$createComponent(Button, {
385
+ "class": "k2b-chat-outcome__link",
386
+ wrap: true,
387
+ variant: "text",
388
+ get tabIndex() {
389
+ return current() ? undefined : -1;
390
+ },
391
+ onClick: () => {
392
+ // A second press while the first is still running would repeat its work.
393
+ if (pending) return;
394
+ scope?.pressed();
395
+ try {
396
+ const result = action().onSelect();
397
+ if (result instanceof Promise) {
398
+ pending = true;
399
+ result.catch(error => props.onActionError?.(error)).finally(() => {
400
+ pending = false;
401
+ scope?.released();
402
+ });
403
+ return;
404
+ }
405
+ } catch (error) {
406
+ props.onActionError?.(error);
407
+ }
408
+ scope?.released();
409
+ },
410
+ get children() {
411
+ return action().label;
412
+ }
413
+ })
414
+ }), _el$29, _co$8);
415
+ _$insert(_el$21, _$createComponent(Show, {
416
+ get when() {
417
+ return item().actions;
418
+ },
419
+ children: actions => (() => {
420
+ var _el$34 = _$getNextElement(_tmpl$8);
421
+ _$insert(_el$34, actions);
422
+ return _el$34;
423
+ })()
424
+ }), _el$31, _co$9);
425
+ _$effect(_p$ => {
426
+ var _v$10 = current() ? "true" : undefined,
427
+ _v$11 = current() ? undefined : "true";
428
+ _v$10 !== _p$.e && _$setAttribute(_el$21, "data-current", _p$.e = _v$10);
429
+ _v$11 !== _p$.t && _$setAttribute(_el$21, "aria-hidden", _p$.t = _v$11);
430
+ return _p$;
431
+ }, {
432
+ e: undefined,
433
+ t: undefined
434
+ });
435
+ return _el$21;
436
+ })()
437
+ });
438
+ }
439
+ }));
440
+ _$insert(_el$20, live);
441
+ _$effect(_p$ => {
442
+ var _v$7 = `k2b-chat-outcome ${props.class ?? ""}`,
443
+ _v$8 = tone(),
444
+ _v$9 = props.anchorId !== undefined ? String(props.anchorId) : undefined,
445
+ _v$0 = line()?.icon ?? OUTCOME_ICONS[tone()],
446
+ _v$1 = tone() === "running" ? "true" : undefined;
447
+ _v$7 !== _p$.e && _$className(_el$16, _p$.e = _v$7);
448
+ _v$8 !== _p$.t && _$setAttribute(_el$16, "data-tone", _p$.t = _v$8);
449
+ _v$9 !== _p$.a && _$setAttribute(_el$16, "data-chat-anchor", _p$.a = _v$9);
450
+ _v$0 !== _p$.o && _$className(_el$18, _p$.o = _v$0);
451
+ _v$1 !== _p$.i && _$setAttribute(_el$19, "aria-busy", _p$.i = _v$1);
452
+ return _p$;
453
+ }, {
454
+ e: undefined,
455
+ t: undefined,
456
+ a: undefined,
457
+ o: undefined,
458
+ i: undefined
459
+ });
460
+ return _el$16;
461
+ })();
462
+ }
463
+
464
+ // ---------------------------------------------------------------------------
465
+ // Preview
466
+ // ---------------------------------------------------------------------------
467
+
468
+ /** The thing a question is about, as calm text on the sentence's edge: no surface, no column. */
469
+ function ChatPreviewRoot(props) {
470
+ return (() => {
471
+ var _el$35 = _$getNextElement(_tmpl$2);
472
+ _$insert(_el$35, () => props.children);
473
+ _$effect(() => _$className(_el$35, `k2b-chat-preview ${props.class ?? ""}`));
474
+ return _el$35;
475
+ })();
476
+ }
477
+ const PreviewPeople = props => _$createComponent(For, {
478
+ get each() {
479
+ return props.people;
480
+ },
481
+ children: (person, index) => [_$memo(() => index() > 0 ? ", " : ""), (() => {
482
+ var _el$36 = _$getNextElement(_tmpl$9),
483
+ _el$37 = _el$36.firstChild,
484
+ [_el$38, _co$0] = _$getNextMarker(_el$37.nextSibling),
485
+ _el$39 = _el$38.nextSibling,
486
+ [_el$40, _co$1] = _$getNextMarker(_el$39.nextSibling);
487
+ _$insert(_el$36, _$createComponent(Show, {
488
+ get when() {
489
+ return person.name;
490
+ },
491
+ children: name => (() => {
492
+ var _el$41 = _$getNextElement(_tmpl$0);
493
+ _$insert(_el$41, name);
494
+ return _el$41;
495
+ })()
496
+ }), _el$38, _co$0);
497
+ _$insert(_el$36, _$createComponent(Show, {
498
+ get when() {
499
+ return person.address;
500
+ },
501
+ children: address => (() => {
502
+ var _el$42 = _$getNextElement(_tmpl$1);
503
+ _$insert(_el$42, address);
504
+ _$effect(() => _$setAttribute(_el$42, "data-alone", person.name ? undefined : "true"));
505
+ return _el$42;
506
+ })()
507
+ }), _el$40, _co$1);
508
+ return _el$36;
509
+ })()]
510
+ });
511
+ function ChatPreviewHeader(props) {
512
+ return (() => {
513
+ var _el$43 = _$getNextElement(_tmpl$10),
514
+ _el$44 = _el$43.firstChild,
515
+ _el$45 = _el$44.nextSibling,
516
+ [_el$46, _co$10] = _$getNextMarker(_el$45.nextSibling);
517
+ _$insert(_el$44, _$createComponent(For, {
518
+ get each() {
519
+ return props.rows;
520
+ },
521
+ children: row => (() => {
522
+ var _el$47 = _$getNextElement(_tmpl$11),
523
+ _el$48 = _el$47.firstChild,
524
+ _el$49 = _el$48.nextSibling,
525
+ _el$50 = _el$49.firstChild,
526
+ [_el$51, _co$11] = _$getNextMarker(_el$50.nextSibling),
527
+ _el$52 = _el$51.nextSibling,
528
+ [_el$53, _co$12] = _$getNextMarker(_el$52.nextSibling);
529
+ _$insert(_el$48, () => row.label);
530
+ _$insert(_el$49, _$createComponent(Show, {
531
+ get when() {
532
+ return row.people;
533
+ },
534
+ children: people => _$createComponent(PreviewPeople, {
535
+ get people() {
536
+ return people();
537
+ }
538
+ })
539
+ }), _el$51, _co$11);
540
+ _$insert(_el$49, () => row.value, _el$53, _co$12);
541
+ _$effect(() => _$setAttribute(_el$47, "data-emphasis", row.emphasis ? "true" : undefined));
542
+ return _el$47;
543
+ })()
544
+ }));
545
+ _$insert(_el$43, _$createComponent(Show, {
546
+ get when() {
547
+ return props.note;
548
+ },
549
+ children: note => (() => {
550
+ var _el$54 = _$getNextElement(_tmpl$12);
551
+ _$insert(_el$54, note);
552
+ return _el$54;
553
+ })()
554
+ }), _el$46, _co$10);
555
+ return _el$43;
556
+ })();
557
+ }
558
+ /** The thing's name in the text's own face, with optional quiet facts after it. */
559
+ function ChatPreviewTitle(props) {
560
+ return (() => {
561
+ var _el$55 = _$getNextElement(_tmpl$13),
562
+ _el$56 = _el$55.firstChild,
563
+ _el$57 = _el$56.nextSibling,
564
+ [_el$58, _co$13] = _$getNextMarker(_el$57.nextSibling);
565
+ _$insert(_el$56, () => props.children);
566
+ _$insert(_el$55, _$createComponent(Show, {
567
+ get when() {
568
+ return props.meta;
569
+ },
570
+ children: meta => [" ", (() => {
571
+ var _el$59 = _$getNextElement(_tmpl$14);
572
+ _$insert(_el$59, meta);
573
+ return _el$59;
574
+ })()]
575
+ }), _el$58, _co$13);
576
+ return _el$55;
577
+ })();
578
+ }
579
+
580
+ /** A rule or instruction as one sentence, such as what a routine does; chips and marks may stand inside. */
581
+ function ChatPreviewSentence(props) {
582
+ return (() => {
583
+ var _el$60 = _$getNextElement(_tmpl$15);
584
+ _$insert(_el$60, () => props.children);
585
+ return _el$60;
586
+ })();
587
+ }
588
+ /** The first lines of a longer text. It keeps its line breaks, shows about three lines, and fades out. */
589
+ function ChatPreviewExcerpt(props) {
590
+ return (() => {
591
+ var _el$61 = _$getNextElement(_tmpl$16);
592
+ _$insert(_el$61, () => props.children);
593
+ _$effect(_p$ => {
594
+ var _v$12 = props.id,
595
+ _v$13 = props.expanded ? "true" : undefined,
596
+ _v$14 = props.expanded ? -1 : undefined;
597
+ _v$12 !== _p$.e && _$setAttribute(_el$61, "id", _p$.e = _v$12);
598
+ _v$13 !== _p$.t && _$setAttribute(_el$61, "data-expanded", _p$.t = _v$13);
599
+ _v$14 !== _p$.a && _$setAttribute(_el$61, "tabindex", _p$.a = _v$14);
600
+ return _p$;
601
+ }, {
602
+ e: undefined,
603
+ t: undefined,
604
+ a: undefined
605
+ });
606
+ return _el$61;
607
+ })();
608
+ }
609
+ /**
610
+ * Shows the rest of an excerpt in place, for a text with no page of its own to open. It looks like `ReadMore`; the
611
+ * caller removes it once the text is shown, and the focus moves to the text, so reading goes on where it was.
612
+ */
613
+ function ChatPreviewShowAll(props) {
614
+ const show = () => {
615
+ props.onShow();
616
+ queueMicrotask(() => document.getElementById(props.controls)?.focus({
617
+ preventScroll: true
618
+ }));
619
+ };
620
+ return (() => {
621
+ var _el$62 = _$getNextElement(_tmpl$17);
622
+ _el$62.$$click = show;
623
+ _$insert(_el$62, () => props.children);
624
+ _$effect(() => _$setAttribute(_el$62, "aria-controls", props.controls));
625
+ _$runHydrationEvents();
626
+ return _el$62;
627
+ })();
628
+ }
629
+ /** Opens the whole thing at exactly the version the question shows. */
630
+ function ChatPreviewReadMore(props) {
631
+ return (() => {
632
+ var _el$63 = _$getNextElement(_tmpl$18);
633
+ _$insert(_el$63, () => props.children);
634
+ _$effect(_p$ => {
635
+ var _v$15 = props.href,
636
+ _v$16 = props.title;
637
+ _v$15 !== _p$.e && _$setAttribute(_el$63, "href", _p$.e = _v$15);
638
+ _v$16 !== _p$.t && _$setAttribute(_el$63, "title", _p$.t = _v$16);
639
+ return _p$;
640
+ }, {
641
+ e: undefined,
642
+ t: undefined
643
+ });
644
+ return _el$63;
645
+ })();
646
+ }
647
+ const InList = createContext(false);
648
+
649
+ /** A list of lines with a name, such as "What the routine may do". */
650
+ function ChatPreviewLines(props) {
651
+ return (() => {
652
+ var _el$64 = _$getNextElement(_tmpl$19);
653
+ _$insert(_el$64, _$createComponent(InList.Provider, {
654
+ value: true,
655
+ get children() {
656
+ return props.children;
657
+ }
658
+ }));
659
+ _$effect(() => _$setAttribute(_el$64, "aria-label", props.label));
660
+ return _el$64;
661
+ })();
662
+ }
663
+ /** One line led by an icon: a consequence, a right, an attachment, or a warning. */
664
+ function ChatPreviewLine(props) {
665
+ const inList = useContext(InList);
666
+ const messages = useChatMessages();
667
+ const content = () => [(() => {
668
+ var _el$65 = _$getNextElement(_tmpl$3);
669
+ _$effect(_p$ => {
670
+ var _v$17 = `k2b-chat-line__icon ${props.icon}`,
671
+ _v$18 = props.accent ? {
672
+ color: props.accent
673
+ } : undefined;
674
+ _v$17 !== _p$.e && _$className(_el$65, _p$.e = _v$17);
675
+ _p$.t = _$style(_el$65, _v$18, _p$.t);
676
+ return _p$;
677
+ }, {
678
+ e: undefined,
679
+ t: undefined
680
+ });
681
+ return _el$65;
682
+ })(), (() => {
683
+ var _el$66 = _$getNextElement(_tmpl$20),
684
+ _el$67 = _el$66.firstChild,
685
+ _el$68 = _el$67.firstChild,
686
+ [_el$69, _co$14] = _$getNextMarker(_el$68.nextSibling),
687
+ _el$70 = _el$69.nextSibling,
688
+ [_el$71, _co$15] = _$getNextMarker(_el$70.nextSibling),
689
+ _el$72 = _el$67.nextSibling,
690
+ [_el$73, _co$16] = _$getNextMarker(_el$72.nextSibling);
691
+ _$insert(_el$67, _$createComponent(Show, {
692
+ get when() {
693
+ return props.mark;
694
+ },
695
+ children: mark => (() => {
696
+ var _el$74 = _$getNextElement(_tmpl$21),
697
+ _el$76 = _el$74.firstChild,
698
+ [_el$77, _co$17] = _$getNextMarker(_el$76.nextSibling),
699
+ _el$75 = _el$77.nextSibling;
700
+ _$insert(_el$74, (() => {
701
+ var _c$ = _$memo(() => mark() === "added");
702
+ return () => _c$() ? messages().markAdded : messages().markRemoved;
703
+ })(), _el$77, _co$17);
704
+ return _el$74;
705
+ })()
706
+ }), _el$69, _co$14);
707
+ _$insert(_el$67, () => props.children, _el$71, _co$15);
708
+ _$insert(_el$66, _$createComponent(Show, {
709
+ get when() {
710
+ return props.meta;
711
+ },
712
+ children: meta => [" ", (() => {
713
+ var _el$78 = _$getNextElement(_tmpl$14);
714
+ _$insert(_el$78, meta);
715
+ return _el$78;
716
+ })()]
717
+ }), _el$73, _co$16);
718
+ _$effect(() => _$setAttribute(_el$67, "data-change", props.mark));
719
+ return _el$66;
720
+ })()];
721
+ const attributes = () => ({
722
+ class: "k2b-chat-line k2b-chat-preview__line",
723
+ "data-tone": props.tone && props.tone !== "default" ? props.tone : undefined
724
+ });
725
+ return inList ? (() => {
726
+ var _el$79 = _$getNextElement(_tmpl$22);
727
+ _$spread(_el$79, _$mergeProps(attributes), false, true);
728
+ _$insert(_el$79, content);
729
+ _$runHydrationEvents();
730
+ return _el$79;
731
+ })() : (() => {
732
+ var _el$80 = _$getNextElement(_tmpl$12);
733
+ _$spread(_el$80, _$mergeProps(attributes), false, true);
734
+ _$insert(_el$80, content);
735
+ _$runHydrationEvents();
736
+ return _el$80;
737
+ })();
738
+ }
739
+ function ChatPreviewPeople(props) {
740
+ return (() => {
741
+ var _el$81 = _$getNextElement(_tmpl$23),
742
+ _el$82 = _el$81.firstChild,
743
+ _el$83 = _el$82.nextSibling;
744
+ _$insert(_el$82, _$createComponent(For, {
745
+ get each() {
746
+ return props.people;
747
+ },
748
+ children: person => _$createComponent(Avatar, {
749
+ get name() {
750
+ return person.name;
751
+ },
752
+ get src() {
753
+ return person.src;
754
+ },
755
+ size: "xs"
756
+ })
757
+ }));
758
+ _$insert(_el$83, () => props.children);
759
+ return _el$81;
760
+ })();
761
+ }
762
+ export const ChatPreview = Object.assign(ChatPreviewRoot, {
763
+ Header: ChatPreviewHeader,
764
+ Title: ChatPreviewTitle,
765
+ Sentence: ChatPreviewSentence,
766
+ Excerpt: ChatPreviewExcerpt,
767
+ ReadMore: ChatPreviewReadMore,
768
+ ShowAll: ChatPreviewShowAll,
769
+ Lines: ChatPreviewLines,
770
+ Line: ChatPreviewLine,
771
+ People: ChatPreviewPeople
772
+ });
773
+
774
+ // ---------------------------------------------------------------------------
775
+ // Mark
776
+ // ---------------------------------------------------------------------------
777
+
778
+ /** Marks new or removed words; screen readers hear "new:" or "removed:" first. */
779
+ export function ChatMark(props) {
780
+ const messages = useChatMessages();
781
+ return _$createComponent(Show, {
782
+ get when() {
783
+ return props.change === "removed";
784
+ },
785
+ get fallback() {
786
+ return (() => {
787
+ var _el$91 = _$getNextElement(_tmpl$25),
788
+ _el$92 = _el$91.firstChild,
789
+ _el$94 = _el$92.firstChild,
790
+ [_el$95, _co$20] = _$getNextMarker(_el$94.nextSibling),
791
+ _el$93 = _el$95.nextSibling,
792
+ _el$96 = _el$92.nextSibling,
793
+ [_el$97, _co$21] = _$getNextMarker(_el$96.nextSibling);
794
+ _$insert(_el$92, () => messages().markAdded, _el$95, _co$20);
795
+ _$insert(_el$91, () => props.children, _el$97, _co$21);
796
+ return _el$91;
797
+ })();
798
+ },
799
+ get children() {
800
+ var _el$84 = _$getNextElement(_tmpl$24),
801
+ _el$85 = _el$84.firstChild,
802
+ _el$87 = _el$85.firstChild,
803
+ [_el$88, _co$18] = _$getNextMarker(_el$87.nextSibling),
804
+ _el$86 = _el$88.nextSibling,
805
+ _el$89 = _el$85.nextSibling,
806
+ [_el$90, _co$19] = _$getNextMarker(_el$89.nextSibling);
807
+ _$insert(_el$85, () => messages().markRemoved, _el$88, _co$18);
808
+ _$insert(_el$84, () => props.children, _el$90, _co$19);
809
+ return _el$84;
810
+ }
811
+ });
812
+ }
813
+ _$delegateEvents(["click"]);
814
+ //# sourceMappingURL=ChatDecision.js.map