@streamplace/components 0.8.9 → 0.8.13

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 (637) hide show
  1. package/dist/components/chat/chat-box.d.ts +8 -0
  2. package/dist/components/chat/chat-box.d.ts.map +1 -0
  3. package/dist/components/chat/chat-box.js +19 -2
  4. package/dist/components/chat/chat-box.js.map +1 -0
  5. package/dist/components/chat/chat-message.d.ts +8 -0
  6. package/dist/components/chat/chat-message.d.ts.map +1 -0
  7. package/dist/components/chat/chat-message.js +6 -4
  8. package/dist/components/chat/chat-message.js.map +1 -0
  9. package/dist/components/chat/chat.d.ts +7 -0
  10. package/dist/components/chat/chat.d.ts.map +1 -0
  11. package/dist/components/chat/chat.js +1 -0
  12. package/dist/components/chat/chat.js.map +1 -0
  13. package/dist/components/chat/emoji-suggestions.d.ts +38 -0
  14. package/dist/components/chat/emoji-suggestions.d.ts.map +1 -0
  15. package/dist/components/chat/emoji-suggestions.js +1 -0
  16. package/dist/components/chat/emoji-suggestions.js.map +1 -0
  17. package/dist/components/chat/mention-suggestions.d.ts +9 -0
  18. package/dist/components/chat/mention-suggestions.d.ts.map +1 -0
  19. package/dist/components/chat/mention-suggestions.js +1 -0
  20. package/dist/components/chat/mention-suggestions.js.map +1 -0
  21. package/dist/components/chat/mod-view.d.ts +20 -0
  22. package/dist/components/chat/mod-view.d.ts.map +1 -0
  23. package/dist/components/chat/mod-view.js +5 -3
  24. package/dist/components/chat/mod-view.js.map +1 -0
  25. package/dist/components/chat/system-message.d.ts +7 -0
  26. package/dist/components/chat/system-message.d.ts.map +1 -0
  27. package/dist/components/chat/system-message.js +1 -0
  28. package/dist/components/chat/system-message.js.map +1 -0
  29. package/dist/components/content-metadata/content-metadata-form.d.ts +9 -0
  30. package/dist/components/content-metadata/content-metadata-form.d.ts.map +1 -0
  31. package/dist/components/content-metadata/content-metadata-form.js +4 -2
  32. package/dist/components/content-metadata/content-metadata-form.js.map +1 -0
  33. package/dist/components/content-metadata/content-rights.d.ts +14 -0
  34. package/dist/components/content-metadata/content-rights.d.ts.map +1 -0
  35. package/dist/components/content-metadata/content-rights.js +1 -0
  36. package/dist/components/content-metadata/content-rights.js.map +1 -0
  37. package/dist/components/content-metadata/content-warning-badge.d.ts +5 -0
  38. package/dist/components/content-metadata/content-warning-badge.d.ts.map +1 -0
  39. package/dist/components/content-metadata/content-warning-badge.js +1 -0
  40. package/dist/components/content-metadata/content-warning-badge.js.map +1 -0
  41. package/dist/components/content-metadata/content-warnings.d.ts +7 -0
  42. package/dist/components/content-metadata/content-warnings.d.ts.map +1 -0
  43. package/dist/components/content-metadata/content-warnings.js +1 -0
  44. package/dist/components/content-metadata/content-warnings.js.map +1 -0
  45. package/dist/components/content-metadata/index.d.ts +8 -0
  46. package/dist/components/content-metadata/index.d.ts.map +1 -0
  47. package/dist/components/content-metadata/index.js +1 -0
  48. package/dist/components/content-metadata/index.js.map +1 -0
  49. package/dist/components/danmu/danmu-message.d.ts +17 -0
  50. package/dist/components/danmu/danmu-message.d.ts.map +1 -0
  51. package/dist/components/danmu/danmu-message.js +112 -0
  52. package/dist/components/danmu/danmu-message.js.map +1 -0
  53. package/dist/components/danmu/danmu-overlay-obs.d.ts +11 -0
  54. package/dist/components/danmu/danmu-overlay-obs.d.ts.map +1 -0
  55. package/dist/components/danmu/danmu-overlay-obs.js +21 -0
  56. package/dist/components/danmu/danmu-overlay-obs.js.map +1 -0
  57. package/dist/components/danmu/danmu-overlay.d.ts +10 -0
  58. package/dist/components/danmu/danmu-overlay.d.ts.map +1 -0
  59. package/dist/components/danmu/danmu-overlay.js +150 -0
  60. package/dist/components/danmu/danmu-overlay.js.map +1 -0
  61. package/dist/components/danmu/math.d.ts +10 -0
  62. package/dist/components/danmu/math.d.ts.map +1 -0
  63. package/dist/components/danmu/math.js +16 -0
  64. package/dist/components/danmu/math.js.map +1 -0
  65. package/dist/components/danmu/mu.d.ts +9 -0
  66. package/dist/components/danmu/mu.d.ts.map +1 -0
  67. package/dist/components/danmu/mu.js +9 -0
  68. package/dist/components/danmu/mu.js.map +1 -0
  69. package/dist/components/danmu/use-danmu-lanes.d.ts +19 -0
  70. package/dist/components/danmu/use-danmu-lanes.d.ts.map +1 -0
  71. package/dist/components/danmu/use-danmu-lanes.js +77 -0
  72. package/dist/components/danmu/use-danmu-lanes.js.map +1 -0
  73. package/dist/components/dashboard/chat-panel.d.ts +9 -0
  74. package/dist/components/dashboard/chat-panel.d.ts.map +1 -0
  75. package/dist/components/dashboard/chat-panel.js +1 -0
  76. package/dist/components/dashboard/chat-panel.js.map +1 -0
  77. package/dist/components/dashboard/header.d.ts +14 -0
  78. package/dist/components/dashboard/header.d.ts.map +1 -0
  79. package/dist/components/dashboard/header.js +1 -0
  80. package/dist/components/dashboard/header.js.map +1 -0
  81. package/dist/components/dashboard/index.d.ts +6 -0
  82. package/dist/components/dashboard/index.d.ts.map +1 -0
  83. package/dist/components/dashboard/index.js +1 -0
  84. package/dist/components/dashboard/index.js.map +1 -0
  85. package/dist/components/dashboard/information-widget.d.ts +9 -0
  86. package/dist/components/dashboard/information-widget.d.ts.map +1 -0
  87. package/dist/components/dashboard/information-widget.js +1 -0
  88. package/dist/components/dashboard/information-widget.js.map +1 -0
  89. package/dist/components/dashboard/mod-actions.d.ts +15 -0
  90. package/dist/components/dashboard/mod-actions.d.ts.map +1 -0
  91. package/dist/components/dashboard/mod-actions.js +1 -0
  92. package/dist/components/dashboard/mod-actions.js.map +1 -0
  93. package/dist/components/dashboard/problems.d.ts +13 -0
  94. package/dist/components/dashboard/problems.d.ts.map +1 -0
  95. package/dist/components/dashboard/problems.js +1 -0
  96. package/dist/components/dashboard/problems.js.map +1 -0
  97. package/dist/components/icons/bluesky-icon.d.ts +5 -0
  98. package/dist/components/icons/bluesky-icon.d.ts.map +1 -0
  99. package/dist/components/icons/bluesky-icon.js +1 -0
  100. package/dist/components/icons/bluesky-icon.js.map +1 -0
  101. package/dist/components/keep-awake.d.ts +2 -0
  102. package/dist/components/keep-awake.d.ts.map +1 -0
  103. package/dist/components/keep-awake.js +1 -0
  104. package/dist/components/keep-awake.js.map +1 -0
  105. package/dist/components/keep-awake.native.d.ts +2 -0
  106. package/dist/components/keep-awake.native.d.ts.map +1 -0
  107. package/dist/components/keep-awake.native.js +1 -0
  108. package/dist/components/keep-awake.native.js.map +1 -0
  109. package/dist/components/mobile-player/fullscreen.d.ts +7 -0
  110. package/dist/components/mobile-player/fullscreen.d.ts.map +1 -0
  111. package/dist/components/mobile-player/fullscreen.js +7 -1
  112. package/dist/components/mobile-player/fullscreen.js.map +1 -0
  113. package/dist/components/mobile-player/fullscreen.native.d.ts +7 -0
  114. package/dist/components/mobile-player/fullscreen.native.d.ts.map +1 -0
  115. package/dist/components/mobile-player/fullscreen.native.js +8 -2
  116. package/dist/components/mobile-player/fullscreen.native.js.map +1 -0
  117. package/dist/components/mobile-player/player.d.ts +8 -0
  118. package/dist/components/mobile-player/player.d.ts.map +1 -0
  119. package/dist/components/mobile-player/player.js +1 -0
  120. package/dist/components/mobile-player/player.js.map +1 -0
  121. package/dist/components/mobile-player/props.d.ts +19 -0
  122. package/dist/components/mobile-player/props.d.ts.map +1 -0
  123. package/dist/components/mobile-player/props.js +1 -0
  124. package/dist/components/mobile-player/props.js.map +1 -0
  125. package/dist/components/mobile-player/rotation-async.native.d.ts +4 -0
  126. package/dist/components/mobile-player/rotation-async.native.d.ts.map +1 -0
  127. package/dist/components/mobile-player/rotation-async.native.js +1 -0
  128. package/dist/components/mobile-player/rotation-async.native.js.map +1 -0
  129. package/dist/components/mobile-player/rotation-lock.d.ts +18 -0
  130. package/dist/components/mobile-player/rotation-lock.d.ts.map +1 -0
  131. package/dist/components/mobile-player/rotation-lock.js +1 -0
  132. package/dist/components/mobile-player/rotation-lock.js.map +1 -0
  133. package/dist/components/mobile-player/shared.d.ts +9 -0
  134. package/dist/components/mobile-player/shared.d.ts.map +1 -0
  135. package/dist/components/mobile-player/shared.js +1 -0
  136. package/dist/components/mobile-player/shared.js.map +1 -0
  137. package/dist/components/mobile-player/ui/autoplay-button.d.ts +2 -0
  138. package/dist/components/mobile-player/ui/autoplay-button.d.ts.map +1 -0
  139. package/dist/components/mobile-player/ui/autoplay-button.js +1 -0
  140. package/dist/components/mobile-player/ui/autoplay-button.js.map +1 -0
  141. package/dist/components/mobile-player/ui/countdown.d.ts +10 -0
  142. package/dist/components/mobile-player/ui/countdown.d.ts.map +1 -0
  143. package/dist/components/mobile-player/ui/countdown.js +1 -0
  144. package/dist/components/mobile-player/ui/countdown.js.map +1 -0
  145. package/dist/components/mobile-player/ui/index.d.ts +11 -0
  146. package/dist/components/mobile-player/ui/index.d.ts.map +1 -0
  147. package/dist/components/mobile-player/ui/index.js +2 -0
  148. package/dist/components/mobile-player/ui/index.js.map +1 -0
  149. package/dist/components/mobile-player/ui/input.d.ts +9 -0
  150. package/dist/components/mobile-player/ui/input.d.ts.map +1 -0
  151. package/dist/components/mobile-player/ui/input.js +1 -0
  152. package/dist/components/mobile-player/ui/input.js.map +1 -0
  153. package/dist/components/mobile-player/ui/metrics.d.ts +6 -0
  154. package/dist/components/mobile-player/ui/metrics.d.ts.map +1 -0
  155. package/dist/components/mobile-player/ui/metrics.js +1 -0
  156. package/dist/components/mobile-player/ui/metrics.js.map +1 -0
  157. package/dist/components/mobile-player/ui/report-modal.d.ts +13 -0
  158. package/dist/components/mobile-player/ui/report-modal.d.ts.map +1 -0
  159. package/dist/components/mobile-player/ui/report-modal.js +1 -0
  160. package/dist/components/mobile-player/ui/report-modal.js.map +1 -0
  161. package/dist/components/mobile-player/ui/streamer-context-menu.d.ts +2 -0
  162. package/dist/components/mobile-player/ui/streamer-context-menu.d.ts.map +1 -0
  163. package/dist/components/mobile-player/ui/streamer-context-menu.js +1 -0
  164. package/dist/components/mobile-player/ui/streamer-context-menu.js.map +1 -0
  165. package/dist/components/mobile-player/ui/streamer-loading-overlay.d.ts +11 -0
  166. package/dist/components/mobile-player/ui/streamer-loading-overlay.d.ts.map +1 -0
  167. package/dist/components/mobile-player/ui/streamer-loading-overlay.js +1 -0
  168. package/dist/components/mobile-player/ui/streamer-loading-overlay.js.map +1 -0
  169. package/dist/components/mobile-player/ui/viewer-context-menu.d.ts +9 -0
  170. package/dist/components/mobile-player/ui/viewer-context-menu.d.ts.map +1 -0
  171. package/dist/components/mobile-player/ui/viewer-context-menu.js +6 -5
  172. package/dist/components/mobile-player/ui/viewer-context-menu.js.map +1 -0
  173. package/dist/components/mobile-player/ui/viewer-count.d.ts +10 -0
  174. package/dist/components/mobile-player/ui/viewer-count.d.ts.map +1 -0
  175. package/dist/components/mobile-player/ui/viewer-count.js +24 -0
  176. package/dist/components/mobile-player/ui/viewer-count.js.map +1 -0
  177. package/dist/components/mobile-player/ui/viewer-loading-overlay.d.ts +2 -0
  178. package/dist/components/mobile-player/ui/viewer-loading-overlay.d.ts.map +1 -0
  179. package/dist/components/mobile-player/ui/viewer-loading-overlay.js +1 -0
  180. package/dist/components/mobile-player/ui/viewer-loading-overlay.js.map +1 -0
  181. package/dist/components/mobile-player/ui/viewers.d.ts +6 -0
  182. package/dist/components/mobile-player/ui/viewers.d.ts.map +1 -0
  183. package/dist/components/mobile-player/ui/viewers.js +9 -7
  184. package/dist/components/mobile-player/ui/viewers.js.map +1 -0
  185. package/dist/components/mobile-player/use-webrtc.d.ts +19 -0
  186. package/dist/components/mobile-player/use-webrtc.d.ts.map +1 -0
  187. package/dist/components/mobile-player/use-webrtc.js +1 -0
  188. package/dist/components/mobile-player/use-webrtc.js.map +1 -0
  189. package/dist/components/mobile-player/video-async.native.d.ts +16 -0
  190. package/dist/components/mobile-player/video-async.native.d.ts.map +1 -0
  191. package/dist/components/mobile-player/video-async.native.js +1 -0
  192. package/dist/components/mobile-player/video-async.native.js.map +1 -0
  193. package/dist/components/mobile-player/video-retry.d.ts +5 -0
  194. package/dist/components/mobile-player/video-retry.d.ts.map +1 -0
  195. package/dist/components/mobile-player/video-retry.js +1 -0
  196. package/dist/components/mobile-player/video-retry.js.map +1 -0
  197. package/dist/components/mobile-player/video.d.ts +25 -0
  198. package/dist/components/mobile-player/video.d.ts.map +1 -0
  199. package/dist/components/mobile-player/video.js +1 -0
  200. package/dist/components/mobile-player/video.js.map +1 -0
  201. package/dist/components/mobile-player/video.native.d.ts +3 -0
  202. package/dist/components/mobile-player/video.native.d.ts.map +1 -0
  203. package/dist/components/mobile-player/video.native.js +1 -0
  204. package/dist/components/mobile-player/video.native.js.map +1 -0
  205. package/dist/components/mobile-player/webrtc-diagnostics.d.ts +14 -0
  206. package/dist/components/mobile-player/webrtc-diagnostics.d.ts.map +1 -0
  207. package/dist/components/mobile-player/webrtc-diagnostics.js +1 -0
  208. package/dist/components/mobile-player/webrtc-diagnostics.js.map +1 -0
  209. package/dist/components/mobile-player/webrtc-primitives.d.ts +19 -0
  210. package/dist/components/mobile-player/webrtc-primitives.d.ts.map +1 -0
  211. package/dist/components/mobile-player/webrtc-primitives.js +1 -0
  212. package/dist/components/mobile-player/webrtc-primitives.js.map +1 -0
  213. package/dist/components/mobile-player/webrtc-primitives.native.d.ts +2 -0
  214. package/dist/components/mobile-player/webrtc-primitives.native.d.ts.map +1 -0
  215. package/dist/components/mobile-player/webrtc-primitives.native.js +1 -0
  216. package/dist/components/mobile-player/webrtc-primitives.native.js.map +1 -0
  217. package/dist/components/share/sharesheet.d.ts +5 -0
  218. package/dist/components/share/sharesheet.d.ts.map +1 -0
  219. package/dist/components/share/sharesheet.js +6 -14
  220. package/dist/components/share/sharesheet.js.map +1 -0
  221. package/dist/components/ui/button.d.ts +18 -0
  222. package/dist/components/ui/button.d.ts.map +1 -0
  223. package/dist/components/ui/button.js +14 -2
  224. package/dist/components/ui/button.js.map +1 -0
  225. package/dist/components/ui/checkbox.d.ts +11 -0
  226. package/dist/components/ui/checkbox.d.ts.map +1 -0
  227. package/dist/components/ui/checkbox.js +1 -0
  228. package/dist/components/ui/checkbox.js.map +1 -0
  229. package/dist/components/ui/dialog.d.ts +38 -0
  230. package/dist/components/ui/dialog.d.ts.map +1 -0
  231. package/dist/components/ui/dialog.js +1 -0
  232. package/dist/components/ui/dialog.js.map +1 -0
  233. package/dist/components/ui/dropdown.d.ts +132 -0
  234. package/dist/components/ui/dropdown.d.ts.map +1 -0
  235. package/dist/components/ui/dropdown.js +28 -238
  236. package/dist/components/ui/dropdown.js.map +1 -0
  237. package/dist/components/ui/dropdown.native.d.ts +132 -0
  238. package/dist/components/ui/dropdown.native.d.ts.map +1 -0
  239. package/dist/components/ui/dropdown.native.js +319 -0
  240. package/dist/components/ui/dropdown.native.js.map +1 -0
  241. package/dist/components/ui/icons.d.ts +12 -0
  242. package/dist/components/ui/icons.d.ts.map +1 -0
  243. package/dist/components/ui/icons.js +1 -0
  244. package/dist/components/ui/icons.js.map +1 -0
  245. package/dist/components/ui/index.d.ts +33 -0
  246. package/dist/components/ui/index.d.ts.map +1 -0
  247. package/dist/components/ui/index.js +2 -0
  248. package/dist/components/ui/index.js.map +1 -0
  249. package/dist/components/ui/info-box.d.ts +9 -0
  250. package/dist/components/ui/info-box.d.ts.map +1 -0
  251. package/dist/components/ui/info-box.js +1 -0
  252. package/dist/components/ui/info-box.js.map +1 -0
  253. package/dist/components/ui/info-row.d.ts +9 -0
  254. package/dist/components/ui/info-row.d.ts.map +1 -0
  255. package/dist/components/ui/info-row.js +1 -0
  256. package/dist/components/ui/info-row.js.map +1 -0
  257. package/dist/components/ui/input.d.ts +20 -0
  258. package/dist/components/ui/input.d.ts.map +1 -0
  259. package/dist/components/ui/input.js +1 -0
  260. package/dist/components/ui/input.js.map +1 -0
  261. package/dist/components/ui/loader.d.ts +3 -0
  262. package/dist/components/ui/loader.d.ts.map +1 -0
  263. package/dist/components/ui/loader.js +1 -0
  264. package/dist/components/ui/loader.js.map +1 -0
  265. package/dist/components/ui/menu.d.ts +34 -0
  266. package/dist/components/ui/menu.d.ts.map +1 -0
  267. package/dist/components/ui/menu.js +57 -0
  268. package/dist/components/ui/menu.js.map +1 -0
  269. package/dist/components/ui/primitives/button.d.ts +41 -0
  270. package/dist/components/ui/primitives/button.d.ts.map +1 -0
  271. package/dist/components/ui/primitives/button.js +1 -0
  272. package/dist/components/ui/primitives/button.js.map +1 -0
  273. package/dist/components/ui/primitives/input.d.ts +52 -0
  274. package/dist/components/ui/primitives/input.d.ts.map +1 -0
  275. package/dist/components/ui/primitives/input.js +1 -0
  276. package/dist/components/ui/primitives/input.js.map +1 -0
  277. package/dist/components/ui/primitives/modal.d.ts +46 -0
  278. package/dist/components/ui/primitives/modal.d.ts.map +1 -0
  279. package/dist/components/ui/primitives/modal.js +1 -0
  280. package/dist/components/ui/primitives/modal.js.map +1 -0
  281. package/dist/components/ui/primitives/text.d.ts +48 -0
  282. package/dist/components/ui/primitives/text.d.ts.map +1 -0
  283. package/dist/components/ui/primitives/text.js +1 -0
  284. package/dist/components/ui/primitives/text.js.map +1 -0
  285. package/dist/components/ui/resizeable.d.ts +14 -0
  286. package/dist/components/ui/resizeable.d.ts.map +1 -0
  287. package/dist/components/ui/resizeable.js +2 -1
  288. package/dist/components/ui/resizeable.js.map +1 -0
  289. package/dist/components/ui/select.d.ts +16 -0
  290. package/dist/components/ui/select.d.ts.map +1 -0
  291. package/dist/components/ui/select.js +1 -0
  292. package/dist/components/ui/select.js.map +1 -0
  293. package/dist/components/ui/slider.d.ts +2 -0
  294. package/dist/components/ui/slider.d.ts.map +1 -0
  295. package/dist/components/ui/slider.js +1 -0
  296. package/dist/components/ui/slider.js.map +1 -0
  297. package/dist/components/ui/text.d.ts +45 -0
  298. package/dist/components/ui/text.d.ts.map +1 -0
  299. package/dist/components/ui/text.js +1 -0
  300. package/dist/components/ui/text.js.map +1 -0
  301. package/dist/components/ui/textarea.d.ts +5 -0
  302. package/dist/components/ui/textarea.d.ts.map +1 -0
  303. package/dist/components/ui/textarea.js +1 -0
  304. package/dist/components/ui/textarea.js.map +1 -0
  305. package/dist/components/ui/toast.d.ts +92 -0
  306. package/dist/components/ui/toast.d.ts.map +1 -0
  307. package/dist/components/ui/toast.js +2 -1
  308. package/dist/components/ui/toast.js.map +1 -0
  309. package/dist/components/ui/tooltip.d.ts +8 -0
  310. package/dist/components/ui/tooltip.d.ts.map +1 -0
  311. package/dist/components/ui/tooltip.js +1 -0
  312. package/dist/components/ui/tooltip.js.map +1 -0
  313. package/dist/components/ui/view.d.ts +33 -0
  314. package/dist/components/ui/view.d.ts.map +1 -0
  315. package/dist/components/ui/view.js +1 -0
  316. package/dist/components/ui/view.js.map +1 -0
  317. package/dist/crypto-polyfill.d.ts +1 -0
  318. package/dist/crypto-polyfill.d.ts.map +1 -0
  319. package/dist/crypto-polyfill.js +1 -0
  320. package/dist/crypto-polyfill.js.map +1 -0
  321. package/dist/crypto-polyfill.native.d.ts +3 -0
  322. package/dist/crypto-polyfill.native.d.ts.map +1 -0
  323. package/dist/crypto-polyfill.native.js +1 -0
  324. package/dist/crypto-polyfill.native.js.map +1 -0
  325. package/dist/hooks/index.d.ts +11 -0
  326. package/dist/hooks/index.d.ts.map +1 -0
  327. package/dist/hooks/index.js +1 -0
  328. package/dist/hooks/index.js.map +1 -0
  329. package/dist/hooks/useAvatars.d.ts +3 -0
  330. package/dist/hooks/useAvatars.d.ts.map +1 -0
  331. package/dist/hooks/useAvatars.js +1 -0
  332. package/dist/hooks/useAvatars.js.map +1 -0
  333. package/dist/hooks/useCameraToggle.d.ts +5 -0
  334. package/dist/hooks/useCameraToggle.d.ts.map +1 -0
  335. package/dist/hooks/useCameraToggle.js +1 -0
  336. package/dist/hooks/useCameraToggle.js.map +1 -0
  337. package/dist/hooks/useKeyboard.d.ts +5 -0
  338. package/dist/hooks/useKeyboard.d.ts.map +1 -0
  339. package/dist/hooks/useKeyboard.js +1 -0
  340. package/dist/hooks/useKeyboard.js.map +1 -0
  341. package/dist/hooks/useKeyboardSlide.d.ts +5 -0
  342. package/dist/hooks/useKeyboardSlide.d.ts.map +1 -0
  343. package/dist/hooks/useKeyboardSlide.js +1 -0
  344. package/dist/hooks/useKeyboardSlide.js.map +1 -0
  345. package/dist/hooks/useLivestreamInfo.d.ts +15 -0
  346. package/dist/hooks/useLivestreamInfo.d.ts.map +1 -0
  347. package/dist/hooks/useLivestreamInfo.js +1 -0
  348. package/dist/hooks/useLivestreamInfo.js.map +1 -0
  349. package/dist/hooks/useOuterAndInnerDimensions.d.ts +10 -0
  350. package/dist/hooks/useOuterAndInnerDimensions.d.ts.map +1 -0
  351. package/dist/hooks/useOuterAndInnerDimensions.js +1 -0
  352. package/dist/hooks/useOuterAndInnerDimensions.js.map +1 -0
  353. package/dist/hooks/usePlayerDimensions.d.ts +12 -0
  354. package/dist/hooks/usePlayerDimensions.d.ts.map +1 -0
  355. package/dist/hooks/usePlayerDimensions.js +1 -0
  356. package/dist/hooks/usePlayerDimensions.js.map +1 -0
  357. package/dist/hooks/usePointerDevice.d.ts +12 -0
  358. package/dist/hooks/usePointerDevice.d.ts.map +1 -0
  359. package/dist/hooks/usePointerDevice.js +1 -0
  360. package/dist/hooks/usePointerDevice.js.map +1 -0
  361. package/dist/hooks/useSegmentDimensions.d.ts +6 -0
  362. package/dist/hooks/useSegmentDimensions.d.ts.map +1 -0
  363. package/dist/hooks/useSegmentDimensions.js +1 -0
  364. package/dist/hooks/useSegmentDimensions.js.map +1 -0
  365. package/dist/hooks/useSegmentTiming.d.ts +9 -0
  366. package/dist/hooks/useSegmentTiming.d.ts.map +1 -0
  367. package/dist/hooks/useSegmentTiming.js +1 -0
  368. package/dist/hooks/useSegmentTiming.js.map +1 -0
  369. package/dist/i18n/i18n-loader.d.ts +2 -0
  370. package/dist/i18n/i18n-loader.d.ts.map +1 -0
  371. package/dist/i18n/i18n-loader.js +17 -0
  372. package/dist/i18n/i18n-loader.js.map +1 -0
  373. package/dist/i18n/i18n-loader.native.d.ts +2 -0
  374. package/dist/i18n/i18n-loader.native.d.ts.map +1 -0
  375. package/dist/i18n/i18n-loader.native.js +51 -0
  376. package/dist/i18n/i18n-loader.native.js.map +1 -0
  377. package/dist/i18n/i18next-config.d.ts +41 -0
  378. package/dist/i18n/i18next-config.d.ts.map +1 -0
  379. package/dist/i18n/i18next-config.js +220 -0
  380. package/dist/i18n/i18next-config.js.map +1 -0
  381. package/dist/i18n/index.d.ts +11 -0
  382. package/dist/i18n/index.d.ts.map +1 -0
  383. package/dist/i18n/index.js +45 -0
  384. package/dist/i18n/index.js.map +1 -0
  385. package/dist/i18n/provider.d.ts +14 -0
  386. package/dist/i18n/provider.d.ts.map +1 -0
  387. package/dist/i18n/provider.js +58 -0
  388. package/dist/i18n/provider.js.map +1 -0
  389. package/dist/index.d.ts +34 -0
  390. package/dist/index.d.ts.map +1 -0
  391. package/dist/index.js +10 -1
  392. package/dist/index.js.map +1 -0
  393. package/dist/lib/browser.d.ts +2 -0
  394. package/dist/lib/browser.d.ts.map +1 -0
  395. package/dist/lib/browser.js +1 -0
  396. package/dist/lib/browser.js.map +1 -0
  397. package/dist/lib/facet.d.ts +11 -0
  398. package/dist/lib/facet.d.ts.map +1 -0
  399. package/dist/lib/facet.js +1 -0
  400. package/dist/lib/facet.js.map +1 -0
  401. package/dist/lib/metadata-constants.d.ts +13 -0
  402. package/dist/lib/metadata-constants.d.ts.map +1 -0
  403. package/dist/lib/metadata-constants.js +1 -0
  404. package/dist/lib/metadata-constants.js.map +1 -0
  405. package/dist/lib/system-messages.d.ts +49 -0
  406. package/dist/lib/system-messages.d.ts.map +1 -0
  407. package/dist/lib/system-messages.js +1 -0
  408. package/dist/lib/system-messages.js.map +1 -0
  409. package/dist/lib/theme/atoms.d.ts +4226 -0
  410. package/dist/lib/theme/atoms.d.ts.map +1 -0
  411. package/dist/lib/theme/atoms.js +1 -0
  412. package/dist/lib/theme/atoms.js.map +1 -0
  413. package/dist/lib/theme/atoms.types.d.ts +228 -0
  414. package/dist/lib/theme/atoms.types.d.ts.map +1 -0
  415. package/dist/lib/theme/atoms.types.js +1 -0
  416. package/dist/lib/theme/atoms.types.js.map +1 -0
  417. package/dist/lib/theme/index.d.ts +6 -0
  418. package/dist/lib/theme/index.d.ts.map +1 -0
  419. package/dist/lib/theme/index.js +1 -0
  420. package/dist/lib/theme/index.js.map +1 -0
  421. package/dist/lib/theme/theme.d.ts +327 -0
  422. package/dist/lib/theme/theme.d.ts.map +1 -0
  423. package/dist/lib/theme/theme.js +1 -0
  424. package/dist/lib/theme/theme.js.map +1 -0
  425. package/dist/lib/theme/tokens.d.ts +766 -0
  426. package/dist/lib/theme/tokens.d.ts.map +1 -0
  427. package/dist/lib/theme/tokens.js +1 -0
  428. package/dist/lib/theme/tokens.js.map +1 -0
  429. package/dist/lib/utils.d.ts +53 -0
  430. package/dist/lib/utils.d.ts.map +1 -0
  431. package/dist/lib/utils.js +1 -0
  432. package/dist/lib/utils.js.map +1 -0
  433. package/dist/livestream-provider/index.d.ts +13 -0
  434. package/dist/livestream-provider/index.d.ts.map +1 -0
  435. package/dist/livestream-provider/index.js +1 -0
  436. package/dist/livestream-provider/index.js.map +1 -0
  437. package/dist/livestream-provider/websocket.d.ts +2 -0
  438. package/dist/livestream-provider/websocket.d.ts.map +1 -0
  439. package/dist/livestream-provider/websocket.js +1 -0
  440. package/dist/livestream-provider/websocket.js.map +1 -0
  441. package/dist/livestream-store/chat.d.ts +21 -0
  442. package/dist/livestream-store/chat.d.ts.map +1 -0
  443. package/dist/livestream-store/chat.js +1 -0
  444. package/dist/livestream-store/chat.js.map +1 -0
  445. package/dist/livestream-store/context.d.ts +7 -0
  446. package/dist/livestream-store/context.d.ts.map +1 -0
  447. package/dist/livestream-store/context.js +1 -0
  448. package/dist/livestream-store/context.js.map +1 -0
  449. package/dist/livestream-store/index.d.ts +5 -0
  450. package/dist/livestream-store/index.d.ts.map +1 -0
  451. package/dist/livestream-store/index.js +1 -0
  452. package/dist/livestream-store/index.js.map +1 -0
  453. package/dist/livestream-store/livestream-state.d.ts +29 -0
  454. package/dist/livestream-store/livestream-state.d.ts.map +1 -0
  455. package/dist/livestream-store/livestream-state.js +1 -0
  456. package/dist/livestream-store/livestream-state.js.map +1 -0
  457. package/dist/livestream-store/livestream-store.d.ts +14 -0
  458. package/dist/livestream-store/livestream-store.d.ts.map +1 -0
  459. package/dist/livestream-store/livestream-store.js +1 -0
  460. package/dist/livestream-store/livestream-store.js.map +1 -0
  461. package/dist/livestream-store/problems.d.ts +4 -0
  462. package/dist/livestream-store/problems.d.ts.map +1 -0
  463. package/dist/livestream-store/problems.js +1 -0
  464. package/dist/livestream-store/problems.js.map +1 -0
  465. package/dist/livestream-store/stream-key.d.ts +9 -0
  466. package/dist/livestream-store/stream-key.d.ts.map +1 -0
  467. package/dist/livestream-store/stream-key.js +1 -0
  468. package/dist/livestream-store/stream-key.js.map +1 -0
  469. package/dist/livestream-store/websocket-consumer.d.ts +3 -0
  470. package/dist/livestream-store/websocket-consumer.d.ts.map +1 -0
  471. package/dist/livestream-store/websocket-consumer.js +1 -0
  472. package/dist/livestream-store/websocket-consumer.js.map +1 -0
  473. package/dist/player-store/context.d.ts +10 -0
  474. package/dist/player-store/context.d.ts.map +1 -0
  475. package/dist/player-store/context.js +1 -0
  476. package/dist/player-store/context.js.map +1 -0
  477. package/dist/player-store/index.d.ts +6 -0
  478. package/dist/player-store/index.d.ts.map +1 -0
  479. package/dist/player-store/index.js +1 -0
  480. package/dist/player-store/index.js.map +1 -0
  481. package/dist/player-store/player-provider.d.ts +12 -0
  482. package/dist/player-store/player-provider.d.ts.map +1 -0
  483. package/dist/player-store/player-provider.js +1 -0
  484. package/dist/player-store/player-provider.js.map +1 -0
  485. package/dist/player-store/player-state.d.ts +138 -0
  486. package/dist/player-store/player-state.d.ts.map +1 -0
  487. package/dist/player-store/player-state.js +1 -0
  488. package/dist/player-store/player-state.js.map +1 -0
  489. package/dist/player-store/player-store.d.ts +18 -0
  490. package/dist/player-store/player-store.d.ts.map +1 -0
  491. package/dist/player-store/player-store.js +1 -0
  492. package/dist/player-store/player-store.js.map +1 -0
  493. package/dist/player-store/single-player-provider.d.ts +61 -0
  494. package/dist/player-store/single-player-provider.d.ts.map +1 -0
  495. package/dist/player-store/single-player-provider.js +1 -0
  496. package/dist/player-store/single-player-provider.js.map +1 -0
  497. package/dist/storage/index.d.ts +4 -0
  498. package/dist/storage/index.d.ts.map +1 -0
  499. package/dist/storage/index.js +1 -0
  500. package/dist/storage/index.js.map +1 -0
  501. package/dist/storage/lock.d.ts +8 -0
  502. package/dist/storage/lock.d.ts.map +1 -0
  503. package/dist/storage/lock.js +1 -0
  504. package/dist/storage/lock.js.map +1 -0
  505. package/dist/storage/storage.d.ts +7 -0
  506. package/dist/storage/storage.d.ts.map +1 -0
  507. package/dist/storage/storage.js +1 -0
  508. package/dist/storage/storage.js.map +1 -0
  509. package/dist/storage/storage.native.d.ts +7 -0
  510. package/dist/storage/storage.native.d.ts.map +1 -0
  511. package/dist/storage/storage.native.js +1 -0
  512. package/dist/storage/storage.native.js.map +1 -0
  513. package/dist/storage/storage.shared.d.ts +6 -0
  514. package/dist/storage/storage.shared.d.ts.map +1 -0
  515. package/dist/storage/storage.shared.js +1 -0
  516. package/dist/storage/storage.shared.js.map +1 -0
  517. package/dist/streamplace-provider/context.d.ts +7 -0
  518. package/dist/streamplace-provider/context.d.ts.map +1 -0
  519. package/dist/streamplace-provider/context.js +1 -0
  520. package/dist/streamplace-provider/context.js.map +1 -0
  521. package/dist/streamplace-provider/index.d.ts +11 -0
  522. package/dist/streamplace-provider/index.d.ts.map +1 -0
  523. package/dist/streamplace-provider/index.js +1 -0
  524. package/dist/streamplace-provider/index.js.map +1 -0
  525. package/dist/streamplace-provider/poller.d.ts +5 -0
  526. package/dist/streamplace-provider/poller.d.ts.map +1 -0
  527. package/dist/streamplace-provider/poller.js +3 -0
  528. package/dist/streamplace-provider/poller.js.map +1 -0
  529. package/dist/streamplace-provider/xrpc.d.ts +1 -0
  530. package/dist/streamplace-provider/xrpc.d.ts.map +1 -0
  531. package/dist/streamplace-provider/xrpc.js +1 -0
  532. package/dist/streamplace-provider/xrpc.js.map +1 -0
  533. package/dist/streamplace-store/block.d.ts +9 -0
  534. package/dist/streamplace-store/block.d.ts.map +1 -0
  535. package/dist/streamplace-store/block.js +1 -0
  536. package/dist/streamplace-store/block.js.map +1 -0
  537. package/dist/streamplace-store/content-metadata-actions.d.ts +9 -0
  538. package/dist/streamplace-store/content-metadata-actions.d.ts.map +1 -0
  539. package/dist/streamplace-store/content-metadata-actions.js +1 -0
  540. package/dist/streamplace-store/content-metadata-actions.js.map +1 -0
  541. package/dist/streamplace-store/graph.d.ts +22 -0
  542. package/dist/streamplace-store/graph.d.ts.map +1 -0
  543. package/dist/streamplace-store/graph.js +1 -0
  544. package/dist/streamplace-store/graph.js.map +1 -0
  545. package/dist/streamplace-store/index.d.ts +4 -0
  546. package/dist/streamplace-store/index.d.ts.map +1 -0
  547. package/dist/streamplace-store/index.js +1 -0
  548. package/dist/streamplace-store/index.js.map +1 -0
  549. package/dist/streamplace-store/stream.d.ts +11 -0
  550. package/dist/streamplace-store/stream.d.ts.map +1 -0
  551. package/dist/streamplace-store/stream.js +1 -0
  552. package/dist/streamplace-store/stream.js.map +1 -0
  553. package/dist/streamplace-store/streamplace-store.d.ts +92 -0
  554. package/dist/streamplace-store/streamplace-store.d.ts.map +1 -0
  555. package/dist/streamplace-store/streamplace-store.js +158 -3
  556. package/dist/streamplace-store/streamplace-store.js.map +1 -0
  557. package/dist/streamplace-store/user.d.ts +6 -0
  558. package/dist/streamplace-store/user.d.ts.map +1 -0
  559. package/dist/streamplace-store/user.js +1 -0
  560. package/dist/streamplace-store/user.js.map +1 -0
  561. package/dist/streamplace-store/xrpc.d.ts +3 -0
  562. package/dist/streamplace-store/xrpc.d.ts.map +1 -0
  563. package/dist/streamplace-store/xrpc.js +1 -0
  564. package/dist/streamplace-store/xrpc.js.map +1 -0
  565. package/dist/time-sync/index.d.ts +3 -0
  566. package/dist/time-sync/index.d.ts.map +1 -0
  567. package/dist/time-sync/index.js +15 -0
  568. package/dist/time-sync/index.js.map +1 -0
  569. package/dist/time-sync/time-sync.d.ts +13 -0
  570. package/dist/time-sync/time-sync.d.ts.map +1 -0
  571. package/dist/time-sync/time-sync.js +95 -0
  572. package/dist/time-sync/time-sync.js.map +1 -0
  573. package/dist/time-sync/useTimeSync.d.ts +2 -0
  574. package/dist/time-sync/useTimeSync.d.ts.map +1 -0
  575. package/dist/time-sync/useTimeSync.js +49 -0
  576. package/dist/time-sync/useTimeSync.js.map +1 -0
  577. package/dist/ui/index.d.ts +15 -0
  578. package/dist/ui/index.d.ts.map +1 -0
  579. package/dist/ui/index.js +1 -0
  580. package/dist/ui/index.js.map +1 -0
  581. package/dist/utils/format-handle.d.ts +11 -0
  582. package/dist/utils/format-handle.d.ts.map +1 -0
  583. package/dist/utils/format-handle.js +21 -0
  584. package/dist/utils/format-handle.js.map +1 -0
  585. package/locales/en-US/common.ftl +46 -0
  586. package/locales/en-US/settings.ftl +129 -0
  587. package/locales/es-ES/common.ftl +46 -0
  588. package/locales/es-ES/settings.ftl +168 -0
  589. package/locales/fr-FR/common.ftl +46 -0
  590. package/locales/fr-FR/settings.ftl +165 -0
  591. package/locales/manifest.json +36 -0
  592. package/locales/pt-BR/common.ftl +46 -0
  593. package/locales/pt-BR/settings.ftl +166 -0
  594. package/locales/zh-Hant/common.ftl +46 -0
  595. package/locales/zh-Hant/settings.ftl +161 -0
  596. package/node-compile-cache/v22.15.0-x64-efe9a9df-0/37be0eec +0 -0
  597. package/package.json +24 -3
  598. package/scripts/compile-translations.js +254 -0
  599. package/scripts/extract-i18n.js +336 -0
  600. package/src/components/chat/chat-box.tsx +28 -9
  601. package/src/components/chat/chat-message.tsx +3 -2
  602. package/src/components/chat/mod-view.tsx +4 -3
  603. package/src/components/content-metadata/content-metadata-form.tsx +3 -1
  604. package/src/components/danmu/danmu-message.tsx +182 -0
  605. package/src/components/danmu/danmu-overlay-obs.tsx +44 -0
  606. package/src/components/danmu/danmu-overlay.tsx +225 -0
  607. package/src/components/danmu/math.ts +27 -0
  608. package/src/components/danmu/mu.tsx +28 -0
  609. package/src/components/danmu/use-danmu-lanes.ts +114 -0
  610. package/src/components/mobile-player/fullscreen.native.tsx +26 -0
  611. package/src/components/mobile-player/fullscreen.tsx +23 -1
  612. package/src/components/mobile-player/ui/index.ts +1 -0
  613. package/src/components/mobile-player/ui/viewer-context-menu.tsx +9 -7
  614. package/src/components/mobile-player/ui/viewer-count.tsx +39 -0
  615. package/src/components/mobile-player/ui/viewers.tsx +10 -14
  616. package/src/components/share/sharesheet.tsx +11 -27
  617. package/src/components/ui/button.tsx +22 -4
  618. package/src/components/ui/dropdown.native.tsx +696 -0
  619. package/src/components/ui/dropdown.tsx +57 -427
  620. package/src/components/ui/index.ts +1 -0
  621. package/src/components/ui/menu.tsx +171 -0
  622. package/src/components/ui/resizeable.tsx +1 -1
  623. package/src/components/ui/toast.tsx +6 -1
  624. package/src/i18n/i18n-loader.native.ts +56 -0
  625. package/src/i18n/i18n-loader.ts +19 -0
  626. package/src/i18n/i18next-config.ts +250 -0
  627. package/src/i18n/index.ts +50 -0
  628. package/src/i18n/provider.tsx +70 -0
  629. package/src/index.tsx +9 -0
  630. package/src/streamplace-provider/poller.tsx +3 -0
  631. package/src/streamplace-store/streamplace-store.tsx +184 -2
  632. package/src/time-sync/index.ts +12 -0
  633. package/src/time-sync/time-sync.ts +112 -0
  634. package/src/time-sync/useTimeSync.tsx +58 -0
  635. package/src/utils/format-handle.ts +24 -0
  636. package/tsconfig.json +11 -2
  637. package/tsconfig.tsbuildinfo +0 -1
@@ -4,7 +4,13 @@ import { BackHandler, Dimensions, StyleSheet, View } from "react-native";
4
4
  import { SystemBars } from "react-native-edge-to-edge";
5
5
  import { useSafeAreaInsets } from "react-native-safe-area-context";
6
6
  import {
7
+ DanmuOverlay,
7
8
  PlayerProtocol,
9
+ useDanmuEnabled,
10
+ useDanmuLaneCount,
11
+ useDanmuMaxMessages,
12
+ useDanmuOpacity,
13
+ useDanmuSpeed,
8
14
  useLivestreamStore,
9
15
  usePlayerStore,
10
16
  VideoRetry,
@@ -30,6 +36,12 @@ export function Fullscreen(props: {
30
36
  const setFullscreen = usePlayerStore((x) => x.setFullscreen);
31
37
  const handle = useLivestreamStore((x) => x.profile?.handle);
32
38
 
39
+ const danmuEnabled = useDanmuEnabled();
40
+ const danmuOpacity = useDanmuOpacity();
41
+ const danmuSpeed = useDanmuSpeed();
42
+ const danmuLaneCount = useDanmuLaneCount();
43
+ const danmuMaxMessages = useDanmuMaxMessages();
44
+
33
45
  const setSrc = usePlayerStore((x) => x.setSrc);
34
46
 
35
47
  useEffect(() => {
@@ -154,6 +166,13 @@ export function Fullscreen(props: {
154
166
  objectFit={props.objectFit}
155
167
  pictureInPictureEnabled={props.pictureInPictureEnabled}
156
168
  />
169
+ <DanmuOverlay
170
+ enabled={danmuEnabled}
171
+ opacity={danmuOpacity}
172
+ speed={danmuSpeed}
173
+ laneCount={danmuLaneCount}
174
+ maxMessages={danmuMaxMessages}
175
+ />
157
176
  {props.children}
158
177
  </View>
159
178
  </View>
@@ -169,6 +188,13 @@ export function Fullscreen(props: {
169
188
  pictureInPictureEnabled={props.pictureInPictureEnabled}
170
189
  />
171
190
  </VideoRetry>
191
+ <DanmuOverlay
192
+ enabled={danmuEnabled}
193
+ opacity={danmuOpacity}
194
+ speed={danmuSpeed}
195
+ laneCount={danmuLaneCount}
196
+ maxMessages={danmuMaxMessages}
197
+ />
172
198
  {props.children}
173
199
  </>
174
200
  );
@@ -1,6 +1,15 @@
1
1
  import { useEffect, useRef } from "react";
2
2
  import { View as RNView } from "react-native";
3
- import { getFirstPlayerID, usePlayerStore } from "../..";
3
+ import {
4
+ DanmuOverlay,
5
+ getFirstPlayerID,
6
+ useDanmuEnabled,
7
+ useDanmuLaneCount,
8
+ useDanmuMaxMessages,
9
+ useDanmuOpacity,
10
+ useDanmuSpeed,
11
+ usePlayerStore,
12
+ } from "../..";
4
13
  import { View } from "../../components/ui";
5
14
  import Video from "./video";
6
15
  import VideoRetry from "./video-retry";
@@ -18,6 +27,12 @@ export function Fullscreen(props: {
18
27
  const setSrc = usePlayerStore((x) => x.setSrc);
19
28
  const setAutoplayFailed = usePlayerStore((x) => x.setAutoplayFailed);
20
29
 
30
+ const danmuEnabled = useDanmuEnabled();
31
+ const danmuOpacity = useDanmuOpacity();
32
+ const danmuSpeed = useDanmuSpeed();
33
+ const danmuLaneCount = useDanmuLaneCount();
34
+ const danmuMaxMessages = useDanmuMaxMessages();
35
+
21
36
  const divRef = useRef<RNView>(null);
22
37
  const videoRef = useRef<HTMLVideoElement | null>(null);
23
38
 
@@ -90,6 +105,13 @@ export function Fullscreen(props: {
90
105
  pictureInPictureEnabled={props.pictureInPictureEnabled}
91
106
  />
92
107
  </VideoRetry>
108
+ <DanmuOverlay
109
+ enabled={danmuEnabled}
110
+ opacity={danmuOpacity}
111
+ speed={danmuSpeed}
112
+ laneCount={danmuLaneCount}
113
+ maxMessages={danmuMaxMessages}
114
+ />
93
115
  {props.children}
94
116
  </View>
95
117
  );
@@ -5,5 +5,6 @@ export * from "./metrics";
5
5
  export * from "./streamer-context-menu";
6
6
  export * from "./streamer-loading-overlay";
7
7
  export * from "./viewer-context-menu";
8
+ export * from "./viewer-count";
8
9
  export * from "./viewer-loading-overlay";
9
10
  export * from "./viewers";
@@ -4,6 +4,8 @@ import { Image, Linking, Platform, Pressable, View } from "react-native";
4
4
  import {
5
5
  ContentRights,
6
6
  ContentWarnings,
7
+ formatHandle,
8
+ formatHandleWithAt,
7
9
  useAvatars,
8
10
  useLivestreamInfo,
9
11
  zero,
@@ -113,12 +115,12 @@ export function ContextMenu({
113
115
  <Pressable
114
116
  onPress={() => {
115
117
  if (profile?.handle) {
116
- const url = `https://bsky.app/profile/${profile.handle}`;
118
+ const url = `https://bsky.app/profile/${formatHandle(profile)}`;
117
119
  Linking.openURL(url);
118
120
  }
119
121
  }}
120
122
  >
121
- <Text>@{profile?.handle || "user"}</Text>
123
+ <Text>{profile && formatHandleWithAt(profile)}</Text>
122
124
  </Pressable>
123
125
  {/*{did && profile && (
124
126
  <FollowButton streamerDID={profile?.did} currentUserDID={did} />
@@ -163,7 +165,7 @@ export function ContextMenu({
163
165
  <DropdownMenuItem
164
166
  onPress={() => {
165
167
  if (profile?.handle) {
166
- const url = `https://bsky.app/profile/${profile.handle}`;
168
+ const url = `https://bsky.app/profile/${formatHandle(profile)}`;
167
169
  Linking.openURL(url);
168
170
  }
169
171
  }}
@@ -179,15 +181,15 @@ export function ContextMenu({
179
181
  <View
180
182
  style={[
181
183
  zero.flex.values[1],
182
- zero.layout.flex.row,
184
+ isMobile ? zero.layout.flex.row : zero.layout.flex.column,
183
185
  zero.layout.flex.spaceBetween,
184
186
  zero.pr[4],
185
187
  ]}
186
188
  >
187
189
  <Text>Quality</Text>
188
- <Text muted>
189
- ({quality}, {lowLatency ? "low latency" : "regular latency"}
190
- )
190
+ <Text muted size={isMobile ? "base" : "sm"}>
191
+ {quality === "source" ? "Source" : quality},{" "}
192
+ {lowLatency ? "Low Latency" : ""}
191
193
  </Text>
192
194
  </View>
193
195
  </DropdownMenuSubTrigger>
@@ -0,0 +1,39 @@
1
+ import { useMemo } from "react";
2
+ import { StyleSheet, TextStyle } from "react-native";
3
+ import { Text } from "../../ui/text";
4
+
5
+ export interface ViewerCountProps {
6
+ count?: number | null;
7
+ style?: TextStyle;
8
+ locales?: Intl.LocalesArgument;
9
+ numberFormat?: Intl.NumberFormatOptions;
10
+ }
11
+
12
+ export function ViewerCount({
13
+ count,
14
+ style = {},
15
+ locales,
16
+ numberFormat = { notation: "compact" },
17
+ }: ViewerCountProps) {
18
+ const formattedNumber = useMemo(() => {
19
+ return new Intl.NumberFormat(locales, numberFormat).format(count || 0);
20
+ }, [numberFormat, count]);
21
+
22
+ return (
23
+ <Text leading="snug" style={[styles.label, style]}>
24
+ {formattedNumber}
25
+ </Text>
26
+ );
27
+ }
28
+
29
+ const styles = StyleSheet.create({
30
+ label: {
31
+ color: "#fd5050",
32
+ textShadowColor: "black",
33
+ textShadowRadius: 3,
34
+ fontSize: 16,
35
+ lineHeight: 24,
36
+ },
37
+ });
38
+
39
+ export default ViewerCount;
@@ -1,32 +1,28 @@
1
1
  import { Eye } from "lucide-react-native";
2
2
  import * as atoms from "../../../lib/theme/atoms";
3
3
  import { useViewers } from "../../../livestream-store";
4
- import { Text, View } from "../../ui";
4
+ import { View } from "../../ui";
5
+ import ViewerCount from "./viewer-count";
5
6
 
6
7
  export function Viewers() {
7
8
  const viewers = useViewers();
9
+ return <DehydratedViewers viewers={viewers || 0} />;
10
+ }
11
+
12
+ export function DehydratedViewers({ viewers }: { viewers: number }) {
8
13
  return (
9
14
  <View
10
15
  style={[
11
16
  atoms.layout.flex.center,
12
17
  atoms.layout.flex.row,
13
18
  atoms.gap.all[2],
19
+ atoms.px[1],
14
20
  ]}
15
21
  >
16
22
  <Eye color="#fd5050" />
17
- <Text
18
- style={{
19
- color: "#fd5050",
20
- textShadowColor: "black",
21
- textShadowOffset: { width: -1, height: 1 },
22
- textShadowRadius: 3,
23
- fontSize: 16,
24
- }}
25
- >
26
- {new Intl.NumberFormat(undefined, { notation: "compact" }).format(
27
- viewers || 0,
28
- )}
29
- </Text>
23
+ <ViewerCount count={viewers} />
30
24
  </View>
31
25
  );
32
26
  }
27
+
28
+ export default Viewers;
@@ -4,6 +4,7 @@ import { Clipboard, Linking, Platform, View } from "react-native";
4
4
  import { colors } from "../../lib/theme";
5
5
  import { useLivestreamStore } from "../../livestream-store";
6
6
  import { useUrl } from "../../streamplace-store";
7
+ import { formatHandle } from "../../utils/format-handle";
7
8
  import { BlueskyIcon } from "../icons/bluesky-icon";
8
9
  import {
9
10
  DropdownMenu,
@@ -26,12 +27,12 @@ export function ShareSheet({ onShare }: ShareSheetProps = {}) {
26
27
 
27
28
  // Get the current stream URL
28
29
  const getStreamUrl = useCallback(() => {
29
- return url + (profile ? `/@${profile.handle}` : "");
30
+ return url + (profile ? `/${formatHandle(profile)}` : "");
30
31
  }, [profile]);
31
32
 
32
33
  // Get the embed URL
33
34
  const getEmbedUrl = useCallback(() => {
34
- return url + (profile ? `/embed/${profile.handle}` : "");
35
+ return url + (profile ? `/embed/${formatHandle(profile)}` : "");
35
36
  }, [profile]);
36
37
 
37
38
  // Get embed code
@@ -63,31 +64,22 @@ export function ShareSheet({ onShare }: ShareSheetProps = {}) {
63
64
  // Share to Bluesky
64
65
  const shareToBluesky = useCallback(() => {
65
66
  const streamUrl = getStreamUrl();
66
- const text = profile
67
- ? `Check out @${profile.handle} live on Streamplace! ${streamUrl}`
68
- : `Check out this stream on Streamplace! ${streamUrl}`;
67
+ const text =
68
+ profile && profile.handle
69
+ ? `Check out @${profile.handle} live on Streamplace! ${streamUrl}`
70
+ : `Check out this stream on Streamplace! ${streamUrl}`;
69
71
  const blueskyUrl = `https://bsky.app/intent/compose?text=${encodeURIComponent(text)}`;
70
72
  Linking.openURL(blueskyUrl);
71
73
  onShare?.("share_bluesky", true);
72
74
  }, [profile, getStreamUrl, onShare]);
73
75
 
74
- // Share to Twitter/X
75
- const shareToTwitter = useCallback(() => {
76
- const streamUrl = getStreamUrl();
77
- const text = profile
78
- ? `Check out @${profile.handle} live on Streamplace!`
79
- : `Check out this stream on Streamplace!`;
80
- const twitterUrl = `https://twitter.com/intent/tweet?text=${encodeURIComponent(text)}&url=${encodeURIComponent(streamUrl)}`;
81
- Linking.openURL(twitterUrl);
82
- onShare?.("share_twitter", true);
83
- }, [profile, getStreamUrl, onShare]);
84
-
85
76
  // Native share (mobile)
86
77
  const nativeShare = useCallback(async () => {
87
78
  const streamUrl = getStreamUrl();
88
- const text = profile
89
- ? `Check out @${profile.handle} live on Streamplace!`
90
- : `Check out this stream on Streamplace!`;
79
+ const text =
80
+ profile && profile.handle
81
+ ? `Check out @${profile.handle} live on Streamplace!`
82
+ : `Check out this stream on Streamplace!`;
91
83
 
92
84
  if (Platform.OS === "web" && navigator.share) {
93
85
  try {
@@ -119,14 +111,6 @@ export function ShareSheet({ onShare }: ShareSheetProps = {}) {
119
111
  <Text>Share to Bluesky</Text>
120
112
  </View>
121
113
  </DropdownMenuItem>
122
- {/* <DropdownMenuItem onPress={shareToTwitter}>
123
- <View
124
- style={{ flexDirection: "row", alignItems: "center", gap: 12 }}
125
- >
126
- <MessageCircle size={20} color={colors.gray[400]} />
127
- <Text>Share to X</Text>
128
- </View>
129
- </DropdownMenuItem> */}
130
114
  {/* navigator isn't on non-web */}
131
115
  {Platform.OS !== "web" || (navigator && (navigator as any).share) ? (
132
116
  <DropdownMenuItem onPress={nativeShare}>
@@ -39,6 +39,7 @@ export interface ButtonProps
39
39
  rightIcon?: React.ReactNode;
40
40
  loading?: boolean;
41
41
  loadingText?: string;
42
+ width?: "full" | "min" | number;
42
43
  }
43
44
 
44
45
  export const Button = forwardRef<any, ButtonProps>(
@@ -53,6 +54,7 @@ export const Button = forwardRef<any, ButtonProps>(
53
54
  loadingText,
54
55
  disabled,
55
56
  style,
57
+ width = "full",
56
58
  ...props
57
59
  },
58
60
  ref,
@@ -198,11 +200,21 @@ export const Button = forwardRef<any, ButtonProps>(
198
200
  }
199
201
  }, [variant, icons]);
200
202
 
203
+ const widthStyle = useMemo(() => {
204
+ if (width === "full") {
205
+ return { width: "100%" };
206
+ } else if (width === "min") {
207
+ return { alignSelf: "flex-start" as const };
208
+ } else {
209
+ return { width };
210
+ }
211
+ }, [width]);
212
+
201
213
  return (
202
214
  <ButtonPrimitive.Root
203
215
  ref={ref}
204
216
  disabled={disabled || loading}
205
- style={[buttonStyle, sizeStyles.button, style]}
217
+ style={[buttonStyle, sizeStyles.button, widthStyle, style]}
206
218
  {...props}
207
219
  >
208
220
  <ButtonPrimitive.Content style={sizeStyles.inner}>
@@ -216,9 +228,15 @@ export const Button = forwardRef<any, ButtonProps>(
216
228
  </ButtonPrimitive.Icon>
217
229
  ) : null}
218
230
 
219
- <TextPrimitive.Root style={[textStyle as any, sizeStyles.text]}>
220
- {loading && loadingText ? loadingText : children}
221
- </TextPrimitive.Root>
231
+ {typeof children === "string" ? (
232
+ <TextPrimitive.Root style={[textStyle as any, sizeStyles.text]}>
233
+ {loading && loadingText ? loadingText : children}
234
+ </TextPrimitive.Root>
235
+ ) : loading && loadingText ? (
236
+ loadingText
237
+ ) : (
238
+ children
239
+ )}
222
240
 
223
241
  {loading && rightIcon ? (
224
242
  <ButtonPrimitive.Icon position="right">