@q9labsai/chalk-react-native 4.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 (654) hide show
  1. package/Q9ChalkReactNative.podspec +27 -0
  2. package/README.md +41 -0
  3. package/android/build.gradle +43 -0
  4. package/android/consumer-rules.pro +1 -0
  5. package/android/src/main/AndroidManifest.xml +24 -0
  6. package/android/src/main/java/ai/q9labs/chalk/reactnative/ChalkSpaceForegroundService.java +94 -0
  7. package/android/src/main/kotlin/ai/q9labs/chalk/reactnative/ChalkAndroidConnectionServiceModule.kt +161 -0
  8. package/android/src/main/kotlin/ai/q9labs/chalk/reactnative/ChalkAndroidConnectionServicePackage.kt +18 -0
  9. package/android/src/main/kotlin/ai/q9labs/chalk/reactnative/ChalkConnectionRegistry.kt +120 -0
  10. package/android/src/main/kotlin/ai/q9labs/chalk/reactnative/ChalkSelfManagedConnection.kt +64 -0
  11. package/android/src/main/kotlin/ai/q9labs/chalk/reactnative/ChalkSelfManagedConnectionService.kt +35 -0
  12. package/dist/android/connection-service.d.ts +26 -0
  13. package/dist/android/connection-service.d.ts.map +1 -0
  14. package/dist/android.d.ts +2 -0
  15. package/dist/android.d.ts.map +1 -0
  16. package/dist/android.js +47 -0
  17. package/dist/callkit/callkit.d.ts +61 -0
  18. package/dist/callkit/callkit.d.ts.map +1 -0
  19. package/dist/callkit/resolve-space-callkit-options.d.ts +17 -0
  20. package/dist/callkit/resolve-space-callkit-options.d.ts.map +1 -0
  21. package/dist/chunk-BXIZIHIO.js +4501 -0
  22. package/dist/chunk-F3NPRVHO.js +121 -0
  23. package/dist/chunk-HXYIJ75K.js +394 -0
  24. package/dist/chunk-IMKSYT7R.js +653 -0
  25. package/dist/chunk-JB4LNWVP.js +247 -0
  26. package/dist/client.d.ts +8 -0
  27. package/dist/client.d.ts.map +1 -0
  28. package/dist/client.js +6 -0
  29. package/dist/clipboard-store.d.ts +17 -0
  30. package/dist/clipboard-store.d.ts.map +1 -0
  31. package/dist/clipboard.d.ts +10 -0
  32. package/dist/clipboard.d.ts.map +1 -0
  33. package/dist/clipboard.js +108 -0
  34. package/dist/components/Chalk.d.ts +77 -0
  35. package/dist/components/Chalk.d.ts.map +1 -0
  36. package/dist/components/ChatMessageList.d.ts +11 -0
  37. package/dist/components/ChatMessageList.d.ts.map +1 -0
  38. package/dist/components/EmbeddedWhiteboard.d.ts +46 -0
  39. package/dist/components/EmbeddedWhiteboard.d.ts.map +1 -0
  40. package/dist/components/Entrance.d.ts +22 -0
  41. package/dist/components/Entrance.d.ts.map +1 -0
  42. package/dist/components/EntranceView.android.d.ts +4 -0
  43. package/dist/components/EntranceView.android.d.ts.map +1 -0
  44. package/dist/components/EntranceView.d.ts +18 -0
  45. package/dist/components/EntranceView.d.ts.map +1 -0
  46. package/dist/components/EntranceView.ios-pad.d.ts +3 -0
  47. package/dist/components/EntranceView.ios-pad.d.ts.map +1 -0
  48. package/dist/components/EntranceView.ios-phone.d.ts +3 -0
  49. package/dist/components/EntranceView.ios-phone.d.ts.map +1 -0
  50. package/dist/components/EntranceView.macos.d.ts +4 -0
  51. package/dist/components/EntranceView.macos.d.ts.map +1 -0
  52. package/dist/components/FaceAvatar.d.ts +16 -0
  53. package/dist/components/FaceAvatar.d.ts.map +1 -0
  54. package/dist/components/GradientSurface.d.ts +14 -0
  55. package/dist/components/GradientSurface.d.ts.map +1 -0
  56. package/dist/components/LogoElements.d.ts +6 -0
  57. package/dist/components/LogoElements.d.ts.map +1 -0
  58. package/dist/components/MediaView.d.ts +14 -0
  59. package/dist/components/MediaView.d.ts.map +1 -0
  60. package/dist/components/ReactionPicker.d.ts +10 -0
  61. package/dist/components/ReactionPicker.d.ts.map +1 -0
  62. package/dist/components/RtcVideoView.d.ts +4 -0
  63. package/dist/components/RtcVideoView.d.ts.map +1 -0
  64. package/dist/components/SpaceView.android.d.ts +2 -0
  65. package/dist/components/SpaceView.android.d.ts.map +1 -0
  66. package/dist/components/SpaceView.d.ts +31 -0
  67. package/dist/components/SpaceView.d.ts.map +1 -0
  68. package/dist/components/SpaceView.ios-pad.d.ts +2 -0
  69. package/dist/components/SpaceView.ios-pad.d.ts.map +1 -0
  70. package/dist/components/SpaceView.ios-phone.d.ts +2 -0
  71. package/dist/components/SpaceView.ios-phone.d.ts.map +1 -0
  72. package/dist/components/SpaceView.macos.d.ts +2 -0
  73. package/dist/components/SpaceView.macos.d.ts.map +1 -0
  74. package/dist/components/SpaceView.shared.d.ts +3 -0
  75. package/dist/components/SpaceView.shared.d.ts.map +1 -0
  76. package/dist/components/android-connection-service-controller.d.ts +33 -0
  77. package/dist/components/android-connection-service-controller.d.ts.map +1 -0
  78. package/dist/components/episode-diagnostic-render-observer.d.ts +2 -0
  79. package/dist/components/episode-diagnostic-render-observer.d.ts.map +1 -0
  80. package/dist/components/native-animation-controller.d.ts +7 -0
  81. package/dist/components/native-animation-controller.d.ts.map +1 -0
  82. package/dist/components/native-chat.d.ts +8 -0
  83. package/dist/components/native-chat.d.ts.map +1 -0
  84. package/dist/components/native-entrance/entrance-controller-store.d.ts +34 -0
  85. package/dist/components/native-entrance/entrance-controller-store.d.ts.map +1 -0
  86. package/dist/components/native-entrance/useEntranceController.d.ts +19 -0
  87. package/dist/components/native-entrance/useEntranceController.d.ts.map +1 -0
  88. package/dist/components/native-joining-loading-animation.d.ts +9 -0
  89. package/dist/components/native-joining-loading-animation.d.ts.map +1 -0
  90. package/dist/components/native-media-visibility.d.ts +8 -0
  91. package/dist/components/native-media-visibility.d.ts.map +1 -0
  92. package/dist/components/native-space-callkit-controller.d.ts +39 -0
  93. package/dist/components/native-space-callkit-controller.d.ts.map +1 -0
  94. package/dist/components/native-space-view/AppearanceSettings.d.ts +2 -0
  95. package/dist/components/native-space-view/AppearanceSettings.d.ts.map +1 -0
  96. package/dist/components/native-space-view/ParticipantActionSheet.d.ts +9 -0
  97. package/dist/components/native-space-view/ParticipantActionSheet.d.ts.map +1 -0
  98. package/dist/components/native-space-view/SettingsSheet.d.ts +7 -0
  99. package/dist/components/native-space-view/SettingsSheet.d.ts.map +1 -0
  100. package/dist/components/native-space-view/SpaceActionMenu.d.ts +8 -0
  101. package/dist/components/native-space-view/SpaceActionMenu.d.ts.map +1 -0
  102. package/dist/components/native-space-view/SpaceBottomDock.android.d.ts +4 -0
  103. package/dist/components/native-space-view/SpaceBottomDock.android.d.ts.map +1 -0
  104. package/dist/components/native-space-view/SpaceChatSheet.d.ts +5 -0
  105. package/dist/components/native-space-view/SpaceChatSheet.d.ts.map +1 -0
  106. package/dist/components/native-space-view/SpaceGrid.android.d.ts +8 -0
  107. package/dist/components/native-space-view/SpaceGrid.android.d.ts.map +1 -0
  108. package/dist/components/native-space-view/SpaceMoreSheet.d.ts +6 -0
  109. package/dist/components/native-space-view/SpaceMoreSheet.d.ts.map +1 -0
  110. package/dist/components/native-space-view/SpacePanelSheet.d.ts +5 -0
  111. package/dist/components/native-space-view/SpacePanelSheet.d.ts.map +1 -0
  112. package/dist/components/native-space-view/SpacePeopleSheet.d.ts +5 -0
  113. package/dist/components/native-space-view/SpacePeopleSheet.d.ts.map +1 -0
  114. package/dist/components/native-space-view/SpaceStage.android.d.ts +29 -0
  115. package/dist/components/native-space-view/SpaceStage.android.d.ts.map +1 -0
  116. package/dist/components/native-space-view/SpaceSurfacePrimitives.d.ts +30 -0
  117. package/dist/components/native-space-view/SpaceSurfacePrimitives.d.ts.map +1 -0
  118. package/dist/components/native-space-view/SpaceTopBar.android.d.ts +9 -0
  119. package/dist/components/native-space-view/SpaceTopBar.android.d.ts.map +1 -0
  120. package/dist/components/native-space-view/SpaceWhiteboardSurface.d.ts +15 -0
  121. package/dist/components/native-space-view/SpaceWhiteboardSurface.d.ts.map +1 -0
  122. package/dist/components/native-space-view/diagnostics.d.ts +48 -0
  123. package/dist/components/native-space-view/diagnostics.d.ts.map +1 -0
  124. package/dist/components/native-space-view/format-space-duration.d.ts +2 -0
  125. package/dist/components/native-space-view/format-space-duration.d.ts.map +1 -0
  126. package/dist/components/native-space-view/native-space-grid-keys.d.ts +3 -0
  127. package/dist/components/native-space-view/native-space-grid-keys.d.ts.map +1 -0
  128. package/dist/components/native-space-view/native-space-page-store.d.ts +8 -0
  129. package/dist/components/native-space-view/native-space-page-store.d.ts.map +1 -0
  130. package/dist/components/native-space-view/screen-share-availability.d.ts +9 -0
  131. package/dist/components/native-space-view/screen-share-availability.d.ts.map +1 -0
  132. package/dist/components/native-space-view/space-chat-attachments.d.ts +15 -0
  133. package/dist/components/native-space-view/space-chat-attachments.d.ts.map +1 -0
  134. package/dist/components/native-space-view/space-panel-layout.d.ts +10 -0
  135. package/dist/components/native-space-view/space-panel-layout.d.ts.map +1 -0
  136. package/dist/components/native-space-view/space-progressive-surface-helpers.d.ts +16 -0
  137. package/dist/components/native-space-view/space-progressive-surface-helpers.d.ts.map +1 -0
  138. package/dist/components/native-space-view/space-progressive-surface-types.d.ts +3 -0
  139. package/dist/components/native-space-view/space-progressive-surface-types.d.ts.map +1 -0
  140. package/dist/components/native-space-view/types.d.ts +24 -0
  141. package/dist/components/native-space-view/types.d.ts.map +1 -0
  142. package/dist/components/native-space-view/useSpaceViewController.contract.d.ts +41 -0
  143. package/dist/components/native-space-view/useSpaceViewController.contract.d.ts.map +1 -0
  144. package/dist/components/native-space-view/useSpaceViewController.d.ts +150 -0
  145. package/dist/components/native-space-view/useSpaceViewController.d.ts.map +1 -0
  146. package/dist/components/native-space-view/useSpaceViewDerived.d.ts +12 -0
  147. package/dist/components/native-space-view/useSpaceViewDerived.d.ts.map +1 -0
  148. package/dist/components/native-space-view/useSpaceViewPanels.d.ts +70 -0
  149. package/dist/components/native-space-view/useSpaceViewPanels.d.ts.map +1 -0
  150. package/dist/components/rtc-video-view-availability.d.ts +13 -0
  151. package/dist/components/rtc-video-view-availability.d.ts.map +1 -0
  152. package/dist/components/space-lifecycle.d.ts +3 -0
  153. package/dist/components/space-lifecycle.d.ts.map +1 -0
  154. package/dist/components/useAndroidConnectionService.d.ts +14 -0
  155. package/dist/components/useAndroidConnectionService.d.ts.map +1 -0
  156. package/dist/context/space-client-context.d.ts +9 -0
  157. package/dist/context/space-client-context.d.ts.map +1 -0
  158. package/dist/diagnostics.d.ts +50 -0
  159. package/dist/diagnostics.d.ts.map +1 -0
  160. package/dist/diagnostics.js +143 -0
  161. package/dist/hooks/entrance-preview-store.d.ts +16 -0
  162. package/dist/hooks/entrance-preview-store.d.ts.map +1 -0
  163. package/dist/hooks/external-store.d.ts +10 -0
  164. package/dist/hooks/external-store.d.ts.map +1 -0
  165. package/dist/hooks/space-hooks.d.ts +10 -0
  166. package/dist/hooks/space-hooks.d.ts.map +1 -0
  167. package/dist/hooks/useEntrancePreview.d.ts +7 -0
  168. package/dist/hooks/useEntrancePreview.d.ts.map +1 -0
  169. package/dist/hooks/useLayout.d.ts +16 -0
  170. package/dist/hooks/useLayout.d.ts.map +1 -0
  171. package/dist/hooks/usePanels.d.ts +12 -0
  172. package/dist/hooks/usePanels.d.ts.map +1 -0
  173. package/dist/index.d.ts +11 -0
  174. package/dist/index.d.ts.map +1 -0
  175. package/dist/index.js +47 -0
  176. package/dist/invites.d.ts +3 -0
  177. package/dist/invites.d.ts.map +1 -0
  178. package/dist/invites.js +41 -0
  179. package/dist/ios-pad.d.ts +2 -0
  180. package/dist/ios-pad.d.ts.map +1 -0
  181. package/dist/ios-pad.js +47 -0
  182. package/dist/ios-phone.d.ts +2 -0
  183. package/dist/ios-phone.d.ts.map +1 -0
  184. package/dist/ios-phone.js +47 -0
  185. package/dist/ios.d.ts +2 -0
  186. package/dist/ios.d.ts.map +1 -0
  187. package/dist/ios.js +47 -0
  188. package/dist/macos.d.ts +2 -0
  189. package/dist/macos.d.ts.map +1 -0
  190. package/dist/macos.js +47 -0
  191. package/dist/media/native-webrtc.d.ts +6 -0
  192. package/dist/media/native-webrtc.d.ts.map +1 -0
  193. package/dist/platform/platform.d.ts +3 -0
  194. package/dist/platform/platform.d.ts.map +1 -0
  195. package/dist/runtime.d.ts +38 -0
  196. package/dist/runtime.d.ts.map +1 -0
  197. package/dist/runtime.js +30 -0
  198. package/dist/space-client/create-native-space-client.d.ts +17 -0
  199. package/dist/space-client/create-native-space-client.d.ts.map +1 -0
  200. package/dist/telemetry.d.ts +63 -0
  201. package/dist/telemetry.d.ts.map +1 -0
  202. package/dist/test-support/test-renderer.d.ts +20 -0
  203. package/dist/test-support/test-renderer.d.ts.map +1 -0
  204. package/dist/ui/appearance.d.ts +239 -0
  205. package/dist/ui/appearance.d.ts.map +1 -0
  206. package/dist/ui/appearance.js +14 -0
  207. package/dist/ui/native-appearance-context.d.ts +15 -0
  208. package/dist/ui/native-appearance-context.d.ts.map +1 -0
  209. package/dist/ui/native-theme.d.ts +17 -0
  210. package/dist/ui/native-theme.d.ts.map +1 -0
  211. package/dist/ui/native-types.d.ts +38 -0
  212. package/dist/ui/native-types.d.ts.map +1 -0
  213. package/dist/ui/participant-avatar.d.ts +21 -0
  214. package/dist/ui/participant-avatar.d.ts.map +1 -0
  215. package/dist/ui/theme-tokens.d.ts +25 -0
  216. package/dist/ui/theme-tokens.d.ts.map +1 -0
  217. package/dist/ui/theme.d.ts +404 -0
  218. package/dist/ui/theme.d.ts.map +1 -0
  219. package/dist/ui/theme.js +8 -0
  220. package/dist/utils/build-chalk-invite-link.d.ts +2 -0
  221. package/dist/utils/build-chalk-invite-link.d.ts.map +1 -0
  222. package/dist/utils/ios-simulator.d.ts +5 -0
  223. package/dist/utils/ios-simulator.d.ts.map +1 -0
  224. package/dist/utils/native-space-layout.d.ts +42 -0
  225. package/dist/utils/native-space-layout.d.ts.map +1 -0
  226. package/dist/whiteboard/embedded-whiteboard-assets.d.ts +7 -0
  227. package/dist/whiteboard/embedded-whiteboard-assets.d.ts.map +1 -0
  228. package/embedded/chalk-whiteboard/THIRD_PARTY_NOTICES.json +17 -0
  229. package/embedded/chalk-whiteboard/asset-manifest.json +1228 -0
  230. package/embedded/chalk-whiteboard/chalk.css +5 -0
  231. package/embedded/chalk-whiteboard/compatibility-manifest.json +37 -0
  232. package/embedded/chalk-whiteboard/fonts/Assistant/Assistant-Bold.woff2 +0 -0
  233. package/embedded/chalk-whiteboard/fonts/Assistant/Assistant-Medium.woff2 +0 -0
  234. package/embedded/chalk-whiteboard/fonts/Assistant/Assistant-Regular.woff2 +0 -0
  235. package/embedded/chalk-whiteboard/fonts/Assistant/Assistant-SemiBold.woff2 +0 -0
  236. package/embedded/chalk-whiteboard/fonts/Cascadia/CascadiaCode-Regular.woff2 +0 -0
  237. package/embedded/chalk-whiteboard/fonts/ComicShanns/ComicShanns-Regular-279a7b317d12eb88de06167bd672b4b4.woff2 +0 -0
  238. package/embedded/chalk-whiteboard/fonts/ComicShanns/ComicShanns-Regular-6e066e8de2ac57ea9283adb9c24d7f0c.woff2 +0 -0
  239. package/embedded/chalk-whiteboard/fonts/ComicShanns/ComicShanns-Regular-dc6a8806fa96795d7b3be5026f989a17.woff2 +0 -0
  240. package/embedded/chalk-whiteboard/fonts/ComicShanns/ComicShanns-Regular-fcb0fc02dcbee4c9846b3e2508668039.woff2 +0 -0
  241. package/embedded/chalk-whiteboard/fonts/Excalifont/Excalifont-Regular-349fac6ca4700ffec595a7150a0d1e1d.woff2 +0 -0
  242. package/embedded/chalk-whiteboard/fonts/Excalifont/Excalifont-Regular-3f2c5db56cc93c5a6873b1361d730c16.woff2 +0 -0
  243. package/embedded/chalk-whiteboard/fonts/Excalifont/Excalifont-Regular-41b173a47b57366892116a575a43e2b6.woff2 +0 -0
  244. package/embedded/chalk-whiteboard/fonts/Excalifont/Excalifont-Regular-623ccf21b21ef6b3a0d87738f77eb071.woff2 +0 -0
  245. package/embedded/chalk-whiteboard/fonts/Excalifont/Excalifont-Regular-a88b72a24fb54c9f94e3b5fdaa7481c9.woff2 +0 -0
  246. package/embedded/chalk-whiteboard/fonts/Excalifont/Excalifont-Regular-b9dcf9d2e50a1eaf42fc664b50a3fd0d.woff2 +0 -0
  247. package/embedded/chalk-whiteboard/fonts/Excalifont/Excalifont-Regular-be310b9bcd4f1a43f571c46df7809174.woff2 +0 -0
  248. package/embedded/chalk-whiteboard/fonts/Liberation/LiberationSans-Regular.woff2 +0 -0
  249. package/embedded/chalk-whiteboard/fonts/Lilita/Lilita-Regular-i7dPIFZ9Zz-WBtRtedDbYE98RXi4EwSsbg.woff2 +0 -0
  250. package/embedded/chalk-whiteboard/fonts/Lilita/Lilita-Regular-i7dPIFZ9Zz-WBtRtedDbYEF8RXi4EwQ.woff2 +0 -0
  251. package/embedded/chalk-whiteboard/fonts/Nunito/Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTA3j6zbXWjgevT5.woff2 +0 -0
  252. package/embedded/chalk-whiteboard/fonts/Nunito/Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTQ3j6zbXWjgeg.woff2 +0 -0
  253. package/embedded/chalk-whiteboard/fonts/Nunito/Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTk3j6zbXWjgevT5.woff2 +0 -0
  254. package/embedded/chalk-whiteboard/fonts/Nunito/Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTo3j6zbXWjgevT5.woff2 +0 -0
  255. package/embedded/chalk-whiteboard/fonts/Nunito/Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTs3j6zbXWjgevT5.woff2 +0 -0
  256. package/embedded/chalk-whiteboard/fonts/Virgil/Virgil-Regular.woff2 +0 -0
  257. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-019d66dcad46dc156b162d267f981c20.woff2 +0 -0
  258. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-04b718e5623574919c8b0dea5f301444.woff2 +0 -0
  259. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-069e77aac84590e2e991d0a0176d34f2.woff2 +0 -0
  260. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-06c77b8c66e51ed6c63ccb502dd8b8af.woff2 +0 -0
  261. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-08e0dc436ad0ad61ba5558db0674d762.woff2 +0 -0
  262. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-093b9ef39a46ceae95a1df18a0a3a326.woff2 +0 -0
  263. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-095c169f3314805276f603a362766abd.woff2 +0 -0
  264. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-09850c4077f3fffe707905872e0e2460.woff2 +0 -0
  265. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-0986d134c05864f5025962eef9f994a0.woff2 +0 -0
  266. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-0b5d723fdc4e249c140f0909e87d03b4.woff2 +0 -0
  267. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-0f626226ba1272e832aea87bafd9720e.woff2 +0 -0
  268. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-0f7fb1e0d5015bb1371343153ecf7ce3.woff2 +0 -0
  269. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-0fa55a080fcd0f9dc2e0b0058b793df8.woff2 +0 -0
  270. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-0facdf1ea213ba40261022f5d5ed4493.woff2 +0 -0
  271. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-10a7ae9a371830a80c3d844acf1c02d7.woff2 +0 -0
  272. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-112c051027b2d766c19a519f6ee1f4f7.woff2 +0 -0
  273. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-11c345711937f0ba4b8f7b6b919c8440.woff2 +0 -0
  274. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-12b52b58eb3df36804b9a654ec9ee194.woff2 +0 -0
  275. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-13ae07ed2e272d26d59bc0691cd7117a.woff2 +0 -0
  276. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-13d2887ec8ee73c43acdabc52a05af7b.woff2 +0 -0
  277. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-145aa02cdd91946e67dc934e1acffe75.woff2 +0 -0
  278. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-15dc6d811c9cd078f9086a740d5a1038.woff2 +0 -0
  279. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-173945821411c09f70c95f98d590e697.woff2 +0 -0
  280. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-1b611157cd46bb184d4fa4dae2d6a2b8.woff2 +0 -0
  281. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-1e6fd68f1f3902ce48ce8c69df385622.woff2 +0 -0
  282. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-1ee544f0f1dac422545c505baa788992.woff2 +0 -0
  283. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-1fdc0c67ed57263a80fd108c1f6ccf24.woff2 +0 -0
  284. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-203b0e569e3b14aac86a003dc3fa523e.woff2 +0 -0
  285. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-20cc1bbf50e7efb442756cb605672c1f.woff2 +0 -0
  286. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-20e7bf72fa05de9adf7dbcc7bf51dde6.woff2 +0 -0
  287. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-21430ee05a1248901da8d0de08744d47.woff2 +0 -0
  288. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-23686f7f29da6e8008c36dd3a80c83d6.woff2 +0 -0
  289. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-23ad2d71b280f00b1363b95b7bea94eb.woff2 +0 -0
  290. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-23f228f3999c01983860012330e4be08.woff2 +0 -0
  291. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-24476a126f129212beb33f66853ea151.woff2 +0 -0
  292. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-24a21c1e4449222e8d1898d69ff3a404.woff2 +0 -0
  293. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-25b7f38e18f035f96cb5e547bd2bd08c.woff2 +0 -0
  294. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-29cec36cd205b211da97acabaa62f055.woff2 +0 -0
  295. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-2a26d20a23b00898ce82f09d2ee47c3f.woff2 +0 -0
  296. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-2adbc89c11e65905393d3dfc468b9d5b.woff2 +0 -0
  297. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-2b7441d46298788ac94e610ffcc709b6.woff2 +0 -0
  298. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-2b77e8ebfb2367ab2662396a60e7d320.woff2 +0 -0
  299. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-2cf96d082d35ea3d8106851223ad0d16.woff2 +0 -0
  300. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-2d43040e86ff03ba677f6f9c04cd0805.woff2 +0 -0
  301. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-2e33e8dc771ef5e1d9127d60a6b73679.woff2 +0 -0
  302. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-33432927cd87d40cfe393c7482bf221f.woff2 +0 -0
  303. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-353f33792a8f60dc69323ddf635a269e.woff2 +0 -0
  304. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-36925dfe329a45086cbb7fc5c20d45ac.woff2 +0 -0
  305. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-3717077e38f98d89eae729b6c14e56dc.woff2 +0 -0
  306. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-3756e81d3e149cf6099163ee79944fec.woff2 +0 -0
  307. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-395c35dd584b56b0789f58a0559beaf1.woff2 +0 -0
  308. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-3c9de2ae0ea4bc91a510942dfa4be8d2.woff2 +0 -0
  309. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-3cc70dbb64df5b21f1326cc24dee2195.woff2 +0 -0
  310. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-3e1f8f654357353bf0e04ba5c34b5f7f.woff2 +0 -0
  311. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-3e63ed8162808a9e425ed80a8bc79114.woff2 +0 -0
  312. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-3eaa538115d76932653c21d8dc28f207.woff2 +0 -0
  313. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-4095eb84ef3874e2600247bee0b04026.woff2 +0 -0
  314. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-41521fade99856108931b4768b1b2648.woff2 +0 -0
  315. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-450da755d5bcb70906e1295e559b9602.woff2 +0 -0
  316. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-452225341522a7942f0f6aab1a5c91a3.woff2 +0 -0
  317. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-4535823663ad81405188a528d8f2b1a2.woff2 +0 -0
  318. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-4806e761d750087c2d734fc64596eaff.woff2 +0 -0
  319. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-4a0fdb40036e87b40aa08dd30584cb85.woff2 +0 -0
  320. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-4a38cc3e9cf104e69ba246d37f8cf135.woff2 +0 -0
  321. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-4aca6a43e59aceee2166b0c7e4e85ef1.woff2 +0 -0
  322. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-4bfaa8ffa64c5ee560aa2daba7c9cbd3.woff2 +0 -0
  323. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-4dc6d5f188d5c96d44815cd1e81aa885.woff2 +0 -0
  324. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-4ddc14ed3eb0c3e46364317dfc0144a3.woff2 +0 -0
  325. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-4ee10ae43505e2e0bc62656ced49c0fa.woff2 +0 -0
  326. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-4f50e5136e136527280bc902c5817561.woff2 +0 -0
  327. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-51502f1206be09c565f1547c406e9558.woff2 +0 -0
  328. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-51a0e808bbc8361236ac521a119758a3.woff2 +0 -0
  329. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-52a84a22fd1369bffeaf21da2d6158dc.woff2 +0 -0
  330. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-5330a2119a716e4e7224ed108b085dac.woff2 +0 -0
  331. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-543fa46ace099a7099dad69123399400.woff2 +0 -0
  332. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-544fc28abe2c5c30e62383fd4dac255f.woff2 +0 -0
  333. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-54acdfc2166ad7fcbd074f75fd4a56ba.woff2 +0 -0
  334. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-5572b3513ba8df57a3d5d7303ee6b11b.woff2 +0 -0
  335. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-56467a5c8840c4d23a60b2f935114848.woff2 +0 -0
  336. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-56a32a7689abd0326e57c10c6c069bb4.woff2 +0 -0
  337. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-57862b464a55b18c7bf234ce22907d73.woff2 +0 -0
  338. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-583d166e56ba0de4b77eabb47ef67839.woff2 +0 -0
  339. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-5882ffa04f32584d26109137e2da4352.woff2 +0 -0
  340. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-58fd02350d0bc52cf1ca3bb32ce9766e.woff2 +0 -0
  341. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-5935a5775af3d5c6307ac667bd9ae74e.woff2 +0 -0
  342. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-59e9ff77b0efaf684bc09274fb6908c9.woff2 +0 -0
  343. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-5a1ce3117cfe90c48e8fb4a9a00f694d.woff2 +0 -0
  344. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-5a45d991244d4c7140217e1e5f5ca4f4.woff2 +0 -0
  345. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-5a7fac4b8b23a6e4e5ba0c9bf1756c91.woff2 +0 -0
  346. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-5b0ed6971aaab9c8ad563230bd5471a7.woff2 +0 -0
  347. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-5d2898fbc097a7e24c6f38d80587621e.woff2 +0 -0
  348. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-603aefd23e350ba7eb124273e3c9bcf1.woff2 +0 -0
  349. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-60a3089806700d379f11827ee9843b6b.woff2 +0 -0
  350. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-60a41c7e1c68f22424e6d22df544bc82.woff2 +0 -0
  351. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-642b26e2e5f5fb780b51b593dbc8c851.woff2 +0 -0
  352. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-66493ba5a8367f2928812f446f47b56a.woff2 +0 -0
  353. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-670ba603758d94268e8606f240a42e12.woff2 +0 -0
  354. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-671a2c20b1eb9e4ef8a192833940e319.woff2 +0 -0
  355. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-684d65f1793cac449dde5d59cb3c47fb.woff2 +0 -0
  356. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-69c09cc5fa3e55c74fc4821f76909cc3.woff2 +0 -0
  357. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-6ae5b42180ad70b971c91e7eefb8eba2.woff2 +0 -0
  358. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-6e092f71c1e634059ada0e52abadce67.woff2 +0 -0
  359. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-6f3256af8454371776bc46670d33cc65.woff2 +0 -0
  360. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-6fe5c5973cc06f74b2387a631ea36b88.woff2 +0 -0
  361. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-70c2eb8d64e71a42a834eb857ea9df51.woff2 +0 -0
  362. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-70e811fd7994e61f408c923de6ddd078.woff2 +0 -0
  363. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-7197d6fda6cba7c3874c53d6381ca239.woff2 +0 -0
  364. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-72252d73220fa3cd856677888cee1635.woff2 +0 -0
  365. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-72536a3d71b694a0d53dd90ddceae41e.woff2 +0 -0
  366. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-726303e0774b4e678bff8c2deb6ca603.woff2 +0 -0
  367. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-733171b4ffcd17ea1fe1c0ba627173bf.woff2 +0 -0
  368. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-739bc1a567439c7cffcd1614644593d2.woff2 +0 -0
  369. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-73e309718fd16cea44b4d54a33581811.woff2 +0 -0
  370. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-7494dc504ae00ee9cd0505f990f88c5d.woff2 +0 -0
  371. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-74e2263a91439c25b91d5132ce9f4d62.woff2 +0 -0
  372. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-761d05e3cd968cf574166867998ef06a.woff2 +0 -0
  373. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-7718fe60986d8b42b1be9c5ace5ccf25.woff2 +0 -0
  374. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-774d4f764a1299da5d28ec2f2ffe0d69.woff2 +0 -0
  375. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-79d494361ae093b69e74ee9dbe65bfd4.woff2 +0 -0
  376. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-79f007c1c6d07557120982951ea67998.woff2 +0 -0
  377. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-7a07ddc0f0c0f5f4a9bad6ee3dda66b5.woff2 +0 -0
  378. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-7ab2bed91166a9dca83a5ebfbe2a7f38.woff2 +0 -0
  379. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-7ccce86603f80a099ddb0cb21d4ae3e3.woff2 +0 -0
  380. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-7e4bde7e9c7f84cd34d8a845e384c746.woff2 +0 -0
  381. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-7e929f262f30c8ee78bf398150b1a7cd.woff2 +0 -0
  382. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-7eb9fffd1aa890d07d0f88cc82e6cfe4.woff2 +0 -0
  383. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-7f855356ab893b0d2b9c1c83b8116f0e.woff2 +0 -0
  384. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-829615148e6357d826b9242eb7fbbd1e.woff2 +0 -0
  385. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-866fa7613df6b3fd272bcfd4530c0bb9.woff2 +0 -0
  386. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-87599f94b6cc129d505b375798d0d751.woff2 +0 -0
  387. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-8c2f33cee3993174f7e87c28e4bf42ee.woff2 +0 -0
  388. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-8d3bcabb847b56243b16afe62adaaf21.woff2 +0 -0
  389. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-8de5b863cb50dfefdd07cb11c774d579.woff2 +0 -0
  390. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-8e9f97f01034820170065b2921b4fb5e.woff2 +0 -0
  391. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-8f476c4c99813d57cbe6eca4727388ad.woff2 +0 -0
  392. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-903bb6865f3452e2fda42e3a25547bc5.woff2 +0 -0
  393. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-91ddb2969bf2d31ba02ad82998d1314c.woff2 +0 -0
  394. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-938d90c10ff8c20386af7f242c05d6b0.woff2 +0 -0
  395. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-93fc8f28a33234bcadf1527cafabd502.woff2 +0 -0
  396. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-95429962233afd82db1c27df1500a28c.woff2 +0 -0
  397. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-9544732d2e62d1a429674f8ee41b5d3a.woff2 +0 -0
  398. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-9592bfc861f07bcb8d75c196b370e548.woff2 +0 -0
  399. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-95bfd249da4902577b4b7d76ebdd0b44.woff2 +0 -0
  400. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-968cffdc8ee679da094e77ebf50f58ef.woff2 +0 -0
  401. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-97f7f48ce90c9429bf32ae51469db74d.woff2 +0 -0
  402. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-982b630266d87db93d2539affb1275c6.woff2 +0 -0
  403. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-98f2ad84457de7f3740d9920b8fa8667.woff2 +0 -0
  404. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-99a16ef6a64934d5781933dbd9c46b2e.woff2 +0 -0
  405. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-9cfb2a77a4e45025105ad29a1748b90d.woff2 +0 -0
  406. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-9d81066dd2b337c938df6e90380a00dc.woff2 +0 -0
  407. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-9eb5a99df4e76ac3363453ac9ca288b1.woff2 +0 -0
  408. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-a004ddfcb26e67bd6e678c8ed19e25ce.woff2 +0 -0
  409. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-a0ca5df4258213d7fc9fce80f65ce760.woff2 +0 -0
  410. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-a1f916d6039285c4ffb900cd654e418f.woff2 +0 -0
  411. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-a203b91dad570bf05a58c3c3ddb529bf.woff2 +0 -0
  412. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-a365e82ed54697a52f27adcea1315fe8.woff2 +0 -0
  413. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-a4c34be6d42152e64b0df90bc4607f64.woff2 +0 -0
  414. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-a7accba310e821da5505f71c03b76bdb.woff2 +0 -0
  415. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-aa0d470430e6391eca720c7cfa44446f.woff2 +0 -0
  416. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-aa5c9ca6cf4fba00433b7aa3fa10671a.woff2 +0 -0
  417. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-ac9ceb44437becc3e9c4dbfebab7fc2d.woff2 +0 -0
  418. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-b1220a3c61f85cc0408deedb4c5f57a2.woff2 +0 -0
  419. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-b358f7a51ece39a3247942b1feabdb29.woff2 +0 -0
  420. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-b57aaedfd8ebdf3931f25119dc6a5eb2.woff2 +0 -0
  421. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-b5c1596551c256e0e9cf02028595b092.woff2 +0 -0
  422. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-b6d128682ee29e471486354d486a1b90.woff2 +0 -0
  423. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-b6fd38ca30869792244804b04bc058da.woff2 +0 -0
  424. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-b7d203b051eff504ff59ddca7576b6a9.woff2 +0 -0
  425. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-b96d9226ce77ec94ceca043d712182e6.woff2 +0 -0
  426. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-ba3de316d63c7e339987b16f41a0b879.woff2 +0 -0
  427. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-bafff7a14c27403dcc6cf1432e8ea836.woff2 +0 -0
  428. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-bd77e3c7f9e0b072d96af37f73d1aa32.woff2 +0 -0
  429. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-be549ab72f0719d606a5c01e2c0219b6.woff2 +0 -0
  430. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-c16ed9740b85badf16e86ea782a3062f.woff2 +0 -0
  431. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-c1f94158256bb1f3bf665b053d895af9.woff2 +0 -0
  432. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-c40533fdf4cc57177b12803598af7e59.woff2 +0 -0
  433. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-c4a687ac4f0c2766eefc9f77ed99cddf.woff2 +0 -0
  434. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-c69f61a4ab18d0488c8d1fc12e7028e8.woff2 +0 -0
  435. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-c8b71798409ccc126ee264a00aadcf21.woff2 +0 -0
  436. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-c99eda15fc26a2941579560f76c3a5cf.woff2 +0 -0
  437. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-cb17fc3db95f6d139afc9d31a8e93293.woff2 +0 -0
  438. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-cbaaefaaf326668277aa24dfa93c4d28.woff2 +0 -0
  439. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-cd145ce4a0ea18469358df53c207bc1b.woff2 +0 -0
  440. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-cdbce89e82cc1ab53a2decbf5819278f.woff2 +0 -0
  441. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-ce4884f96f11589608b76b726a755803.woff2 +0 -0
  442. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-cf2cc71752631e579e35b0e423bf2638.woff2 +0 -0
  443. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-cf6ff4e0f491ca0cf3038187a997b9b4.woff2 +0 -0
  444. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-cfb211578629b7e8153b37240de6a9d5.woff2 +0 -0
  445. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-d0cf73942fea1c74edbdf0b3011f4656.woff2 +0 -0
  446. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-d2666cbed13462c5dc36fa2f15c202ca.woff2 +0 -0
  447. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-d3716376641d615e2995605b29bca7b6.woff2 +0 -0
  448. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-dac48066b5883d8b4551fc584f0c2a3e.woff2 +0 -0
  449. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-dbea1af6dcd9860be40c3d18254338f5.woff2 +0 -0
  450. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-e11567fd2accf9957cd0d3c2be937d87.woff2 +0 -0
  451. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-e2ead7ea7da0437f085f42ffc05f8d13.woff2 +0 -0
  452. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-e3fcf5180fd466c8915c4e8069491054.woff2 +0 -0
  453. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-e480d9c614742d05f0e78f274f1e69e6.woff2 +0 -0
  454. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-e4bca6cfa53e499cae0a6be4894a90e9.woff2 +0 -0
  455. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-e51ef413167c6e14e0c0fdcc585f2fc9.woff2 +0 -0
  456. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-e5f453bb04da18eed01675eeebd88bf8.woff2 +0 -0
  457. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-e656f091b9dc4709722c9f4b84d3c797.woff2 +0 -0
  458. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-ec181b795ac1fb5a50d700b6e996d745.woff2 +0 -0
  459. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-ee8bae97908d5147b423f77ad0d3c1bb.woff2 +0 -0
  460. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-f0f13b5c60e0af5553bd359f5513be1b.woff2 +0 -0
  461. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-f2b54d4e7be0eaefe1c2c56836fa5368.woff2 +0 -0
  462. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-f56414bf9bced67990def8660e306759.woff2 +0 -0
  463. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-f5d079153c99a25b9be5b8583c4cc8a7.woff2 +0 -0
  464. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-f6032fc06eb20480f096199713f70885.woff2 +0 -0
  465. package/embedded/chalk-whiteboard/fonts/Xiaolai/Xiaolai-Regular-f8ee5d36068a42b51d0e4a1116cfcec1.woff2 +0 -0
  466. package/embedded/chalk-whiteboard/index.css +1 -0
  467. package/embedded/chalk-whiteboard/index.html +17 -0
  468. package/embedded/chalk-whiteboard/licenses/Excalidraw.txt +21 -0
  469. package/embedded/chalk-whiteboard/licenses/MathJax.txt +202 -0
  470. package/embedded/chalk-whiteboard/mathjax/tex-svg.js +1 -0
  471. package/embedded/chalk-whiteboard/mathjax-config.js +1 -0
  472. package/embedded/chalk-whiteboard/renderer.js +4114 -0
  473. package/ios/ChalkCallKitManager.swift +385 -0
  474. package/ios/ChalkCallKitModule.swift +120 -0
  475. package/ios/ChalkCallKitModuleBridge.m +14 -0
  476. package/ios/ChalkWhiteboardAssets.swift +41 -0
  477. package/ios/ChalkWhiteboardAssetsBridge.m +10 -0
  478. package/package.json +184 -0
  479. package/src/android/connection-service.test.ts +114 -0
  480. package/src/android/connection-service.ts +106 -0
  481. package/src/android.ts +1 -0
  482. package/src/callkit/callkit.test.ts +95 -0
  483. package/src/callkit/callkit.ts +135 -0
  484. package/src/callkit/resolve-space-callkit-options.test.ts +68 -0
  485. package/src/callkit/resolve-space-callkit-options.ts +34 -0
  486. package/src/client.test.ts +12 -0
  487. package/src/client.ts +7 -0
  488. package/src/clipboard-store.ts +108 -0
  489. package/src/clipboard.test.ts +79 -0
  490. package/src/clipboard.ts +36 -0
  491. package/src/components/Chalk.test.tsx +213 -0
  492. package/src/components/Chalk.tsx +333 -0
  493. package/src/components/ChatMessageList.tsx +209 -0
  494. package/src/components/EmbeddedWhiteboard.test.tsx +92 -0
  495. package/src/components/EmbeddedWhiteboard.tsx +260 -0
  496. package/src/components/Entrance.test.tsx +19 -0
  497. package/src/components/Entrance.tsx +41 -0
  498. package/src/components/EntranceView.android.test.tsx +100 -0
  499. package/src/components/EntranceView.android.tsx +274 -0
  500. package/src/components/EntranceView.ios-pad.test.tsx +160 -0
  501. package/src/components/EntranceView.ios-pad.tsx +326 -0
  502. package/src/components/EntranceView.ios-phone.test.tsx +137 -0
  503. package/src/components/EntranceView.ios-phone.tsx +271 -0
  504. package/src/components/EntranceView.macos.tsx +278 -0
  505. package/src/components/EntranceView.test.tsx +15 -0
  506. package/src/components/EntranceView.tsx +38 -0
  507. package/src/components/FaceAvatar.tsx +120 -0
  508. package/src/components/GradientSurface.tsx +23 -0
  509. package/src/components/LogoElements.test.tsx +60 -0
  510. package/src/components/LogoElements.tsx +119 -0
  511. package/src/components/MediaView.tsx +76 -0
  512. package/src/components/ReactionPicker.test.tsx +19 -0
  513. package/src/components/ReactionPicker.tsx +98 -0
  514. package/src/components/RtcVideoView.test.tsx +12 -0
  515. package/src/components/RtcVideoView.tsx +15 -0
  516. package/src/components/SpaceView.android.test.tsx +11 -0
  517. package/src/components/SpaceView.android.tsx +1 -0
  518. package/src/components/SpaceView.ios-pad.test.tsx +11 -0
  519. package/src/components/SpaceView.ios-pad.tsx +1 -0
  520. package/src/components/SpaceView.ios-phone.test.tsx +11 -0
  521. package/src/components/SpaceView.ios-phone.tsx +1 -0
  522. package/src/components/SpaceView.macos.test.tsx +11 -0
  523. package/src/components/SpaceView.macos.tsx +1 -0
  524. package/src/components/SpaceView.shared.test.tsx +115 -0
  525. package/src/components/SpaceView.shared.tsx +87 -0
  526. package/src/components/SpaceView.test.tsx +15 -0
  527. package/src/components/SpaceView.tsx +52 -0
  528. package/src/components/android-connection-service-controller.test.ts +80 -0
  529. package/src/components/android-connection-service-controller.ts +132 -0
  530. package/src/components/episode-diagnostic-render-observer.test.ts +24 -0
  531. package/src/components/episode-diagnostic-render-observer.ts +12 -0
  532. package/src/components/native-animation-controller.test.ts +47 -0
  533. package/src/components/native-animation-controller.ts +36 -0
  534. package/src/components/native-chat.test.ts +22 -0
  535. package/src/components/native-chat.ts +23 -0
  536. package/src/components/native-entrance/entrance-controller-store.test.ts +75 -0
  537. package/src/components/native-entrance/entrance-controller-store.ts +112 -0
  538. package/src/components/native-entrance/useEntranceController.ts +60 -0
  539. package/src/components/native-joining-loading-animation.ts +26 -0
  540. package/src/components/native-media-visibility.test.ts +77 -0
  541. package/src/components/native-media-visibility.ts +18 -0
  542. package/src/components/native-space-callkit-controller.test.ts +62 -0
  543. package/src/components/native-space-callkit-controller.ts +131 -0
  544. package/src/components/native-space-view/AppearanceSettings.test.tsx +56 -0
  545. package/src/components/native-space-view/AppearanceSettings.tsx +114 -0
  546. package/src/components/native-space-view/ParticipantActionSheet.test.tsx +18 -0
  547. package/src/components/native-space-view/ParticipantActionSheet.tsx +99 -0
  548. package/src/components/native-space-view/SettingsSheet.test.tsx +17 -0
  549. package/src/components/native-space-view/SettingsSheet.tsx +164 -0
  550. package/src/components/native-space-view/SpaceActionMenu.test.tsx +110 -0
  551. package/src/components/native-space-view/SpaceActionMenu.tsx +78 -0
  552. package/src/components/native-space-view/SpaceBottomDock.android.test.tsx +61 -0
  553. package/src/components/native-space-view/SpaceBottomDock.android.tsx +115 -0
  554. package/src/components/native-space-view/SpaceChatSheet.test.tsx +18 -0
  555. package/src/components/native-space-view/SpaceChatSheet.tsx +179 -0
  556. package/src/components/native-space-view/SpaceGrid.android.tsx +323 -0
  557. package/src/components/native-space-view/SpaceMoreSheet.test.tsx +15 -0
  558. package/src/components/native-space-view/SpaceMoreSheet.tsx +161 -0
  559. package/src/components/native-space-view/SpacePanelSheet.test.tsx +15 -0
  560. package/src/components/native-space-view/SpacePanelSheet.tsx +45 -0
  561. package/src/components/native-space-view/SpacePeopleSheet.test.tsx +13 -0
  562. package/src/components/native-space-view/SpacePeopleSheet.tsx +116 -0
  563. package/src/components/native-space-view/SpaceStage.android.tsx +372 -0
  564. package/src/components/native-space-view/SpaceSurfacePrimitives.test.tsx +12 -0
  565. package/src/components/native-space-view/SpaceSurfacePrimitives.tsx +75 -0
  566. package/src/components/native-space-view/SpaceTopBar.android.test.tsx +43 -0
  567. package/src/components/native-space-view/SpaceTopBar.android.tsx +97 -0
  568. package/src/components/native-space-view/SpaceWhiteboardSurface.test.tsx +85 -0
  569. package/src/components/native-space-view/SpaceWhiteboardSurface.tsx +69 -0
  570. package/src/components/native-space-view/diagnostics.test.ts +31 -0
  571. package/src/components/native-space-view/diagnostics.ts +84 -0
  572. package/src/components/native-space-view/format-space-duration.test.ts +13 -0
  573. package/src/components/native-space-view/format-space-duration.ts +3 -0
  574. package/src/components/native-space-view/native-space-grid-keys.test.ts +11 -0
  575. package/src/components/native-space-view/native-space-grid-keys.ts +6 -0
  576. package/src/components/native-space-view/native-space-page-store.test.ts +23 -0
  577. package/src/components/native-space-view/native-space-page-store.ts +41 -0
  578. package/src/components/native-space-view/screen-share-availability.ts +21 -0
  579. package/src/components/native-space-view/space-chat-attachments.test.ts +33 -0
  580. package/src/components/native-space-view/space-chat-attachments.ts +39 -0
  581. package/src/components/native-space-view/space-panel-layout.ts +10 -0
  582. package/src/components/native-space-view/space-progressive-surface-helpers.test.ts +24 -0
  583. package/src/components/native-space-view/space-progressive-surface-helpers.ts +33 -0
  584. package/src/components/native-space-view/space-progressive-surface-types.ts +3 -0
  585. package/src/components/native-space-view/types.ts +25 -0
  586. package/src/components/native-space-view/useSpaceViewController.contract.test.ts +10 -0
  587. package/src/components/native-space-view/useSpaceViewController.contract.ts +34 -0
  588. package/src/components/native-space-view/useSpaceViewController.test.ts +105 -0
  589. package/src/components/native-space-view/useSpaceViewController.ts +396 -0
  590. package/src/components/native-space-view/useSpaceViewDerived.test.ts +58 -0
  591. package/src/components/native-space-view/useSpaceViewDerived.ts +29 -0
  592. package/src/components/native-space-view/useSpaceViewPanels.controlled.test.ts +40 -0
  593. package/src/components/native-space-view/useSpaceViewPanels.test.ts +73 -0
  594. package/src/components/native-space-view/useSpaceViewPanels.ts +170 -0
  595. package/src/components/rtc-video-view-availability.ts +16 -0
  596. package/src/components/space-lifecycle.test.ts +19 -0
  597. package/src/components/space-lifecycle.ts +2 -0
  598. package/src/components/useAndroidConnectionService.ts +55 -0
  599. package/src/context/space-client-context.test.tsx +10 -0
  600. package/src/context/space-client-context.tsx +21 -0
  601. package/src/diagnostics.test.ts +29 -0
  602. package/src/diagnostics.ts +187 -0
  603. package/src/hooks/entrance-preview-store.test.ts +79 -0
  604. package/src/hooks/entrance-preview-store.ts +99 -0
  605. package/src/hooks/external-store.ts +18 -0
  606. package/src/hooks/space-hooks.test.ts +76 -0
  607. package/src/hooks/space-hooks.ts +43 -0
  608. package/src/hooks/useEntrancePreview.ts +26 -0
  609. package/src/hooks/useLayout.test.ts +16 -0
  610. package/src/hooks/useLayout.ts +37 -0
  611. package/src/hooks/usePanels.ts +30 -0
  612. package/src/index.ts +10 -0
  613. package/src/invites.test.ts +56 -0
  614. package/src/invites.ts +43 -0
  615. package/src/ios-pad.ts +1 -0
  616. package/src/ios-phone.ts +1 -0
  617. package/src/ios.ts +1 -0
  618. package/src/macos.ts +1 -0
  619. package/src/media/native-webrtc.ts +11 -0
  620. package/src/platform/platform.ts +34 -0
  621. package/src/public-surface.test.ts +25 -0
  622. package/src/runtime.test.ts +83 -0
  623. package/src/runtime.ts +142 -0
  624. package/src/space-client/create-native-space-client.test.ts +247 -0
  625. package/src/space-client/create-native-space-client.ts +280 -0
  626. package/src/telemetry.test.ts +143 -0
  627. package/src/telemetry.ts +234 -0
  628. package/src/test-support/test-renderer.test.ts +9 -0
  629. package/src/test-support/test-renderer.ts +26 -0
  630. package/src/types/hugeicons-direct.d.ts +4 -0
  631. package/src/types/react-native-safe-area-context.d.ts +8 -0
  632. package/src/ui/appearance.test.ts +50 -0
  633. package/src/ui/appearance.ts +770 -0
  634. package/src/ui/native-appearance-context.controlled.test.tsx +41 -0
  635. package/src/ui/native-appearance-context.test.tsx +14 -0
  636. package/src/ui/native-appearance-context.tsx +74 -0
  637. package/src/ui/native-theme.test.ts +34 -0
  638. package/src/ui/native-theme.test.tsx +14 -0
  639. package/src/ui/native-theme.tsx +54 -0
  640. package/src/ui/native-types.ts +40 -0
  641. package/src/ui/participant-avatar.test.ts +29 -0
  642. package/src/ui/participant-avatar.ts +47 -0
  643. package/src/ui/theme-tokens.test.ts +14 -0
  644. package/src/ui/theme-tokens.ts +41 -0
  645. package/src/ui/theme.test.ts +36 -0
  646. package/src/ui/theme.ts +214 -0
  647. package/src/utils/build-chalk-invite-link.test.ts +12 -0
  648. package/src/utils/build-chalk-invite-link.ts +5 -0
  649. package/src/utils/ios-simulator.test.ts +96 -0
  650. package/src/utils/ios-simulator.ts +125 -0
  651. package/src/utils/native-space-layout.test.ts +170 -0
  652. package/src/utils/native-space-layout.ts +135 -0
  653. package/src/whiteboard/embedded-whiteboard-assets.test.ts +31 -0
  654. package/src/whiteboard/embedded-whiteboard-assets.ts +41 -0
@@ -0,0 +1,260 @@
1
+ import { ChalkWhiteboardController, type ChalkEmbeddedWhiteboardTransport, type ChalkEmbeddedWhiteboardViewport } from "@q9labsai/chalk-whiteboard/embedded";
2
+ import { useCallback, useEffect, useMemo, useRef, useState } from "react";
3
+ import { ActivityIndicator, Pressable, StyleSheet, Text, useWindowDimensions, View, type StyleProp, type ViewStyle } from "react-native";
4
+ import WebView, { type WebViewMessageEvent, type WebViewNavigation } from "react-native-webview";
5
+
6
+ import { useNativeTheme } from "../ui/native-theme";
7
+ import { isEmbeddedWhiteboardNavigationAllowed, rendererURLWithContext, resolveEmbeddedWhiteboardRendererURL } from "../whiteboard/embedded-whiteboard-assets";
8
+
9
+ export interface EmbeddedWhiteboardProps {
10
+ readonly transport: ChalkEmbeddedWhiteboardTransport;
11
+ readonly journeyId: string;
12
+ readonly traceparent?: string;
13
+ readonly tracestate?: string;
14
+ readonly canDraw: boolean;
15
+ readonly canClear: boolean;
16
+ readonly theme?: "light" | "dark";
17
+ readonly localParticipantColor?: string;
18
+ readonly rendererURL?: string;
19
+ readonly style?: StyleProp<ViewStyle>;
20
+ readonly testID?: string;
21
+ readonly onMetric?: (metric: { readonly name: string; readonly value: number; readonly attributes?: Readonly<Record<string, string | number | boolean>> }) => void;
22
+ readonly onError?: (error: { readonly code: string; readonly message: string; readonly recoverable: boolean }) => void;
23
+ readonly onUserExport?: (value: { readonly requestId: string; readonly format: "png" | "svg"; readonly mimeType: string; readonly dataURL: string }) => void;
24
+ }
25
+
26
+ export const embeddedWhiteboardWebViewSecurityPolicy = Object.freeze({
27
+ allowFileAccess: true,
28
+ allowFileAccessFromFileURLs: false,
29
+ allowUniversalAccessFromFileURLs: false,
30
+ cacheEnabled: false,
31
+ domStorageEnabled: false,
32
+ javaScriptCanOpenWindowsAutomatically: false,
33
+ javaScriptEnabled: true,
34
+ mixedContentMode: "never" as const,
35
+ setSupportMultipleWindows: false,
36
+ sharedCookiesEnabled: false,
37
+ thirdPartyCookiesEnabled: false,
38
+ });
39
+
40
+ export function EmbeddedWhiteboard({ transport, journeyId, traceparent, tracestate, canDraw, canClear, theme: themeOverride, localParticipantColor, rendererURL: rendererURLOverride, style, testID, onMetric, onError, onUserExport }: EmbeddedWhiteboardProps): React.JSX.Element {
41
+ const nativeTheme = useNativeTheme();
42
+ const theme = themeOverride ?? nativeTheme.colorScheme;
43
+ const webViewRef = useRef<WebView>(null);
44
+ const controllerRef = useRef<ChalkWhiteboardController | null>(null);
45
+ const listenersRef = useRef(new Set<(message: string) => void>());
46
+ const onMetricRef = useRef(onMetric);
47
+ const onErrorRef = useRef(onError);
48
+ const onUserExportRef = useRef(onUserExport);
49
+ const [rendererURL, setRendererURL] = useState<string | null>(null);
50
+ const [rendererGeneration, setRendererGeneration] = useState(createRendererGeneration);
51
+ const [loadAttempt, setLoadAttempt] = useState(0);
52
+ const [loadError, setLoadError] = useState<string | null>(null);
53
+ const [compatibilityNotice, setCompatibilityNotice] = useState<string | null>(null);
54
+ const { width, height, scale } = useWindowDimensions();
55
+ onMetricRef.current = onMetric;
56
+ onErrorRef.current = onError;
57
+ onUserExportRef.current = onUserExport;
58
+
59
+ const rendererPort = useMemo(
60
+ () => ({
61
+ postMessage: (message: string) => webViewRef.current?.postMessage(message),
62
+ subscribe: (listener: (message: string) => void) => {
63
+ listenersRef.current.add(listener);
64
+ return () => listenersRef.current.delete(listener);
65
+ },
66
+ }),
67
+ [],
68
+ );
69
+ const handleControllerError = useCallback((error: { readonly code: string; readonly message: string; readonly recoverable: boolean }) => onErrorRef.current?.(error), []);
70
+ const handleControllerMetric = useCallback((metric: { readonly name: string; readonly value: number; readonly attributes?: Readonly<Record<string, string | number | boolean>> }) => onMetricRef.current?.(metric), []);
71
+ const handleControllerUserExport = useCallback((value: { readonly requestId: string; readonly format: "png" | "svg"; readonly mimeType: string; readonly dataURL: string }) => onUserExportRef.current?.(value), []);
72
+
73
+ useEffect(() => {
74
+ let active = true;
75
+ setLoadError(null);
76
+ void resolveEmbeddedWhiteboardRendererURL(rendererURLOverride)
77
+ .then((url) => {
78
+ if (active) setRendererURL(url);
79
+ })
80
+ .catch((cause: unknown) => {
81
+ if (!active) return;
82
+ const message = cause instanceof Error ? cause.message : "Chalk whiteboard assets are unavailable";
83
+ setLoadError(message);
84
+ onError?.({ code: "renderer_asset_unavailable", message, recoverable: false });
85
+ });
86
+ return () => {
87
+ active = false;
88
+ };
89
+ }, [loadAttempt, onError, rendererURLOverride]);
90
+
91
+ useEffect(() => {
92
+ setCompatibilityNotice(null);
93
+ const controller = new ChalkWhiteboardController({
94
+ renderer: rendererPort,
95
+ transport,
96
+ journeyId,
97
+ ...(traceparent ? { traceparent } : {}),
98
+ ...(tracestate ? { tracestate } : {}),
99
+ canDraw,
100
+ canClear,
101
+ theme,
102
+ ...(localParticipantColor ? { localParticipantColor } : {}),
103
+ onMetric: handleControllerMetric,
104
+ onError: handleControllerError,
105
+ onCompatibilityChange: (state) => setCompatibilityNotice(state.message),
106
+ onUserExport: handleControllerUserExport,
107
+ });
108
+ controller.start();
109
+ controllerRef.current = controller;
110
+ return () => {
111
+ if (controllerRef.current === controller) controllerRef.current = null;
112
+ controller.stop();
113
+ };
114
+ }, [handleControllerError, handleControllerMetric, handleControllerUserExport, journeyId, localParticipantColor, rendererPort, theme, traceparent, tracestate, transport]);
115
+
116
+ useEffect(() => {
117
+ controllerRef.current?.setCapabilities({ canDraw, canClear });
118
+ }, [canClear, canDraw]);
119
+
120
+ const viewport = useMemo<ChalkEmbeddedWhiteboardViewport>(() => ({ width, height, scale }), [height, scale, width]);
121
+ useEffect(() => {
122
+ controllerRef.current?.setViewport(viewport);
123
+ }, [viewport]);
124
+
125
+ const sourceURL = rendererURL ? rendererURLWithContext(rendererURL, { journeyId, rendererGeneration }) : null;
126
+ const handleMessage = (event: WebViewMessageEvent): void => {
127
+ const message = event.nativeEvent.data;
128
+ listenersRef.current.forEach((listener) => listener(message));
129
+ };
130
+ const allowNavigation = (request: WebViewNavigation): boolean => Boolean(rendererURL && isEmbeddedWhiteboardNavigationAllowed(request.url, rendererURL));
131
+ const reloadRenderer = (): void => {
132
+ controllerRef.current?.rendererReloaded();
133
+ setRendererGeneration(createRendererGeneration());
134
+ };
135
+ const retryRenderer = (): void => {
136
+ setLoadError(null);
137
+ setLoadAttempt((attempt) => attempt + 1);
138
+ reloadRenderer();
139
+ };
140
+ const handleRendererTermination = (): void => {
141
+ handleControllerMetric({ name: "whiteboard.renderer.termination", value: 1 });
142
+ handleControllerError({
143
+ code: "renderer_terminated",
144
+ message: "The whiteboard renderer stopped and is recovering.",
145
+ recoverable: true,
146
+ });
147
+ reloadRenderer();
148
+ };
149
+
150
+ if (loadError) {
151
+ return (
152
+ <View style={[styles.status, { backgroundColor: nativeTheme.colors.lightSurface }, style]} testID={testID}>
153
+ <Text style={[styles.errorTitle, { color: nativeTheme.colors.lightText }]}>Whiteboard unavailable</Text>
154
+ <Text style={[styles.errorMessage, { color: nativeTheme.colors.lightSubtleText }]}>{loadError}</Text>
155
+ <Pressable accessibilityRole="button" onPress={retryRenderer} style={({ pressed }) => [styles.retryButton, { backgroundColor: nativeTheme.colors.info }, pressed && styles.retryButtonPressed]}>
156
+ <Text style={[styles.retryButtonText, { color: nativeTheme.colors.onDark }]}>Retry</Text>
157
+ </Pressable>
158
+ </View>
159
+ );
160
+ }
161
+ if (!sourceURL || !rendererURL) {
162
+ return (
163
+ <View style={[styles.status, { backgroundColor: nativeTheme.colors.lightSurface }, style]} testID={testID}>
164
+ <ActivityIndicator color={nativeTheme.colors.info} />
165
+ <Text style={[styles.loadingMessage, { color: nativeTheme.colors.lightMutedText }]}>Loading whiteboard…</Text>
166
+ </View>
167
+ );
168
+ }
169
+
170
+ return (
171
+ <View style={[styles.container, style]} testID={testID}>
172
+ <WebView
173
+ key={rendererGeneration}
174
+ ref={webViewRef}
175
+ {...embeddedWhiteboardWebViewSecurityPolicy}
176
+ allowingReadAccessToURL={rendererURL.slice(0, rendererURL.lastIndexOf("/") + 1)}
177
+ mediaPlaybackRequiresUserAction
178
+ onContentProcessDidTerminate={handleRendererTermination}
179
+ onError={(event) => {
180
+ const message = event.nativeEvent.description || "The whiteboard renderer failed to load";
181
+ setLoadError(message);
182
+ handleControllerError({ code: "renderer_load_failed", message, recoverable: true });
183
+ }}
184
+ onMessage={handleMessage}
185
+ onRenderProcessGone={handleRendererTermination}
186
+ onShouldStartLoadWithRequest={allowNavigation}
187
+ originWhitelist={["file://*"]}
188
+ pullToRefreshEnabled={false}
189
+ scrollEnabled={false}
190
+ source={{ uri: sourceURL }}
191
+ style={[styles.webView, { backgroundColor: nativeTheme.colors.lightSurface }]}
192
+ webviewDebuggingEnabled={typeof __DEV__ !== "undefined" && __DEV__}
193
+ />
194
+ {compatibilityNotice ? (
195
+ <View pointerEvents="none" style={[styles.compatibilityNotice, { backgroundColor: nativeTheme.colors.dangerSurfaceOverlay94 }]}>
196
+ <Text style={[styles.compatibilityNoticeText, { color: nativeTheme.colors.onDark }]}>{compatibilityNotice}</Text>
197
+ </View>
198
+ ) : null}
199
+ </View>
200
+ );
201
+ }
202
+
203
+ function createRendererGeneration(): string {
204
+ return globalThis.crypto?.randomUUID?.() ?? `whiteboard-${Date.now()}-${Math.random().toString(36).slice(2)}`;
205
+ }
206
+
207
+ const styles = StyleSheet.create({
208
+ container: {
209
+ flex: 1,
210
+ overflow: "hidden",
211
+ },
212
+ webView: {
213
+ flex: 1,
214
+ },
215
+ compatibilityNotice: {
216
+ position: "absolute",
217
+ top: 12,
218
+ left: 12,
219
+ right: 12,
220
+ borderRadius: 10,
221
+ paddingHorizontal: 12,
222
+ paddingVertical: 10,
223
+ },
224
+ compatibilityNoticeText: {
225
+ fontSize: 13,
226
+ fontWeight: "700",
227
+ textAlign: "center",
228
+ },
229
+ status: {
230
+ flex: 1,
231
+ alignItems: "center",
232
+ justifyContent: "center",
233
+ gap: 10,
234
+ padding: 24,
235
+ },
236
+ loadingMessage: {
237
+ fontSize: 14,
238
+ fontWeight: "600",
239
+ },
240
+ errorTitle: {
241
+ fontSize: 17,
242
+ fontWeight: "700",
243
+ },
244
+ errorMessage: {
245
+ fontSize: 13,
246
+ textAlign: "center",
247
+ },
248
+ retryButton: {
249
+ borderRadius: 8,
250
+ paddingHorizontal: 16,
251
+ paddingVertical: 10,
252
+ },
253
+ retryButtonPressed: {
254
+ opacity: 0.75,
255
+ },
256
+ retryButtonText: {
257
+ fontSize: 14,
258
+ fontWeight: "700",
259
+ },
260
+ });
@@ -0,0 +1,19 @@
1
+ import { describe, expect, it, vi } from "vitest";
2
+
3
+ vi.mock("./EntranceView", () => ({ EntranceView: "EntranceView" }));
4
+ vi.mock("react-native", () => ({ Image: "Image" }));
5
+
6
+ import { Entrance } from "./Entrance";
7
+
8
+ describe("Entrance", () => {
9
+ it("exposes the preparation component", () => {
10
+ expect(Entrance).toBeTypeOf("function");
11
+ });
12
+
13
+ it("forwards the public cancel callback to the native Entrance view", () => {
14
+ const onCancel = vi.fn();
15
+ const element = Entrance({ onCancel, onJoin: vi.fn(), spaceName: "Space" });
16
+
17
+ expect(element.props.onCancel).toBe(onCancel);
18
+ });
19
+ });
@@ -0,0 +1,41 @@
1
+ import { EntranceView } from "./EntranceView";
2
+ import { Image } from "react-native";
3
+
4
+ export type EntranceDefaults = {
5
+ readonly microphone?: boolean;
6
+ readonly camera?: boolean;
7
+ };
8
+
9
+ export type EntranceSettings = {
10
+ readonly displayName: string;
11
+ readonly microphone: boolean;
12
+ readonly camera: boolean;
13
+ };
14
+
15
+ export type EntranceProps = {
16
+ readonly spaceName: string;
17
+ readonly logoUrl?: string;
18
+ readonly defaultDisplayName?: string;
19
+ readonly defaults?: EntranceDefaults;
20
+ readonly error?: string;
21
+ readonly joining?: boolean;
22
+ readonly onCancel?: () => void;
23
+ readonly onJoin: (settings: EntranceSettings) => void | Promise<void>;
24
+ };
25
+
26
+ /** The native implementation owns the device preview lifecycle and disposal. */
27
+ export function Entrance({ spaceName, logoUrl, defaultDisplayName, defaults, error, joining = false, onCancel, onJoin }: EntranceProps): React.JSX.Element {
28
+ return (
29
+ <EntranceView
30
+ error={error}
31
+ initialAudioEnabled={defaults?.microphone ?? true}
32
+ initialVideoEnabled={defaults?.camera ?? true}
33
+ joinDisabled={joining}
34
+ logo={logoUrl ? <Image accessibilityLabel="Chalk" source={{ uri: logoUrl }} style={{ height: 32, width: 120 }} /> : undefined}
35
+ onCancel={onCancel}
36
+ onJoin={({ displayName, microphoneEnabled, cameraEnabled }) => void onJoin({ displayName, microphone: microphoneEnabled, camera: cameraEnabled })}
37
+ spaceName={spaceName}
38
+ displayName={defaultDisplayName}
39
+ />
40
+ );
41
+ }
@@ -0,0 +1,100 @@
1
+ import { isValidElement, type ReactElement, type ReactNode } from "react";
2
+ import { describe, expect, it, vi } from "vitest";
3
+
4
+ const controller = vi.hoisted(() => ({
5
+ displayName: "Ada",
6
+ audioEnabled: true,
7
+ videoEnabled: true,
8
+ isSubmitting: false,
9
+ isInputFocused: false,
10
+ previewError: null,
11
+ previewStream: null,
12
+ simulatorMediaDisabled: false,
13
+ setDisplayName: vi.fn(),
14
+ setInputFocused: vi.fn(),
15
+ toggleAudio: vi.fn(),
16
+ toggleVideo: vi.fn(),
17
+ handleJoin: vi.fn(),
18
+ }));
19
+
20
+ const theme = vi.hoisted(() => ({
21
+ colors: {
22
+ background: "#101112",
23
+ foreground: "#f7f8f9",
24
+ primary: "#12ab89",
25
+ primaryForeground: "#ffffff",
26
+ muted: "#343536",
27
+ mutedForeground: "#909192",
28
+ error: "#dc2626",
29
+ card: "#202122",
30
+ surface: "#303132",
31
+ raisedSurface: "#404142",
32
+ insetSurface: "#505152",
33
+ controlsBackground: "#606162",
34
+ border: "#707172",
35
+ ring: "#808182",
36
+ darkCanvas: "#010203",
37
+ },
38
+ }));
39
+
40
+ vi.mock("react-native", () => ({
41
+ KeyboardAvoidingView: "KeyboardAvoidingView",
42
+ Platform: { OS: "android" },
43
+ Pressable: "Pressable",
44
+ StyleSheet: { absoluteFillObject: {}, create: <T,>(styles: T) => styles },
45
+ Text: "Text",
46
+ TextInput: "TextInput",
47
+ View: "View",
48
+ }));
49
+ vi.mock("@hugeicons/react-native", () => ({ HugeiconsIcon: "HugeiconsIcon" }));
50
+ vi.mock("../media/native-webrtc", () => ({ RTCView: "RTCView" }));
51
+ vi.mock("../ui/native-theme", () => ({ useNativeTheme: () => theme }));
52
+ vi.mock("./FaceAvatar", () => ({ FaceAvatar: "FaceAvatar" }));
53
+ vi.mock("./native-entrance/useEntranceController", () => ({ useEntranceController: () => controller }));
54
+
55
+ import { EntranceViewAndroid } from "./EntranceView.android";
56
+
57
+ describe("EntranceViewAndroid", () => {
58
+ it("applies the active theme to its native surface and media controls", () => {
59
+ const entrance = EntranceViewAndroid({ onJoin: vi.fn(), spaceName: "Design review" });
60
+ const screen = findElements(entrance, (element) => element.type === "KeyboardAvoidingView")[0];
61
+ const mediaControl = findElements(entrance, (element) => element.type === "Pressable" && !element.props.accessibilityLabel)[0];
62
+ const mediaStyle = mediaControl?.props.style as ((state: { readonly pressed: boolean }) => unknown) | undefined;
63
+
64
+ expect(JSON.stringify(screen?.props.style)).toContain(theme.colors.background);
65
+ expect(JSON.stringify(mediaStyle?.({ pressed: false }))).toContain(theme.colors.controlsBackground);
66
+ });
67
+
68
+ it("omits the Android cancel control when no cancellation handler is supplied", () => {
69
+ const withoutCancel = EntranceViewAndroid({ onJoin: vi.fn(), spaceName: "Design review" });
70
+ const withCancel = EntranceViewAndroid({ onCancel: vi.fn(), onJoin: vi.fn(), spaceName: "Design review" });
71
+
72
+ expect(findElements(withoutCancel, (element) => element.props.accessibilityLabel === "Cancel and leave Entrance")).toHaveLength(0);
73
+ expect(findElements(withCancel, (element) => element.props.accessibilityLabel === "Cancel and leave Entrance")).toHaveLength(1);
74
+ });
75
+ });
76
+
77
+ interface NativeElementProps {
78
+ readonly accessibilityLabel?: string;
79
+ readonly children?: ReactNode;
80
+ readonly style?: unknown;
81
+ }
82
+
83
+ function findElements(node: ReactNode, matches: (element: ReactElement<NativeElementProps>) => boolean): ReactElement<NativeElementProps>[] {
84
+ const found: ReactElement<NativeElementProps>[] = [];
85
+ if (!isValidElement<NativeElementProps>(node)) {
86
+ return found;
87
+ }
88
+
89
+ if (matches(node)) {
90
+ found.push(node);
91
+ }
92
+
93
+ const children = node.props.children;
94
+ for (const child of Array.isArray(children) ? children : [children]) {
95
+ if (child !== undefined && child !== null) {
96
+ found.push(...findElements(child, matches));
97
+ }
98
+ }
99
+ return found;
100
+ }
@@ -0,0 +1,274 @@
1
+ import { RTCView } from "../media/native-webrtc";
2
+ import ArrowLeft01Icon from "@hugeicons/core-free-icons/dist/esm/ArrowLeft01Icon";
3
+ import Mic01Icon from "@hugeicons/core-free-icons/dist/esm/Mic01Icon";
4
+ import MicOff01Icon from "@hugeicons/core-free-icons/dist/esm/MicOff01Icon";
5
+ import UserIcon from "@hugeicons/core-free-icons/dist/esm/UserIcon";
6
+ import Video01Icon from "@hugeicons/core-free-icons/dist/esm/Video01Icon";
7
+ import VideoOffIcon from "@hugeicons/core-free-icons/dist/esm/VideoOffIcon";
8
+ import { HugeiconsIcon } from "@hugeicons/react-native";
9
+ import { KeyboardAvoidingView, Platform, Pressable, StyleSheet, Text, TextInput, View } from "react-native";
10
+ import { Theme } from "../ui/theme";
11
+ import { useNativeTheme } from "../ui/native-theme";
12
+ import { getIosSimulatorMediaMessage } from "../utils/ios-simulator";
13
+ import { FaceAvatar } from "./FaceAvatar";
14
+ import type { EntranceViewProps } from "./EntranceView";
15
+ import { useEntranceController } from "./native-entrance/useEntranceController";
16
+
17
+ export function EntranceViewAndroid({ spaceName, error, joinDisabled = false, onCancel, ...props }: EntranceViewProps): React.JSX.Element {
18
+ const controller = useEntranceController({ ...props, joinDisabled });
19
+ const theme = useNativeTheme();
20
+ const canJoin = controller.displayName.trim().length > 0 && !joinDisabled && !controller.isSubmitting;
21
+
22
+ return (
23
+ <KeyboardAvoidingView behavior={Platform.OS === "ios" ? "padding" : "height"} style={[styles.screen, { backgroundColor: theme.colors.background }]}>
24
+ <View style={styles.content}>
25
+ <View style={styles.previewContainer}>
26
+ <View style={[styles.previewSurface, { backgroundColor: theme.colors.raisedSurface, borderColor: theme.colors.border }]}>
27
+ {controller.previewStream && controller.videoEnabled ? (
28
+ <RTCView mirror objectFit="cover" streamURL={controller.previewStream.toURL()} style={styles.previewVideo} zOrder={0} />
29
+ ) : (
30
+ <View style={[styles.avatarContainer, { backgroundColor: theme.colors.insetSurface }]}>
31
+ <FaceAvatar name={controller.displayName} size={140} textSize={52} />
32
+ </View>
33
+ )}
34
+
35
+ {onCancel ? (
36
+ <Pressable accessibilityLabel="Cancel and leave Entrance" accessibilityRole="button" onPress={onCancel} style={({ pressed }) => [styles.floatingBack, { backgroundColor: theme.colors.surface, borderColor: theme.colors.border }, pressed && styles.topIconButtonPressed]}>
37
+ <HugeiconsIcon icon={ArrowLeft01Icon} size={22} color={theme.colors.foreground} />
38
+ </Pressable>
39
+ ) : null}
40
+ </View>
41
+
42
+ {controller.previewError && controller.videoEnabled ? <Text style={styles.previewError}>{controller.previewError}</Text> : null}
43
+ {controller.simulatorMediaDisabled ? <Text style={styles.previewHint}>{getIosSimulatorMediaMessage()}</Text> : null}
44
+ </View>
45
+
46
+ <View style={[styles.sheetContainer, { backgroundColor: theme.colors.card, borderColor: theme.colors.border, shadowColor: theme.colors.darkCanvas }]}>
47
+ <View style={styles.sheetHandle} />
48
+ <View style={styles.sheetHeader}>
49
+ <Text style={[styles.spaceName, { color: theme.colors.foreground }]} numberOfLines={1}>
50
+ {spaceName}
51
+ </Text>
52
+ </View>
53
+
54
+ <View style={[styles.inputCard, { backgroundColor: theme.colors.surface, borderColor: controller.isInputFocused ? theme.colors.ring : theme.colors.border }]}>
55
+ <HugeiconsIcon icon={UserIcon} size={18} color={controller.isInputFocused ? theme.colors.primary : theme.colors.mutedForeground} style={styles.inputIcon} />
56
+ <TextInput
57
+ onChangeText={controller.setDisplayName}
58
+ onFocus={() => controller.setInputFocused(true)}
59
+ onBlur={() => controller.setInputFocused(false)}
60
+ placeholder="Enter your name"
61
+ placeholderTextColor={theme.colors.mutedForeground}
62
+ style={[styles.nameInput, { color: theme.colors.foreground }]}
63
+ value={controller.displayName}
64
+ maxLength={30}
65
+ returnKeyType="join"
66
+ onSubmitEditing={controller.handleJoin}
67
+ />
68
+ </View>
69
+
70
+ <View style={styles.mediaRow}>
71
+ <Pressable
72
+ disabled={controller.simulatorMediaDisabled}
73
+ onPress={controller.toggleAudio}
74
+ style={({ pressed }) => [styles.controlCircle, { backgroundColor: controller.audioEnabled ? theme.colors.controlsBackground : theme.colors.error, borderColor: theme.colors.border }, controller.simulatorMediaDisabled && styles.toggleCircleDisabled, pressed && styles.togglePressed]}
75
+ >
76
+ <HugeiconsIcon icon={controller.audioEnabled ? Mic01Icon : MicOff01Icon} size={24} color={theme.colors.primaryForeground} />
77
+ </Pressable>
78
+ <Pressable
79
+ disabled={controller.simulatorMediaDisabled}
80
+ onPress={controller.toggleVideo}
81
+ style={({ pressed }) => [styles.controlCircle, { backgroundColor: controller.videoEnabled ? theme.colors.controlsBackground : theme.colors.error, borderColor: theme.colors.border }, controller.simulatorMediaDisabled && styles.toggleCircleDisabled, pressed && styles.togglePressed]}
82
+ >
83
+ <HugeiconsIcon icon={controller.videoEnabled ? Video01Icon : VideoOffIcon} size={24} color={theme.colors.primaryForeground} />
84
+ </Pressable>
85
+ </View>
86
+
87
+ {error ? <Text style={[styles.globalError, { color: theme.colors.error }]}>{error}</Text> : null}
88
+
89
+ <Pressable disabled={!canJoin} onPress={controller.handleJoin} style={({ pressed }) => [styles.joinButton, { backgroundColor: canJoin ? theme.colors.primary : theme.colors.muted }, !canJoin && styles.joinButtonDisabled, pressed && styles.togglePressed]}>
90
+ <Text style={[styles.joinButtonText, { color: theme.colors.primaryForeground }]}>{controller.isSubmitting || joinDisabled ? "Joining..." : "Enter Space"}</Text>
91
+ </Pressable>
92
+ </View>
93
+ </View>
94
+ </KeyboardAvoidingView>
95
+ );
96
+ }
97
+
98
+ export { EntranceViewAndroid as EntranceView };
99
+
100
+ const styles = StyleSheet.create({
101
+ screen: {
102
+ flex: 1,
103
+ backgroundColor: Theme.colors.background,
104
+ },
105
+ content: {
106
+ flex: 1,
107
+ },
108
+ floatingBack: {
109
+ position: "absolute",
110
+ top: Platform.OS === "ios" ? 24 : 20,
111
+ left: 20,
112
+ width: 42,
113
+ height: 42,
114
+ borderRadius: 21,
115
+ backgroundColor: Theme.colors.darkOverlay40,
116
+ alignItems: "center",
117
+ justifyContent: "center",
118
+ zIndex: 10,
119
+ borderWidth: 1,
120
+ borderColor: Theme.colors.whiteOverlay10,
121
+ },
122
+ previewContainer: {
123
+ flex: 1,
124
+ justifyContent: "center",
125
+ paddingTop: Platform.OS === "ios" ? 10 : 0,
126
+ marginBottom: 0,
127
+ },
128
+ previewSurface: {
129
+ width: "100%",
130
+ aspectRatio: 0.72,
131
+ backgroundColor: Theme.colors.raisedSurface,
132
+ borderRadius: 32,
133
+ alignSelf: "center",
134
+ overflow: "hidden",
135
+ position: "relative",
136
+ borderWidth: 1,
137
+ borderColor: Theme.colors.whiteOverlay06,
138
+ },
139
+ previewVideo: {
140
+ ...StyleSheet.absoluteFillObject,
141
+ },
142
+ avatarContainer: {
143
+ ...StyleSheet.absoluteFillObject,
144
+ alignItems: "center",
145
+ justifyContent: "center",
146
+ backgroundColor: Theme.colors.insetSurface,
147
+ },
148
+ togglePressed: {
149
+ opacity: 0.7,
150
+ transform: [{ scale: 0.9 }],
151
+ },
152
+ previewError: {
153
+ color: Theme.colors.error,
154
+ fontSize: 12,
155
+ marginTop: 10,
156
+ textAlign: "center",
157
+ fontWeight: "600",
158
+ paddingHorizontal: 24,
159
+ },
160
+ previewHint: {
161
+ color: Theme.colors.mutedForeground,
162
+ fontSize: 12,
163
+ marginTop: 10,
164
+ textAlign: "center",
165
+ lineHeight: 18,
166
+ paddingHorizontal: 24,
167
+ },
168
+ sheetContainer: {
169
+ backgroundColor: Theme.colors.elevatedSurface,
170
+ borderTopLeftRadius: 32,
171
+ borderTopRightRadius: 32,
172
+ paddingHorizontal: 24,
173
+ paddingTop: 16,
174
+ paddingBottom: Platform.OS === "ios" ? 44 : 32,
175
+ gap: 20,
176
+ borderTopWidth: 1,
177
+ borderColor: Theme.colors.whiteOverlay08,
178
+ shadowColor: Theme.colors.darkCanvas,
179
+ shadowOffset: { width: 0, height: -12 },
180
+ shadowOpacity: 0.3,
181
+ shadowRadius: 16,
182
+ elevation: 20,
183
+ },
184
+ sheetHandle: {
185
+ width: 36,
186
+ height: 4,
187
+ borderRadius: 2,
188
+ backgroundColor: Theme.colors.whiteOverlay10,
189
+ alignSelf: "center",
190
+ marginBottom: 8,
191
+ },
192
+ sheetHeader: {
193
+ alignItems: "center",
194
+ marginBottom: 4,
195
+ },
196
+ spaceName: {
197
+ color: Theme.colors.foreground,
198
+ fontSize: 22,
199
+ fontWeight: "800",
200
+ textAlign: "center",
201
+ letterSpacing: -0.6,
202
+ },
203
+ inputCard: {
204
+ flexDirection: "row",
205
+ alignItems: "center",
206
+ backgroundColor: Theme.colors.whiteOverlay04,
207
+ borderRadius: 18,
208
+ paddingHorizontal: 16,
209
+ height: 56,
210
+ borderWidth: 1,
211
+ borderColor: Theme.colors.whiteOverlay08,
212
+ },
213
+ inputCardFocused: {
214
+ borderColor: Theme.colors.primary,
215
+ backgroundColor: Theme.colors.accentOverlay04,
216
+ },
217
+ inputIcon: {
218
+ marginRight: 24,
219
+ },
220
+ nameInput: {
221
+ flex: 1,
222
+ color: Theme.colors.onDark,
223
+ fontSize: 16,
224
+ fontWeight: "600",
225
+ padding: 0,
226
+ },
227
+ mediaRow: {
228
+ flexDirection: "row",
229
+ justifyContent: "center",
230
+ gap: 20,
231
+ },
232
+ controlCircle: {
233
+ width: 64,
234
+ height: 64,
235
+ borderRadius: 32,
236
+ backgroundColor: Theme.colors.whiteOverlay06,
237
+ alignItems: "center",
238
+ justifyContent: "center",
239
+ borderWidth: 1,
240
+ borderColor: Theme.colors.whiteOverlay10,
241
+ },
242
+ toggleCircleOff: {
243
+ backgroundColor: Theme.colors.dangerStrong,
244
+ borderColor: Theme.colors.dangerStrong,
245
+ },
246
+ toggleCircleDisabled: {
247
+ opacity: 0.45,
248
+ },
249
+ joinButton: {
250
+ width: "100%",
251
+ height: 58,
252
+ borderRadius: 18,
253
+ alignItems: "center",
254
+ justifyContent: "center",
255
+ },
256
+ joinButtonDisabled: {
257
+ opacity: 0.6,
258
+ },
259
+ joinButtonText: {
260
+ color: Theme.colors.onDark,
261
+ fontSize: 16,
262
+ fontWeight: "700",
263
+ },
264
+ globalError: {
265
+ color: Theme.colors.error,
266
+ fontSize: 13,
267
+ fontWeight: "600",
268
+ textAlign: "center",
269
+ },
270
+ topIconButtonPressed: {
271
+ opacity: 0.6,
272
+ transform: [{ scale: 0.92 }],
273
+ },
274
+ });