@signalcore/ui 0.1.0 → 1.0.0-beta.1

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 +1127 -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 +541 -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 +1812 -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 +271 -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 +6970 -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 +604 -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,83 @@
1
+ import { useCallback, useEffect, useRef, useState } from "react";
2
+
3
+ /** Turns a recording into words: the host's (its server's speech to text). */
4
+ export type Dictate = (audio: Blob) => Promise<string>;
5
+
6
+ /** Where a dictation is: nothing, the microphone open, the words on their way, or refused. */
7
+ export type Dictation = "idle" | "listening" | "writing" | "failed";
8
+
9
+ /**
10
+ * Dictation in the composer: a press opens the microphone, the next one closes it and hands the
11
+ * recording to the host's `dictate`, whose words go to `onWords`. Without `dictate`, or in a
12
+ * browser that cannot record, it is not `available`. Leaving mid-recording stops the microphone.
13
+ */
14
+ export function useDictation(
15
+ dictate: Dictate | undefined,
16
+ onWords: (words: string) => void,
17
+ ): { available: boolean; state: Dictation; toggle: () => void } {
18
+ const [state, setState] = useState<Dictation>("idle");
19
+ const recorder = useRef<MediaRecorder | null>(null);
20
+ const said = useRef(onWords);
21
+ said.current = onWords;
22
+ const available =
23
+ dictate !== undefined &&
24
+ typeof MediaRecorder !== "undefined" &&
25
+ typeof navigator !== "undefined" &&
26
+ navigator.mediaDevices !== undefined;
27
+
28
+ useEffect(
29
+ () => () => {
30
+ const open = recorder.current;
31
+ recorder.current = null;
32
+ if (open !== null && open.state !== "inactive") {
33
+ open.onstop = null;
34
+ open.stop();
35
+ open.stream.getTracks().forEach((track) => {
36
+ track.stop();
37
+ });
38
+ }
39
+ },
40
+ [],
41
+ );
42
+
43
+ const start = useCallback(async () => {
44
+ if (dictate === undefined) return;
45
+ let stream: MediaStream;
46
+ try {
47
+ stream = await navigator.mediaDevices.getUserMedia({ audio: true });
48
+ } catch {
49
+ setState("failed");
50
+ return;
51
+ }
52
+ const open = new MediaRecorder(stream);
53
+ const chunks: Blob[] = [];
54
+ open.ondataavailable = (event) => {
55
+ if (event.data.size > 0) chunks.push(event.data);
56
+ };
57
+ open.onstop = () => {
58
+ stream.getTracks().forEach((track) => {
59
+ track.stop();
60
+ });
61
+ recorder.current = null;
62
+ setState("writing");
63
+ dictate(new Blob(chunks, { type: open.mimeType || "audio/webm" }))
64
+ .then((words) => {
65
+ if (words !== "") said.current(words);
66
+ setState("idle");
67
+ })
68
+ .catch(() => {
69
+ setState("failed");
70
+ });
71
+ };
72
+ recorder.current = open;
73
+ open.start();
74
+ setState("listening");
75
+ }, [dictate]);
76
+
77
+ const toggle = useCallback(() => {
78
+ if (state === "listening") recorder.current?.stop();
79
+ else if (state === "idle" || state === "failed") void start();
80
+ }, [state, start]);
81
+
82
+ return { available, state, toggle };
83
+ }
package/src/useLive.ts ADDED
@@ -0,0 +1,115 @@
1
+ import { useEffect, useEffectEvent, useRef, useState } from "react";
2
+
3
+ import type { Client } from "./client";
4
+ import { frameOf, type Frame, type UpFrame } from "./frames";
5
+
6
+ export interface LiveHandlers {
7
+ /** Every frame the socket sends, as it comes. */
8
+ onFrame: (frame: Frame) => void;
9
+ /** The socket is open; `again` when it had been before, so what was stored meanwhile can be read. */
10
+ onOpen?: ((again: boolean) => void) | undefined;
11
+ }
12
+
13
+ /** A conversation's socket: whether it is open, and the way to speak up it. */
14
+ export interface Live {
15
+ open: boolean;
16
+ /** Sends a frame up; false when the socket is not open. */
17
+ send: (frame: UpFrame) => boolean;
18
+ }
19
+
20
+ /** How long to wait before trying again after the nth failure in a row: 1s, 2s, 4s, 8s, then 10s. */
21
+ export function retryDelay(failures: number): number {
22
+ return Math.min(1000 * 2 ** failures, 10_000);
23
+ }
24
+
25
+ /**
26
+ * The socket of conversation `conversationId`, held for as long as the component lives: frames
27
+ * down to `onFrame`, `send` up. A turn runs on the server apart from the socket, so a socket that
28
+ * drops opens again, waiting longer each time; `onOpen` then says it is not the first time, and a
29
+ * turn still running is told again from its start. A socket that could not open may have carried
30
+ * a token that expired: the next try asks the client for a fresh one, once until one opens. The
31
+ * raw layer: what a host draws its own things over.
32
+ */
33
+ export function useLive(
34
+ client: Client,
35
+ conversationId: string,
36
+ { onFrame, onOpen }: LiveHandlers,
37
+ ): Live {
38
+ const [open, setOpen] = useState(false);
39
+ const socket = useRef<WebSocket | null>(null);
40
+ // The handlers as the host last gave them, without the socket opening again for each render.
41
+ const frame = useEffectEvent(onFrame);
42
+ const opened = useEffectEvent((again: boolean) => onOpen?.(again));
43
+
44
+ useEffect(() => {
45
+ let current: WebSocket | null = null;
46
+ let failures = 0;
47
+ let before = false;
48
+ let stopped = false;
49
+ // Whether the next try asks for a fresh credential: once after a socket that never opened.
50
+ let fresh = false;
51
+ let renewed = false;
52
+ let retry: ReturnType<typeof setTimeout> | undefined;
53
+
54
+ const again = () => {
55
+ setOpen(false);
56
+ retry = setTimeout(connect, retryDelay(failures));
57
+ failures += 1;
58
+ };
59
+
60
+ const open = (url: string) => {
61
+ const live = new WebSocket(url);
62
+ let opens = false;
63
+ current = live;
64
+ socket.current = live;
65
+ live.onopen = () => {
66
+ opens = true;
67
+ failures = 0;
68
+ renewed = false;
69
+ setOpen(true);
70
+ opened(before);
71
+ before = true;
72
+ };
73
+ live.onmessage = (event: MessageEvent) => {
74
+ const next = frameOf(event.data);
75
+ if (next) frame(next);
76
+ };
77
+ live.onclose = () => {
78
+ if (stopped) return;
79
+ fresh = !opens && !renewed;
80
+ again();
81
+ };
82
+ };
83
+
84
+ function connect() {
85
+ renewed ||= fresh;
86
+ client.liveUrl(conversationId, { fresh }).then(
87
+ (url) => {
88
+ if (!stopped) open(url);
89
+ },
90
+ // No address (the host's backend gave no token): tried again like a socket that dropped.
91
+ () => {
92
+ if (!stopped) again();
93
+ },
94
+ );
95
+ fresh = false;
96
+ }
97
+
98
+ connect();
99
+ return () => {
100
+ stopped = true;
101
+ clearTimeout(retry);
102
+ socket.current = null;
103
+ current?.close();
104
+ };
105
+ }, [client, conversationId]);
106
+
107
+ const send = (up: UpFrame): boolean => {
108
+ const live = socket.current;
109
+ if (live?.readyState !== WebSocket.OPEN) return false;
110
+ live.send(JSON.stringify(up));
111
+ return true;
112
+ };
113
+
114
+ return { open, send };
115
+ }
@@ -0,0 +1,60 @@
1
+ import { useEffect, useRef, useState } from "react";
2
+
3
+ import { ApiError } from "./client";
4
+
5
+ /** What a read gave: the value once it came, why it failed, or that it is no longer there. */
6
+ export interface Polled<T> {
7
+ value: T | null;
8
+ problem: unknown;
9
+ gone: boolean;
10
+ }
11
+
12
+ /** How often something still moving (a run under way) is read again. */
13
+ export const POLL_MS = 3000;
14
+
15
+ /**
16
+ * Reads `load` when `key` changes, and again every `POLL_MS` while `moving` says what it gave is
17
+ * still moving (a run under way). What was read stays while a new read is on its way, so nothing
18
+ * flickers; a 404 reads as gone.
19
+ */
20
+ export function usePolled<T>(
21
+ load: () => Promise<T>,
22
+ key: string,
23
+ moving: (value: T) => boolean,
24
+ ): Polled<T> {
25
+ const [polled, setPolled] = useState<Polled<T> & { key: string }>({
26
+ key,
27
+ value: null,
28
+ problem: null,
29
+ gone: false,
30
+ });
31
+ const latest = useRef({ load, moving });
32
+ useEffect(() => {
33
+ latest.current = { load, moving };
34
+ });
35
+
36
+ useEffect(() => {
37
+ let stopped = false;
38
+ let timer: ReturnType<typeof setTimeout> | undefined;
39
+ const read = async () => {
40
+ try {
41
+ const value = await latest.current.load();
42
+ if (stopped) return;
43
+ setPolled({ key, value, problem: null, gone: false });
44
+ if (latest.current.moving(value)) timer = setTimeout(() => void read(), POLL_MS);
45
+ } catch (error) {
46
+ if (stopped) return;
47
+ const gone = error instanceof ApiError && error.status === 404;
48
+ setPolled((last) => ({ ...last, key, problem: gone ? null : error, gone }));
49
+ }
50
+ };
51
+ void read();
52
+ return () => {
53
+ stopped = true;
54
+ clearTimeout(timer);
55
+ };
56
+ }, [key]);
57
+
58
+ // Another key's value is not this one's: until its own comes, nothing is shown.
59
+ return polled.key === key ? polled : { value: null, problem: null, gone: false };
60
+ }
@@ -0,0 +1,45 @@
1
+ import { lazy, Suspense, type ComponentType } from "react";
2
+
3
+ import { joined, useParts } from "../kit/context";
4
+ import { DEFAULT_ORB, ORB_SIZE, type OrbProps, type OrbStyle } from "./orbs";
5
+
6
+ /**
7
+ * Each style is a module of its own, loaded when an orb of that style is first drawn: a host that
8
+ * never calls loads none of them, and one that does loads the one it uses (a fragment shader
9
+ * each, and the little WebGL they share).
10
+ */
11
+ const STYLES: Readonly<Record<OrbStyle, ComponentType<OrbProps>>> = {
12
+ wave: lazy(() => import("./wave")),
13
+ "fluid-dots": lazy(() => import("./fluidDots")),
14
+ };
15
+
16
+ /**
17
+ * The orb of a voice conversation with an agent: a shape that shows where it stands and how loud
18
+ * it is, in one of two styles (`wave`, the default; `fluid-dots`). Both follow the level while
19
+ * listening and speaking, rest when nothing happens, and stand still under
20
+ * `prefers-reduced-motion`, one frame per state. They are shaders: each paints its own colours,
21
+ * on a transparent canvas. Where WebGL is missing or lost, a still disc in a ring takes its place.
22
+ */
23
+ export function Orb({ style = DEFAULT_ORB, ...props }: OrbProps) {
24
+ // A style the package does not have (a host's data, say) is drawn as the default.
25
+ const Style = STYLES[style] ?? STYLES[DEFAULT_ORB];
26
+ return (
27
+ <Suspense fallback={<Waiting {...props} />}>
28
+ <Style {...props} />
29
+ </Suspense>
30
+ );
31
+ }
32
+
33
+ /** What stands where the orb will be while its style loads: its box, named, with nothing in it. */
34
+ function Waiting({ state, size = ORB_SIZE, label, className }: Omit<OrbProps, "style">) {
35
+ const part = useParts();
36
+ return (
37
+ <div
38
+ role="img"
39
+ aria-label={label}
40
+ part="orb"
41
+ className={joined(part("sc-orb", `sc-orb--${state}`, "sc-orb--loading"), className)}
42
+ style={{ width: size, height: size }}
43
+ />
44
+ );
45
+ }
@@ -0,0 +1,29 @@
1
+ import { joined, useParts } from "../kit/context";
2
+ import { ORB_SIZE, type OrbProps } from "./orbs";
3
+
4
+ /**
5
+ * An orb that does not move: a disc inside a ring, which says the state by its outline (thin at
6
+ * rest, solid while listening, dashed while thinking, double while speaking) and by the words
7
+ * around it, never by movement. It is what the shader styles are where WebGL is not there (no
8
+ * context, a shader that does not compile, a context the browser took away).
9
+ */
10
+ export function StillOrb({
11
+ state,
12
+ size = ORB_SIZE,
13
+ label,
14
+ className,
15
+ }: Pick<OrbProps, "state" | "size" | "label" | "className">) {
16
+ const part = useParts();
17
+ return (
18
+ <div
19
+ role="img"
20
+ aria-label={label}
21
+ part="orb"
22
+ className={joined(part("sc-orb", `sc-orb--${state}`, "sc-orb--still"), className)}
23
+ style={{ width: size, height: size }}
24
+ >
25
+ <span aria-hidden className={part("sc-orb__ring")} />
26
+ <span aria-hidden className={part("sc-orb__core")} />
27
+ </div>
28
+ );
29
+ }
@@ -0,0 +1,98 @@
1
+ import { useEffect, useRef, useState } from "react";
2
+
3
+ import { joined, useParts } from "../kit/context";
4
+ import { animate, drawStill, motionOf, type Motion } from "./motion";
5
+ import { ORB_SIZE, type OrbProps } from "./orbs";
6
+ import { StillOrb } from "./StillOrb";
7
+ import { useReducedMotion } from "./useReducedMotion";
8
+ import { createRenderer, inkOf, type Renderer, type Shader } from "./webgl";
9
+
10
+ /** The canvas is drawn at this fraction of its size and scaled up by the browser: the shaders are soft. */
11
+ const RENDER_SCALE = 0.75;
12
+
13
+ /** The level as it is now: given, or read off its meter. */
14
+ const read = (level: OrbProps["level"]): number => (typeof level === "function" ? level() : level);
15
+
16
+ type WebGLOrbProps = Omit<OrbProps, "style"> & { shader: Shader };
17
+
18
+ /**
19
+ * The body both shader styles share: a box that carries the orb's name and a canvas the shader
20
+ * paints on, frame by frame, from refs. Nothing here renders again in React for a frame: the level
21
+ * and the state are read by the loop (`animate`) when a frame is due.
22
+ *
23
+ * The loop runs only while something moves. It asks for no frame while the tab is hidden, and
24
+ * stops three seconds after the state became `idle`; a new state, the tab coming back or a new
25
+ * size starts it again. Under `prefers-reduced-motion` there is no loop at all: one frame per
26
+ * state, at a fixed moment. Where WebGL is missing, the shader does not compile or the browser
27
+ * takes the context away, the orb is the still one, with the same name. A host's colour
28
+ * (`--sc-orb-color`) is read off the canvas with each state, and the shader paints in it.
29
+ */
30
+ export function WebGLOrb({
31
+ shader,
32
+ state,
33
+ level,
34
+ size = ORB_SIZE,
35
+ label,
36
+ className,
37
+ }: WebGLOrbProps) {
38
+ const part = useParts();
39
+ const still = useReducedMotion();
40
+ const [broken, setBroken] = useState(false);
41
+ const surface = useRef<HTMLCanvasElement>(null);
42
+ const renderer = useRef<Renderer | undefined>(undefined);
43
+ const loud = useRef(level);
44
+ const motion = useRef<Motion | null>(null);
45
+
46
+ useEffect(() => {
47
+ loud.current = level;
48
+ });
49
+
50
+ // The program is made when the orb appears (once for its shader and size), not for each state.
51
+ useEffect(() => {
52
+ const canvas = surface.current;
53
+ if (!canvas) return undefined;
54
+ const made = createRenderer(canvas, shader.fragment, Math.round(size * RENDER_SCALE), () => {
55
+ setBroken(true);
56
+ });
57
+ if (!made) {
58
+ setBroken(true);
59
+ return undefined;
60
+ }
61
+ renderer.current = made;
62
+ return () => {
63
+ made.dispose();
64
+ renderer.current = undefined;
65
+ };
66
+ }, [shader, size]);
67
+
68
+ useEffect(() => {
69
+ const gl = renderer.current;
70
+ const canvas = surface.current;
71
+ if (!gl || !canvas || broken) return undefined;
72
+ // The host's colour (`--sc-orb-color`), read again with each state: a theme changed since
73
+ // shows by the next one.
74
+ gl.ink(inkOf(canvas));
75
+ if (still) {
76
+ drawStill(gl, state);
77
+ return undefined;
78
+ }
79
+ motion.current ??= motionOf(state, read(loud.current));
80
+ return animate(gl, shader, state, () => read(loud.current), motion.current);
81
+ }, [broken, shader, size, state, still]);
82
+
83
+ if (broken) return <StillOrb state={state} size={size} label={label} className={className} />;
84
+ return (
85
+ <div
86
+ role="img"
87
+ aria-label={label}
88
+ part="orb"
89
+ className={joined(
90
+ part("sc-orb", `sc-orb--${state}`, ...(still ? (["sc-orb--still"] as const) : [])),
91
+ className,
92
+ )}
93
+ style={{ width: size, height: size }}
94
+ >
95
+ <canvas ref={surface} aria-hidden style={{ width: size, height: size }} />
96
+ </div>
97
+ );
98
+ }
@@ -0,0 +1,171 @@
1
+ import type { OrbProps } from "./orbs";
2
+ import { WebGLOrb } from "./WebGLOrb";
3
+ import { CUTOUT, INK, INK_UNIFORMS, type Shader } from "./webgl";
4
+
5
+ /**
6
+ * Ported from siri-wave by 40973894 (21st.dev), MIT. Shaders kept verbatim except the uniforms
7
+ * added below.
8
+ *
9
+ * The `fluid-dots` style of the orb: six metaballs that merge, scatter and gather. Ours is
10
+ * `uLevel`, how loud the microphone or the voice is, 0 to 1: the dots shine from 0.7 of their
11
+ * brightness in silence to all of it at full voice. How fast they move follows the energy of
12
+ * the state (0.4 of the original's pace at rest, all of it while listening and speaking, see
13
+ * `pace`), summed on the clock the shader is given so that a change of state bends the motion.
14
+ *
15
+ * The last line of `main` is ours too: the host's colour, when it gives one (`INK`, its uniforms
16
+ * `INK_UNIFORMS`), and what is near black turning transparent (`CUTOUT`).
17
+ */
18
+ const FRAGMENT = `precision highp float;
19
+ uniform vec2 iResolution; uniform float iTime;
20
+ uniform float uLevel; // signalcore: the signal
21
+ ${INK_UNIFORMS}
22
+ const float TAU = 6.28318530718;
23
+ const int N = 6;
24
+ const float SMOOTH_K = 0.08;
25
+ const float INTENSITY = 0.0025;
26
+ const float FALLOFF_P = 1.35;
27
+ const float FADE_START = 0.02;
28
+ const float FADE_END = 0.56;
29
+ const float ABERR = 0.005;
30
+ const vec3 SPECTRAL = vec3(0.0, 0.5, 1.0) * ABERR;
31
+ const float HUE_SPEED = 0.06;
32
+ const float COLOR_K = 0.5;
33
+ const float SAT = 0.01;
34
+ const float HUE_SPAN = 0.667;
35
+ const float MERGE_PERIOD = 6.0;
36
+ const float T_MOVE = 1.25;
37
+ const float STAGGER = 0.33;
38
+ const float HOLD = 0.0;
39
+ const float W = 4.6;
40
+ const float L = 3.2;
41
+ const float PIERCE = 0.12;
42
+ const float RECOIL = 0.035;
43
+ const float REC_LAG = 0.11;
44
+ const float GATHER_PERIOD = 12.0;
45
+ const float GATHER_START = 9.2;
46
+ const float GATHER_HOLD = 0.8;
47
+ const float GATHER_R = 0.008;
48
+ const float GATHER_DIM = 0.85;
49
+ const float GATHER_IN = 1.8;
50
+ const float GATHER_IN_L = 7.5;
51
+ const float BURST_W = 6.5;
52
+ const float BURST_L = 4.0;
53
+ const float CHARGE_T = 0.30;
54
+ const float CHARGE_SHRK = 0.18;
55
+ const float CHARGE_GLOW = 0.35;
56
+ const float FLASH_GAIN = 1.2;
57
+ const float FLASH_DECAY = 7.0;
58
+
59
+ float hash11(float n){ return fract(sin(n*127.1 + 311.7)*43758.5453); }
60
+ float settleWL(float tau, float w, float l){
61
+ if(tau <= 0.0) return 0.0;
62
+ return 1.0 - exp(-l*tau)*cos(w*tau);
63
+ }
64
+ float settle(float tau){ return settleWL(tau, W, L); }
65
+ float settleCrit(float tau, float l){
66
+ if(tau <= 0.0) return 0.0;
67
+ return 1.0 - exp(-l*tau)*(1.0 + l*tau);
68
+ }
69
+ float smin(float a, float b, float k){
70
+ float h = max(k - abs(a - b), 0.0) / k;
71
+ return min(a, b) - h*h*k*0.25;
72
+ }
73
+ vec3 hue2rgb(float h){
74
+ h = fract(h);
75
+ float r = clamp(abs(h*6.0 - 3.0) - 1.0, 0.0, 1.0);
76
+ float g = clamp(2.0 - abs(h*6.0 - 2.0), 0.0, 1.0);
77
+ float b = clamp(2.0 - abs(h*6.0 - 4.0), 0.0, 1.0);
78
+ return vec3(r, g, b);
79
+ }
80
+ float dotR(float fi, float seed, float t){
81
+ return 0.036 + 0.010*sin(t*1.3 + seed*TAU) + 0.005*sin(t*2.4 + fi*1.3);
82
+ }
83
+ float dotSD(vec2 p, vec2 pos, float r, float t, float fi, float shapeDamp){
84
+ vec2 d = p - pos;
85
+ float sq = 0.075 * (0.5 + 0.5*sin(t*0.9 + fi*2.0)) * shapeDamp;
86
+ float ca = cos(t*0.35 + fi), sa = sin(t*0.35 + fi);
87
+ d = mat2(ca,-sa,sa,ca) * d;
88
+ d *= vec2(1.0+sq, 1.0-sq);
89
+ return length(d) - r;
90
+ }
91
+ vec3 scene(vec2 p, float t){
92
+ float k = floor(t/MERGE_PERIOD);
93
+ float u = fract(t/MERGE_PERIOD);
94
+ float te = u * MERGE_PERIOD;
95
+ float tg = mod(t, GATHER_PERIOD);
96
+ float g = settleCrit((tg - GATHER_START) * GATHER_IN, GATHER_IN_L)
97
+ - settleWL(tg - GATHER_START - GATHER_HOLD, BURST_W, BURST_L);
98
+ float gC = clamp(g, 0.0, 1.0);
99
+ float tb = tg - (GATHER_START + GATHER_HOLD);
100
+ float charge = smoothstep(-CHARGE_T, 0.0, min(tb, 0.0)) * gC;
101
+ float flash = tb > 0.0 ? exp(-tb * FLASH_DECAY) : 0.0;
102
+ float gBright = mix(1.0, GATHER_DIM, gC) * (1.0 + CHARGE_GLOW*charge + FLASH_GAIN*flash);
103
+ vec3 total3 = vec3(1e5);
104
+ vec3 cAcc = vec3(0.0);
105
+ float wAcc = 1e-6;
106
+ for(int i=0; i<N; i++){
107
+ float fi = float(i);
108
+ float seed = hash11(fi);
109
+ float ang = fi/float(N)*TAU + t*0.35;
110
+ vec2 dir = vec2(cos(ang), sin(ang));
111
+ float R = 0.17 + 0.010*sin(t*1.0) + 0.007*sin(t*1.3 + seed*TAU);
112
+ float pairId = mod(fi, 3.0);
113
+ float moverLow = mod(k + pairId, 2.0);
114
+ float isMover = (fi < 2.5) ? step(moverLow, 0.5) : step(0.5, moverLow);
115
+ float goStart = pairId * STAGGER;
116
+ float retStart = 3.0*STAGGER + HOLD + pairId * STAGGER;
117
+ float m = (settle(te - goStart) - settle(te - retStart)) * isMover;
118
+ float rec = (settle(te - goStart - REC_LAG) - settle(te - retStart - REC_LAG)) * (1.0 - isMover);
119
+ float rSelf = dotR(fi, seed, t);
120
+ rSelf = mix(rSelf, 0.036, gC);
121
+ rSelf *= 1.0 - CHARGE_SHRK * charge;
122
+ float fj = mod(fi + 3.0, 6.0);
123
+ float rPart = dotR(fj, hash11(fj), t);
124
+ float deep = -(R + RECOIL) - PIERCE * rPart;
125
+ float radial = mix(R, deep, m) + RECOIL * rec;
126
+ radial = mix(radial, GATHER_R, g);
127
+ vec2 pos = radial * dir;
128
+ float sdR = dotSD(p - SPECTRAL.r*dir, pos, rSelf, t, fi, 1.0 - gC);
129
+ float sdG = dotSD(p - SPECTRAL.g*dir, pos, rSelf, t, fi, 1.0 - gC);
130
+ float sdB = dotSD(p - SPECTRAL.b*dir, pos, rSelf, t, fi, 1.0 - gC);
131
+ total3 = vec3( smin(total3.r, sdR, SMOOTH_K),
132
+ smin(total3.g, sdG, SMOOTH_K),
133
+ smin(total3.b, sdB, SMOOTH_K) );
134
+ float hue = fract(fi/float(N) + t*HUE_SPEED) * HUE_SPAN;
135
+ vec3 dotCol = mix(vec3(1.0), hue2rgb(hue), SAT);
136
+ float w = exp(-sdG * COLOR_K);
137
+ cAcc += w * dotCol;
138
+ wAcc += w;
139
+ }
140
+ vec3 sd3 = max(total3, vec3(0.0)) + 1e-4;
141
+ vec3 core3 = clamp(INTENSITY / pow(sd3, vec3(FALLOFF_P)), 0.0, 1.0);
142
+ vec3 edge3 = 1.0 - smoothstep(vec3(FADE_START), vec3(FADE_END), sd3);
143
+ vec3 bright = core3 * edge3 * gBright;
144
+ return bright * (cAcc / wAcc);
145
+ }
146
+ void mainImage(out vec4 fragColor, in vec2 fragCoord){
147
+ vec2 res = iResolution.xy;
148
+ vec2 p = (2.0*fragCoord - res) / min(res.x, res.y);
149
+ float t = iTime;
150
+ p /= 1.0 + 0.03*sin(t*1.0);
151
+ vec3 col = scene(p, t);
152
+ col *= 1.0 + 0.05*sin(t*1.0 + 1.0);
153
+ col *= 0.7 + 0.3*clamp(uLevel, 0.0, 1.0); // signalcore: brighter with the voice
154
+ col = pow(col, vec3(1.0/1.2));
155
+ col = min(col, 1.0);
156
+ float n = fract(sin(dot(fragCoord, vec2(12.9898,78.233)))*43758.5453);
157
+ col += (n - 0.5)/255.0;
158
+ fragColor = vec4(col, 1.0);
159
+ }
160
+ void main(){ mainImage(gl_FragColor, gl_FragCoord.xy); ${INK} ${CUTOUT} }`;
161
+
162
+ /** At rest the dots move at 0.4 of their pace; listening or speaking, at all of it. */
163
+ export const FLUID_DOTS: Shader = {
164
+ fragment: FRAGMENT,
165
+ pace: (energy) => 0.4 + 0.6 * energy,
166
+ };
167
+
168
+ /** The `fluid-dots` style of the orb: six metaballs that merge, scatter and gather. */
169
+ export default function FluidDotsOrb(props: OrbProps) {
170
+ return <WebGLOrb {...props} shader={FLUID_DOTS} />;
171
+ }