@streamplace/components 0.8.9 → 0.8.11

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 (603) 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 +1 -0
  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 +1 -0
  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 +3 -2
  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 +1 -0
  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/i18next-config.d.ts +41 -0
  370. package/dist/i18n/i18next-config.d.ts.map +1 -0
  371. package/dist/i18n/i18next-config.js +264 -0
  372. package/dist/i18n/i18next-config.js.map +1 -0
  373. package/dist/i18n/index.d.ts +11 -0
  374. package/dist/i18n/index.d.ts.map +1 -0
  375. package/dist/i18n/index.js +45 -0
  376. package/dist/i18n/index.js.map +1 -0
  377. package/dist/i18n/provider.d.ts +14 -0
  378. package/dist/i18n/provider.d.ts.map +1 -0
  379. package/dist/i18n/provider.js +58 -0
  380. package/dist/i18n/provider.js.map +1 -0
  381. package/dist/index.d.ts +33 -0
  382. package/dist/index.d.ts.map +1 -0
  383. package/dist/index.js +9 -1
  384. package/dist/index.js.map +1 -0
  385. package/dist/lib/browser.d.ts +2 -0
  386. package/dist/lib/browser.d.ts.map +1 -0
  387. package/dist/lib/browser.js +1 -0
  388. package/dist/lib/browser.js.map +1 -0
  389. package/dist/lib/facet.d.ts +11 -0
  390. package/dist/lib/facet.d.ts.map +1 -0
  391. package/dist/lib/facet.js +1 -0
  392. package/dist/lib/facet.js.map +1 -0
  393. package/dist/lib/metadata-constants.d.ts +13 -0
  394. package/dist/lib/metadata-constants.d.ts.map +1 -0
  395. package/dist/lib/metadata-constants.js +1 -0
  396. package/dist/lib/metadata-constants.js.map +1 -0
  397. package/dist/lib/system-messages.d.ts +49 -0
  398. package/dist/lib/system-messages.d.ts.map +1 -0
  399. package/dist/lib/system-messages.js +1 -0
  400. package/dist/lib/system-messages.js.map +1 -0
  401. package/dist/lib/theme/atoms.d.ts +4226 -0
  402. package/dist/lib/theme/atoms.d.ts.map +1 -0
  403. package/dist/lib/theme/atoms.js +1 -0
  404. package/dist/lib/theme/atoms.js.map +1 -0
  405. package/dist/lib/theme/atoms.types.d.ts +228 -0
  406. package/dist/lib/theme/atoms.types.d.ts.map +1 -0
  407. package/dist/lib/theme/atoms.types.js +1 -0
  408. package/dist/lib/theme/atoms.types.js.map +1 -0
  409. package/dist/lib/theme/index.d.ts +6 -0
  410. package/dist/lib/theme/index.d.ts.map +1 -0
  411. package/dist/lib/theme/index.js +1 -0
  412. package/dist/lib/theme/index.js.map +1 -0
  413. package/dist/lib/theme/theme.d.ts +327 -0
  414. package/dist/lib/theme/theme.d.ts.map +1 -0
  415. package/dist/lib/theme/theme.js +1 -0
  416. package/dist/lib/theme/theme.js.map +1 -0
  417. package/dist/lib/theme/tokens.d.ts +766 -0
  418. package/dist/lib/theme/tokens.d.ts.map +1 -0
  419. package/dist/lib/theme/tokens.js +1 -0
  420. package/dist/lib/theme/tokens.js.map +1 -0
  421. package/dist/lib/utils.d.ts +53 -0
  422. package/dist/lib/utils.d.ts.map +1 -0
  423. package/dist/lib/utils.js +1 -0
  424. package/dist/lib/utils.js.map +1 -0
  425. package/dist/livestream-provider/index.d.ts +13 -0
  426. package/dist/livestream-provider/index.d.ts.map +1 -0
  427. package/dist/livestream-provider/index.js +1 -0
  428. package/dist/livestream-provider/index.js.map +1 -0
  429. package/dist/livestream-provider/websocket.d.ts +2 -0
  430. package/dist/livestream-provider/websocket.d.ts.map +1 -0
  431. package/dist/livestream-provider/websocket.js +1 -0
  432. package/dist/livestream-provider/websocket.js.map +1 -0
  433. package/dist/livestream-store/chat.d.ts +21 -0
  434. package/dist/livestream-store/chat.d.ts.map +1 -0
  435. package/dist/livestream-store/chat.js +1 -0
  436. package/dist/livestream-store/chat.js.map +1 -0
  437. package/dist/livestream-store/context.d.ts +7 -0
  438. package/dist/livestream-store/context.d.ts.map +1 -0
  439. package/dist/livestream-store/context.js +1 -0
  440. package/dist/livestream-store/context.js.map +1 -0
  441. package/dist/livestream-store/index.d.ts +5 -0
  442. package/dist/livestream-store/index.d.ts.map +1 -0
  443. package/dist/livestream-store/index.js +1 -0
  444. package/dist/livestream-store/index.js.map +1 -0
  445. package/dist/livestream-store/livestream-state.d.ts +29 -0
  446. package/dist/livestream-store/livestream-state.d.ts.map +1 -0
  447. package/dist/livestream-store/livestream-state.js +1 -0
  448. package/dist/livestream-store/livestream-state.js.map +1 -0
  449. package/dist/livestream-store/livestream-store.d.ts +14 -0
  450. package/dist/livestream-store/livestream-store.d.ts.map +1 -0
  451. package/dist/livestream-store/livestream-store.js +1 -0
  452. package/dist/livestream-store/livestream-store.js.map +1 -0
  453. package/dist/livestream-store/problems.d.ts +4 -0
  454. package/dist/livestream-store/problems.d.ts.map +1 -0
  455. package/dist/livestream-store/problems.js +1 -0
  456. package/dist/livestream-store/problems.js.map +1 -0
  457. package/dist/livestream-store/stream-key.d.ts +9 -0
  458. package/dist/livestream-store/stream-key.d.ts.map +1 -0
  459. package/dist/livestream-store/stream-key.js +1 -0
  460. package/dist/livestream-store/stream-key.js.map +1 -0
  461. package/dist/livestream-store/websocket-consumer.d.ts +3 -0
  462. package/dist/livestream-store/websocket-consumer.d.ts.map +1 -0
  463. package/dist/livestream-store/websocket-consumer.js +1 -0
  464. package/dist/livestream-store/websocket-consumer.js.map +1 -0
  465. package/dist/player-store/context.d.ts +10 -0
  466. package/dist/player-store/context.d.ts.map +1 -0
  467. package/dist/player-store/context.js +1 -0
  468. package/dist/player-store/context.js.map +1 -0
  469. package/dist/player-store/index.d.ts +6 -0
  470. package/dist/player-store/index.d.ts.map +1 -0
  471. package/dist/player-store/index.js +1 -0
  472. package/dist/player-store/index.js.map +1 -0
  473. package/dist/player-store/player-provider.d.ts +12 -0
  474. package/dist/player-store/player-provider.d.ts.map +1 -0
  475. package/dist/player-store/player-provider.js +1 -0
  476. package/dist/player-store/player-provider.js.map +1 -0
  477. package/dist/player-store/player-state.d.ts +138 -0
  478. package/dist/player-store/player-state.d.ts.map +1 -0
  479. package/dist/player-store/player-state.js +1 -0
  480. package/dist/player-store/player-state.js.map +1 -0
  481. package/dist/player-store/player-store.d.ts +18 -0
  482. package/dist/player-store/player-store.d.ts.map +1 -0
  483. package/dist/player-store/player-store.js +1 -0
  484. package/dist/player-store/player-store.js.map +1 -0
  485. package/dist/player-store/single-player-provider.d.ts +61 -0
  486. package/dist/player-store/single-player-provider.d.ts.map +1 -0
  487. package/dist/player-store/single-player-provider.js +1 -0
  488. package/dist/player-store/single-player-provider.js.map +1 -0
  489. package/dist/storage/index.d.ts +4 -0
  490. package/dist/storage/index.d.ts.map +1 -0
  491. package/dist/storage/index.js +1 -0
  492. package/dist/storage/index.js.map +1 -0
  493. package/dist/storage/lock.d.ts +8 -0
  494. package/dist/storage/lock.d.ts.map +1 -0
  495. package/dist/storage/lock.js +1 -0
  496. package/dist/storage/lock.js.map +1 -0
  497. package/dist/storage/storage.d.ts +7 -0
  498. package/dist/storage/storage.d.ts.map +1 -0
  499. package/dist/storage/storage.js +1 -0
  500. package/dist/storage/storage.js.map +1 -0
  501. package/dist/storage/storage.native.d.ts +7 -0
  502. package/dist/storage/storage.native.d.ts.map +1 -0
  503. package/dist/storage/storage.native.js +1 -0
  504. package/dist/storage/storage.native.js.map +1 -0
  505. package/dist/storage/storage.shared.d.ts +6 -0
  506. package/dist/storage/storage.shared.d.ts.map +1 -0
  507. package/dist/storage/storage.shared.js +1 -0
  508. package/dist/storage/storage.shared.js.map +1 -0
  509. package/dist/streamplace-provider/context.d.ts +7 -0
  510. package/dist/streamplace-provider/context.d.ts.map +1 -0
  511. package/dist/streamplace-provider/context.js +1 -0
  512. package/dist/streamplace-provider/context.js.map +1 -0
  513. package/dist/streamplace-provider/index.d.ts +11 -0
  514. package/dist/streamplace-provider/index.d.ts.map +1 -0
  515. package/dist/streamplace-provider/index.js +1 -0
  516. package/dist/streamplace-provider/index.js.map +1 -0
  517. package/dist/streamplace-provider/poller.d.ts +5 -0
  518. package/dist/streamplace-provider/poller.d.ts.map +1 -0
  519. package/dist/streamplace-provider/poller.js +1 -0
  520. package/dist/streamplace-provider/poller.js.map +1 -0
  521. package/dist/streamplace-provider/xrpc.d.ts +1 -0
  522. package/dist/streamplace-provider/xrpc.d.ts.map +1 -0
  523. package/dist/streamplace-provider/xrpc.js +1 -0
  524. package/dist/streamplace-provider/xrpc.js.map +1 -0
  525. package/dist/streamplace-store/block.d.ts +9 -0
  526. package/dist/streamplace-store/block.d.ts.map +1 -0
  527. package/dist/streamplace-store/block.js +1 -0
  528. package/dist/streamplace-store/block.js.map +1 -0
  529. package/dist/streamplace-store/content-metadata-actions.d.ts +9 -0
  530. package/dist/streamplace-store/content-metadata-actions.d.ts.map +1 -0
  531. package/dist/streamplace-store/content-metadata-actions.js +1 -0
  532. package/dist/streamplace-store/content-metadata-actions.js.map +1 -0
  533. package/dist/streamplace-store/graph.d.ts +22 -0
  534. package/dist/streamplace-store/graph.d.ts.map +1 -0
  535. package/dist/streamplace-store/graph.js +1 -0
  536. package/dist/streamplace-store/graph.js.map +1 -0
  537. package/dist/streamplace-store/index.d.ts +4 -0
  538. package/dist/streamplace-store/index.d.ts.map +1 -0
  539. package/dist/streamplace-store/index.js +1 -0
  540. package/dist/streamplace-store/index.js.map +1 -0
  541. package/dist/streamplace-store/stream.d.ts +11 -0
  542. package/dist/streamplace-store/stream.d.ts.map +1 -0
  543. package/dist/streamplace-store/stream.js +1 -0
  544. package/dist/streamplace-store/stream.js.map +1 -0
  545. package/dist/streamplace-store/streamplace-store.d.ts +92 -0
  546. package/dist/streamplace-store/streamplace-store.d.ts.map +1 -0
  547. package/dist/streamplace-store/streamplace-store.js +158 -3
  548. package/dist/streamplace-store/streamplace-store.js.map +1 -0
  549. package/dist/streamplace-store/user.d.ts +6 -0
  550. package/dist/streamplace-store/user.d.ts.map +1 -0
  551. package/dist/streamplace-store/user.js +1 -0
  552. package/dist/streamplace-store/user.js.map +1 -0
  553. package/dist/streamplace-store/xrpc.d.ts +3 -0
  554. package/dist/streamplace-store/xrpc.d.ts.map +1 -0
  555. package/dist/streamplace-store/xrpc.js +1 -0
  556. package/dist/streamplace-store/xrpc.js.map +1 -0
  557. package/dist/ui/index.d.ts +15 -0
  558. package/dist/ui/index.d.ts.map +1 -0
  559. package/dist/ui/index.js +1 -0
  560. package/dist/ui/index.js.map +1 -0
  561. package/locales/en-US/common.ftl +41 -0
  562. package/locales/en-US/settings.ftl +122 -0
  563. package/locales/es-ES/common.ftl +41 -0
  564. package/locales/es-ES/settings.ftl +161 -0
  565. package/locales/fr-FR/common.ftl +41 -0
  566. package/locales/fr-FR/settings.ftl +158 -0
  567. package/locales/manifest.json +36 -0
  568. package/locales/pt-BR/common.ftl +41 -0
  569. package/locales/pt-BR/settings.ftl +159 -0
  570. package/locales/zh-Hant/common.ftl +41 -0
  571. package/locales/zh-Hant/settings.ftl +154 -0
  572. package/node-compile-cache/v22.15.0-x64-efe9a9df-0/37be0eec +0 -0
  573. package/package.json +24 -3
  574. package/scripts/compile-translations.js +254 -0
  575. package/scripts/extract-i18n.js +336 -0
  576. package/src/components/chat/chat-box.tsx +28 -9
  577. package/src/components/content-metadata/content-metadata-form.tsx +3 -1
  578. package/src/components/danmu/danmu-message.tsx +182 -0
  579. package/src/components/danmu/danmu-overlay-obs.tsx +44 -0
  580. package/src/components/danmu/danmu-overlay.tsx +225 -0
  581. package/src/components/danmu/math.ts +27 -0
  582. package/src/components/danmu/mu.tsx +28 -0
  583. package/src/components/danmu/use-danmu-lanes.ts +114 -0
  584. package/src/components/mobile-player/fullscreen.native.tsx +26 -0
  585. package/src/components/mobile-player/fullscreen.tsx +23 -1
  586. package/src/components/mobile-player/ui/index.ts +1 -0
  587. package/src/components/mobile-player/ui/viewer-context-menu.tsx +4 -4
  588. package/src/components/mobile-player/ui/viewer-count.tsx +39 -0
  589. package/src/components/mobile-player/ui/viewers.tsx +10 -14
  590. package/src/components/ui/button.tsx +22 -4
  591. package/src/components/ui/dropdown.native.tsx +696 -0
  592. package/src/components/ui/dropdown.tsx +57 -427
  593. package/src/components/ui/index.ts +1 -0
  594. package/src/components/ui/menu.tsx +171 -0
  595. package/src/components/ui/resizeable.tsx +1 -1
  596. package/src/components/ui/toast.tsx +6 -1
  597. package/src/i18n/i18next-config.ts +301 -0
  598. package/src/i18n/index.ts +50 -0
  599. package/src/i18n/provider.tsx +70 -0
  600. package/src/index.tsx +7 -0
  601. package/src/streamplace-store/streamplace-store.tsx +184 -2
  602. package/tsconfig.json +11 -2
  603. package/tsconfig.tsbuildinfo +0 -1
@@ -0,0 +1,171 @@
1
+ import { forwardRef, ReactNode } from "react";
2
+ import { Platform, View, ViewStyle } from "react-native";
3
+ import {
4
+ a,
5
+ borderRadius,
6
+ fontSize,
7
+ gap,
8
+ mt,
9
+ mx,
10
+ p,
11
+ pb,
12
+ pl,
13
+ pr,
14
+ pt,
15
+ px,
16
+ py,
17
+ } from "../../lib/theme/atoms";
18
+ import { mergeStyles, useTheme } from "../../ui";
19
+ import { Text } from "./text";
20
+
21
+ export interface MenuContainerProps {
22
+ children: ReactNode;
23
+ style?: ViewStyle;
24
+ }
25
+
26
+ export const MenuContainer = forwardRef<View, MenuContainerProps>(
27
+ ({ children, style }, ref) => {
28
+ const { theme } = useTheme();
29
+ return (
30
+ <View ref={ref} style={[gap.all[4], mt[4], mx[2], style]}>
31
+ {children}
32
+ </View>
33
+ );
34
+ },
35
+ );
36
+
37
+ export interface MenuGroupProps {
38
+ children: ReactNode;
39
+ style?: ViewStyle;
40
+ }
41
+
42
+ export const MenuGroup = forwardRef<View, MenuGroupProps>(
43
+ ({ children, style }, ref) => {
44
+ const { theme } = useTheme();
45
+ return (
46
+ <View
47
+ ref={ref}
48
+ style={[
49
+ { backgroundColor: theme.colors.muted + "c0" },
50
+ Platform.OS === "web" ? [px[1], py[1]] : p[1],
51
+ gap.all[1],
52
+ { borderRadius: borderRadius.lg },
53
+ style,
54
+ ]}
55
+ >
56
+ {children}
57
+ </View>
58
+ );
59
+ },
60
+ );
61
+
62
+ export interface MenuItemProps {
63
+ children: ReactNode;
64
+ disabled?: boolean;
65
+ style?: ViewStyle;
66
+ onPress?: () => void;
67
+ }
68
+
69
+ export const MenuItem = forwardRef<View, MenuItemProps>(
70
+ ({ children, disabled, style }, ref) => {
71
+ const { theme } = useTheme();
72
+ return (
73
+ <View
74
+ ref={ref}
75
+ style={[
76
+ a.layout.flex.row,
77
+ a.layout.flex.alignCenter,
78
+ a.radius.all.sm,
79
+ py[1],
80
+ pl[3],
81
+ pr[2],
82
+ disabled && { opacity: 0.5 },
83
+ style,
84
+ ]}
85
+ >
86
+ {typeof children === "string" ? (
87
+ <Text style={{ color: theme.colors.popoverForeground }}>
88
+ {children}
89
+ </Text>
90
+ ) : (
91
+ children
92
+ )}
93
+ </View>
94
+ );
95
+ },
96
+ );
97
+
98
+ export interface MenuLabelProps {
99
+ children: ReactNode;
100
+ style?: ViewStyle;
101
+ }
102
+
103
+ export const MenuLabel = forwardRef<View, MenuLabelProps>(
104
+ ({ children, style }, ref) => {
105
+ const { theme } = useTheme();
106
+ return (
107
+ <Text
108
+ ref={ref as any}
109
+ style={mergeStyles(
110
+ px[4],
111
+ py[2],
112
+ { color: theme.colors.textMuted },
113
+ a.fontSize.base,
114
+ style,
115
+ )}
116
+ >
117
+ {children}
118
+ </Text>
119
+ );
120
+ },
121
+ );
122
+
123
+ export interface MenuSeparatorProps {
124
+ style?: ViewStyle;
125
+ }
126
+
127
+ export const MenuSeparator = forwardRef<View, MenuSeparatorProps>(
128
+ ({ style }, ref) => {
129
+ const { theme } = useTheme();
130
+ return (
131
+ <View
132
+ ref={ref}
133
+ style={[
134
+ mx[2],
135
+ {
136
+ height: 1,
137
+ backgroundColor: theme.colors.border,
138
+ marginVertical: 0,
139
+ },
140
+ style,
141
+ ]}
142
+ />
143
+ );
144
+ },
145
+ );
146
+
147
+ export interface MenuInfoProps {
148
+ description: string;
149
+ style?: ViewStyle;
150
+ }
151
+
152
+ export const MenuInfo = forwardRef<View, MenuInfoProps>(
153
+ ({ description, style }, ref) => {
154
+ const { theme } = useTheme();
155
+ return (
156
+ <Text
157
+ ref={ref as any}
158
+ style={mergeStyles(
159
+ { color: theme.colors.textMuted, marginTop: -8 },
160
+ pt[1],
161
+ pl[4],
162
+ pb[2],
163
+ fontSize.sm,
164
+ style,
165
+ )}
166
+ >
167
+ {description}
168
+ </Text>
169
+ );
170
+ },
171
+ );
@@ -39,7 +39,7 @@ export function Resizable({
39
39
  }: ResizableChatSheetProps) {
40
40
  const { slideKeyboard } = useKeyboardSlide();
41
41
  const { bottom: safeBottom } = useSafeAreaInsets();
42
- const MAX_HEIGHT = (SCREEN_HEIGHT - safeBottom) * 0.5;
42
+ const MAX_HEIGHT = (SCREEN_HEIGHT - safeBottom) * 0.55;
43
43
  const MIN_HEIGHT = -(SCREEN_HEIGHT - safeBottom) * 0.2;
44
44
  const COLLAPSE_HEIGHT = (SCREEN_HEIGHT - safeBottom) * 0.1;
45
45
 
@@ -880,13 +880,18 @@ export function Toast({
880
880
  width: "100%",
881
881
  }}
882
882
  >
883
- <Button variant={buttonTypeMap[variant]} onPress={onAction}>
883
+ <Button
884
+ width="min"
885
+ variant={buttonTypeMap[variant]}
886
+ onPress={onAction}
887
+ >
884
888
  <Text style={{ color: theme.colors.foreground }}>
885
889
  {actionLabel}
886
890
  </Text>
887
891
  </Button>
888
892
  <Button
889
893
  variant="secondary"
894
+ width="min"
890
895
  onPress={() => onOpenChange(false)}
891
896
  >
892
897
  <Text style={{ color: theme.colors.foreground }}>
@@ -0,0 +1,301 @@
1
+ // TypeScript i18next configuration with Fluent and manifest integration
2
+ // modified from https://github.com/inaturalist/iNaturalistReactNative/blob/main/src/i18n/initI18next.js
3
+
4
+ import i18next from "i18next";
5
+ import Fluent from "i18next-fluent";
6
+ import resourcesToBackend from "i18next-resources-to-backend";
7
+ import "intl-pluralrules";
8
+ import { initReactI18next } from "react-i18next";
9
+
10
+ // Import our manifest directly to avoid circular dependency
11
+ import manifest from "../../locales/manifest.json";
12
+ import storage from "../storage";
13
+
14
+ const LOCALE_STORAGE_KEY = "@streamplace/locale";
15
+
16
+ // Try to import expo-localization, but make it optional
17
+ let Localization: typeof import("expo-localization") | null = null;
18
+ try {
19
+ const localizationModule = require("expo-localization");
20
+ // Handle both default and named exports
21
+ Localization = localizationModule.default
22
+ ? localizationModule.default
23
+ : localizationModule;
24
+ } catch {
25
+ // expo-localization not available, will use browser/fallback detection
26
+ }
27
+
28
+ function cleanLocaleName(locale: string): string {
29
+ return locale.replace("_", "-").replace(/@.*/, "");
30
+ }
31
+
32
+ export function getLocaleFromSystemLocale(): string {
33
+ let systemLocale = "en";
34
+
35
+ // Try to get locale from expo-localization if available
36
+ if (Localization && typeof Localization.getLocales === "function") {
37
+ try {
38
+ const locales = Localization.getLocales();
39
+ systemLocale = locales?.[0]?.languageTag || "en";
40
+ } catch (error) {
41
+ console.warn("Failed to get locales from expo-localization:", error);
42
+ }
43
+ } else if (typeof navigator !== "undefined" && navigator.language) {
44
+ // Fallback to browser navigator.language
45
+ systemLocale = navigator.language;
46
+ }
47
+
48
+ const candidateLocale = cleanLocaleName(systemLocale);
49
+
50
+ // Check if the full locale is supported (e.g., "en-US")
51
+ if (manifest.supportedLocales.includes(candidateLocale)) {
52
+ return candidateLocale;
53
+ }
54
+
55
+ // Check if the language part is supported (e.g., "en" from "en-GB")
56
+ const lang = candidateLocale.split("-")[0];
57
+ const matchingLocale = manifest.supportedLocales.find((locale) =>
58
+ locale.startsWith(lang + "-"),
59
+ );
60
+
61
+ if (matchingLocale) {
62
+ return matchingLocale;
63
+ }
64
+
65
+ // Fall back to default locale from manifest
66
+ return manifest.fallbackChain[0];
67
+ }
68
+
69
+ // Cache for the current locale to avoid async lookups
70
+ let cachedLocale: string | null = null;
71
+
72
+ export async function getCurrentLocale(): Promise<string> {
73
+ if (cachedLocale) {
74
+ return cachedLocale;
75
+ }
76
+
77
+ const stored = await storage.getItem(LOCALE_STORAGE_KEY);
78
+ if (stored && manifest.supportedLocales.includes(stored)) {
79
+ cachedLocale = stored;
80
+ return stored;
81
+ }
82
+
83
+ const systemLocale = getLocaleFromSystemLocale();
84
+ cachedLocale = systemLocale;
85
+ return systemLocale;
86
+ }
87
+
88
+ // Synchronous version for initial load - returns cached or system locale
89
+ export function getCurrentLocaleSync(): string {
90
+ return cachedLocale || getLocaleFromSystemLocale();
91
+ }
92
+
93
+ // Enhanced fallback logic using manifest
94
+ function getFallbackChain(code: string): string[] {
95
+ const fallbacks: string[] = [];
96
+
97
+ if (!code) return manifest.fallbackChain;
98
+
99
+ // Regional fallbacks
100
+ if (code.match(/^es-/)) {
101
+ fallbacks.push("es-ES"); // Spanish fallback
102
+ } else if (code.match(/^fr-/)) {
103
+ fallbacks.push("fr-FR"); // French fallback
104
+ } else if (code.match(/^pt-/)) {
105
+ fallbacks.push("pt-BR"); // Portuguese fallback
106
+ } else if (code.match(/^zh-/)) {
107
+ fallbacks.push("zh-Hant"); // Chinese fallback
108
+ }
109
+
110
+ // Add manifest fallback chain
111
+ return [...fallbacks, ...manifest.fallbackChain];
112
+ }
113
+
114
+ // Use sync version for initial config - will be updated when storage loads
115
+ const LOCALE = getCurrentLocaleSync();
116
+
117
+ export const I18NEXT_CONFIG = {
118
+ lng: LOCALE,
119
+ ns: ["common", "settings"], // Common should be first as it's most frequently used
120
+ defaultNS: "common",
121
+ interpolation: {
122
+ escapeValue: false, // React already safes from XSS
123
+ },
124
+ react: {
125
+ useSuspense: false, // Prevent Android crashes
126
+ },
127
+ i18nFormat: {
128
+ fluentBundleOptions: {
129
+ useIsolating: false,
130
+ functions: {
131
+ VOWORCON: ([txt]: [string]) =>
132
+ "aeiou".indexOf(txt[0].toLowerCase()) >= 0 ? "vow" : "con",
133
+ JOIN: (args: string[], opts: { separator?: string } = {}) =>
134
+ args
135
+ .filter(Boolean)
136
+ .filter((s) => typeof s === "string")
137
+ .join(opts.separator || ""),
138
+ },
139
+ },
140
+ },
141
+ load: "currentOnly",
142
+ cleanCode: true,
143
+ fallbackLng: getFallbackChain,
144
+ supportedLngs: [...manifest.supportedLocales],
145
+ debug: process.env.NODE_ENV === "development",
146
+ };
147
+
148
+ // Translation loading function that loads compiled JSON files per namespace
149
+ async function loadTranslationData(
150
+ locale: string,
151
+ namespace: string,
152
+ ): Promise<any> {
153
+ try {
154
+ let translations: any = {};
155
+
156
+ try {
157
+ // For web environments, load from public directory
158
+ if (typeof window !== "undefined") {
159
+ const response = await fetch(`/locales/${locale}/${namespace}.json`);
160
+ if (!response.ok) {
161
+ throw new Error(`HTTP ${response.status}`);
162
+ }
163
+ translations = await response.json();
164
+ } else {
165
+ // For React Native, use static requires for bundler compatibility
166
+ // Map base language codes to full locales
167
+ const fullLocale = locale.includes("-")
168
+ ? locale
169
+ : {
170
+ en: "en-US",
171
+ pt: "pt-BR",
172
+ es: "es-ES",
173
+ zh: "zh-Hant",
174
+ fr: "fr-FR",
175
+ }[locale] || locale;
176
+
177
+ // Static requires for React Native bundler
178
+ const localeNamespaceKey = `${fullLocale}/${namespace}`;
179
+ const translationMap: Record<string, any> = {
180
+ "en-US/common": require("../../public/locales/en-US/common.json"),
181
+ "pt-BR/common": require("../../public/locales/pt-BR/common.json"),
182
+ "es-ES/common": require("../../public/locales/es-ES/common.json"),
183
+ "zh-Hant/common": require("../../public/locales/zh-Hant/common.json"),
184
+ "fr-FR/common": require("../../public/locales/fr-FR/common.json"),
185
+ "en-US/settings": require("../../public/locales/en-US/settings.json"),
186
+ "pt-BR/settings": require("../../public/locales/pt-BR/settings.json"),
187
+ "es-ES/settings": require("../../public/locales/es-ES/settings.json"),
188
+ "zh-Hant/settings": require("../../public/locales/zh-Hant/settings.json"),
189
+ "fr-FR/settings": require("../../public/locales/fr-FR/settings.json"),
190
+ };
191
+
192
+ translations = translationMap[localeNamespaceKey];
193
+
194
+ if (!translations) {
195
+ throw new Error(
196
+ `No static translation mapping for ${localeNamespaceKey}`,
197
+ );
198
+ }
199
+ }
200
+ } catch (loadError: any) {
201
+ throw new Error(
202
+ `Failed to load ${namespace} translations for ${locale}: ${loadError.message}`,
203
+ );
204
+ }
205
+
206
+ if (!translations || Object.keys(translations).length === 0) {
207
+ throw new Error("No translations found in file");
208
+ }
209
+
210
+ return translations;
211
+ } catch (error: any) {
212
+ console.error(
213
+ `Failed to load ${namespace} translations for ${locale}:`,
214
+ error,
215
+ );
216
+ // Return minimal fallback
217
+ return {
218
+ loading: "Loading...",
219
+ error: "Error",
220
+ cancel: "Cancel",
221
+ };
222
+ }
223
+ }
224
+
225
+ // Initialize i18next with our configuration
226
+ let initPromise: Promise<typeof i18next> | null = null;
227
+
228
+ export default async function initI18next(
229
+ config: any = {},
230
+ ): Promise<typeof i18next> {
231
+ // Return existing promise if already initializing
232
+ if (initPromise) {
233
+ return initPromise;
234
+ }
235
+
236
+ // Load stored locale from storage first
237
+ const storedLocale = await getCurrentLocale();
238
+
239
+ const finalConfig = {
240
+ ...I18NEXT_CONFIG,
241
+ lng: storedLocale,
242
+ ...config,
243
+ };
244
+
245
+ initPromise = i18next
246
+ .use(initReactI18next)
247
+ .use(Fluent)
248
+ .use(
249
+ resourcesToBackend((locale: string, namespace: string, callback: any) => {
250
+ // Load translations using our manifest-based namespace system
251
+ loadTranslationData(locale, namespace)
252
+ .then((translations) => callback(null, translations))
253
+ .catch((error) => callback(error, null));
254
+ }),
255
+ )
256
+ .init(finalConfig)
257
+ .then(() => {
258
+ // Automatically persist language changes to storage
259
+ i18next.on("languageChanged", (lng) => {
260
+ if (lng && manifest.supportedLocales.includes(lng)) {
261
+ cachedLocale = lng;
262
+ storage.setItem(LOCALE_STORAGE_KEY, lng);
263
+ }
264
+ });
265
+ return i18next;
266
+ });
267
+
268
+ return initPromise;
269
+ }
270
+
271
+ // Utility functions for language management
272
+ export async function changeLanguage(locale: string): Promise<void> {
273
+ // Storage is handled automatically via languageChanged event
274
+ await i18next.changeLanguage(locale);
275
+ }
276
+
277
+ export function getCurrentLanguage(): string {
278
+ // Return the cached locale preference, not i18next's resolved language
279
+ // i18next.language may return just "zh" instead of "zh-Hant"
280
+ return getCurrentLocaleSync();
281
+ }
282
+
283
+ export function getSupportedLocales(): string[] {
284
+ return [...manifest.supportedLocales];
285
+ }
286
+
287
+ export function getLanguageInfo(locale: string): any {
288
+ return manifest.languages[locale] || null;
289
+ }
290
+
291
+ export function isLocaleSupported(locale: string): boolean {
292
+ return manifest.supportedLocales.includes(locale);
293
+ }
294
+
295
+ // Auto-initialize i18next on module load
296
+ // This ensures the instance is ready when used in providers
297
+ initI18next().catch((error) => {
298
+ console.error("Failed to auto-initialize i18n:", error);
299
+ });
300
+
301
+ export { i18next };
@@ -0,0 +1,50 @@
1
+ // Simple i18n infrastructure exports for Streamplace components
2
+ // Re-exports i18next tools for app-level customization
3
+
4
+ // Core i18next exports
5
+ export { default as i18n } from "i18next";
6
+ export {
7
+ I18nextProvider,
8
+ Trans,
9
+ Translation,
10
+ initReactI18next,
11
+ useTranslation,
12
+ withTranslation,
13
+ } from "react-i18next";
14
+
15
+ // i18next plugins for common use cases
16
+ export { default as LanguageDetector } from "i18next-browser-languagedetector";
17
+ export { default as Backend } from "i18next-http-backend";
18
+ export { default as resourcesToBackend } from "i18next-resources-to-backend";
19
+
20
+ // Fluent support
21
+ export { default as Fluent } from "i18next-fluent";
22
+
23
+ // Basic provider components for consistent setup
24
+ export { I18nProvider } from "./provider";
25
+
26
+ // Bootstrap configuration and utilities
27
+ export {
28
+ I18NEXT_CONFIG,
29
+ changeLanguage,
30
+ getCurrentLanguage,
31
+ getCurrentLocale,
32
+ getLanguageInfo,
33
+ getLocaleFromSystemLocale,
34
+ getSupportedLocales,
35
+ i18next,
36
+ default as initI18next,
37
+ isLocaleSupported,
38
+ } from "./i18next-config";
39
+
40
+ // Manifest data
41
+ export { default as manifest } from "../../locales/manifest.json";
42
+
43
+ // TypeScript types
44
+ export type {
45
+ i18n as I18nInstance,
46
+ InitOptions,
47
+ Resource,
48
+ ResourceLanguage,
49
+ TFunction,
50
+ } from "i18next";
@@ -0,0 +1,70 @@
1
+ // Simple i18n provider wrapper for consistent setup
2
+ import type { i18n } from "i18next";
3
+ import { ReactNode, useEffect, useState } from "react";
4
+ import { I18nextProvider } from "react-i18next";
5
+
6
+ interface I18nProviderProps {
7
+ children: ReactNode;
8
+ i18n: i18n;
9
+ }
10
+
11
+ /**
12
+ * Simple wrapper around I18nextProvider for consistent setup
13
+ * The actual i18n instance should be configured at the app level
14
+ * Waits for i18next to be initialized AND language loaded to prevent FOUC
15
+ */
16
+ export function I18nProvider({ children, i18n }: I18nProviderProps) {
17
+ const [isReady, setIsReady] = useState(false);
18
+
19
+ useEffect(() => {
20
+ // Check if both initialized and language is loaded
21
+ const checkReady = () => {
22
+ const initialized = i18n.isInitialized;
23
+ const hasCommon = i18n.hasLoadedNamespace("common");
24
+ console.log("i18n ready check:", {
25
+ initialized,
26
+ hasCommon,
27
+ language: i18n.language,
28
+ });
29
+
30
+ if (initialized && hasCommon) {
31
+ setIsReady(true);
32
+ }
33
+ };
34
+
35
+ checkReady();
36
+
37
+ // Fallback: if not ready after 300ms, just proceed anyway
38
+ const fallbackTimeout = setTimeout(() => {
39
+ if (!isReady) {
40
+ console.log("i18n ready timeout - proceeding anyway");
41
+ setIsReady(true);
42
+ }
43
+ }, 300);
44
+
45
+ // Listen for both initialization and language loaded events
46
+ const handleInitialized = () => {
47
+ checkReady();
48
+ };
49
+ const handleLanguageLoaded = () => {
50
+ checkReady();
51
+ };
52
+
53
+ i18n.on("initialized", handleInitialized);
54
+ i18n.on("languageChanged", handleLanguageLoaded);
55
+ i18n.on("loaded", handleLanguageLoaded);
56
+
57
+ return () => {
58
+ clearTimeout(fallbackTimeout);
59
+ i18n.off("initialized", handleInitialized);
60
+ i18n.off("languageChanged", handleLanguageLoaded);
61
+ i18n.off("loaded", handleLanguageLoaded);
62
+ };
63
+ }, [i18n, isReady]);
64
+
65
+ if (!isReady) {
66
+ return null;
67
+ }
68
+
69
+ return <I18nextProvider i18n={i18n}>{children}</I18nextProvider>;
70
+ }
package/src/index.tsx CHANGED
@@ -24,6 +24,10 @@ export * as zero from "./ui";
24
24
 
25
25
  export * from "./hooks";
26
26
 
27
+ // Internationalization system exports
28
+ export * from "./i18n";
29
+ export * as I18n from "./i18n";
30
+
27
31
  // Theme system exports
28
32
  export * from "./lib/theme";
29
33
 
@@ -33,6 +37,9 @@ export * from "./components/chat/system-message";
33
37
  export { default as VideoRetry } from "./components/mobile-player/video-retry";
34
38
  export * from "./lib/system-messages";
35
39
 
40
+ export { DanmuOverlay } from "./components/danmu/danmu-overlay";
41
+ export { DanmuOverlayOBS } from "./components/danmu/danmu-overlay-obs";
42
+
36
43
  // Rotation lock system exports
37
44
  export {
38
45
  RotationProvider,