@k2b/ui 0.29.0 → 0.31.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 (243) hide show
  1. package/README.md +2 -2
  2. package/dist/base.css +2 -2
  3. package/dist/browser/actions/Dropdown.js +6 -3
  4. package/dist/browser/actions/Dropdown.js.map +1 -1
  5. package/dist/browser/actions/FilterChip.js +137 -7
  6. package/dist/browser/actions/FilterChip.js.map +1 -1
  7. package/dist/browser/actions/SegmentedControl.js +5 -9
  8. package/dist/browser/actions/SegmentedControl.js.map +1 -1
  9. package/dist/browser/actions/SpotlightSearch.js +6 -3
  10. package/dist/browser/actions/SpotlightSearch.js.map +1 -1
  11. package/dist/browser/actions/Tabs.js +5 -2
  12. package/dist/browser/actions/Tabs.js.map +1 -1
  13. package/dist/browser/actions/Toolbar.js +2 -0
  14. package/dist/browser/actions/Toolbar.js.map +1 -1
  15. package/dist/browser/actions/ViewTabs.js +294 -0
  16. package/dist/browser/actions/ViewTabs.js.map +1 -0
  17. package/dist/browser/actions/filter-messages.js +6 -2
  18. package/dist/browser/actions/filter-messages.js.map +1 -1
  19. package/dist/browser/actions/index.js +2 -1
  20. package/dist/browser/actions/index.js.map +1 -1
  21. package/dist/browser/chat/ChatComposer.js +1108 -604
  22. package/dist/browser/chat/ChatComposer.js.map +1 -1
  23. package/dist/browser/chat/ChatDecision.js +146 -84
  24. package/dist/browser/chat/ChatDecision.js.map +1 -1
  25. package/dist/browser/chat/ChatPrimitives.js +292 -159
  26. package/dist/browser/chat/ChatPrimitives.js.map +1 -1
  27. package/dist/browser/chat/chat-messages.js +8 -0
  28. package/dist/browser/chat/chat-messages.js.map +1 -1
  29. package/dist/browser/chat/command-search.js +26 -15
  30. package/dist/browser/chat/command-search.js.map +1 -1
  31. package/dist/browser/chat/index.js +4 -2
  32. package/dist/browser/chat/index.js.map +1 -1
  33. package/dist/browser/content/Calendar.js +143 -116
  34. package/dist/browser/content/Calendar.js.map +1 -1
  35. package/dist/browser/content/CalendarWeekView.js +291 -266
  36. package/dist/browser/content/CalendarWeekView.js.map +1 -1
  37. package/dist/browser/content/DataTable.js +224 -155
  38. package/dist/browser/content/DataTable.js.map +1 -1
  39. package/dist/browser/content/MapAttribution.js +27 -0
  40. package/dist/browser/content/MapAttribution.js.map +1 -0
  41. package/dist/browser/content/MapView.js +553 -0
  42. package/dist/browser/content/MapView.js.map +1 -0
  43. package/dist/browser/content/MapViewFrame.js +395 -0
  44. package/dist/browser/content/MapViewFrame.js.map +1 -0
  45. package/dist/browser/content/data-table-messages.js +4 -2
  46. package/dist/browser/content/data-table-messages.js.map +1 -1
  47. package/dist/browser/content/index.js +5 -0
  48. package/dist/browser/content/index.js.map +1 -1
  49. package/dist/browser/content/map-palette.js +39 -0
  50. package/dist/browser/content/map-palette.js.map +1 -0
  51. package/dist/browser/content/map-style.js +276 -0
  52. package/dist/browser/content/map-style.js.map +1 -0
  53. package/dist/browser/content/map-view-geometry.js +269 -0
  54. package/dist/browser/content/map-view-geometry.js.map +1 -0
  55. package/dist/browser/content/map-view-live.js +28 -0
  56. package/dist/browser/content/map-view-live.js.map +1 -0
  57. package/dist/browser/content/map-view-messages.js +53 -0
  58. package/dist/browser/content/map-view-messages.js.map +1 -0
  59. package/dist/browser/content/map-view-types.js +2 -0
  60. package/dist/browser/content/map-view-types.js.map +1 -0
  61. package/dist/browser/content/map-view-worker.js +10 -0
  62. package/dist/browser/feedback/MovedHint.js +197 -0
  63. package/dist/browser/feedback/MovedHint.js.map +1 -0
  64. package/dist/browser/feedback/dialog-core.js +85 -9
  65. package/dist/browser/feedback/dialog-core.js.map +1 -1
  66. package/dist/browser/feedback/index.js +1 -0
  67. package/dist/browser/feedback/index.js.map +1 -1
  68. package/dist/browser/feedback/prompts.js +6 -1
  69. package/dist/browser/feedback/prompts.js.map +1 -1
  70. package/dist/browser/inputs/DatePicker.js +337 -212
  71. package/dist/browser/inputs/DatePicker.js.map +1 -1
  72. package/dist/browser/inputs/date-picker.js +59 -5
  73. package/dist/browser/inputs/date-picker.js.map +1 -1
  74. package/dist/browser/intl/messages.js +12 -0
  75. package/dist/browser/intl/messages.js.map +1 -1
  76. package/dist/browser/intl/weekend.js +39 -0
  77. package/dist/browser/intl/weekend.js.map +1 -0
  78. package/dist/browser/layout/AppOverview.js +0 -1
  79. package/dist/browser/layout/AppOverview.js.map +1 -1
  80. package/dist/browser/layout/AppWorkspace.js +701 -476
  81. package/dist/browser/layout/AppWorkspace.js.map +1 -1
  82. package/dist/browser/layout/PageTitle.js +3 -2
  83. package/dist/browser/layout/PageTitle.js.map +1 -1
  84. package/dist/browser/layout/SettingsModal.js +2 -2
  85. package/dist/browser/layout/SettingsModal.js.map +1 -1
  86. package/dist/browser/layout/SidebarSwitcher.js +13 -12
  87. package/dist/browser/layout/SidebarSwitcher.js.map +1 -1
  88. package/dist/browser/layout/TabBar.js +1 -1
  89. package/dist/browser/layout/TabBar.js.map +1 -1
  90. package/dist/browser/layout/app-host-width.js +44 -0
  91. package/dist/browser/layout/app-host-width.js.map +1 -0
  92. package/dist/browser/layout/app-workspace-controller.js +331 -45
  93. package/dist/browser/layout/app-workspace-controller.js.map +1 -1
  94. package/dist/browser/layout/app-workspace-width.js +26 -0
  95. package/dist/browser/layout/app-workspace-width.js.map +1 -0
  96. package/dist/browser/layout/index.js +2 -1
  97. package/dist/browser/layout/index.js.map +1 -1
  98. package/dist/browser/surfaces/Placeholder.js +36 -13
  99. package/dist/browser/surfaces/Placeholder.js.map +1 -1
  100. package/dist/licenses/maplibre-gl.txt +116 -0
  101. package/dist/ssr/actions/Dropdown.js +5 -2
  102. package/dist/ssr/actions/Dropdown.js.map +1 -1
  103. package/dist/ssr/actions/FilterChip.js +59 -7
  104. package/dist/ssr/actions/FilterChip.js.map +1 -1
  105. package/dist/ssr/actions/SegmentedControl.js +1 -2
  106. package/dist/ssr/actions/SegmentedControl.js.map +1 -1
  107. package/dist/ssr/actions/SpotlightSearch.js +2 -2
  108. package/dist/ssr/actions/SpotlightSearch.js.map +1 -1
  109. package/dist/ssr/actions/Tabs.js +2 -2
  110. package/dist/ssr/actions/Tabs.js.map +1 -1
  111. package/dist/ssr/actions/Toolbar.js +2 -0
  112. package/dist/ssr/actions/Toolbar.js.map +1 -1
  113. package/dist/ssr/actions/ViewTabs.js +211 -0
  114. package/dist/ssr/actions/ViewTabs.js.map +1 -0
  115. package/dist/ssr/actions/filter-messages.js +6 -2
  116. package/dist/ssr/actions/filter-messages.js.map +1 -1
  117. package/dist/ssr/actions/index.js +2 -1
  118. package/dist/ssr/actions/index.js.map +1 -1
  119. package/dist/ssr/chat/ChatComposer.js +546 -131
  120. package/dist/ssr/chat/ChatComposer.js.map +1 -1
  121. package/dist/ssr/chat/ChatDecision.js +44 -19
  122. package/dist/ssr/chat/ChatDecision.js.map +1 -1
  123. package/dist/ssr/chat/ChatPrimitives.js +95 -24
  124. package/dist/ssr/chat/ChatPrimitives.js.map +1 -1
  125. package/dist/ssr/chat/chat-messages.js +8 -0
  126. package/dist/ssr/chat/chat-messages.js.map +1 -1
  127. package/dist/ssr/chat/command-search.js +26 -15
  128. package/dist/ssr/chat/command-search.js.map +1 -1
  129. package/dist/ssr/chat/index.js +4 -2
  130. package/dist/ssr/chat/index.js.map +1 -1
  131. package/dist/ssr/content/Calendar.js +109 -100
  132. package/dist/ssr/content/Calendar.js.map +1 -1
  133. package/dist/ssr/content/CalendarWeekView.js +42 -28
  134. package/dist/ssr/content/CalendarWeekView.js.map +1 -1
  135. package/dist/ssr/content/DataTable.js +78 -31
  136. package/dist/ssr/content/DataTable.js.map +1 -1
  137. package/dist/ssr/content/MapAttribution.js +19 -0
  138. package/dist/ssr/content/MapAttribution.js.map +1 -0
  139. package/dist/ssr/content/MapView.js +474 -0
  140. package/dist/ssr/content/MapView.js.map +1 -0
  141. package/dist/ssr/content/MapViewFrame.js +193 -0
  142. package/dist/ssr/content/MapViewFrame.js.map +1 -0
  143. package/dist/ssr/content/data-table-messages.js +4 -2
  144. package/dist/ssr/content/data-table-messages.js.map +1 -1
  145. package/dist/ssr/content/index.js +5 -0
  146. package/dist/ssr/content/index.js.map +1 -1
  147. package/dist/ssr/content/map-palette.js +39 -0
  148. package/dist/ssr/content/map-palette.js.map +1 -0
  149. package/dist/ssr/content/map-style.js +276 -0
  150. package/dist/ssr/content/map-style.js.map +1 -0
  151. package/dist/ssr/content/map-view-geometry.js +269 -0
  152. package/dist/ssr/content/map-view-geometry.js.map +1 -0
  153. package/dist/ssr/content/map-view-live.js +1 -0
  154. package/dist/ssr/content/map-view-messages.js +53 -0
  155. package/dist/ssr/content/map-view-messages.js.map +1 -0
  156. package/dist/ssr/content/map-view-types.js +2 -0
  157. package/dist/ssr/content/map-view-types.js.map +1 -0
  158. package/dist/ssr/feedback/MovedHint.js +166 -0
  159. package/dist/ssr/feedback/MovedHint.js.map +1 -0
  160. package/dist/ssr/feedback/dialog-core.js +85 -9
  161. package/dist/ssr/feedback/dialog-core.js.map +1 -1
  162. package/dist/ssr/feedback/index.js +1 -0
  163. package/dist/ssr/feedback/index.js.map +1 -1
  164. package/dist/ssr/feedback/prompts.js +6 -1
  165. package/dist/ssr/feedback/prompts.js.map +1 -1
  166. package/dist/ssr/inputs/DatePicker.js +138 -69
  167. package/dist/ssr/inputs/DatePicker.js.map +1 -1
  168. package/dist/ssr/inputs/date-picker.js +59 -5
  169. package/dist/ssr/inputs/date-picker.js.map +1 -1
  170. package/dist/ssr/intl/messages.js +12 -0
  171. package/dist/ssr/intl/messages.js.map +1 -1
  172. package/dist/ssr/intl/weekend.js +39 -0
  173. package/dist/ssr/intl/weekend.js.map +1 -0
  174. package/dist/ssr/layout/AppOverview.js +0 -1
  175. package/dist/ssr/layout/AppOverview.js.map +1 -1
  176. package/dist/ssr/layout/AppWorkspace.js +216 -44
  177. package/dist/ssr/layout/AppWorkspace.js.map +1 -1
  178. package/dist/ssr/layout/PageTitle.js +3 -2
  179. package/dist/ssr/layout/PageTitle.js.map +1 -1
  180. package/dist/ssr/layout/SettingsModal.js +2 -2
  181. package/dist/ssr/layout/SettingsModal.js.map +1 -1
  182. package/dist/ssr/layout/SidebarSwitcher.js +13 -12
  183. package/dist/ssr/layout/SidebarSwitcher.js.map +1 -1
  184. package/dist/ssr/layout/TabBar.js +1 -1
  185. package/dist/ssr/layout/TabBar.js.map +1 -1
  186. package/dist/ssr/layout/app-host-width.js +44 -0
  187. package/dist/ssr/layout/app-host-width.js.map +1 -0
  188. package/dist/ssr/layout/app-workspace-controller.js +331 -45
  189. package/dist/ssr/layout/app-workspace-controller.js.map +1 -1
  190. package/dist/ssr/layout/app-workspace-width.js +26 -0
  191. package/dist/ssr/layout/app-workspace-width.js.map +1 -0
  192. package/dist/ssr/layout/index.js +2 -1
  193. package/dist/ssr/layout/index.js.map +1 -1
  194. package/dist/ssr/surfaces/Placeholder.js +24 -7
  195. package/dist/ssr/surfaces/Placeholder.js.map +1 -1
  196. package/dist/styles.css +1 -1
  197. package/dist/types/actions/Dropdown.d.ts +4 -0
  198. package/dist/types/actions/FilterChip.d.ts +22 -0
  199. package/dist/types/actions/ViewTabs.d.ts +30 -0
  200. package/dist/types/actions/filter-messages.d.ts +2 -0
  201. package/dist/types/actions/index.d.ts +4 -2
  202. package/dist/types/chat/ChatComposer.d.ts +52 -0
  203. package/dist/types/chat/ChatDecision.d.ts +18 -2
  204. package/dist/types/chat/ChatPrimitives.d.ts +10 -0
  205. package/dist/types/chat/chat-messages.d.ts +4 -0
  206. package/dist/types/chat/command-search.d.ts +2 -0
  207. package/dist/types/chat/index.d.ts +9 -8
  208. package/dist/types/content/DataTable.d.ts +3 -0
  209. package/dist/types/content/MapAttribution.d.ts +6 -0
  210. package/dist/types/content/MapView.d.ts +5 -0
  211. package/dist/types/content/MapViewFrame.d.ts +31 -0
  212. package/dist/types/content/data-table-messages.d.ts +1 -0
  213. package/dist/types/content/index.d.ts +6 -0
  214. package/dist/types/content/map-palette.d.ts +58 -0
  215. package/dist/types/content/map-style.d.ts +29 -0
  216. package/dist/types/content/map-view-geometry.d.ts +55 -0
  217. package/dist/types/content/map-view-live.d.ts +2 -0
  218. package/dist/types/content/map-view-messages.d.ts +21 -0
  219. package/dist/types/content/map-view-types.d.ts +61 -0
  220. package/dist/types/feedback/MovedHint.d.ts +25 -0
  221. package/dist/types/feedback/dialog-core.d.ts +6 -2
  222. package/dist/types/feedback/index.d.ts +2 -0
  223. package/dist/types/feedback/prompts.d.ts +2 -0
  224. package/dist/types/inputs/DatePicker.d.ts +7 -0
  225. package/dist/types/inputs/date-picker.d.ts +25 -1
  226. package/dist/types/intl/messages.d.ts +6 -0
  227. package/dist/types/intl/weekend.d.ts +12 -0
  228. package/dist/types/layout/AppWorkspace.d.ts +48 -8
  229. package/dist/types/layout/app-host-width.d.ts +6 -0
  230. package/dist/types/layout/app-workspace-width.d.ts +13 -0
  231. package/dist/types/layout/index.d.ts +3 -2
  232. package/dist/types/surfaces/Placeholder.d.ts +2 -1
  233. package/map-glyphs/IBM Plex Sans Medium/0-255.pbf +0 -0
  234. package/map-glyphs/IBM Plex Sans Medium/1024-1279.pbf +0 -0
  235. package/map-glyphs/IBM Plex Sans Medium/256-511.pbf +0 -0
  236. package/map-glyphs/IBM Plex Sans Medium/512-767.pbf +0 -0
  237. package/map-glyphs/IBM Plex Sans Medium/768-1023.pbf +0 -0
  238. package/map-glyphs/IBM Plex Sans Medium/7680-7935.pbf +0 -0
  239. package/map-glyphs/IBM Plex Sans Medium/8192-8447.pbf +0 -0
  240. package/map-glyphs/IBM Plex Sans Medium/8448-8703.pbf +0 -0
  241. package/map-glyphs/IBM Plex Sans Medium/8704-8959.pbf +0 -0
  242. package/map-glyphs/OFL.txt +93 -0
  243. package/package.json +11 -6
@@ -23,15 +23,16 @@ var _tmpl$ = ["<section class=\"k2b-chat-decision__card\"", "><p", " class=\"k2b
23
23
  _tmpl$14 = ["<p class=\"k2b-chat-preview__title-line\"><span class=\"k2b-chat-preview__title\">", "</span>", "</p>"],
24
24
  _tmpl$15 = ["<span class=\"k2b-chat-preview__meta\">", "</span>"],
25
25
  _tmpl$16 = ["<p class=\"k2b-chat-preview__sentence\">", "</p>"],
26
- _tmpl$17 = ["<p class=\"k2b-chat-preview__excerpt\">", "</p>"],
27
- _tmpl$18 = ["<a class=\"k2b-chat-preview__more\"", ">", "</a>"],
28
- _tmpl$19 = ["<ul class=\"k2b-chat-preview__lines\"", ">", "</ul>"],
29
- _tmpl$20 = ["<i class=\"", "\" style=\"", "\" aria-hidden=\"true\"></i>"],
30
- _tmpl$21 = ["<span class=\"k2b-chat-line__text\"><span class=\"k2b-chat-mark\"", ">", "", "</span>", "</span>"],
31
- _tmpl$22 = ["<span class=\"k2b-sr-only\">", " </span>"],
32
- _tmpl$23 = ["<p class=\"k2b-chat-preview__people\"><span class=\"k2b-chat-preview__faces\" aria-hidden=\"true\">", "</span><span>", "</span></p>"],
33
- _tmpl$24 = ["<del class=\"k2b-chat-mark\" data-change=\"removed\"><span class=\"k2b-sr-only\">", " </span>", "</del>"],
34
- _tmpl$25 = ["<mark class=\"k2b-chat-mark\" data-change=\"added\"><span class=\"k2b-sr-only\">", " </span>", "</mark>"];
26
+ _tmpl$17 = ["<p class=\"k2b-chat-preview__excerpt\"", ">", "</p>"],
27
+ _tmpl$18 = ["<button type=\"button\" class=\"k2b-chat-preview__more\"", " aria-expanded=\"false\">", "</button>"],
28
+ _tmpl$19 = ["<a class=\"k2b-chat-preview__more\"", ">", "</a>"],
29
+ _tmpl$20 = ["<ul class=\"k2b-chat-preview__lines\"", ">", "</ul>"],
30
+ _tmpl$21 = ["<i class=\"", "\" style=\"", "\" aria-hidden=\"true\"></i>"],
31
+ _tmpl$22 = ["<span class=\"k2b-chat-line__text\"><span class=\"k2b-chat-mark\"", ">", "", "</span>", "</span>"],
32
+ _tmpl$23 = ["<span class=\"k2b-sr-only\">", " </span>"],
33
+ _tmpl$24 = ["<p class=\"k2b-chat-preview__people\"><span class=\"k2b-chat-preview__faces\" aria-hidden=\"true\">", "</span><span>", "</span></p>"],
34
+ _tmpl$25 = ["<del class=\"k2b-chat-mark\" data-change=\"removed\"><span class=\"k2b-sr-only\">", " </span>", "</del>"],
35
+ _tmpl$26 = ["<mark class=\"k2b-chat-mark\" data-change=\"added\"><span class=\"k2b-sr-only\">", " </span>", "</mark>"];
35
36
  import { createContext, createEffect, createMemo, createSignal, createUniqueId, For, on, onCleanup, onMount, Show, untrack, useContext } from "solid-js";
36
37
  import { Button } from "../actions/Button";
37
38
  import { Avatar } from "../surfaces/Avatar";
@@ -60,6 +61,17 @@ export function ChatDecision(props) {
60
61
  const [answeredHere, setAnsweredHere] = createSignal(false);
61
62
  const [arrive, setArrive] = createSignal(false);
62
63
  let reopenedHere = false;
64
+ // A press on the sentence focuses it too; only a focus moved there from elsewhere, such as a jump, lights it up.
65
+ // The browser also focuses the sentence again when its window comes back; that is no arrival either.
66
+ let sentencePressed = false;
67
+ let sentenceHeldAcrossWindow = false;
68
+ const windowLeft = () => {
69
+ if (sentence && document.activeElement === sentence) sentenceHeldAcrossWindow = true;
70
+ };
71
+ onMount(() => {
72
+ window.addEventListener("blur", windowLeft);
73
+ onCleanup(() => window.removeEventListener("blur", windowLeft));
74
+ });
63
75
  // A press counts only while its action runs: a reopen from elsewhere later must not take the focus.
64
76
  const scope = {
65
77
  answered: answeredHere,
@@ -373,20 +385,32 @@ function ChatPreviewTitle(props) {
373
385
  function ChatPreviewSentence(props) {
374
386
  return _$ssr(_tmpl$16, _$escape(props.children));
375
387
  }
376
-
377
388
  /** The first lines of a longer text. It keeps its line breaks, shows about three lines, and fades out. */
378
389
  function ChatPreviewExcerpt(props) {
379
- return _$ssr(_tmpl$17, _$escape(props.children));
390
+ return _$ssr(_tmpl$17, _$ssrAttribute("id", _$escape(props.id, true), false) + _$ssrAttribute("data-expanded", props.expanded ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("tabindex", props.expanded ? -1 : _$escape(undefined, true), false), _$escape(props.children));
391
+ }
392
+ /**
393
+ * Shows the rest of an excerpt in place, for a text with no page of its own to open. It looks like `ReadMore`; the
394
+ * caller removes it once the text is shown, and the focus moves to the text, so reading goes on where it was.
395
+ */
396
+ function ChatPreviewShowAll(props) {
397
+ const show = () => {
398
+ props.onShow();
399
+ queueMicrotask(() => document.getElementById(props.controls)?.focus({
400
+ preventScroll: true
401
+ }));
402
+ };
403
+ return _$ssr(_tmpl$18, _$ssrAttribute("aria-controls", _$escape(props.controls, true), false), _$escape(props.children));
380
404
  }
381
405
  /** Opens the whole thing at exactly the version the question shows. */
382
406
  function ChatPreviewReadMore(props) {
383
- return _$ssr(_tmpl$18, _$ssrAttribute("href", _$escape(props.href, true), false) + _$ssrAttribute("title", _$escape(props.title, true), false), _$escape(props.children));
407
+ return _$ssr(_tmpl$19, _$ssrAttribute("href", _$escape(props.href, true), false) + _$ssrAttribute("title", _$escape(props.title, true), false), _$escape(props.children));
384
408
  }
385
409
  const InList = createContext(false);
386
410
 
387
411
  /** A list of lines with a name, such as "What the routine may do". */
388
412
  function ChatPreviewLines(props) {
389
- return _$ssr(_tmpl$19, _$ssrAttribute("aria-label", _$escape(props.label, true), false), _$escape(_$createComponent(InList.Provider, {
413
+ return _$ssr(_tmpl$20, _$ssrAttribute("aria-label", _$escape(props.label, true), false), _$escape(_$createComponent(InList.Provider, {
390
414
  value: true,
391
415
  get children() {
392
416
  return props.children;
@@ -397,13 +421,13 @@ function ChatPreviewLines(props) {
397
421
  function ChatPreviewLine(props) {
398
422
  const inList = useContext(InList);
399
423
  const messages = useChatMessages();
400
- const content = () => [_$ssr(_tmpl$20, `k2b-chat-line__icon ${_$escape(props.icon, true)}`, _$ssrStyle(props.accent ? {
424
+ const content = () => [_$ssr(_tmpl$21, `k2b-chat-line__icon ${_$escape(props.icon, true)}`, _$ssrStyle(props.accent ? {
401
425
  color: props.accent
402
- } : undefined)), _$ssr(_tmpl$21, _$ssrAttribute("data-change", _$escape(props.mark, true), false), _$escape(_$createComponent(Show, {
426
+ } : undefined)), _$ssr(_tmpl$22, _$ssrAttribute("data-change", _$escape(props.mark, true), false), _$escape(_$createComponent(Show, {
403
427
  get when() {
404
428
  return props.mark;
405
429
  },
406
- children: mark => _$ssr(_tmpl$22, mark() === "added" ? _$escape(messages().markAdded) : _$escape(messages().markRemoved))
430
+ children: mark => _$ssr(_tmpl$23, mark() === "added" ? _$escape(messages().markAdded) : _$escape(messages().markRemoved))
407
431
  })), _$escape(props.children), _$escape(_$createComponent(Show, {
408
432
  get when() {
409
433
  return props.meta;
@@ -417,7 +441,7 @@ function ChatPreviewLine(props) {
417
441
  return inList ? _$ssrElement("li", attributes(), _$escape(content()), false) : _$ssrElement("p", attributes(), _$escape(content()), false);
418
442
  }
419
443
  function ChatPreviewPeople(props) {
420
- return _$ssr(_tmpl$23, _$escape(_$createComponent(For, {
444
+ return _$ssr(_tmpl$24, _$escape(_$createComponent(For, {
421
445
  get each() {
422
446
  return props.people;
423
447
  },
@@ -438,6 +462,7 @@ export const ChatPreview = Object.assign(ChatPreviewRoot, {
438
462
  Sentence: ChatPreviewSentence,
439
463
  Excerpt: ChatPreviewExcerpt,
440
464
  ReadMore: ChatPreviewReadMore,
465
+ ShowAll: ChatPreviewShowAll,
441
466
  Lines: ChatPreviewLines,
442
467
  Line: ChatPreviewLine,
443
468
  People: ChatPreviewPeople
@@ -455,10 +480,10 @@ export function ChatMark(props) {
455
480
  return props.change === "removed";
456
481
  },
457
482
  get fallback() {
458
- return _$ssr(_tmpl$25, _$escape(messages().markAdded), _$escape(props.children));
483
+ return _$ssr(_tmpl$26, _$escape(messages().markAdded), _$escape(props.children));
459
484
  },
460
485
  get children() {
461
- return _$ssr(_tmpl$24, _$escape(messages().markRemoved), _$escape(props.children));
486
+ return _$ssr(_tmpl$25, _$escape(messages().markRemoved), _$escape(props.children));
462
487
  }
463
488
  });
464
489
  }
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["chat/ChatDecision.tsx"],"sourcesContent":["import {\n createContext,\n createEffect,\n createMemo,\n createSignal,\n createUniqueId,\n For,\n type JSX,\n on,\n onCleanup,\n onMount,\n Show,\n untrack,\n useContext,\n} from \"solid-js\";\nimport { Button } from \"../actions/Button\";\nimport { Avatar } from \"../surfaces/Avatar\";\nimport { useChatMessages } from \"./chat-messages\";\nimport type {\n ChatDecisionAnswer,\n ChatDecisionReason,\n ChatDecisionState,\n ChatOutcomeLine,\n ChatOutcomeTone,\n ChatPreviewHeaderRow,\n ChatPreviewPerson,\n} from \"./types\";\n\n// ---------------------------------------------------------------------------\n// Decision\n// ---------------------------------------------------------------------------\n\nexport type ChatDecisionProps = {\n /** `open` shows the question; every other state shows `outcome` in its place. */\n state: ChatDecisionState;\n /** The question as one sentence, usually with `ReferenceChip`s. */\n sentence: JSX.Element;\n /** Why this question is asked, in the platform's words. */\n reason: ChatDecisionReason;\n /** The thing itself, usually `Chat.Preview`. */\n preview?: JSX.Element;\n /** The main answer, named by verb and target (\"Send to Lea\"). `danger` for deletions, `primary` for requests. */\n confirm: ChatDecisionAnswer & { variant?: \"ai\" | \"primary\" | \"danger\" };\n /** The other answer (\"Don't send\"). */\n decline: ChatDecisionAnswer;\n /** An optional quiet third answer after the buttons, such as \"Yes, and don't ask again in this chat\". */\n remember?: ChatDecisionAnswer;\n /** Turns `confirm` and `remember` off; this reason replaces `reason` in the same place. */\n unavailable?: ChatDecisionReason;\n /** The result line shown in every state but `open`, usually `Chat.Outcome`. */\n outcome?: JSX.Element;\n /** Receives a rejected promise from an answer's `onSelect`. */\n onAnswerError?: (error: unknown) => void;\n anchorId?: string | number;\n class?: string;\n};\n\n/** What an outcome inside a question needs from it: whether it was just answered here, and a link press inside it. */\nconst DecisionScope = createContext<{ answered: () => boolean; pressed: () => void; released: () => void }>();\n\nconst reasonIcon = (reason: ChatDecisionReason) => reason.icon ?? \"ti ti-info-circle\";\n\n/**\n * A question the person answers in the conversation: one sentence, why it is asked, the thing itself, and two answers.\n * An answer collapses it at once to its outcome line, which takes the focus and is announced.\n */\nexport function ChatDecision(props: ChatDecisionProps): JSX.Element {\n const id = createUniqueId();\n const sentenceId = `k2b-chat-decision-${id}-sentence`;\n const reasonId = `k2b-chat-decision-${id}-reason`;\n let root: HTMLDivElement | undefined;\n let sentence: HTMLParagraphElement | undefined;\n // An answer given here moves the focus to the outcome; a click in the outcome that reopens the question moves it\n // back to the sentence. A state change from elsewhere moves no focus.\n const [answeredHere, setAnsweredHere] = createSignal(false);\n const [arrive, setArrive] = createSignal(false);\n let reopenedHere = false;\n // A press counts only while its action runs: a reopen from elsewhere later must not take the focus.\n const scope = {\n answered: answeredHere,\n pressed: () => {\n reopenedHere = true;\n },\n released: () => {\n reopenedHere = false;\n },\n };\n\n // Read once: an object literal from the host builds its JSX again on every read.\n const reason = createMemo(() => props.unavailable ?? props.reason);\n const open = () => props.state === \"open\";\n\n const answer = (choice: ChatDecisionAnswer, enabled: boolean) => {\n if (!enabled || !open() || answeredHere()) return;\n setAnsweredHere(true);\n try {\n const result = choice.onSelect();\n if (result instanceof Promise) result.catch((error: unknown) => props.onAnswerError?.(error));\n } catch (error) {\n props.onAnswerError?.(error);\n }\n // A host that keeps the question open (it could not take the answer) gets working buttons back.\n queueMicrotask(() => {\n if (open()) setAnsweredHere(false);\n });\n };\n\n createEffect(\n on(\n () => props.state,\n (state, previous) => {\n if (state !== \"open\" && previous === \"open\" && answeredHere()) {\n root?.querySelector<HTMLElement>(\".k2b-chat-outcome\")?.focus({ preventScroll: true });\n }\n if (state === \"open\" && previous !== undefined && previous !== \"open\") {\n // A host that could not take an answer given here returns the question from `sending`; the outcome that held\n // the focus is gone, so the focus goes back to the sentence instead of the page.\n const active = document.activeElement;\n const failedHere = answeredHere() && previous === \"sending\" && (!active || active === document.body);\n setAnsweredHere(false);\n if (reopenedHere || failedHere) {\n sentence?.focus({ preventScroll: true });\n setArrive(true);\n }\n // Handled. Until then the marker holds through states in between, such as `sending` while a reopen loads.\n reopenedHere = false;\n }\n },\n ),\n );\n\n return (\n <div\n ref={root}\n class={`k2b-chat-decision ${props.class ?? \"\"}`}\n data-state={props.state}\n data-chat-anchor={props.anchorId !== undefined ? String(props.anchorId) : undefined}\n >\n <Show when={open()} fallback={<DecisionScope.Provider value={scope}>{props.outcome}</DecisionScope.Provider>}>\n <section class=\"k2b-chat-decision__card\" aria-labelledby={sentenceId} aria-describedby={reasonId}>\n <p\n ref={sentence}\n id={sentenceId}\n class=\"k2b-chat-decision__sentence\"\n tabindex=\"-1\"\n data-arrive={arrive() ? \"true\" : undefined}\n onAnimationEnd={() => setArrive(false)}\n >\n {props.sentence}\n </p>\n <p id={reasonId} class=\"k2b-chat-line k2b-chat-decision__reason\" data-tone={reason().tone ?? \"neutral\"}>\n <i class={`k2b-chat-line__icon ${reasonIcon(reason())}`} aria-hidden=\"true\" />\n <span class=\"k2b-chat-line__text\">{reason().text}</span>\n </p>\n {props.preview}\n <div class=\"k2b-chat-decision__answers\">\n <Button\n class=\"k2b-chat-decision__answer\"\n wrap\n variant={props.confirm.variant ?? \"ai\"}\n disabled={Boolean(props.unavailable)}\n onClick={() => answer(props.confirm, !props.unavailable)}\n >\n <Show when={props.confirm.icon}>{(icon) => <i class={icon()} aria-hidden=\"true\" />}</Show>\n {props.confirm.label}\n </Button>\n <Button class=\"k2b-chat-decision__answer\" wrap variant=\"subtle\" onClick={() => answer(props.decline, true)}>\n <Show when={props.decline.icon}>{(icon) => <i class={icon()} aria-hidden=\"true\" />}</Show>\n {props.decline.label}\n </Button>\n <Show when={props.remember}>\n {(remember) => (\n <Button\n class=\"k2b-chat-decision__remember\"\n wrap\n variant=\"text\"\n disabled={Boolean(props.unavailable)}\n onClick={() => answer(remember(), !props.unavailable)}\n >\n {remember().label}\n </Button>\n )}\n </Show>\n </div>\n </section>\n </Show>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Outcome\n// ---------------------------------------------------------------------------\n\nexport type ChatOutcomeProps = {\n /**\n * Every line one flow can show, such as running and done. All of them share one cell, so the line is as high as\n * the longest and switching between them moves nothing.\n */\n lines: Readonly<Record<string, ChatOutcomeLine>>;\n /** The key of the visible line. */\n current: string;\n /** Receives an error thrown or rejected by a line's `action`. */\n onActionError?: (error: unknown) => void;\n anchorId?: string | number;\n class?: string;\n};\n\nconst OUTCOME_ICONS: Record<ChatOutcomeTone, string> = {\n running: \"ti ti-loader-2 k2b-spin\",\n done: \"ti ti-check\",\n off: \"ti ti-circle-off\",\n waiting: \"ti ti-clock\",\n warning: \"ti ti-alert-triangle\",\n error: \"ti ti-alert-circle\",\n};\n\n/** The visible words of a line, without what screen readers do not hear. */\nconst spokenText = (element: Element): string => {\n const copy = element.cloneNode(true) as Element;\n // Buttons under the line are controls, not part of what happened.\n for (const hidden of copy.querySelectorAll('[aria-hidden=\"true\"], .k2b-chat-outcome__actions')) hidden.remove();\n // The time and the link stand apart by margin only; spoken, they need a space.\n for (const part of copy.querySelectorAll(\".k2b-chat-outcome__time, .k2b-chat-outcome__link\")) part.before(\" \");\n return (copy.textContent ?? \"\").replace(/\\s+/g, \" \").trim();\n};\n\n/**\n * One line that says what happened: running, done, off, waiting, warning, or error. Changes are announced through a\n * polite live region; the line itself can take the focus.\n */\nexport function ChatOutcome(props: ChatOutcomeProps): JSX.Element {\n const scope = useContext(DecisionScope);\n // Only a line that replaces a question just answered here fades in; history renders final.\n const entering = untrack(() => scope?.answered() ?? false);\n const [live, setLive] = createSignal(\"\");\n let root: HTMLDivElement | undefined;\n let cell: HTMLDivElement | undefined;\n let pending = false;\n let timer: ReturnType<typeof setTimeout> | undefined;\n // Read once: an object literal from the host builds its JSX again on every read.\n const lines = createMemo(() => props.lines);\n const line = () => lines()[props.current];\n const tone = () => line()?.tone ?? \"off\";\n const keys = () => {\n const all = Object.keys(lines());\n return all.includes(props.current) ? all : [props.current, ...all];\n };\n\n // Empty the region first, so the same words spoken again are a change too.\n const announce = () => {\n setLive(\"\");\n if (timer) clearTimeout(timer);\n timer = setTimeout(() => {\n const current = cell?.querySelector('[data-current=\"true\"]');\n setLive(current ? spokenText(current) : \"\");\n }, 40);\n };\n\n onMount(() => {\n if (untrack(() => scope?.answered())) announce();\n });\n createEffect(\n on(\n () => props.current,\n () => {\n // A link pressed in a line that is now hidden would leave the focus on an invisible button, which the browser\n // then drops to the page. The line itself keeps it instead.\n const active = document.activeElement;\n const hidden = active && cell?.contains(active) && !active.closest('[data-current=\"true\"]');\n if (hidden || (pending && active === document.body)) root?.focus({ preventScroll: true });\n announce();\n },\n { defer: true },\n ),\n );\n onCleanup(() => {\n if (timer) clearTimeout(timer);\n });\n\n return (\n <div\n ref={root}\n class={`k2b-chat-outcome ${props.class ?? \"\"}`}\n data-tone={tone()}\n data-chat-anchor={props.anchorId !== undefined ? String(props.anchorId) : undefined}\n data-enter={entering ? \"true\" : undefined}\n tabindex=\"-1\"\n >\n <span class=\"k2b-chat-outcome__icon\" aria-hidden=\"true\">\n <i class={line()?.icon ?? OUTCOME_ICONS[tone()]} />\n </span>\n {/* Busy is set on the words only: a live region inside a busy subtree would be held back. */}\n <div ref={cell} class=\"k2b-chat-outcome__cell\" aria-busy={tone() === \"running\" ? \"true\" : undefined}>\n <For each={keys()}>\n {(key) => {\n const entry = () => lines()[key];\n const current = () => key === props.current;\n return (\n <Show when={entry()}>\n {(item) => (\n <div\n class=\"k2b-chat-outcome__text\"\n data-current={current() ? \"true\" : undefined}\n aria-hidden={current() ? undefined : \"true\"}\n >\n {item().text}\n <Show when={item().detail}>\n {(detail) => (\n <>\n {\" \"}\n <span class=\"k2b-chat-outcome__detail\">{detail()}</span>\n </>\n )}\n </Show>\n <Show when={item().time}>{(time) => <span class=\"k2b-chat-outcome__time\">{time()}</span>}</Show>\n <Show when={item().action}>\n {(action) => (\n <Button\n class=\"k2b-chat-outcome__link\"\n wrap\n variant=\"text\"\n tabIndex={current() ? undefined : -1}\n onClick={() => {\n // A second press while the first is still running would repeat its work.\n if (pending) return;\n scope?.pressed();\n try {\n const result = action().onSelect();\n if (result instanceof Promise) {\n pending = true;\n result\n .catch((error: unknown) => props.onActionError?.(error))\n .finally(() => {\n pending = false;\n scope?.released();\n });\n return;\n }\n } catch (error) {\n props.onActionError?.(error);\n }\n scope?.released();\n }}\n >\n {action().label}\n </Button>\n )}\n </Show>\n {/* Every line keeps its buttons, hidden with its text, so the cell also reserves their row. */}\n <Show when={item().actions}>{(actions) => <div class=\"k2b-chat-outcome__actions\">{actions()}</div>}</Show>\n </div>\n )}\n </Show>\n );\n }}\n </For>\n </div>\n <span class=\"k2b-sr-only\" role=\"status\" aria-live=\"polite\">\n {live()}\n </span>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Preview\n// ---------------------------------------------------------------------------\n\nexport type ChatPreviewProps = { children: JSX.Element; class?: string };\n\n/** The thing a question is about, as calm text on the sentence's edge: no surface, no column. */\nfunction ChatPreviewRoot(props: ChatPreviewProps): JSX.Element {\n return <div class={`k2b-chat-preview ${props.class ?? \"\"}`}>{props.children}</div>;\n}\n\nexport type ChatPreviewHeaderProps = {\n /** One row per field, such as From, To, Cc, and Bcc; the label stands right before its value. */\n rows: readonly ChatPreviewHeaderRow[];\n /** A last line, such as when the message goes out. */\n note?: JSX.Element;\n};\n\nconst PreviewPeople = (props: { people: readonly ChatPreviewPerson[] }) => (\n <For each={props.people}>\n {(person, index) => (\n <>\n {index() > 0 ? \", \" : \"\"}\n <span class=\"k2b-chat-preview__person\">\n <Show when={person.name}>{(name) => <b>{name()}</b>}</Show>\n <Show when={person.address}>\n {(address) => (\n <span class=\"k2b-chat-preview__address\" data-alone={person.name ? undefined : \"true\"}>\n {address()}\n </span>\n )}\n </Show>\n </span>\n </>\n )}\n </For>\n);\n\nfunction ChatPreviewHeader(props: ChatPreviewHeaderProps): JSX.Element {\n return (\n <div class=\"k2b-chat-preview__header\">\n <dl>\n <For each={props.rows}>\n {(row) => (\n <div data-emphasis={row.emphasis ? \"true\" : undefined}>\n <dt>{row.label}</dt>\n <dd>\n <Show when={row.people}>{(people) => <PreviewPeople people={people()} />}</Show>\n {row.value}\n </dd>\n </div>\n )}\n </For>\n </dl>\n <Show when={props.note}>{(note) => <p>{note()}</p>}</Show>\n </div>\n );\n}\n\nexport type ChatPreviewTitleProps = { children: JSX.Element; meta?: JSX.Element };\n\n/** The thing's name in the text's own face, with optional quiet facts after it. */\nfunction ChatPreviewTitle(props: ChatPreviewTitleProps): JSX.Element {\n return (\n <p class=\"k2b-chat-preview__title-line\">\n <span class=\"k2b-chat-preview__title\">{props.children}</span>\n <Show when={props.meta}>\n {(meta) => (\n <>\n {\" \"}\n <span class=\"k2b-chat-preview__meta\">{meta()}</span>\n </>\n )}\n </Show>\n </p>\n );\n}\n\n/** A rule or instruction as one sentence, such as what a routine does; chips and marks may stand inside. */\nfunction ChatPreviewSentence(props: { children: JSX.Element }): JSX.Element {\n return <p class=\"k2b-chat-preview__sentence\">{props.children}</p>;\n}\n\n/** The first lines of a longer text. It keeps its line breaks, shows about three lines, and fades out. */\nfunction ChatPreviewExcerpt(props: { children: JSX.Element }): JSX.Element {\n return <p class=\"k2b-chat-preview__excerpt\">{props.children}</p>;\n}\n\nexport type ChatPreviewReadMoreProps = {\n href: string;\n children: JSX.Element;\n /** Tooltip, such as \"Opens exactly this version of the draft\". */\n title?: string;\n};\n\n/** Opens the whole thing at exactly the version the question shows. */\nfunction ChatPreviewReadMore(props: ChatPreviewReadMoreProps): JSX.Element {\n return (\n <a class=\"k2b-chat-preview__more\" href={props.href} title={props.title}>\n {props.children}\n </a>\n );\n}\n\nconst InList = createContext(false);\n\n/** A list of lines with a name, such as \"What the routine may do\". */\nfunction ChatPreviewLines(props: { label?: string; children: JSX.Element }): JSX.Element {\n return (\n <ul class=\"k2b-chat-preview__lines\" aria-label={props.label}>\n <InList.Provider value={true}>{props.children}</InList.Provider>\n </ul>\n );\n}\n\nexport type ChatPreviewLineProps = {\n /** Icon class; the text after it starts 1.5rem from the edge. */\n icon: string;\n /** Icon colour, such as the PDF colour of an attachment. */\n accent?: string;\n /** `muted` for limits and notes, `warning` for an application's own warning. */\n tone?: \"default\" | \"muted\" | \"warning\";\n /** Marks the whole line as new or removed. */\n mark?: \"added\" | \"removed\";\n /** Quiet facts after the text, such as a file size. */\n meta?: JSX.Element;\n children: JSX.Element;\n};\n\n/** One line led by an icon: a consequence, a right, an attachment, or a warning. */\nfunction ChatPreviewLine(props: ChatPreviewLineProps): JSX.Element {\n const inList = useContext(InList);\n const messages = useChatMessages();\n const content = () => (\n <>\n <i class={`k2b-chat-line__icon ${props.icon}`} style={props.accent ? { color: props.accent } : undefined} aria-hidden=\"true\" />\n <span class=\"k2b-chat-line__text\">\n {/* One stable wrapper, so marking a line later never moves its mounted children. */}\n <span class=\"k2b-chat-mark\" data-change={props.mark}>\n <Show when={props.mark}>\n {(mark) => <span class=\"k2b-sr-only\">{mark() === \"added\" ? messages().markAdded : messages().markRemoved} </span>}\n </Show>\n {props.children}\n </span>\n <Show when={props.meta}>\n {(meta) => (\n <>\n {\" \"}\n <span class=\"k2b-chat-preview__meta\">{meta()}</span>\n </>\n )}\n </Show>\n </span>\n </>\n );\n const attributes = () => ({\n class: \"k2b-chat-line k2b-chat-preview__line\",\n \"data-tone\": props.tone && props.tone !== \"default\" ? props.tone : undefined,\n });\n return inList ? <li {...attributes()}>{content()}</li> : <p {...attributes()}>{content()}</p>;\n}\n\nexport type ChatPreviewPeopleProps = {\n /** The first few people; their avatars overlap at the start of the line. */\n people: readonly { name: string; src?: string | null }[];\n /** The names as text, such as \"Lea Berg, Tom Weber and 3 others\". */\n children: JSX.Element;\n};\n\nfunction ChatPreviewPeople(props: ChatPreviewPeopleProps): JSX.Element {\n return (\n <p class=\"k2b-chat-preview__people\">\n <span class=\"k2b-chat-preview__faces\" aria-hidden=\"true\">\n <For each={props.people}>{(person) => <Avatar name={person.name} src={person.src} size=\"xs\" />}</For>\n </span>\n <span>{props.children}</span>\n </p>\n );\n}\n\nexport const ChatPreview = Object.assign(ChatPreviewRoot, {\n Header: ChatPreviewHeader,\n Title: ChatPreviewTitle,\n Sentence: ChatPreviewSentence,\n Excerpt: ChatPreviewExcerpt,\n ReadMore: ChatPreviewReadMore,\n Lines: ChatPreviewLines,\n Line: ChatPreviewLine,\n People: ChatPreviewPeople,\n});\n\n// ---------------------------------------------------------------------------\n// Mark\n// ---------------------------------------------------------------------------\n\nexport type ChatMarkProps = { change: \"added\" | \"removed\"; children: JSX.Element };\n\n/** Marks new or removed words; screen readers hear \"new:\" or \"removed:\" first. */\nexport function ChatMark(props: ChatMarkProps): JSX.Element {\n const messages = useChatMessages();\n return (\n <Show\n when={props.change === \"removed\"}\n fallback={\n <mark class=\"k2b-chat-mark\" data-change=\"added\">\n <span class=\"k2b-sr-only\">{messages().markAdded} </span>\n {props.children}\n </mark>\n }\n >\n <del class=\"k2b-chat-mark\" data-change=\"removed\">\n <span class=\"k2b-sr-only\">{messages().markRemoved} </span>\n {props.children}\n </del>\n </Show>\n );\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":[],"sources":["chat/ChatDecision.tsx"],"sourcesContent":["import {\n createContext,\n createEffect,\n createMemo,\n createSignal,\n createUniqueId,\n For,\n type JSX,\n on,\n onCleanup,\n onMount,\n Show,\n untrack,\n useContext,\n} from \"solid-js\";\nimport { Button } from \"../actions/Button\";\nimport { Avatar } from \"../surfaces/Avatar\";\nimport { useChatMessages } from \"./chat-messages\";\nimport type {\n ChatDecisionAnswer,\n ChatDecisionReason,\n ChatDecisionState,\n ChatOutcomeLine,\n ChatOutcomeTone,\n ChatPreviewHeaderRow,\n ChatPreviewPerson,\n} from \"./types\";\n\n// ---------------------------------------------------------------------------\n// Decision\n// ---------------------------------------------------------------------------\n\nexport type ChatDecisionProps = {\n /** `open` shows the question; every other state shows `outcome` in its place. */\n state: ChatDecisionState;\n /** The question as one sentence, usually with `ReferenceChip`s. */\n sentence: JSX.Element;\n /** Why this question is asked, in the platform's words. */\n reason: ChatDecisionReason;\n /** The thing itself, usually `Chat.Preview`. */\n preview?: JSX.Element;\n /** The main answer, named by verb and target (\"Send to Lea\"). `danger` for deletions, `primary` for requests. */\n confirm: ChatDecisionAnswer & { variant?: \"ai\" | \"primary\" | \"danger\" };\n /** The other answer (\"Don't send\"). */\n decline: ChatDecisionAnswer;\n /** An optional quiet third answer after the buttons, such as \"Yes, and don't ask again in this chat\". */\n remember?: ChatDecisionAnswer;\n /** Turns `confirm` and `remember` off; this reason replaces `reason` in the same place. */\n unavailable?: ChatDecisionReason;\n /** The result line shown in every state but `open`, usually `Chat.Outcome`. */\n outcome?: JSX.Element;\n /** Receives a rejected promise from an answer's `onSelect`. */\n onAnswerError?: (error: unknown) => void;\n anchorId?: string | number;\n class?: string;\n};\n\n/** What an outcome inside a question needs from it: whether it was just answered here, and a link press inside it. */\nconst DecisionScope = createContext<{ answered: () => boolean; pressed: () => void; released: () => void }>();\n\nconst reasonIcon = (reason: ChatDecisionReason) => reason.icon ?? \"ti ti-info-circle\";\n\n/**\n * A question the person answers in the conversation: one sentence, why it is asked, the thing itself, and two answers.\n * An answer collapses it at once to its outcome line, which takes the focus and is announced.\n */\nexport function ChatDecision(props: ChatDecisionProps): JSX.Element {\n const id = createUniqueId();\n const sentenceId = `k2b-chat-decision-${id}-sentence`;\n const reasonId = `k2b-chat-decision-${id}-reason`;\n let root: HTMLDivElement | undefined;\n let sentence: HTMLParagraphElement | undefined;\n // An answer given here moves the focus to the outcome; a click in the outcome that reopens the question moves it\n // back to the sentence. A state change from elsewhere moves no focus.\n const [answeredHere, setAnsweredHere] = createSignal(false);\n const [arrive, setArrive] = createSignal(false);\n let reopenedHere = false;\n // A press on the sentence focuses it too; only a focus moved there from elsewhere, such as a jump, lights it up.\n // The browser also focuses the sentence again when its window comes back; that is no arrival either.\n let sentencePressed = false;\n let sentenceHeldAcrossWindow = false;\n const windowLeft = () => {\n if (sentence && document.activeElement === sentence) sentenceHeldAcrossWindow = true;\n };\n onMount(() => {\n window.addEventListener(\"blur\", windowLeft);\n onCleanup(() => window.removeEventListener(\"blur\", windowLeft));\n });\n // A press counts only while its action runs: a reopen from elsewhere later must not take the focus.\n const scope = {\n answered: answeredHere,\n pressed: () => {\n reopenedHere = true;\n },\n released: () => {\n reopenedHere = false;\n },\n };\n\n // Read once: an object literal from the host builds its JSX again on every read.\n const reason = createMemo(() => props.unavailable ?? props.reason);\n const open = () => props.state === \"open\";\n\n const answer = (choice: ChatDecisionAnswer, enabled: boolean) => {\n if (!enabled || !open() || answeredHere()) return;\n setAnsweredHere(true);\n try {\n const result = choice.onSelect();\n if (result instanceof Promise) result.catch((error: unknown) => props.onAnswerError?.(error));\n } catch (error) {\n props.onAnswerError?.(error);\n }\n // A host that keeps the question open (it could not take the answer) gets working buttons back.\n queueMicrotask(() => {\n if (open()) setAnsweredHere(false);\n });\n };\n\n createEffect(\n on(\n () => props.state,\n (state, previous) => {\n if (state !== \"open\" && previous === \"open\" && answeredHere()) {\n root?.querySelector<HTMLElement>(\".k2b-chat-outcome\")?.focus({ preventScroll: true });\n }\n if (state === \"open\" && previous !== undefined && previous !== \"open\") {\n // A host that could not take an answer given here returns the question from `sending`; the outcome that held\n // the focus is gone, so the focus goes back to the sentence instead of the page.\n const active = document.activeElement;\n const failedHere = answeredHere() && previous === \"sending\" && (!active || active === document.body);\n setAnsweredHere(false);\n if (reopenedHere || failedHere) {\n sentence?.focus({ preventScroll: true });\n setArrive(true);\n }\n // Handled. Until then the marker holds through states in between, such as `sending` while a reopen loads.\n reopenedHere = false;\n }\n },\n ),\n );\n\n return (\n <div\n ref={root}\n class={`k2b-chat-decision ${props.class ?? \"\"}`}\n data-state={props.state}\n data-chat-anchor={props.anchorId !== undefined ? String(props.anchorId) : undefined}\n >\n <Show when={open()} fallback={<DecisionScope.Provider value={scope}>{props.outcome}</DecisionScope.Provider>}>\n <section class=\"k2b-chat-decision__card\" aria-labelledby={sentenceId} aria-describedby={reasonId}>\n <p\n ref={sentence}\n id={sentenceId}\n class=\"k2b-chat-decision__sentence\"\n tabindex=\"-1\"\n data-arrive={arrive() ? \"true\" : undefined}\n onPointerDown={() => {\n sentencePressed = true;\n }}\n onPointerUp={() => {\n sentencePressed = false;\n }}\n onPointerCancel={() => {\n sentencePressed = false;\n }}\n onFocus={() => {\n if (!sentencePressed && !sentenceHeldAcrossWindow) setArrive(true);\n sentencePressed = false;\n sentenceHeldAcrossWindow = false;\n }}\n onAnimationEnd={() => setArrive(false)}\n >\n {props.sentence}\n </p>\n <p id={reasonId} class=\"k2b-chat-line k2b-chat-decision__reason\" data-tone={reason().tone ?? \"neutral\"}>\n <i class={`k2b-chat-line__icon ${reasonIcon(reason())}`} aria-hidden=\"true\" />\n <span class=\"k2b-chat-line__text\">{reason().text}</span>\n </p>\n {props.preview}\n <div class=\"k2b-chat-decision__answers\">\n <Button\n class=\"k2b-chat-decision__answer\"\n wrap\n variant={props.confirm.variant ?? \"ai\"}\n disabled={Boolean(props.unavailable)}\n onClick={() => answer(props.confirm, !props.unavailable)}\n >\n <Show when={props.confirm.icon}>{(icon) => <i class={icon()} aria-hidden=\"true\" />}</Show>\n {props.confirm.label}\n </Button>\n <Button class=\"k2b-chat-decision__answer\" wrap variant=\"subtle\" onClick={() => answer(props.decline, true)}>\n <Show when={props.decline.icon}>{(icon) => <i class={icon()} aria-hidden=\"true\" />}</Show>\n {props.decline.label}\n </Button>\n <Show when={props.remember}>\n {(remember) => (\n <Button\n class=\"k2b-chat-decision__remember\"\n wrap\n variant=\"text\"\n disabled={Boolean(props.unavailable)}\n onClick={() => answer(remember(), !props.unavailable)}\n >\n {remember().label}\n </Button>\n )}\n </Show>\n </div>\n </section>\n </Show>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Outcome\n// ---------------------------------------------------------------------------\n\nexport type ChatOutcomeProps = {\n /**\n * Every line one flow can show, such as running and done. All of them share one cell, so the line is as high as\n * the longest and switching between them moves nothing.\n */\n lines: Readonly<Record<string, ChatOutcomeLine>>;\n /** The key of the visible line. */\n current: string;\n /** Receives an error thrown or rejected by a line's `action`. */\n onActionError?: (error: unknown) => void;\n anchorId?: string | number;\n class?: string;\n};\n\nconst OUTCOME_ICONS: Record<ChatOutcomeTone, string> = {\n running: \"ti ti-loader-2 k2b-spin\",\n done: \"ti ti-check\",\n off: \"ti ti-circle-off\",\n waiting: \"ti ti-clock\",\n warning: \"ti ti-alert-triangle\",\n error: \"ti ti-alert-circle\",\n};\n\n/** The visible words of a line, without what screen readers do not hear. */\nconst spokenText = (element: Element): string => {\n const copy = element.cloneNode(true) as Element;\n // Buttons under the line are controls, not part of what happened.\n for (const hidden of copy.querySelectorAll('[aria-hidden=\"true\"], .k2b-chat-outcome__actions')) hidden.remove();\n // The time and the link stand apart by margin only; spoken, they need a space.\n for (const part of copy.querySelectorAll(\".k2b-chat-outcome__time, .k2b-chat-outcome__link\")) part.before(\" \");\n return (copy.textContent ?? \"\").replace(/\\s+/g, \" \").trim();\n};\n\n/**\n * One line that says what happened: running, done, off, waiting, warning, or error. Changes are announced through a\n * polite live region; the line itself can take the focus.\n */\nexport function ChatOutcome(props: ChatOutcomeProps): JSX.Element {\n const scope = useContext(DecisionScope);\n // Only a line that replaces a question just answered here fades in; history renders final.\n const entering = untrack(() => scope?.answered() ?? false);\n const [live, setLive] = createSignal(\"\");\n let root: HTMLDivElement | undefined;\n let cell: HTMLDivElement | undefined;\n let pending = false;\n let timer: ReturnType<typeof setTimeout> | undefined;\n // Read once: an object literal from the host builds its JSX again on every read.\n const lines = createMemo(() => props.lines);\n const line = () => lines()[props.current];\n const tone = () => line()?.tone ?? \"off\";\n const keys = () => {\n const all = Object.keys(lines());\n return all.includes(props.current) ? all : [props.current, ...all];\n };\n\n // Empty the region first, so the same words spoken again are a change too.\n const announce = () => {\n setLive(\"\");\n if (timer) clearTimeout(timer);\n timer = setTimeout(() => {\n const current = cell?.querySelector('[data-current=\"true\"]');\n setLive(current ? spokenText(current) : \"\");\n }, 40);\n };\n\n onMount(() => {\n if (untrack(() => scope?.answered())) announce();\n });\n createEffect(\n on(\n () => props.current,\n () => {\n // A link pressed in a line that is now hidden would leave the focus on an invisible button, which the browser\n // then drops to the page. The line itself keeps it instead.\n const active = document.activeElement;\n const hidden = active && cell?.contains(active) && !active.closest('[data-current=\"true\"]');\n if (hidden || (pending && active === document.body)) root?.focus({ preventScroll: true });\n announce();\n },\n { defer: true },\n ),\n );\n onCleanup(() => {\n if (timer) clearTimeout(timer);\n });\n\n return (\n <div\n ref={root}\n class={`k2b-chat-outcome ${props.class ?? \"\"}`}\n data-tone={tone()}\n data-chat-anchor={props.anchorId !== undefined ? String(props.anchorId) : undefined}\n data-enter={entering ? \"true\" : undefined}\n tabindex=\"-1\"\n >\n <span class=\"k2b-chat-outcome__icon\" aria-hidden=\"true\">\n <i class={line()?.icon ?? OUTCOME_ICONS[tone()]} />\n </span>\n {/* Busy is set on the words only: a live region inside a busy subtree would be held back. */}\n <div ref={cell} class=\"k2b-chat-outcome__cell\" aria-busy={tone() === \"running\" ? \"true\" : undefined}>\n <For each={keys()}>\n {(key) => {\n const entry = () => lines()[key];\n const current = () => key === props.current;\n return (\n <Show when={entry()}>\n {(item) => (\n <div\n class=\"k2b-chat-outcome__text\"\n data-current={current() ? \"true\" : undefined}\n aria-hidden={current() ? undefined : \"true\"}\n >\n {item().text}\n <Show when={item().detail}>\n {(detail) => (\n <>\n {\" \"}\n <span class=\"k2b-chat-outcome__detail\">{detail()}</span>\n </>\n )}\n </Show>\n <Show when={item().time}>{(time) => <span class=\"k2b-chat-outcome__time\">{time()}</span>}</Show>\n <Show when={item().action}>\n {(action) => (\n <Button\n class=\"k2b-chat-outcome__link\"\n wrap\n variant=\"text\"\n tabIndex={current() ? undefined : -1}\n onClick={() => {\n // A second press while the first is still running would repeat its work.\n if (pending) return;\n scope?.pressed();\n try {\n const result = action().onSelect();\n if (result instanceof Promise) {\n pending = true;\n result\n .catch((error: unknown) => props.onActionError?.(error))\n .finally(() => {\n pending = false;\n scope?.released();\n });\n return;\n }\n } catch (error) {\n props.onActionError?.(error);\n }\n scope?.released();\n }}\n >\n {action().label}\n </Button>\n )}\n </Show>\n {/* Every line keeps its buttons, hidden with its text, so the cell also reserves their row. */}\n <Show when={item().actions}>{(actions) => <div class=\"k2b-chat-outcome__actions\">{actions()}</div>}</Show>\n </div>\n )}\n </Show>\n );\n }}\n </For>\n </div>\n <span class=\"k2b-sr-only\" role=\"status\" aria-live=\"polite\">\n {live()}\n </span>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Preview\n// ---------------------------------------------------------------------------\n\nexport type ChatPreviewProps = { children: JSX.Element; class?: string };\n\n/** The thing a question is about, as calm text on the sentence's edge: no surface, no column. */\nfunction ChatPreviewRoot(props: ChatPreviewProps): JSX.Element {\n return <div class={`k2b-chat-preview ${props.class ?? \"\"}`}>{props.children}</div>;\n}\n\nexport type ChatPreviewHeaderProps = {\n /** One row per field, such as From, To, Cc, and Bcc; the label stands right before its value. */\n rows: readonly ChatPreviewHeaderRow[];\n /** A last line, such as when the message goes out. */\n note?: JSX.Element;\n};\n\nconst PreviewPeople = (props: { people: readonly ChatPreviewPerson[] }) => (\n <For each={props.people}>\n {(person, index) => (\n <>\n {index() > 0 ? \", \" : \"\"}\n <span class=\"k2b-chat-preview__person\">\n <Show when={person.name}>{(name) => <b>{name()}</b>}</Show>\n <Show when={person.address}>\n {(address) => (\n <span class=\"k2b-chat-preview__address\" data-alone={person.name ? undefined : \"true\"}>\n {address()}\n </span>\n )}\n </Show>\n </span>\n </>\n )}\n </For>\n);\n\nfunction ChatPreviewHeader(props: ChatPreviewHeaderProps): JSX.Element {\n return (\n <div class=\"k2b-chat-preview__header\">\n <dl>\n <For each={props.rows}>\n {(row) => (\n <div data-emphasis={row.emphasis ? \"true\" : undefined}>\n <dt>{row.label}</dt>\n <dd>\n <Show when={row.people}>{(people) => <PreviewPeople people={people()} />}</Show>\n {row.value}\n </dd>\n </div>\n )}\n </For>\n </dl>\n <Show when={props.note}>{(note) => <p>{note()}</p>}</Show>\n </div>\n );\n}\n\nexport type ChatPreviewTitleProps = { children: JSX.Element; meta?: JSX.Element };\n\n/** The thing's name in the text's own face, with optional quiet facts after it. */\nfunction ChatPreviewTitle(props: ChatPreviewTitleProps): JSX.Element {\n return (\n <p class=\"k2b-chat-preview__title-line\">\n <span class=\"k2b-chat-preview__title\">{props.children}</span>\n <Show when={props.meta}>\n {(meta) => (\n <>\n {\" \"}\n <span class=\"k2b-chat-preview__meta\">{meta()}</span>\n </>\n )}\n </Show>\n </p>\n );\n}\n\n/** A rule or instruction as one sentence, such as what a routine does; chips and marks may stand inside. */\nfunction ChatPreviewSentence(props: { children: JSX.Element }): JSX.Element {\n return <p class=\"k2b-chat-preview__sentence\">{props.children}</p>;\n}\n\nexport type ChatPreviewExcerptProps = {\n children: JSX.Element;\n /** Shows the whole text in place instead of the first lines, such as after `Chat.Preview.ShowAll`. */\n expanded?: boolean;\n id?: string;\n};\n\n/** The first lines of a longer text. It keeps its line breaks, shows about three lines, and fades out. */\nfunction ChatPreviewExcerpt(props: ChatPreviewExcerptProps): JSX.Element {\n return (\n <p\n class=\"k2b-chat-preview__excerpt\"\n id={props.id}\n data-expanded={props.expanded ? \"true\" : undefined}\n tabindex={props.expanded ? -1 : undefined}\n >\n {props.children}\n </p>\n );\n}\n\nexport type ChatPreviewShowAllProps = {\n /** The id of the `Chat.Preview.Excerpt` this button opens. */\n controls: string;\n onShow: () => void;\n children: JSX.Element;\n};\n\n/**\n * Shows the rest of an excerpt in place, for a text with no page of its own to open. It looks like `ReadMore`; the\n * caller removes it once the text is shown, and the focus moves to the text, so reading goes on where it was.\n */\nfunction ChatPreviewShowAll(props: ChatPreviewShowAllProps): JSX.Element {\n const show = () => {\n props.onShow();\n queueMicrotask(() => document.getElementById(props.controls)?.focus({ preventScroll: true }));\n };\n return (\n <button type=\"button\" class=\"k2b-chat-preview__more\" aria-controls={props.controls} aria-expanded=\"false\" onClick={show}>\n {props.children}\n </button>\n );\n}\n\nexport type ChatPreviewReadMoreProps = {\n href: string;\n children: JSX.Element;\n /** Tooltip, such as \"Opens exactly this version of the draft\". */\n title?: string;\n};\n\n/** Opens the whole thing at exactly the version the question shows. */\nfunction ChatPreviewReadMore(props: ChatPreviewReadMoreProps): JSX.Element {\n return (\n <a class=\"k2b-chat-preview__more\" href={props.href} title={props.title}>\n {props.children}\n </a>\n );\n}\n\nconst InList = createContext(false);\n\n/** A list of lines with a name, such as \"What the routine may do\". */\nfunction ChatPreviewLines(props: { label?: string; children: JSX.Element }): JSX.Element {\n return (\n <ul class=\"k2b-chat-preview__lines\" aria-label={props.label}>\n <InList.Provider value={true}>{props.children}</InList.Provider>\n </ul>\n );\n}\n\nexport type ChatPreviewLineProps = {\n /** Icon class; the text after it starts 1.5rem from the edge. */\n icon: string;\n /** Icon colour, such as the PDF colour of an attachment. */\n accent?: string;\n /** `muted` for limits and notes, `warning` for an application's own warning. */\n tone?: \"default\" | \"muted\" | \"warning\";\n /** Marks the whole line as new or removed. */\n mark?: \"added\" | \"removed\";\n /** Quiet facts after the text, such as a file size. */\n meta?: JSX.Element;\n children: JSX.Element;\n};\n\n/** One line led by an icon: a consequence, a right, an attachment, or a warning. */\nfunction ChatPreviewLine(props: ChatPreviewLineProps): JSX.Element {\n const inList = useContext(InList);\n const messages = useChatMessages();\n const content = () => (\n <>\n <i class={`k2b-chat-line__icon ${props.icon}`} style={props.accent ? { color: props.accent } : undefined} aria-hidden=\"true\" />\n <span class=\"k2b-chat-line__text\">\n {/* One stable wrapper, so marking a line later never moves its mounted children. */}\n <span class=\"k2b-chat-mark\" data-change={props.mark}>\n <Show when={props.mark}>\n {(mark) => <span class=\"k2b-sr-only\">{mark() === \"added\" ? messages().markAdded : messages().markRemoved} </span>}\n </Show>\n {props.children}\n </span>\n <Show when={props.meta}>\n {(meta) => (\n <>\n {\" \"}\n <span class=\"k2b-chat-preview__meta\">{meta()}</span>\n </>\n )}\n </Show>\n </span>\n </>\n );\n const attributes = () => ({\n class: \"k2b-chat-line k2b-chat-preview__line\",\n \"data-tone\": props.tone && props.tone !== \"default\" ? props.tone : undefined,\n });\n return inList ? <li {...attributes()}>{content()}</li> : <p {...attributes()}>{content()}</p>;\n}\n\nexport type ChatPreviewPeopleProps = {\n /** The first few people; their avatars overlap at the start of the line. */\n people: readonly { name: string; src?: string | null }[];\n /** The names as text, such as \"Lea Berg, Tom Weber and 3 others\". */\n children: JSX.Element;\n};\n\nfunction ChatPreviewPeople(props: ChatPreviewPeopleProps): JSX.Element {\n return (\n <p class=\"k2b-chat-preview__people\">\n <span class=\"k2b-chat-preview__faces\" aria-hidden=\"true\">\n <For each={props.people}>{(person) => <Avatar name={person.name} src={person.src} size=\"xs\" />}</For>\n </span>\n <span>{props.children}</span>\n </p>\n );\n}\n\nexport const ChatPreview = Object.assign(ChatPreviewRoot, {\n Header: ChatPreviewHeader,\n Title: ChatPreviewTitle,\n Sentence: ChatPreviewSentence,\n Excerpt: ChatPreviewExcerpt,\n ReadMore: ChatPreviewReadMore,\n ShowAll: ChatPreviewShowAll,\n Lines: ChatPreviewLines,\n Line: ChatPreviewLine,\n People: ChatPreviewPeople,\n});\n\n// ---------------------------------------------------------------------------\n// Mark\n// ---------------------------------------------------------------------------\n\nexport type ChatMarkProps = { change: \"added\" | \"removed\"; children: JSX.Element };\n\n/** Marks new or removed words; screen readers hear \"new:\" or \"removed:\" first. */\nexport function ChatMark(props: ChatMarkProps): JSX.Element {\n const messages = useChatMessages();\n return (\n <Show\n when={props.change === \"removed\"}\n fallback={\n <mark class=\"k2b-chat-mark\" data-change=\"added\">\n <span class=\"k2b-sr-only\">{messages().markAdded} </span>\n {props.children}\n </mark>\n }\n >\n <del class=\"k2b-chat-mark\" data-change=\"removed\">\n <span class=\"k2b-sr-only\">{messages().markRemoved} </span>\n {props.children}\n </del>\n </Show>\n );\n}\n"],"mappings":"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","ignoreList":[]}
@@ -26,12 +26,14 @@ var _tmpl$ = "<span class=\"k2b-chat-progress-dots\" aria-hidden=\"true\"><span>
26
26
  _tmpl$17 = "<i class=\"ti ti-chevron-right k2b-chat-activity__chevron\" aria-hidden=\"true\"></i>",
27
27
  _tmpl$18 = ["<i", "></i>"],
28
28
  _tmpl$19 = ["<small>", "</small>"],
29
- _tmpl$20 = ["<details class=\"", "\"", " style=\"", "\"", "><summary class=\"k2b-chat-activity__row\"", ">", "</summary><div class=\"k2b-chat-activity__body\">", "</div></details>"],
30
- _tmpl$21 = ["<div class=\"", "\"", " style=\"", "\"", "><div class=\"k2b-chat-activity__row\">", "</div></div>"],
31
- _tmpl$22 = "<i class=\"ti ti-brain\" aria-hidden=\"true\"></i>",
32
- _tmpl$23 = ["<div><dt>", "</dt><dd>", "</dd></div>"],
33
- _tmpl$24 = ["<dl>", "<div><dt>", "</dt><dd>", "</dd></div><div><dt>", "</dt><dd>", "</dd></div>", "<div><dt>", "</dt><dd>", "</dd></div>", "</dl>"];
34
- import { createRenderEffect, createSignal, For, onCleanup, Show } from "solid-js";
29
+ _tmpl$20 = ["<button type=\"button\" class=\"k2b-chat-activity__toggle\"", "><span class=\"k2b-chat-activity__toggle-label\">", "</span><i class=\"ti ti-chevron-right k2b-chat-activity__chevron\" aria-hidden=\"true\"></i></button>"],
30
+ _tmpl$21 = ["<details class=\"", "\"", " style=\"", "\"", "><summary class=\"k2b-chat-activity__row\"", ">", "</summary><div class=\"k2b-chat-activity__body\">", "</div></details>"],
31
+ _tmpl$22 = ["<div class=\"", "\"", " style=\"", "\"", "><div class=\"k2b-chat-activity__row\">", "</div></div>"],
32
+ _tmpl$23 = ["<div class=\"", "\"", " style=\"", "\"", "><div class=\"k2b-chat-activity__row\">", "</div><div", " class=\"k2b-chat-activity__body\"", ">", "</div></div>"],
33
+ _tmpl$24 = "<i class=\"ti ti-brain\" aria-hidden=\"true\"></i>",
34
+ _tmpl$25 = ["<div><dt>", "</dt><dd>", "</dd></div>"],
35
+ _tmpl$26 = ["<dl>", "<div><dt>", "</dt><dd>", "</dd></div><div><dt>", "</dt><dd>", "</dd></div>", "<div><dt>", "</dt><dd>", "</dd></div>", "</dl>"];
36
+ import { children, createContext, createRenderEffect, createSignal, createUniqueId, For, onCleanup, Show, useContext } from "solid-js";
35
37
  import { Button } from "../actions/Button";
36
38
  import { Dropdown } from "../actions/Dropdown";
37
39
  import { Tooltip } from "../feedback/Tooltip";
@@ -304,6 +306,25 @@ const ActivityContent = props => [_$ssr(_tmpl$14, _$escape(_$createComponent(Sho
304
306
  return _$ssr(_tmpl$17);
305
307
  }
306
308
  })];
309
+ const ActivityDisclosureContext = createContext();
310
+ /**
311
+ * The words of an activity label that open its body, with the chevron right after them. With a toggle in its label,
312
+ * only these words are the disclosure, and the rest of the row, chips with links included, stays ordinary content.
313
+ * Outside an activity with a body it renders its words as plain text.
314
+ */
315
+ export function ChatActivityToggle(props) {
316
+ const disclosure = useContext(ActivityDisclosureContext);
317
+ disclosure?.register();
318
+ return _$createComponent(Show, {
319
+ get when() {
320
+ return disclosure?.expandable() ? disclosure : undefined;
321
+ },
322
+ get fallback() {
323
+ return props.children;
324
+ },
325
+ children: current => _$ssr(_tmpl$20, _$ssrAttribute("aria-expanded", current().open() ? "true" : "false", false) + _$ssrAttribute("aria-controls", _$escape(current().bodyId, true), false), _$escape(props.children))
326
+ });
327
+ }
307
328
  export function ChatActivity(props) {
308
329
  // The disclosure's real state. A controlled `open` sets it, and every toggle reports it, so the body renders whenever
309
330
  // the row is open, also when a host has not yet passed its new `open` back.
@@ -313,26 +334,76 @@ export function ChatActivity(props) {
313
334
  if (open !== undefined) setExpanded(open);
314
335
  });
315
336
  const open = expanded;
337
+ const setOpen = next => {
338
+ if (next === expanded()) return;
339
+ setExpanded(next);
340
+ props.onOpenChange?.(next);
341
+ };
316
342
  const tone = () => props.tone ?? "neutral";
317
343
  const style = () => props.accent ? {
318
344
  "--k2b-chat-activity-accent": props.accent
319
345
  } : undefined;
320
- return _$createComponent(Show, {
346
+ const expandable = () => Boolean(props.renderBody || props.children);
347
+ // A `Chat.Activity.Toggle` in the label registers while the label resolves, before the row picks its element, so the
348
+ // server and the first browser frame agree on whether the whole row or only the toggle is the disclosure.
349
+ const [toggles, setToggles] = createSignal(0);
350
+ const bodyId = createUniqueId();
351
+ const disclosure = {
352
+ expandable,
353
+ open,
354
+ toggle: () => setOpen(!expanded()),
355
+ bodyId,
356
+ register: () => {
357
+ setToggles(count => count + 1);
358
+ onCleanup(() => setToggles(count => count - 1));
359
+ }
360
+ };
361
+ const body = () => props.renderBody ? _$createComponent(Show, {
321
362
  get when() {
322
- return props.renderBody || props.children;
323
- },
324
- get fallback() {
325
- return _$ssr(_tmpl$21, `k2b-chat-activity ${_$escape(props.class ?? "", true)}`, _$ssrAttribute("data-tone", _$escape(tone(), true), false) + _$ssrAttribute("data-accent", props.accent ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-busy", props.busy ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-wrap", props.wrap ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-chat-anchor", props.anchorId !== undefined ? _$escape(String(props.anchorId), true) : _$escape(undefined, true), false), _$ssrStyle(style()), _$ssrAttribute("aria-busy", props.busy ? "true" : _$escape(undefined, true), false), _$escape(_$createComponent(ActivityContent, props)));
363
+ return _$memo(() => !!open())() ? props.renderBody : undefined;
326
364
  },
365
+ children: render => render()()
366
+ }) : props.children;
367
+ return _$createComponent(ActivityDisclosureContext.Provider, {
368
+ value: disclosure,
327
369
  get children() {
328
- return _$ssr(_tmpl$20, `k2b-chat-activity ${_$escape(props.class ?? "", true)}`, _$ssrAttribute("data-tone", _$escape(tone(), true), false) + _$ssrAttribute("data-accent", props.accent ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-busy", props.busy ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-wrap", props.wrap ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-body-inset", props.bodyInset === false ? "false" : _$escape(undefined, true), false) + _$ssrAttribute("data-chat-anchor", props.anchorId !== undefined ? _$escape(String(props.anchorId), true) : _$escape(undefined, true), false), _$ssrStyle(style()), _$ssrAttribute("open", open(), true) + _$ssrAttribute("aria-busy", props.busy ? "true" : _$escape(undefined, true), false), _$ssrAttribute("aria-label", _$escape(props.ariaLabel, true), false), _$escape(_$createComponent(ActivityContent, _$mergeProps(props, {
329
- disclosure: true
330
- }))), props.renderBody ? _$escape(_$createComponent(Show, {
331
- get when() {
332
- return _$memo(() => !!open())() ? props.renderBody : undefined;
333
- },
334
- children: render => render()()
335
- })) : _$escape(props.children));
370
+ return (() => {
371
+ const label = children(() => props.label);
372
+ return _$createComponent(Show, {
373
+ get when() {
374
+ return expandable();
375
+ },
376
+ get fallback() {
377
+ return _$ssr(_tmpl$22, `k2b-chat-activity ${_$escape(props.class ?? "", true)}`, _$ssrAttribute("data-tone", _$escape(tone(), true), false) + _$ssrAttribute("data-accent", props.accent ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-busy", props.busy ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-wrap", props.wrap ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-chat-anchor", props.anchorId !== undefined ? _$escape(String(props.anchorId), true) : _$escape(undefined, true), false), _$ssrStyle(style()), _$ssrAttribute("aria-busy", props.busy ? "true" : _$escape(undefined, true), false), _$escape(_$createComponent(ActivityContent, _$mergeProps(props, {
378
+ get label() {
379
+ return label();
380
+ }
381
+ }))));
382
+ },
383
+ get children() {
384
+ return _$createComponent(Show, {
385
+ get when() {
386
+ return toggles() === 0;
387
+ },
388
+ get fallback() {
389
+ return _$ssr(_tmpl$23, `k2b-chat-activity ${_$escape(props.class ?? "", true)}`, _$ssrAttribute("data-tone", _$escape(tone(), true), false) + _$ssrAttribute("data-accent", props.accent ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-busy", props.busy ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-wrap", props.wrap ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-body-inset", props.bodyInset === false ? "false" : _$escape(undefined, true), false) + _$ssrAttribute("data-open", open() ? "true" : "false", false) + _$ssrAttribute("data-chat-anchor", props.anchorId !== undefined ? _$escape(String(props.anchorId), true) : _$escape(undefined, true), false), _$ssrStyle(style()), _$ssrAttribute("aria-busy", props.busy ? "true" : _$escape(undefined, true), false), _$escape(_$createComponent(ActivityContent, _$mergeProps(props, {
390
+ get label() {
391
+ return label();
392
+ }
393
+ }))), _$ssrAttribute("id", _$escape(bodyId, true), false), _$ssrAttribute("hidden", !open(), true), _$escape(body()));
394
+ },
395
+ get children() {
396
+ return _$ssr(_tmpl$21, `k2b-chat-activity ${_$escape(props.class ?? "", true)}`, _$ssrAttribute("data-tone", _$escape(tone(), true), false) + _$ssrAttribute("data-accent", props.accent ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-busy", props.busy ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-wrap", props.wrap ? "true" : _$escape(undefined, true), false) + _$ssrAttribute("data-body-inset", props.bodyInset === false ? "false" : _$escape(undefined, true), false) + _$ssrAttribute("data-chat-anchor", props.anchorId !== undefined ? _$escape(String(props.anchorId), true) : _$escape(undefined, true), false), _$ssrStyle(style()), _$ssrAttribute("open", open(), true) + _$ssrAttribute("aria-busy", props.busy ? "true" : _$escape(undefined, true), false), _$ssrAttribute("aria-label", _$escape(props.ariaLabel, true), false), _$escape(_$createComponent(ActivityContent, _$mergeProps(props, {
397
+ get label() {
398
+ return label();
399
+ },
400
+ disclosure: true
401
+ }))), _$escape(body()));
402
+ }
403
+ });
404
+ }
405
+ });
406
+ })();
336
407
  }
337
408
  });
338
409
  }
@@ -400,24 +471,24 @@ export function ChatContextUsage(props) {
400
471
  }
401
472
  });
402
473
  }
403
- }), _$ssr(_tmpl$24, _$escape(_$createComponent(Show, {
474
+ }), _$ssr(_tmpl$26, _$escape(_$createComponent(Show, {
404
475
  get when() {
405
476
  return props.modelLabel;
406
477
  },
407
- children: model => _$ssr(_tmpl$23, _$escape(chatMessages().model), _$escape(model()))
478
+ children: model => _$ssr(_tmpl$25, _$escape(chatMessages().model), _$escape(model()))
408
479
  })), _$escape(chatMessages().input), _$escape(formattedUsageValue(usage().input)), _$escape(chatMessages().output), _$escape(formattedUsageValue(usage().output)), _$escape(_$createComponent(Show, {
409
480
  get when() {
410
481
  return loopUsage().reported;
411
482
  },
412
483
  get children() {
413
- return _$ssr(_tmpl$23, _$escape(chatMessages().loopTotal), _$escape(formattedUsageValue(loopUsage().total)));
484
+ return _$ssr(_tmpl$25, _$escape(chatMessages().loopTotal), _$escape(formattedUsageValue(loopUsage().total)));
414
485
  }
415
486
  })), _$escape(chatMessages().contextWindow), windowSize() > 0 ? _$escape(formatNumber(windowSize())) : _$escape(chatMessages().notConfigured), _$escape(_$createComponent(Show, {
416
487
  get when() {
417
488
  return remaining() !== null;
418
489
  },
419
490
  get children() {
420
- return _$ssr(_tmpl$23, _$escape(chatMessages().remaining), remaining() === null ? _$escape(messages().unknown) : _$escape(formatNumber(remaining())));
491
+ return _$ssr(_tmpl$25, _$escape(chatMessages().remaining), remaining() === null ? _$escape(messages().unknown) : _$escape(formatNumber(remaining())));
421
492
  }
422
493
  }))), _$createComponent(Show, {
423
494
  get when() {
@@ -452,7 +523,7 @@ export function ChatContextUsage(props) {
452
523
  return accessibleLabel();
453
524
  },
454
525
  get children() {
455
- return [_$ssr(_tmpl$22), _$ssr(_tmpl$0, percent() === null ? "–" : `${_$escape(percent())}%`)];
526
+ return [_$ssr(_tmpl$24), _$ssr(_tmpl$0, percent() === null ? "–" : `${_$escape(percent())}%`)];
456
527
  }
457
528
  });
458
529
  }