@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,492 @@
1
+ import { ArrowClockwiseIcon, UploadSimpleIcon, XIcon } from "@phosphor-icons/react";
2
+ import { useEffect, useRef, useState, type CSSProperties, type DragEvent } from "react";
3
+
4
+ import type { Attachment } from "../types";
5
+ import { useKit, useParts } from "./context";
6
+ import { ariaOf, type ControlBase } from "./Field";
7
+ import { FileMark } from "./FileMark";
8
+ import { formatSize } from "./numbers";
9
+ import { failureOf, familyOf, isAbort, limitsOf, refusalOf, type FileHost } from "./uploads";
10
+
11
+ // --- One file -----------------------------------------------------------------------------
12
+
13
+ export interface FileChipProps {
14
+ name: string;
15
+ /** Its weight in bytes; none while it is not known. */
16
+ size?: number | undefined;
17
+ /** Its type, for its glyph when its name has no extension. */
18
+ type?: string | undefined;
19
+ /** On its way: how much of it has gone, from 0 to 1. */
20
+ progress?: number | undefined;
21
+ /** What went wrong with it, in place of its size. */
22
+ problem?: string | null | undefined;
23
+ /** Opens it: the chip is a button. */
24
+ onOpen?: (() => void) | undefined;
25
+ onRetry?: (() => void) | undefined;
26
+ onRemove?: (() => void) | undefined;
27
+ }
28
+
29
+ /**
30
+ * A file as a chip: the glyph of its family, its name, and under it its size, how much has gone while it uploads (a line filling at its foot), or what went wrong in the danger
31
+ * tone; at its end, trying it again and taking it away. With `onOpen` it opens on a click.
32
+ */
33
+ export function FileChip({
34
+ name,
35
+ size,
36
+ type = "",
37
+ progress,
38
+ problem,
39
+ onOpen,
40
+ onRetry,
41
+ onRemove,
42
+ }: FileChipProps) {
43
+ const { code, messages } = useKit();
44
+ const part = useParts();
45
+ const family = familyOf(name, type);
46
+ // The name says its extension; under it, how big it is, or how far it has gone.
47
+ const meta =
48
+ problem ??
49
+ (progress !== undefined
50
+ ? `${messages.uploading} ${new Intl.NumberFormat(code, { style: "percent" }).format(progress)}`
51
+ : size !== undefined
52
+ ? formatSize(size, code)
53
+ : "");
54
+ const body = (
55
+ <>
56
+ <FileMark name={name} type={type} size={28} />
57
+ <span className={part("sc-attachment__text")}>
58
+ <span className={part("sc-attachment__name")} title={name}>
59
+ {name}
60
+ </span>
61
+ {meta !== "" && <span className={part("sc-attachment__meta")}>{meta}</span>}
62
+ </span>
63
+ </>
64
+ );
65
+ return (
66
+ <div
67
+ data-family={family}
68
+ className={part("sc-attachment", ...(problem ? (["sc-attachment--failed"] as const) : []))}
69
+ >
70
+ {onOpen ? (
71
+ <button
72
+ type="button"
73
+ onClick={onOpen}
74
+ aria-label={messages.open(name)}
75
+ className={part("sc-attachment__main")}
76
+ >
77
+ {body}
78
+ </button>
79
+ ) : (
80
+ <span className={part("sc-attachment__main")}>{body}</span>
81
+ )}
82
+ {onRetry && (
83
+ <button
84
+ type="button"
85
+ onClick={onRetry}
86
+ aria-label={messages.retry}
87
+ title={messages.retry}
88
+ className={part("sc-attachment__action")}
89
+ >
90
+ <ArrowClockwiseIcon aria-hidden weight="bold" />
91
+ </button>
92
+ )}
93
+ {onRemove && (
94
+ <button
95
+ type="button"
96
+ onClick={onRemove}
97
+ aria-label={messages.remove(name)}
98
+ title={messages.remove(name)}
99
+ className={part("sc-attachment__action")}
100
+ >
101
+ <XIcon aria-hidden weight="bold" />
102
+ </button>
103
+ )}
104
+ {progress !== undefined && (
105
+ <span
106
+ role="progressbar"
107
+ aria-label={name}
108
+ aria-valuemin={0}
109
+ aria-valuemax={100}
110
+ aria-valuenow={Math.round(progress * 100)}
111
+ style={{ "--_progress": progress } as CSSProperties}
112
+ className={part("sc-attachment__bar")}
113
+ />
114
+ )}
115
+ </div>
116
+ );
117
+ }
118
+
119
+ /** Files already sent, as chips in a row that wraps; with `onOpen`, each opens on a click. */
120
+ export function FileChips({
121
+ files,
122
+ onOpen,
123
+ }: {
124
+ files: readonly Attachment[];
125
+ onOpen?: ((file: Attachment) => void) | undefined;
126
+ }) {
127
+ const part = useParts();
128
+ return (
129
+ <ul className={part("sc-attachments")}>
130
+ {files.map((file) => (
131
+ <li key={file.id}>
132
+ <FileChip
133
+ name={file.name}
134
+ size={file.size}
135
+ type={file.media_type}
136
+ onOpen={onOpen && (() => onOpen(file))}
137
+ />
138
+ </li>
139
+ ))}
140
+ </ul>
141
+ );
142
+ }
143
+
144
+ // --- Files on their way -------------------------------------------------------------------
145
+
146
+ /** A file picked here, on its way or in: what its chip draws. */
147
+ export interface Upload {
148
+ /** Tells it from the others here. */
149
+ key: number;
150
+ name: string;
151
+ size: number | undefined;
152
+ type: string;
153
+ /**
154
+ * uploading: on its way (`progress`, 0 to 1); done: stored as `id`; failed: its upload failed,
155
+ * to be tried again; refused: never sent, a kind not taken or too heavy (`problem` says which).
156
+ */
157
+ state: "uploading" | "done" | "failed" | "refused";
158
+ progress: number;
159
+ id: string | null;
160
+ problem: string | null;
161
+ /** The bytes, kept to try again. */
162
+ file: File | null;
163
+ }
164
+
165
+ /** What files may be picked: their kinds, their most in MB, one or many, how many at most. */
166
+ export interface UploadRules {
167
+ accept?: readonly string[] | undefined;
168
+ maxMb?: number | undefined;
169
+ /** False: one file, a new pick replacing it. */
170
+ multiple?: boolean | undefined;
171
+ max?: number | undefined;
172
+ }
173
+
174
+ /** Files picked and how each goes, and what can be done with them. */
175
+ export interface Uploads {
176
+ items: readonly Upload[];
177
+ /** The ids of the files in, in the order they were picked. */
178
+ ids: string[];
179
+ /** What the files still wait on: one on its way, or one that failed or was refused; null once all are in. */
180
+ waiting: "uploading" | "failed" | null;
181
+ add: (files: readonly File[]) => void;
182
+ remove: (key: number) => void;
183
+ retry: (key: number) => void;
184
+ /** Takes them all away, letting go of any on its way. */
185
+ clear: () => void;
186
+ }
187
+
188
+ let picks = 0;
189
+
190
+ /** A file already in, by its id: what `useUploads` starts from. */
191
+ export function uploaded(id: string, known: Attachment | undefined): Upload {
192
+ return {
193
+ key: ++picks,
194
+ name: known?.name ?? "",
195
+ size: known?.size,
196
+ type: known?.media_type ?? "",
197
+ state: "done",
198
+ progress: 1,
199
+ id,
200
+ problem: null,
201
+ file: null,
202
+ };
203
+ }
204
+
205
+ /**
206
+ * Files picked and sent at once through `host`: each is refused before it goes when it is not a
207
+ * kind taken, is too heavy, or is one too many; then it is on its way, then in (its id) or failed
208
+ * (to be tried again). With `multiple` false a new pick replaces what was there. Whatever is on
209
+ * its way when its file goes (taken away, cleared, the component gone) is let go.
210
+ */
211
+ export function useUploads(
212
+ host: FileHost | undefined,
213
+ { accept, maxMb, multiple = true, max = Infinity }: UploadRules,
214
+ start: () => Upload[] = () => [],
215
+ ): Uploads {
216
+ const { code, messages } = useKit();
217
+ const [items, setItems] = useState<Upload[]>(start);
218
+ const running = useRef(new Map<number, AbortController>());
219
+
220
+ useEffect(() => {
221
+ const now = running.current;
222
+ return () => {
223
+ for (const controller of now.values()) controller.abort();
224
+ now.clear();
225
+ };
226
+ }, []);
227
+
228
+ const change = (key: number, patch: Partial<Upload>) => {
229
+ setItems((now) => now.map((item) => (item.key === key ? { ...item, ...patch } : item)));
230
+ };
231
+
232
+ const letGo = (key: number) => {
233
+ running.current.get(key)?.abort();
234
+ running.current.delete(key);
235
+ };
236
+
237
+ const send = (key: number, file: File) => {
238
+ if (!host) return;
239
+ const controller = new AbortController();
240
+ running.current.set(key, controller);
241
+ host
242
+ .upload(file, (progress) => change(key, { progress }), controller.signal)
243
+ .then(
244
+ (stored) => {
245
+ change(key, { state: "done", id: stored.id, progress: 1, file: null });
246
+ },
247
+ (error: unknown) => {
248
+ if (isAbort(error)) return;
249
+ change(key, { state: "failed", problem: failureOf(error, maxMb, code, messages) });
250
+ },
251
+ )
252
+ .finally(() => {
253
+ if (running.current.get(key) === controller) running.current.delete(key);
254
+ });
255
+ };
256
+
257
+ const add = (files: readonly File[]) => {
258
+ if (!host || files.length === 0) return;
259
+ const picked = multiple ? files : files.slice(0, 1);
260
+ const kept = multiple ? items.filter((item) => item.state !== "refused").length : 0;
261
+ const fresh = picked.map((file, index): Upload => {
262
+ const problem =
263
+ kept + index >= max
264
+ ? messages.tooMany(max)
265
+ : refusalOf(file, accept, maxMb, code, messages);
266
+ return {
267
+ key: ++picks,
268
+ name: file.name || messages.file,
269
+ size: file.size,
270
+ type: file.type,
271
+ state: problem === null ? "uploading" : "refused",
272
+ progress: 0,
273
+ id: null,
274
+ problem,
275
+ file: problem === null ? file : null,
276
+ };
277
+ });
278
+ if (!multiple) for (const key of running.current.keys()) letGo(key);
279
+ setItems((now) => (multiple ? [...now, ...fresh] : fresh));
280
+ for (const item of fresh) if (item.file) send(item.key, item.file);
281
+ };
282
+
283
+ const remove = (key: number) => {
284
+ letGo(key);
285
+ setItems((now) => now.filter((item) => item.key !== key));
286
+ };
287
+
288
+ const retry = (key: number) => {
289
+ const item = items.find((each) => each.key === key);
290
+ if (item?.state !== "failed" || !item.file) return;
291
+ change(key, { state: "uploading", progress: 0, problem: null });
292
+ send(key, item.file);
293
+ };
294
+
295
+ const clear = () => {
296
+ for (const key of [...running.current.keys()]) letGo(key);
297
+ setItems([]);
298
+ };
299
+
300
+ const ids = items.flatMap((item) => (item.state === "done" && item.id ? [item.id] : []));
301
+ const waiting = items.some((item) => item.state === "uploading")
302
+ ? "uploading"
303
+ : items.some((item) => item.state === "failed" || item.state === "refused")
304
+ ? "failed"
305
+ : null;
306
+ return { items, ids, waiting, add, remove, retry, clear };
307
+ }
308
+
309
+ /**
310
+ * The files picked, as chips: each with how it goes; taken away while they can be, the failed
311
+ * tried again; once in, a name not known here is read from the host's files, and opens there.
312
+ */
313
+ export function UploadChips({
314
+ uploads,
315
+ host,
316
+ closed = false,
317
+ }: {
318
+ uploads: Uploads;
319
+ host: FileHost | undefined;
320
+ closed?: boolean | undefined;
321
+ }) {
322
+ const { messages } = useKit();
323
+ const part = useParts();
324
+ return (
325
+ <ul className={part("sc-attachments")}>
326
+ {uploads.items.map((item) => {
327
+ const stored = item.id !== null ? host?.known.get(item.id) : undefined;
328
+ const { open } = host ?? {};
329
+ return (
330
+ <li key={item.key}>
331
+ <FileChip
332
+ name={stored?.name ?? (item.name || messages.file)}
333
+ size={stored?.size ?? item.size}
334
+ type={stored?.media_type ?? item.type}
335
+ progress={item.state === "uploading" ? item.progress : undefined}
336
+ problem={item.problem}
337
+ onOpen={stored && open && (() => open(stored))}
338
+ onRetry={
339
+ !closed && item.state === "failed" ? () => uploads.retry(item.key) : undefined
340
+ }
341
+ onRemove={closed ? undefined : () => uploads.remove(item.key)}
342
+ />
343
+ </li>
344
+ );
345
+ })}
346
+ </ul>
347
+ );
348
+ }
349
+
350
+ /** Whether what is dragged carries files (not words, not a link). */
351
+ export function carriesFiles(event: DragEvent): boolean {
352
+ return [...event.dataTransfer.types].includes("Files");
353
+ }
354
+
355
+ // --- The field ----------------------------------------------------------------------------
356
+
357
+ export interface FileFieldProps extends ControlBase {
358
+ /** The ids of the files in. */
359
+ value: string[];
360
+ onChange: (ids: string[]) => void;
361
+ /** Where its files go and are found; none: it takes none (closed). */
362
+ files?: FileHost | undefined;
363
+ /** The kinds it takes: types, families ("image/*"), extensions (".xlsx"); none: any. */
364
+ accept?: readonly string[] | undefined;
365
+ multiple?: boolean | undefined;
366
+ /** The most a file may weigh, in MB (50 at most). */
367
+ maxMb?: number | undefined;
368
+ /**
369
+ * Hears what the field still waits on before its form may go, in words (a file on its way,
370
+ * one that failed), and null once nothing.
371
+ */
372
+ onWait?: ((problem: string | null) => void) | undefined;
373
+ }
374
+
375
+ /**
376
+ * Files to give: a zone to drop them on or press to choose them, saying what it takes; each file
377
+ * uploads at once (a line fills under it), then sits as a chip to take away; what is wrong with
378
+ * one (too heavy, a kind not taken, an upload that failed, to try again) says so on its chip.
379
+ * The value is the ids of the files in. One file unless `multiple`: once it is in, the zone
380
+ * steps aside until it is taken away. Closed, the chips are read, and open where the host shows
381
+ * files.
382
+ */
383
+ export function FileField({
384
+ value,
385
+ onChange,
386
+ files,
387
+ accept,
388
+ multiple = false,
389
+ maxMb,
390
+ onWait,
391
+ ...control
392
+ }: FileFieldProps) {
393
+ const { code, messages } = useKit();
394
+ const part = useParts();
395
+ const picker = useRef<HTMLInputElement>(null);
396
+ const [over, setOver] = useState(false);
397
+ const uploads = useUploads(files, { accept, maxMb, multiple }, () =>
398
+ value.map((id) => uploaded(id, files?.known.get(id))),
399
+ );
400
+ const closed = control.disabled === true || files === undefined;
401
+
402
+ // The ids go up whenever the files in change.
403
+ const sent = useRef(value.join(" "));
404
+ const ids = uploads.ids;
405
+ useEffect(() => {
406
+ const now = ids.join(" ");
407
+ if (now === sent.current) return;
408
+ sent.current = now;
409
+ onChange(ids);
410
+ }, [ids, onChange]);
411
+
412
+ const wait =
413
+ uploads.waiting === "uploading"
414
+ ? messages.stillUploading
415
+ : uploads.waiting === "failed"
416
+ ? messages.fixFiles
417
+ : null;
418
+ useEffect(() => {
419
+ onWait?.(wait);
420
+ }, [wait, onWait]);
421
+
422
+ // Files in whose names are not known here are asked for, once.
423
+ const missing = ids.filter((id) => !files?.known.has(id)).join(" ");
424
+ useEffect(() => {
425
+ if (missing !== "") files?.find?.(missing.split(" "));
426
+ }, [missing, files]);
427
+
428
+ const held = uploads.items.some((item) => item.state !== "refused" && item.state !== "failed");
429
+ const zone = closed ? uploads.items.length === 0 : multiple || !held;
430
+ const { id, labelledBy } = control;
431
+
432
+ return (
433
+ <div className={part("sc-upload")}>
434
+ {zone && (
435
+ <button
436
+ type="button"
437
+ id={id}
438
+ disabled={closed}
439
+ data-drop
440
+ data-over={over || undefined}
441
+ data-invalid={control.invalid || undefined}
442
+ {...ariaOf(control)}
443
+ // Its name is its label and what it says.
444
+ aria-labelledby={
445
+ labelledBy === undefined || id === undefined ? labelledBy : `${labelledBy} ${id}`
446
+ }
447
+ aria-required={undefined}
448
+ onClick={() => picker.current?.click()}
449
+ onDragOver={(event) => {
450
+ if (closed || !carriesFiles(event)) return;
451
+ event.preventDefault();
452
+ event.dataTransfer.dropEffect = "copy";
453
+ setOver(true);
454
+ }}
455
+ onDragLeave={() => {
456
+ setOver(false);
457
+ }}
458
+ onDrop={(event) => {
459
+ if (closed) return;
460
+ event.preventDefault();
461
+ setOver(false);
462
+ uploads.add([...event.dataTransfer.files]);
463
+ }}
464
+ className={part("sc-upload__zone")}
465
+ >
466
+ <span aria-hidden className={part("sc-upload__icon")}>
467
+ <UploadSimpleIcon weight="bold" />
468
+ </span>
469
+ <span className={part("sc-upload__text")}>
470
+ <strong>{messages.upload(multiple)}</strong>
471
+ <small>
472
+ {messages.drop}. {limitsOf(accept, maxMb, code, messages)}
473
+ </small>
474
+ </span>
475
+ </button>
476
+ )}
477
+ <input
478
+ ref={picker}
479
+ type="file"
480
+ hidden
481
+ tabIndex={-1}
482
+ accept={accept?.join(",")}
483
+ multiple={multiple}
484
+ onChange={(event) => {
485
+ uploads.add([...(event.target.files ?? [])]);
486
+ event.target.value = "";
487
+ }}
488
+ />
489
+ {uploads.items.length > 0 && <UploadChips uploads={uploads} host={files} closed={closed} />}
490
+ </div>
491
+ );
492
+ }
@@ -0,0 +1,56 @@
1
+ import {
2
+ FileAudioIcon,
3
+ FileDocIcon,
4
+ FileIcon,
5
+ FileImageIcon,
6
+ FilePdfIcon,
7
+ FilePptIcon,
8
+ FileTextIcon,
9
+ FileVideoIcon,
10
+ FileXlsIcon,
11
+ FileZipIcon,
12
+ type Icon,
13
+ } from "@phosphor-icons/react";
14
+
15
+ import { Mark } from "./Mark";
16
+ import { familyOf, type FileFamily } from "./uploads";
17
+
18
+ /** Each family's glyph: the format's own sheet (PDF, Word, Excel, PowerPoint), a picture, a clip. */
19
+ const GLYPHS: Readonly<Record<FileFamily, Icon>> = {
20
+ image: FileImageIcon,
21
+ pdf: FilePdfIcon,
22
+ sheet: FileXlsIcon,
23
+ doc: FileDocIcon,
24
+ slides: FilePptIcon,
25
+ text: FileTextIcon,
26
+ archive: FileZipIcon,
27
+ audio: FileAudioIcon,
28
+ video: FileVideoIcon,
29
+ other: FileIcon,
30
+ };
31
+
32
+ /**
33
+ * A file's mark: the glyph of its family, bare, by its name's extension (then its type), the
34
+ * common formats in their own tint (a PDF rose, a sheet green, a document blue, slides amber, a
35
+ * picture sand), the rest in the muted ink. It keeps `Mark`'s square.
36
+ */
37
+ export function FileMark({
38
+ name,
39
+ type = "",
40
+ size,
41
+ className,
42
+ }: {
43
+ name: string;
44
+ /** Its media type, when the name says nothing. */
45
+ type?: string | undefined;
46
+ size?: number | undefined;
47
+ className?: string | undefined;
48
+ }) {
49
+ const family = familyOf(name, type);
50
+ const Glyph = GLYPHS[family];
51
+ return (
52
+ <Mark size={size} className={className}>
53
+ <Glyph weight="regular" data-family={family} />
54
+ </Mark>
55
+ );
56
+ }