@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,112 @@
1
+ /**
2
+ * How a shader orb moves: the level and the energy of its state eased toward where they are
3
+ * going, its clock paced by the energy, a frame drawn each time the browser has one, and no frame
4
+ * asked for when nothing moves. Nothing here knows React; `WebGLOrb` runs it.
5
+ */
6
+
7
+ import type { OrbState } from "./orbs";
8
+ import type { Renderer, Shader } from "./webgl";
9
+
10
+ /** How long an orb at rest keeps moving before it stops asking the browser for frames. */
11
+ export const IDLE_STOP_MS = 3000;
12
+
13
+ /** The longest step of time one frame may take: a tab coming back does not make the orb jump. */
14
+ const LONGEST_STEP = 0.1;
15
+
16
+ /** The moment a still frame is drawn at, and where a moving orb starts: a settled picture. */
17
+ export const STILL_TIME = 1.0;
18
+
19
+ /** How loud the still frame of a state that is not rest is drawn, so its shape still says it. */
20
+ export const STILL_LEVEL = 0.45;
21
+
22
+ /** How much the shader is asked to be moved by the signal in each state. */
23
+ export const ENERGY: Readonly<Record<OrbState, number>> = {
24
+ idle: 0,
25
+ thinking: 0.5,
26
+ listening: 1,
27
+ speaking: 1,
28
+ };
29
+
30
+ /** How fast the level and the energy move toward where they are going, per second. */
31
+ const LEVEL_RATE = 14;
32
+ const ENERGY_RATE = 3;
33
+
34
+ /** `from` moved toward `to` at `rate` per second: a value that does not jump. */
35
+ function approach(from: number, to: number, rate: number, step: number): number {
36
+ return from + (to - from) * (1 - Math.exp(-rate * step));
37
+ }
38
+
39
+ /**
40
+ * Where an orb's motion is: its clock, its eased level and energy, and the moment of its last
41
+ * frame. One per orb, kept across its states, so a new state bends the motion instead of starting
42
+ * it over.
43
+ */
44
+ export interface Motion {
45
+ time: number;
46
+ level: number;
47
+ energy: number;
48
+ last: number;
49
+ }
50
+
51
+ /** The motion of an orb that appears in `state`, already as loud as `level`. */
52
+ export function motionOf(state: OrbState, level: number): Motion {
53
+ return { time: STILL_TIME, level, energy: ENERGY[state], last: 0 };
54
+ }
55
+
56
+ /** One frame of `state` at a fixed moment: what the orb shows under reduced motion, one per state. */
57
+ export function drawStill(renderer: Renderer, state: OrbState): void {
58
+ renderer.draw({
59
+ time: STILL_TIME,
60
+ level: state === "idle" ? 0 : STILL_LEVEL,
61
+ energy: ENERGY[state],
62
+ });
63
+ }
64
+
65
+ /**
66
+ * Draws `state` frame by frame from `motion` on (which it moves), reading `level` on each frame.
67
+ * It asks for no frame while the tab is hidden, and stops three seconds after it came to rest
68
+ * (`idle`); the tab coming back asks again. The result stops it.
69
+ */
70
+ export function animate(
71
+ renderer: Renderer,
72
+ shader: Shader,
73
+ state: OrbState,
74
+ level: () => number,
75
+ motion: Motion,
76
+ ): () => void {
77
+ let frame = 0;
78
+ let restingSince: number | null = null;
79
+
80
+ const tick = (stamp: number) => {
81
+ frame = 0;
82
+ const step = Math.min(LONGEST_STEP, Math.max(0, (stamp - motion.last) / 1000));
83
+ motion.last = stamp;
84
+ motion.level = approach(motion.level, level(), LEVEL_RATE, step);
85
+ motion.energy = approach(motion.energy, ENERGY[state], ENERGY_RATE, step);
86
+ motion.time += step * shader.pace(motion.energy);
87
+ renderer.draw({ time: motion.time, level: motion.level, energy: motion.energy });
88
+ if (state === "idle") {
89
+ restingSince ??= stamp;
90
+ if (stamp - restingSince >= IDLE_STOP_MS) return;
91
+ }
92
+ frame = requestAnimationFrame(tick);
93
+ };
94
+ const run = () => {
95
+ if (frame === 0 && !document.hidden) frame = requestAnimationFrame(tick);
96
+ };
97
+ const onVisibility = () => {
98
+ if (document.hidden) {
99
+ cancelAnimationFrame(frame);
100
+ frame = 0;
101
+ } else {
102
+ run();
103
+ }
104
+ };
105
+
106
+ document.addEventListener("visibilitychange", onVisibility);
107
+ run();
108
+ return () => {
109
+ document.removeEventListener("visibilitychange", onVisibility);
110
+ cancelAnimationFrame(frame);
111
+ };
112
+ }
@@ -0,0 +1,39 @@
1
+ /**
2
+ * The orb: the shape a voice conversation with an agent takes, where it stands and how loud it
3
+ * is. Its styles, its states and its props; the drawing is `Orb`'s.
4
+ */
5
+
6
+ /**
7
+ * The ways the orb can be drawn: `wave`, the default, the iOS voice waveform; `fluid-dots`, six
8
+ * dots that merge and scatter. Both are shaders, and each paints its own colours.
9
+ */
10
+ export const ORB_STYLES = ["wave", "fluid-dots"] as const;
11
+
12
+ export type OrbStyle = (typeof ORB_STYLES)[number];
13
+
14
+ /** The one drawn when nobody chose. */
15
+ export const DEFAULT_ORB: OrbStyle = "wave";
16
+
17
+ /** Where the conversation stands, as the orb shows it: at rest, or the agent listening, thinking or speaking. */
18
+ export type OrbState = "idle" | "listening" | "thinking" | "speaking";
19
+
20
+ /** The diameter when nobody says: room for the orb and the glow it gives off. */
21
+ export const ORB_SIZE = 200;
22
+
23
+ export interface OrbProps {
24
+ /** Where the conversation stands. The orb looks different in each. */
25
+ state: OrbState;
26
+ /**
27
+ * How loud the microphone (while `listening`) or the voice (while `speaking`) is, from 0 to 1;
28
+ * 0 in the other states. A number, or a reader the orb calls on each frame it draws (a call's
29
+ * meter), so it follows the sound without a render per frame. The orb eases it on its own.
30
+ */
31
+ level: number | (() => number);
32
+ /** The diameter in pixels. Default: 200. */
33
+ size?: number | undefined;
34
+ /** How it is drawn: `"wave"` (the default) or `"fluid-dots"`. */
35
+ style?: OrbStyle | undefined;
36
+ /** What the orb is, for those who cannot see it: its `aria-label`. */
37
+ label: string;
38
+ className?: string | undefined;
39
+ }
@@ -0,0 +1,24 @@
1
+ import { useSyncExternalStore } from "react";
2
+
3
+ const LESS_MOTION = "(prefers-reduced-motion: reduce)";
4
+
5
+ const motionQuery = (): MediaQueryList | null =>
6
+ typeof window !== "undefined" && typeof window.matchMedia === "function"
7
+ ? window.matchMedia(LESS_MOTION)
8
+ : null;
9
+
10
+ /**
11
+ * Whether the person asked their system for less motion, followed while the page is open.
12
+ * Without `matchMedia` (a server, an old browser) there is no such request.
13
+ */
14
+ export function useReducedMotion(): boolean {
15
+ return useSyncExternalStore(
16
+ (changed) => {
17
+ const query = motionQuery();
18
+ query?.addEventListener("change", changed);
19
+ return () => query?.removeEventListener("change", changed);
20
+ },
21
+ () => motionQuery()?.matches ?? false,
22
+ () => false,
23
+ );
24
+ }
@@ -0,0 +1,129 @@
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 `wave` style of the orb: the iOS voice waveform, a bright line with chromatic bands. The
10
+ * original simulated three frequency bands (`low`, `mid`, `high`) with slow sines. Two uniforms
11
+ * are ours, and everything marked `signalcore:` in the source below is where they are used:
12
+ *
13
+ * - `uLevel`, how loud the microphone or the voice is, 0 to 1. The bands follow it.
14
+ * - `uEnergy`, 0 at rest, 0.5 while thinking, 1 while listening or speaking: how much the bands
15
+ * follow the level instead of the original's simulation. At rest the wave breathes on the
16
+ * simulation, slowly (the clock runs at 0.35, see `pace`).
17
+ *
18
+ * The last line of `main` is ours too: the host's colour, when it gives one (`INK`, its uniforms
19
+ * `INK_UNIFORMS`), and what is near black turning transparent (`CUTOUT`).
20
+ */
21
+ const FRAGMENT = `precision highp float;
22
+ uniform vec2 iResolution; uniform float iTime;
23
+ uniform float uLevel; uniform float uEnergy; // signalcore: the signal
24
+ ${INK_UNIFORMS}
25
+ const float PI = 3.14159265359;
26
+ const float AMPLITUDE = 0.32;
27
+ const float FREQ = 1.1;
28
+ const float ABER_FREQ = 1.0;
29
+ const float SPEED = 2.4;
30
+ const float WAVE_SCALE = 0.6;
31
+ const float ABERRATION = 2.6;
32
+ const float THICKNESS = 3.0;
33
+ const float INTENSITY = 2.;
34
+ const float FALLOFF = 1.7;
35
+ const float EDGE_MASK = 0.4;
36
+ const float EDGE_INSET = 0.0;
37
+ const float BAND_FILL = 30000.0;
38
+ const float BAND_THICK = 0.08;
39
+ const float SOFTNESS = 2.5;
40
+ const float LOW_AMP = 6.0;
41
+ const float LOW_INT = 1.5;
42
+ const float MID_ABER = 0.8;
43
+ const float MID_ABAMP = 0.05;
44
+ const float MID_BAND = 20.0;
45
+ const float MID_SOFT = 0.4;
46
+ const float HIGH_ABER = 0.5;
47
+ const float HIGH_ABAMP = 0.06;
48
+ const float RESOLVED = 1.0;
49
+ const float UNRES_SCALE = 0.14;
50
+
51
+ vec3 spectral4(int s){
52
+ float x = float(s);
53
+ return clamp(vec3(abs(x-3.0)-1.0, 2.0-abs(x-2.0), 2.0-abs(x-4.0)), 0.0, 1.0);
54
+ }
55
+
56
+ void mainImage(out vec4 fragColor, in vec2 fragCoord){
57
+ vec2 R = iResolution.xy;
58
+ float aspect = R.x / R.y;
59
+ vec2 p = (fragCoord + 0.5) * 2.0 / R - 1.0;
60
+ p.x *= aspect;
61
+ float yScreen = p.y;
62
+ p /= max(WAVE_SCALE, 0.1);
63
+
64
+ float t = iTime;
65
+ float lvl = clamp(uLevel, 0.0, 1.0); // signalcore: the bands the level drives, one shape each
66
+ float low = mix(clamp(0.45 + 0.45*sin(t*0.8)*sin(t*0.37+1.0), 0.0, 1.0), lvl, uEnergy);
67
+ float mid = mix(clamp(0.40 + 0.40*sin(t*1.7+2.0)*sin(t*0.53), 0.0, 1.0), lvl*(0.7 + 0.3*sin(t*5.1+2.0)), uEnergy);
68
+ float high = mix(clamp(0.30 + 0.30*sin(t*2.9+4.0)*sin(t*0.71+2.0), 0.0, 1.0), lvl*lvl*(0.7 + 0.3*sin(t*8.3+4.0)), uEnergy);
69
+
70
+ float res = clamp(RESOLVED, 0.0, 1.0);
71
+ float drift = mod(t, 20.0*PI) * SPEED;
72
+
73
+ float xN = p.x / max(aspect, 1.0);
74
+ float env = cos(PI*0.5 * min(abs(0.9*xN), 1.0));
75
+ env *= env;
76
+
77
+ float A1 = AMPLITUDE + 0.01*low*LOW_AMP;
78
+ float A2 = A1 + mid*MID_ABAMP + high*HIGH_ABAMP;
79
+ float AB = (ABERRATION + mid*MID_ABER + high*HIGH_ABER)*res;
80
+ float th = mix(0.1, 0.01*THICKNESS, res);
81
+ float inten = mix(0.1, 0.01*(INTENSITY + low*LOW_INT), res);
82
+ float soft = 0.01*res*max(0.0, SOFTNESS + mid*MID_SOFT);
83
+
84
+ float dUnres = max(length(p) - mix(0.14, UNRES_SCALE, res), 0.0);
85
+ float yMain = A1 * env * res * sin(p.x*FREQ + drift);
86
+
87
+ float bandFillTh = max(BAND_THICK, 1e-4);
88
+ float bandAmt = 1e-4 * BAND_FILL * inten;
89
+ vec3 num = vec3(0.0), den = vec3(0.0);
90
+ for(int s = 0; s < 4; s++){
91
+ vec3 hue = mix(vec3(1.0), spectral4(s), res);
92
+ den += hue;
93
+ float ab = mix(-AB, AB, float(s)/3.0);
94
+ float yL = A2 * env * res * sin(p.x*ABER_FREQ + drift + ab);
95
+ float d = mix(dUnres, abs(p.y - yL), res);
96
+ float lor = mix(1.0/(1.0 + (0.02*d)*(0.02*d)), 1.0, res);
97
+ float line = inten / (sqrt(d*d + soft*soft) + th);
98
+ float lo = min(yMain, yL), hi = max(yMain, yL);
99
+ float dBand = max(0.0, max(p.y - hi, lo - p.y));
100
+ float band = bandAmt / (dBand + bandFillTh);
101
+ num += hue * lor * (line + band);
102
+ }
103
+ vec3 col = num / den;
104
+
105
+ float dM = mix(dUnres, abs(p.y - yMain), res);
106
+ float lorM = mix(1.0/(1.0 + (0.02*dM)*(0.02*dM)), 1.0, res);
107
+ float boost = (1.0 - res) * (14.0*low + 4.0);
108
+ col += 0.5 * inten * (lorM + boost) / (sqrt(dM*dM + soft*soft) + th);
109
+
110
+ col = pow(max(col, 0.0), vec3(1.5));
111
+ float emT = clamp((abs(yScreen) - 1.0 + EDGE_INSET) / (-max(EDGE_MASK, 1e-4)), 0.0, 1.0);
112
+ float em = emT*emT*(3.0 - 2.0*emT);
113
+ float gauss = exp(-pow(xN*FALLOFF, 2.0));
114
+ col *= mix(1.0, em*gauss, res);
115
+ col *= res;
116
+ fragColor = vec4(col, 1.0);
117
+ }
118
+ void main(){ mainImage(gl_FragColor, gl_FragCoord.xy); ${INK} ${CUTOUT} }`;
119
+
120
+ /** At rest the wave breathes at a third of its pace; once something is heard it runs its own. */
121
+ export const WAVE: Shader = {
122
+ fragment: FRAGMENT,
123
+ pace: (energy) => 0.35 + 0.65 * Math.min(1, energy * 2),
124
+ };
125
+
126
+ /** The `wave` style of the orb: the iOS voice waveform. */
127
+ export default function WaveOrb(props: OrbProps) {
128
+ return <WebGLOrb {...props} shader={WAVE} />;
129
+ }
@@ -0,0 +1,209 @@
1
+ /**
2
+ * The WebGL under the `wave` and `fluid-dots` orbs: one fullscreen triangle drawn by one
3
+ * fragment shader, and its uniforms (the time, the signal, the host's colour). Nothing here knows
4
+ * React, a call or a state; the frame loop is `motion`'s.
5
+ */
6
+
7
+ /** A style of orb drawn by a fragment shader. */
8
+ export interface Shader {
9
+ /** GLSL ES 1.00 source of the fragment shader; it reads the uniforms named in `Uniforms`. */
10
+ fragment: string;
11
+ /**
12
+ * How fast the shader's clock runs at an energy, 0 (idle) to 1 (listening, speaking): 1 is the
13
+ * shader's own pace. The clock is summed frame by frame on this side, so a change of pace bends
14
+ * the motion instead of making it jump, as a time multiplied inside the shader would.
15
+ */
16
+ pace(energy: number): number;
17
+ }
18
+
19
+ /** What one frame is drawn from. */
20
+ export interface Uniforms {
21
+ /** `iTime`: seconds on the shader's own clock, already paced. */
22
+ time: number;
23
+ /** `uLevel`: how loud the microphone or the voice is, 0 to 1. */
24
+ level: number;
25
+ /** `uEnergy`: 0 at rest, 0.5 while thinking, 1 while listening or speaking. */
26
+ energy: number;
27
+ }
28
+
29
+ /** A colour as the shader takes it: red, green and blue, each 0 to 1. */
30
+ export type Rgb = readonly [number, number, number];
31
+
32
+ export interface Renderer {
33
+ draw(values: Uniforms): void;
34
+ /** Paints the next frames in `ink` (`uInk`), or (null) in the shader's own colours. */
35
+ ink(ink: Rgb | null): void;
36
+ dispose(): void;
37
+ }
38
+
39
+ const VERTEX = `attribute vec2 aPos; void main(){ gl_Position=vec4(aPos,0.0,1.0); }`;
40
+
41
+ /**
42
+ * The line every shader ends its `main` with: the shaders paint light on black, and an orb sits on
43
+ * any background, so what is near black becomes transparent instead. The canvas is premultiplied,
44
+ * so the colour goes with its alpha. There is no black square around the orb.
45
+ */
46
+ export const CUTOUT = `gl_FragColor.a *= smoothstep(0.02, 0.12, max(gl_FragColor.r, max(gl_FragColor.g, gl_FragColor.b))); gl_FragColor.rgb *= gl_FragColor.a;`;
47
+
48
+ /** The uniforms of the host's colour, which every shader declares beside its own. */
49
+ export const INK_UNIFORMS = `uniform vec3 uInk; uniform float uInked; // signalcore: the host's colour`;
50
+
51
+ /**
52
+ * The line before `CUTOUT`: with the host's colour (`uInked` 1), the shader's light is painted
53
+ * in it, as bright as it was (its brightest channel); without, the shader's own colours stay.
54
+ */
55
+ export const INK = `gl_FragColor.rgb = mix(gl_FragColor.rgb, uInk * max(gl_FragColor.r, max(gl_FragColor.g, gl_FragColor.b)), uInked);`;
56
+
57
+ /**
58
+ * What the shader paints so that, blended by exclusion over `surface`, its brightest light shows
59
+ * as `color`: the colour itself over black, its opposite over white (exclusion turns it over),
60
+ * and between them, channel by channel, what turns into it as far as it can; a channel of the
61
+ * surface near the middle turns nothing over, and keeps the colour.
62
+ */
63
+ export function inkOver(color: Rgb, surface: Rgb): Rgb {
64
+ const channel = (wanted: number, under: number): number => {
65
+ const turn = 1 - 2 * under;
66
+ if (Math.abs(turn) < 0.2) return wanted;
67
+ return Math.min(1, Math.max(0, (wanted - under) / turn));
68
+ };
69
+ return [
70
+ channel(color[0], surface[0]),
71
+ channel(color[1], surface[1]),
72
+ channel(color[2], surface[2]),
73
+ ];
74
+ }
75
+
76
+ /** A pixel to read colours off: any CSS colour, as the browser paints it. */
77
+ let swatch: CanvasRenderingContext2D | null | undefined;
78
+
79
+ /** A CSS colour as red, green, blue and alpha, each 0 to 1; null where it can't be read. */
80
+ export function rgbaOf(css: string): readonly [number, number, number, number] | null {
81
+ if (swatch === undefined) {
82
+ swatch = document.createElement("canvas").getContext("2d", { willReadFrequently: true });
83
+ }
84
+ if (swatch === null || css === "") return null;
85
+ swatch.clearRect(0, 0, 1, 1);
86
+ swatch.fillStyle = "#000";
87
+ swatch.fillStyle = css;
88
+ swatch.fillRect(0, 0, 1, 1);
89
+ const [r = 0, g = 0, b = 0, a = 0] = swatch.getImageData(0, 0, 1, 1).data;
90
+ return [r / 255, g / 255, b / 255, a / 255];
91
+ }
92
+
93
+ /**
94
+ * The host's colour for an orb's canvas, as its shader paints it, from what the stylesheet puts
95
+ * on the canvas: the colour (`color`: `--sc-orb-color`, transparent when none) and the surface it
96
+ * blends with (`outline-color`; a page's own, light, where the surface is see-through). Null:
97
+ * the shader's own colours.
98
+ */
99
+ export function inkOf(canvas: HTMLCanvasElement): Rgb | null {
100
+ const style = getComputedStyle(canvas);
101
+ const color = rgbaOf(style.color);
102
+ if (color === null || color[3] === 0) return null;
103
+ const surface = rgbaOf(style.outlineColor);
104
+ const under: Rgb =
105
+ surface === null || surface[3] < 0.5 ? [1, 1, 1] : [surface[0], surface[1], surface[2]];
106
+ return inkOver([color[0], color[1], color[2]], under);
107
+ }
108
+
109
+ function compile(gl: WebGLRenderingContext, type: number, source: string): WebGLShader {
110
+ const shader = gl.createShader(type);
111
+ if (!shader) throw new Error("no shader");
112
+ gl.shaderSource(shader, source);
113
+ gl.compileShader(shader);
114
+ if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {
115
+ const log = gl.getShaderInfoLog(shader);
116
+ gl.deleteShader(shader);
117
+ throw new Error(log ?? "shader compile error");
118
+ }
119
+ return shader;
120
+ }
121
+
122
+ /** The program of a fragment shader, linked: the triangle's vertex shader and `fragment`. */
123
+ function link(gl: WebGLRenderingContext, fragment: string): WebGLProgram {
124
+ const program = gl.createProgram();
125
+ const vertex = compile(gl, gl.VERTEX_SHADER, VERTEX);
126
+ const pixels = compile(gl, gl.FRAGMENT_SHADER, fragment);
127
+ gl.attachShader(program, vertex);
128
+ gl.attachShader(program, pixels);
129
+ gl.linkProgram(program);
130
+ // Linked, the program keeps what it needs: the shaders can go.
131
+ gl.deleteShader(vertex);
132
+ gl.deleteShader(pixels);
133
+ if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {
134
+ const log = gl.getProgramInfoLog(program);
135
+ gl.deleteProgram(program);
136
+ throw new Error(log ?? "shader link error");
137
+ }
138
+ return program;
139
+ }
140
+
141
+ /**
142
+ * Sets `canvas` up to draw `fragment` on a square of `dim` pixels, compiled once: the program, the
143
+ * triangle and the uniforms' places are kept for every frame after. Nothing when WebGL is not
144
+ * there or the shader does not compile on this device, and `onLost` is called if the browser
145
+ * takes the context away later (a GPU reset, too many contexts on the page).
146
+ */
147
+ export function createRenderer(
148
+ canvas: HTMLCanvasElement,
149
+ fragment: string,
150
+ dim: number,
151
+ onLost: () => void,
152
+ ): Renderer | undefined {
153
+ const gl = canvas.getContext("webgl", { alpha: true, premultipliedAlpha: true });
154
+ if (!gl) return undefined;
155
+
156
+ let program: WebGLProgram;
157
+ try {
158
+ program = link(gl, fragment);
159
+ } catch {
160
+ return undefined;
161
+ }
162
+ gl.useProgram(program);
163
+
164
+ const buffer = gl.createBuffer();
165
+ gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
166
+ // One triangle bigger than the screen: three vertices cover it, with no seam across a quad.
167
+ gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([-1, -1, 3, -1, -1, 3]), gl.STATIC_DRAW);
168
+ const position = gl.getAttribLocation(program, "aPos");
169
+ gl.enableVertexAttribArray(position);
170
+ gl.vertexAttribPointer(position, 2, gl.FLOAT, false, 0, 0);
171
+
172
+ canvas.width = dim;
173
+ canvas.height = dim;
174
+ gl.viewport(0, 0, dim, dim);
175
+ gl.clearColor(0, 0, 0, 0);
176
+ // A uniform a shader does not use is optimised out and has no place: setting it does nothing.
177
+ gl.uniform2f(gl.getUniformLocation(program, "iResolution"), dim, dim);
178
+ const time = gl.getUniformLocation(program, "iTime");
179
+ const level = gl.getUniformLocation(program, "uLevel");
180
+ const energy = gl.getUniformLocation(program, "uEnergy");
181
+ const inkColor = gl.getUniformLocation(program, "uInk");
182
+ const inked = gl.getUniformLocation(program, "uInked");
183
+ gl.uniform1f(inked, 0);
184
+
185
+ const lost = (event: Event) => {
186
+ event.preventDefault();
187
+ onLost();
188
+ };
189
+ canvas.addEventListener("webglcontextlost", lost);
190
+
191
+ return {
192
+ draw(values) {
193
+ gl.uniform1f(time, values.time);
194
+ gl.uniform1f(level, values.level);
195
+ gl.uniform1f(energy, values.energy);
196
+ gl.clear(gl.COLOR_BUFFER_BIT);
197
+ gl.drawArrays(gl.TRIANGLES, 0, 3);
198
+ },
199
+ ink(ink) {
200
+ if (ink !== null) gl.uniform3f(inkColor, ink[0], ink[1], ink[2]);
201
+ gl.uniform1f(inked, ink === null ? 0 : 1);
202
+ },
203
+ dispose() {
204
+ canvas.removeEventListener("webglcontextlost", lost);
205
+ gl.deleteProgram(program);
206
+ gl.deleteBuffer(buffer);
207
+ },
208
+ };
209
+ }
@@ -0,0 +1,5 @@
1
+ // A stylesheet as text, which the widget puts into its shadow root (Vite's `?inline`).
2
+ declare module "*.css?inline" {
3
+ const css: string;
4
+ export default css;
5
+ }