@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
@@ -0,0 +1,254 @@
1
+ #!/usr/bin/env node
2
+
3
+ const fs = require("fs");
4
+ const path = require("path");
5
+ const { parse: parseFtl } = require("@fluent/syntax");
6
+
7
+ // Load language manifest
8
+ const MANIFEST_PATH = path.join(__dirname, "..", "locales", "manifest.json");
9
+ const manifest = JSON.parse(fs.readFileSync(MANIFEST_PATH, "utf-8"));
10
+
11
+ // Configuration
12
+ const LOCALES_SOURCE_DIR = path.join(__dirname, "..", "locales");
13
+ const LOCALES_OUTPUT_DIR = path.join(__dirname, "..", "public", "locales");
14
+
15
+ /**
16
+ * Find all .ftl files in a directory (non-recursive, just top-level)
17
+ */
18
+ function findFtlFiles(dir) {
19
+ const files = [];
20
+ const entries = fs.readdirSync(dir, { withFileTypes: true });
21
+
22
+ for (const entry of entries) {
23
+ if (entry.isFile() && entry.name.endsWith(".ftl")) {
24
+ files.push({
25
+ path: path.join(dir, entry.name),
26
+ namespace: path.basename(entry.name, ".ftl"),
27
+ });
28
+ }
29
+ }
30
+
31
+ return files;
32
+ }
33
+
34
+ /**
35
+ * Parse FTL content using @fluent/syntax and extract messages
36
+ */
37
+ function extractMessagesFromFtl(content) {
38
+ const messages = {};
39
+
40
+ try {
41
+ const resource = parseFtl(content);
42
+
43
+ for (const entry of resource.body) {
44
+ // Only process Message entries (not Comments, Terms, etc.)
45
+ if (entry.type === "Message" && entry.id) {
46
+ const key = entry.id.name;
47
+
48
+ // For now, just serialize the pattern back to FTL format
49
+ // i18next-fluent will handle the actual parsing at runtime
50
+ if (entry.value) {
51
+ messages[key] = serializePattern(entry.value);
52
+ }
53
+ }
54
+ }
55
+ } catch (error) {
56
+ console.error("Error parsing FTL:", error.message);
57
+ throw error;
58
+ }
59
+
60
+ return messages;
61
+ }
62
+
63
+ /**
64
+ * Serialize a Fluent pattern back to FTL string format
65
+ * This is a simple serializer - @fluent/syntax has a full serializer
66
+ * but we just need the pattern text for JSON storage
67
+ */
68
+ function serializePattern(pattern) {
69
+ if (!pattern || !pattern.elements) {
70
+ return "";
71
+ }
72
+
73
+ let result = "";
74
+
75
+ for (const element of pattern.elements) {
76
+ if (element.type === "TextElement") {
77
+ result += element.value;
78
+ } else if (element.type === "Placeable") {
79
+ result += serializePlaceable(element);
80
+ }
81
+ }
82
+
83
+ return result;
84
+ }
85
+
86
+ /**
87
+ * Serialize a placeable (variables, select expressions, etc.)
88
+ */
89
+ function serializePlaceable(placeable) {
90
+ if (!placeable.expression) {
91
+ return "{}";
92
+ }
93
+
94
+ const expr = placeable.expression;
95
+
96
+ if (expr.type === "VariableReference") {
97
+ return `{$${expr.id.name}}`;
98
+ } else if (expr.type === "SelectExpression") {
99
+ let result = `{${serializeInlineExpression(expr.selector)} ->`;
100
+
101
+ for (const variant of expr.variants) {
102
+ const key =
103
+ variant.key.type === "Identifier"
104
+ ? `[${variant.key.name}]`
105
+ : `[${variant.key.value}]`;
106
+
107
+ result += `\n ${variant.default ? "*" : ""}${key} ${serializePattern(variant.value)}`;
108
+ }
109
+
110
+ result += "\n }";
111
+ return result;
112
+ } else if (expr.type === "FunctionReference") {
113
+ const args = expr.arguments.positional
114
+ .map((arg) => serializeInlineExpression(arg))
115
+ .join(", ");
116
+ return `{${expr.id.name}(${args})}`;
117
+ }
118
+
119
+ return "{}";
120
+ }
121
+
122
+ /**
123
+ * Serialize inline expressions (for function arguments, etc.)
124
+ */
125
+ function serializeInlineExpression(expr) {
126
+ if (expr.type === "VariableReference") {
127
+ return `$${expr.id.name}`;
128
+ } else if (expr.type === "NumberLiteral") {
129
+ return expr.value;
130
+ } else if (expr.type === "StringLiteral") {
131
+ return `"${expr.value}"`;
132
+ }
133
+
134
+ return "";
135
+ }
136
+
137
+ /**
138
+ * Main compilation function
139
+ */
140
+ function compileTranslations() {
141
+ console.log("šŸŒ Compiling translation files...");
142
+
143
+ if (!fs.existsSync(LOCALES_SOURCE_DIR)) {
144
+ console.error(`āŒ Locales directory not found: ${LOCALES_SOURCE_DIR}`);
145
+ process.exit(1);
146
+ }
147
+
148
+ // Create output directory if it doesn't exist
149
+ if (!fs.existsSync(LOCALES_OUTPUT_DIR)) {
150
+ fs.mkdirSync(LOCALES_OUTPUT_DIR, { recursive: true });
151
+ }
152
+
153
+ // Get supported locales from manifest
154
+ const manifestLocales = manifest.supportedLocales;
155
+ const locales = manifestLocales.filter((locale) => {
156
+ const localeDir = path.join(LOCALES_SOURCE_DIR, locale);
157
+ return fs.existsSync(localeDir) && fs.statSync(localeDir).isDirectory();
158
+ });
159
+
160
+ if (locales.length === 0) {
161
+ console.error(`āŒ No locale directories found in ${LOCALES_SOURCE_DIR}`);
162
+ process.exit(1);
163
+ }
164
+
165
+ let totalFiles = 0;
166
+
167
+ // Process each locale
168
+ for (const locale of locales) {
169
+ const localeSourceDir = path.join(LOCALES_SOURCE_DIR, locale);
170
+ const localeOutputDir = path.join(LOCALES_OUTPUT_DIR, locale);
171
+
172
+ console.log(`šŸ“¦ Processing locale: ${locale}`);
173
+
174
+ // Create locale output directory
175
+ if (!fs.existsSync(localeOutputDir)) {
176
+ fs.mkdirSync(localeOutputDir, { recursive: true });
177
+ }
178
+
179
+ // Find all .ftl files for this locale
180
+ const ftlFiles = findFtlFiles(localeSourceDir);
181
+
182
+ if (ftlFiles.length === 0) {
183
+ console.warn(`āš ļø No .ftl files found in ${localeSourceDir}`);
184
+ continue;
185
+ }
186
+
187
+ // Process each .ftl file as a separate namespace
188
+ for (const { path: ftlPath, namespace } of ftlFiles) {
189
+ try {
190
+ const content = fs.readFileSync(ftlPath, "utf-8");
191
+ const messages = extractMessagesFromFtl(content);
192
+
193
+ if (Object.keys(messages).length === 0) {
194
+ console.warn(`āš ļø No messages found in ${ftlPath}`);
195
+ continue;
196
+ }
197
+
198
+ // Write namespace JSON file
199
+ const outputPath = path.join(localeOutputDir, `${namespace}.json`);
200
+ fs.writeFileSync(
201
+ outputPath,
202
+ JSON.stringify(messages, null, 2),
203
+ "utf-8",
204
+ );
205
+
206
+ console.log(
207
+ ` āœ… ${namespace}: ${Object.keys(messages).length} keys → ${path.relative(process.cwd(), outputPath)}`,
208
+ );
209
+ totalFiles++;
210
+ } catch (error) {
211
+ console.error(`āŒ Error processing ${ftlPath}:`, error.message);
212
+ }
213
+ }
214
+ }
215
+
216
+ console.log(
217
+ `šŸŽ‰ Compilation complete! ${totalFiles} namespace files generated.`,
218
+ );
219
+ }
220
+
221
+ /**
222
+ * Copy compiled translations to app/public/locales
223
+ */
224
+ function copyToApp() {
225
+ const appPublicLocales = path.join(
226
+ __dirname,
227
+ "..",
228
+ "..",
229
+ "app",
230
+ "public",
231
+ "locales",
232
+ );
233
+
234
+ console.log("\nšŸ“‹ Copying translations to app...");
235
+
236
+ // Remove old locales directory in app
237
+ if (fs.existsSync(appPublicLocales)) {
238
+ fs.rmSync(appPublicLocales, { recursive: true, force: true });
239
+ }
240
+
241
+ // Copy compiled locales to app
242
+ fs.cpSync(LOCALES_OUTPUT_DIR, appPublicLocales, { recursive: true });
243
+
244
+ console.log(`āœ… Copied to ${path.relative(process.cwd(), appPublicLocales)}`);
245
+ }
246
+
247
+ // Run the compilation
248
+ compileTranslations();
249
+
250
+ // Copy to app if it exists
251
+ const appPath = path.join(__dirname, "..", "..", "app");
252
+ if (fs.existsSync(appPath)) {
253
+ copyToApp();
254
+ }
@@ -0,0 +1,336 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * i18n key extraction script
5
+ * 1. Scans the codebase for i18n keys (t('key'), Trans components, etc)
6
+ * 2. Extracts keys into namespace JSON files (common.json, settings.json, etc)
7
+ * 3. Migrates new keys to corresponding .ftl files for translation
8
+ *
9
+ * Usage:
10
+ * node extract-i18n.js # Extract keys and report new ones
11
+ * node extract-i18n.js --add-to=common # Add new keys to common.ftl
12
+ * node extract-i18n.js --add-to=settings # Add new keys to settings.ftl
13
+ */
14
+
15
+ const { execSync } = require("child_process");
16
+ const fs = require("fs");
17
+ const path = require("path");
18
+
19
+ // Parse command line arguments
20
+ const args = process.argv.slice(2);
21
+ const addToNamespace = args
22
+ .find((arg) => arg.startsWith("--add-to="))
23
+ ?.split("=")[1];
24
+
25
+ // Paths
26
+ const COMPONENTS_ROOT = path.join(__dirname, "..");
27
+ const APP_ROOT = path.join(__dirname, "..", "..", "app");
28
+ const MANIFEST_PATH = path.join(COMPONENTS_ROOT, "locales/manifest.json");
29
+ const LOCALES_FTL_DIR = path.join(COMPONENTS_ROOT, "locales");
30
+ const LOCALES_JSON_DIR = path.join(COMPONENTS_ROOT, "public/locales");
31
+
32
+ // Load manifest
33
+ const manifest = JSON.parse(fs.readFileSync(MANIFEST_PATH, "utf8"));
34
+
35
+ // Configuration for i18next-parser
36
+ const parserConfig = {
37
+ contextSeparator: "_",
38
+ createOldCatalogs: false,
39
+ defaultNamespace: "messages",
40
+ defaultValue: "",
41
+ indentation: 2,
42
+ keepRemoved: true,
43
+ keySeparator: false,
44
+ namespaceSeparator: false,
45
+
46
+ lexers: {
47
+ js: ["JavascriptLexer"],
48
+ ts: ["JavascriptLexer"],
49
+ jsx: ["JsxLexer"],
50
+ tsx: ["JsxLexer"],
51
+ html: false,
52
+ htm: false,
53
+ handlebars: false,
54
+ hbs: false,
55
+ },
56
+
57
+ locales: manifest.supportedLocales,
58
+ output: path.join(LOCALES_JSON_DIR, "$LOCALE/$NAMESPACE.json"),
59
+ input: [
60
+ path.join(COMPONENTS_ROOT, "src/**/*.{js,jsx,ts,tsx}"),
61
+ path.join(APP_ROOT, "src/**/*.{js,jsx,ts,tsx}"),
62
+ path.join(APP_ROOT, "components/**/*.{js,jsx,ts,tsx}"),
63
+ "!**/node_modules/**",
64
+ "!**/dist/**",
65
+ "!**/*.test.{js,jsx,ts,tsx}",
66
+ "!**/*.spec.{js,jsx,ts,tsx}",
67
+ ],
68
+
69
+ verbose: true,
70
+ sort: true,
71
+ failOnWarnings: false,
72
+ failOnUpdate: false,
73
+ };
74
+
75
+ /**
76
+ * Extract keys from codebase using i18next-parser
77
+ */
78
+ function extractKeys() {
79
+ const configPath = path.join(__dirname, ".i18next-parser.config.js");
80
+ const configContent = `module.exports = ${JSON.stringify(parserConfig, null, 2)};`;
81
+
82
+ try {
83
+ fs.writeFileSync(configPath, configContent);
84
+ console.log("šŸ” Extracting i18n keys from codebase...");
85
+
86
+ execSync(`npx i18next-parser --config ${configPath}`, {
87
+ stdio: "inherit",
88
+ cwd: __dirname,
89
+ });
90
+
91
+ console.log("āœ… Keys extracted successfully!");
92
+ return true;
93
+ } catch (error) {
94
+ console.error("āŒ Error extracting i18n keys:", error.message);
95
+ return false;
96
+ } finally {
97
+ if (fs.existsSync(configPath)) {
98
+ fs.unlinkSync(configPath);
99
+ }
100
+ }
101
+ }
102
+
103
+ /**
104
+ * Read existing keys from .ftl files in a locale directory
105
+ * Returns a map of namespace -> Set of keys
106
+ */
107
+ function getExistingFtlKeys(localeDir) {
108
+ const keysByNamespace = {};
109
+
110
+ if (!fs.existsSync(localeDir)) {
111
+ return keysByNamespace;
112
+ }
113
+
114
+ const ftlFiles = fs
115
+ .readdirSync(localeDir)
116
+ .filter((file) => file.endsWith(".ftl"));
117
+
118
+ for (const file of ftlFiles) {
119
+ const namespace = path.basename(file, ".ftl");
120
+ const keys = new Set();
121
+
122
+ const content = fs.readFileSync(path.join(localeDir, file), "utf8");
123
+ const lines = content.split("\n");
124
+
125
+ for (const line of lines) {
126
+ const trimmed = line.trim();
127
+ const keyMatch = trimmed.match(/^([a-zA-Z][a-zA-Z0-9_-]*)\s*=/);
128
+ if (keyMatch) {
129
+ keys.add(keyMatch[1]);
130
+ }
131
+ }
132
+
133
+ keysByNamespace[namespace] = keys;
134
+ }
135
+
136
+ return keysByNamespace;
137
+ }
138
+
139
+ /**
140
+ * Get all namespaces (json files) in the locale directory
141
+ */
142
+ function getNamespaces(localeJsonDir) {
143
+ if (!fs.existsSync(localeJsonDir)) {
144
+ return [];
145
+ }
146
+
147
+ return fs
148
+ .readdirSync(localeJsonDir)
149
+ .filter((file) => file.endsWith(".json"))
150
+ .map((file) => path.basename(file, ".json"));
151
+ }
152
+
153
+ /**
154
+ * Add new keys to a .ftl file
155
+ */
156
+ function addKeysToFtlFile(localeDir, namespace, newKeys, locale) {
157
+ const targetFile = path.join(localeDir, `${namespace}.ftl`);
158
+
159
+ // Create file with header if it doesn't exist
160
+ if (!fs.existsSync(localeDir)) {
161
+ fs.mkdirSync(localeDir, { recursive: true });
162
+ }
163
+
164
+ if (!fs.existsSync(targetFile)) {
165
+ const languageName = manifest.languages[locale]?.name || locale;
166
+ const namespaceName =
167
+ namespace.charAt(0).toUpperCase() + namespace.slice(1);
168
+ const header = `# ${namespaceName} translations - ${languageName}\n\n`;
169
+ fs.writeFileSync(targetFile, header);
170
+ }
171
+
172
+ // Append new keys
173
+ let content = fs.readFileSync(targetFile, "utf8");
174
+
175
+ if (!content.endsWith("\n")) {
176
+ content += "\n";
177
+ }
178
+
179
+ content += "\n# Newly extracted keys\n";
180
+ content += newKeys.map((key) => `${key} = ${key}`).join("\n") + "\n";
181
+
182
+ fs.writeFileSync(targetFile, content);
183
+
184
+ return targetFile;
185
+ }
186
+
187
+ /**
188
+ * Migrate extracted JSON keys to .ftl files
189
+ */
190
+ function migrateKeysToFtl() {
191
+ console.log("\nšŸ”„ Analyzing extracted keys...");
192
+
193
+ const newKeysByLocaleAndNamespace = {}; // locale -> namespace -> [keys]
194
+
195
+ // Process each locale
196
+ for (const locale of manifest.supportedLocales) {
197
+ const localeJsonDir = path.join(LOCALES_JSON_DIR, locale);
198
+ const localeFtlDir = path.join(LOCALES_FTL_DIR, locale);
199
+
200
+ if (!fs.existsSync(localeJsonDir)) {
201
+ console.log(`āš ļø No JSON files found for ${locale}`);
202
+ continue;
203
+ }
204
+
205
+ // Get all namespaces (json files)
206
+ const namespaces = getNamespaces(localeJsonDir);
207
+
208
+ if (namespaces.length === 0) {
209
+ console.log(`āš ļø No namespace files found for ${locale}`);
210
+ continue;
211
+ }
212
+
213
+ // Get existing keys from .ftl files
214
+ const existingKeysByNamespace = getExistingFtlKeys(localeFtlDir);
215
+
216
+ // Process each namespace
217
+ for (const namespace of namespaces) {
218
+ const jsonPath = path.join(localeJsonDir, `${namespace}.json`);
219
+ const jsonContent = JSON.parse(fs.readFileSync(jsonPath, "utf8"));
220
+ const extractedKeys = Object.keys(jsonContent);
221
+
222
+ // Get existing keys for this namespace
223
+ const existingKeys = existingKeysByNamespace[namespace] || new Set();
224
+
225
+ // Find new keys
226
+ const newKeys = extractedKeys.filter((key) => !existingKeys.has(key));
227
+
228
+ if (newKeys.length > 0) {
229
+ if (!newKeysByLocaleAndNamespace[locale]) {
230
+ newKeysByLocaleAndNamespace[locale] = {};
231
+ }
232
+ newKeysByLocaleAndNamespace[locale][namespace] = newKeys;
233
+ }
234
+ }
235
+ }
236
+
237
+ // Check if there are any new keys
238
+ const hasNewKeys = Object.keys(newKeysByLocaleAndNamespace).length > 0;
239
+
240
+ if (!hasNewKeys) {
241
+ console.log(
242
+ "\nšŸŽ‰ No new keys found. All extracted keys already exist in .ftl files.",
243
+ );
244
+ return;
245
+ }
246
+
247
+ // Display found keys
248
+ console.log("\nšŸ“Š New keys found:");
249
+ for (const locale of Object.keys(newKeysByLocaleAndNamespace)) {
250
+ console.log(`\n${locale}:`);
251
+ for (const namespace of Object.keys(newKeysByLocaleAndNamespace[locale])) {
252
+ const keys = newKeysByLocaleAndNamespace[locale][namespace];
253
+ console.log(` šŸ“ ${namespace} (${keys.length} new keys):`);
254
+ keys.forEach((key) => console.log(` - ${key}`));
255
+ }
256
+ }
257
+
258
+ // If --add-to flag is provided, add keys to that namespace
259
+ if (addToNamespace) {
260
+ console.log(`\nāœļø Adding new keys to ${addToNamespace}.ftl files...`);
261
+
262
+ let totalAdded = 0;
263
+ const processedFiles = [];
264
+
265
+ for (const locale of Object.keys(newKeysByLocaleAndNamespace)) {
266
+ const localeFtlDir = path.join(LOCALES_FTL_DIR, locale);
267
+ const namespacesForLocale = newKeysByLocaleAndNamespace[locale];
268
+
269
+ // Collect all new keys across all namespaces for this locale
270
+ const allNewKeys = [];
271
+ for (const namespace of Object.keys(namespacesForLocale)) {
272
+ allNewKeys.push(...namespacesForLocale[namespace]);
273
+ }
274
+
275
+ if (allNewKeys.length === 0) continue;
276
+
277
+ // Add all keys to the specified namespace
278
+ const targetFile = addKeysToFtlFile(
279
+ localeFtlDir,
280
+ addToNamespace,
281
+ allNewKeys,
282
+ locale,
283
+ );
284
+ processedFiles.push(path.relative(process.cwd(), targetFile));
285
+ totalAdded += allNewKeys.length;
286
+
287
+ console.log(
288
+ `āœ… ${locale}: Added ${allNewKeys.length} keys to ${addToNamespace}.ftl`,
289
+ );
290
+ }
291
+
292
+ console.log(
293
+ `\nšŸŽ‰ Migration complete! Added ${totalAdded} new keys to ${addToNamespace}.ftl files.`,
294
+ );
295
+ console.log("\nModified files:");
296
+ processedFiles.forEach((file) => console.log(` šŸ“„ ${file}`));
297
+
298
+ console.log("\nšŸ’” Next steps:");
299
+ console.log(" 1. Review the new keys in your .ftl files");
300
+ console.log(" 2. Replace placeholder values with actual translations");
301
+ console.log(" 3. Run `pnpm i18n:compile` to update compiled JSON files");
302
+ } else {
303
+ // Just report
304
+ let totalNewKeys = 0;
305
+ const namespaceSet = new Set();
306
+
307
+ for (const locale of Object.keys(newKeysByLocaleAndNamespace)) {
308
+ for (const namespace of Object.keys(
309
+ newKeysByLocaleAndNamespace[locale],
310
+ )) {
311
+ namespaceSet.add(namespace);
312
+ totalNewKeys += newKeysByLocaleAndNamespace[locale][namespace].length;
313
+ }
314
+ }
315
+
316
+ console.log(
317
+ `\nšŸ’” Found ${totalNewKeys} new keys across ${namespaceSet.size} namespace(s).`,
318
+ );
319
+ console.log("\nTo add these keys to a specific namespace file, run:");
320
+ Array.from(namespaceSet).forEach((ns) => {
321
+ console.log(` node extract-i18n.js --add-to=${ns}`);
322
+ });
323
+ }
324
+ }
325
+
326
+ function main() {
327
+ const success = extractKeys();
328
+
329
+ if (success) {
330
+ migrateKeysToFtl();
331
+ } else {
332
+ process.exit(1);
333
+ }
334
+ }
335
+
336
+ main();
@@ -12,6 +12,7 @@ import {
12
12
  useLivestream,
13
13
  useReplyToMessage,
14
14
  useSetReplyToMessage,
15
+ useTheme,
15
16
  View,
16
17
  } from "../../";
17
18
  import {
@@ -63,6 +64,8 @@ export function ChatBox({
63
64
 
64
65
  let linfo = useLivestream();
65
66
 
67
+ const { theme } = useTheme();
68
+
66
69
  const chat = useChat();
67
70
  const createChatMessage = useCreateChatMessage();
68
71
  const replyTo = useReplyToMessage();
@@ -354,6 +357,19 @@ export function ChatBox({
354
357
  k.preventDefault();
355
358
  submit();
356
359
  }
360
+ } else if (k.nativeEvent.key === "Tab") {
361
+ if (showSuggestions) {
362
+ k.preventDefault();
363
+ const handles = Array.from(filteredAuthors.keys());
364
+ if (handles.length > 0) {
365
+ handleMentionSelect(handles[highlightedIndex]);
366
+ }
367
+ } else if (showEmojiSuggestions) {
368
+ k.preventDefault();
369
+ if (filteredEmojis.length > 0) {
370
+ handleEmojiSelect(filteredEmojis[highlightedIndex]);
371
+ }
372
+ }
357
373
  } else if (k.nativeEvent.key === "ArrowUp") {
358
374
  if (showSuggestions || showEmojiSuggestions) {
359
375
  k.preventDefault();
@@ -387,14 +403,17 @@ export function ChatBox({
387
403
  submitBehavior="submit"
388
404
  placeholder="Type a message..."
389
405
  />
390
- <Button
391
- disabled={submitting}
392
- variant="secondary"
393
- style={{ borderRadius: 16, height: 36, minWidth: 80 }}
394
- onPress={submit}
395
- >
396
- {submitting ? <Loader /> : "Send"}
397
- </Button>
406
+ <View>
407
+ <Button
408
+ disabled={submitting}
409
+ variant="secondary"
410
+ width="min"
411
+ style={{ borderRadius: 16, height: 43 }}
412
+ onPress={submit}
413
+ >
414
+ {submitting ? <Loader /> : "Send"}
415
+ </Button>
416
+ </View>
398
417
  </View>
399
418
  {showSuggestions && (
400
419
  <MentionSuggestions
@@ -466,7 +485,7 @@ export function ChatBox({
466
485
  setIsChatVisible?.(false);
467
486
  }}
468
487
  >
469
- <ExternalLink size={16} />
488
+ <ExternalLink color={theme.colors.primaryForeground} size={16} />
470
489
  </Button>
471
490
  )}
472
491
  </View>
@@ -8,6 +8,7 @@ import { Linking, View } from "react-native";
8
8
  import { ChatMessageViewHydrated } from "streamplace";
9
9
  import { RichtextSegment, segmentize } from "../../lib/facet";
10
10
  import { borders, flex, gap, ml, mr, opacity, pl } from "../../lib/theme/atoms";
11
+ import { formatHandleWithAt } from "../../utils/format-handle";
11
12
  import { atoms, colors, layout } from "../ui";
12
13
 
13
14
  interface Facet {
@@ -138,7 +139,7 @@ export const RenderChatMessage = memo(
138
139
  fontWeight: "thin",
139
140
  }}
140
141
  >
141
- @{(replyTo.author as any).handle}
142
+ {formatHandleWithAt(replyTo.author)}
142
143
  </Text>{" "}
143
144
  <Text
144
145
  style={{
@@ -181,7 +182,7 @@ export const RenderChatMessage = memo(
181
182
  },
182
183
  ]}
183
184
  >
184
- @{item.author.handle}
185
+ {formatHandleWithAt(item.author)}
185
186
  </Text>
186
187
  :{" "}
187
188
  <RichTextMessage