@q9labsai/chalk-react-native 4.1.17 → 5.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (540) hide show
  1. package/README.md +134 -29
  2. package/android/src/main/AndroidManifest.xml +2 -1
  3. package/android/src/main/java/ai/q9labs/chalk/reactnative/ChalkSpaceForegroundService.java +105 -31
  4. package/android/src/main/kotlin/ai/q9labs/chalk/reactnative/ChalkAndroidConnectionServicePackage.kt +2 -0
  5. package/android/src/main/kotlin/ai/q9labs/chalk/reactnative/ChalkAudioRouteModule.kt +138 -0
  6. package/android/src/main/kotlin/ai/q9labs/chalk/reactnative/ChalkCallServiceModule.kt +32 -0
  7. package/dist/android/call-service.d.ts +4 -0
  8. package/dist/android/call-service.d.ts.map +1 -0
  9. package/dist/avatar/FaceAvatar.d.ts +19 -0
  10. package/dist/avatar/FaceAvatar.d.ts.map +1 -0
  11. package/dist/avatar/tile-avatar-size.d.ts +3 -0
  12. package/dist/avatar/tile-avatar-size.d.ts.map +1 -0
  13. package/dist/chunk-GYVZSOGQ.js +30 -0
  14. package/dist/chunk-IHE6EA3T.js +25 -0
  15. package/dist/chunk-OIBT2FNM.js +1479 -0
  16. package/dist/client.d.ts +1 -5
  17. package/dist/client.d.ts.map +1 -1
  18. package/dist/client.js +185 -2
  19. package/dist/components/EmbeddedWhiteboard.d.ts.map +1 -1
  20. package/dist/components/native-media-visibility.d.ts +3 -2
  21. package/dist/components/native-media-visibility.d.ts.map +1 -1
  22. package/dist/components/useAndroidCallService.d.ts +8 -0
  23. package/dist/components/useAndroidCallService.d.ts.map +1 -0
  24. package/dist/dev.d.ts +10 -0
  25. package/dist/dev.d.ts.map +1 -0
  26. package/dist/dev.js +10 -0
  27. package/dist/dock/Dock.d.ts +23 -0
  28. package/dist/dock/Dock.d.ts.map +1 -0
  29. package/dist/dock/LeaveMenu.d.ts +12 -0
  30. package/dist/dock/LeaveMenu.d.ts.map +1 -0
  31. package/dist/dock/MoreSheet.d.ts +17 -0
  32. package/dist/dock/MoreSheet.d.ts.map +1 -0
  33. package/dist/dock/ReactionBurst.d.ts +8 -0
  34. package/dist/dock/ReactionBurst.d.ts.map +1 -0
  35. package/dist/dock/RoutePicker.d.ts +16 -0
  36. package/dist/dock/RoutePicker.d.ts.map +1 -0
  37. package/dist/dock/audio-route.d.ts +25 -0
  38. package/dist/dock/audio-route.d.ts.map +1 -0
  39. package/dist/error-YOPTEH5N.wav +0 -0
  40. package/dist/frame/CallFrame.d.ts +17 -0
  41. package/dist/frame/CallFrame.d.ts.map +1 -0
  42. package/dist/frame/Chalk.d.ts +40 -0
  43. package/dist/frame/Chalk.d.ts.map +1 -0
  44. package/dist/frame/back-handler.d.ts +6 -0
  45. package/dist/frame/back-handler.d.ts.map +1 -0
  46. package/dist/frame/dev-scenario.d.ts +28 -0
  47. package/dist/frame/dev-scenario.d.ts.map +1 -0
  48. package/dist/frame/device-layout.d.ts +16 -0
  49. package/dist/frame/device-layout.d.ts.map +1 -0
  50. package/dist/frame/measurement.d.ts +28 -0
  51. package/dist/frame/measurement.d.ts.map +1 -0
  52. package/dist/frame/portal.d.ts +24 -0
  53. package/dist/frame/portal.d.ts.map +1 -0
  54. package/dist/frame/preferences.d.ts +21 -0
  55. package/dist/frame/preferences.d.ts.map +1 -0
  56. package/dist/frame/regions.d.ts +25 -0
  57. package/dist/frame/regions.d.ts.map +1 -0
  58. package/dist/hand-DFWVXPH2.wav +0 -0
  59. package/dist/haptics/haptics.d.ts +12 -0
  60. package/dist/haptics/haptics.d.ts.map +1 -0
  61. package/dist/header/CallDetailsSheet.d.ts +18 -0
  62. package/dist/header/CallDetailsSheet.d.ts.map +1 -0
  63. package/dist/header/Header.d.ts +17 -0
  64. package/dist/header/Header.d.ts.map +1 -0
  65. package/dist/header/QrCode.d.ts +6 -0
  66. package/dist/header/QrCode.d.ts.map +1 -0
  67. package/dist/icons/Icon.d.ts +12 -0
  68. package/dist/icons/Icon.d.ts.map +1 -0
  69. package/dist/icons/icon-element.d.ts +24 -0
  70. package/dist/icons/icon-element.d.ts.map +1 -0
  71. package/dist/icons/icon-paths.d.ts +530 -0
  72. package/dist/icons/icon-paths.d.ts.map +1 -0
  73. package/dist/index.d.ts +6 -9
  74. package/dist/index.d.ts.map +1 -1
  75. package/dist/index.js +2956 -38
  76. package/dist/join-Z6RL5AHE.wav +0 -0
  77. package/dist/knock-4VBQSHK4.wav +0 -0
  78. package/dist/leave-MQLZOWQD.wav +0 -0
  79. package/dist/limbo/Limbo.d.ts +25 -0
  80. package/dist/limbo/Limbo.d.ts.map +1 -0
  81. package/dist/limbo/Veil.d.ts +10 -0
  82. package/dist/limbo/Veil.d.ts.map +1 -0
  83. package/dist/media/native-capture-error.d.ts +7 -0
  84. package/dist/media/native-capture-error.d.ts.map +1 -0
  85. package/dist/message-6Y6WJGTB.wav +0 -0
  86. package/dist/motion/MovingFrame.d.ts +36 -0
  87. package/dist/motion/MovingFrame.d.ts.map +1 -0
  88. package/dist/motion/motion.d.ts +82 -0
  89. package/dist/motion/motion.d.ts.map +1 -0
  90. package/dist/motion/presence.d.ts +6 -0
  91. package/dist/motion/presence.d.ts.map +1 -0
  92. package/dist/motion/press.d.ts +15 -0
  93. package/dist/motion/press.d.ts.map +1 -0
  94. package/dist/mute-H5SJFXVI.wav +0 -0
  95. package/dist/primitives/BottomSheet.d.ts +36 -0
  96. package/dist/primitives/BottomSheet.d.ts.map +1 -0
  97. package/dist/primitives/ChalkText.d.ts +13 -0
  98. package/dist/primitives/ChalkText.d.ts.map +1 -0
  99. package/dist/primitives/CopyButton.d.ts +11 -0
  100. package/dist/primitives/CopyButton.d.ts.map +1 -0
  101. package/dist/primitives/IconButton.d.ts +26 -0
  102. package/dist/primitives/IconButton.d.ts.map +1 -0
  103. package/dist/primitives/Menu.d.ts +39 -0
  104. package/dist/primitives/Menu.d.ts.map +1 -0
  105. package/dist/primitives/NameTag.d.ts +19 -0
  106. package/dist/primitives/NameTag.d.ts.map +1 -0
  107. package/dist/primitives/PillButton.d.ts +19 -0
  108. package/dist/primitives/PillButton.d.ts.map +1 -0
  109. package/dist/primitives/SegmentedControl.d.ts +17 -0
  110. package/dist/primitives/SegmentedControl.d.ts.map +1 -0
  111. package/dist/primitives/SheetGroup.d.ts +24 -0
  112. package/dist/primitives/SheetGroup.d.ts.map +1 -0
  113. package/dist/primitives/Switch.d.ts +9 -0
  114. package/dist/primitives/Switch.d.ts.map +1 -0
  115. package/dist/primitives/TileShell.d.ts +18 -0
  116. package/dist/primitives/TileShell.d.ts.map +1 -0
  117. package/dist/primitives/announce.d.ts +3 -0
  118. package/dist/primitives/announce.d.ts.map +1 -0
  119. package/dist/primitives/menu-placement.d.ts +32 -0
  120. package/dist/primitives/menu-placement.d.ts.map +1 -0
  121. package/dist/primitives/toast/Toast.d.ts +8 -0
  122. package/dist/primitives/toast/Toast.d.ts.map +1 -0
  123. package/dist/primitives/toast/ToastStack.d.ts +18 -0
  124. package/dist/primitives/toast/ToastStack.d.ts.map +1 -0
  125. package/dist/primitives/toast/toast-store.d.ts +39 -0
  126. package/dist/primitives/toast/toast-store.d.ts.map +1 -0
  127. package/dist/recording-Q4GB77Y4.wav +0 -0
  128. package/dist/sheets/people-chat/ChatNotices.d.ts +14 -0
  129. package/dist/sheets/people-chat/ChatNotices.d.ts.map +1 -0
  130. package/dist/sheets/people-chat/ChatTab.d.ts +6 -0
  131. package/dist/sheets/people-chat/ChatTab.d.ts.map +1 -0
  132. package/dist/sheets/people-chat/Composer.d.ts +7 -0
  133. package/dist/sheets/people-chat/Composer.d.ts.map +1 -0
  134. package/dist/sheets/people-chat/PeopleChatSheet.d.ts +17 -0
  135. package/dist/sheets/people-chat/PeopleChatSheet.d.ts.map +1 -0
  136. package/dist/sheets/people-chat/PeopleTab.d.ts +3 -0
  137. package/dist/sheets/people-chat/PeopleTab.d.ts.map +1 -0
  138. package/dist/sheets/people-chat/PhotoViewer.d.ts +19 -0
  139. package/dist/sheets/people-chat/PhotoViewer.d.ts.map +1 -0
  140. package/dist/sheets/people-chat/TextField.d.ts +4 -0
  141. package/dist/sheets/people-chat/TextField.d.ts.map +1 -0
  142. package/dist/sheets/people-chat/attachments.d.ts +33 -0
  143. package/dist/sheets/people-chat/attachments.d.ts.map +1 -0
  144. package/dist/sheets/people-chat/chat-model.d.ts +64 -0
  145. package/dist/sheets/people-chat/chat-model.d.ts.map +1 -0
  146. package/dist/sheets/people-chat/people-model.d.ts +43 -0
  147. package/dist/sheets/people-chat/people-model.d.ts.map +1 -0
  148. package/dist/sounds/sounds.d.ts +33 -0
  149. package/dist/sounds/sounds.d.ts.map +1 -0
  150. package/dist/space-client/create-native-space-client.d.ts +0 -4
  151. package/dist/space-client/create-native-space-client.d.ts.map +1 -1
  152. package/dist/space-client/random-uuid.d.ts +7 -0
  153. package/dist/space-client/random-uuid.d.ts.map +1 -0
  154. package/dist/stage/ContentTile.d.ts +18 -0
  155. package/dist/stage/ContentTile.d.ts.map +1 -0
  156. package/dist/stage/ParticipantTile.d.ts +18 -0
  157. package/dist/stage/ParticipantTile.d.ts.map +1 -0
  158. package/dist/stage/Stage.d.ts +14 -0
  159. package/dist/stage/Stage.d.ts.map +1 -0
  160. package/dist/stage/TileSheet.d.ts +12 -0
  161. package/dist/stage/TileSheet.d.ts.map +1 -0
  162. package/dist/stage/camera.d.ts +7 -0
  163. package/dist/stage/camera.d.ts.map +1 -0
  164. package/dist/stage/layout.d.ts +57 -0
  165. package/dist/stage/layout.d.ts.map +1 -0
  166. package/dist/stage/space-selector.d.ts +10 -0
  167. package/dist/stage/space-selector.d.ts.map +1 -0
  168. package/dist/stage/stage-view.d.ts +23 -0
  169. package/dist/stage/stage-view.d.ts.map +1 -0
  170. package/dist/status/CallOverlays.d.ts +17 -0
  171. package/dist/status/CallOverlays.d.ts.map +1 -0
  172. package/dist/status/ChalkArrival.d.ts +24 -0
  173. package/dist/status/ChalkArrival.d.ts.map +1 -0
  174. package/dist/status/StatusPage.d.ts +14 -0
  175. package/dist/status/StatusPage.d.ts.map +1 -0
  176. package/dist/status/call-screen.d.ts +20 -0
  177. package/dist/status/call-screen.d.ts.map +1 -0
  178. package/dist/test-VD2KAM4D.wav +0 -0
  179. package/dist/theme/theme.d.ts +15 -0
  180. package/dist/theme/theme.d.ts.map +1 -0
  181. package/dist/theme/tokens.d.ts +248 -0
  182. package/dist/theme/tokens.d.ts.map +1 -0
  183. package/dist/toasts/CallEventToasts.d.ts +21 -0
  184. package/dist/toasts/CallEventToasts.d.ts.map +1 -0
  185. package/dist/toasts/notices.d.ts +34 -0
  186. package/dist/toasts/notices.d.ts.map +1 -0
  187. package/dist/ui/ChalkUI.d.ts +12 -0
  188. package/dist/ui/ChalkUI.d.ts.map +1 -0
  189. package/dist/ui.d.ts +25 -0
  190. package/dist/ui.d.ts.map +1 -0
  191. package/dist/ui.js +77 -0
  192. package/dist/unmute-2XR2LICU.wav +0 -0
  193. package/embedded/chalk-whiteboard/asset-manifest.json +2 -2
  194. package/embedded/chalk-whiteboard/renderer.js +510 -510
  195. package/ios/ChalkAudioRouteModule.swift +93 -0
  196. package/ios/ChalkAudioRouteModuleBridge.m +9 -0
  197. package/package.json +46 -76
  198. package/src/android/call-service.ts +19 -0
  199. package/src/avatar/FaceAvatar.tsx +145 -0
  200. package/src/avatar/tile-avatar-size.ts +4 -0
  201. package/src/client.ts +1 -5
  202. package/src/components/EmbeddedWhiteboard.tsx +14 -71
  203. package/src/components/native-media-visibility.ts +1 -2
  204. package/src/components/useAndroidCallService.ts +41 -0
  205. package/src/dev.ts +9 -0
  206. package/src/dock/Dock.tsx +95 -0
  207. package/src/dock/LeaveMenu.tsx +21 -0
  208. package/src/dock/MoreSheet.tsx +233 -0
  209. package/src/dock/ReactionBurst.tsx +55 -0
  210. package/src/dock/RoutePicker.tsx +42 -0
  211. package/src/dock/audio-route.ts +69 -0
  212. package/src/frame/CallFrame.tsx +209 -0
  213. package/src/frame/Chalk.tsx +83 -0
  214. package/src/frame/back-handler.ts +19 -0
  215. package/src/frame/dev-scenario.ts +48 -0
  216. package/src/frame/device-layout.tsx +31 -0
  217. package/src/frame/measurement.ts +44 -0
  218. package/src/frame/portal.tsx +107 -0
  219. package/src/frame/preferences.tsx +48 -0
  220. package/src/frame/regions.test.ts +38 -0
  221. package/src/frame/regions.ts +60 -0
  222. package/src/haptics/haptics.ts +19 -0
  223. package/src/header/CallDetailsSheet.tsx +139 -0
  224. package/src/header/Header.tsx +107 -0
  225. package/src/header/QrCode.tsx +34 -0
  226. package/src/icons/Icon.tsx +35 -0
  227. package/src/icons/icon-element.ts +11 -0
  228. package/src/icons/icon-paths.ts +199 -0
  229. package/src/index.ts +6 -9
  230. package/src/limbo/Limbo.tsx +159 -0
  231. package/src/limbo/Veil.tsx +36 -0
  232. package/src/media/native-capture-error.test.ts +19 -0
  233. package/src/media/native-capture-error.ts +13 -0
  234. package/src/motion/MovingFrame.tsx +101 -0
  235. package/src/motion/motion.ts +33 -0
  236. package/src/motion/presence.ts +20 -0
  237. package/src/motion/press.ts +35 -0
  238. package/src/primitives/BottomSheet.tsx +211 -0
  239. package/src/primitives/ChalkText.tsx +23 -0
  240. package/src/primitives/CopyButton.tsx +78 -0
  241. package/src/primitives/IconButton.tsx +90 -0
  242. package/src/primitives/Menu.tsx +212 -0
  243. package/src/primitives/NameTag.tsx +68 -0
  244. package/src/primitives/PillButton.tsx +56 -0
  245. package/src/primitives/SegmentedControl.tsx +55 -0
  246. package/src/primitives/SheetGroup.tsx +72 -0
  247. package/src/primitives/Switch.tsx +39 -0
  248. package/src/primitives/TileShell.tsx +53 -0
  249. package/src/primitives/announce.ts +7 -0
  250. package/src/primitives/menu-placement.test.ts +50 -0
  251. package/src/primitives/menu-placement.ts +43 -0
  252. package/src/primitives/toast/Toast.tsx +50 -0
  253. package/src/primitives/toast/ToastStack.tsx +89 -0
  254. package/src/primitives/toast/toast-store.ts +86 -0
  255. package/src/sheets/people-chat/ChatNotices.tsx +69 -0
  256. package/src/sheets/people-chat/ChatTab.tsx +186 -0
  257. package/src/sheets/people-chat/Composer.tsx +182 -0
  258. package/src/sheets/people-chat/PeopleChatSheet.tsx +100 -0
  259. package/src/sheets/people-chat/PeopleTab.tsx +326 -0
  260. package/src/sheets/people-chat/PhotoViewer.tsx +132 -0
  261. package/src/sheets/people-chat/TextField.tsx +14 -0
  262. package/src/sheets/people-chat/attachments.tsx +183 -0
  263. package/src/sheets/people-chat/chat-model.ts +157 -0
  264. package/src/sheets/people-chat/people-chat-model.test.ts +98 -0
  265. package/src/sheets/people-chat/people-model.ts +68 -0
  266. package/src/sounds/assets/error.wav +0 -0
  267. package/src/sounds/assets/hand.wav +0 -0
  268. package/src/sounds/assets/join.wav +0 -0
  269. package/src/sounds/assets/knock.wav +0 -0
  270. package/src/sounds/assets/leave.wav +0 -0
  271. package/src/sounds/assets/message.wav +0 -0
  272. package/src/sounds/assets/mute.wav +0 -0
  273. package/src/sounds/assets/recording.wav +0 -0
  274. package/src/sounds/assets/test.wav +0 -0
  275. package/src/sounds/assets/unmute.wav +0 -0
  276. package/src/sounds/assets.d.ts +5 -0
  277. package/src/sounds/sounds.ts +50 -0
  278. package/src/space-client/create-native-space-client.ts +20 -181
  279. package/src/space-client/random-uuid.ts +17 -0
  280. package/src/space-client/whiteboard-watchdog.test.ts +23 -0
  281. package/src/stage/ContentTile.tsx +100 -0
  282. package/src/stage/ParticipantTile.tsx +140 -0
  283. package/src/stage/Stage.tsx +152 -0
  284. package/src/stage/TileSheet.tsx +116 -0
  285. package/src/stage/camera.ts +20 -0
  286. package/src/stage/layout.test.ts +77 -0
  287. package/src/stage/layout.ts +226 -0
  288. package/src/stage/space-selector.ts +31 -0
  289. package/src/stage/stage-view.tsx +68 -0
  290. package/src/status/CallOverlays.tsx +47 -0
  291. package/src/status/ChalkArrival.tsx +53 -0
  292. package/src/status/StatusPage.tsx +123 -0
  293. package/src/status/call-screen.test.ts +42 -0
  294. package/src/status/call-screen.ts +29 -0
  295. package/src/theme/theme.tsx +28 -0
  296. package/src/theme/tokens.ts +247 -0
  297. package/src/toasts/CallEventToasts.tsx +192 -0
  298. package/src/toasts/notices.test.ts +92 -0
  299. package/src/toasts/notices.ts +62 -0
  300. package/src/ui/ChalkUI.tsx +49 -0
  301. package/src/ui.ts +24 -0
  302. package/dist/android.d.ts +0 -2
  303. package/dist/android.d.ts.map +0 -1
  304. package/dist/android.js +0 -62
  305. package/dist/chunk-2OS7SSXE.js +0 -552
  306. package/dist/chunk-5DQ4KBRH.js +0 -690
  307. package/dist/chunk-ITLUHTVS.js +0 -5271
  308. package/dist/chunk-JB4LNWVP.js +0 -247
  309. package/dist/components/Chalk.d.ts +0 -79
  310. package/dist/components/Chalk.d.ts.map +0 -1
  311. package/dist/components/ChatMessageList.d.ts +0 -11
  312. package/dist/components/ChatMessageList.d.ts.map +0 -1
  313. package/dist/components/Entrance.d.ts +0 -22
  314. package/dist/components/Entrance.d.ts.map +0 -1
  315. package/dist/components/EntranceView.android.d.ts +0 -4
  316. package/dist/components/EntranceView.android.d.ts.map +0 -1
  317. package/dist/components/EntranceView.d.ts +0 -18
  318. package/dist/components/EntranceView.d.ts.map +0 -1
  319. package/dist/components/EntranceView.ios-pad.d.ts +0 -3
  320. package/dist/components/EntranceView.ios-pad.d.ts.map +0 -1
  321. package/dist/components/EntranceView.ios-phone.d.ts +0 -3
  322. package/dist/components/EntranceView.ios-phone.d.ts.map +0 -1
  323. package/dist/components/EntranceView.macos.d.ts +0 -4
  324. package/dist/components/EntranceView.macos.d.ts.map +0 -1
  325. package/dist/components/FaceAvatar.d.ts +0 -16
  326. package/dist/components/FaceAvatar.d.ts.map +0 -1
  327. package/dist/components/GradientSurface.d.ts +0 -14
  328. package/dist/components/GradientSurface.d.ts.map +0 -1
  329. package/dist/components/MediaView.d.ts +0 -14
  330. package/dist/components/MediaView.d.ts.map +0 -1
  331. package/dist/components/ReactionPicker.d.ts +0 -10
  332. package/dist/components/ReactionPicker.d.ts.map +0 -1
  333. package/dist/components/SpaceView.android.d.ts +0 -2
  334. package/dist/components/SpaceView.android.d.ts.map +0 -1
  335. package/dist/components/SpaceView.d.ts +0 -33
  336. package/dist/components/SpaceView.d.ts.map +0 -1
  337. package/dist/components/SpaceView.ios-pad.d.ts +0 -2
  338. package/dist/components/SpaceView.ios-pad.d.ts.map +0 -1
  339. package/dist/components/SpaceView.ios-phone.d.ts +0 -2
  340. package/dist/components/SpaceView.ios-phone.d.ts.map +0 -1
  341. package/dist/components/SpaceView.macos.d.ts +0 -2
  342. package/dist/components/SpaceView.macos.d.ts.map +0 -1
  343. package/dist/components/SpaceView.shared.d.ts +0 -3
  344. package/dist/components/SpaceView.shared.d.ts.map +0 -1
  345. package/dist/components/episode-diagnostic-render-observer.d.ts +0 -2
  346. package/dist/components/episode-diagnostic-render-observer.d.ts.map +0 -1
  347. package/dist/components/logo/Logo.d.ts +0 -11
  348. package/dist/components/logo/Logo.d.ts.map +0 -1
  349. package/dist/components/native-animation-controller.d.ts +0 -7
  350. package/dist/components/native-animation-controller.d.ts.map +0 -1
  351. package/dist/components/native-chat.d.ts +0 -8
  352. package/dist/components/native-chat.d.ts.map +0 -1
  353. package/dist/components/native-entrance/entrance-controller-store.d.ts +0 -34
  354. package/dist/components/native-entrance/entrance-controller-store.d.ts.map +0 -1
  355. package/dist/components/native-entrance/useEntranceController.d.ts +0 -19
  356. package/dist/components/native-entrance/useEntranceController.d.ts.map +0 -1
  357. package/dist/components/native-joining-loading-animation.d.ts +0 -9
  358. package/dist/components/native-joining-loading-animation.d.ts.map +0 -1
  359. package/dist/components/native-space-view/AppearanceSettings.d.ts +0 -2
  360. package/dist/components/native-space-view/AppearanceSettings.d.ts.map +0 -1
  361. package/dist/components/native-space-view/FeedbackSheet.d.ts +0 -12
  362. package/dist/components/native-space-view/FeedbackSheet.d.ts.map +0 -1
  363. package/dist/components/native-space-view/ParticipantActionSheet.d.ts +0 -9
  364. package/dist/components/native-space-view/ParticipantActionSheet.d.ts.map +0 -1
  365. package/dist/components/native-space-view/SettingsSheet.d.ts +0 -7
  366. package/dist/components/native-space-view/SettingsSheet.d.ts.map +0 -1
  367. package/dist/components/native-space-view/SpaceActionMenu.d.ts +0 -10
  368. package/dist/components/native-space-view/SpaceActionMenu.d.ts.map +0 -1
  369. package/dist/components/native-space-view/SpaceBottomDock.android.d.ts +0 -4
  370. package/dist/components/native-space-view/SpaceBottomDock.android.d.ts.map +0 -1
  371. package/dist/components/native-space-view/SpaceChatAttachment.d.ts +0 -8
  372. package/dist/components/native-space-view/SpaceChatAttachment.d.ts.map +0 -1
  373. package/dist/components/native-space-view/SpaceChatSheet.d.ts +0 -5
  374. package/dist/components/native-space-view/SpaceChatSheet.d.ts.map +0 -1
  375. package/dist/components/native-space-view/SpaceGrid.android.d.ts +0 -8
  376. package/dist/components/native-space-view/SpaceGrid.android.d.ts.map +0 -1
  377. package/dist/components/native-space-view/SpaceMoreSheet.d.ts +0 -7
  378. package/dist/components/native-space-view/SpaceMoreSheet.d.ts.map +0 -1
  379. package/dist/components/native-space-view/SpacePanelSheet.d.ts +0 -5
  380. package/dist/components/native-space-view/SpacePanelSheet.d.ts.map +0 -1
  381. package/dist/components/native-space-view/SpacePeopleSheet.d.ts +0 -5
  382. package/dist/components/native-space-view/SpacePeopleSheet.d.ts.map +0 -1
  383. package/dist/components/native-space-view/SpaceStage.android.d.ts +0 -29
  384. package/dist/components/native-space-view/SpaceStage.android.d.ts.map +0 -1
  385. package/dist/components/native-space-view/SpaceSurfacePrimitives.d.ts +0 -30
  386. package/dist/components/native-space-view/SpaceSurfacePrimitives.d.ts.map +0 -1
  387. package/dist/components/native-space-view/SpaceTopBar.android.d.ts +0 -11
  388. package/dist/components/native-space-view/SpaceTopBar.android.d.ts.map +0 -1
  389. package/dist/components/native-space-view/SpaceWhiteboardSurface.d.ts +0 -15
  390. package/dist/components/native-space-view/SpaceWhiteboardSurface.d.ts.map +0 -1
  391. package/dist/components/native-space-view/diagnostics.d.ts +0 -48
  392. package/dist/components/native-space-view/diagnostics.d.ts.map +0 -1
  393. package/dist/components/native-space-view/format-space-duration.d.ts +0 -2
  394. package/dist/components/native-space-view/format-space-duration.d.ts.map +0 -1
  395. package/dist/components/native-space-view/native-space-grid-keys.d.ts +0 -3
  396. package/dist/components/native-space-view/native-space-grid-keys.d.ts.map +0 -1
  397. package/dist/components/native-space-view/native-space-page-store.d.ts +0 -8
  398. package/dist/components/native-space-view/native-space-page-store.d.ts.map +0 -1
  399. package/dist/components/native-space-view/space-chat-attachments.d.ts +0 -15
  400. package/dist/components/native-space-view/space-chat-attachments.d.ts.map +0 -1
  401. package/dist/components/native-space-view/space-panel-layout.d.ts +0 -10
  402. package/dist/components/native-space-view/space-panel-layout.d.ts.map +0 -1
  403. package/dist/components/native-space-view/space-progressive-surface-helpers.d.ts +0 -16
  404. package/dist/components/native-space-view/space-progressive-surface-helpers.d.ts.map +0 -1
  405. package/dist/components/native-space-view/space-progressive-surface-types.d.ts +0 -3
  406. package/dist/components/native-space-view/space-progressive-surface-types.d.ts.map +0 -1
  407. package/dist/components/native-space-view/types.d.ts +0 -24
  408. package/dist/components/native-space-view/types.d.ts.map +0 -1
  409. package/dist/components/native-space-view/useSpaceViewController.contract.d.ts +0 -41
  410. package/dist/components/native-space-view/useSpaceViewController.contract.d.ts.map +0 -1
  411. package/dist/components/native-space-view/useSpaceViewController.d.ts +0 -156
  412. package/dist/components/native-space-view/useSpaceViewController.d.ts.map +0 -1
  413. package/dist/components/native-space-view/useSpaceViewDerived.d.ts +0 -12
  414. package/dist/components/native-space-view/useSpaceViewDerived.d.ts.map +0 -1
  415. package/dist/components/native-space-view/useSpaceViewPanels.d.ts +0 -70
  416. package/dist/components/native-space-view/useSpaceViewPanels.d.ts.map +0 -1
  417. package/dist/feedback/native-capture.d.ts +0 -9
  418. package/dist/feedback/native-capture.d.ts.map +0 -1
  419. package/dist/feedback/native-evidence.d.ts +0 -3
  420. package/dist/feedback/native-evidence.d.ts.map +0 -1
  421. package/dist/hooks/entrance-preview-store.d.ts +0 -16
  422. package/dist/hooks/entrance-preview-store.d.ts.map +0 -1
  423. package/dist/hooks/useEntrancePreview.d.ts +0 -7
  424. package/dist/hooks/useEntrancePreview.d.ts.map +0 -1
  425. package/dist/hooks/useLayout.d.ts +0 -16
  426. package/dist/hooks/useLayout.d.ts.map +0 -1
  427. package/dist/hooks/usePanels.d.ts +0 -12
  428. package/dist/hooks/usePanels.d.ts.map +0 -1
  429. package/dist/ios-pad.d.ts +0 -2
  430. package/dist/ios-pad.d.ts.map +0 -1
  431. package/dist/ios-pad.js +0 -62
  432. package/dist/ios-phone.d.ts +0 -2
  433. package/dist/ios-phone.d.ts.map +0 -1
  434. package/dist/ios-phone.js +0 -62
  435. package/dist/ios.d.ts +0 -2
  436. package/dist/ios.d.ts.map +0 -1
  437. package/dist/ios.js +0 -62
  438. package/dist/macos.d.ts +0 -2
  439. package/dist/macos.d.ts.map +0 -1
  440. package/dist/macos.js +0 -62
  441. package/dist/space-client/cloudflare-rtk-native.d.ts +0 -3
  442. package/dist/space-client/cloudflare-rtk-native.d.ts.map +0 -1
  443. package/dist/telemetry.d.ts +0 -63
  444. package/dist/telemetry.d.ts.map +0 -1
  445. package/dist/ui/appearance.d.ts +0 -246
  446. package/dist/ui/appearance.d.ts.map +0 -1
  447. package/dist/ui/appearance.js +0 -14
  448. package/dist/ui/native-appearance-context.d.ts +0 -15
  449. package/dist/ui/native-appearance-context.d.ts.map +0 -1
  450. package/dist/ui/native-theme.d.ts +0 -17
  451. package/dist/ui/native-theme.d.ts.map +0 -1
  452. package/dist/ui/native-types.d.ts +0 -38
  453. package/dist/ui/native-types.d.ts.map +0 -1
  454. package/dist/ui/participant-avatar.d.ts +0 -21
  455. package/dist/ui/participant-avatar.d.ts.map +0 -1
  456. package/dist/ui/theme-tokens.d.ts +0 -25
  457. package/dist/ui/theme-tokens.d.ts.map +0 -1
  458. package/dist/ui/theme.d.ts +0 -404
  459. package/dist/ui/theme.d.ts.map +0 -1
  460. package/dist/ui/theme.js +0 -8
  461. package/dist/utils/native-space-layout.d.ts +0 -42
  462. package/dist/utils/native-space-layout.d.ts.map +0 -1
  463. package/src/android.ts +0 -1
  464. package/src/components/Chalk.tsx +0 -363
  465. package/src/components/ChatMessageList.tsx +0 -209
  466. package/src/components/Entrance.tsx +0 -42
  467. package/src/components/EntranceView.android.tsx +0 -274
  468. package/src/components/EntranceView.ios-pad.tsx +0 -326
  469. package/src/components/EntranceView.ios-phone.tsx +0 -271
  470. package/src/components/EntranceView.macos.tsx +0 -278
  471. package/src/components/EntranceView.tsx +0 -38
  472. package/src/components/FaceAvatar.tsx +0 -120
  473. package/src/components/GradientSurface.tsx +0 -23
  474. package/src/components/MediaView.tsx +0 -76
  475. package/src/components/ReactionPicker.tsx +0 -98
  476. package/src/components/SpaceView.android.tsx +0 -1
  477. package/src/components/SpaceView.ios-pad.tsx +0 -1
  478. package/src/components/SpaceView.ios-phone.tsx +0 -1
  479. package/src/components/SpaceView.macos.tsx +0 -1
  480. package/src/components/SpaceView.shared.tsx +0 -98
  481. package/src/components/SpaceView.tsx +0 -54
  482. package/src/components/episode-diagnostic-render-observer.ts +0 -12
  483. package/src/components/logo/Logo.tsx +0 -309
  484. package/src/components/native-animation-controller.ts +0 -36
  485. package/src/components/native-chat.ts +0 -23
  486. package/src/components/native-entrance/entrance-controller-store.ts +0 -112
  487. package/src/components/native-entrance/useEntranceController.ts +0 -60
  488. package/src/components/native-joining-loading-animation.ts +0 -26
  489. package/src/components/native-space-view/AppearanceSettings.tsx +0 -114
  490. package/src/components/native-space-view/FeedbackSheet.tsx +0 -296
  491. package/src/components/native-space-view/ParticipantActionSheet.tsx +0 -99
  492. package/src/components/native-space-view/SettingsSheet.tsx +0 -164
  493. package/src/components/native-space-view/SpaceActionMenu.tsx +0 -109
  494. package/src/components/native-space-view/SpaceBottomDock.android.tsx +0 -115
  495. package/src/components/native-space-view/SpaceChatAttachment.tsx +0 -105
  496. package/src/components/native-space-view/SpaceChatSheet.tsx +0 -184
  497. package/src/components/native-space-view/SpaceGrid.android.tsx +0 -323
  498. package/src/components/native-space-view/SpaceMoreSheet.tsx +0 -190
  499. package/src/components/native-space-view/SpacePanelSheet.tsx +0 -45
  500. package/src/components/native-space-view/SpacePeopleSheet.tsx +0 -116
  501. package/src/components/native-space-view/SpaceStage.android.tsx +0 -372
  502. package/src/components/native-space-view/SpaceSurfacePrimitives.tsx +0 -75
  503. package/src/components/native-space-view/SpaceTopBar.android.tsx +0 -113
  504. package/src/components/native-space-view/SpaceWhiteboardSurface.tsx +0 -69
  505. package/src/components/native-space-view/diagnostics.ts +0 -84
  506. package/src/components/native-space-view/format-space-duration.ts +0 -3
  507. package/src/components/native-space-view/native-space-grid-keys.ts +0 -6
  508. package/src/components/native-space-view/native-space-page-store.ts +0 -41
  509. package/src/components/native-space-view/space-chat-attachments.test.ts +0 -26
  510. package/src/components/native-space-view/space-chat-attachments.ts +0 -37
  511. package/src/components/native-space-view/space-panel-layout.ts +0 -10
  512. package/src/components/native-space-view/space-progressive-surface-helpers.ts +0 -33
  513. package/src/components/native-space-view/space-progressive-surface-types.ts +0 -3
  514. package/src/components/native-space-view/types.ts +0 -25
  515. package/src/components/native-space-view/useSpaceViewController.contract.ts +0 -34
  516. package/src/components/native-space-view/useSpaceViewController.ts +0 -416
  517. package/src/components/native-space-view/useSpaceViewDerived.ts +0 -29
  518. package/src/components/native-space-view/useSpaceViewPanels.ts +0 -170
  519. package/src/feedback/native-capture.ts +0 -62
  520. package/src/feedback/native-evidence.ts +0 -37
  521. package/src/hooks/entrance-preview-store.ts +0 -99
  522. package/src/hooks/useEntrancePreview.ts +0 -26
  523. package/src/hooks/useLayout.ts +0 -37
  524. package/src/hooks/usePanels.ts +0 -30
  525. package/src/ios-pad.ts +0 -1
  526. package/src/ios-phone.ts +0 -1
  527. package/src/ios.ts +0 -1
  528. package/src/macos.ts +0 -1
  529. package/src/space-client/cloudflare-rtk-native.ts +0 -104
  530. package/src/telemetry.ts +0 -234
  531. package/src/types/hugeicons-direct.d.ts +0 -4
  532. package/src/types/react-native-safe-area-context.d.ts +0 -8
  533. package/src/ui/appearance.ts +0 -808
  534. package/src/ui/native-appearance-context.tsx +0 -74
  535. package/src/ui/native-theme.tsx +0 -54
  536. package/src/ui/native-types.ts +0 -40
  537. package/src/ui/participant-avatar.ts +0 -47
  538. package/src/ui/theme-tokens.ts +0 -41
  539. package/src/ui/theme.ts +0 -214
  540. package/src/utils/native-space-layout.ts +0 -135
@@ -0,0 +1,60 @@
1
+ import type { EdgeInsets } from "react-native-safe-area-context";
2
+ import type { Frame } from "../motion/MovingFrame";
3
+
4
+ /**
5
+ * How the call is arranged, as in the mockup's `mode()`:
6
+ * - `portrait`: a phone held upright, or an iPad in narrow Split View.
7
+ * - `landscape`: a phone on its side; the stage takes the screen and the controls fade (L1).
8
+ * - `pad`: an iPad (or a large tablet) with the laptop arrangement and the side card.
9
+ */
10
+ export type Arrangement = "portrait" | "landscape" | "pad";
11
+
12
+ /** The iPad uses the phone layout (portrait or landscape) until the laptop arrangement ships. */
13
+ export function arrangementFor(width: number, height: number): Arrangement {
14
+ return width > height ? "landscape" : "portrait";
15
+ }
16
+
17
+ export type FrameRegions = {
18
+ readonly header: Frame;
19
+ readonly stage: Frame;
20
+ readonly dock: Frame;
21
+ };
22
+
23
+ /** Gap between tiles, and between the stage and the screen's sides on a phone. */
24
+ export const STAGE_GAP = 8;
25
+
26
+ /**
27
+ * The header, stage and dock boxes for each arrangement, in screen points, from the mockup's
28
+ * `stageRect()` and chrome CSS. The stage never changes when the controls fade.
29
+ * `cardOpen` is the iPad side card, which takes 352 pt from the stage.
30
+ */
31
+ export function frameRegions(arrangement: Arrangement, width: number, height: number, insets: EdgeInsets, cardOpen = false): FrameRegions {
32
+ const { top, bottom, left, right } = insets;
33
+ if (arrangement === "portrait") {
34
+ const headerHeight = 52;
35
+ const dockHeight = 52;
36
+ // The dock sits 8 pt above the safe area, plus 6 pt for the label under the audio output button (R1).
37
+ const dockBottom = bottom + 8 + 6;
38
+ const stageTop = top + headerHeight;
39
+ return {
40
+ header: { x: left, y: top, width: width - left - right, height: headerHeight },
41
+ stage: { x: left + STAGE_GAP, y: stageTop, width: width - left - right - 2 * STAGE_GAP, height: height - stageTop - (bottom + 8 + dockHeight + 14) - 8 },
42
+ dock: { x: left, y: height - dockBottom - dockHeight, width: width - left - right, height: dockHeight },
43
+ };
44
+ }
45
+ if (arrangement === "landscape") {
46
+ const dockHeight = 52;
47
+ const topEdge = top + 8;
48
+ return {
49
+ header: { x: left, y: topEdge, width: width - left - right, height: 44 },
50
+ stage: { x: left + STAGE_GAP, y: topEdge, width: width - left - right - 2 * STAGE_GAP, height: height - topEdge - bottom - 4 },
51
+ dock: { x: left, y: height - (bottom + 6) - dockHeight, width: width - left - right, height: dockHeight },
52
+ };
53
+ }
54
+ const stageTop = top + 60;
55
+ return {
56
+ header: { x: 0, y: top, width, height: 60 },
57
+ stage: { x: 16, y: stageTop, width: width - 32 - (cardOpen ? 352 : 0), height: height - stageTop - (bottom + 16 + 44 + 16) },
58
+ dock: { x: 0, y: height - (bottom + 16) - 44, width, height: 44 },
59
+ };
60
+ }
@@ -0,0 +1,19 @@
1
+ import { impactAsync, ImpactFeedbackStyle, NotificationFeedbackType, notificationAsync, selectionAsync } from "expo-haptics";
2
+
3
+ /**
4
+ * The call's haptic moments, and only these. The mockup marks mute, hand raise and leave;
5
+ * a sheet ticks when a drag crosses the point where letting go closes it.
6
+ */
7
+ export const haptics = {
8
+ mute: () => fire(impactAsync(ImpactFeedbackStyle.Light)),
9
+ handRaise: () => fire(impactAsync(ImpactFeedbackStyle.Medium)),
10
+ leave: () => fire(notificationAsync(NotificationFeedbackType.Warning)),
11
+ sheetDetent: () => fire(selectionAsync()),
12
+ } as const;
13
+
14
+ export type HapticMoment = keyof typeof haptics;
15
+
16
+ // A device without a haptic engine rejects; the moment simply passes without feedback.
17
+ function fire(feedback: Promise<void>): void {
18
+ feedback.catch(() => undefined);
19
+ }
@@ -0,0 +1,139 @@
1
+ import { setStringAsync } from "expo-clipboard";
2
+ import type { RefObject } from "react";
3
+ import { Platform, Pressable, Share, StyleSheet, View } from "react-native";
4
+ import Animated from "react-native-reanimated";
5
+ import { useDeviceLayout } from "../frame/device-layout";
6
+ import { usePreferences } from "../frame/preferences";
7
+ import { Icon } from "../icons/Icon";
8
+ import { usePressAnimation } from "../motion/press";
9
+ import { BottomSheet } from "../primitives/BottomSheet";
10
+ import { ChalkText } from "../primitives/ChalkText";
11
+ import { CopyButton } from "../primitives/CopyButton";
12
+ import { IconButton } from "../primitives/IconButton";
13
+ import { MenuSection } from "../primitives/Menu";
14
+ import { SegmentedControl } from "../primitives/SegmentedControl";
15
+ import { Switch } from "../primitives/Switch";
16
+ import { useTheme } from "../theme/theme";
17
+ import { sizes, type ColorScheme } from "../theme/tokens";
18
+ import { QrCode } from "./QrCode";
19
+
20
+ export type CallDetailsSheetProps = {
21
+ readonly open: boolean;
22
+ readonly onClose: () => void;
23
+ readonly callName: string;
24
+ /** The call's link; without it the Share section is left out. */
25
+ readonly inviteLink?: string;
26
+ readonly returnFocusRef?: RefObject<View | null>;
27
+ };
28
+
29
+ const DETAILS_TOP = 58;
30
+
31
+ const SCHEMES = [
32
+ { value: "dark", label: "Dark", testID: "details.appearance.dark" },
33
+ { value: "light", label: "Light", testID: "details.appearance.light" },
34
+ ] as const;
35
+
36
+ /**
37
+ * Call details (`#info`), opened from the call's name: the link with copy, share and a QR code,
38
+ * then the appearance and sound choices.
39
+ */
40
+ export function CallDetailsSheet({ open, onClose, callName, inviteLink, returnFocusRef }: CallDetailsSheetProps): React.JSX.Element {
41
+ const preferences = usePreferences();
42
+ const layout = useDeviceLayout();
43
+ // `.dev .infop` keeps its top 58 pt under the safe area on a phone too, so the sheet runs from there to the bottom edge.
44
+ const heightRatio = (layout.height - layout.insets.top - DETAILS_TOP) / layout.height;
45
+ return (
46
+ <BottomSheet accessibilityLabel={callName} heightRatio={heightRatio} inset={14} onClose={onClose} open={open} returnFocusRef={returnFocusRef} testID="sheet.details" variant="popover">
47
+ <View style={styles.heading}>
48
+ <ChalkText accessibilityRole="header" numberOfLines={1} style={styles.title} variant="cardTitle">
49
+ {callName}
50
+ </ChalkText>
51
+ <IconButton accessibilityLabel="Close" icon="x" onPress={onClose} size={36} testID="details.close" tone="ghost" />
52
+ </View>
53
+ {inviteLink ? <ShareSection link={inviteLink} /> : null}
54
+ <Section first={!inviteLink}>
55
+ <MenuRow end={<SegmentedControl<ColorScheme> accessibilityLabel="Appearance" onChange={preferences.setColorScheme} options={SCHEMES} size="compact" testID="details.appearance" value={preferences.colorScheme} />} label="Appearance" />
56
+ <MenuRow end={<Switch accessibilityLabel="Sounds" onValueChange={preferences.setSoundsEnabled} testID="details.sounds" value={preferences.soundsEnabled} />} label="Sounds" />
57
+ </Section>
58
+ </BottomSheet>
59
+ );
60
+ }
61
+
62
+ function ShareSection({ link }: { readonly link: string }): React.JSX.Element {
63
+ const { colors } = useTheme();
64
+ return (
65
+ <Section first>
66
+ <MenuSection label="Share" />
67
+ <View style={[styles.link, { backgroundColor: colors.hover }]} testID="details.link">
68
+ <ChalkText numberOfLines={1} selectable style={styles.linkText} variant="bodyMedium">
69
+ {displayLink(link)}
70
+ </ChalkText>
71
+ <View style={styles.linkButtons}>
72
+ <CopyButton accessibilityLabel="Copy link" announcement="Link copied" onCopy={() => setStringAsync(link).then(() => undefined)} testID="details.copy" />
73
+ <ShareButton link={link} />
74
+ </View>
75
+ </View>
76
+ <View style={styles.qr}>
77
+ <QrCode size={112} value={link} />
78
+ <ChalkText style={styles.qrText} tone="textSoft" variant="meta">
79
+ Scan with a phone camera to join this call.
80
+ </ChalkText>
81
+ </View>
82
+ </Section>
83
+ );
84
+ }
85
+
86
+ /** The link as people read it, `chalkmeet.com/q9-team`, without the scheme or the invite token. */
87
+ export function displayLink(link: string): string {
88
+ return link.replace(/^https?:\/\//u, "").replace(/[#?].*$/u, "");
89
+ }
90
+
91
+ /** `.cp` with the share icon: a 36 pt round button that darkens and shrinks while pressed. */
92
+ function ShareButton({ link }: { readonly link: string }): React.JSX.Element {
93
+ const { colors } = useTheme();
94
+ const press = usePressAnimation("small");
95
+ const share = () => {
96
+ Share.share(Platform.OS === "ios" ? { url: link } : { message: link }).catch(() => undefined);
97
+ };
98
+ return (
99
+ <Pressable accessibilityLabel="Share link" accessibilityRole="button" hitSlop={4} onPress={share} onPressIn={press.onPressIn} onPressOut={press.onPressOut} testID="details.share">
100
+ {({ pressed }) => (
101
+ <Animated.View style={[styles.round, pressed ? { backgroundColor: colors.pressed } : null, press.scaleStyle]}>
102
+ <Icon color={colors.text} name="iosShare" />
103
+ </Animated.View>
104
+ )}
105
+ </Pressable>
106
+ );
107
+ }
108
+
109
+ /** `.isec`: sections after the first sit under a hairline. */
110
+ function Section({ first = false, children }: { readonly first?: boolean; readonly children: React.ReactNode }): React.JSX.Element {
111
+ const { colors } = useTheme();
112
+ return <View style={[styles.section, first ? null : { borderTopWidth: 1, borderTopColor: colors.line }]}>{children}</View>;
113
+ }
114
+
115
+ /** `.mi` holding its own control at the end, such as the appearance switch (`.mi.appr`). */
116
+ function MenuRow({ label, end }: { readonly label: string; readonly end: React.ReactNode }): React.JSX.Element {
117
+ return (
118
+ <View style={styles.row}>
119
+ <ChalkText numberOfLines={1} style={styles.rowLabel}>
120
+ {label}
121
+ </ChalkText>
122
+ {end}
123
+ </View>
124
+ );
125
+ }
126
+
127
+ const styles = StyleSheet.create({
128
+ heading: { flexDirection: "row", alignItems: "center", justifyContent: "space-between", gap: 8, paddingTop: 2, paddingBottom: 4, paddingLeft: 10 },
129
+ title: { flexShrink: 1 },
130
+ section: { paddingTop: 4, paddingBottom: 8 },
131
+ link: { flexDirection: "row", alignItems: "center", justifyContent: "space-between", gap: 8, height: 44, marginHorizontal: 6, paddingLeft: 14, paddingRight: 4, borderRadius: 999 },
132
+ linkText: { flexShrink: 1 },
133
+ linkButtons: { flexDirection: "row", gap: 2 },
134
+ round: { width: 36, height: 36, borderRadius: 18, alignItems: "center", justifyContent: "center" },
135
+ qr: { flexDirection: "row", alignItems: "center", gap: 14, marginTop: 10, marginHorizontal: 6, marginBottom: 2 },
136
+ qrText: { flex: 1 },
137
+ row: { flexDirection: "row", alignItems: "center", gap: 10, minHeight: sizes.menuRowPhone, paddingHorizontal: 10 },
138
+ rowLabel: { flex: 1 },
139
+ });
@@ -0,0 +1,107 @@
1
+ import { forwardRef, memo, useEffect, useState } from "react";
2
+ import { Pressable, StyleSheet, View, type View as ViewType } from "react-native";
3
+ import Animated from "react-native-reanimated";
4
+ import { useConnection, useRecording } from "../hooks/space-hooks";
5
+ import { useMeasuredRef } from "../frame/measurement";
6
+ import { Icon } from "../icons/Icon";
7
+ import { usePressAnimation } from "../motion/press";
8
+ import { ChalkText } from "../primitives/ChalkText";
9
+ import { useTheme } from "../theme/theme";
10
+ import type { Arrangement } from "../frame/regions";
11
+
12
+ export type HeaderProps = {
13
+ readonly callName: string;
14
+ readonly arrangement: Arrangement;
15
+ readonly onOpenDetails: () => void;
16
+ /** The call details sheet is open. */
17
+ readonly detailsOpen: boolean;
18
+ };
19
+
20
+ /**
21
+ * The call header (`.hdr`): the call's name with its chevron, which opens the call details, then
22
+ * the Rec dot while the call is recorded (K5) and the timer. In landscape the name sits in a
23
+ * pill and the timer is left out.
24
+ */
25
+ export const Header = memo(
26
+ forwardRef<ViewType, HeaderProps>(function Header({ callName, arrangement, onOpenDetails, detailsOpen }, ref) {
27
+ const { colors } = useTheme();
28
+ const press = usePressAnimation("pill");
29
+ const landscape = arrangement === "landscape";
30
+ const headerStyle = [styles.header, arrangement === "pad" ? styles.pad : landscape ? styles.landscape : styles.portrait];
31
+ const headerRef = useMeasuredRef<ViewType>("frame.header", headerStyle);
32
+ const nameStyle = [styles.name, landscape ? [styles.namePill, { backgroundColor: colors.raised, boxShadow: `0px 0px 0px 1px ${colors.lineStrong}` }] : null];
33
+ const nameRef = useMeasuredRef<ViewType>("header.name", nameStyle);
34
+ return (
35
+ <View pointerEvents="box-none" ref={headerRef} style={headerStyle} testID="frame.header">
36
+ <Pressable accessibilityLabel={`Call details, ${callName}`} accessibilityRole="button" accessibilityState={{ expanded: detailsOpen }} onPress={onOpenDetails} onPressIn={press.onPressIn} onPressOut={press.onPressOut} ref={ref} style={styles.nameButton} testID="header.name">
37
+ <Animated.View ref={nameRef} style={[nameStyle, press.scaleStyle]}>
38
+ <ChalkText numberOfLines={1} style={styles.nameText} variant="bodyStrong">
39
+ {callName}
40
+ </ChalkText>
41
+ <Icon color={colors.textMuted} name="down" size={16} />
42
+ </Animated.View>
43
+ </Pressable>
44
+ <View style={styles.status}>
45
+ <RecordingDot />
46
+ {landscape ? null : <CallTimer />}
47
+ </View>
48
+ </View>
49
+ );
50
+ }),
51
+ );
52
+
53
+ /** `.rec`: a red dot and "Rec" while the call is being recorded, seen by everyone in it. */
54
+ function RecordingDot(): React.JSX.Element | null {
55
+ const { colors } = useTheme();
56
+ const status = useRecording().current?.status;
57
+ if (status !== "recording" && status !== "stopping") return null;
58
+ return (
59
+ <View accessibilityLabel="This call is being recorded" accessible style={styles.rec} testID="header.recording">
60
+ <View style={[styles.recDot, { backgroundColor: colors.danger }]} />
61
+ <ChalkText variant="meta">Rec</ChalkText>
62
+ </View>
63
+ );
64
+ }
65
+
66
+ /** Minutes and seconds since the call started, in tabular figures. Re-renders once a second, alone. */
67
+ function CallTimer(): React.JSX.Element | null {
68
+ const { episode } = useConnection();
69
+ const startedAt = episode?.startedAt ? Date.parse(episode.startedAt) : null;
70
+ const [now, setNow] = useState(Date.now);
71
+ useEffect(() => {
72
+ if (startedAt === null) return;
73
+ const timer = setInterval(() => setNow(Date.now()), 1000);
74
+ return () => clearInterval(timer);
75
+ }, [startedAt]);
76
+ if (startedAt === null) return null;
77
+ return (
78
+ <ChalkText accessibilityLabel={`Call time ${formatElapsed(now - startedAt)}`} tabular testID="header.timer" tone="textMuted" variant="bodyMedium">
79
+ {formatElapsed(now - startedAt)}
80
+ </ChalkText>
81
+ );
82
+ }
83
+
84
+ export function formatElapsed(milliseconds: number): string {
85
+ const total = Math.max(0, Math.floor(milliseconds / 1000));
86
+ const hours = Math.floor(total / 3600);
87
+ const minutes = Math.floor((total % 3600) / 60);
88
+ const seconds = String(total % 60).padStart(2, "0");
89
+ return hours > 0 ? `${hours}:${String(minutes).padStart(2, "0")}:${seconds}` : `${minutes}:${seconds}`;
90
+ }
91
+
92
+ const styles = StyleSheet.create({
93
+ header: { flex: 1, flexDirection: "row", alignItems: "center", justifyContent: "space-between", gap: 8 },
94
+ portrait: { paddingLeft: 14, paddingRight: 12 },
95
+ landscape: { paddingHorizontal: 8, justifyContent: "flex-start" },
96
+ pad: { paddingLeft: 24, paddingRight: 16 },
97
+ nameButton: { flexShrink: 1 },
98
+ // `.nameb`: 44 pt high, pulled 6 pt left so the text lines up with the header padding.
99
+ name: { flexDirection: "row", alignItems: "center", gap: 4, height: 44, paddingHorizontal: 6, marginLeft: -6, borderRadius: 999 },
100
+ // `.lnd .title`: a 40 pt pill. The mockup pulls `.nameb` 6 pt into the pill's 2 pt padding, so the
101
+ // text starts 2 pt in, and the name's own 6 pt plus the pill's 12 pt follow the chevron.
102
+ namePill: { height: 40, marginLeft: 0, paddingLeft: 2, paddingRight: 18 },
103
+ nameText: { flexShrink: 1 },
104
+ status: { flexDirection: "row", alignItems: "center", gap: 10 },
105
+ rec: { flexDirection: "row", alignItems: "center", gap: 6 },
106
+ recDot: { width: 8, height: 8, borderRadius: 4 },
107
+ });
@@ -0,0 +1,34 @@
1
+ import { memo, useMemo } from "react";
2
+ import { View } from "react-native";
3
+ import Svg, { Path, Rect } from "react-native-svg";
4
+ import { encode } from "uqr";
5
+ import { fixed } from "../theme/tokens";
6
+
7
+ /** The call link as a QR code (`svg.qr`): black on white with a two-module quiet zone, in both themes. */
8
+ export const QrCode = memo(function QrCode({ value, size }: { readonly value: string; readonly size: number }): React.JSX.Element {
9
+ const { path, modules } = useMemo(() => {
10
+ const { data, size: count } = encode(value, { ecc: "M", border: 2 });
11
+ // One rectangle per run of dark modules in a row, so no antialiased seams show between them.
12
+ let d = "";
13
+ data.forEach((row, y) => {
14
+ let start = -1;
15
+ row.forEach((dark, x) => {
16
+ if (dark && start < 0) start = x;
17
+ if (start >= 0 && (!dark || x === row.length - 1)) {
18
+ const end = dark ? x + 1 : x;
19
+ d += `M${start} ${y}h${end - start}v1h${start - end}z`;
20
+ start = -1;
21
+ }
22
+ });
23
+ });
24
+ return { path: d, modules: count };
25
+ }, [value]);
26
+ return (
27
+ <View accessibilityLabel={`QR code for ${value}`} accessibilityRole="image" accessible style={{ width: size, height: size, borderRadius: 8, overflow: "hidden" }} testID="details.qr">
28
+ <Svg height={size} viewBox={`0 0 ${modules} ${modules}`} width={size}>
29
+ <Rect fill={fixed.qrLight} height={modules} width={modules} x={0} y={0} />
30
+ <Path d={path} fill={fixed.qrDark} />
31
+ </Svg>
32
+ </View>
33
+ );
34
+ });
@@ -0,0 +1,35 @@
1
+ import { memo } from "react";
2
+ import Svg, { Circle, Path, Rect } from "react-native-svg";
3
+ import type { IconElement } from "./icon-element";
4
+ import { iconElements } from "./icon-paths";
5
+
6
+ export type IconName = keyof typeof iconElements;
7
+
8
+ export type IconProps = {
9
+ readonly name: IconName;
10
+ readonly color: string;
11
+ /** The mockup draws icons at 20 pt by default, 16 to 18 pt in tags and menus. */
12
+ readonly size?: number;
13
+ readonly strokeWidth?: number;
14
+ };
15
+
16
+ /** One icon from the mockup's 24-unit, 1.75-stroke line set. Icons are decorative; label the control that holds them. */
17
+ export const Icon = memo(function Icon({ name, color, size = 20, strokeWidth = 1.75 }: IconProps): React.JSX.Element {
18
+ return (
19
+ <Svg accessibilityElementsHidden fill="none" height={size} importantForAccessibility="no-hide-descendants" stroke={color} strokeLinecap="round" strokeLinejoin="round" strokeWidth={strokeWidth} viewBox="0 0 24 24" width={size}>
20
+ {iconElements[name].map((element: IconElement, index) => renderElement(element, index, color))}
21
+ </Svg>
22
+ );
23
+ });
24
+
25
+ function renderElement(element: IconElement, key: number, color: string): React.JSX.Element {
26
+ const shared = { fill: element.fill === "currentColor" ? color : "none", strokeWidth: element.strokeWidth, transform: element.transform };
27
+ switch (element.kind) {
28
+ case "path":
29
+ return <Path key={key} {...shared} d={element.d} />;
30
+ case "rect":
31
+ return <Rect key={key} {...shared} height={element.height} rx={element.rx} width={element.width} x={element.x} y={element.y} />;
32
+ case "circle":
33
+ return <Circle key={key} {...shared} cx={element.cx} cy={element.cy} r={element.r} />;
34
+ }
35
+ }
@@ -0,0 +1,11 @@
1
+ type Stroke = {
2
+ readonly strokeWidth?: number;
3
+ /** `currentColor` fills the shape with the icon colour; otherwise shapes are stroked only. */
4
+ readonly fill?: "currentColor";
5
+ readonly transform?: string;
6
+ };
7
+
8
+ export type IconElement =
9
+ | (Stroke & { readonly kind: "path"; readonly d: string })
10
+ | (Stroke & { readonly kind: "rect"; readonly x: number; readonly y: number; readonly width: number; readonly height: number; readonly rx?: number })
11
+ | (Stroke & { readonly kind: "circle"; readonly cx: number; readonly cy: number; readonly r: number });
@@ -0,0 +1,199 @@
1
+ // Generated from the mobile mockup's icon set (`const P` in mobile-mockup.html). Regenerate rather than edit by hand.
2
+ import type { IconElement } from "./icon-element";
3
+
4
+ export const iconElements = {
5
+ mic: [
6
+ { kind: "rect", x: 9, y: 2, width: 6, height: 12, rx: 3 },
7
+ { kind: "path", d: "M19 10v1a7 7 0 0 1-14 0v-1M12 18v4" },
8
+ ],
9
+ micOff: [{ kind: "path", d: "M2 2l20 20M15 9.3V5a3 3 0 0 0-5.7-1.3M9 9v2a3 3 0 0 0 5.1 2.1M17 17a7 7 0 0 1-12-6v-1M19 10v1a7 7 0 0 1-.1 1.2M12 18v4" }],
10
+ cam: [
11
+ { kind: "path", d: "M16 10.5l5-3v9l-5-3z" },
12
+ { kind: "rect", x: 2, y: 6, width: 14, height: 12, rx: 2 },
13
+ ],
14
+ camOff: [{ kind: "path", d: "M2 2l20 20M10.7 6H14a2 2 0 0 1 2 2v3.3l1 1 4-2.8v8M16 16a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h2" }],
15
+ down: [{ kind: "path", d: "M6 9l6 6 6-6" }],
16
+ shield: [{ kind: "path", d: "M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z" }],
17
+ globe: [
18
+ { kind: "circle", cx: 12, cy: 12, r: 9 },
19
+ { kind: "path", d: "M3 12h18M12 3a14 14 0 0 1 0 18M12 3a14 14 0 0 0 0 18" },
20
+ ],
21
+ pause: [{ kind: "path", d: "M9 5v14M15 5v14", strokeWidth: 2.5 }],
22
+ shareOff: [
23
+ { kind: "rect", x: 2, y: 3, width: 20, height: 14, rx: 2 },
24
+ { kind: "path", d: "M8 21h8M12 17v4M9.5 7.5l5 5M14.5 7.5l-5 5" },
25
+ ],
26
+ monitor: [
27
+ { kind: "rect", x: 2, y: 3, width: 20, height: 14, rx: 2 },
28
+ { kind: "path", d: "M8 21h8M12 17v4" },
29
+ ],
30
+ appwin: [
31
+ { kind: "rect", x: 3, y: 4, width: 18, height: 16, rx: 2 },
32
+ { kind: "path", d: "M3 9h18M6.5 6.5h.01M9 6.5h.01" },
33
+ ],
34
+ tabi: [
35
+ { kind: "path", d: "M3 20V7a2 2 0 0 1 2-2h5l2 3h7a2 2 0 0 1 2 2v10z" },
36
+ { kind: "path", d: "M3 11h18" },
37
+ ],
38
+ swap: [{ kind: "path", d: "M17 3l4 4-4 4M21 7H9M7 21l-4-4 4-4M3 17h12" }],
39
+ fill: [
40
+ { kind: "rect", x: 3, y: 5, width: 18, height: 14, rx: 2 },
41
+ { kind: "path", d: "M7 12h10M7 12l2.5-2.5M7 12l2.5 2.5M17 12l-2.5-2.5M17 12l-2.5 2.5" },
42
+ ],
43
+ fit: [
44
+ { kind: "rect", x: 3, y: 5, width: 18, height: 14, rx: 2 },
45
+ { kind: "rect", x: 7.5, y: 9, width: 9, height: 6, rx: 1 },
46
+ ],
47
+ zoomIn: [
48
+ { kind: "circle", cx: 11, cy: 11, r: 7 },
49
+ { kind: "path", d: "M21 21l-4.3-4.3M8 11h6M11 8v6" },
50
+ ],
51
+ zoomOut: [
52
+ { kind: "circle", cx: 11, cy: 11, r: 7 },
53
+ { kind: "path", d: "M21 21l-4.3-4.3M8 11h6" },
54
+ ],
55
+ pip: [
56
+ { kind: "rect", x: 2, y: 4, width: 20, height: 16, rx: 2 },
57
+ { kind: "rect", x: 12, y: 12, width: 7, height: 5, rx: 1, fill: "currentColor" },
58
+ ],
59
+ undo: [
60
+ { kind: "path", d: "M9 14L4 9l5-5" },
61
+ { kind: "path", d: "M4 9h10.5a5.5 5.5 0 0 1 0 11H11" },
62
+ ],
63
+ redo: [
64
+ { kind: "path", d: "M15 14l5-5-5-5" },
65
+ { kind: "path", d: "M20 9H9.5a5.5 5.5 0 0 0 0 11H13" },
66
+ ],
67
+ vol: [
68
+ { kind: "path", d: "M11 5L6 9H2v6h4l5 4z" },
69
+ { kind: "path", d: "M15.5 8.5a5 5 0 0 1 0 7M19 5a10 10 0 0 1 0 14" },
70
+ ],
71
+ qr: [
72
+ { kind: "rect", x: 3, y: 3, width: 7, height: 7, rx: 1.5 },
73
+ { kind: "rect", x: 14, y: 3, width: 7, height: 7, rx: 1.5 },
74
+ { kind: "rect", x: 3, y: 14, width: 7, height: 7, rx: 1.5 },
75
+ { kind: "path", d: "M14 14h3v3M21 14v.01M14 21h3M21 17v4h-1" },
76
+ ],
77
+ up2: [{ kind: "path", d: "M18 15l-6-6-6 6" }],
78
+ right: [{ kind: "path", d: "M9 18l6-6-6-6" }],
79
+ share: [
80
+ { kind: "rect", x: 2, y: 3, width: 20, height: 14, rx: 2 },
81
+ { kind: "path", d: "M8 21h8M12 17v4M9 10l3-3 3 3M12 7v6" },
82
+ ],
83
+ smile: [
84
+ { kind: "circle", cx: 12, cy: 12, r: 9 },
85
+ { kind: "path", d: "M8.5 14.5s1.3 1.8 3.5 1.8 3.5-1.8 3.5-1.8M9 9.5h.01M15 9.5h.01" },
86
+ ],
87
+ pen: [
88
+ { kind: "path", d: "M17 3a2.85 2.85 0 1 1 4 4L7.5 20.5 2 22l1.5-5.5z" },
89
+ { kind: "path", d: "M15 5l4 4" },
90
+ ],
91
+ rec: [
92
+ { kind: "circle", cx: 12, cy: 12, r: 9 },
93
+ { kind: "circle", cx: 12, cy: 12, r: 3.5, fill: "currentColor" },
94
+ ],
95
+ max: [{ kind: "path", d: "M8 3H5a2 2 0 0 0-2 2v3M21 8V5a2 2 0 0 0-2-2h-3M3 16v3a2 2 0 0 0 2 2h3M16 21h3a2 2 0 0 0 2-2v-3" }],
96
+ min: [{ kind: "path", d: "M8 3v3a2 2 0 0 1-2 2H3M21 8h-3a2 2 0 0 1-2-2V3M3 16h3a2 2 0 0 1 2 2v3M16 21v-3a2 2 0 0 1 2-2h3" }],
97
+ hang: [
98
+ {
99
+ kind: "path",
100
+ transform: "rotate(135 12 12)",
101
+ d: "M22 16.9v3a2 2 0 0 1-2.2 2 19.8 19.8 0 0 1-8.6-3.1 19.5 19.5 0 0 1-6-6A19.8 19.8 0 0 1 2.1 4.2 2 2 0 0 1 4.1 2h3a2 2 0 0 1 2 1.7c.1 1 .4 1.9.7 2.8a2 2 0 0 1-.5 2.1L8.1 9.9a16 16 0 0 0 6 6l1.3-1.3a2 2 0 0 1 2.1-.4c.9.3 1.8.6 2.8.7a2 2 0 0 1 1.7 2z",
102
+ },
103
+ ],
104
+ link: [
105
+ { kind: "path", d: "M10 13a5 5 0 0 0 7.5.5l3-3a5 5 0 0 0-7-7l-1.8 1.7" },
106
+ { kind: "path", d: "M14 11a5 5 0 0 0-7.5-.5l-3 3a5 5 0 0 0 7 7l1.7-1.7" },
107
+ ],
108
+ chat: [{ kind: "path", d: "M7.9 20A9 9 0 1 0 4 16.1L2 22z" }],
109
+ grid: [
110
+ { kind: "rect", x: 3, y: 3, width: 7.5, height: 7.5, rx: 1.5 },
111
+ { kind: "rect", x: 13.5, y: 3, width: 7.5, height: 7.5, rx: 1.5 },
112
+ { kind: "rect", x: 3, y: 13.5, width: 7.5, height: 7.5, rx: 1.5 },
113
+ { kind: "rect", x: 13.5, y: 13.5, width: 7.5, height: 7.5, rx: 1.5 },
114
+ ],
115
+ spot: [
116
+ { kind: "rect", x: 3, y: 3, width: 18, height: 12.5, rx: 2 },
117
+ { kind: "path", d: "M4 20.5h3M10.5 20.5h3M17 20.5h3" },
118
+ ],
119
+ more: [{ kind: "path", d: "M5 12h.01M12 12h.01M19 12h.01", strokeWidth: 3 }],
120
+ x: [{ kind: "path", d: "M18 6L6 18M6 6l12 12" }],
121
+ clip: [{ kind: "path", d: "M20.5 11.2l-8.4 8.4a5 5 0 0 1-7.1-7.1l8.4-8.4a3.3 3.3 0 0 1 4.7 4.7l-8.4 8.4a1.7 1.7 0 0 1-2.4-2.4l7.7-7.7" }],
122
+ dl: [{ kind: "path", d: "M12 4v11M7 10.5l5 5 5-5M5 20h14" }],
123
+ left: [{ kind: "path", d: "M15 18l-6-6 6-6" }],
124
+ plus: [{ kind: "path", d: "M12 5v14M5 12h14" }],
125
+ alert: [
126
+ { kind: "circle", cx: 12, cy: 12, r: 9 },
127
+ { kind: "path", d: "M12 7.5v5.5M12 16.5v.01" },
128
+ ],
129
+ lock: [
130
+ { kind: "rect", x: 5, y: 11, width: 14, height: 9, rx: 2 },
131
+ { kind: "path", d: "M8 11V8a4 4 0 0 1 8 0v3" },
132
+ ],
133
+ clock: [
134
+ { kind: "circle", cx: 12, cy: 12, r: 9 },
135
+ { kind: "path", d: "M12 7v5l3 2" },
136
+ ],
137
+ img: [
138
+ { kind: "rect", x: 3, y: 4, width: 18, height: 16, rx: 2.5 },
139
+ { kind: "circle", cx: 9, cy: 10, r: 1.8 },
140
+ { kind: "path", d: "M21 15.5l-4.8-4.8L6 20" },
141
+ ],
142
+ smileP: [
143
+ { kind: "path", d: "M20.9 11a9 9 0 1 1-7.9-7.9" },
144
+ { kind: "path", d: "M8.5 14.5s1.3 1.8 3.5 1.8 3.5-1.8 3.5-1.8M9 9.5h.01M15 9.5h.01M19 2v6M16 5h6" },
145
+ ],
146
+ check: [{ kind: "path", d: "M20 6L9 17l-5-5" }],
147
+ hand: [
148
+ { kind: "path", d: "M18 11V6a2 2 0 0 0-4 0v5M14 10V4a2 2 0 0 0-4 0v6M10 10.5V6a2 2 0 0 0-4 0v8" },
149
+ { kind: "path", d: "M18 8a2 2 0 1 1 4 0v6a8 8 0 0 1-8 8h-2c-2.8 0-4.5-.9-6-2.3l-3.6-3.6a2 2 0 0 1 2.8-2.8L7 15" },
150
+ ],
151
+ pin: [{ kind: "path", d: "M12 17v5M9 10.8a2 2 0 0 1-1.1 1.8l-1.8.9A2 2 0 0 0 5 15.2V17h14v-1.8a2 2 0 0 0-1.1-1.8l-1.8-.9a2 2 0 0 1-1.1-1.8V7a1 1 0 0 1 1-1 2 2 0 0 0 0-4H8a2 2 0 0 0 0 4 1 1 0 0 1 1 1z" }],
152
+ search: [
153
+ { kind: "circle", cx: 11, cy: 11, r: 7 },
154
+ { kind: "path", d: "M21 21l-4.3-4.3" },
155
+ ],
156
+ up: [{ kind: "path", d: "M12 19V5M5 12l7-7 7 7" }],
157
+ retry: [
158
+ { kind: "path", d: "M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8" },
159
+ { kind: "path", d: "M3 3v5h5" },
160
+ ],
161
+ home: [{ kind: "path", d: "M3 10.5L12 3l9 7.5V20a1 1 0 0 1-1 1h-5v-6H9v6H4a1 1 0 0 1-1-1z" }],
162
+ users: [
163
+ { kind: "path", d: "M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2" },
164
+ { kind: "circle", cx: 9, cy: 7, r: 4 },
165
+ { kind: "path", d: "M22 21v-2a4 4 0 0 0-3-3.9M16 3.1a4 4 0 0 1 0 7.8" },
166
+ ],
167
+ pointer: [{ kind: "path", d: "M4 4l7 17 2.5-7.5L21 11z" }],
168
+ square: [{ kind: "rect", x: 4, y: 4, width: 16, height: 16, rx: 2 }],
169
+ type: [{ kind: "path", d: "M4 7V4h16v3M9 20h6M12 4v16" }],
170
+ eraser: [{ kind: "path", d: "M7 21l-4.3-4.3a1 1 0 0 1 0-1.4l10-10a1 1 0 0 1 1.4 0l5.6 5.6a1 1 0 0 1 0 1.4L13 21M22 21H7M5 11l9 9" }],
171
+ copy: [
172
+ { kind: "rect", x: 9, y: 9, width: 12, height: 12, rx: 2 },
173
+ { kind: "path", d: "M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1" },
174
+ ],
175
+ edit: [
176
+ { kind: "path", d: "M12 20h9" },
177
+ { kind: "path", d: "M16.5 3.5a2.1 2.1 0 0 1 3 3L7 19l-4 1 1-4z" },
178
+ ],
179
+ flip: [
180
+ { kind: "path", d: "M20 12a8 8 0 0 0-14.3-4.9M4 12a8 8 0 0 0 14.3 4.9" },
181
+ { kind: "path", d: "M5.2 3.2v4.2h4.2M18.8 20.8v-4.2h-4.2" },
182
+ ],
183
+ earpiece: [{ kind: "path", d: "M22 16.9v3a2 2 0 0 1-2.2 2 19.8 19.8 0 0 1-8.6-3.1 19.5 19.5 0 0 1-6-6A19.8 19.8 0 0 1 2.1 4.2 2 2 0 0 1 4.1 2h3a2 2 0 0 1 2 1.7c.1 1 .4 1.9.7 2.8a2 2 0 0 1-.5 2.1L8.1 9.9a16 16 0 0 0 6 6l1.3-1.3a2 2 0 0 1 2.1-.4c.9.3 1.8.6 2.8.7a2 2 0 0 1 1.7 2z" }],
184
+ buds: [{ kind: "path", d: "M8 3.5A3.5 3.5 0 0 0 4.5 7v1A2.5 2.5 0 0 0 7 10.5h1V20a1.5 1.5 0 0 0 3 0V6.5A3 3 0 0 0 8 3.5zM16 3.5A3.5 3.5 0 0 1 19.5 7v1a2.5 2.5 0 0 1-2.5 2.5h-1V20a1.5 1.5 0 0 1-3 0V6.5a3 3 0 0 1 3-3z" }],
185
+ iosShare: [
186
+ { kind: "path", d: "M12 3v12M8 7l4-4 4 4" },
187
+ { kind: "path", d: "M8 10H6a2 2 0 0 0-2 2v7a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-7a2 2 0 0 0-2-2h-2" },
188
+ ],
189
+ paste: [
190
+ { kind: "rect", x: 8, y: 2, width: 8, height: 4, rx: 1 },
191
+ { kind: "path", d: "M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2" },
192
+ ],
193
+ file: [
194
+ { kind: "path", d: "M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z" },
195
+ { kind: "path", d: "M14 2v6h6" },
196
+ ],
197
+ trash: [{ kind: "path", d: "M3 6h18M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2M19 6l-1 14a2 2 0 0 1-2 2H8a2 2 0 0 1-2-2L5 6" }],
198
+ moon: [{ kind: "path", d: "M21 12.8A9 9 0 1 1 11.2 3a7 7 0 0 0 9.8 9.8z" }],
199
+ } as const satisfies Readonly<Record<string, readonly IconElement[]>>;
package/src/index.ts CHANGED
@@ -1,15 +1,12 @@
1
- export { Chalk } from "./components/Chalk";
2
- export type { ChalkFeatures, ChalkProps, ChalkTheme, ChalkThemeTokens, SpaceLayout } from "./components/Chalk";
3
- export { Entrance } from "./components/Entrance";
4
- export type { EntranceProps, EntranceSettings } from "./components/Entrance";
5
- export { Logo } from "./components/logo/Logo";
6
- export type { LogoMotion, LogoProps, LogoVariant } from "./components/logo/Logo";
1
+ export { Chalk } from "./frame/Chalk";
2
+ export type { ChalkProps } from "./frame/Chalk";
3
+ export { ChalkArrival } from "./status/ChalkArrival";
4
+ export type { ArrivalState, ChalkArrivalProps } from "./status/ChalkArrival";
5
+ export type { Permission } from "./toasts/CallEventToasts";
6
+ export type { ColorScheme, Palette } from "./theme/tokens";
7
7
  export { ChalkProvider, useSpaceClient } from "./context/space-client-context";
8
8
  export type { ChalkProviderProps } from "./context/space-client-context";
9
9
  export { useCan, useChat, useConnection, useMedia, useParticipants, useReactions, useRecording, useSelf, useWhiteboard } from "./hooks/space-hooks";
10
- export { Theme, createNativeTheme } from "./ui/theme";
11
10
  export { extractSpaceInviteFromLink, getClipboardInviteSuggestion, parseSpaceInviteLink } from "./invites";
12
11
  export type { SpaceInviteLink } from "./invites";
13
12
  export { buildChalkInviteLink } from "./utils/build-chalk-invite-link";
14
- export { getThemeMode, isDarkThemePalette, resolveNativeAppearance, THEME_PALETTES, THEME_TEXTURES } from "./ui/appearance";
15
- export type { NativeAppearance, NativeAppearanceTokens, NativeShadowToken, NativeTextureBlendMode, NativeTextureDescriptor, NativeTextureKind, ThemeAppearance, ThemeMode, ThemePalette, ThemeTexture } from "./ui/appearance";