@signalcore/ui 0.1.0 → 1.0.0-beta.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 (611) hide show
  1. package/README.md +896 -513
  2. package/dist/AgentAbout.d.ts +186 -0
  3. package/dist/AgentAbout.js +1020 -0
  4. package/dist/AgentAbout.js.map +1 -0
  5. package/dist/AgentCard.d.ts +49 -0
  6. package/dist/AgentCard.js +77 -0
  7. package/dist/AgentCard.js.map +1 -0
  8. package/dist/AgentChat.d.ts +233 -0
  9. package/dist/AgentChat.js +1119 -0
  10. package/dist/AgentChat.js.map +1 -0
  11. package/dist/AgentSpace.d.ts +112 -0
  12. package/dist/AgentSpace.js +339 -0
  13. package/dist/AgentSpace.js.map +1 -0
  14. package/dist/AgentTasks.d.ts +48 -0
  15. package/dist/AgentTasks.js +120 -0
  16. package/dist/AgentTasks.js.map +1 -0
  17. package/dist/BrowserView.d.ts +52 -0
  18. package/dist/BrowserView.js +328 -0
  19. package/dist/BrowserView.js.map +1 -0
  20. package/dist/FileView.d.ts +63 -0
  21. package/dist/FileView.js +449 -0
  22. package/dist/FileView.js.map +1 -0
  23. package/dist/Modes.d.ts +13 -0
  24. package/dist/Modes.js +75 -0
  25. package/dist/Modes.js.map +1 -0
  26. package/dist/VoiceCall.d.ts +91 -0
  27. package/dist/VoiceCall.js +302 -0
  28. package/dist/VoiceCall.js.map +1 -0
  29. package/dist/about.d.ts +212 -0
  30. package/dist/about.js +136 -0
  31. package/dist/about.js.map +1 -0
  32. package/dist/agentIcons.d.ts +33 -0
  33. package/dist/agentIcons.js +36 -0
  34. package/dist/agentIcons.js.map +1 -0
  35. package/dist/automation/Automation.d.ts +35 -0
  36. package/dist/automation/Automation.js +268 -0
  37. package/dist/automation/Automation.js.map +1 -0
  38. package/dist/automation/RunView.d.ts +25 -0
  39. package/dist/automation/RunView.js +187 -0
  40. package/dist/automation/RunView.js.map +1 -0
  41. package/dist/automation/cron.d.ts +41 -0
  42. package/dist/automation/cron.js +169 -0
  43. package/dist/automation/cron.js.map +1 -0
  44. package/dist/automation/marks.js +121 -0
  45. package/dist/automation/marks.js.map +1 -0
  46. package/dist/automation/messages.d.ts +113 -0
  47. package/dist/automation/messages.js +113 -0
  48. package/dist/automation/messages.js.map +1 -0
  49. package/dist/automation/record.d.ts +47 -0
  50. package/dist/automation/record.js +177 -0
  51. package/dist/automation/record.js.map +1 -0
  52. package/dist/automation/types.d.ts +143 -0
  53. package/dist/automation/when.d.ts +36 -0
  54. package/dist/automation/when.js +168 -0
  55. package/dist/automation/when.js.map +1 -0
  56. package/dist/blocks.d.ts +185 -0
  57. package/dist/browser.js +292 -0
  58. package/dist/browser.js.map +1 -0
  59. package/dist/call.d.ts +89 -0
  60. package/dist/call.js +218 -0
  61. package/dist/call.js.map +1 -0
  62. package/dist/channelParts.js +26 -0
  63. package/dist/channelParts.js.map +1 -0
  64. package/dist/classes.js +8 -3
  65. package/dist/classes.js.map +1 -0
  66. package/dist/client.d.ts +146 -54
  67. package/dist/client.js +204 -1
  68. package/dist/client.js.map +1 -0
  69. package/dist/conversationFiles.js +46 -0
  70. package/dist/conversationFiles.js.map +1 -0
  71. package/dist/credentials.d.ts +45 -0
  72. package/dist/credentials.js +98 -0
  73. package/dist/credentials.js.map +1 -0
  74. package/dist/dev.js +17 -0
  75. package/dist/dev.js.map +1 -0
  76. package/dist/es.d.ts +17 -0
  77. package/dist/es.js +382 -0
  78. package/dist/es.js.map +1 -0
  79. package/dist/files.d.ts +21 -0
  80. package/dist/files.js +214 -0
  81. package/dist/files.js.map +1 -0
  82. package/dist/frames.d.ts +115 -0
  83. package/dist/frames.js +219 -0
  84. package/dist/frames.js.map +1 -0
  85. package/dist/icons.js +29 -0
  86. package/dist/icons.js.map +1 -0
  87. package/dist/index.d.ts +63 -60
  88. package/dist/index.js +59 -45
  89. package/dist/kit/AudioPlayer.d.ts +20 -0
  90. package/dist/kit/AudioPlayer.js +116 -0
  91. package/dist/kit/AudioPlayer.js.map +1 -0
  92. package/dist/kit/Button.d.ts +29 -0
  93. package/dist/kit/Button.js +59 -0
  94. package/dist/kit/Button.js.map +1 -0
  95. package/dist/kit/Card.d.ts +16 -0
  96. package/dist/kit/Card.js +36 -0
  97. package/dist/kit/Card.js.map +1 -0
  98. package/dist/kit/Chart.js +152 -0
  99. package/dist/kit/Chart.js.map +1 -0
  100. package/dist/kit/Choices.d.ts +21 -0
  101. package/dist/kit/Choices.js +99 -0
  102. package/dist/kit/Choices.js.map +1 -0
  103. package/dist/kit/Combobox.d.ts +26 -0
  104. package/dist/kit/Combobox.js +190 -0
  105. package/dist/kit/Combobox.js.map +1 -0
  106. package/dist/kit/DateField.d.ts +17 -0
  107. package/dist/kit/DateField.js +133 -0
  108. package/dist/kit/DateField.js.map +1 -0
  109. package/dist/kit/Field.d.ts +40 -0
  110. package/dist/kit/Field.js +98 -0
  111. package/dist/kit/Field.js.map +1 -0
  112. package/dist/kit/FileField.d.ts +113 -0
  113. package/dist/kit/FileField.js +341 -0
  114. package/dist/kit/FileField.js.map +1 -0
  115. package/dist/kit/FileMark.d.ts +15 -0
  116. package/dist/kit/FileMark.js +39 -0
  117. package/dist/kit/FileMark.js.map +1 -0
  118. package/dist/kit/Inputs.d.ts +59 -0
  119. package/dist/kit/Inputs.js +205 -0
  120. package/dist/kit/Inputs.js.map +1 -0
  121. package/dist/kit/List.d.ts +47 -0
  122. package/dist/kit/List.js +85 -0
  123. package/dist/kit/List.js.map +1 -0
  124. package/dist/kit/Mark.d.ts +30 -0
  125. package/dist/kit/Mark.js +27 -0
  126. package/dist/kit/Mark.js.map +1 -0
  127. package/dist/kit/MarkStack.d.ts +15 -0
  128. package/dist/kit/MarkStack.js +26 -0
  129. package/dist/kit/MarkStack.js.map +1 -0
  130. package/dist/kit/Note.d.ts +11 -0
  131. package/dist/kit/Note.js +31 -0
  132. package/dist/kit/Note.js.map +1 -0
  133. package/dist/kit/Popover.js +90 -0
  134. package/dist/kit/Popover.js.map +1 -0
  135. package/dist/kit/RangeField.d.ts +14 -0
  136. package/dist/kit/RangeField.js +47 -0
  137. package/dist/kit/RangeField.js.map +1 -0
  138. package/dist/kit/RatingField.d.ts +14 -0
  139. package/dist/kit/RatingField.js +50 -0
  140. package/dist/kit/RatingField.js.map +1 -0
  141. package/dist/kit/Stat.d.ts +26 -0
  142. package/dist/kit/Stat.js +46 -0
  143. package/dist/kit/Stat.js.map +1 -0
  144. package/dist/kit/Switch.d.ts +14 -0
  145. package/dist/kit/Switch.js +21 -0
  146. package/dist/kit/Switch.js.map +1 -0
  147. package/dist/kit/Tag.d.ts +16 -0
  148. package/dist/kit/Tag.js +20 -0
  149. package/dist/kit/Tag.js.map +1 -0
  150. package/dist/kit/Tile.d.ts +34 -0
  151. package/dist/kit/Tile.js +52 -0
  152. package/dist/kit/Tile.js.map +1 -0
  153. package/dist/kit/TimeField.d.ts +31 -0
  154. package/dist/kit/TimeField.js +109 -0
  155. package/dist/kit/TimeField.js.map +1 -0
  156. package/dist/kit/context.d.ts +22 -0
  157. package/dist/kit/context.js +46 -0
  158. package/dist/kit/context.js.map +1 -0
  159. package/dist/kit/dates.d.ts +14 -0
  160. package/dist/kit/dates.js +129 -0
  161. package/dist/kit/dates.js.map +1 -0
  162. package/dist/kit/messages.d.ts +99 -0
  163. package/dist/kit/messages.js +66 -0
  164. package/dist/kit/messages.js.map +1 -0
  165. package/dist/kit/numbers.d.ts +12 -0
  166. package/dist/kit/numbers.js +40 -0
  167. package/dist/kit/numbers.js.map +1 -0
  168. package/dist/kit/options.d.ts +10 -0
  169. package/dist/kit/options.js +23 -0
  170. package/dist/kit/options.js.map +1 -0
  171. package/dist/kit/uploads.d.ts +42 -0
  172. package/dist/kit/uploads.js +165 -0
  173. package/dist/kit/uploads.js.map +1 -0
  174. package/dist/kit/waveform.js +76 -0
  175. package/dist/kit/waveform.js.map +1 -0
  176. package/dist/locale.d.ts +1 -0
  177. package/dist/locale.js +1 -0
  178. package/dist/markdown.js +84 -0
  179. package/dist/markdown.js.map +1 -0
  180. package/dist/marks.js +217 -0
  181. package/dist/marks.js.map +1 -0
  182. package/dist/reveal.js +48 -0
  183. package/dist/reveal.js.map +1 -0
  184. package/dist/stepGlyphs.js +62 -0
  185. package/dist/stepGlyphs.js.map +1 -0
  186. package/dist/surface/Form.js +264 -0
  187. package/dist/surface/Form.js.map +1 -0
  188. package/dist/surface/Markdown.js +42 -0
  189. package/dist/surface/Markdown.js.map +1 -0
  190. package/dist/surface/Surface.d.ts +31 -17
  191. package/dist/surface/Surface.js +480 -57
  192. package/dist/surface/Surface.js.map +1 -0
  193. package/dist/surface/scope.d.ts +32 -0
  194. package/dist/surface/scope.js +23 -0
  195. package/dist/surface/scope.js.map +1 -0
  196. package/dist/surface/values.d.ts +44 -0
  197. package/dist/surface/values.js +237 -0
  198. package/dist/surface/values.js.map +1 -0
  199. package/dist/tint.d.ts +10 -0
  200. package/dist/tint.js +19 -0
  201. package/dist/tint.js.map +1 -0
  202. package/dist/types.d.ts +534 -0
  203. package/dist/types.js +16 -0
  204. package/dist/types.js.map +1 -0
  205. package/dist/useAgentFace.d.ts +18 -0
  206. package/dist/useAgentFace.js +45 -0
  207. package/dist/useAgentFace.js.map +1 -0
  208. package/dist/useCall.d.ts +39 -0
  209. package/dist/useCall.js +273 -0
  210. package/dist/useCall.js.map +1 -0
  211. package/dist/useConversation.d.ts +77 -0
  212. package/dist/useConversation.js +523 -0
  213. package/dist/useConversation.js.map +1 -0
  214. package/dist/useDictation.d.ts +17 -0
  215. package/dist/useDictation.js +68 -0
  216. package/dist/useDictation.js.map +1 -0
  217. package/dist/useLive.d.ts +26 -0
  218. package/dist/useLive.js +88 -0
  219. package/dist/useLive.js.map +1 -0
  220. package/dist/usePolled.js +68 -0
  221. package/dist/usePolled.js.map +1 -0
  222. package/dist/voice/Orb.d.ts +10 -9
  223. package/dist/voice/Orb.js +43 -39
  224. package/dist/voice/Orb.js.map +1 -0
  225. package/dist/voice/StillOrb.js +33 -0
  226. package/dist/voice/StillOrb.js.map +1 -0
  227. package/dist/voice/WebGLOrb.js +98 -0
  228. package/dist/voice/WebGLOrb.js.map +1 -0
  229. package/dist/voice/fluidDots.js +161 -0
  230. package/dist/voice/fluidDots.js.map +1 -0
  231. package/dist/voice/motion.js +84 -0
  232. package/dist/voice/motion.js.map +1 -0
  233. package/dist/voice/orbs.d.ts +32 -0
  234. package/dist/voice/orbs.js +16 -0
  235. package/dist/voice/orbs.js.map +1 -0
  236. package/dist/voice/useReducedMotion.js +16 -16
  237. package/dist/voice/useReducedMotion.js.map +1 -0
  238. package/dist/voice/wave.js +116 -0
  239. package/dist/voice/wave.js.map +1 -0
  240. package/dist/voice/webgl.js +177 -0
  241. package/dist/voice/webgl.js.map +1 -0
  242. package/dist/widget.js +284 -8
  243. package/package.json +49 -39
  244. package/src/AgentAbout.tsx +1621 -0
  245. package/src/AgentCard.tsx +123 -0
  246. package/src/AgentChat.tsx +1795 -0
  247. package/src/AgentSpace.tsx +540 -0
  248. package/src/AgentTasks.tsx +163 -0
  249. package/src/BrowserView.tsx +442 -0
  250. package/src/FileView.tsx +620 -0
  251. package/src/Modes.tsx +112 -0
  252. package/src/VoiceCall.tsx +411 -0
  253. package/src/about.ts +355 -0
  254. package/src/agentIcons.ts +56 -0
  255. package/src/automation/Automation.tsx +308 -0
  256. package/src/automation/RunView.tsx +213 -0
  257. package/src/automation/cron.ts +196 -0
  258. package/src/automation/marks.tsx +144 -0
  259. package/src/automation/messages.ts +231 -0
  260. package/src/automation/record.ts +206 -0
  261. package/src/automation/types.ts +146 -0
  262. package/src/automation/when.ts +195 -0
  263. package/src/blocks.ts +249 -0
  264. package/src/browser.ts +334 -0
  265. package/src/call.ts +300 -0
  266. package/src/channelParts.ts +17 -0
  267. package/src/classes.ts +10 -0
  268. package/src/client.ts +397 -0
  269. package/src/conversationFiles.ts +54 -0
  270. package/src/credentials.ts +158 -0
  271. package/src/dev.ts +20 -0
  272. package/src/es.ts +423 -0
  273. package/src/files.ts +238 -0
  274. package/src/frames.ts +291 -0
  275. package/src/icons.tsx +49 -0
  276. package/src/index.ts +270 -0
  277. package/src/kit/AudioPlayer.tsx +129 -0
  278. package/src/kit/Button.tsx +97 -0
  279. package/src/kit/Card.tsx +47 -0
  280. package/src/kit/Chart.tsx +129 -0
  281. package/src/kit/Choices.tsx +131 -0
  282. package/src/kit/Combobox.tsx +247 -0
  283. package/src/kit/DateField.tsx +156 -0
  284. package/src/kit/Field.tsx +137 -0
  285. package/src/kit/FileField.tsx +492 -0
  286. package/src/kit/FileMark.tsx +56 -0
  287. package/src/kit/Inputs.tsx +250 -0
  288. package/src/kit/List.tsx +135 -0
  289. package/src/kit/Mark.tsx +64 -0
  290. package/src/kit/MarkStack.tsx +29 -0
  291. package/src/kit/Note.tsx +42 -0
  292. package/src/kit/Popover.tsx +121 -0
  293. package/src/kit/RangeField.tsx +53 -0
  294. package/src/kit/RatingField.tsx +62 -0
  295. package/src/kit/Stat.tsx +60 -0
  296. package/src/kit/Switch.tsx +28 -0
  297. package/src/kit/Tag.tsx +32 -0
  298. package/src/kit/Tile.tsx +74 -0
  299. package/src/kit/TimeField.tsx +157 -0
  300. package/src/kit/context.tsx +246 -0
  301. package/src/kit/dates.ts +150 -0
  302. package/src/kit/messages.ts +160 -0
  303. package/src/kit/numbers.ts +44 -0
  304. package/src/kit/options.ts +30 -0
  305. package/src/kit/uploads.ts +244 -0
  306. package/src/kit/waveform.ts +84 -0
  307. package/src/locale.ts +6 -0
  308. package/src/markdown.ts +69 -0
  309. package/src/marks.tsx +328 -0
  310. package/src/reveal.ts +52 -0
  311. package/src/stepGlyphs.ts +83 -0
  312. package/src/styles.css +6961 -0
  313. package/src/surface/Form.tsx +299 -0
  314. package/src/surface/Markdown.tsx +55 -0
  315. package/src/surface/Surface.tsx +605 -0
  316. package/src/surface/scope.ts +82 -0
  317. package/src/surface/values.ts +361 -0
  318. package/src/tint.ts +14 -0
  319. package/src/types.ts +596 -0
  320. package/src/useAgentFace.ts +47 -0
  321. package/src/useCall.ts +292 -0
  322. package/src/useConversation.ts +627 -0
  323. package/src/useDictation.ts +83 -0
  324. package/src/useLive.ts +115 -0
  325. package/src/usePolled.ts +60 -0
  326. package/src/voice/Orb.tsx +45 -0
  327. package/src/voice/StillOrb.tsx +29 -0
  328. package/src/voice/WebGLOrb.tsx +98 -0
  329. package/src/voice/fluidDots.tsx +171 -0
  330. package/src/voice/motion.ts +112 -0
  331. package/src/voice/orbs.ts +39 -0
  332. package/src/voice/useReducedMotion.ts +24 -0
  333. package/src/voice/wave.tsx +129 -0
  334. package/src/voice/webgl.ts +209 -0
  335. package/src/widget/css.d.ts +5 -0
  336. package/src/widget/element.tsx +535 -0
  337. package/src/widget/index.ts +10 -0
  338. package/src/widget/mount.ts +27 -0
  339. package/src/widget/widget.css +253 -0
  340. package/dist/SignalcoreProvider.d.ts +0 -113
  341. package/dist/SignalcoreProvider.js +0 -84
  342. package/dist/automations/AppMarks.d.ts +0 -11
  343. package/dist/automations/AppMarks.js +0 -18
  344. package/dist/automations/AutomationCard.d.ts +0 -27
  345. package/dist/automations/AutomationCard.js +0 -53
  346. package/dist/automations/AutomationsWindow.d.ts +0 -38
  347. package/dist/automations/AutomationsWindow.js +0 -57
  348. package/dist/automations/Card.d.ts +0 -46
  349. package/dist/automations/Card.js +0 -45
  350. package/dist/automations/ScheduleMarks.d.ts +0 -13
  351. package/dist/automations/ScheduleMarks.js +0 -24
  352. package/dist/automations/presentationIcons.d.ts +0 -7
  353. package/dist/automations/presentationIcons.js +0 -67
  354. package/dist/automations/schedule.d.ts +0 -25
  355. package/dist/automations/schedule.js +0 -59
  356. package/dist/automations/time.d.ts +0 -3
  357. package/dist/automations/time.js +0 -25
  358. package/dist/browser/BrowserView.d.ts +0 -43
  359. package/dist/browser/BrowserView.js +0 -94
  360. package/dist/browser/room.d.ts +0 -21
  361. package/dist/browser/room.js +0 -33
  362. package/dist/browser/useBrowserSession.d.ts +0 -17
  363. package/dist/browser/useBrowserSession.js +0 -67
  364. package/dist/builder/BuilderChat.d.ts +0 -32
  365. package/dist/builder/BuilderChat.js +0 -41
  366. package/dist/builder/BuilderTranscript.d.ts +0 -49
  367. package/dist/builder/BuilderTranscript.js +0 -62
  368. package/dist/builder/StatusLine.d.ts +0 -8
  369. package/dist/builder/StatusLine.js +0 -17
  370. package/dist/builder/answer.d.ts +0 -7
  371. package/dist/builder/answer.js +0 -8
  372. package/dist/builder/blocks.d.ts +0 -31
  373. package/dist/builder/blocks.js +0 -74
  374. package/dist/builder/items.d.ts +0 -15
  375. package/dist/builder/items.js +0 -21
  376. package/dist/builder/steps.d.ts +0 -20
  377. package/dist/builder/steps.js +0 -120
  378. package/dist/builder/time.d.ts +0 -4
  379. package/dist/builder/time.js +0 -24
  380. package/dist/builder/useBuildSession.d.ts +0 -36
  381. package/dist/builder/useBuildSession.js +0 -130
  382. package/dist/builder/workingOn.d.ts +0 -7
  383. package/dist/builder/workingOn.js +0 -15
  384. package/dist/chat/AgentChat.d.ts +0 -37
  385. package/dist/chat/AgentChat.js +0 -21
  386. package/dist/chat/ChatView.d.ts +0 -25
  387. package/dist/chat/ChatView.js +0 -34
  388. package/dist/chat/Composer.d.ts +0 -20
  389. package/dist/chat/Composer.js +0 -22
  390. package/dist/chat/MessageRow.d.ts +0 -22
  391. package/dist/chat/MessageRow.js +0 -32
  392. package/dist/chat/arrival.d.ts +0 -15
  393. package/dist/chat/arrival.js +0 -25
  394. package/dist/chat/history.d.ts +0 -24
  395. package/dist/chat/history.js +0 -45
  396. package/dist/chat/moments.d.ts +0 -25
  397. package/dist/chat/moments.js +0 -72
  398. package/dist/chat/types.d.ts +0 -12
  399. package/dist/chat/types.js +0 -1
  400. package/dist/chat/useComposer.d.ts +0 -46
  401. package/dist/chat/useComposer.js +0 -62
  402. package/dist/chat/useConversation.d.ts +0 -35
  403. package/dist/chat/useConversation.js +0 -71
  404. package/dist/chat/useStickToBottom.d.ts +0 -9
  405. package/dist/chat/useStickToBottom.js +0 -33
  406. package/dist/chat/useTurns.d.ts +0 -49
  407. package/dist/chat/useTurns.js +0 -111
  408. package/dist/classes.d.ts +0 -2
  409. package/dist/development.d.ts +0 -5
  410. package/dist/development.js +0 -8
  411. package/dist/flow/FlowWindow.d.ts +0 -42
  412. package/dist/flow/FlowWindow.js +0 -126
  413. package/dist/flow/index.d.ts +0 -16
  414. package/dist/flow/index.js +0 -16
  415. package/dist/flow/kinds.d.ts +0 -23
  416. package/dist/flow/kinds.js +0 -48
  417. package/dist/flow/map.d.ts +0 -44
  418. package/dist/flow/map.js +0 -225
  419. package/dist/flow/nodePaths.d.ts +0 -7
  420. package/dist/flow/nodePaths.js +0 -17
  421. package/dist/flow/relations.d.ts +0 -42
  422. package/dist/flow/relations.js +0 -174
  423. package/dist/host.d.ts +0 -124
  424. package/dist/host.js +0 -1
  425. package/dist/live/LiveView.d.ts +0 -28
  426. package/dist/live/LiveView.js +0 -55
  427. package/dist/live/capture.d.ts +0 -20
  428. package/dist/live/capture.js +0 -100
  429. package/dist/live/follow.d.ts +0 -26
  430. package/dist/live/follow.js +0 -72
  431. package/dist/live/paint.d.ts +0 -13
  432. package/dist/live/paint.js +0 -77
  433. package/dist/live/useLiveStream.d.ts +0 -16
  434. package/dist/live/useLiveStream.js +0 -57
  435. package/dist/look.d.ts +0 -33
  436. package/dist/look.js +0 -241
  437. package/dist/messages/en.d.ts +0 -3
  438. package/dist/messages/en.js +0 -251
  439. package/dist/messages/es.d.ts +0 -3
  440. package/dist/messages/es.js +0 -251
  441. package/dist/messages/index.d.ts +0 -16
  442. package/dist/messages/index.js +0 -33
  443. package/dist/messages/types.d.ts +0 -246
  444. package/dist/messages/types.js +0 -1
  445. package/dist/parts/Button.d.ts +0 -18
  446. package/dist/parts/Button.js +0 -17
  447. package/dist/parts/Icon.d.ts +0 -39
  448. package/dist/parts/Icon.js +0 -37
  449. package/dist/parts/Input.d.ts +0 -6
  450. package/dist/parts/Input.js +0 -11
  451. package/dist/parts/Spinner.d.ts +0 -2
  452. package/dist/parts/Spinner.js +0 -7
  453. package/dist/patterns.d.ts +0 -15
  454. package/dist/patterns.js +0 -5
  455. package/dist/presets.d.ts +0 -82
  456. package/dist/presets.js +0 -81
  457. package/dist/primitives.d.ts +0 -22
  458. package/dist/primitives.js +0 -58
  459. package/dist/request/RequestCard.d.ts +0 -34
  460. package/dist/request/RequestCard.js +0 -101
  461. package/dist/request/approval/ApprovalPreview.d.ts +0 -5
  462. package/dist/request/approval/ApprovalPreview.js +0 -27
  463. package/dist/request/approval/shapes.d.ts +0 -32
  464. package/dist/request/approval/shapes.js +0 -68
  465. package/dist/request/apps.d.ts +0 -11
  466. package/dist/request/apps.js +0 -27
  467. package/dist/request/cards.d.ts +0 -12
  468. package/dist/request/cards.js +0 -24
  469. package/dist/request/deliver.d.ts +0 -12
  470. package/dist/request/deliver.js +0 -21
  471. package/dist/request/handOver.d.ts +0 -18
  472. package/dist/request/handOver.js +0 -33
  473. package/dist/request/kinds/Approval.d.ts +0 -3
  474. package/dist/request/kinds/Approval.js +0 -9
  475. package/dist/request/kinds/Choice.d.ts +0 -3
  476. package/dist/request/kinds/Choice.js +0 -8
  477. package/dist/request/kinds/Connect.d.ts +0 -9
  478. package/dist/request/kinds/Connect.js +0 -119
  479. package/dist/request/kinds/FreeText.d.ts +0 -3
  480. package/dist/request/kinds/FreeText.js +0 -20
  481. package/dist/request/kinds/HandOver.d.ts +0 -13
  482. package/dist/request/kinds/HandOver.js +0 -20
  483. package/dist/request/kinds/Secret.d.ts +0 -7
  484. package/dist/request/kinds/Secret.js +0 -49
  485. package/dist/request/kinds/Upload.d.ts +0 -6
  486. package/dist/request/kinds/Upload.js +0 -47
  487. package/dist/request/types.d.ts +0 -83
  488. package/dist/request/types.js +0 -1
  489. package/dist/safeUrl.d.ts +0 -6
  490. package/dist/safeUrl.js +0 -8
  491. package/dist/stream/builder.d.ts +0 -176
  492. package/dist/stream/builder.js +0 -202
  493. package/dist/stream/reduce.d.ts +0 -51
  494. package/dist/stream/reduce.js +0 -58
  495. package/dist/stream/untilAborted.d.ts +0 -7
  496. package/dist/stream/untilAborted.js +0 -32
  497. package/dist/stream/useRunStream.d.ts +0 -26
  498. package/dist/stream/useRunStream.js +0 -137
  499. package/dist/styles.css +0 -2318
  500. package/dist/surface/HostNode.d.ts +0 -14
  501. package/dist/surface/HostNode.js +0 -30
  502. package/dist/surface/Node.d.ts +0 -7
  503. package/dist/surface/Node.js +0 -49
  504. package/dist/surface/SurfaceBoundary.d.ts +0 -26
  505. package/dist/surface/SurfaceBoundary.js +0 -20
  506. package/dist/surface/bindings.d.ts +0 -14
  507. package/dist/surface/bindings.js +0 -37
  508. package/dist/surface/check.d.ts +0 -27
  509. package/dist/surface/check.js +0 -102
  510. package/dist/surface/format.d.ts +0 -10
  511. package/dist/surface/format.js +0 -32
  512. package/dist/surface/hosts.d.ts +0 -6
  513. package/dist/surface/hosts.js +0 -11
  514. package/dist/surface/scene.d.ts +0 -21
  515. package/dist/surface/scene.js +0 -8
  516. package/dist/surface/templates/Browser.d.ts +0 -6
  517. package/dist/surface/templates/Browser.js +0 -11
  518. package/dist/surface/templates/Chart.d.ts +0 -6
  519. package/dist/surface/templates/Chart.js +0 -13
  520. package/dist/surface/templates/Choices.d.ts +0 -3
  521. package/dist/surface/templates/Choices.js +0 -12
  522. package/dist/surface/templates/Form.d.ts +0 -3
  523. package/dist/surface/templates/Form.js +0 -44
  524. package/dist/surface/templates/KeyValue.d.ts +0 -3
  525. package/dist/surface/templates/KeyValue.js +0 -7
  526. package/dist/surface/templates/Layout.d.ts +0 -5
  527. package/dist/surface/templates/Layout.js +0 -16
  528. package/dist/surface/templates/Live.d.ts +0 -6
  529. package/dist/surface/templates/Live.js +0 -9
  530. package/dist/surface/templates/Media.d.ts +0 -5
  531. package/dist/surface/templates/Media.js +0 -13
  532. package/dist/surface/templates/Slots.d.ts +0 -3
  533. package/dist/surface/templates/Slots.js +0 -19
  534. package/dist/surface/templates/Table.d.ts +0 -3
  535. package/dist/surface/templates/Table.js +0 -12
  536. package/dist/surface/templates/Text.d.ts +0 -4
  537. package/dist/surface/templates/Text.js +0 -15
  538. package/dist/surface/templates/index.d.ts +0 -7
  539. package/dist/surface/templates/index.js +0 -32
  540. package/dist/surface/types.d.ts +0 -68
  541. package/dist/surface/types.js +0 -6
  542. package/dist/theme.d.ts +0 -62
  543. package/dist/theme.js +0 -9
  544. package/dist/useTokens.d.ts +0 -7
  545. package/dist/useTokens.js +0 -41
  546. package/dist/voice/VoiceWindow.d.ts +0 -18
  547. package/dist/voice/VoiceWindow.js +0 -35
  548. package/dist/voice/index.d.ts +0 -13
  549. package/dist/voice/index.js +0 -12
  550. package/dist/voice/meter.d.ts +0 -16
  551. package/dist/voice/meter.js +0 -52
  552. package/dist/voice/orbColors.d.ts +0 -16
  553. package/dist/voice/orbColors.js +0 -75
  554. package/dist/voice/pushable.d.ts +0 -16
  555. package/dist/voice/pushable.js +0 -56
  556. package/dist/voice/useDictation.d.ts +0 -24
  557. package/dist/voice/useDictation.js +0 -60
  558. package/dist/voice/useReducedMotion.d.ts +0 -5
  559. package/dist/voice/useVoice.d.ts +0 -70
  560. package/dist/voice/useVoice.js +0 -197
  561. package/dist/voice/useVoicePrimitives.d.ts +0 -7
  562. package/dist/voice/useVoicePrimitives.js +0 -11
  563. package/dist/voice/voice.d.ts +0 -55
  564. package/dist/voice/voice.js +0 -9
  565. package/dist/voice/webSpeech.d.ts +0 -33
  566. package/dist/voice/webSpeech.js +0 -258
  567. package/dist/widget.js.map +0 -1
  568. package/dist/windows/AgentSpace.d.ts +0 -78
  569. package/dist/windows/AgentSpace.js +0 -135
  570. package/dist/windows/Captions.d.ts +0 -13
  571. package/dist/windows/Captions.js +0 -22
  572. package/dist/windows/Dock.d.ts +0 -37
  573. package/dist/windows/Dock.js +0 -22
  574. package/dist/windows/Journal.d.ts +0 -15
  575. package/dist/windows/Journal.js +0 -19
  576. package/dist/windows/KindMark.d.ts +0 -7
  577. package/dist/windows/KindMark.js +0 -31
  578. package/dist/windows/Pending.d.ts +0 -8
  579. package/dist/windows/Pending.js +0 -17
  580. package/dist/windows/Stage.d.ts +0 -18
  581. package/dist/windows/Stage.js +0 -21
  582. package/dist/windows/StatusLabel.d.ts +0 -9
  583. package/dist/windows/StatusLabel.js +0 -7
  584. package/dist/windows/Strip.d.ts +0 -17
  585. package/dist/windows/Strip.js +0 -42
  586. package/dist/windows/SurfaceWindow.d.ts +0 -20
  587. package/dist/windows/SurfaceWindow.js +0 -12
  588. package/dist/windows/WindowFrame.d.ts +0 -23
  589. package/dist/windows/WindowFrame.js +0 -22
  590. package/dist/windows/hearing.d.ts +0 -11
  591. package/dist/windows/hearing.js +0 -26
  592. package/dist/windows/kinds.d.ts +0 -47
  593. package/dist/windows/kinds.js +0 -28
  594. package/dist/windows/reduce.d.ts +0 -98
  595. package/dist/windows/reduce.js +0 -151
  596. package/dist/windows/registry.d.ts +0 -18
  597. package/dist/windows/registry.js +0 -61
  598. package/dist/windows/reveal.d.ts +0 -9
  599. package/dist/windows/reveal.js +0 -6
  600. package/dist/windows/space.d.ts +0 -21
  601. package/dist/windows/space.js +0 -6
  602. package/dist/windows/status.d.ts +0 -11
  603. package/dist/windows/status.js +0 -30
  604. package/dist/windows/types.d.ts +0 -15
  605. package/dist/windows/types.js +0 -1
  606. package/dist/windows/useLoaded.d.ts +0 -44
  607. package/dist/windows/useLoaded.js +0 -58
  608. package/dist/windows/useUnread.d.ts +0 -7
  609. package/dist/windows/useUnread.js +0 -21
  610. package/dist/windows/useWindows.d.ts +0 -70
  611. package/dist/windows/useWindows.js +0 -60
@@ -0,0 +1,442 @@
1
+ import {
2
+ ArrowsInSimpleIcon,
3
+ ArrowsOutSimpleIcon,
4
+ HandIcon,
5
+ LockSimpleIcon,
6
+ XIcon,
7
+ } from "@phosphor-icons/react";
8
+ import {
9
+ useEffect,
10
+ useLayoutEffect,
11
+ useRef,
12
+ useState,
13
+ type CSSProperties,
14
+ type RefObject,
15
+ } from "react";
16
+
17
+ import { capture, handOverWaiting, painterOn, siteOf } from "./browser";
18
+ import { classes } from "./classes";
19
+ import { Button } from "./kit/Button";
20
+ import type { BrowserState } from "./types";
21
+ import type { LiveConversation } from "./useConversation";
22
+
23
+ /** The words the browser says; a host gives its own, in its language. */
24
+ export interface BrowserMessages {
25
+ /** Who holds it: the agent, by its name. */
26
+ agent: (name: string) => string;
27
+ /** Who holds it: the agent, in the owner's own Chrome. */
28
+ agentMine: (name: string) => string;
29
+ /** Who holds it: the person. */
30
+ person: string;
31
+ /** Take it from the agent. */
32
+ take: string;
33
+ /** Give it back to the agent, after taking it. */
34
+ giveBack: string;
35
+ /** The agent handed it over: what heads its reason. */
36
+ handedOver: (name: string) => string;
37
+ /** The person is done with what the agent handed over: the agent goes on. */
38
+ done: string;
39
+ /** A hand-over waits, but the browser closed meanwhile (nobody used it for a while). */
40
+ closed: string;
41
+ expand: string;
42
+ shrink: string;
43
+ /** The way to close it now: it stops running, and being billed. */
44
+ close: string;
45
+ /** Where the browser is when it shows no web page. */
46
+ blank: string;
47
+ /** The screen's name, for those who cannot see it. */
48
+ screen: (where: string) => string;
49
+ }
50
+
51
+ export const BROWSER_MESSAGES: BrowserMessages = {
52
+ agent: (name) => `${name} is browsing`,
53
+ agentMine: (name) => `${name}, in your Chrome`,
54
+ person: "You're in control",
55
+ take: "Take control",
56
+ giveBack: "Give it back",
57
+ handedOver: (name) => `${name} hands you the browser`,
58
+ done: "Done, go on",
59
+ closed: "The browser closed while it waited for you.",
60
+ expand: "Enlarge",
61
+ shrink: "Shrink",
62
+ close: "Close the browser",
63
+ blank: "Blank page",
64
+ screen: (where) => `Browser: ${where}`,
65
+ };
66
+
67
+ /** The browser's parts, by the class each carries; `classNames` adds a host's own under the same keys. */
68
+ export type BrowserPart =
69
+ | "sc-browser"
70
+ | "sc-browser--large"
71
+ | "sc-browser--yours"
72
+ | "sc-browser--handed"
73
+ | "sc-browser--closed"
74
+ | "sc-browser__bar"
75
+ | "sc-browser__who"
76
+ | "sc-browser__address"
77
+ | "sc-browser__title"
78
+ | "sc-browser__controls"
79
+ | "sc-browser__handover"
80
+ | "sc-browser__screen"
81
+ | "sc-browser__screen--waiting"
82
+ | "sc-browser__canvas";
83
+
84
+ export interface BrowserViewProps {
85
+ /** The conversation the browser is of (`useConversation`). */
86
+ live: LiveConversation;
87
+ /** The agent's name, for the words that say it holds the browser. */
88
+ name: string;
89
+ messages?: Partial<BrowserMessages> | undefined;
90
+ classNames?: Partial<Record<BrowserPart, string>> | undefined;
91
+ }
92
+
93
+ /**
94
+ * The browser the agent drives, live, while the conversation has one: a compact tile while the
95
+ * agent works (its screen small, where it is, who holds it), which the person can enlarge or
96
+ * take over. Taken, or handed over by the agent, it glides open large and the person's pointer
97
+ * and keys go to the page; a hand-over says why, ringed in the accent, and "done" gives the
98
+ * browser back, the panel gliding small again, and lets the agent go on. Draws nothing when
99
+ * there is no browser, unless a hand-over still waits for one that closed: then the person can
100
+ * go on without it.
101
+ */
102
+ export function BrowserView({ live, name, messages, classNames }: BrowserViewProps) {
103
+ const words = { ...BROWSER_MESSAGES, ...messages };
104
+ const { browser } = live;
105
+ // The hand-over answered here, so it is never answered twice while its echo is on its way.
106
+ const [answered, setAnswered] = useState<string | null>(null);
107
+ const answer = (wait: string) => {
108
+ if (answered === wait) return;
109
+ if (live.act({ surface: wait, name: "done", data: {}, label: words.done })) setAnswered(wait);
110
+ };
111
+
112
+ if (browser === null) {
113
+ const waiting = handOverWaiting(live.messages, live.awaiting);
114
+ if (waiting === null || waiting === answered) return null;
115
+ return (
116
+ <section className={classes(classNames, "sc-browser", "sc-browser--closed")}>
117
+ <p className={classes(classNames, "sc-browser__handover")}>
118
+ <HandIcon aria-hidden weight="fill" />
119
+ <span>{words.closed}</span>
120
+ <Button tone="primary" size="sm" onClick={() => answer(waiting)}>
121
+ {words.done}
122
+ </Button>
123
+ </p>
124
+ </section>
125
+ );
126
+ }
127
+ return (
128
+ <Panel
129
+ live={live}
130
+ browser={browser}
131
+ name={name}
132
+ words={words}
133
+ classNames={classNames}
134
+ answered={answered}
135
+ onDone={answer}
136
+ />
137
+ );
138
+ }
139
+
140
+ /**
141
+ * How the panel is laid out: small, its screen beside its words; large, under them; or handed
142
+ * over, large with why the agent stopped and the way to go on.
143
+ */
144
+ type Look = { shape: "small" | "large" } | { shape: "handed"; wait: string; reason: string | null };
145
+
146
+ function Panel({
147
+ live,
148
+ browser,
149
+ name,
150
+ words,
151
+ classNames,
152
+ answered,
153
+ onDone,
154
+ }: {
155
+ live: LiveConversation;
156
+ browser: BrowserState;
157
+ name: string;
158
+ words: BrowserMessages;
159
+ classNames: Partial<Record<BrowserPart, string>> | undefined;
160
+ answered: string | null;
161
+ onDone: (wait: string) => void;
162
+ }) {
163
+ const [expanded, setExpanded] = useState(false);
164
+ // A hand-over the person answered here is over for them at once: the panel goes back while
165
+ // the word that the agent holds the browser again is on its way.
166
+ const settling = browser.wait !== null && browser.wait === answered;
167
+ const yours = browser.control === "person" && !settling;
168
+ const panel = useRef<HTMLElement>(null);
169
+ const bar = useRef<HTMLElement>(null);
170
+ const canvas = useRef<HTMLCanvasElement>(null);
171
+ const look = useGlide(
172
+ browser.wait !== null && !settling
173
+ ? { shape: "handed", wait: browser.wait, reason: browser.reason }
174
+ : { shape: yours || expanded ? "large" : "small" },
175
+ panel,
176
+ bar,
177
+ canvas,
178
+ );
179
+ const large = look.shape !== "small";
180
+ const { host, rest } = siteOf(browser.url);
181
+ const where = browser.title || host || words.blank;
182
+ const looks: BrowserPart[] = [];
183
+ if (large) looks.push("sc-browser--large");
184
+ if (yours) looks.push("sc-browser--yours");
185
+ if (look.shape === "handed") looks.push("sc-browser--handed");
186
+
187
+ return (
188
+ <section
189
+ ref={panel}
190
+ aria-label={words.screen(where)}
191
+ className={classes(classNames, "sc-browser", ...looks)}
192
+ >
193
+ <header ref={bar} className={classes(classNames, "sc-browser__bar")}>
194
+ <p className={classes(classNames, "sc-browser__who")}>
195
+ <i aria-hidden />
196
+ <span>
197
+ {yours
198
+ ? words.person
199
+ : browser.where === "mine"
200
+ ? words.agentMine(name)
201
+ : words.agent(name)}
202
+ </span>
203
+ </p>
204
+ <p title={browser.url} className={classes(classNames, "sc-browser__address")}>
205
+ {host ? (
206
+ <>
207
+ <LockSimpleIcon aria-hidden weight="bold" />
208
+ <strong>{host}</strong>
209
+ <span>{rest}</span>
210
+ </>
211
+ ) : (
212
+ <span>{words.blank}</span>
213
+ )}
214
+ </p>
215
+ {!large && browser.title !== "" && (
216
+ <p className={classes(classNames, "sc-browser__title")}>{browser.title}</p>
217
+ )}
218
+ <div className={classes(classNames, "sc-browser__controls")}>
219
+ {look.shape !== "handed" &&
220
+ !settling &&
221
+ (yours ? (
222
+ <Button size="sm" onClick={() => live.control("agent")}>
223
+ {words.giveBack}
224
+ </Button>
225
+ ) : (
226
+ <Button size="sm" onClick={() => live.control("person")}>
227
+ {words.take}
228
+ </Button>
229
+ ))}
230
+ {!yours && (
231
+ <Button
232
+ size="sm"
233
+ tone="ghost"
234
+ icon={expanded ? ArrowsInSimpleIcon : ArrowsOutSimpleIcon}
235
+ aria-label={expanded ? words.shrink : words.expand}
236
+ title={expanded ? words.shrink : words.expand}
237
+ onClick={() => setExpanded((open) => !open)}
238
+ />
239
+ )}
240
+ <Button
241
+ size="sm"
242
+ tone="ghost"
243
+ icon={XIcon}
244
+ aria-label={words.close}
245
+ title={words.close}
246
+ onClick={() => live.closeBrowser()}
247
+ />
248
+ </div>
249
+ </header>
250
+ {look.shape === "handed" && (
251
+ <div className={classes(classNames, "sc-browser__handover")}>
252
+ <HandIcon aria-hidden weight="fill" />
253
+ <p>
254
+ <strong>{words.handedOver(name)}</strong>
255
+ {look.reason && <span>{look.reason}</span>}
256
+ </p>
257
+ <Button tone="primary" size="sm" onClick={() => onDone(look.wait)}>
258
+ {words.done}
259
+ </Button>
260
+ </div>
261
+ )}
262
+ <Screen
263
+ live={live}
264
+ browser={browser}
265
+ canvas={canvas}
266
+ interactive={yours}
267
+ label={words.screen(where)}
268
+ classNames={classNames}
269
+ onOpen={large ? undefined : () => setExpanded(true)}
270
+ />
271
+ </section>
272
+ );
273
+ }
274
+
275
+ /** v2's expand: half a second, quick to leave and slow to land. */
276
+ const GLIDE: KeyframeAnimationOptions = {
277
+ duration: 500,
278
+ easing: "cubic-bezier(0.22, 1, 0.36, 1)",
279
+ };
280
+ /** The words around the screen, laid out anew, come in once it is under way. */
281
+ const ARRIVE: KeyframeAnimationOptions = {
282
+ duration: 240,
283
+ delay: 140,
284
+ easing: "ease-out",
285
+ fill: "backwards",
286
+ };
287
+
288
+ /** How tall the panel stands, and where its screen is within it, as shown. */
289
+ interface Layout {
290
+ height: number;
291
+ x: number;
292
+ y: number;
293
+ width: number;
294
+ tall: number;
295
+ }
296
+
297
+ function layoutOf(panel: HTMLElement, screen: HTMLElement): Layout {
298
+ const outer = panel.getBoundingClientRect();
299
+ const inner = screen.getBoundingClientRect();
300
+ return {
301
+ height: outer.height,
302
+ x: inner.left - outer.left,
303
+ y: inner.top - outer.top,
304
+ width: inner.width,
305
+ tall: inner.height,
306
+ };
307
+ }
308
+
309
+ /** Whoever asked their system for less motion gets none. */
310
+ function still(): boolean {
311
+ return (
312
+ typeof window.matchMedia === "function" &&
313
+ window.matchMedia("(prefers-reduced-motion: reduce)").matches
314
+ );
315
+ }
316
+
317
+ /**
318
+ * The look the panel shows: `wanted`, one layout later when its shape changes, so the panel is
319
+ * measured as it stands before it changes and glides from there to where it lands (its height,
320
+ * so the conversation above gives way smoothly, and its screen's place and size, by a
321
+ * transform) instead of jumping; its words come in over the move. A change midway starts from
322
+ * wherever the glide had got to. The same shape shows what is wanted at once.
323
+ */
324
+ function useGlide(
325
+ wanted: Look,
326
+ panel: RefObject<HTMLElement | null>,
327
+ bar: RefObject<HTMLElement | null>,
328
+ canvas: RefObject<HTMLCanvasElement | null>,
329
+ ): Look {
330
+ const [shown, setShown] = useState(wanted);
331
+ const from = useRef<Layout | null>(null);
332
+ const moving = useRef<Animation[]>([]);
333
+ const changing = shown.shape !== wanted.shape;
334
+
335
+ useLayoutEffect(() => {
336
+ if (!changing) return;
337
+ const outer = panel.current;
338
+ const screen = canvas.current;
339
+ const glides = outer !== null && screen !== null && typeof outer.animate === "function";
340
+ from.current = glides && !still() ? layoutOf(outer, screen) : null;
341
+ for (const animation of moving.current) animation.cancel();
342
+ moving.current = [];
343
+ setShown(wanted);
344
+ });
345
+
346
+ useLayoutEffect(() => {
347
+ const first = from.current;
348
+ from.current = null;
349
+ const outer = panel.current;
350
+ const screen = canvas.current;
351
+ if (first === null || outer === null || screen === null) return;
352
+ const last = layoutOf(outer, screen);
353
+ if (last.width === 0 || last.tall === 0) return;
354
+ const shift = `translate(${first.x - last.x}px, ${first.y - last.y}px)`;
355
+ const scale = `scale(${first.width / last.width}, ${first.tall / last.tall})`;
356
+ moving.current = [
357
+ outer.animate([{ height: `${first.height}px` }, { height: `${last.height}px` }], GLIDE),
358
+ screen.animate([{ transform: `${shift} ${scale}` }, { transform: "none" }], GLIDE),
359
+ ];
360
+ if (bar.current) {
361
+ moving.current.push(bar.current.animate([{ opacity: 0 }, { opacity: 1 }], ARRIVE));
362
+ }
363
+ }, [shown.shape, panel, bar, canvas]);
364
+
365
+ return changing ? shown : wanted;
366
+ }
367
+
368
+ /**
369
+ * The screen: the browser's pictures painted on a canvas as they come, the latest only. While
370
+ * the person holds the browser it takes their pointer and keys (and the focus, so they can type
371
+ * at once); otherwise it is only watched, and the small one opens large on a click. Until the
372
+ * first picture lands, a quiet light sweeps where it will be.
373
+ */
374
+ function Screen({
375
+ live,
376
+ browser,
377
+ canvas,
378
+ interactive,
379
+ label,
380
+ classNames,
381
+ onOpen,
382
+ }: {
383
+ live: LiveConversation;
384
+ browser: BrowserState;
385
+ canvas: RefObject<HTMLCanvasElement | null>;
386
+ interactive: boolean;
387
+ label: string;
388
+ classNames: Partial<Record<BrowserPart, string>> | undefined;
389
+ onOpen: (() => void) | undefined;
390
+ }) {
391
+ const { watchScreen, input } = live;
392
+ const { width, height } = browser;
393
+ const [painted, setPainted] = useState(false);
394
+
395
+ useEffect(() => {
396
+ const element = canvas.current;
397
+ if (!element) return undefined;
398
+ let first = true;
399
+ const painter = painterOn(element, () => {
400
+ if (!first) return;
401
+ first = false;
402
+ setPainted(true);
403
+ });
404
+ const stop = watchScreen((frame) => {
405
+ painter.paint(frame.jpeg);
406
+ });
407
+ return () => {
408
+ stop();
409
+ painter.dispose();
410
+ };
411
+ }, [watchScreen, width, height, canvas]);
412
+
413
+ // `input` is new each render; the capture reads the latest without starting over.
414
+ const send = useRef(input);
415
+ useLayoutEffect(() => {
416
+ send.current = input;
417
+ });
418
+ useEffect(() => {
419
+ const element = canvas.current;
420
+ if (!element || !interactive) return undefined;
421
+ element.focus({ preventScroll: true });
422
+ return capture(element, { width, height }, (event) => send.current(event));
423
+ }, [interactive, width, height, canvas]);
424
+
425
+ const parts: BrowserPart[] = ["sc-browser__screen"];
426
+ if (!painted) parts.push("sc-browser__screen--waiting");
427
+ return (
428
+ <div className={classes(classNames, ...parts)}>
429
+ <canvas
430
+ ref={canvas}
431
+ role="img"
432
+ aria-label={label}
433
+ width={width}
434
+ height={height}
435
+ tabIndex={interactive ? 0 : undefined}
436
+ style={{ "--_ratio": String(width / height) } as CSSProperties}
437
+ onClick={onOpen}
438
+ className={classes(classNames, "sc-browser__canvas")}
439
+ />
440
+ </div>
441
+ );
442
+ }