@buoy-gg/ask-buoy 7.0.38 → 7.0.39

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 (306) hide show
  1. package/lib/commonjs/blocks/AskBlocks.js +338 -1
  2. package/lib/commonjs/blocks/AskBlocks.js.map +1 -0
  3. package/lib/commonjs/blocks/BlockRenderer.js +262 -1
  4. package/lib/commonjs/blocks/BlockRenderer.js.map +1 -0
  5. package/lib/commonjs/blocks/ChromePrototypes.js +514 -1
  6. package/lib/commonjs/blocks/ChromePrototypes.js.map +1 -0
  7. package/lib/commonjs/blocks/DataBlocks.js +781 -1
  8. package/lib/commonjs/blocks/DataBlocks.js.map +1 -0
  9. package/lib/commonjs/blocks/ExtraBlocks.js +1860 -1
  10. package/lib/commonjs/blocks/ExtraBlocks.js.map +1 -0
  11. package/lib/commonjs/blocks/MediaBlocks.js +156 -1
  12. package/lib/commonjs/blocks/MediaBlocks.js.map +1 -0
  13. package/lib/commonjs/blocks/ReceiptBlocks.js +586 -1
  14. package/lib/commonjs/blocks/ReceiptBlocks.js.map +1 -0
  15. package/lib/commonjs/blocks/blockText.js +60 -1
  16. package/lib/commonjs/blocks/blockText.js.map +1 -0
  17. package/lib/commonjs/blocks/blockText.test.js +53 -1
  18. package/lib/commonjs/blocks/blockText.test.js.map +1 -0
  19. package/lib/commonjs/blocks/context.js +42 -1
  20. package/lib/commonjs/blocks/context.js.map +1 -0
  21. package/lib/commonjs/blocks/icons.js +96 -1
  22. package/lib/commonjs/blocks/icons.js.map +1 -0
  23. package/lib/commonjs/blocks/index.js +95 -1
  24. package/lib/commonjs/blocks/index.js.map +1 -0
  25. package/lib/commonjs/blocks/listRow.test.js +55 -1
  26. package/lib/commonjs/blocks/listRow.test.js.map +1 -0
  27. package/lib/commonjs/blocks/pageState.js +34 -1
  28. package/lib/commonjs/blocks/pageState.js.map +1 -0
  29. package/lib/commonjs/blocks/pageState.test.js +57 -1
  30. package/lib/commonjs/blocks/pageState.test.js.map +1 -0
  31. package/lib/commonjs/blocks/primitives.js +457 -1
  32. package/lib/commonjs/blocks/primitives.js.map +1 -0
  33. package/lib/commonjs/blocks/primitivesIndex.js +62 -1
  34. package/lib/commonjs/blocks/primitivesIndex.js.map +1 -0
  35. package/lib/commonjs/components/ApprovalCard.js +297 -1
  36. package/lib/commonjs/components/ApprovalCard.js.map +1 -0
  37. package/lib/commonjs/components/AskBuoyHeader.js +196 -1
  38. package/lib/commonjs/components/AskBuoyHeader.js.map +1 -0
  39. package/lib/commonjs/components/AskBuoyIcon.js +19 -1
  40. package/lib/commonjs/components/AskBuoyIcon.js.map +1 -0
  41. package/lib/commonjs/components/AskBuoyModal.js +479 -1
  42. package/lib/commonjs/components/AskBuoyModal.js.map +1 -0
  43. package/lib/commonjs/components/AskBuoySettings.js +181 -1
  44. package/lib/commonjs/components/AskBuoySettings.js.map +1 -0
  45. package/lib/commonjs/components/ChangesBar.js +211 -1
  46. package/lib/commonjs/components/ChangesBar.js.map +1 -0
  47. package/lib/commonjs/components/Composer.js +255 -1
  48. package/lib/commonjs/components/Composer.js.map +1 -0
  49. package/lib/commonjs/components/EmptyState.js +161 -1
  50. package/lib/commonjs/components/EmptyState.js.map +1 -0
  51. package/lib/commonjs/components/KeyboardPad.js +80 -1
  52. package/lib/commonjs/components/KeyboardPad.js.map +1 -0
  53. package/lib/commonjs/components/Markdown.js +310 -1
  54. package/lib/commonjs/components/Markdown.js.map +1 -0
  55. package/lib/commonjs/components/MessageList.js +970 -1
  56. package/lib/commonjs/components/MessageList.js.map +1 -0
  57. package/lib/commonjs/components/QueuedMessages.js +145 -1
  58. package/lib/commonjs/components/QueuedMessages.js.map +1 -0
  59. package/lib/commonjs/components/ThinkingStrip.js +223 -1
  60. package/lib/commonjs/components/ThinkingStrip.js.map +1 -0
  61. package/lib/commonjs/components/TypingDots.js +63 -1
  62. package/lib/commonjs/components/TypingDots.js.map +1 -0
  63. package/lib/commonjs/components/markdownParse.js +131 -1
  64. package/lib/commonjs/components/markdownParse.js.map +1 -0
  65. package/lib/commonjs/components/markdownParse.test.js +99 -1
  66. package/lib/commonjs/components/markdownParse.test.js.map +1 -0
  67. package/lib/commonjs/components/useCopyAction.js +50 -1
  68. package/lib/commonjs/components/useCopyAction.js.map +1 -0
  69. package/lib/commonjs/index.js +252 -1
  70. package/lib/commonjs/index.js.map +1 -0
  71. package/lib/commonjs/preset.js +91 -1
  72. package/lib/commonjs/preset.js.map +1 -0
  73. package/lib/commonjs/store/activityGroups.js +110 -1
  74. package/lib/commonjs/store/activityGroups.js.map +1 -0
  75. package/lib/commonjs/store/activityGroups.test.js +78 -1
  76. package/lib/commonjs/store/activityGroups.test.js.map +1 -0
  77. package/lib/commonjs/store/askBuoySettings.js +72 -1
  78. package/lib/commonjs/store/askBuoySettings.js.map +1 -0
  79. package/lib/commonjs/store/askBuoyStore.js +589 -1
  80. package/lib/commonjs/store/askBuoyStore.js.map +1 -0
  81. package/lib/commonjs/store/blockPlacement.js +64 -1
  82. package/lib/commonjs/store/blockPlacement.js.map +1 -0
  83. package/lib/commonjs/store/blockPlacement.test.js +123 -1
  84. package/lib/commonjs/store/blockPlacement.test.js.map +1 -0
  85. package/lib/commonjs/store/queue.test.js +150 -1
  86. package/lib/commonjs/store/queue.test.js.map +1 -0
  87. package/lib/commonjs/store/resetConversation.js +77 -1
  88. package/lib/commonjs/store/resetConversation.js.map +1 -0
  89. package/lib/commonjs/store/restorePending.test.js +63 -1
  90. package/lib/commonjs/store/restorePending.test.js.map +1 -0
  91. package/lib/commonjs/store/restoredIds.test.js +47 -1
  92. package/lib/commonjs/store/restoredIds.test.js.map +1 -0
  93. package/lib/commonjs/store/suggestions.js +54 -1
  94. package/lib/commonjs/store/suggestions.js.map +1 -0
  95. package/lib/commonjs/store/suggestions.test.js +58 -1
  96. package/lib/commonjs/store/suggestions.test.js.map +1 -0
  97. package/lib/commonjs/store/systemLine.test.js +77 -1
  98. package/lib/commonjs/store/systemLine.test.js.map +1 -0
  99. package/lib/commonjs/store/ticketPrompt.js +17 -1
  100. package/lib/commonjs/store/ticketPrompt.js.map +1 -0
  101. package/lib/commonjs/store/traceText.js +81 -1
  102. package/lib/commonjs/store/traceText.js.map +1 -0
  103. package/lib/commonjs/store/traceText.test.js +112 -1
  104. package/lib/commonjs/store/traceText.test.js.map +1 -0
  105. package/lib/commonjs/store/transcriptPersistence.js +297 -1
  106. package/lib/commonjs/store/transcriptPersistence.js.map +1 -0
  107. package/lib/commonjs/store/transcriptPersistence.test.js +333 -1
  108. package/lib/commonjs/store/transcriptPersistence.test.js.map +1 -0
  109. package/lib/commonjs/store/turnRendering.test.js +151 -1
  110. package/lib/commonjs/store/turnRendering.test.js.map +1 -0
  111. package/lib/commonjs/store/useAskBuoy.js +651 -1
  112. package/lib/commonjs/store/useAskBuoy.js.map +1 -0
  113. package/lib/commonjs/store/useAskBuoySettings.js +14 -1
  114. package/lib/commonjs/store/useAskBuoySettings.js.map +1 -0
  115. package/lib/commonjs/sync/askBuoySyncAdapter.js +153 -1
  116. package/lib/commonjs/sync/askBuoySyncAdapter.js.map +1 -0
  117. package/lib/commonjs/sync/askBuoySyncAdapter.test.js +141 -1
  118. package/lib/commonjs/sync/askBuoySyncAdapter.test.js.map +1 -0
  119. package/lib/commonjs/sync/wire.js +58 -1
  120. package/lib/commonjs/sync/wire.js.map +1 -0
  121. package/lib/commonjs/types.js +6 -1
  122. package/lib/commonjs/types.js.map +1 -0
  123. package/lib/module/blocks/AskBlocks.js +331 -1
  124. package/lib/module/blocks/AskBlocks.js.map +1 -0
  125. package/lib/module/blocks/BlockRenderer.js +257 -1
  126. package/lib/module/blocks/BlockRenderer.js.map +1 -0
  127. package/lib/module/blocks/ChromePrototypes.js +503 -1
  128. package/lib/module/blocks/ChromePrototypes.js.map +1 -0
  129. package/lib/module/blocks/DataBlocks.js +767 -1
  130. package/lib/module/blocks/DataBlocks.js.map +1 -0
  131. package/lib/module/blocks/ExtraBlocks.js +1833 -1
  132. package/lib/module/blocks/ExtraBlocks.js.map +1 -0
  133. package/lib/module/blocks/MediaBlocks.js +151 -1
  134. package/lib/module/blocks/MediaBlocks.js.map +1 -0
  135. package/lib/module/blocks/ReceiptBlocks.js +574 -1
  136. package/lib/module/blocks/ReceiptBlocks.js.map +1 -0
  137. package/lib/module/blocks/blockText.js +55 -1
  138. package/lib/module/blocks/blockText.js.map +1 -0
  139. package/lib/module/blocks/blockText.test.js +53 -1
  140. package/lib/module/blocks/blockText.test.js.map +1 -0
  141. package/lib/module/blocks/context.js +35 -1
  142. package/lib/module/blocks/context.js.map +1 -0
  143. package/lib/module/blocks/icons.js +91 -1
  144. package/lib/module/blocks/icons.js.map +1 -0
  145. package/lib/module/blocks/index.js +8 -1
  146. package/lib/module/blocks/index.js.map +1 -0
  147. package/lib/module/blocks/listRow.test.js +56 -1
  148. package/lib/module/blocks/listRow.test.js.map +1 -0
  149. package/lib/module/blocks/pageState.js +30 -1
  150. package/lib/module/blocks/pageState.js.map +1 -0
  151. package/lib/module/blocks/pageState.test.js +56 -1
  152. package/lib/module/blocks/pageState.test.js.map +1 -0
  153. package/lib/module/blocks/primitives.js +445 -1
  154. package/lib/module/blocks/primitives.js.map +1 -0
  155. package/lib/module/blocks/primitivesIndex.js +5 -1
  156. package/lib/module/blocks/primitivesIndex.js.map +1 -0
  157. package/lib/module/components/ApprovalCard.js +292 -1
  158. package/lib/module/components/ApprovalCard.js.map +1 -0
  159. package/lib/module/components/AskBuoyHeader.js +193 -1
  160. package/lib/module/components/AskBuoyHeader.js.map +1 -0
  161. package/lib/module/components/AskBuoyIcon.js +8 -1
  162. package/lib/module/components/AskBuoyIcon.js.map +1 -0
  163. package/lib/module/components/AskBuoyModal.js +474 -1
  164. package/lib/module/components/AskBuoyModal.js.map +1 -0
  165. package/lib/module/components/AskBuoySettings.js +176 -1
  166. package/lib/module/components/AskBuoySettings.js.map +1 -0
  167. package/lib/module/components/ChangesBar.js +206 -1
  168. package/lib/module/components/ChangesBar.js.map +1 -0
  169. package/lib/module/components/Composer.js +250 -1
  170. package/lib/module/components/Composer.js.map +1 -0
  171. package/lib/module/components/EmptyState.js +156 -1
  172. package/lib/module/components/EmptyState.js.map +1 -0
  173. package/lib/module/components/KeyboardPad.js +75 -1
  174. package/lib/module/components/KeyboardPad.js.map +1 -0
  175. package/lib/module/components/Markdown.js +305 -1
  176. package/lib/module/components/Markdown.js.map +1 -0
  177. package/lib/module/components/MessageList.js +964 -1
  178. package/lib/module/components/MessageList.js.map +1 -0
  179. package/lib/module/components/QueuedMessages.js +140 -1
  180. package/lib/module/components/QueuedMessages.js.map +1 -0
  181. package/lib/module/components/ThinkingStrip.js +218 -1
  182. package/lib/module/components/ThinkingStrip.js.map +1 -0
  183. package/lib/module/components/TypingDots.js +58 -1
  184. package/lib/module/components/TypingDots.js.map +1 -0
  185. package/lib/module/components/markdownParse.js +125 -1
  186. package/lib/module/components/markdownParse.js.map +1 -0
  187. package/lib/module/components/markdownParse.test.js +98 -1
  188. package/lib/module/components/markdownParse.test.js.map +1 -0
  189. package/lib/module/components/useCopyAction.js +46 -1
  190. package/lib/module/components/useCopyAction.js.map +1 -0
  191. package/lib/module/index.js +34 -1
  192. package/lib/module/index.js.map +1 -0
  193. package/lib/module/preset.js +74 -1
  194. package/lib/module/preset.js.map +1 -0
  195. package/lib/module/store/activityGroups.js +103 -1
  196. package/lib/module/store/activityGroups.js.map +1 -0
  197. package/lib/module/store/activityGroups.test.js +77 -1
  198. package/lib/module/store/activityGroups.test.js.map +1 -0
  199. package/lib/module/store/askBuoySettings.js +67 -1
  200. package/lib/module/store/askBuoySettings.js.map +1 -0
  201. package/lib/module/store/askBuoyStore.js +583 -1
  202. package/lib/module/store/askBuoyStore.js.map +1 -0
  203. package/lib/module/store/blockPlacement.js +59 -1
  204. package/lib/module/store/blockPlacement.js.map +1 -0
  205. package/lib/module/store/blockPlacement.test.js +122 -1
  206. package/lib/module/store/blockPlacement.test.js.map +1 -0
  207. package/lib/module/store/queue.test.js +149 -1
  208. package/lib/module/store/queue.test.js.map +1 -0
  209. package/lib/module/store/resetConversation.js +72 -1
  210. package/lib/module/store/resetConversation.js.map +1 -0
  211. package/lib/module/store/restorePending.test.js +62 -1
  212. package/lib/module/store/restorePending.test.js.map +1 -0
  213. package/lib/module/store/restoredIds.test.js +46 -1
  214. package/lib/module/store/restoredIds.test.js.map +1 -0
  215. package/lib/module/store/suggestions.js +49 -1
  216. package/lib/module/store/suggestions.js.map +1 -0
  217. package/lib/module/store/suggestions.test.js +57 -1
  218. package/lib/module/store/suggestions.test.js.map +1 -0
  219. package/lib/module/store/systemLine.test.js +76 -1
  220. package/lib/module/store/systemLine.test.js.map +1 -0
  221. package/lib/module/store/ticketPrompt.js +13 -1
  222. package/lib/module/store/ticketPrompt.js.map +1 -0
  223. package/lib/module/store/traceText.js +75 -1
  224. package/lib/module/store/traceText.js.map +1 -0
  225. package/lib/module/store/traceText.test.js +111 -1
  226. package/lib/module/store/traceText.test.js.map +1 -0
  227. package/lib/module/store/transcriptPersistence.js +287 -1
  228. package/lib/module/store/transcriptPersistence.js.map +1 -0
  229. package/lib/module/store/transcriptPersistence.test.js +332 -1
  230. package/lib/module/store/transcriptPersistence.test.js.map +1 -0
  231. package/lib/module/store/turnRendering.test.js +150 -1
  232. package/lib/module/store/turnRendering.test.js.map +1 -0
  233. package/lib/module/store/useAskBuoy.js +646 -1
  234. package/lib/module/store/useAskBuoy.js.map +1 -0
  235. package/lib/module/store/useAskBuoySettings.js +9 -1
  236. package/lib/module/store/useAskBuoySettings.js.map +1 -0
  237. package/lib/module/sync/askBuoySyncAdapter.js +148 -1
  238. package/lib/module/sync/askBuoySyncAdapter.js.map +1 -0
  239. package/lib/module/sync/askBuoySyncAdapter.test.js +140 -1
  240. package/lib/module/sync/askBuoySyncAdapter.test.js.map +1 -0
  241. package/lib/module/sync/wire.js +47 -1
  242. package/lib/module/sync/wire.js.map +1 -0
  243. package/lib/module/types.js +4 -1
  244. package/lib/module/types.js.map +1 -0
  245. package/lib/typescript/blocks/AskBlocks.d.ts.map +1 -0
  246. package/lib/typescript/blocks/BlockRenderer.d.ts.map +1 -0
  247. package/lib/typescript/blocks/ChromePrototypes.d.ts.map +1 -0
  248. package/lib/typescript/blocks/DataBlocks.d.ts.map +1 -0
  249. package/lib/typescript/blocks/ExtraBlocks.d.ts.map +1 -0
  250. package/lib/typescript/blocks/MediaBlocks.d.ts.map +1 -0
  251. package/lib/typescript/blocks/ReceiptBlocks.d.ts.map +1 -0
  252. package/lib/typescript/blocks/blockText.d.ts.map +1 -0
  253. package/lib/typescript/blocks/blockText.test.d.ts.map +1 -0
  254. package/lib/typescript/blocks/context.d.ts.map +1 -0
  255. package/lib/typescript/blocks/icons.d.ts.map +1 -0
  256. package/lib/typescript/blocks/index.d.ts.map +1 -0
  257. package/lib/typescript/blocks/listRow.test.d.ts.map +1 -0
  258. package/lib/typescript/blocks/pageState.d.ts.map +1 -0
  259. package/lib/typescript/blocks/pageState.test.d.ts.map +1 -0
  260. package/lib/typescript/blocks/primitives.d.ts.map +1 -0
  261. package/lib/typescript/blocks/primitivesIndex.d.ts.map +1 -0
  262. package/lib/typescript/components/ApprovalCard.d.ts.map +1 -0
  263. package/lib/typescript/components/AskBuoyHeader.d.ts.map +1 -0
  264. package/lib/typescript/components/AskBuoyIcon.d.ts.map +1 -0
  265. package/lib/typescript/components/AskBuoyModal.d.ts.map +1 -0
  266. package/lib/typescript/components/AskBuoySettings.d.ts.map +1 -0
  267. package/lib/typescript/components/ChangesBar.d.ts.map +1 -0
  268. package/lib/typescript/components/Composer.d.ts.map +1 -0
  269. package/lib/typescript/components/EmptyState.d.ts.map +1 -0
  270. package/lib/typescript/components/KeyboardPad.d.ts.map +1 -0
  271. package/lib/typescript/components/Markdown.d.ts.map +1 -0
  272. package/lib/typescript/components/MessageList.d.ts.map +1 -0
  273. package/lib/typescript/components/QueuedMessages.d.ts.map +1 -0
  274. package/lib/typescript/components/ThinkingStrip.d.ts.map +1 -0
  275. package/lib/typescript/components/TypingDots.d.ts.map +1 -0
  276. package/lib/typescript/components/markdownParse.d.ts.map +1 -0
  277. package/lib/typescript/components/markdownParse.test.d.ts.map +1 -0
  278. package/lib/typescript/components/useCopyAction.d.ts.map +1 -0
  279. package/lib/typescript/index.d.ts.map +1 -0
  280. package/lib/typescript/preset.d.ts.map +1 -0
  281. package/lib/typescript/store/activityGroups.d.ts.map +1 -0
  282. package/lib/typescript/store/activityGroups.test.d.ts.map +1 -0
  283. package/lib/typescript/store/askBuoySettings.d.ts.map +1 -0
  284. package/lib/typescript/store/askBuoyStore.d.ts.map +1 -0
  285. package/lib/typescript/store/blockPlacement.d.ts.map +1 -0
  286. package/lib/typescript/store/blockPlacement.test.d.ts.map +1 -0
  287. package/lib/typescript/store/queue.test.d.ts.map +1 -0
  288. package/lib/typescript/store/resetConversation.d.ts.map +1 -0
  289. package/lib/typescript/store/restorePending.test.d.ts.map +1 -0
  290. package/lib/typescript/store/restoredIds.test.d.ts.map +1 -0
  291. package/lib/typescript/store/suggestions.d.ts.map +1 -0
  292. package/lib/typescript/store/suggestions.test.d.ts.map +1 -0
  293. package/lib/typescript/store/systemLine.test.d.ts.map +1 -0
  294. package/lib/typescript/store/ticketPrompt.d.ts.map +1 -0
  295. package/lib/typescript/store/traceText.d.ts.map +1 -0
  296. package/lib/typescript/store/traceText.test.d.ts.map +1 -0
  297. package/lib/typescript/store/transcriptPersistence.d.ts.map +1 -0
  298. package/lib/typescript/store/transcriptPersistence.test.d.ts.map +1 -0
  299. package/lib/typescript/store/turnRendering.test.d.ts.map +1 -0
  300. package/lib/typescript/store/useAskBuoy.d.ts.map +1 -0
  301. package/lib/typescript/store/useAskBuoySettings.d.ts.map +1 -0
  302. package/lib/typescript/sync/askBuoySyncAdapter.d.ts.map +1 -0
  303. package/lib/typescript/sync/askBuoySyncAdapter.test.d.ts.map +1 -0
  304. package/lib/typescript/sync/wire.d.ts.map +1 -0
  305. package/lib/typescript/types.d.ts.map +1 -0
  306. package/package.json +8 -8
@@ -1 +1,55 @@
1
- "use strict";const cellText=t=>"string"==typeof t?t:t.text;export function blockToText(t){switch(t.kind){case"finding":return[t.title,...t.evidence.map(t=>`${t.label}: ${t.value}`)].join("\n");case"keyValue":return[t.title,...t.pairs.map(t=>`${t.key}: ${"string"==typeof t.value?t.value:JSON.stringify(t.value)}`)].filter(Boolean).join("\n");case"table":{const e=t.columns.join(" | "),l=t.rows.map(t=>t.map(cellText).join(" | ")),i=t.total&&t.total>t.rows.length?`… ${t.total-t.rows.length} more rows`:null;return[t.title,e,...l,i].filter(Boolean).join("\n")}case"list":{const e=t.items.map(t=>`- ${t.title}${t.subtitle?` — ${t.subtitle}`:""}${t.trailing?` (${t.trailing})`:""}`),l=t.total&&t.total>t.items.length?`… ${t.total-t.items.length} more`:null;return[t.title,...e,l].filter(Boolean).join("\n")}case"notice":case"claim":return t.text;case"diff":case"chart":case"imageGrid":case"requestList":case"requestCard":case"logList":case"crash":case"screenElements":return`[${t.kind} card${"title"in t&&"string"==typeof t.title?`: ${t.title}`:""}]`;default:return null}}export function blocksToText(t){return t.map(blockToText).filter(t=>!!t)}
1
+ "use strict";
2
+
3
+ /**
4
+ * Blocks as plain text — for Copy, and for the ticket draft's own Copy.
5
+ *
6
+ * `transcriptToText` used to serialise prose and tool rows only, so a
7
+ * conversation whose whole point was the finding card at the end pasted into
8
+ * Jira WITHOUT the finding. Covers the kinds that carry facts a person would
9
+ * paste; everything else becomes one line naming what was on screen, so the
10
+ * paste says a card existed rather than silently skipping it.
11
+ */
12
+
13
+ const cellText = c => typeof c === "string" ? c : c.text;
14
+ export function blockToText(block) {
15
+ switch (block.kind) {
16
+ case "finding":
17
+ return [block.title, ...block.evidence.map(e => `${e.label}: ${e.value}`)].join("\n");
18
+ case "keyValue":
19
+ return [block.title, ...block.pairs.map(p => `${p.key}: ${typeof p.value === "string" ? p.value : JSON.stringify(p.value)}`)].filter(Boolean).join("\n");
20
+ case "table":
21
+ {
22
+ const head = block.columns.join(" | ");
23
+ const rows = block.rows.map(r => r.map(cellText).join(" | "));
24
+ const more = block.total && block.total > block.rows.length ? `… ${block.total - block.rows.length} more rows` : null;
25
+ return [block.title, head, ...rows, more].filter(Boolean).join("\n");
26
+ }
27
+ case "list":
28
+ {
29
+ const rows = block.items.map(i => `- ${i.title}${i.subtitle ? ` — ${i.subtitle}` : ""}${i.trailing ? ` (${i.trailing})` : ""}`);
30
+ const more = block.total && block.total > block.items.length ? `… ${block.total - block.items.length} more` : null;
31
+ return [block.title, ...rows, more].filter(Boolean).join("\n");
32
+ }
33
+ case "notice":
34
+ return block.text;
35
+ case "claim":
36
+ return block.text;
37
+ case "diff":
38
+ case "chart":
39
+ case "imageGrid":
40
+ case "requestList":
41
+ case "requestCard":
42
+ case "logList":
43
+ case "crash":
44
+ case "screenElements":
45
+ return `[${block.kind} card${"title" in block && typeof block.title === "string" ? `: ${block.title}` : ""}]`;
46
+ default:
47
+ return null;
48
+ }
49
+ }
50
+
51
+ /** Several blocks, blank-line separated, skipping the ones with nothing to say. */
52
+ export function blocksToText(blocks) {
53
+ return blocks.map(blockToText).filter(t => !!t);
54
+ }
55
+ //# sourceMappingURL=blockText.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["cellText","c","text","blockToText","block","kind","title","evidence","map","e","label","value","join","pairs","p","key","JSON","stringify","filter","Boolean","head","columns","rows","r","more","total","length","items","i","subtitle","trailing","blocksToText","blocks","t"],"sourceRoot":"../../../src","sources":["blocks/blockText.ts"],"mappings":"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","ignoreList":[]}
@@ -1 +1,53 @@
1
- "use strict";import{describe,expect,it}from"vitest";import{blockToText,blocksToText}from"./blockText";describe("blockToText",()=>{it("writes a finding as title and evidence rows",()=>{expect(blockToText({id:"f1",kind:"finding",title:"Bag screen empty after /api/bag 500",evidence:[{label:"Steps",value:"Open Bag as user 4412"},{label:"Observed",value:"empty state, no error shown",tone:"danger"}]})).toBe("Bag screen empty after /api/bag 500\nSteps: Open Bag as user 4412\nObserved: empty state, no error shown")}),it("writes a table with its cut noted",()=>{expect(blockToText({id:"t1",kind:"table",columns:["Item","Qty"],rows:[["Charizard",{text:"14"}]],total:30})).toBe("Item | Qty\nCharizard | 14\n… 29 more rows")}),it("names a card it cannot flatten instead of skipping it",()=>{expect(blockToText({id:"d1",kind:"diff",title:"Bag store",before:{},after:{}})).toBe("[diff card: Bag store]")}),it("drops blocks with nothing to say",()=>{expect(blocksToText([{id:"p",kind:"peek"},{id:"n",kind:"notice",tone:"info",text:"hi"}])).toEqual(["hi"])})});
1
+ "use strict";
2
+
3
+ import { describe, expect, it } from "vitest";
4
+ import { blockToText, blocksToText } from "./blockText";
5
+ describe("blockToText", () => {
6
+ it("writes a finding as title and evidence rows", () => {
7
+ expect(blockToText({
8
+ id: "f1",
9
+ kind: "finding",
10
+ title: "Bag screen empty after /api/bag 500",
11
+ evidence: [{
12
+ label: "Steps",
13
+ value: "Open Bag as user 4412"
14
+ }, {
15
+ label: "Observed",
16
+ value: "empty state, no error shown",
17
+ tone: "danger"
18
+ }]
19
+ })).toBe("Bag screen empty after /api/bag 500\nSteps: Open Bag as user 4412\nObserved: empty state, no error shown");
20
+ });
21
+ it("writes a table with its cut noted", () => {
22
+ expect(blockToText({
23
+ id: "t1",
24
+ kind: "table",
25
+ columns: ["Item", "Qty"],
26
+ rows: [["Charizard", {
27
+ text: "14"
28
+ }]],
29
+ total: 30
30
+ })).toBe("Item | Qty\nCharizard | 14\n… 29 more rows");
31
+ });
32
+ it("names a card it cannot flatten instead of skipping it", () => {
33
+ expect(blockToText({
34
+ id: "d1",
35
+ kind: "diff",
36
+ title: "Bag store",
37
+ before: {},
38
+ after: {}
39
+ })).toBe("[diff card: Bag store]");
40
+ });
41
+ it("drops blocks with nothing to say", () => {
42
+ expect(blocksToText([{
43
+ id: "p",
44
+ kind: "peek"
45
+ }, {
46
+ id: "n",
47
+ kind: "notice",
48
+ tone: "info",
49
+ text: "hi"
50
+ }])).toEqual(["hi"]);
51
+ });
52
+ });
53
+ //# sourceMappingURL=blockText.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["describe","expect","it","blockToText","blocksToText","id","kind","title","evidence","label","value","tone","toBe","columns","rows","text","total","before","after","toEqual"],"sourceRoot":"../../../src","sources":["blocks/blockText.test.ts"],"mappings":";;AAAA,SAASA,QAAQ,EAAEC,MAAM,EAAEC,EAAE,QAAQ,QAAQ;AAE7C,SAASC,WAAW,EAAEC,YAAY,QAAQ,aAAa;AAEvDJ,QAAQ,CAAC,aAAa,EAAE,MAAM;EAC5BE,EAAE,CAAC,6CAA6C,EAAE,MAAM;IACtDD,MAAM,CACJE,WAAW,CAAC;MACVE,EAAE,EAAE,IAAI;MACRC,IAAI,EAAE,SAAS;MACfC,KAAK,EAAE,qCAAqC;MAC5CC,QAAQ,EAAE,CACR;QAAEC,KAAK,EAAE,OAAO;QAAEC,KAAK,EAAE;MAAwB,CAAC,EAClD;QAAED,KAAK,EAAE,UAAU;QAAEC,KAAK,EAAE,6BAA6B;QAAEC,IAAI,EAAE;MAAS,CAAC;IAE/E,CAAC,CACH,CAAC,CAACC,IAAI,CAAC,0GAA0G,CAAC;EACpH,CAAC,CAAC;EAEFV,EAAE,CAAC,mCAAmC,EAAE,MAAM;IAC5CD,MAAM,CACJE,WAAW,CAAC;MACVE,EAAE,EAAE,IAAI;MACRC,IAAI,EAAE,OAAO;MACbO,OAAO,EAAE,CAAC,MAAM,EAAE,KAAK,CAAC;MACxBC,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE;QAAEC,IAAI,EAAE;MAAK,CAAC,CAAC,CAAC;MACrCC,KAAK,EAAE;IACT,CAAC,CACH,CAAC,CAACJ,IAAI,CAAC,4CAA4C,CAAC;EACtD,CAAC,CAAC;EAEFV,EAAE,CAAC,uDAAuD,EAAE,MAAM;IAChED,MAAM,CAACE,WAAW,CAAC;MAAEE,EAAE,EAAE,IAAI;MAAEC,IAAI,EAAE,MAAM;MAAEC,KAAK,EAAE,WAAW;MAAEU,MAAM,EAAE,CAAC,CAAC;MAAEC,KAAK,EAAE,CAAC;IAAE,CAAU,CAAC,CAAC,CAACN,IAAI,CACtG,wBACF,CAAC;EACH,CAAC,CAAC;EAEFV,EAAE,CAAC,kCAAkC,EAAE,MAAM;IAC3CD,MAAM,CAACG,YAAY,CAAC,CAAC;MAAEC,EAAE,EAAE,GAAG;MAAEC,IAAI,EAAE;IAAO,CAAC,EAAW;MAAED,EAAE,EAAE,GAAG;MAAEC,IAAI,EAAE,QAAQ;MAAEK,IAAI,EAAE,MAAM;MAAEI,IAAI,EAAE;IAAK,CAAC,CAAC,CAAC,CAAC,CAACI,OAAO,CAAC,CACxH,IAAI,CACL,CAAC;EACJ,CAAC,CAAC;AACJ,CAAC,CAAC","ignoreList":[]}
@@ -1 +1,35 @@
1
- "use strict";import{createContext,useContext}from"react";import{jsx as _jsx}from"react/jsx-runtime";const noop={answer:()=>{},runAction:()=>{},answered:{},supports:{}},Ctx=createContext(noop);export function BlockHandlersProvider({value:e,children:t}){return _jsx(Ctx.Provider,{value:e,children:t})}export function useBlockHandlers(){return useContext(Ctx)}export function actionKey(e,t){return`${e}:${t.label}`}
1
+ "use strict";
2
+
3
+ /**
4
+ * How a block talks back to the sheet.
5
+ *
6
+ * Blocks are pure data; everything that happens when one is tapped goes
7
+ * through this context so the same renderers work inside the real transcript,
8
+ * on the example app's review page, and (later) on the desktop with a
9
+ * different set of handlers behind them.
10
+ */
11
+ import { createContext, useContext } from "react";
12
+ import { jsx as _jsx } from "react/jsx-runtime";
13
+ const noop = {
14
+ answer: () => {},
15
+ runAction: () => {},
16
+ answered: {},
17
+ supports: {}
18
+ };
19
+ const Ctx = /*#__PURE__*/createContext(noop);
20
+ export function BlockHandlersProvider({
21
+ value,
22
+ children
23
+ }) {
24
+ return /*#__PURE__*/_jsx(Ctx.Provider, {
25
+ value: value,
26
+ children: children
27
+ });
28
+ }
29
+ export function useBlockHandlers() {
30
+ return useContext(Ctx);
31
+ }
32
+ export function actionKey(blockId, action) {
33
+ return `${blockId}:${action.label}`;
34
+ }
35
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["createContext","useContext","jsx","_jsx","noop","answer","runAction","answered","supports","Ctx","BlockHandlersProvider","value","children","Provider","useBlockHandlers","actionKey","blockId","action","label"],"sourceRoot":"../../../src","sources":["blocks/context.tsx"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAASA,aAAa,EAAEC,UAAU,QAAwB,OAAO;AAAC,SAAAC,GAAA,IAAAC,IAAA;AAkBlE,MAAMC,IAAmB,GAAG;EAC1BC,MAAM,EAAEA,CAAA,KAAM,CAAC,CAAC;EAChBC,SAAS,EAAEA,CAAA,KAAM,CAAC,CAAC;EACnBC,QAAQ,EAAE,CAAC,CAAC;EACZC,QAAQ,EAAE,CAAC;AACb,CAAC;AAED,MAAMC,GAAG,gBAAGT,aAAa,CAAgBI,IAAI,CAAC;AAE9C,OAAO,SAASM,qBAAqBA,CAAC;EACpCC,KAAK;EACLC;AAIF,CAAC,EAAE;EACD,oBAAOT,IAAA,CAACM,GAAG,CAACI,QAAQ;IAACF,KAAK,EAAEA,KAAM;IAAAC,QAAA,EAAEA;EAAQ,CAAe,CAAC;AAC9D;AAEA,OAAO,SAASE,gBAAgBA,CAAA,EAAkB;EAChD,OAAOb,UAAU,CAACQ,GAAG,CAAC;AACxB;AAEA,OAAO,SAASM,SAASA,CAACC,OAAe,EAAEC,MAAmB,EAAU;EACtE,OAAO,GAAGD,OAAO,IAAIC,MAAM,CAACC,KAAK,EAAE;AACrC","ignoreList":[]}
@@ -1 +1,91 @@
1
- "use strict";import{View,StyleSheet}from"react-native";import{AlertTriangle,Check,Clock,Database,Eye,Globe,Image as ImageIcon,Info,Layers,Navigation,night,User}from"@buoy-gg/shared-ui";import{jsx as _jsx}from"react/jsx-runtime";export function BlockIcon({name:e,size:r=14}){const o=night.color.textSecondary,s=(()=>{switch(e){case"network":return _jsx(Globe,{size:r,color:o});case"storage":return _jsx(Database,{size:r,color:o});case"route":return _jsx(Navigation,{size:r,color:o});case"screen":return _jsx(Eye,{size:r,color:o});case"user":return _jsx(User,{size:r,color:o});case"image":return _jsx(ImageIcon,{size:r,color:o});case"check":return _jsx(Check,{size:r,color:night.color.accent});case"warn":return _jsx(AlertTriangle,{size:r,color:night.color.warning});case"info":return _jsx(Info,{size:r,color:night.color.info});case"store":case"query":return _jsx(Layers,{size:r,color:o});case"clock":return _jsx(Clock,{size:r,color:o})}})();return _jsx(View,{style:styles.wrap,children:s})}const styles=StyleSheet.create({wrap:{width:24,height:24,borderRadius:6,backgroundColor:night.color.fill,alignItems:"center",justifyContent:"center"}});
1
+ "use strict";
2
+
3
+ /** The small named icons a block may ask for. One place, one size. */
4
+ import { View, StyleSheet } from "react-native";
5
+ import { AlertTriangle, Check, Clock, Database, Eye, Globe, Image as ImageIcon, Info, Layers, Navigation, night, User } from "@buoy-gg/shared-ui";
6
+ import { jsx as _jsx } from "react/jsx-runtime";
7
+ export function BlockIcon({
8
+ name,
9
+ size = 14
10
+ }) {
11
+ const c = night.color.textSecondary;
12
+ const icon = (() => {
13
+ switch (name) {
14
+ case "network":
15
+ return /*#__PURE__*/_jsx(Globe, {
16
+ size: size,
17
+ color: c
18
+ });
19
+ case "storage":
20
+ return /*#__PURE__*/_jsx(Database, {
21
+ size: size,
22
+ color: c
23
+ });
24
+ case "route":
25
+ return /*#__PURE__*/_jsx(Navigation, {
26
+ size: size,
27
+ color: c
28
+ });
29
+ case "screen":
30
+ return /*#__PURE__*/_jsx(Eye, {
31
+ size: size,
32
+ color: c
33
+ });
34
+ case "user":
35
+ return /*#__PURE__*/_jsx(User, {
36
+ size: size,
37
+ color: c
38
+ });
39
+ case "image":
40
+ return /*#__PURE__*/_jsx(ImageIcon, {
41
+ size: size,
42
+ color: c
43
+ });
44
+ case "check":
45
+ return /*#__PURE__*/_jsx(Check, {
46
+ size: size,
47
+ color: night.color.accent
48
+ });
49
+ case "warn":
50
+ return /*#__PURE__*/_jsx(AlertTriangle, {
51
+ size: size,
52
+ color: night.color.warning
53
+ });
54
+ case "info":
55
+ return /*#__PURE__*/_jsx(Info, {
56
+ size: size,
57
+ color: night.color.info
58
+ });
59
+ case "store":
60
+ return /*#__PURE__*/_jsx(Layers, {
61
+ size: size,
62
+ color: c
63
+ });
64
+ case "query":
65
+ return /*#__PURE__*/_jsx(Layers, {
66
+ size: size,
67
+ color: c
68
+ });
69
+ case "clock":
70
+ return /*#__PURE__*/_jsx(Clock, {
71
+ size: size,
72
+ color: c
73
+ });
74
+ }
75
+ })();
76
+ return /*#__PURE__*/_jsx(View, {
77
+ style: styles.wrap,
78
+ children: icon
79
+ });
80
+ }
81
+ const styles = StyleSheet.create({
82
+ wrap: {
83
+ width: 24,
84
+ height: 24,
85
+ borderRadius: 6,
86
+ backgroundColor: night.color.fill,
87
+ alignItems: "center",
88
+ justifyContent: "center"
89
+ }
90
+ });
91
+ //# sourceMappingURL=icons.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["View","StyleSheet","AlertTriangle","Check","Clock","Database","Eye","Globe","Image","ImageIcon","Info","Layers","Navigation","night","User","jsx","_jsx","BlockIcon","name","size","c","color","textSecondary","icon","accent","warning","info","style","styles","wrap","children","create","width","height","borderRadius","backgroundColor","fill","alignItems","justifyContent"],"sourceRoot":"../../../src","sources":["blocks/icons.tsx"],"mappings":";;AAAA;AACA,SAASA,IAAI,EAAEC,UAAU,QAAQ,cAAc;AAC/C,SAASC,aAAa,EAAEC,KAAK,EAAEC,KAAK,EAAEC,QAAQ,EAAEC,GAAG,EAAEC,KAAK,EAAEC,KAAK,IAAIC,SAAS,EAAEC,IAAI,EAAEC,MAAM,EAAEC,UAAU,EAAEC,KAAK,EAAEC,IAAI,QAAQ,oBAAoB;AAAC,SAAAC,GAAA,IAAAC,IAAA;AAGlJ,OAAO,SAASC,SAASA,CAAC;EAAEC,IAAI;EAAEC,IAAI,GAAG;AAAsC,CAAC,EAAE;EAChF,MAAMC,CAAC,GAAGP,KAAK,CAACQ,KAAK,CAACC,aAAa;EACnC,MAAMC,IAAI,GAAG,CAAC,MAAM;IAClB,QAAQL,IAAI;MACV,KAAK,SAAS;QAAE,oBAAOF,IAAA,CAACT,KAAK;UAACY,IAAI,EAAEA,IAAK;UAACE,KAAK,EAAED;QAAE,CAAE,CAAC;MACtD,KAAK,SAAS;QAAE,oBAAOJ,IAAA,CAACX,QAAQ;UAACc,IAAI,EAAEA,IAAK;UAACE,KAAK,EAAED;QAAE,CAAE,CAAC;MACzD,KAAK,OAAO;QAAE,oBAAOJ,IAAA,CAACJ,UAAU;UAACO,IAAI,EAAEA,IAAK;UAACE,KAAK,EAAED;QAAE,CAAE,CAAC;MACzD,KAAK,QAAQ;QAAE,oBAAOJ,IAAA,CAACV,GAAG;UAACa,IAAI,EAAEA,IAAK;UAACE,KAAK,EAAED;QAAE,CAAE,CAAC;MACnD,KAAK,MAAM;QAAE,oBAAOJ,IAAA,CAACF,IAAI;UAACK,IAAI,EAAEA,IAAK;UAACE,KAAK,EAAED;QAAE,CAAE,CAAC;MAClD,KAAK,OAAO;QAAE,oBAAOJ,IAAA,CAACP,SAAS;UAACU,IAAI,EAAEA,IAAK;UAACE,KAAK,EAAED;QAAE,CAAE,CAAC;MACxD,KAAK,OAAO;QAAE,oBAAOJ,IAAA,CAACb,KAAK;UAACgB,IAAI,EAAEA,IAAK;UAACE,KAAK,EAAER,KAAK,CAACQ,KAAK,CAACG;QAAO,CAAE,CAAC;MACrE,KAAK,MAAM;QAAE,oBAAOR,IAAA,CAACd,aAAa;UAACiB,IAAI,EAAEA,IAAK;UAACE,KAAK,EAAER,KAAK,CAACQ,KAAK,CAACI;QAAQ,CAAE,CAAC;MAC7E,KAAK,MAAM;QAAE,oBAAOT,IAAA,CAACN,IAAI;UAACS,IAAI,EAAEA,IAAK;UAACE,KAAK,EAAER,KAAK,CAACQ,KAAK,CAACK;QAAK,CAAE,CAAC;MACjE,KAAK,OAAO;QAAE,oBAAOV,IAAA,CAACL,MAAM;UAACQ,IAAI,EAAEA,IAAK;UAACE,KAAK,EAAED;QAAE,CAAE,CAAC;MACrD,KAAK,OAAO;QAAE,oBAAOJ,IAAA,CAACL,MAAM;UAACQ,IAAI,EAAEA,IAAK;UAACE,KAAK,EAAED;QAAE,CAAE,CAAC;MACrD,KAAK,OAAO;QAAE,oBAAOJ,IAAA,CAACZ,KAAK;UAACe,IAAI,EAAEA,IAAK;UAACE,KAAK,EAAED;QAAE,CAAE,CAAC;IACtD;EACF,CAAC,EAAE,CAAC;EACJ,oBAAOJ,IAAA,CAAChB,IAAI;IAAC2B,KAAK,EAAEC,MAAM,CAACC,IAAK;IAAAC,QAAA,EAAEP;EAAI,CAAO,CAAC;AAChD;AAEA,MAAMK,MAAM,GAAG3B,UAAU,CAAC8B,MAAM,CAAC;EAC/BF,IAAI,EAAE;IAAEG,KAAK,EAAE,EAAE;IAAEC,MAAM,EAAE,EAAE;IAAEC,YAAY,EAAE,CAAC;IAAEC,eAAe,EAAEtB,KAAK,CAACQ,KAAK,CAACe,IAAI;IAAEC,UAAU,EAAE,QAAQ;IAAEC,cAAc,EAAE;EAAS;AACpI,CAAC,CAAC","ignoreList":[]}
@@ -1 +1,8 @@
1
- "use strict";export{BlockRenderer}from"./BlockRenderer";export{BlockHandlersProvider,useBlockHandlers}from"./context";export{Card,ActionRow,ProvenanceBadge}from"./primitives";export{MessageActions,ReasoningStrip,ElapsedRow,QueuedComposer,ReloadDivider,Timestamp,EditableUserBubble}from"./ChromePrototypes";export{LivePill}from"./ExtraBlocks";
1
+ "use strict";
2
+
3
+ export { BlockRenderer } from "./BlockRenderer";
4
+ export { BlockHandlersProvider, useBlockHandlers } from "./context";
5
+ export { Card, ActionRow, ProvenanceBadge } from "./primitives";
6
+ export { MessageActions, ReasoningStrip, ElapsedRow, QueuedComposer, ReloadDivider, Timestamp, EditableUserBubble } from "./ChromePrototypes";
7
+ export { LivePill } from "./ExtraBlocks";
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["BlockRenderer","BlockHandlersProvider","useBlockHandlers","Card","ActionRow","ProvenanceBadge","MessageActions","ReasoningStrip","ElapsedRow","QueuedComposer","ReloadDivider","Timestamp","EditableUserBubble","LivePill"],"sourceRoot":"../../../src","sources":["blocks/index.ts"],"mappings":";;AAAA,SAASA,aAAa,QAAQ,iBAAiB;AAC/C,SAASC,qBAAqB,EAAEC,gBAAgB,QAA4B,WAAW;AACvF,SAASC,IAAI,EAAEC,SAAS,EAAEC,eAAe,QAAQ,cAAc;AAC/D,SAASC,cAAc,EAAEC,cAAc,EAAEC,UAAU,EAAEC,cAAc,EAAEC,aAAa,EAAEC,SAAS,EAAEC,kBAAkB,QAAQ,oBAAoB;AAC7I,SAASC,QAAQ,QAAQ,eAAe","ignoreList":[]}
@@ -1 +1,56 @@
1
- "use strict";import{describe,expect,it}from"vitest";import{listRowBehaviour}from"./DataBlocks";describe("listRowBehaviour",()=>{it("a plain row does nothing on tap",()=>{expect(listRowBehaviour({})).toEqual({canExpand:!1,rowRunsAction:!1,actionIsOwnControl:!1})}),it("a row with a picture opens it",()=>{expect(listRowBehaviour({image:"https://x/1.png"})).toEqual({canExpand:!0,rowRunsAction:!1,actionIsOwnControl:!1})}),it("a row with only an action keeps running it from the whole row",()=>{expect(listRowBehaviour({action:{label:"Retry",send:"retry"}})).toEqual({canExpand:!1,rowRunsAction:!0,actionIsOwnControl:!1})}),it("with BOTH, the body opens the picture and the action gets its own control",()=>{const t=listRowBehaviour({image:"https://x/1.png",action:{label:"Retry",send:"retry"}});expect(t).toEqual({canExpand:!0,rowRunsAction:!1,actionIsOwnControl:!0}),expect(t.rowRunsAction).toBe(!1)})});
1
+ "use strict";
2
+
3
+ import { describe, expect, it } from "vitest";
4
+ import { listRowBehaviour } from "./DataBlocks";
5
+
6
+ /**
7
+ * A list row can carry a picture AND an action, and both want the tap. These
8
+ * are the rules that keep them apart — see `listRowBehaviour`.
9
+ */
10
+ describe("listRowBehaviour", () => {
11
+ it("a plain row does nothing on tap", () => {
12
+ expect(listRowBehaviour({})).toEqual({
13
+ canExpand: false,
14
+ rowRunsAction: false,
15
+ actionIsOwnControl: false
16
+ });
17
+ });
18
+ it("a row with a picture opens it", () => {
19
+ expect(listRowBehaviour({
20
+ image: "https://x/1.png"
21
+ })).toEqual({
22
+ canExpand: true,
23
+ rowRunsAction: false,
24
+ actionIsOwnControl: false
25
+ });
26
+ });
27
+ it("a row with only an action keeps running it from the whole row", () => {
28
+ expect(listRowBehaviour({
29
+ action: {
30
+ label: "Retry",
31
+ send: "retry"
32
+ }
33
+ })).toEqual({
34
+ canExpand: false,
35
+ rowRunsAction: true,
36
+ actionIsOwnControl: false
37
+ });
38
+ });
39
+ it("with BOTH, the body opens the picture and the action gets its own control", () => {
40
+ const b = listRowBehaviour({
41
+ image: "https://x/1.png",
42
+ action: {
43
+ label: "Retry",
44
+ send: "retry"
45
+ }
46
+ });
47
+ expect(b).toEqual({
48
+ canExpand: true,
49
+ rowRunsAction: false,
50
+ actionIsOwnControl: true
51
+ });
52
+ // The row body must never be the action's target — that is the whole point.
53
+ expect(b.rowRunsAction).toBe(false);
54
+ });
55
+ });
56
+ //# sourceMappingURL=listRow.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["describe","expect","it","listRowBehaviour","toEqual","canExpand","rowRunsAction","actionIsOwnControl","image","action","label","send","b","toBe"],"sourceRoot":"../../../src","sources":["blocks/listRow.test.ts"],"mappings":";;AAAA,SAASA,QAAQ,EAAEC,MAAM,EAAEC,EAAE,QAAQ,QAAQ;AAE7C,SAASC,gBAAgB,QAAQ,cAAc;;AAE/C;AACA;AACA;AACA;AACAH,QAAQ,CAAC,kBAAkB,EAAE,MAAM;EACjCE,EAAE,CAAC,iCAAiC,EAAE,MAAM;IAC1CD,MAAM,CAACE,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC,CAACC,OAAO,CAAC;MACnCC,SAAS,EAAE,KAAK;MAChBC,aAAa,EAAE,KAAK;MACpBC,kBAAkB,EAAE;IACtB,CAAC,CAAC;EACJ,CAAC,CAAC;EAEFL,EAAE,CAAC,+BAA+B,EAAE,MAAM;IACxCD,MAAM,CAACE,gBAAgB,CAAC;MAAEK,KAAK,EAAE;IAAkB,CAAC,CAAC,CAAC,CAACJ,OAAO,CAAC;MAC7DC,SAAS,EAAE,IAAI;MACfC,aAAa,EAAE,KAAK;MACpBC,kBAAkB,EAAE;IACtB,CAAC,CAAC;EACJ,CAAC,CAAC;EAEFL,EAAE,CAAC,+DAA+D,EAAE,MAAM;IACxED,MAAM,CAACE,gBAAgB,CAAC;MAAEM,MAAM,EAAE;QAAEC,KAAK,EAAE,OAAO;QAAEC,IAAI,EAAE;MAAQ;IAAE,CAAC,CAAC,CAAC,CAACP,OAAO,CAAC;MAC9EC,SAAS,EAAE,KAAK;MAChBC,aAAa,EAAE,IAAI;MACnBC,kBAAkB,EAAE;IACtB,CAAC,CAAC;EACJ,CAAC,CAAC;EAEFL,EAAE,CAAC,2EAA2E,EAAE,MAAM;IACpF,MAAMU,CAAC,GAAGT,gBAAgB,CAAC;MAAEK,KAAK,EAAE,iBAAiB;MAAEC,MAAM,EAAE;QAAEC,KAAK,EAAE,OAAO;QAAEC,IAAI,EAAE;MAAQ;IAAE,CAAC,CAAC;IACnGV,MAAM,CAACW,CAAC,CAAC,CAACR,OAAO,CAAC;MAAEC,SAAS,EAAE,IAAI;MAAEC,aAAa,EAAE,KAAK;MAAEC,kBAAkB,EAAE;IAAK,CAAC,CAAC;IACtF;IACAN,MAAM,CAACW,CAAC,CAACN,aAAa,CAAC,CAACO,IAAI,CAAC,KAAK,CAAC;EACrC,CAAC,CAAC;AACJ,CAAC,CAAC","ignoreList":[]}
@@ -1 +1,30 @@
1
- "use strict";export function pageState(n,t,a,e){const c=Math.min(a,n),d=Math.max(0,n-c),i=a>t&&n>t;return{hidden:d,next:Math.min(d,e),expanded:i,canExpand:d>0,canCollapse:i}}
1
+ "use strict";
2
+
3
+ /**
4
+ * The arithmetic behind a block's "+N more" footer, separated from the hook so
5
+ * it can be tested without a renderer.
6
+ *
7
+ * The rule that matters: a control is offered ONLY when it changes what is on
8
+ * screen. The previous version derived "+N more" from a `total` the source
9
+ * reported while deriving the tap target from the array actually in hand, so a
10
+ * block holding five items and claiming six rendered a "+1 more" with nothing
11
+ * to reveal — a button that did nothing when tapped. This takes a count and a
12
+ * limit and nothing else, so `canExpand` is the same fact as `hidden > 0`.
13
+ */
14
+
15
+ export function pageState(count, cap, limit, step) {
16
+ const shown = Math.min(limit, count);
17
+ const hidden = Math.max(0, count - shown);
18
+ // A block can be re-rendered in place with a shorter list than the one the
19
+ // limit was raised for; collapsing back to a cap nothing exceeds would move
20
+ // nothing, so it is not offered.
21
+ const expanded = limit > cap && count > cap;
22
+ return {
23
+ hidden,
24
+ next: Math.min(hidden, step),
25
+ expanded,
26
+ canExpand: hidden > 0,
27
+ canCollapse: expanded
28
+ };
29
+ }
30
+ //# sourceMappingURL=pageState.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["pageState","count","cap","limit","step","shown","Math","min","hidden","max","expanded","next","canExpand","canCollapse"],"sourceRoot":"../../../src","sources":["blocks/pageState.ts"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAYA,OAAO,SAASA,SAASA,CAACC,KAAa,EAAEC,GAAW,EAAEC,KAAa,EAAEC,IAAY,EAAa;EAC5F,MAAMC,KAAK,GAAGC,IAAI,CAACC,GAAG,CAACJ,KAAK,EAAEF,KAAK,CAAC;EACpC,MAAMO,MAAM,GAAGF,IAAI,CAACG,GAAG,CAAC,CAAC,EAAER,KAAK,GAAGI,KAAK,CAAC;EACzC;EACA;EACA;EACA,MAAMK,QAAQ,GAAGP,KAAK,GAAGD,GAAG,IAAID,KAAK,GAAGC,GAAG;EAC3C,OAAO;IACLM,MAAM;IACNG,IAAI,EAAEL,IAAI,CAACC,GAAG,CAACC,MAAM,EAAEJ,IAAI,CAAC;IAC5BM,QAAQ;IACRE,SAAS,EAAEJ,MAAM,GAAG,CAAC;IACrBK,WAAW,EAAEH;EACf,CAAC;AACH","ignoreList":[]}
@@ -1 +1,56 @@
1
- "use strict";import{describe,expect,it}from"vitest";import{pageState}from"./pageState";const CAP=10,STEP=5,at=(e,t)=>pageState(e,10,t,5);describe("what the footer offers",()=>{it("offers nothing when everything already fits",()=>{const e=at(4,10);expect(e.hidden).toBe(0),expect(e.canExpand).toBe(!1),expect(e.canCollapse).toBe(!1)}),it("never offers an expand that reveals nothing",()=>{expect(at(5,10).canExpand).toBe(!1)}),it("reveals a page at a time rather than the whole list",()=>{expect(at(100,10).next).toBe(5),expect(at(100,15).next).toBe(5),expect(at(100,20).hidden).toBe(80)}),it("offers only the remainder on the last page",()=>{expect(at(12,10).next).toBe(2),expect(at(12,12).canExpand).toBe(!1)}),it("offers the way back only once something is expanded",()=>{expect(at(100,10).canCollapse).toBe(!1),expect(at(100,15).canCollapse).toBe(!0),expect(at(100,15).expanded).toBe(!0)}),it("does not offer a collapse that moves nothing",()=>{const e=at(3,20);expect(e.canCollapse).toBe(!1),expect(e.expanded).toBe(!1),expect(e.hidden).toBe(0)})});
1
+ "use strict";
2
+
3
+ /**
4
+ * The "+N more" footer's arithmetic.
5
+ *
6
+ * The bug this covers: a list block showed "+1 more" that did nothing when
7
+ * tapped. The count came from the `total` the model reported, the tap target
8
+ * came from the array actually in hand, and the two disagreed — so the footer
9
+ * advertised a row that was never sent. Every case below is about a control
10
+ * being offered if and only if it changes the screen.
11
+ */
12
+ import { describe, expect, it } from "vitest";
13
+ import { pageState } from "./pageState";
14
+ const CAP = 10;
15
+ const STEP = 5;
16
+ const at = (count, limit) => pageState(count, CAP, limit, STEP);
17
+ describe("what the footer offers", () => {
18
+ it("offers nothing when everything already fits", () => {
19
+ const s = at(4, CAP);
20
+ expect(s.hidden).toBe(0);
21
+ expect(s.canExpand).toBe(false);
22
+ expect(s.canCollapse).toBe(false);
23
+ });
24
+ it("never offers an expand that reveals nothing", () => {
25
+ // The dead "+1 more" this replaced: the label was drawn from a `total` the
26
+ // source reported, the tap target from the array in hand. `pageState` is
27
+ // given only the array, so a control it offers always moves something.
28
+ expect(at(5, CAP).canExpand).toBe(false);
29
+ });
30
+ it("reveals a page at a time rather than the whole list", () => {
31
+ // 100 items, cap 10: 10 → 15 → 20 → 25, exactly one step per tap.
32
+ expect(at(100, 10).next).toBe(5);
33
+ expect(at(100, 15).next).toBe(5);
34
+ expect(at(100, 20).hidden).toBe(80);
35
+ });
36
+ it("offers only the remainder on the last page", () => {
37
+ // 12 items shown to 10: two left, so the label promises two, not five.
38
+ expect(at(12, 10).next).toBe(2);
39
+ expect(at(12, 12).canExpand).toBe(false);
40
+ });
41
+ it("offers the way back only once something is expanded", () => {
42
+ expect(at(100, 10).canCollapse).toBe(false);
43
+ expect(at(100, 15).canCollapse).toBe(true);
44
+ expect(at(100, 15).expanded).toBe(true);
45
+ });
46
+ it("does not offer a collapse that moves nothing", () => {
47
+ // A block re-rendered in place with a shorter list than the limit was
48
+ // raised for: 3 items under a limit of 20. Folding back to 10 would look
49
+ // identical, so it is not offered.
50
+ const s = at(3, 20);
51
+ expect(s.canCollapse).toBe(false);
52
+ expect(s.expanded).toBe(false);
53
+ expect(s.hidden).toBe(0);
54
+ });
55
+ });
56
+ //# sourceMappingURL=pageState.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["describe","expect","it","pageState","CAP","STEP","at","count","limit","s","hidden","toBe","canExpand","canCollapse","next","expanded"],"sourceRoot":"../../../src","sources":["blocks/pageState.test.ts"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAASA,QAAQ,EAAEC,MAAM,EAAEC,EAAE,QAAQ,QAAQ;AAE7C,SAASC,SAAS,QAAQ,aAAa;AAEvC,MAAMC,GAAG,GAAG,EAAE;AACd,MAAMC,IAAI,GAAG,CAAC;AACd,MAAMC,EAAE,GAAGA,CAACC,KAAa,EAAEC,KAAa,KAAKL,SAAS,CAACI,KAAK,EAAEH,GAAG,EAAEI,KAAK,EAAEH,IAAI,CAAC;AAE/EL,QAAQ,CAAC,wBAAwB,EAAE,MAAM;EACvCE,EAAE,CAAC,6CAA6C,EAAE,MAAM;IACtD,MAAMO,CAAC,GAAGH,EAAE,CAAC,CAAC,EAAEF,GAAG,CAAC;IACpBH,MAAM,CAACQ,CAAC,CAACC,MAAM,CAAC,CAACC,IAAI,CAAC,CAAC,CAAC;IACxBV,MAAM,CAACQ,CAAC,CAACG,SAAS,CAAC,CAACD,IAAI,CAAC,KAAK,CAAC;IAC/BV,MAAM,CAACQ,CAAC,CAACI,WAAW,CAAC,CAACF,IAAI,CAAC,KAAK,CAAC;EACnC,CAAC,CAAC;EAEFT,EAAE,CAAC,6CAA6C,EAAE,MAAM;IACtD;IACA;IACA;IACAD,MAAM,CAACK,EAAE,CAAC,CAAC,EAAEF,GAAG,CAAC,CAACQ,SAAS,CAAC,CAACD,IAAI,CAAC,KAAK,CAAC;EAC1C,CAAC,CAAC;EAEFT,EAAE,CAAC,qDAAqD,EAAE,MAAM;IAC9D;IACAD,MAAM,CAACK,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,CAACQ,IAAI,CAAC,CAACH,IAAI,CAAC,CAAC,CAAC;IAChCV,MAAM,CAACK,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,CAACQ,IAAI,CAAC,CAACH,IAAI,CAAC,CAAC,CAAC;IAChCV,MAAM,CAACK,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,CAACI,MAAM,CAAC,CAACC,IAAI,CAAC,EAAE,CAAC;EACrC,CAAC,CAAC;EAEFT,EAAE,CAAC,4CAA4C,EAAE,MAAM;IACrD;IACAD,MAAM,CAACK,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAACQ,IAAI,CAAC,CAACH,IAAI,CAAC,CAAC,CAAC;IAC/BV,MAAM,CAACK,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAACM,SAAS,CAAC,CAACD,IAAI,CAAC,KAAK,CAAC;EAC1C,CAAC,CAAC;EAEFT,EAAE,CAAC,qDAAqD,EAAE,MAAM;IAC9DD,MAAM,CAACK,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,CAACO,WAAW,CAAC,CAACF,IAAI,CAAC,KAAK,CAAC;IAC3CV,MAAM,CAACK,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,CAACO,WAAW,CAAC,CAACF,IAAI,CAAC,IAAI,CAAC;IAC1CV,MAAM,CAACK,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,CAACS,QAAQ,CAAC,CAACJ,IAAI,CAAC,IAAI,CAAC;EACzC,CAAC,CAAC;EAEFT,EAAE,CAAC,8CAA8C,EAAE,MAAM;IACvD;IACA;IACA;IACA,MAAMO,CAAC,GAAGH,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;IACnBL,MAAM,CAACQ,CAAC,CAACI,WAAW,CAAC,CAACF,IAAI,CAAC,KAAK,CAAC;IACjCV,MAAM,CAACQ,CAAC,CAACM,QAAQ,CAAC,CAACJ,IAAI,CAAC,KAAK,CAAC;IAC9BV,MAAM,CAACQ,CAAC,CAACC,MAAM,CAAC,CAACC,IAAI,CAAC,CAAC,CAAC;EAC1B,CAAC,CAAC;AACJ,CAAC,CAAC","ignoreList":[]}