most-box 0.1.5 → 0.1.7

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 (389) hide show
  1. package/README.md +31 -19
  2. package/out/404/index.html +3 -3
  3. package/out/404.html +3 -3
  4. package/out/__next.__PAGE__.txt +6 -6
  5. package/out/__next._full.txt +16 -16
  6. package/out/__next._head.txt +3 -3
  7. package/out/__next._index.txt +8 -8
  8. package/out/__next._tree.txt +5 -5
  9. package/out/_next/static/chunks/0-c8h4u1i2f78.js +1 -0
  10. package/out/_next/static/chunks/02j6ojja7vzp8.js +1 -0
  11. package/out/_next/static/chunks/06im3as4nwfil.js +1 -0
  12. package/out/_next/static/chunks/0nwdp-n94owg0.css +1 -0
  13. package/out/_next/static/chunks/0sq_0pwxnhby2.js +1 -0
  14. package/out/_next/static/chunks/1ei8b9nw-ea8p.css +1 -0
  15. package/out/_next/static/chunks/1h-f81ddyfcmx.css +1 -0
  16. package/out/_next/static/chunks/{02jvyg27pp0mz.js → 1v-molv0hbcjl.js} +1 -1
  17. package/out/_next/static/chunks/22h69_zwmttt4.js +1 -0
  18. package/out/_next/static/chunks/23zlmarf-go2x.js +1 -0
  19. package/out/_next/static/chunks/24k_4-y4ym0df.js +1 -0
  20. package/out/_next/static/chunks/258tyt1xt34p4.css +1 -0
  21. package/out/_next/static/chunks/2693fczty5yr8.js +1 -0
  22. package/out/_next/static/chunks/26hcvxjw9do9d.js +1 -0
  23. package/out/_next/static/chunks/2_i1b78h0yiu_.js +1 -0
  24. package/out/_next/static/chunks/2fmkcw8ui5xp3.js +5 -0
  25. package/out/_next/static/chunks/2uget3ephe4e3.js +736 -0
  26. package/out/_next/static/chunks/2va-v1iiap4zv.js +1 -0
  27. package/out/_next/static/chunks/2vm9uslik2wfi.css +5 -0
  28. package/out/_next/static/chunks/3e9ia0hs-pqvs.css +1 -0
  29. package/out/_next/static/chunks/3ejz1mdljwwqf.css +1 -0
  30. package/out/_next/static/chunks/3fea100s764m-.js +1 -0
  31. package/out/_next/static/chunks/3g0c367tk4esf.js +1 -0
  32. package/out/_next/static/chunks/3mccxoa60ley8.js +1 -0
  33. package/out/_next/static/chunks/{0gcsdf57gcm6h.js → 3oe03qxgd_rid.js} +1 -1
  34. package/out/_next/static/chunks/3r5wf57k0gys9.js +1 -0
  35. package/out/_next/static/chunks/3yc_zd5vxq0j7.css +1 -0
  36. package/out/_next/static/chunks/418_591yp64lx.css +23 -0
  37. package/out/_next/static/chunks/43l72x-2z3zxb.js +1 -0
  38. package/out/_next/static/chunks/{turbopack-05qngmxam3ar~.js → turbopack-026p0g9v9_pva.js} +1 -1
  39. package/out/_not-found/__next._full.txt +13 -13
  40. package/out/_not-found/__next._head.txt +3 -3
  41. package/out/_not-found/__next._index.txt +8 -8
  42. package/out/_not-found/__next._not-found.__PAGE__.txt +4 -4
  43. package/out/_not-found/__next._not-found.txt +3 -3
  44. package/out/_not-found/__next._tree.txt +3 -3
  45. package/out/_not-found/index.html +3 -3
  46. package/out/_not-found/index.txt +13 -13
  47. package/out/admin/__next._full.txt +15 -15
  48. package/out/admin/__next._head.txt +3 -3
  49. package/out/admin/__next._index.txt +8 -8
  50. package/out/admin/__next._tree.txt +4 -4
  51. package/out/admin/__next.admin.__PAGE__.txt +4 -4
  52. package/out/admin/__next.admin.txt +4 -4
  53. package/out/admin/index.html +3 -3
  54. package/out/admin/index.txt +15 -15
  55. package/out/app/__next._full.txt +14 -14
  56. package/out/app/__next._head.txt +3 -3
  57. package/out/app/__next._index.txt +8 -8
  58. package/out/app/__next._tree.txt +3 -3
  59. package/out/app/__next.app.__PAGE__.txt +4 -4
  60. package/out/app/__next.app.txt +3 -3
  61. package/out/app/index.html +3 -3
  62. package/out/app/index.txt +14 -14
  63. package/out/chat/__next._full.txt +15 -15
  64. package/out/chat/__next._head.txt +3 -3
  65. package/out/chat/__next._index.txt +8 -8
  66. package/out/chat/__next._tree.txt +4 -4
  67. package/out/chat/__next.chat.__PAGE__.txt +4 -4
  68. package/out/chat/__next.chat.txt +4 -4
  69. package/out/chat/index.html +3 -3
  70. package/out/chat/index.txt +15 -15
  71. package/out/chat/join/__next._full.txt +15 -15
  72. package/out/chat/join/__next._head.txt +3 -3
  73. package/out/chat/join/__next._index.txt +8 -8
  74. package/out/chat/join/__next._tree.txt +4 -4
  75. package/out/chat/join/__next.chat.join.__PAGE__.txt +4 -4
  76. package/out/chat/join/__next.chat.join.txt +3 -3
  77. package/out/chat/join/__next.chat.txt +4 -4
  78. package/out/chat/join/index.html +3 -3
  79. package/out/chat/join/index.txt +15 -15
  80. package/out/demo/__next._full.txt +27 -0
  81. package/out/demo/__next._head.txt +5 -0
  82. package/out/demo/__next._index.txt +9 -0
  83. package/out/demo/__next._tree.txt +7 -0
  84. package/out/demo/__next.demo.__PAGE__.txt +12 -0
  85. package/out/demo/__next.demo.txt +5 -0
  86. package/out/demo/index.html +17 -0
  87. package/out/demo/index.txt +27 -0
  88. package/out/download/__next._full.txt +37 -35
  89. package/out/download/__next._head.txt +3 -3
  90. package/out/download/__next._index.txt +8 -8
  91. package/out/download/__next._tree.txt +5 -5
  92. package/out/download/__next.download.__PAGE__.txt +7 -7
  93. package/out/download/__next.download.txt +3 -3
  94. package/out/download/index.html +3 -3
  95. package/out/download/index.txt +37 -35
  96. package/out/game/__next._full.txt +13 -13
  97. package/out/game/__next._head.txt +3 -3
  98. package/out/game/__next._index.txt +8 -8
  99. package/out/game/__next._tree.txt +4 -4
  100. package/out/game/__next.game.__PAGE__.txt +2 -2
  101. package/out/game/__next.game.txt +4 -4
  102. package/out/game/gandengyan/__next._full.txt +16 -16
  103. package/out/game/gandengyan/__next._head.txt +3 -3
  104. package/out/game/gandengyan/__next._index.txt +8 -8
  105. package/out/game/gandengyan/__next._tree.txt +5 -5
  106. package/out/game/gandengyan/__next.game.gandengyan.__PAGE__.txt +5 -5
  107. package/out/game/gandengyan/__next.game.gandengyan.txt +3 -3
  108. package/out/game/gandengyan/__next.game.txt +4 -4
  109. package/out/game/gandengyan/index.html +3 -3
  110. package/out/game/gandengyan/index.txt +16 -16
  111. package/out/game/index.html +1 -1
  112. package/out/game/index.txt +13 -13
  113. package/out/game/zhajinhua/__next._full.txt +16 -15
  114. package/out/game/zhajinhua/__next._head.txt +3 -3
  115. package/out/game/zhajinhua/__next._index.txt +8 -8
  116. package/out/game/zhajinhua/__next._tree.txt +5 -4
  117. package/out/game/zhajinhua/__next.game.txt +4 -4
  118. package/out/game/zhajinhua/__next.game.zhajinhua.__PAGE__.txt +5 -4
  119. package/out/game/zhajinhua/__next.game.zhajinhua.txt +3 -3
  120. package/out/game/zhajinhua/index.html +3 -3
  121. package/out/game/zhajinhua/index.txt +16 -15
  122. package/out/index.html +3 -3
  123. package/out/index.txt +16 -16
  124. package/out/note/__next._full.txt +14 -14
  125. package/out/note/__next._head.txt +3 -3
  126. package/out/note/__next._index.txt +8 -8
  127. package/out/note/__next._tree.txt +3 -3
  128. package/out/note/__next.note.__PAGE__.txt +4 -4
  129. package/out/note/__next.note.txt +3 -3
  130. package/out/note/index.html +3 -3
  131. package/out/note/index.txt +14 -14
  132. package/out/ping/__next._full.txt +16 -16
  133. package/out/ping/__next._head.txt +3 -3
  134. package/out/ping/__next._index.txt +8 -8
  135. package/out/ping/__next._tree.txt +5 -5
  136. package/out/ping/__next.ping.__PAGE__.txt +5 -5
  137. package/out/ping/__next.ping.txt +4 -4
  138. package/out/ping/index.html +3 -3
  139. package/out/ping/index.txt +16 -16
  140. package/out/web3/__next._full.txt +15 -15
  141. package/out/web3/__next._head.txt +3 -3
  142. package/out/web3/__next._index.txt +8 -8
  143. package/out/web3/__next._tree.txt +4 -4
  144. package/out/web3/__next.web3.__PAGE__.txt +4 -4
  145. package/out/web3/__next.web3.txt +4 -4
  146. package/out/web3/ed25519/__next._full.txt +13 -13
  147. package/out/web3/ed25519/__next._head.txt +3 -3
  148. package/out/web3/ed25519/__next._index.txt +8 -8
  149. package/out/web3/ed25519/__next._tree.txt +4 -4
  150. package/out/web3/ed25519/__next.web3.ed25519.__PAGE__.txt +2 -2
  151. package/out/web3/ed25519/__next.web3.ed25519.txt +3 -3
  152. package/out/web3/ed25519/__next.web3.txt +4 -4
  153. package/out/web3/ed25519/index.html +1 -1
  154. package/out/web3/ed25519/index.txt +13 -13
  155. package/out/web3/index.html +3 -3
  156. package/out/web3/index.txt +15 -15
  157. package/out/web3/tools/__next._full.txt +13 -13
  158. package/out/web3/tools/__next._head.txt +3 -3
  159. package/out/web3/tools/__next._index.txt +8 -8
  160. package/out/web3/tools/__next._tree.txt +4 -4
  161. package/out/web3/tools/__next.web3.tools.__PAGE__.txt +2 -2
  162. package/out/web3/tools/__next.web3.tools.txt +3 -3
  163. package/out/web3/tools/__next.web3.txt +4 -4
  164. package/out/web3/tools/index.html +1 -1
  165. package/out/web3/tools/index.txt +13 -13
  166. package/package.json +23 -23
  167. package/server/src/core/gameRoom.js +12 -0
  168. package/server/src/core/mostLink.js +1 -1
  169. package/server/src/core/zhajinhua.js +82 -14
  170. package/server/src/games/gandengyan.js +79 -14
  171. package/server/src/http/app.js +25 -2
  172. package/server/src/http/nodeStatus.js +37 -0
  173. package/server/src/index.js +160 -25
  174. package/out/_next/static/chunks/0.4ov9319fecg.css +0 -1
  175. package/out/_next/static/chunks/0._8s6pbfw.xk.js +0 -1
  176. package/out/_next/static/chunks/06lttvu7563zo.css +0 -1
  177. package/out/_next/static/chunks/09h7l4i38xc7q.css +0 -24
  178. package/out/_next/static/chunks/09hqx79-jkvm_.css +0 -1
  179. package/out/_next/static/chunks/09vcm1ku9k7o8.js +0 -1
  180. package/out/_next/static/chunks/0c6e_d2jq179x.js +0 -1
  181. package/out/_next/static/chunks/0ccalho416.d7.js +0 -1
  182. package/out/_next/static/chunks/0exj_tg.ew-t3.js +0 -1
  183. package/out/_next/static/chunks/0f-wz5d~tv-r4.js +0 -1
  184. package/out/_next/static/chunks/0f0jhsujtf-61.js +0 -1
  185. package/out/_next/static/chunks/0h4r.qtmpa6eh.js +0 -1
  186. package/out/_next/static/chunks/0hyds~bp.auvh.js +0 -1
  187. package/out/_next/static/chunks/0iq1h7g4dudg8.js +0 -1
  188. package/out/_next/static/chunks/0knnzo9aih48r.js +0 -1
  189. package/out/_next/static/chunks/0nzyk~sg_tn._.js +0 -1
  190. package/out/_next/static/chunks/0o9ce4cyf76by.js +0 -736
  191. package/out/_next/static/chunks/0t_3xxx4zkerp.js +0 -5
  192. package/out/_next/static/chunks/0w~2fjq86t7c7.css +0 -1
  193. package/out/_next/static/chunks/0xdwau5k2augv.css +0 -4
  194. package/out/_next/static/chunks/0xrqerhosrp9~.js +0 -1
  195. package/out/_next/static/chunks/0xx_10jns1.s7.css +0 -1
  196. package/out/_next/static/chunks/14-fm9r_mom81.js +0 -1
  197. package/out/_next/static/chunks/14jhy~xia8lh8.js +0 -1
  198. /package/out/_next/static/chunks/{0bld2u_ld~va2.js → 0-jy8rfo075fy.js} +0 -0
  199. /package/out/_next/static/chunks/{0bliugh5lxw55.js → 0-kczrcxjk7lc.js} +0 -0
  200. /package/out/_next/static/chunks/{00d9h1tddnnnd.js → 012yllpioyi-k.js} +0 -0
  201. /package/out/_next/static/chunks/{00tkdqwxch-3s.js → 02f7w-ybfnvpd.js} +0 -0
  202. /package/out/_next/static/chunks/{01l3o90g~1z42.js → 04_v8i3c2y4ni.js} +0 -0
  203. /package/out/_next/static/chunks/{01xlw8hd842-c.js → 05-c3ty_6dwfk.js} +0 -0
  204. /package/out/_next/static/chunks/{01mfky9camw6i.js → 052vp9tk7oqx6.js} +0 -0
  205. /package/out/_next/static/chunks/{01r.v-pqs1vrm.js → 05k6874y7n0cw.js} +0 -0
  206. /package/out/_next/static/chunks/{02zzxfop_k6tl.css → 09g8c9-u_uh1z.css} +0 -0
  207. /package/out/_next/static/chunks/{03edqrb4zdj~g.js → 0az8vxg2gfuhm.js} +0 -0
  208. /package/out/_next/static/chunks/{03h_6oo-gqkhz.js → 0b899y85ei3i_.js} +0 -0
  209. /package/out/_next/static/chunks/{03~yq9q893hmn.js → 0cz1d0mv5g_q7.js} +0 -0
  210. /package/out/_next/static/chunks/{04hcgsanv1hhu.js → 0eg1osglq6nq7.js} +0 -0
  211. /package/out/_next/static/chunks/{05g2q0w5b34.g.js → 0hlvocunlbrjs.js} +0 -0
  212. /package/out/_next/static/chunks/{05of77xycbt8~.js → 0i9k23rx749fx.js} +0 -0
  213. /package/out/_next/static/chunks/{05zwemzfjx3sh.js → 0j6wiyqf1637r.js} +0 -0
  214. /package/out/_next/static/chunks/{06dpc5df94.v1.js → 0knzyzd1jvley.js} +0 -0
  215. /package/out/_next/static/chunks/{06e1~1-z_ic9a.js → 0kp8ujaqwut11.js} +0 -0
  216. /package/out/_next/static/chunks/{075s7sn.ns~u5.js → 0n92y9hb-ta0u.js} +0 -0
  217. /package/out/_next/static/chunks/{07dynrbvd3.f4.js → 0nybb-z3ufrbx.js} +0 -0
  218. /package/out/_next/static/chunks/{07r9nn-pzlgg1.js → 0o-o9af-grvj8.js} +0 -0
  219. /package/out/_next/static/chunks/{07p~uva5pwgwe.js → 0oxr0r0aewn99.js} +0 -0
  220. /package/out/_next/static/chunks/{08576xhv~~jck.js → 0qh3b90ouc9bd.js} +0 -0
  221. /package/out/_next/static/chunks/{08qqf0rsi3oot.js → 0s7i7nfr9j3b1.js} +0 -0
  222. /package/out/_next/static/chunks/{08u211~k~qu52.js → 0sh_jm8siqvek.js} +0 -0
  223. /package/out/_next/static/chunks/{08.72abkgwy9g.js → 0t86ducxkqweb.js} +0 -0
  224. /package/out/_next/static/chunks/{098.p.2-zm4p7.js → 0u0j5i6-n4oqd.js} +0 -0
  225. /package/out/_next/static/chunks/{09ngvtajm7e5y.js → 0v73vfxjds7sj.js} +0 -0
  226. /package/out/_next/static/chunks/{09ps~-43n5qyo.js → 0ve8ixremhwy0.js} +0 -0
  227. /package/out/_next/static/chunks/{09v7_0gclxr46.js → 0vv5cwj6kr506.js} +0 -0
  228. /package/out/_next/static/chunks/{09yql86dir9c4.js → 0w3wf8o-ewec9.js} +0 -0
  229. /package/out/_next/static/chunks/{09zmlfljowj1~.js → 0w6o4o76scrb2.js} +0 -0
  230. /package/out/_next/static/chunks/{0n4t80gjc3q5h.js → 1-88dio6azz54.js} +0 -0
  231. /package/out/_next/static/chunks/{0cn9a7aimbdzq.js → 12zg24u7mbv4z.js} +0 -0
  232. /package/out/_next/static/chunks/{0d3f-nk3c.2re.js → 14lsse587-ccf.js} +0 -0
  233. /package/out/_next/static/chunks/{0dtohpf7~3d12.js → 16qtikqm_sate.js} +0 -0
  234. /package/out/_next/static/chunks/{0e531nije_ln2.js → 17_ly1mk2z3q8.js} +0 -0
  235. /package/out/_next/static/chunks/{0e5zvj_rh0z3m.js → 181421-y2xzj7.js} +0 -0
  236. /package/out/_next/static/chunks/{0myp4sjagr~h0.js → 1_e-vuvfsntao.js} +0 -0
  237. /package/out/_next/static/chunks/{0e-3e8h7g99yf.js → 1aljc62wfhqhr.js} +0 -0
  238. /package/out/_next/static/chunks/{0f4y~rkk-n81e.js → 1b7mbzsylsn-m.js} +0 -0
  239. /package/out/_next/static/chunks/{0fk~0~p7ivfn1.js → 1cjakikh0o1tm.js} +0 -0
  240. /package/out/_next/static/chunks/{0fw6juc~lsj3z.js → 1dfzez629llzh.js} +0 -0
  241. /package/out/_next/static/chunks/{0g0u7785a73vo.js → 1e4ilit3ave6c.js} +0 -0
  242. /package/out/_next/static/chunks/{0gze5uso1mbe9.js → 1gzgcv355ziff.js} +0 -0
  243. /package/out/_next/static/chunks/{0g_fpgh7drfda.js → 1h0o6fj73le9_.js} +0 -0
  244. /package/out/_next/static/chunks/{0hf.aosc-7172.js → 1in766ibz5l-p.js} +0 -0
  245. /package/out/_next/static/chunks/{0hgz35c1ejbs9.js → 1ip_c70si4tj2.js} +0 -0
  246. /package/out/_next/static/chunks/{0hrw-r.xmvmsq.js → 1jlu197-yog_n.js} +0 -0
  247. /package/out/_next/static/chunks/{0hzg4al.v~8~m.js → 1k788fny29y_j.js} +0 -0
  248. /package/out/_next/static/chunks/{0ig8a4sazk3~2.css → 1lxjpnw925-0p.css} +0 -0
  249. /package/out/_next/static/chunks/{0ip9xrols_83o.js → 1mnhfyfn52md5.js} +0 -0
  250. /package/out/_next/static/chunks/{0j4-d0qf.v~kn.js → 1o8brm8yipzn4.js} +0 -0
  251. /package/out/_next/static/chunks/{0jhdeq.j9_02m.js → 1p8oa39bqu6ed.js} +0 -0
  252. /package/out/_next/static/chunks/{0jy63h3i-y69i.js → 1qmnmb_dutuw8.js} +0 -0
  253. /package/out/_next/static/chunks/{0kdnx_u-60k9s.js → 1s6rdcw0q185p.js} +0 -0
  254. /package/out/_next/static/chunks/{0kq~edq42o1-c.js → 1ta0w8zc7tae7.js} +0 -0
  255. /package/out/_next/static/chunks/{0l682p362d-5w.js → 1uvi_hie0s3z5.js} +0 -0
  256. /package/out/_next/static/chunks/{0m68p9txef5rs.js → 1y36s6sv2z7r4.js} +0 -0
  257. /package/out/_next/static/chunks/{0mme-fm5d2oz2.js → 1zf4i-oj7n-ll.js} +0 -0
  258. /package/out/_next/static/chunks/{0y.li-~3oybew.js → 2-vtwv8h_uokj.js} +0 -0
  259. /package/out/_next/static/chunks/{0n.qlfk~z7o.6.js → 2227enga_0c-6.js} +0 -0
  260. /package/out/_next/static/chunks/{0oz3yl6_-716p.js → 24zr4q96g-eii.js} +0 -0
  261. /package/out/_next/static/chunks/{0pqt~8bl3ukh4.js → 27jktro2p5rq9.js} +0 -0
  262. /package/out/_next/static/chunks/{0yl2t7cs-n_ng.js → 2_cqphhur0a6t.js} +0 -0
  263. /package/out/_next/static/chunks/{0yq3kh.hchtm_.js → 2_s88st3j0tql.js} +0 -0
  264. /package/out/_next/static/chunks/{0ys0l5au.9c2c.js → 2_y6edbaubqrt.js} +0 -0
  265. /package/out/_next/static/chunks/{0qqupeexg83u7.js → 2at8y3pbt5cue.js} +0 -0
  266. /package/out/_next/static/chunks/{0rb-ri481.kc9.js → 2cv1zex4has67.js} +0 -0
  267. /package/out/_next/static/chunks/{0rsnmahfd.59p.js → 2e6j5h4ftd4jd.js} +0 -0
  268. /package/out/_next/static/chunks/{0rt6rgnvr-s_p.js → 2e8b26r0td7ou.js} +0 -0
  269. /package/out/_next/static/chunks/{0runh28p_gg6..js → 2ecppdrjm9cs4.js} +0 -0
  270. /package/out/_next/static/chunks/{0shy.t1fwqcev.js → 2gl0wusc9zf3d.js} +0 -0
  271. /package/out/_next/static/chunks/{0t2xr05rlu96l.js → 2im7c515bo69p.js} +0 -0
  272. /package/out/_next/static/chunks/{0t6h56rhg1y5i.js → 2ixaku9ie8hym.js} +0 -0
  273. /package/out/_next/static/chunks/{0tdqd1zunusgk.js → 2jhnrjgj_k2-z.js} +0 -0
  274. /package/out/_next/static/chunks/{0ujbnp38x63ek.js → 2n6pb94vmohgf.js} +0 -0
  275. /package/out/_next/static/chunks/{0ukyg~tkm~h2m.css → 2nbju8t9-ux58.css} +0 -0
  276. /package/out/_next/static/chunks/{0v68pdrp54lb-.js → 2pdxw43rsbho0.js} +0 -0
  277. /package/out/_next/static/chunks/{0vsm0m5sxrb.3.js → 2r6z3vlfw0ppd.js} +0 -0
  278. /package/out/_next/static/chunks/{0vzlz.iboqo3c.js → 2rskzmv3skmq3.js} +0 -0
  279. /package/out/_next/static/chunks/{0w87vbpkf-ogd.js → 2stoe6xiau1b3.js} +0 -0
  280. /package/out/_next/static/chunks/{0xgg0~kmf3gd-.js → 2wqoc60afpg_5.js} +0 -0
  281. /package/out/_next/static/chunks/{0xj24-70ptdzp.js → 2wyvwsayrr98o.js} +0 -0
  282. /package/out/_next/static/chunks/{0xxlx772fr3x4.js → 2y3o2mnyfnx68.js} +0 -0
  283. /package/out/_next/static/chunks/{16i.qbk8t8gf_.js → 3-7y7sjol3yto.js} +0 -0
  284. /package/out/_next/static/chunks/{0z48pmi6buytt.js → 3089gugfv3ov9.js} +0 -0
  285. /package/out/_next/static/chunks/{0zapnvgy89mg..js → 30s3_0brd77ky.js} +0 -0
  286. /package/out/_next/static/chunks/{0_s~ebb-7b2hr.js → 35idql3ziq0wz.js} +0 -0
  287. /package/out/_next/static/chunks/{0_w-0-2z5oqd_.js → 35unmm4isvqg5.js} +0 -0
  288. /package/out/_next/static/chunks/{0-n3pg7th.zza.js → 389wmv2b6x2nn.js} +0 -0
  289. /package/out/_next/static/chunks/{0~4f5p6tvn1lq.js → 39-oy5n969lo6.js} +0 -0
  290. /package/out/_next/static/chunks/{0~3ik-hfp9s-7.js → 39yvee40syj70.js} +0 -0
  291. /package/out/_next/static/chunks/{0~_0ys.2whxbw.js → 3clhij8e1eul0.js} +0 -0
  292. /package/out/_next/static/chunks/{0~_ui9l7.2sxf.js → 3cnsdzbvm3q7p.js} +0 -0
  293. /package/out/_next/static/chunks/{0~.-vxi5oc.r0.js → 3cxmalqqghdac.js} +0 -0
  294. /package/out/_next/static/chunks/{0.4j.0k5a64vg.js → 3d9p88evh2scq.js} +0 -0
  295. /package/out/_next/static/chunks/{0.ozi1_x2.m.~.js → 3eyprczj7yrg6.js} +0 -0
  296. /package/out/_next/static/chunks/{0.t5wlt51zou5.js → 3f9v_gtppe4hs.js} +0 -0
  297. /package/out/_next/static/chunks/{0.w4hkvap~bva.js → 3fj0amtzqae6f.js} +0 -0
  298. /package/out/_next/static/chunks/{1037jlyw5~7ht.js → 3gf98e08a-l_e.js} +0 -0
  299. /package/out/_next/static/chunks/{1045hfzu533z0.js → 3gi6og9m_yaak.js} +0 -0
  300. /package/out/_next/static/chunks/{104e5nmc.c-pl.js → 3giw7r1lii84y.js} +0 -0
  301. /package/out/_next/static/chunks/{109taw1pbh-0b.js → 3gzhy1cs_f2oi.js} +0 -0
  302. /package/out/_next/static/chunks/{10ynz1dy483wf.js → 3i_ceknny1oqt.js} +0 -0
  303. /package/out/_next/static/chunks/{10x7~onqwp338.js → 3iw0815ssih3b.js} +0 -0
  304. /package/out/_next/static/chunks/{11hds.mg~4_r-.js → 3kun-vwr7nzd4.js} +0 -0
  305. /package/out/_next/static/chunks/{11ibzaklcauw~.js → 3kxm1e-b1er3_.js} +0 -0
  306. /package/out/_next/static/chunks/{11z.0s6.42b.p.js → 3mc8fynmv71yg.js} +0 -0
  307. /package/out/_next/static/chunks/{126enaq~f7scl.js → 3n6cor2n9zyn7.js} +0 -0
  308. /package/out/_next/static/chunks/{12pep-2t-qg4n.css → 3or2h8swxfxyj.css} +0 -0
  309. /package/out/_next/static/chunks/{12-9n56l0y3yr.js → 3ppt04b6xqz29.js} +0 -0
  310. /package/out/_next/static/chunks/{1380op_pfk.qo.js → 3ql2pi_m5_5p_.js} +0 -0
  311. /package/out/_next/static/chunks/{14a4fwbiq.l3z.js → 3t-6u8caafiu9.js} +0 -0
  312. /package/out/_next/static/chunks/{146oiw1bggtn4.js → 3tqdzb_n12tdm.js} +0 -0
  313. /package/out/_next/static/chunks/{14cowsqn95m1k.js → 3u6zpg943kpst.js} +0 -0
  314. /package/out/_next/static/chunks/{14dtd3l03v.kx.js → 3uaedu2hf291z.js} +0 -0
  315. /package/out/_next/static/chunks/{14tm3qa-v9o-4.js → 3vladx3wh0d4k.js} +0 -0
  316. /package/out/_next/static/chunks/{14_inksek_rth.js → 3w4o9hklow6fg.js} +0 -0
  317. /package/out/_next/static/chunks/{14_po2rb_arn4.js → 3w56w25z6u89b.js} +0 -0
  318. /package/out/_next/static/chunks/{157z7bowux3xj.js → 3x1y_gkazt6kx.js} +0 -0
  319. /package/out/_next/static/chunks/{15m1_677az2cm.js → 3y7r1h96dtcov.js} +0 -0
  320. /package/out/_next/static/chunks/{15v.~.ne6ogkk.js → 3z0hydntmwg19.js} +0 -0
  321. /package/out/_next/static/chunks/{15-o4kb-evqd7.js → 3zhu1svjr0bc5.js} +0 -0
  322. /package/out/_next/static/chunks/{16u9f35gylw8l.js → 404orp1erq__7.js} +0 -0
  323. /package/out/_next/static/chunks/{17ajyb5ogk5yj.js → 41talcs-dc2tc.js} +0 -0
  324. /package/out/_next/static/chunks/{17dyfxbq8yz8n.js → 421pn8weymo-b.js} +0 -0
  325. /package/out/_next/static/chunks/{180zln9pcq9ih.js → 44987pmr20now.js} +0 -0
  326. /package/out/_next/static/chunks/{1814izi5gh.kp.js → 449ygeh62gitc.js} +0 -0
  327. /package/out/_next/static/{2smv1H9Y4Z2Ri-SL-UFgR → eXddCOt9eyz0j78b1m4Ex}/_buildManifest.js +0 -0
  328. /package/out/_next/static/{2smv1H9Y4Z2Ri-SL-UFgR → eXddCOt9eyz0j78b1m4Ex}/_clientMiddlewareManifest.js +0 -0
  329. /package/out/_next/static/{2smv1H9Y4Z2Ri-SL-UFgR → eXddCOt9eyz0j78b1m4Ex}/_ssgManifest.js +0 -0
  330. /package/out/_next/static/media/{KaTeX_AMS-Regular.0b~8ki5y928w2.woff → KaTeX_AMS-Regular.10y3kupq4t663.woff} +0 -0
  331. /package/out/_next/static/media/{KaTeX_AMS-Regular.0p1vbqd84i2~o.woff2 → KaTeX_AMS-Regular.25ieegmnh38ts.woff2} +0 -0
  332. /package/out/_next/static/media/{KaTeX_AMS-Regular.173t6ktr7uf-w.ttf → KaTeX_AMS-Regular.418dr7cz3fo2x.ttf} +0 -0
  333. /package/out/_next/static/media/{KaTeX_Caligraphic-Bold.01-pzluls4zgb.woff2 → KaTeX_Caligraphic-Bold.06b-ya9t43ioz.woff2} +0 -0
  334. /package/out/_next/static/media/{KaTeX_Caligraphic-Bold.0x2v1lwn~880f.woff → KaTeX_Caligraphic-Bold.2vmk2hva4ctha.woff} +0 -0
  335. /package/out/_next/static/media/{KaTeX_Caligraphic-Bold.16zv5fax0h0ka.ttf → KaTeX_Caligraphic-Bold.40ltxhe834pns.ttf} +0 -0
  336. /package/out/_next/static/media/{KaTeX_Caligraphic-Regular.02i3z7wig438t.ttf → KaTeX_Caligraphic-Regular.07-7u27-nhn_r.ttf} +0 -0
  337. /package/out/_next/static/media/{KaTeX_Caligraphic-Regular.0rysu1t-ncjq8.woff2 → KaTeX_Caligraphic-Regular.2eph4dlhid_m9.woff2} +0 -0
  338. /package/out/_next/static/media/{KaTeX_Caligraphic-Regular.10927swgekwun.woff → KaTeX_Caligraphic-Regular.3gxeetazf831f.woff} +0 -0
  339. /package/out/_next/static/media/{KaTeX_Fraktur-Bold.0et27v~3~4uhe.ttf → KaTeX_Fraktur-Bold.19yqa_tc9d_gx.ttf} +0 -0
  340. /package/out/_next/static/media/{KaTeX_Fraktur-Bold.0e-16u10iuyyf.woff → KaTeX_Fraktur-Bold.1alcy76__wdj2.woff} +0 -0
  341. /package/out/_next/static/media/{KaTeX_Fraktur-Bold.0w23i72~hprpq.woff2 → KaTeX_Fraktur-Bold.2sasz-d-jtw8y.woff2} +0 -0
  342. /package/out/_next/static/media/{KaTeX_Fraktur-Regular.0b.riegzdfue2.woff → KaTeX_Fraktur-Regular.110oo81prr9n5.woff} +0 -0
  343. /package/out/_next/static/media/{KaTeX_Fraktur-Regular.0rekyoa-52fj_.woff2 → KaTeX_Fraktur-Regular.2d10y4xmjvzlf.woff2} +0 -0
  344. /package/out/_next/static/media/{KaTeX_Fraktur-Regular.0vjwa15znhk~4.ttf → KaTeX_Fraktur-Regular.2qhy34r6a05dn.ttf} +0 -0
  345. /package/out/_next/static/media/{KaTeX_Main-Bold.09i7~607shf-h.ttf → KaTeX_Main-Bold.0us_n0tnxlxu7.ttf} +0 -0
  346. /package/out/_next/static/media/{KaTeX_Main-Bold.09lmynrorhcbw.woff → KaTeX_Main-Bold.0v1esh257kqpe.woff} +0 -0
  347. /package/out/_next/static/media/{KaTeX_Main-Bold.16pfc63_du6mx.woff2 → KaTeX_Main-Bold.3-rowy8o6_4ky.woff2} +0 -0
  348. /package/out/_next/static/media/{KaTeX_Main-BoldItalic.0cp37g7x1q8h6.woff → KaTeX_Main-BoldItalic.13355ck5zr48q.woff} +0 -0
  349. /package/out/_next/static/media/{KaTeX_Main-BoldItalic.0d54rk08rx11s.woff2 → KaTeX_Main-BoldItalic.14r2naom8mrec.woff2} +0 -0
  350. /package/out/_next/static/media/{KaTeX_Main-BoldItalic.15j6k~hix2t_0.ttf → KaTeX_Main-BoldItalic.3x_u9cepaced0.ttf} +0 -0
  351. /package/out/_next/static/media/{KaTeX_Main-Italic.0382gqciexmbu.woff → KaTeX_Main-Italic.0afv392dj4w59.woff} +0 -0
  352. /package/out/_next/static/media/{KaTeX_Main-Italic.06o5nq0_91v60.woff2 → KaTeX_Main-Italic.0lig0v9j0700p.woff2} +0 -0
  353. /package/out/_next/static/media/{KaTeX_Main-Italic.0su4i6mm18-wo.ttf → KaTeX_Main-Italic.2hkw3230mfwcv.ttf} +0 -0
  354. /package/out/_next/static/media/{KaTeX_Main-Regular.08zh8z.7shijf.ttf → KaTeX_Main-Regular.0symfa7dqj6jd.ttf} +0 -0
  355. /package/out/_next/static/media/{KaTeX_Main-Regular.0diheg01zyoph.woff → KaTeX_Main-Regular.15u8r3b2y7fv4.woff} +0 -0
  356. /package/out/_next/static/media/{KaTeX_Main-Regular.0kaf-ag2_wkm-.woff2 → KaTeX_Main-Regular.1ryvsdzh2w1_e.woff2} +0 -0
  357. /package/out/_next/static/media/{KaTeX_Math-BoldItalic.0ajzxypnbx1h1.ttf → KaTeX_Math-BoldItalic.0y5w36a5aq__2.ttf} +0 -0
  358. /package/out/_next/static/media/{KaTeX_Math-BoldItalic.0ck1myuerwyqw.woff → KaTeX_Math-BoldItalic.12pl58orkw9rg.woff} +0 -0
  359. /package/out/_next/static/media/{KaTeX_Math-BoldItalic.0ja97dn.cpc87.woff2 → KaTeX_Math-BoldItalic.1oopuu636h4il.woff2} +0 -0
  360. /package/out/_next/static/media/{KaTeX_Math-Italic.09xkhecjcn5r9.woff → KaTeX_Math-Italic.0w0b1ugh62cfr.woff} +0 -0
  361. /package/out/_next/static/media/{KaTeX_Math-Italic.0x23a-bmp-5tg.ttf → KaTeX_Math-Italic.2vkekfblmz5nb.ttf} +0 -0
  362. /package/out/_next/static/media/{KaTeX_Math-Italic.0zrha2c4sl2je.woff2 → KaTeX_Math-Italic.32405s1aq8vas.woff2} +0 -0
  363. /package/out/_next/static/media/{KaTeX_SansSerif-Bold.05a9.pc1j_zx9.woff2 → KaTeX_SansSerif-Bold.0h3wi2z_eouyg.woff2} +0 -0
  364. /package/out/_next/static/media/{KaTeX_SansSerif-Bold.0jcl-ayi1uun0.woff → KaTeX_SansSerif-Bold.1ovw5p-yjp56g.woff} +0 -0
  365. /package/out/_next/static/media/{KaTeX_SansSerif-Bold.0re8y.dm7.mt5.ttf → KaTeX_SansSerif-Bold.2d03q85pwxpti.ttf} +0 -0
  366. /package/out/_next/static/media/{KaTeX_SansSerif-Italic.0a0234dc3s62j.woff2 → KaTeX_SansSerif-Italic.0wkjc4dm2kcit.woff2} +0 -0
  367. /package/out/_next/static/media/{KaTeX_SansSerif-Italic.0judofdln9731.woff → KaTeX_SansSerif-Italic.1qavw__2zz8gk.woff} +0 -0
  368. /package/out/_next/static/media/{KaTeX_SansSerif-Italic.10z1iap9pfus8.ttf → KaTeX_SansSerif-Italic.3i-q087b23-m8.ttf} +0 -0
  369. /package/out/_next/static/media/{KaTeX_SansSerif-Regular.0h9yjlugq4q_e.woff → KaTeX_SansSerif-Regular.1i4afx8nk8n4r.woff} +0 -0
  370. /package/out/_next/static/media/{KaTeX_SansSerif-Regular.0v6gcj32-czft.woff2 → KaTeX_SansSerif-Regular.2peiewu59z3d-.woff2} +0 -0
  371. /package/out/_next/static/media/{KaTeX_SansSerif-Regular.0zm18kga42ebc.ttf → KaTeX_SansSerif-Regular.31pbu25feko_c.ttf} +0 -0
  372. /package/out/_next/static/media/{KaTeX_Script-Regular.0c4.h-mer83d_.woff2 → KaTeX_Script-Regular.11h14300o9pd0.woff2} +0 -0
  373. /package/out/_next/static/media/{KaTeX_Script-Regular.0q14y6zkzlpob.ttf → KaTeX_Script-Regular.28p_x7iz71ofe.ttf} +0 -0
  374. /package/out/_next/static/media/{KaTeX_Script-Regular.0ze6v4r_-99oy.woff → KaTeX_Script-Regular.3110jb9c-bxna.woff} +0 -0
  375. /package/out/_next/static/media/{KaTeX_Size1-Regular.013x6a4ierotp.woff2 → KaTeX_Size1-Regular.03lhvx36ekcou.woff2} +0 -0
  376. /package/out/_next/static/media/{KaTeX_Size1-Regular.0kidw0oi.m68o.woff → KaTeX_Size1-Regular.1slf4bh0hc6vm.woff} +0 -0
  377. /package/out/_next/static/media/{KaTeX_Size1-Regular.0m6y-i6wfokni.ttf → KaTeX_Size1-Regular.1y57-ck23ey8c.ttf} +0 -0
  378. /package/out/_next/static/media/{KaTeX_Size2-Regular.0blpmluwilgbg.woff → KaTeX_Size2-Regular.0-kwyvx03omo8.woff} +0 -0
  379. /package/out/_next/static/media/{KaTeX_Size2-Regular.0d5inmyp-tyv3.woff2 → KaTeX_Size2-Regular.14s5gg-puz6h-.woff2} +0 -0
  380. /package/out/_next/static/media/{KaTeX_Size2-Regular.0wnhnvj-.k9d5.ttf → KaTeX_Size2-Regular.2u0s-b07k2o9m.ttf} +0 -0
  381. /package/out/_next/static/media/{KaTeX_Size3-Regular.01h0xm_sfctj3.woff → KaTeX_Size3-Regular.04o9a_02gu_e8.woff} +0 -0
  382. /package/out/_next/static/media/{KaTeX_Size3-Regular.0iukctyhw5j56.woff2 → KaTeX_Size3-Regular.1n1rgzz84z8r9.woff2} +0 -0
  383. /package/out/_next/static/media/{KaTeX_Size3-Regular.0jl8mqyf4gzpn.ttf → KaTeX_Size3-Regular.1pkn-dge4q0fv.ttf} +0 -0
  384. /package/out/_next/static/media/{KaTeX_Size4-Regular.0w3.rb_c4stzk.woff2 → KaTeX_Size4-Regular.2sgotkdv3dcyv.woff2} +0 -0
  385. /package/out/_next/static/media/{KaTeX_Size4-Regular.0wr_9l81-mu06.ttf → KaTeX_Size4-Regular.2uelkfk2yna5e.ttf} +0 -0
  386. /package/out/_next/static/media/{KaTeX_Size4-Regular.12tvaesf3.zl3.woff → KaTeX_Size4-Regular.3p2r1l7xmebxv.woff} +0 -0
  387. /package/out/_next/static/media/{KaTeX_Typewriter-Regular.0c4zdxz~8frhm.woff2 → KaTeX_Typewriter-Regular.11gr2d2wuwz77.woff2} +0 -0
  388. /package/out/_next/static/media/{KaTeX_Typewriter-Regular.0cgrzn5l3kao5.woff → KaTeX_Typewriter-Regular.12f8myjij3617.woff} +0 -0
  389. /package/out/_next/static/media/{KaTeX_Typewriter-Regular.128~qc3858otl.ttf → KaTeX_Typewriter-Regular.3nee9kjfy6nm8.ttf} +0 -0
@@ -67,6 +67,7 @@ import {
67
67
 
68
68
  const sleep = ms => new Promise(resolve => setTimeout(resolve, ms))
69
69
  const CHAT_FILE_ROOT = 'chat-file'
70
+ const TRANSIENT_CHANNEL_TYPES = new Set(['game'])
70
71
 
71
72
  function normalizeOwnerAddress(address) {
72
73
  const value = String(address || '').trim()
@@ -88,6 +89,17 @@ function buildMostLink(cid, fileName) {
88
89
  return `most://${cid}?filename=${encodeURIComponent(fileName)}`
89
90
  }
90
91
 
92
+ function normalizeChannelDisplayName(input, fallbackAddress = '') {
93
+ const value = String(input || '').trim()
94
+ if (value) return value.slice(0, 50)
95
+ return fallbackAddress ? fallbackAddress.slice(0, 10) : ''
96
+ }
97
+
98
+ function normalizeChannelAvatar(input) {
99
+ const value = String(input || '').trim()
100
+ return value ? value.slice(0, 4096) : ''
101
+ }
102
+
91
103
  function createOfflineSwarm() {
92
104
  return {
93
105
  connections: new Set(),
@@ -1608,7 +1620,7 @@ export class MostBoxEngine extends EventEmitter {
1608
1620
  ...channel,
1609
1621
  members: Array.isArray(channel.members)
1610
1622
  ? channel.members.filter(
1611
- member => normalizeOwnerAddress(member) !== ownerAddress
1623
+ member => normalizeOwnerAddress(member?.address) !== ownerAddress
1612
1624
  )
1613
1625
  : [],
1614
1626
  }))
@@ -1969,14 +1981,16 @@ export class MostBoxEngine extends EventEmitter {
1969
1981
 
1970
1982
  const existing = this.#channels.find(c => c.name === name)
1971
1983
  if (existing) {
1972
- if (ownerAddress && !Array.isArray(existing.members)) {
1973
- existing.members = []
1974
- }
1975
- if (ownerAddress && !existing.members.includes(ownerAddress)) {
1976
- existing.members.push(ownerAddress)
1984
+ if (this.#upsertChannelMember(existing, options)) {
1977
1985
  this.#saveChannelsMetadata()
1978
1986
  }
1979
- return { name: existing.name, key: existing.coreKey }
1987
+ return {
1988
+ name: existing.name,
1989
+ key: existing.coreKey,
1990
+ coreKey: existing.coreKey,
1991
+ createdAt: existing.createdAt,
1992
+ type: existing.type,
1993
+ }
1980
1994
  }
1981
1995
 
1982
1996
  const ns = this.#store.namespace(`channel-${name}`)
@@ -2003,9 +2017,10 @@ export class MostBoxEngine extends EventEmitter {
2003
2017
  createdAt: new Date().toISOString(),
2004
2018
  type: channelType,
2005
2019
  ownerAddress,
2006
- members: ownerAddress ? [ownerAddress] : [],
2020
+ members: [],
2007
2021
  remoteCoreKeys: [],
2008
2022
  }
2023
+ this.#upsertChannelMember(channelInfo, options)
2009
2024
 
2010
2025
  this.#channels.push(channelInfo)
2011
2026
  const coreKeyHex = b4a.toString(core.key, 'hex')
@@ -2022,7 +2037,13 @@ export class MostBoxEngine extends EventEmitter {
2022
2037
  console.log(`[MostBox] Channel created: ${name}`)
2023
2038
  this.emit('channel:joined', { name, key: channelInfo.coreKey })
2024
2039
 
2025
- return { name, key: channelInfo.coreKey }
2040
+ return {
2041
+ name,
2042
+ key: channelInfo.coreKey,
2043
+ coreKey: channelInfo.coreKey,
2044
+ createdAt: channelInfo.createdAt,
2045
+ type: channelInfo.type,
2046
+ }
2026
2047
  }
2027
2048
 
2028
2049
  /**
@@ -2037,11 +2058,7 @@ export class MostBoxEngine extends EventEmitter {
2037
2058
 
2038
2059
  const existing = this.#channels.find(c => c.name === name)
2039
2060
  if (existing) {
2040
- if (ownerAddress && !Array.isArray(existing.members)) {
2041
- existing.members = []
2042
- }
2043
- if (ownerAddress && !existing.members.includes(ownerAddress)) {
2044
- existing.members.push(ownerAddress)
2061
+ if (this.#upsertChannelMember(existing, options)) {
2045
2062
  this.#saveChannelsMetadata()
2046
2063
  }
2047
2064
  if (coreKey && coreKey !== existing.coreKey) {
@@ -2054,7 +2071,13 @@ export class MostBoxEngine extends EventEmitter {
2054
2071
  }
2055
2072
  await this.#openRemoteChannelCore(name, coreKey)
2056
2073
  }
2057
- return { name: existing.name, key: existing.coreKey }
2074
+ return {
2075
+ name: existing.name,
2076
+ key: existing.coreKey,
2077
+ coreKey: existing.coreKey,
2078
+ createdAt: existing.createdAt,
2079
+ type: existing.type,
2080
+ }
2058
2081
  }
2059
2082
 
2060
2083
  if (!coreKey) {
@@ -2090,10 +2113,11 @@ export class MostBoxEngine extends EventEmitter {
2090
2113
  createdAt: new Date().toISOString(),
2091
2114
  type: 'group',
2092
2115
  ownerAddress,
2093
- members: ownerAddress ? [ownerAddress] : [],
2116
+ members: [],
2094
2117
  remoteCoreKeys:
2095
2118
  remoteCoreKeyHex === localCoreKeyHex ? [] : [remoteCoreKeyHex],
2096
2119
  }
2120
+ this.#upsertChannelMember(channelInfo, options)
2097
2121
 
2098
2122
  this.#channels.push(channelInfo)
2099
2123
  if (!this.#channelCores.has(name)) {
@@ -2112,7 +2136,13 @@ export class MostBoxEngine extends EventEmitter {
2112
2136
  console.log(`[MostBox] Joined channel: ${name}`)
2113
2137
  this.emit('channel:joined', { name, key: localCoreKeyHex })
2114
2138
 
2115
- return { name, key: localCoreKeyHex }
2139
+ return {
2140
+ name,
2141
+ key: localCoreKeyHex,
2142
+ coreKey: localCoreKeyHex,
2143
+ createdAt: channelInfo.createdAt,
2144
+ type: channelInfo.type,
2145
+ }
2116
2146
  }
2117
2147
 
2118
2148
  /**
@@ -2132,7 +2162,7 @@ export class MostBoxEngine extends EventEmitter {
2132
2162
  const channel = this.#channels[index]
2133
2163
  if (ownerAddress && Array.isArray(channel.members)) {
2134
2164
  channel.members = channel.members.filter(
2135
- member => normalizeOwnerAddress(member) !== ownerAddress
2165
+ member => normalizeOwnerAddress(member?.address) !== ownerAddress
2136
2166
  )
2137
2167
  if (channel.members.length > 0) {
2138
2168
  this.#saveChannelsMetadata()
@@ -2233,7 +2263,7 @@ export class MostBoxEngine extends EventEmitter {
2233
2263
  return this.#channels
2234
2264
  .filter(c => {
2235
2265
  if (!ownerAddress) return true
2236
- return Array.isArray(c.members) && c.members.includes(ownerAddress)
2266
+ return this.#channelHasMember(c, ownerAddress)
2237
2267
  })
2238
2268
  .filter(c => {
2239
2269
  if (type) return c.type === type
@@ -2250,6 +2280,18 @@ export class MostBoxEngine extends EventEmitter {
2250
2280
  }))
2251
2281
  }
2252
2282
 
2283
+ getChannelMembers(name, options = {}) {
2284
+ this.#ensureInitialized()
2285
+ this.#assertChannelMember(name, options.ownerAddress)
2286
+
2287
+ const channel = this.#channels.find(c => c.name === name)
2288
+ if (!channel) {
2289
+ throw new Error('频道不存在')
2290
+ }
2291
+
2292
+ return this.#getChannelMembers(channel)
2293
+ }
2294
+
2253
2295
  /**
2254
2296
  * 获取频道消息
2255
2297
  * @param {string} name - 频道名
@@ -2320,6 +2362,7 @@ export class MostBoxEngine extends EventEmitter {
2320
2362
  async sendMessage(name, content, author, authorName, options = {}) {
2321
2363
  this.#ensureInitialized()
2322
2364
  this.#assertChannelMember(name, options.ownerAddress)
2365
+ const channel = this.#channels.find(c => c.name === name)
2323
2366
 
2324
2367
  const localKeyHex = this.#channelLocalCoreKey.get(name)
2325
2368
  const coresMap = this.#channelCores.get(name)
@@ -2340,6 +2383,16 @@ export class MostBoxEngine extends EventEmitter {
2340
2383
  if (attachment && trimmed !== attachment.link) {
2341
2384
  throw new ValidationError('attachment content must match link')
2342
2385
  }
2386
+ if (
2387
+ channel &&
2388
+ this.#upsertChannelMember(channel, {
2389
+ ownerAddress: options.ownerAddress,
2390
+ displayName: authorName,
2391
+ avatar: options.avatar,
2392
+ })
2393
+ ) {
2394
+ this.#saveChannelsMetadata()
2395
+ }
2343
2396
 
2344
2397
  const message = {
2345
2398
  type: 'message',
@@ -2429,14 +2482,90 @@ export class MostBoxEngine extends EventEmitter {
2429
2482
  if (!channel) {
2430
2483
  throw new Error('频道不存在')
2431
2484
  }
2432
- if (
2433
- !Array.isArray(channel.members) ||
2434
- !channel.members.includes(normalizedOwner)
2435
- ) {
2485
+ if (!this.#channelHasMember(channel, normalizedOwner)) {
2436
2486
  throw new PermissionError('未加入该频道')
2437
2487
  }
2438
2488
  }
2439
2489
 
2490
+ #channelHasMember(channel, ownerAddress) {
2491
+ const normalizedOwner = normalizeOwnerAddress(ownerAddress)
2492
+ if (!normalizedOwner || !Array.isArray(channel?.members)) return false
2493
+ return channel.members.some(
2494
+ member => normalizeOwnerAddress(member?.address) === normalizedOwner
2495
+ )
2496
+ }
2497
+
2498
+ #upsertChannelMember(channel, options = {}) {
2499
+ const address = normalizeOwnerAddress(options.ownerAddress)
2500
+ if (!address) return false
2501
+
2502
+ if (!Array.isArray(channel.members)) {
2503
+ channel.members = []
2504
+ }
2505
+
2506
+ const displayName = normalizeChannelDisplayName(options.displayName, address)
2507
+ const avatar = normalizeChannelAvatar(options.avatar)
2508
+ const existing = channel.members.find(
2509
+ member => normalizeOwnerAddress(member?.address) === address
2510
+ )
2511
+
2512
+ if (existing) {
2513
+ let changed = false
2514
+ if (existing.address !== address) {
2515
+ existing.address = address
2516
+ changed = true
2517
+ }
2518
+ if (displayName && existing.displayName !== displayName) {
2519
+ existing.displayName = displayName
2520
+ changed = true
2521
+ }
2522
+ if (avatar && existing.avatar !== avatar) {
2523
+ existing.avatar = avatar
2524
+ changed = true
2525
+ }
2526
+ if (!existing.joinedAt) {
2527
+ existing.joinedAt = new Date().toISOString()
2528
+ changed = true
2529
+ }
2530
+ return changed
2531
+ }
2532
+
2533
+ const member = {
2534
+ address,
2535
+ displayName,
2536
+ joinedAt: new Date().toISOString(),
2537
+ }
2538
+ if (avatar) {
2539
+ member.avatar = avatar
2540
+ }
2541
+ channel.members.push(member)
2542
+ return true
2543
+ }
2544
+
2545
+ #getChannelMembers(channel) {
2546
+ const members = Array.isArray(channel?.members) ? channel.members : []
2547
+ return members
2548
+ .map((member, index) => ({
2549
+ address: normalizeOwnerAddress(member?.address),
2550
+ displayName: normalizeChannelDisplayName(
2551
+ member?.displayName,
2552
+ normalizeOwnerAddress(member?.address)
2553
+ ),
2554
+ avatar: normalizeChannelAvatar(member?.avatar),
2555
+ joinedAt: String(member?.joinedAt || ''),
2556
+ _index: index,
2557
+ }))
2558
+ .filter(member => member.address && member.joinedAt)
2559
+ .sort((a, b) => {
2560
+ const timeDiff =
2561
+ new Date(a.joinedAt).getTime() - new Date(b.joinedAt).getTime()
2562
+ return timeDiff || a._index - b._index
2563
+ })
2564
+ .map(({ _index, ...member }) =>
2565
+ member.avatar ? member : { ...member, avatar: undefined }
2566
+ )
2567
+ }
2568
+
2440
2569
  #normalizeChannelMessageForResponse(channelName, message) {
2441
2570
  const attachment = message?.attachment
2442
2571
  if (!attachment?.cid || !attachment.fileName) {
@@ -2667,7 +2796,7 @@ export class MostBoxEngine extends EventEmitter {
2667
2796
  size,
2668
2797
  localPath: record.localPath || null,
2669
2798
  topic: topicHex,
2670
- driveName: record.driveName || driveName,
2799
+ driveName,
2671
2800
  source: record.source || 'manual',
2672
2801
  }
2673
2802
  }
@@ -3053,7 +3182,13 @@ export class MostBoxEngine extends EventEmitter {
3053
3182
  #saveChannelsMetadata() {
3054
3183
  try {
3055
3184
  const metadataPath = this.#getChannelsMetadataPath()
3056
- this.#atomicWrite(metadataPath, JSON.stringify(this.#channels, null, 2))
3185
+ const persistentChannels = this.#channels.filter(
3186
+ channel => !TRANSIENT_CHANNEL_TYPES.has(channel?.type)
3187
+ )
3188
+ this.#atomicWrite(
3189
+ metadataPath,
3190
+ JSON.stringify(persistentChannels, null, 2)
3191
+ )
3057
3192
  } catch (err) {
3058
3193
  console.error('Failed to save channels metadata:', err.message)
3059
3194
  }
@@ -1 +0,0 @@
1
- [data-theme=dark]{--chat-bg-secondary:#1c1c1e99;--chat-bg-tertiary:#2c2c2e66;--chat-border:#ffffff14}.chat-messages{background:0 0;flex-direction:column;flex:1;gap:16px;padding:20px 24px;display:flex;overflow-y:auto}.chat-messages-empty{color:var(--text-muted);flex-direction:column;flex:1;justify-content:center;align-items:center;gap:12px;display:flex}.chat-messages-empty .empty-icon{border-radius:var(--radius-lg);background:var(--glass-bg-subtle);width:64px;height:64px;-webkit-backdrop-filter:var(--blur-md);border:1px solid var(--glass-border);color:var(--text-muted);justify-content:center;align-items:center;display:flex}.chat-messages-empty p{font-size:14px}.chat-message{align-items:flex-start;gap:10px;max-width:70%;animation:.25s fadeIn;display:flex}.chat-message.self{flex-direction:row-reverse;align-self:flex-end}.chat-message.self .msg-content{align-items:flex-end}.chat-message.self .message-bubble{background:linear-gradient(135deg, var(--accent), color-mix(in srgb, var(--accent) 75%, var(--info)));color:#fff;border:1px solid #ffffff1a;border-radius:18px 4px 18px 18px;box-shadow:0 4px 16px #5e6ad240}.chat-message.self .message-author{color:var(--accent)}.chat-message.self .message-time{color:var(--text-muted)}.chat-message.other{align-self:flex-start}.chat-message.other .msg-content{align-items:flex-start}.chat-message.other .message-bubble{background:var(--glass-bg);-webkit-backdrop-filter:var(--blur-md);border:1px solid var(--glass-border);box-shadow:var(--glass-shadow), var(--glass-shadow-inset);border-radius:4px 18px 18px}.chat-message .msg-avatar{flex-shrink:0}.chat-message .msg-content{flex-direction:column;gap:4px;max-width:100%;display:flex}.chat-message .message-author{color:var(--text-muted);font-size:11px;font-weight:500}.chat-message .message-bubble{word-break:break-word;padding:10px 14px;font-size:14px;line-height:1.5}.chat-message .message-bubble.has-attachment{box-shadow:none;color:var(--text-primary);background:0 0;border:none;padding:0}.chat-message .message-time{color:var(--text-muted);opacity:.7;font-size:10px}.chat-message.pending .message-bubble{opacity:.6}.chat-attachment-card{border:1px solid var(--glass-border);border-radius:var(--radius-md);background:var(--glass-bg-heavy);width:min(320px,68vw);min-height:64px;color:var(--text-primary);cursor:pointer;text-align:left;box-shadow:var(--glass-shadow), var(--glass-shadow-inset);transition:all var(--transition-fast);grid-template-columns:42px minmax(0,1fr) 44px;align-items:center;gap:10px;padding:10px;display:grid}.chat-attachment-card:hover:not(:disabled){border-color:var(--accent);transform:translateY(-1px);box-shadow:0 6px 18px #5e6ad229}.chat-attachment-card:disabled{cursor:progress;opacity:.75}.chat-message.self .chat-attachment-card{background:color-mix(in srgb, var(--accent) 12%, var(--glass-bg-heavy));border-color:color-mix(in srgb, var(--accent) 35%, var(--glass-border))}.chat-attachment-icon{border-radius:var(--radius-md);background:var(--accent-soft);width:42px;height:42px;color:var(--accent);justify-content:center;align-items:center;display:flex}.chat-attachment-icon.image{color:var(--success)}.chat-attachment-icon.video{color:var(--danger)}.chat-attachment-icon.audio{color:var(--info)}.chat-attachment-info{flex-direction:column;gap:4px;min-width:0;display:flex}.chat-attachment-name{text-overflow:ellipsis;white-space:nowrap;font-size:13px;font-weight:600;overflow:hidden}.chat-attachment-meta{color:var(--text-muted);font-size:11px}.chat-attachment-action{min-width:0;color:var(--text-secondary);white-space:nowrap;justify-content:center;align-items:center;font-size:12px;display:flex}.chat-attachment-spinner{animation:.8s linear infinite spin}.chat-input-area{border-top:1px solid var(--glass-border);background:var(--glass-bg);-webkit-backdrop-filter:var(--blur-xl);gap:12px;padding:16px 24px;display:flex}.chat-input-area .chat-file-input{display:none}.chat-input-area .chat-tool-btn{border:1px solid var(--glass-border);background:var(--glass-bg-subtle);width:44px;height:44px;color:var(--text-secondary);cursor:pointer;transition:all var(--transition-fast);border-radius:50%;flex-shrink:0;justify-content:center;align-items:center;display:flex}.chat-input-area .chat-tool-btn:hover:not(:disabled){color:var(--accent);border-color:var(--accent);transform:scale(1.05)}.chat-input-area .chat-tool-btn:disabled{opacity:.5;cursor:not-allowed}.chat-input-area .input-pill{flex:1;min-width:0}.chat-input-area .send-btn{border:1px solid var(--glass-border);background:var(--accent);color:#fff;cursor:pointer;width:44px;height:44px;transition:all var(--transition-fast);border-radius:50%;flex-shrink:0;justify-content:center;align-items:center;display:flex}.chat-input-area .send-btn:hover:not(:disabled){background:var(--accent-hover);transform:scale(1.05);box-shadow:0 4px 16px #5e6ad24d}.chat-input-area .send-btn:disabled{opacity:.5;cursor:not-allowed}.chat-welcome{text-align:center;background:0 0;flex-direction:column;flex:1;justify-content:center;align-items:center;padding:40px;display:flex}.chat-welcome .welcome-icon{border-radius:var(--radius-xl);background:var(--glass-bg-heavy);width:80px;height:80px;-webkit-backdrop-filter:var(--blur-2xl);border:1px solid var(--glass-border);color:var(--accent);box-shadow:var(--glass-shadow-lg), var(--glass-shadow-inset);justify-content:center;align-items:center;margin-bottom:20px;display:flex}.chat-welcome h2{margin-bottom:8px;font-size:22px;font-weight:700}.chat-welcome p{color:var(--text-secondary);max-width:320px;font-size:14px;line-height:1.6}.create-channel-btn{border-radius:var(--radius-md);border:1.5px dashed var(--glass-border);background:var(--glass-bg-subtle);color:var(--text-secondary);cursor:pointer;transition:all var(--transition);justify-content:center;align-items:center;gap:6px;margin:8px;padding:10px;font-size:13px;font-weight:500;display:flex}.create-channel-btn:hover{border-color:var(--accent);color:var(--accent);background:var(--accent-soft)}.peer-info{color:var(--text-secondary);align-items:center;gap:8px;font-size:11px;display:flex}.peer-info .peer-dot{background:var(--success);border-radius:50%;width:6px;height:6px}.peer-info .peer-id{font-family:var(--font-mono);text-overflow:ellipsis;white-space:nowrap;flex:1;overflow:hidden}.leave-channel-btn{opacity:0;color:var(--text-muted);cursor:pointer;border-radius:var(--radius-sm);transition:all var(--transition-fast);background:0 0;border:none;justify-content:center;align-items:center;margin-left:auto;padding:4px;display:flex}.sidebar-nav-btn:hover .leave-channel-btn{opacity:1}.leave-channel-btn:hover{color:var(--danger);background:#ff3b301a}.chat-sidebar-overlay{display:none}@media (max-width:768px){.chat-sidebar{z-index:50;transition:left var(--transition);position:fixed;top:0;bottom:0;left:-240px}.chat-sidebar.open{left:0}.chat-sidebar-overlay{z-index:40;opacity:0;pointer-events:none;transition:opacity var(--transition);background:#0006;display:block;position:fixed;inset:0}.chat-sidebar-overlay.visible{opacity:1;pointer-events:auto}.chat-messages{padding:16px}.chat-message{max-width:85%}.chat-input-area{padding:12px 16px}.sidebar-nav-btn .leave-channel-btn{opacity:1}}.channel-detail-overlay{z-index:100;background:#0000004d;justify-content:flex-end;animation:.2s fadeIn;display:flex;position:fixed;inset:0}.channel-detail-drawer{background:var(--glass-bg-heavy);width:320px;max-width:90vw;height:100%;-webkit-backdrop-filter:var(--blur-2xl);border-left:1px solid var(--glass-border);flex-direction:column;animation:.25s slideInRight;display:flex}@keyframes slideInRight{0%{transform:translate(100%)}to{transform:translate(0)}}.channel-detail-header{border-bottom:1px solid var(--glass-border);justify-content:space-between;align-items:center;padding:20px;display:flex}.channel-detail-header h3{margin:0;font-size:16px;font-weight:600}.channel-detail-body{flex-direction:column;flex:1;gap:20px;padding:20px;display:flex;overflow-y:auto}.channel-detail-section{flex-direction:column;gap:8px;display:flex}.channel-detail-label{color:var(--text-muted);text-transform:uppercase;letter-spacing:.5px;align-items:center;gap:6px;font-size:12px;font-weight:500;display:flex}.channel-detail-value{color:var(--text-primary);background:var(--glass-bg-subtle);border-radius:var(--radius-md);border:1px solid var(--glass-border);padding:10px 12px;font-size:14px}.channel-detail-mono{font-family:var(--font-mono);word-break:break-all;font-size:13px}.channel-detail-footer{border-top:1px solid var(--glass-border);padding:20px}.header-right-actions{align-items:center;gap:4px;display:flex}.chat-join-container{flex:1;justify-content:center;align-items:flex-start;min-height:0;padding:24px;display:flex;overflow-y:auto}.chat-join-panel{flex-direction:column;gap:16px;width:100%;max-width:560px;display:flex}.chat-join-helper{border-radius:var(--radius-lg);background:var(--glass-bg);-webkit-backdrop-filter:var(--blur-md);border:1px solid var(--glass-border);flex-direction:column;gap:14px;padding:24px;display:flex}.chat-join-helper-title{color:var(--accent);align-items:center;gap:8px;display:flex}.chat-join-helper-title h3{color:var(--text-primary);margin:0;font-size:16px;font-weight:600}.chat-join-public-key{border-radius:var(--radius-md);background:var(--glass-bg-subtle);border:1px solid var(--glass-border);color:var(--text-primary);font-family:var(--font-mono);overflow-wrap:anywhere;padding:12px;font-size:13px;line-height:1.5;display:block}.chat-join-spec{border-radius:var(--radius-lg);background:var(--glass-bg);-webkit-backdrop-filter:var(--blur-md);border:1px solid var(--glass-border);flex-direction:column;gap:14px;padding:24px;display:flex}.chat-join-field-list{flex-direction:column;gap:10px;display:flex}.chat-join-field{border-radius:var(--radius-md);background:var(--glass-bg-subtle);border:1px solid var(--glass-border);flex-direction:column;gap:6px;padding:12px;display:flex}.chat-join-field p{color:var(--text-secondary);margin:0;font-size:13px;line-height:1.5}.chat-join-field-meta{color:var(--text-muted);flex-wrap:wrap;align-items:center;gap:8px;font-size:12px;display:flex}.chat-join-field-name{color:var(--text-primary);font-family:var(--font-mono);overflow-wrap:anywhere;font-size:13px}.chat-join-loading,.chat-join-error,.chat-join-success{border-radius:var(--radius-lg);background:var(--glass-bg);-webkit-backdrop-filter:var(--blur-md);border:1px solid var(--glass-border);text-align:center;flex-direction:column;align-items:center;gap:16px;width:100%;padding:48px;display:flex}:is(.chat-join-loading,.chat-join-error,.chat-join-success) p{color:var(--text-secondary);margin:0;font-size:16px}.chat-join-loading{color:var(--accent)}.chat-join-error{color:var(--danger)}.chat-join-success{color:var(--success)}.chat-join-status{color:var(--text-muted);font-size:13px}.chat-join-result{border-radius:var(--radius-md);background:var(--glass-bg-subtle);border:1px solid var(--glass-border);font-family:var(--font-mono);color:var(--text-primary);white-space:pre-wrap;word-break:break-all;text-align:left;width:100%;max-height:240px;margin-top:16px;padding:16px;font-size:13px;overflow-y:auto}
@@ -1 +0,0 @@
1
- (globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,95057,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={formatUrl:function(){return l},formatWithValidation:function(){return c},urlObjectKeys:function(){return o}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let s=e.r(90809)._(e.r(98183)),i=/https?|ftp|gopher|file/;function l(e){let{auth:t,hostname:r}=e,n=e.protocol||"",a=e.pathname||"",l=e.hash||"",o=e.query||"",c=!1;t=t?encodeURIComponent(t).replace(/%3A/i,":")+"@":"",e.host?c=t+e.host:r&&(c=t+(~r.indexOf(":")?`[${r}]`:r),e.port&&(c+=":"+e.port)),o&&"object"==typeof o&&(o=String(s.urlQueryToSearchParams(o)));let u=e.search||o&&`?${o}`||"";return n&&!n.endsWith(":")&&(n+=":"),e.slashes||(!n||i.test(n))&&!1!==c?(c="//"+(c||""),a&&"/"!==a[0]&&(a="/"+a)):c||(c=""),l&&"#"!==l[0]&&(l="#"+l),u&&"?"!==u[0]&&(u="?"+u),a=a.replace(/[?#]/g,encodeURIComponent),u=u.replace("#","%23"),`${n}${c}${a}${u}${l}`}let o=["auth","hash","host","hostname","href","path","pathname","port","protocol","query","search","slashes"];function c(e){return l(e)}},18581,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"useMergedRef",{enumerable:!0,get:function(){return a}});let n=e.r(71645);function a(e,t){let r=(0,n.useRef)(null),a=(0,n.useRef)(null);return(0,n.useCallback)(n=>{if(null===n){let e=r.current;e&&(r.current=null,e());let t=a.current;t&&(a.current=null,t())}else e&&(r.current=s(e,n)),t&&(a.current=s(t,n))},[e,t])}function s(e,t){if("function"!=typeof e)return e.current=t,()=>{e.current=null};{let r=e(t);return"function"==typeof r?r:()=>e(null)}}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},73668,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"isLocalURL",{enumerable:!0,get:function(){return s}});let n=e.r(18967),a=e.r(52817);function s(e){if(!(0,n.isAbsoluteUrl)(e))return!0;try{let t=(0,n.getLocationOrigin)(),r=new URL(e,t);return r.origin===t&&(0,a.hasBasePath)(r.pathname)}catch(e){return!1}}},84508,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"errorOnce",{enumerable:!0,get:function(){return n}});let n=e=>{}},22016,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={default:function(){return g},useLinkStatus:function(){return j}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let s=e.r(90809),i=e.r(18050),l=s._(e.r(71645)),o=e.r(95057),c=e.r(8372),u=e.r(18581),d=e.r(18967),h=e.r(5550);e.r(33525);let p=e.r(88540),f=e.r(91949),m=e.r(73668),y=e.r(9396);function g(t){var r,n;let a,s,g,[j,v]=(0,l.useOptimistic)(f.IDLE_LINK_STATUS),x=(0,l.useRef)(null),{href:k,as:w,children:C,prefetch:S=null,passHref:N,replace:M,shallow:A,scroll:I,onClick:$,onMouseEnter:E,onTouchStart:z,legacyBehavior:R=!1,onNavigate:P,transitionTypes:L,ref:_,unstable_dynamicOnHover:O,...T}=t;a=C,R&&("string"==typeof a||"number"==typeof a)&&(a=(0,i.jsx)("a",{children:a}));let U=l.default.useContext(c.AppRouterContext),K=!1!==S,D=!1!==S?null===(n=S)||"auto"===n?y.FetchStrategy.PPR:y.FetchStrategy.Full:y.FetchStrategy.PPR,B="string"==typeof(r=w||k)?r:(0,o.formatUrl)(r);if(R){if(a?.$$typeof===Symbol.for("react.lazy"))throw Object.defineProperty(Error("`<Link legacyBehavior>` received a direct child that is either a Server Component, or JSX that was loaded with React.lazy(). This is not supported. Either remove legacyBehavior, or make the direct child a Client Component that renders the Link's `<a>` tag."),"__NEXT_ERROR_CODE",{value:"E863",enumerable:!1,configurable:!0});s=l.default.Children.only(a)}let V=R?s&&"object"==typeof s&&s.ref:_,q=l.default.useCallback(e=>(null!==U&&(x.current=(0,f.mountLinkInstance)(e,B,U,D,K,v)),()=>{x.current&&((0,f.unmountLinkForCurrentNavigation)(x.current),x.current=null),(0,f.unmountPrefetchableInstance)(e)}),[K,B,U,D,v]),G={ref:(0,u.useMergedRef)(q,V),onClick(t){R||"function"!=typeof $||$(t),R&&s.props&&"function"==typeof s.props.onClick&&s.props.onClick(t),!U||t.defaultPrevented||function(t,r,n,a,s,i,o){if("u">typeof window){let c,{nodeName:u}=t.currentTarget;if("A"===u.toUpperCase()&&((c=t.currentTarget.getAttribute("target"))&&"_self"!==c||t.metaKey||t.ctrlKey||t.shiftKey||t.altKey||t.nativeEvent&&2===t.nativeEvent.which)||t.currentTarget.hasAttribute("download"))return;if(!(0,m.isLocalURL)(r)){a&&(t.preventDefault(),location.replace(r));return}if(t.preventDefault(),i){let e=!1;if(i({preventDefault:()=>{e=!0}}),e)return}let{dispatchNavigateAction:d}=e.r(99781);l.default.startTransition(()=>{d(r,a?"replace":"push",!1===s?p.ScrollBehavior.NoScroll:p.ScrollBehavior.Default,n.current,o)})}}(t,B,x,M,I,P,L)},onMouseEnter(e){R||"function"!=typeof E||E(e),R&&s.props&&"function"==typeof s.props.onMouseEnter&&s.props.onMouseEnter(e),U&&K&&(0,f.onNavigationIntent)(e.currentTarget,!0===O)},onTouchStart:function(e){R||"function"!=typeof z||z(e),R&&s.props&&"function"==typeof s.props.onTouchStart&&s.props.onTouchStart(e),U&&K&&(0,f.onNavigationIntent)(e.currentTarget,!0===O)}};return(0,d.isAbsoluteUrl)(B)?G.href=B:R&&!N&&("a"!==s.type||"href"in s.props)||(G.href=(0,h.addBasePath)(B)),g=R?l.default.cloneElement(s,G):(0,i.jsx)("a",{...T,...G,children:a}),(0,i.jsx)(b.Provider,{value:j,children:g})}e.r(84508);let b=(0,l.createContext)(f.IDLE_LINK_STATUS),j=()=>(0,l.useContext)(b);("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},8734,e=>{"use strict";let t=(0,e.i(56420).default)("copy",[["rect",{width:"14",height:"14",x:"8",y:"8",rx:"2",ry:"2",key:"17jyea"}],["path",{d:"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2",key:"zix9uf"}]]);e.s(["Copy",0,t],8734)},96699,e=>{"use strict";let t=(0,e.i(56420).default)("moon",[["path",{d:"M20.985 12.486a9 9 0 1 1-9.473-9.472c.405-.022.617.46.402.803a6 6 0 0 0 8.268 8.268c.344-.215.825-.004.803.401",key:"kfwtm"}]]);e.s(["Moon",0,t],96699)},35965,e=>{"use strict";let t=(0,e.i(56420).default)("sun",[["circle",{cx:"12",cy:"12",r:"4",key:"4exip2"}],["path",{d:"M12 2v2",key:"tus03m"}],["path",{d:"M12 20v2",key:"1lh1kg"}],["path",{d:"m4.93 4.93 1.41 1.41",key:"149t6j"}],["path",{d:"m17.66 17.66 1.41 1.41",key:"ptbguv"}],["path",{d:"M2 12h2",key:"1t8f8n"}],["path",{d:"M20 12h2",key:"1q8mjw"}],["path",{d:"m6.34 17.66-1.41 1.41",key:"1m8zz5"}],["path",{d:"m19.07 4.93-1.41 1.41",key:"1shlcs"}]]);e.s(["Sun",0,t],35965)},11241,e=>{"use strict";let t=(0,e.i(56420).default)("arrow-left",[["path",{d:"m12 19-7-7 7-7",key:"1l729n"}],["path",{d:"M19 12H5",key:"x3x0zl"}]]);e.s(["ArrowLeft",0,t],11241)},59665,5142,e=>{"use strict";var t=e.i(18050),r=e.i(71645);let n=(0,e.i(56420).default)("menu",[["path",{d:"M4 5h16",key:"1tepv9"}],["path",{d:"M4 12h16",key:"1lakjw"}],["path",{d:"M4 19h16",key:"1djgab"}]]);function a(e=!1,t={}){let[n,s]=(0,r.useState)(e),i=(0,r.useCallback)(()=>{s(e=>e||(t.onOpen?.(),!0))},[t.onOpen]),l=(0,r.useCallback)(()=>{s(e=>e?(t.onClose?.(),!1):e)},[t.onClose]);return[n,{open:i,close:l,toggle:(0,r.useCallback)(()=>{n?l():i()},[l,i,n]),set:s}]}e.s(["useDisclosure",0,a],5142);let s=(0,r.createContext)(null);e.s(["default",0,function({sidebar:e,headerTitle:i,headerRight:l,children:o}){let[c,u]=a(!1),[d,h]=(0,r.useState)(!1),p=function(e,{getInitialValueInEffect:t}={getInitialValueInEffect:!0}){let[n,a]=(0,r.useState)(t?void 0:!!("u">typeof window&&"matchMedia"in window)&&window.matchMedia(e).matches);return(0,r.useEffect)(()=>{try{if("matchMedia"in window){let t=window.matchMedia(e);a(t.matches);let r=e=>a(e.matches);return t.addEventListener("change",r),()=>{t.removeEventListener("change",r)}}}catch(e){return}},[e]),n||!1}("(max-width: 768px)"),f=()=>{p?u.open():h(!1)};return(0,t.jsx)(s.Provider,{value:{closeSidebar:u.close,openSidebar:f,isSidebarVisible:p?c:!d},children:(0,t.jsxs)("div",{className:"app-layout",children:[(0,t.jsx)("div",{className:`sidebar-overlay ${c?"visible":""}`,onClick:()=>u.close()}),(0,t.jsx)("div",{className:`sidebar ${c?"open":""} ${d?"collapsed":""}`,children:e({closeSidebar:u.close,openSidebar:f})}),(0,t.jsxs)("div",{className:"main-content",children:[(0,t.jsxs)("header",{className:"app-header",children:[(0,t.jsxs)("div",{className:"header-left",children:[(0,t.jsx)("button",{onClick:()=>{p?u.toggle():h(!d)},className:"btn btn-icon sidebar-toggle-btn","aria-label":p?"打开菜单":d?"展开侧边栏":"收起侧边栏",children:(0,t.jsx)(n,{size:16})}),i]}),(0,t.jsx)("div",{className:"header-right",children:l})]}),o]})]})})},"useAppShell",0,function(){let e=(0,r.useContext)(s);if(!e)throw Error("useAppShell must be used within AppShell");return e}],59665)},27648,e=>{"use strict";var t=e.i(18050),r=e.i(93957),n=e.i(71192);e.s(["default",0,function({className:e=""}){let a=(0,n.useUserStore)(e=>e.identity),s=(0,n.useUserStore)(e=>e.openLoginModal),i=(0,n.useUserStore)(e=>e.logoutUser);return(0,t.jsxs)("div",{className:`chat-sidebar-footer sidebar-account ${e}`,children:[(0,t.jsxs)("div",{className:"user-info",children:[(0,t.jsx)("img",{className:"user-avatar-img",src:(0,r.generateAvatar)(a?.address,a?.avatar),alt:"avatar"}),(0,t.jsx)("span",{className:"user-name",title:a?.address,children:a?.displayName||"未登录"})]}),a?(0,t.jsx)("button",{className:"btn btn-ghost logout-btn",onClick:i,children:"退出"}):(0,t.jsx)("button",{className:"btn btn-primary login-btn",onClick:s,children:"登录"})]})}])},87884,e=>{"use strict";var t=e.i(26913);e.s(["channelApi",0,{getChannels(e={}){let r=new URLSearchParams;e.type&&r.set("type",e.type),e.excludeType&&r.set("excludeType",e.excludeType);let n=r.toString();return t.api.get(n?`/api/channels?${n}`:"/api/channels").json()},createChannel:(e,r="personal")=>t.api.post("/api/channels",{json:{name:e,type:r}}).json(),leaveChannel:e=>t.api.delete(`/api/channels/${encodeURIComponent(e)}`).json(),getChannelMessages:(e,r=100,n=0)=>t.api.get(`/api/channels/${encodeURIComponent(e)}/messages?limit=${r}&offset=${n}`).json(),sendChannelMessage:({channelName:e,content:r,author:n,authorName:a,attachment:s})=>t.api.post(`/api/channels/${encodeURIComponent(e)}/messages`,{json:s?{content:r,author:n,authorName:a,attachment:s}:{content:r,author:n,authorName:a}}).json(),getChannelPeers:e=>t.api.get(`/api/channels/${encodeURIComponent(e)}/peers`).json(),setChannelRemark:(e,r)=>t.api.put(`/api/channels/${encodeURIComponent(e)}/remark`,{json:{remark:r}}).json()}])},23952,e=>{"use strict";var t=e.i(71645),r=e.i(87884),n=e.i(26913);function a(e){return String(e.id||`${e.author||""}-${e.timestamp||""}-${e.content||""}`)}e.s(["useChannelMessages",0,function({isReady:e,enabled:s=!0,channelName:i="",peerId:l="",waitForPeerId:o=!1,limit:c=100,reconnectBaseDelay:u=2500,acceptMessage:d,getMessageKey:h=a,onSyncError:p,onSocketEvent:f}){let[m,y]=(0,t.useState)([]),[g,b]=(0,t.useState)(!1),j=(0,t.useRef)(null),v=(0,t.useRef)(i),x=(0,t.useRef)(null),k=(0,t.useRef)(0),w=(0,t.useRef)(d),C=(0,t.useRef)(h),S=(0,t.useRef)(f),N=(0,t.useRef)(p),M=(0,t.useRef)(l);(0,t.useEffect)(()=>{w.current=d},[d]),(0,t.useEffect)(()=>{C.current=h},[h]),(0,t.useEffect)(()=>{S.current=f},[f]),(0,t.useEffect)(()=>{N.current=p},[p]);let A=(0,t.useCallback)(e=>{let t=w.current;return t?e.filter(t):e},[]),I=(0,t.useCallback)((e,t,r=!0)=>{let n=[...e];for(let e of A(t)){let t=C.current(e);if(r){let r=n.findIndex(t=>t.pending&&t.author?.toLowerCase()===e.author?.toLowerCase()&&t.content===e.content);if(-1!==r){n[r]={...e,id:e.id||t};continue}}n.some(e=>C.current(e)===t)||n.push({...e,id:e.id||t})}return n},[A]),$=(0,t.useCallback)((e,t)=>{j.current?.readyState===WebSocket.OPEN&&j.current.send(JSON.stringify({event:e,data:t}))},[]),E=(0,t.useCallback)(e=>{e&&$("channel:subscribe",{channel:e})},[$]),z=(0,t.useCallback)(e=>{e&&$("channel:unsubscribe",{channel:e})},[$]),R=(0,t.useCallback)(async(t=v.current,n={})=>{if(!t||!e)return[];try{let e=A(await r.channelApi.getChannelMessages(t,c));return y(t=>n.replace?e:I(t,e,!1)),e}catch(e){return n.replace&&y([]),await N.current?.(e),[]}},[A,e,c,I]);(0,t.useEffect)(()=>{M.current=l,l&&($("register",{peerId:l}),o&&v.current&&(E(v.current),R(v.current,{replace:!0})))},[l,E,R,o,$]);let P=(0,t.useCallback)(()=>{y([])},[]),L=(0,t.useCallback)(async({channelName:e=v.current,content:t,author:n,authorName:a,attachment:s,optimisticId:i})=>{let l=t.trim();if(!e||!l)return null;let o={id:i||`${n}-${Date.now()}-${Math.random().toString(36).slice(2)}`,author:n,authorName:a,content:l,timestamp:Date.now(),pending:!0,attachment:s};y(e=>[...e,o]);try{let t=await r.channelApi.sendChannelMessage({channelName:e,content:l,author:n,authorName:a,attachment:s});return y(e=>e.map(e=>e.id===o.id?{...t.message,id:t.message.id||C.current(t.message)}:e)),t.message}catch(e){throw y(e=>e.filter(e=>e.id!==o.id)),e}},[]);return(0,t.useEffect)(()=>{let t=v.current;if(v.current=i,t&&t!==i&&z(t),i&&e&&s)return R(i,{replace:!0}),(!o||M.current)&&E(i),()=>z(i)},[i,s,e,E,R,z,o]),(0,t.useEffect)(()=>{if(!e||!s)return void b(!1);let t=!1;async function r(){let e=new WebSocket(await (0,n.getAuthenticatedWebSocketUrl)("/ws"));t?e.close():(e.onopen=()=>{b(!0),k.current=0,M.current&&e.send(JSON.stringify({event:"register",data:{peerId:M.current}})),v.current&&(!o||M.current)&&(E(v.current),R(v.current,{replace:!0}))},e.onmessage=e=>{try{let t=JSON.parse(e.data);S.current?.(t.event,t.data),"channel:message"===t.event&&t.data?.channel===v.current&&t.data?.message&&y(e=>I(e,[t.data.message]))}catch{}},e.onclose=()=>{if(b(!1),t)return;let e=k.current;if(e>=20)return;let n=Math.min(u*Math.pow(2,e),3e4);k.current=e+1,x.current=setTimeout(r,n)},e.onerror=()=>e.close(),j.current=e)}return k.current=0,r(),()=>{t=!0,x.current&&clearTimeout(x.current),j.current?.close(),j.current=null}},[s,e,I,u,E,R,o]),{clearMessages:P,connected:g,messages:m,sendMessage:L,setMessages:y,syncMessages:R}}])},21357,e=>{"use strict";let t=(0,e.i(56420).default)("play",[["path",{d:"M5 5a2 2 0 0 1 3.008-1.728l11.997 6.998a2 2 0 0 1 .003 3.458l-12 7A2 2 0 0 1 5 19z",key:"10ikf1"}]]);e.s(["Play",0,t],21357)},53881,53751,99591,34471,e=>{"use strict";var t=e.i(18050),r=e.i(22016),n=e.i(11241),a=e.i(56420);let s=(0,a.default)("spade",[["path",{d:"M12 18v4",key:"jadmvz"}],["path",{d:"M2 14.499a5.5 5.5 0 0 0 9.591 3.675.6.6 0 0 1 .818.001A5.5 5.5 0 0 0 22 14.5c0-2.29-1.5-4-3-5.5l-5.492-5.312a2 2 0 0 0-3-.02L5 8.999c-1.5 1.5-3 3.2-3 5.5",key:"1aw2pz"}]]);e.s(["Spade",0,s],53751);let i=(0,a.default)("swords",[["polyline",{points:"14.5 17.5 3 6 3 3 6 3 17.5 14.5",key:"1hfsw2"}],["line",{x1:"13",x2:"19",y1:"19",y2:"13",key:"1vrmhu"}],["line",{x1:"16",x2:"20",y1:"16",y2:"20",key:"1bron3"}],["line",{x1:"19",x2:"21",y1:"21",y2:"19",key:"13pww6"}],["polyline",{points:"14.5 6.5 18 3 21 3 21 6 17.5 9.5",key:"hbey2j"}],["line",{x1:"5",x2:"9",y1:"14",y2:"18",key:"1hf58s"}],["line",{x1:"7",x2:"4",y1:"17",y2:"20",key:"pidxm4"}],["line",{x1:"3",x2:"5",y1:"19",y2:"21",key:"1pehsh"}]]);var l=e.i(27648);let o=[{id:"gandengyan",label:"干瞪眼",href:"/game/gandengyan/",icon:(0,t.jsx)(i,{size:16})},{id:"zhajinhua",label:"炸金花",href:"/game/zhajinhua/",icon:(0,t.jsx)(s,{size:16})}];e.s(["default",0,function({activeGame:e,closeSidebar:a}){return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsxs)(r.default,{href:"/",className:"sidebar-header sidebar-header-link",children:[(0,t.jsx)(n.ArrowLeft,{size:18}),(0,t.jsx)("h1",{children:"MOST PEOPLE"})]}),(0,t.jsx)("nav",{className:"sidebar-nav",children:o.map(n=>(0,t.jsxs)(r.default,{href:n.href,className:`sidebar-nav-btn ${e===n.id?"active":""}`,onClick:a,children:[n.icon,(0,t.jsx)("span",{children:n.label})]},n.id))}),(0,t.jsx)(l.default,{})]})}],53881);var c=e.i(71645);let u="game",d="mostbox.game.event",h=["gandengyan","zhajinhua"],p="ABCDEFGHJKLMNPQRSTUVWXYZ23456789";function f(e){let t=String(e||"").trim().toLowerCase();return h.includes(t)?t:""}function m(e){return String(e||"").trim().toUpperCase().replace(/[^A-Z0-9]/g,"").slice(0,8)}function y(e){return/^[A-Z0-9]{4,8}$/.test(String(e||""))}function g(){let e="";for(let t=0;t<6;t++)e+=p[function(e){if(globalThis.crypto?.getRandomValues){let t=new Uint32Array(1);return globalThis.crypto.getRandomValues(t),t[0]%e}return Math.floor(Math.random()*e)}(p.length)];return e}function b(e,t){let r=f(e),n=m(t);return r&&y(n)?`game-${r}-${n.toLowerCase()}`:""}function j({gameId:e,roomCode:t,event:r,payload:n}){var a;let s=f(e);return{kind:d,version:1,gameId:s,roomCode:m(t),event:String(r||""),eventId:(a=s||"game",`${a}_${Date.now()}_${function(){let e=new Uint8Array(4);if(globalThis.crypto?.getRandomValues)globalThis.crypto.getRandomValues(e);else for(let t=0;t<e.length;t++)e[t]=Math.floor(256*Math.random());return[...e].map(e=>e.toString(16).padStart(2,"0")).join("")}()}`),payload:n||{}}}function v(e,t={}){try{let r=JSON.parse(String(e||""));if(!r||r.kind!==d||1!==r.version||"string"!=typeof r.event||"string"!=typeof r.eventId)return null;let n=f(r.gameId),a=m(r.roomCode);if(!n||!y(a)||t.gameId&&n!==f(t.gameId)||t.roomCode&&a!==m(t.roomCode))return null;return{...r,gameId:n,roomCode:a,payload:r.payload&&"object"==typeof r.payload?r.payload:{}}}catch{return null}}function x(e,t){var r;if(!e||"object"!=typeof e)return null;let n=k(e.address||t);if(!n||k(t)!==n)return null;let a=String(e.name||"").trim().slice(0,50)||((r=n)?`${r.slice(0,6)}...${r.slice(-4)}`:"");return{address:n,name:a,publicKey:String(e.publicKey||"").trim(),joinedAt:Number(e.joinedAt||Date.now())}}function k(e){let t=String(e||"").trim();return/^0x[a-fA-F0-9]{40}$/.test(t)?t.toLowerCase():""}function w(e,t,r){let n=t.get(r.address);n?Object.assign(n,r):(e.push(r),t.set(r.address,r))}function C(e){return[...e].sort((e,t)=>Number(e.timestamp||0)-Number(t.timestamp||0))}e.s(["GAME_CHANNEL_TYPE",0,u,"createGameEvent",0,j,"createGameRoomCode",0,g,"deriveGameRoomLobby",0,function(e=[],t={}){let r=[],n=new Map,a="";for(let s of C(e)){let e=v(s.content,t);if(e){if("room:create"===e.event){let t=x(e.payload?.player,s.author);if(!t)continue;a||(a=t.address),w(r,n,t);continue}if("player:join"===e.event){let t=x(e.payload?.player,s.author);t&&w(r,n,t)}}}return{gameId:f(t.gameId),roomCode:m(t.roomCode),hostAddress:a,players:r}},"gameRoomCodeToChannelName",0,b,"getLatestGameState",0,function(e=[],t={}){let r=null;for(let n of C(e)){let e=v(n.content,t);if(!e||"room:state"!==e.event)continue;let a=Number(e.payload?.seq||0);(!r||a>=Number(r.payload?.seq||0))&&(r=e)}return r},"normalizeGameRoomCode",0,m,"parseGameEvent",0,v],99591);var S=e.i(87884),N=e.i(23952),M=e.i(26913),A=e.i(3593),I=e.i(71192);async function $(e,t,r,n,a,s){let i=j({gameId:r,roomCode:n,event:a,payload:s});await S.channelApi.sendChannelMessage({channelName:e,content:JSON.stringify(i),author:t.address,authorName:E(t)})}function E(e){return e.displayName||e.username}e.s(["useGameRoom",0,function({gameId:e,onError:t,getPlayerPayload:r}){let n=(0,A.useAppStore)(e=>e.hasBackend),a=(0,A.useAppStore)(e=>e.checkBackend),s=(0,A.useAppStore)(e=>e.openConnectModal),i=(0,I.useUserStore)(e=>e.identity),l=(0,I.useUserStore)(e=>e.openLoginModal),[o,d]=(0,c.useState)(""),[h,p]=(0,c.useState)(""),[f,y]=(0,c.useState)(!1),x=!0===n,k=(0,c.useCallback)(async(e,r)=>{let n=await (0,M.getApiErrorMessage)(e,r);t&&t(n)},[t]),w=(0,c.useCallback)(t=>!!v(t.content,{gameId:e,roomCode:o}),[e,o]),C=(0,c.useCallback)(t=>{let r=v(t.content,{gameId:e,roomCode:o});return r?`${t.author}-${r.eventId}`:`${t.author}-${t.timestamp}-${t.content}`},[e,o]),{clearMessages:z,connected:R,messages:P,sendMessage:L,syncMessages:_}=(0,N.useChannelMessages)({isReady:x,enabled:!!i,channelName:h,limit:500,acceptMessage:w,getMessageKey:C,onSyncError:e=>k(e,"无法读取房间记录")}),O=(0,c.useMemo)(()=>P.map(t=>({message:t,event:v(t.content,{gameId:e,roomCode:o})})).filter(e=>e.event),[e,P,o]),T=(0,c.useCallback)(()=>i?!!x||(s(),!1):(l(),!1),[x,s,l,i]);(0,c.useEffect)(()=>{null===n&&a()},[a,n]);let U=(0,c.useCallback)(async(n,a=!1)=>{if(!T()||!i)return!1;let s=a?g():m(n),l=b(e,s);if(!l)return t&&t("请输入 4-8 位房间码"),!1;y(!0);try{var o;return await S.channelApi.createChannel(l,u),await $(l,i,e,s,a?"room:create":"player:join",{player:r?r(i):{address:(o=i).address,name:E(o),publicKey:"",joinedAt:Date.now()}}),d(s),p(l),z(),!0}catch(e){return await k(e,a?"创建房间失败":"进入房间失败"),!1}finally{y(!1)}},[T,e,r,t,k,z,i]),K=(0,c.useCallback)(()=>U("",!0),[U]),D=(0,c.useCallback)(e=>U(e),[U]),B=(0,c.useCallback)(async(t,r={})=>{if(!T()||!i||!h||!o)return!1;let n=j({gameId:e,roomCode:o,event:t,payload:r}),a=JSON.stringify(n);try{return await L({channelName:h,content:a,author:i.address,authorName:E(i),optimisticId:`${i.address}-${n.eventId}`}),!0}catch(e){return await k(e,"发送房间事件失败"),!1}},[h,T,e,k,o,L,i]);return{channelName:h,connected:R,createRoom:K,ensureReady:T,isBackendReady:x,joinRoom:D,joining:f,messages:P,roomCode:o,roomEvents:O,sendRoomEvent:B,setRoomCode:d,syncMessages:_,userIdentity:i}}],34471)},39307,e=>{"use strict";var t=e.i(18050),r=e.i(71645),n=e.i(8734),a=e.i(72382),s=e.i(96699),i=e.i(21357);let l=(0,e.i(56420).default)("refresh-ccw",[["path",{d:"M21 12a9 9 0 0 0-9-9 9.75 9.75 0 0 0-6.74 2.74L3 8",key:"14sxne"}],["path",{d:"M3 3v5h5",key:"1xhq8a"}],["path",{d:"M3 12a9 9 0 0 0 9 9 9.75 9.75 0 0 0 6.74-2.74L21 16",key:"1hlbsb"}],["path",{d:"M16 16h5v5",key:"ccwih5"}]]);var o=e.i(53751),c=e.i(35965),u=e.i(59665),d=e.i(53881),h=e.i(34471),p=e.i(3593),f=e.i(71192);let m=[10,20,50,100],y=["2","3","4","5","6","7","8","9","10","J","Q","K","A"],g=["D","C","H","S"],b=new Map(y.map((e,t)=>[e,t+2])),j=new Map(g.map((e,t)=>[e,t+1])),v={1:"散牌",2:"对子",3:"顺子",4:"金花",5:"顺金",6:"豹子"};function x(e){return String(e||"").trim().toUpperCase().replace(/[^A-Z0-9]/g,"").slice(0,8)}function k(e="zhajinhua"){return`${e}_${Date.now()}_${function(){let e=new Uint8Array(4);if(globalThis.crypto?.getRandomValues)globalThis.crypto.getRandomValues(e);else for(let t=0;t<e.length;t++)e[t]=Math.floor(256*Math.random());return[...e].map(e=>e.toString(16).padStart(2,"0")).join("")}()}`}function w(){let e=[];for(let t of g)for(let r of y)e.push(`${r}${t}`);return e}function C(e){let t=String(e||"").trim().toUpperCase(),r=t.slice(-1),n=t.slice(0,-1);if(!b.has(n)||!j.has(r))throw Error(`Invalid card: ${e}`);return{id:`${n}${r}`,rank:n,suit:r,rankValue:b.get(n),suitValue:j.get(r)}}function S(e){let t;if(!Array.isArray(e)||3!==e.length)throw Error("炸金花手牌必须是 3 张牌");let r=e.map(C),n=r.map(e=>e.rankValue),a=new Map;for(let e of n)a.set(e,(a.get(e)||0)+1);let s=1===new Set(r.map(e=>e.suit)).size,i=3!==(t=[...new Set(n)].sort((e,t)=>e-t)).length?0:2===t[0]&&3===t[1]&&14===t[2]?3:t[0]+1===t[1]&&t[1]+1===t[2]?t[2]:0,l=[...n].sort((e,t)=>t-e),o=Math.max(...r.map(e=>e.suitValue)),c=1,u=l;return 1===a.size?(c=6,u=[l[0]]):i&&s?(c=5,u=[i]):s?(c=4,u=l):i?(c=3,u=[i]):2===a.size&&(c=2,u=[[...a.entries()].find(([,e])=>2===e)[0],[...a.entries()].find(([,e])=>1===e)[0]]),{category:c,label:v[c],tiebreakers:u,tieSuit:o,cards:r.map(e=>e.id)}}function N(e){return e&&"object"==typeof e&&e.roundId&&Array.isArray(e.players)?{roomCode:x(e.roomCode),roundId:String(e.roundId),status:"finished"===e.status?"finished":"playing",host:R(e.host),seq:Number(e.seq)||1,startedAt:Number(e.startedAt)||Date.now(),ante:Number(e.ante)||10,pot:Math.max(0,Number(e.pot)||0),currentBet:Math.max(0,Number(e.currentBet)||10),turnAddress:R(e.turnAddress),players:e.players.map(z).filter(Boolean),lastAction:String(e.lastAction||""),winner:e.winner?R(e.winner):null,showdown:e.showdown&&"object"==typeof e.showdown?P(e.showdown):null,appliedEventIds:Array.isArray(e.appliedEventIds)?e.appliedEventIds.map(String):[]}:null}function M(e,t,r){let n=N(e);if(!n||"playing"!==n.status)return{ok:!1,error:"当前没有进行中的牌局"};let a=R(r),s=n.players.find(e=>e.address===a);if(!s||"active"!==s.status)return{ok:!1,error:"玩家不在本轮牌局中"};if(n.turnAddress!==a)return{ok:!1,error:"还没有轮到你操作"};let i=t?.action;if(!["look","call","raise","compare","fold"].includes(i))return{ok:!1,error:"未知操作"};if("look"===i)return s.looked?{ok:!1,error:"已经看过牌"}:{ok:!0};if("call"===i){let e=Math.max(0,n.currentBet-s.bet);return s.chips>=e?{ok:!0}:{ok:!1,error:"筹码不足,不能跟注"}}if("raise"===i){let e=Number(t.amount);if(!m.includes(e))return{ok:!1,error:"加注档位无效"};let r=n.currentBet+e-s.bet;return s.chips>=r?{ok:!0}:{ok:!1,error:"筹码不足,不能加注"}}if("compare"===i){let e=R(t.target),r=n.players.find(t=>t.address===e);if(!e||e===a||!r||"active"!==r.status)return{ok:!1,error:"请选择有效的比牌对象"};let i=Math.max(0,n.currentBet-s.bet);return s.chips>=i?{ok:!0}:{ok:!1,error:"筹码不足,不能比牌"}}return{ok:!0}}function A(e){return(e?.players||[]).filter(e=>"active"===e.status)}function I(e,t){let r=Math.max(0,e.currentBet-t.bet);t.chips-=r,t.bet+=r,e.pot+=r}function $(e,t){var r,n;let a,s=A(e);return 1===s.length?(r=e,n=s[0].address,(a=r.players.find(e=>e.address===n))&&(a.chips+=r.pot),r.status="finished",r.winner=n,r.turnAddress="",r.showdown=r.hands?P(r.hands):null,r.lastAction=a?`${a.name} 赢得 ${r.pot} 筹码`:"本局结束",r.pot=0,E(r)):(e.turnAddress=function(e,t){let r=e.players,n=Math.max(0,r.findIndex(e=>e.address===R(t)));for(let e=1;e<=r.length;e++){let t=r[(n+e)%r.length];if("active"===t.status)return t.address}return""}(e,t),E(e))}function E(e){return e.seq=Number(e.seq||0)+1,{ok:!0,state:e}}function z(e){var t;if(!e||"object"!=typeof e)return null;let r=R(e.address);return r?{address:r,name:String(e.name||((t=r)?`${t.slice(0,6)}...${t.slice(-4)}`:"")).slice(0,50),publicKey:String(e.publicKey||""),chips:Math.max(0,Number(e.chips)||0),status:"folded"===e.status?"folded":"active",looked:!0===e.looked,bet:Math.max(0,Number(e.bet)||0)}:null}function R(e){let t=String(e||"").trim();return/^0x[a-fA-F0-9]{40}$/.test(t)?t.toLowerCase():""}function P(e){return JSON.parse(JSON.stringify(e))}var L=e.i(99591),_=e.i(66112),O=e.i(93957);let T="zhajinhua";function U(e,t){return String(e||"").toLowerCase()===String(t||"").toLowerCase()}function K(e=""){return e?`${e.slice(0,6)}...${e.slice(-4)}`:""}e.s(["default",0,function(){var e,y;let g,b=(0,p.useAppStore)(e=>e.isDarkMode),j=(0,p.useAppStore)(e=>e.setIsDarkMode),v=(0,p.useAppStore)(e=>e.addToast),C=(0,f.useUserStore)(e=>e.initializeUser),[z,D]=(0,r.useState)(""),[B,V]=(0,r.useState)(!1),[q,G]=(0,r.useState)(20),[J,F]=(0,r.useState)(""),[H,W]=(0,r.useState)({}),Z=(0,r.useRef)(null),Q=(0,r.useRef)(new Set),X=(0,h.useGameRoom)({gameId:T,onError:e=>v(e,"error"),getPlayerPayload:e=>{let t=(0,_.most25519)(e.danger);return{address:e.address,name:e.displayName||e.username,publicKey:t.public_key,joinedAt:Date.now()}}}),Y=(0,r.useMemo)(()=>X.userIdentity?.danger?(0,_.most25519)(X.userIdentity.danger):null,[X.userIdentity?.danger]);(0,r.useEffect)(()=>{C()},[C]),(0,r.useEffect)(()=>{let e=new URLSearchParams(window.location.search).get("room")?.toUpperCase();e&&D(e)},[]),(0,r.useEffect)(()=>{if(!X.roomCode)return;let e=`/game/zhajinhua?room=${X.roomCode}`;`${window.location.pathname}${window.location.search}`!==e&&window.history.replaceState(null,"",e)},[X.roomCode]);let ee=(0,r.useMemo)(()=>(0,L.deriveGameRoomLobby)(X.messages,{gameId:T,roomCode:X.roomCode}),[X.messages,X.roomCode]),et=(0,r.useMemo)(()=>(0,L.getLatestGameState)(X.messages,{gameId:T,roomCode:X.roomCode}),[X.messages,X.roomCode]),er=et?.payload?.round||null,en=er?.host||ee.hostAddress,ea=U(en,X.userIdentity?.address),es=X.userIdentity?.address?.toLowerCase()||"",ei=er?.players.find(e=>U(e.address,es)),el=ei||ee.players.find(e=>U(e.address,es)),eo=H[er?.roundId||""]||null,ec=(er?.showdown&&es?er.showdown[es]:null)||(ei?.looked?eo:null),eu=function(e,t){let r=(e?.players||[]).find(e=>e.address===R(t));if(!e||"playing"!==e.status||!r||"active"!==r.status||e.turnAddress!==r.address)return[];let n=[];return r.looked||n.push("look"),M(e,{action:"call"},r.address).ok&&n.push("call"),m.some(t=>M(e,{action:"raise",amount:t},r.address).ok)&&n.push("raise"),A(e).length>1&&n.push("compare"),n.push("fold"),n}(er,es),ed=A(er),eh=ea&&function(e=[]){let t=e.filter(e=>Number(e.chips)>=10);return t.length>=2&&t.length<=5}(ee.players.map(e=>({...e,chips:er?.players.find(t=>U(t.address,e.address))?.chips??1e3}))),ep=X.roomCode&&1?`${window.location.origin}/game/zhajinhua?room=${X.roomCode}`:"";async function ef(){await X.createRoom()&&v("房间已创建","success")}async function em(e){e.preventDefault(),await X.joinRoom(z)&&v("已进入房间","success")}async function ey(){ep&&(await navigator.clipboard.writeText(ep),V(!0),setTimeout(()=>V(!1),1400))}async function eg(e){return X.sendRoomEvent("room:state",{round:function(e){if(!e)return null;let t={...e};return delete t.hands,P(t)}(e),seq:e.seq})}async function eb(){if(!X.userIdentity||!Y||!eh)return void v("至少需要 2 名有足够筹码的玩家","error");try{let e=ee.players.map(e=>({...e,chips:er?.players.find(t=>U(t.address,e.address))?.chips??1e3})),t=function({roomCode:e,players:t,hostAddress:r,roundId:n=k("round"),random:a=Math.random}){let s=t.filter(e=>Number(e.chips)>=10).slice(0,5);if(s.length<2)throw Error("至少需要 2 名有足够筹码的玩家");let i=function(e=w(),t=Math.random){let r=[...e];for(let e=r.length-1;e>0;e--){let n=Math.floor(t()*(e+1));[r[e],r[n]]=[r[n],r[e]]}return r}(w(),a),l={},o=s.map((e,t)=>{let r=i.slice(3*t,3*t+3);return l[e.address]=r,{address:e.address,name:e.name,publicKey:e.publicKey,chips:Number(e.chips)-10,status:"active",looked:!1,bet:10}}),c=Math.max(0,o.findIndex(e=>e.address===R(r))),u=o[(c+1)%o.length].address;return{roomCode:x(e),roundId:n,status:"playing",host:R(r),seq:1,startedAt:Date.now(),ante:10,pot:10*o.length,currentBet:10,turnAddress:u,players:o,lastAction:"本局开始",winner:null,showdown:null,appliedEventIds:[],hands:l}}({roomCode:X.roomCode,players:e,hostAddress:X.userIdentity.address});for(let e of(Z.current=t.hands,Q.current.clear(),await eg(t),t.players)){let r=(0,_.mostBoxEncrypt)(JSON.stringify(t.hands[e.address]),{senderPrivateKey:Y.private_key,recipientPublicKey:e.publicKey});await X.sendRoomEvent("deal:private",{roundId:t.roundId,recipient:e.address,senderPublicKey:Y.public_key,encrypted:r})}W(e=>({...e,[t.roundId]:t.hands[X.userIdentity.address.toLowerCase()]})),v("新一局已开始","success")}catch(e){v(e instanceof Error?e.message:"开局失败","error")}}async function ej(e,t={}){if(!er||!X.userIdentity)return;let r=function({roundId:e,action:t,amount:r,target:n}){return{roundId:e,eventId:k("action"),action:t,amount:r,target:n}}({roundId:er.roundId,action:e,amount:t.amount,target:t.target});await X.sendRoomEvent("player:action",{actionEvent:r})}(0,r.useEffect)(()=>{if(er&&X.userIdentity&&Y&&en)for(let e of X.roomEvents){let t=e.event;if(!t||"deal:private"!==t.event)continue;let r=t.payload;if(r.roundId!==er.roundId||!U(r.recipient,X.userIdentity.address))continue;let n=(0,_.mostBoxDecrypt)(r.encrypted||"",{senderPublicKey:r.senderPublicKey||"",recipientPrivateKey:Y.private_key});if(n)try{let e=JSON.parse(n);Array.isArray(e)&&W(t=>({...t,[er.roundId]:e.map(String)}))}catch{}}},[er?.roundId,X.roomEvents,X.userIdentity,en,Y?.private_key]),(0,r.useEffect)(()=>{if(!ea||!er||"playing"!==er.status)return;let e=Z.current;if(!e)return;let t=X.roomEvents.filter(e=>{let t=e.event;if(!t||"player:action"!==t.event)return!1;let r=t.payload.actionEvent;return!(!r||r.roundId!==er.roundId||Q.current.has(r.eventId)||er.appliedEventIds?.includes(r.eventId))});if(0===t.length)return;let r=!1;return async function(){let n,a=(n=N(er))&&e&&"object"==typeof e?{...n,hands:P(e)}:null;if(a)for(let e of t){if(r)return;let t=(e.event?.payload).actionEvent,n=function(e,t,r){let n=M(e,t,r);if(!n.ok)return{ok:!1,error:n.error,state:e};let a=P(e),s=R(r),i=a.players.find(e=>e.address===s),l=String(t.eventId);if(a.appliedEventIds?.includes(l))return{ok:!0,state:a,duplicate:!0};if(Array.isArray(a.appliedEventIds)||(a.appliedEventIds=[]),a.appliedEventIds.push(l),"look"===t.action)return i.looked=!0,a.lastAction=`${i.name} 看牌`,E(a);if("fold"===t.action)return i.status="folded",a.lastAction=`${i.name} 弃牌`,$(a,s);if("call"===t.action)return I(a,i),a.lastAction=`${i.name} 跟注`,$(a,s);if("raise"===t.action){let e=Number(t.amount);return a.currentBet+=e,I(a,i),a.lastAction=`${i.name} 加注 ${e}`,$(a,s)}if("compare"===t.action){I(a,i);let e=R(t.target),r=a.players.find(t=>t.address===e),n=function(e,t){let r=S(e),n=S(t);if(r.category!==n.category)return r.category-n.category;let a=function(e,t){let r=Math.max(e.length,t.length);for(let n=0;n<r;n++){let r=e[n]||0,a=t[n]||0;if(r!==a)return r-a}return 0}(r.tiebreakers,n.tiebreakers);return 0!==a?a:r.tieSuit-n.tieSuit}(a.hands?.[s]||[],a.hands?.[e]||[])>=0?r:i;return n.status="folded",a.lastAction=`${i.name} 与 ${r.name} 比牌,${n.name} 出局`,$(a,s)}return{ok:!1,error:"未知操作",state:e}}(a,t,e.message.author);if(n.ok&&(a=n.state,Z.current=n.state.hands,await eg(n.state)&&Q.current.add(t.eventId),"finished"===n.state.status))break}}(),()=>{r=!0}},[er?.roundId,er?.seq,er?.status,X.roomEvents,ea]);let ev=er?.status==="playing"?U(er.turnAddress,es)?"轮到你操作":er.turnAddress?`等待 ${e=er.turnAddress,y=ee.players,g=e.toLowerCase(),y.find(e=>e.address===g)?.name||K(e)}`:"进行中":er?.status==="finished"?"本局结束":"等待开局",ex=ed.filter(e=>!U(e.address,es));return(0,t.jsx)(u.default,{sidebar:({closeSidebar:e})=>(0,t.jsx)(d.default,{activeGame:"zhajinhua",closeSidebar:e}),headerTitle:(0,t.jsxs)("div",{className:"zjh-header-title",children:[(0,t.jsx)("h2",{className:"header-title",children:"游戏 · 炸金花"}),X.roomCode&&(0,t.jsxs)("span",{className:"header-badge",children:["房间 ",X.roomCode]})]}),headerRight:(0,t.jsxs)("div",{className:"header-right-actions",children:[X.roomCode&&(0,t.jsxs)("button",{className:"btn btn-secondary",onClick:ey,children:[(0,t.jsx)(n.Copy,{size:16}),B?"已复制":"分享房间"]}),(0,t.jsx)("button",{className:"btn btn-icon",onClick:()=>j(!b),title:"切换主题",children:b?(0,t.jsx)(c.Sun,{size:16}):(0,t.jsx)(s.Moon,{size:16})})]}),children:(0,t.jsx)("main",{className:"zjh-page",children:X.roomCode?(0,t.jsxs)("div",{className:"zjh-board",children:[(0,t.jsxs)("section",{className:"zjh-table",children:[(0,t.jsxs)("div",{className:"zjh-table-center",children:[(0,t.jsx)("span",{children:"底池"}),(0,t.jsx)("strong",{children:er?.pot||0}),(0,t.jsxs)("small",{children:["当前注 ",er?.currentBet||0]})]}),(0,t.jsx)("div",{className:"zjh-seats",children:ee.players.map(e=>{let r=er?.players.find(t=>U(t.address,e.address)),n=er?.turnAddress===e.address,a=er?.winner===e.address;return(0,t.jsxs)("div",{className:`zjh-seat ${n?"turn":""} ${a?"winner":""}`,children:[(0,t.jsx)("img",{className:"zjh-seat-avatar",src:(0,O.generateAvatar)(e.address),alt:"avatar"}),(0,t.jsxs)("div",{className:"zjh-seat-main",children:[(0,t.jsx)("strong",{children:e.name}),(0,t.jsx)("span",{children:K(e.address)})]}),(0,t.jsxs)("div",{className:"zjh-seat-meta",children:[(0,t.jsxs)("span",{children:[r?.chips??1e3," 筹码"]}),(0,t.jsx)("span",{children:r?.status==="folded"?"已弃牌":r?.looked?"已看牌":er?"在局中":"等待开局"})]})]},e.address)})})]}),(0,t.jsxs)("aside",{className:"zjh-panel",children:[(0,t.jsxs)("div",{className:"zjh-panel-section",children:[(0,t.jsxs)("div",{className:"zjh-panel-title",children:[(0,t.jsx)(o.Spade,{size:16}),(0,t.jsx)("span",{children:"我的手牌"})]}),(0,t.jsx)("div",{className:"zjh-hand",children:ec?ec.map(e=>{let r,n,a=(n=(r=String(e||"")).slice(-1),{rank:r.slice(0,-1),suit:({S:"S",H:"H",C:"C",D:"D"})[n]||n,color:"H"===n||"D"===n?"red":"black"});return(0,t.jsxs)("div",{className:`zjh-card ${a.color}`,children:[(0,t.jsx)("span",{children:a.rank}),(0,t.jsx)("strong",{children:a.suit})]},e)}):[0,1,2].map(e=>(0,t.jsx)("div",{className:"zjh-card back",children:(0,t.jsx)(o.Spade,{size:18})},e))}),(0,t.jsx)("p",{className:"zjh-hand-label",children:ec?S(ec).label:eo?"未看牌":"等待房主发牌"})]}),(0,t.jsxs)("div",{className:"zjh-panel-section",children:[(0,t.jsxs)("div",{className:"zjh-panel-title",children:[(0,t.jsx)(i.Play,{size:16}),(0,t.jsx)("span",{children:"操作"})]}),ea?(0,t.jsxs)("button",{className:"btn btn-primary btn-full",onClick:eb,disabled:!eh||er?.status==="playing",children:[(0,t.jsx)(l,{size:16}),"开始本局"]}):(0,t.jsx)("p",{className:"zjh-muted",children:"等待房主开始或继续牌局。"}),(0,t.jsxs)("div",{className:"zjh-actions",children:[(0,t.jsxs)("button",{className:"btn btn-secondary",disabled:!eu.includes("look"),onClick:()=>ej("look"),children:[(0,t.jsx)(a.Eye,{size:16}),"看牌"]}),(0,t.jsx)("button",{className:"btn btn-secondary",disabled:!eu.includes("call"),onClick:()=>ej("call"),children:"跟注"}),(0,t.jsx)("button",{className:"btn btn-secondary",disabled:!eu.includes("fold"),onClick:()=>ej("fold"),children:"弃牌"})]}),(0,t.jsxs)("div",{className:"zjh-raise-row",children:[(0,t.jsx)("select",{className:"input input-compact",value:q,onChange:e=>G(Number(e.target.value)),children:m.map(e=>(0,t.jsxs)("option",{value:e,children:["加 ",e]},e))}),(0,t.jsx)("button",{className:"btn btn-secondary",disabled:!eu.includes("raise"),onClick:()=>ej("raise",{amount:q}),children:"加注"})]}),(0,t.jsxs)("div",{className:"zjh-raise-row",children:[(0,t.jsxs)("select",{className:"input input-compact",value:J,onChange:e=>F(e.target.value),children:[(0,t.jsx)("option",{value:"",children:"选择比牌对象"}),ex.map(e=>(0,t.jsx)("option",{value:e.address,children:e.name},e.address))]}),(0,t.jsx)("button",{className:"btn btn-secondary",disabled:!eu.includes("compare")||!J,onClick:()=>ej("compare",{target:J}),children:"比牌"})]})]}),(0,t.jsxs)("div",{className:"zjh-panel-section",children:[(0,t.jsx)("div",{className:"zjh-panel-title",children:"状态"}),(0,t.jsxs)("div",{className:"zjh-status-grid",children:[(0,t.jsx)("span",{children:"房主"}),(0,t.jsx)("strong",{children:en?K(en):"-"}),(0,t.jsx)("span",{children:"我的筹码"}),(0,t.jsx)("strong",{children:el?.chips??1e3}),(0,t.jsx)("span",{children:"本轮"}),(0,t.jsx)("strong",{children:ev}),(0,t.jsx)("span",{children:"提示"}),(0,t.jsx)("strong",{children:er?.lastAction||"等待玩家加入"})]})]})]})]}):(0,t.jsxs)("section",{className:"zjh-welcome",children:[(0,t.jsx)("div",{className:"zjh-welcome-icon",children:(0,t.jsx)(o.Spade,{size:36})}),(0,t.jsx)("h2",{children:"P2P 炸金花"}),(0,t.jsx)("p",{children:"创建房间邀请朋友,房主在线开始牌局并推进状态。"}),(0,t.jsxs)("div",{className:"zjh-welcome-actions",children:[(0,t.jsxs)("button",{className:"btn btn-primary",disabled:X.joining,onClick:ef,children:[(0,t.jsx)(i.Play,{size:16}),"创建房间"]}),(0,t.jsxs)("form",{className:"zjh-room-input-row",onSubmit:em,children:[(0,t.jsx)("input",{className:"input input-compact",value:z,onChange:e=>D(e.target.value.toUpperCase()),placeholder:"输入房间码",maxLength:8}),(0,t.jsx)("button",{className:"btn btn-icon",disabled:X.joining||!z,children:(0,t.jsx)(i.Play,{size:16})})]})]})]})})})}],39307)}]);
@@ -1 +0,0 @@
1
- .page-module__bH9uOG__page{background:var(--bg-primary);min-height:calc(100vh - 64px);padding:18px}.page-module__bH9uOG__headerActions{align-items:center;gap:8px;display:flex}.page-module__bH9uOG__entry{grid-template-columns:minmax(0,1fr) 360px;align-items:center;gap:48px;max-width:1040px;min-height:calc(100vh - 116px);margin:0 auto;display:grid}.page-module__bH9uOG__entryBrand{align-items:center;gap:22px;display:flex}.page-module__bH9uOG__cardMark{width:112px;height:152px;box-shadow:var(--shadow-lg);color:#fff;background:#c93d32;border:8px solid #fff;border-radius:8px;flex:0 0 112px;place-items:center;font-size:70px;font-weight:900;display:grid}.page-module__bH9uOG__entryBrand h1{color:var(--text-primary);margin:0;font-size:64px;line-height:.95}.page-module__bH9uOG__entryBrand p{max-width:520px;color:var(--text-secondary);margin:18px 0 0;font-size:18px;line-height:1.7}.page-module__bH9uOG__entryPanel,.page-module__bH9uOG__panel,.page-module__bH9uOG__handPanel{border:1px solid var(--glass-border);background:var(--glass-bg);box-shadow:var(--glass-shadow);border-radius:8px}.page-module__bH9uOG__entryPanel{gap:16px;padding:22px;display:grid}.page-module__bH9uOG__accountLine,.page-module__bH9uOG__scoreMeta,.page-module__bH9uOG__roomBar,.page-module__bH9uOG__badges,.page-module__bH9uOG__actions{align-items:center;gap:10px;display:flex}.page-module__bH9uOG__accountLine{color:var(--text-secondary);justify-content:space-between;font-size:14px}.page-module__bH9uOG__accountLine strong{max-width:190px;color:var(--text-primary);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.page-module__bH9uOG__joinForm,.page-module__bH9uOG__joinForm label{gap:8px;display:grid}.page-module__bH9uOG__joinForm label{color:var(--text-secondary);font-size:14px}.page-module__bH9uOG__joinForm input{border:1px solid var(--glass-border);background:var(--bg-primary);width:100%;min-height:40px;color:var(--text-primary);border-radius:8px;padding:0 12px}.page-module__bH9uOG__status{color:var(--text-secondary);margin:0;font-size:14px}.page-module__bH9uOG__gameGrid{grid-template:"table side"minmax(360px,1fr)"hand side"/minmax(0,1fr) 320px;gap:14px;min-height:calc(100vh - 104px);display:grid}.page-module__bH9uOG__tablePanel{color:#fff;background:radial-gradient(circle,#ffffff2e,#0000 46%),#247658;border-radius:8px;grid-area:table;grid-template-rows:auto auto 1fr auto;gap:14px;min-height:360px;padding:16px;display:grid}.page-module__bH9uOG__roomBar{justify-content:space-between}.page-module__bH9uOG__roomBar div:first-child{gap:2px;display:grid}.page-module__bH9uOG__roomBar span,.page-module__bH9uOG__badges span{color:#ffffffc7;font-size:13px}.page-module__bH9uOG__badges{flex-wrap:wrap;justify-content:flex-end}.page-module__bH9uOG__dangerBadge{background:#c5312a47;border:1px solid #ffcd4794;border-radius:999px;padding:4px 9px;font-weight:800;color:#ffd66b!important}.page-module__bH9uOG__seats{grid-template-columns:repeat(auto-fit,minmax(168px,1fr));gap:10px;display:grid}.page-module__bH9uOG__player{color:#17211b;background:#ffffffeb;border:1px solid #17211b1f;border-radius:8px;align-items:center;gap:10px;min-width:0;padding:8px;display:flex}.page-module__bH9uOG__tablePanel .page-module__bH9uOG__player{color:#fff;background:#ffffff2e}.page-module__bH9uOG__active{outline:3px solid #f3cf5a}.page-module__bH9uOG__winner{outline:3px solid #7be39e}.page-module__bH9uOG__avatar{color:#fff;background:#17211b;border-radius:50%;flex:0 0 40px;place-items:center;width:40px;height:40px;font-size:13px;font-weight:900;display:grid}.page-module__bH9uOG__player strong,.page-module__bH9uOG__player span{text-overflow:ellipsis;white-space:nowrap;display:block;overflow:hidden}.page-module__bH9uOG__player span{opacity:.76;max-width:190px;font-size:12px}.page-module__bH9uOG__centerTable{grid-template-columns:120px minmax(0,1fr) 120px;align-items:center;gap:14px;display:grid}.page-module__bH9uOG__deckBox,.page-module__bH9uOG__playedBox{text-align:center;background:#0b221942;border-radius:8px}.page-module__bH9uOG__deckBox{gap:6px;padding:18px 8px;display:grid}.page-module__bH9uOG__deckBox span{opacity:.75;font-size:13px}.page-module__bH9uOG__deckBox strong{font-size:30px}.page-module__bH9uOG__playedBox{place-items:center;min-height:150px;padding:16px;display:grid}.page-module__bH9uOG__playedCards{flex-wrap:wrap;justify-content:center;gap:8px;margin-top:10px;display:flex}.page-module__bH9uOG__notice{text-align:center;background:#0000002e;border-radius:8px;padding:10px 12px;font-weight:800}.page-module__bH9uOG__sidePanel{grid-area:side;align-content:start;gap:12px;display:grid}.page-module__bH9uOG__panel{gap:12px;padding:14px;display:grid}.page-module__bH9uOG__panel h3{color:var(--text-primary);margin:0;font-size:15px}.page-module__bH9uOG__scoreMeta{color:var(--text-secondary);justify-content:space-between;font-size:13px}.page-module__bH9uOG__scoreRow{border-top:1px solid var(--glass-border);color:var(--text-primary);justify-content:space-between;padding-top:8px;display:flex}.page-module__bH9uOG__logPanel{max-height:280px;overflow:auto}.page-module__bH9uOG__logPanel p{color:var(--text-secondary);margin:0;font-size:13px;line-height:1.5}.page-module__bH9uOG__handPanel{grid-area:hand;gap:12px;padding:12px;display:grid}.page-module__bH9uOG__hand{gap:8px;min-height:118px;padding:4px 2px 10px;display:flex;overflow-x:auto}.page-module__bH9uOG__cardButton{background:0 0;border:0;border-radius:8px;flex:none;min-height:auto;padding:0;transition:transform .16s}.page-module__bH9uOG__picked{transform:translateY(-14px)}.page-module__bH9uOG__card{color:#17211b;text-align:left;background:#fff;border:1px solid #dbe1dc;border-radius:8px;grid-template-rows:auto 1fr;width:62px;height:92px;padding:7px;display:grid;box-shadow:0 8px 18px #0e16111f}.page-module__bH9uOG__card span{font-size:15px;font-weight:900}.page-module__bH9uOG__card i{place-self:end;font-size:22px;font-style:normal;font-weight:900}.page-module__bH9uOG__red{color:#c93d32}.page-module__bH9uOG__black{color:#17211b}.page-module__bH9uOG__small{width:46px;height:66px;padding:5px}.page-module__bH9uOG__small span{font-size:12px}.page-module__bH9uOG__small i{font-size:15px}.page-module__bH9uOG__actions{flex-wrap:wrap}.page-module__bH9uOG__preview{border:1px solid var(--glass-border);background:var(--bg-primary);min-height:46px;color:var(--text-secondary);border-radius:8px;flex:260px;padding:7px 10px;display:grid}.page-module__bH9uOG__preview strong{color:var(--text-primary);font-size:14px}.page-module__bH9uOG__preview span{text-overflow:ellipsis;white-space:nowrap;font-size:12px;overflow:hidden}.page-module__bH9uOG__valid{border-color:#176b4d70}@media (max-width:980px){.page-module__bH9uOG__entry{grid-template-columns:1fr;align-content:center}.page-module__bH9uOG__gameGrid{grid-template-columns:1fr;grid-template-areas:"table""hand""side"}}@media (max-width:640px){.page-module__bH9uOG__page{padding:10px}.page-module__bH9uOG__entryBrand{flex-direction:column;align-items:flex-start}.page-module__bH9uOG__entryBrand h1{font-size:42px}.page-module__bH9uOG__cardMark{border-width:6px;flex-basis:100px;width:74px;height:100px;font-size:46px}.page-module__bH9uOG__centerTable{grid-template-columns:1fr}.page-module__bH9uOG__actions>button{flex:110px}}