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.
- package/README.md +31 -19
- package/out/404/index.html +3 -3
- package/out/404.html +3 -3
- package/out/__next.__PAGE__.txt +6 -6
- package/out/__next._full.txt +16 -16
- package/out/__next._head.txt +3 -3
- package/out/__next._index.txt +8 -8
- package/out/__next._tree.txt +5 -5
- package/out/_next/static/chunks/0-c8h4u1i2f78.js +1 -0
- package/out/_next/static/chunks/02j6ojja7vzp8.js +1 -0
- package/out/_next/static/chunks/06im3as4nwfil.js +1 -0
- package/out/_next/static/chunks/0nwdp-n94owg0.css +1 -0
- package/out/_next/static/chunks/0sq_0pwxnhby2.js +1 -0
- package/out/_next/static/chunks/1ei8b9nw-ea8p.css +1 -0
- package/out/_next/static/chunks/1h-f81ddyfcmx.css +1 -0
- package/out/_next/static/chunks/{02jvyg27pp0mz.js → 1v-molv0hbcjl.js} +1 -1
- package/out/_next/static/chunks/22h69_zwmttt4.js +1 -0
- package/out/_next/static/chunks/23zlmarf-go2x.js +1 -0
- package/out/_next/static/chunks/24k_4-y4ym0df.js +1 -0
- package/out/_next/static/chunks/258tyt1xt34p4.css +1 -0
- package/out/_next/static/chunks/2693fczty5yr8.js +1 -0
- package/out/_next/static/chunks/26hcvxjw9do9d.js +1 -0
- package/out/_next/static/chunks/2_i1b78h0yiu_.js +1 -0
- package/out/_next/static/chunks/2fmkcw8ui5xp3.js +5 -0
- package/out/_next/static/chunks/2uget3ephe4e3.js +736 -0
- package/out/_next/static/chunks/2va-v1iiap4zv.js +1 -0
- package/out/_next/static/chunks/2vm9uslik2wfi.css +5 -0
- package/out/_next/static/chunks/3e9ia0hs-pqvs.css +1 -0
- package/out/_next/static/chunks/3ejz1mdljwwqf.css +1 -0
- package/out/_next/static/chunks/3fea100s764m-.js +1 -0
- package/out/_next/static/chunks/3g0c367tk4esf.js +1 -0
- package/out/_next/static/chunks/3mccxoa60ley8.js +1 -0
- package/out/_next/static/chunks/{0gcsdf57gcm6h.js → 3oe03qxgd_rid.js} +1 -1
- package/out/_next/static/chunks/3r5wf57k0gys9.js +1 -0
- package/out/_next/static/chunks/3yc_zd5vxq0j7.css +1 -0
- package/out/_next/static/chunks/418_591yp64lx.css +23 -0
- package/out/_next/static/chunks/43l72x-2z3zxb.js +1 -0
- package/out/_next/static/chunks/{turbopack-05qngmxam3ar~.js → turbopack-026p0g9v9_pva.js} +1 -1
- package/out/_not-found/__next._full.txt +13 -13
- package/out/_not-found/__next._head.txt +3 -3
- package/out/_not-found/__next._index.txt +8 -8
- package/out/_not-found/__next._not-found.__PAGE__.txt +4 -4
- package/out/_not-found/__next._not-found.txt +3 -3
- package/out/_not-found/__next._tree.txt +3 -3
- package/out/_not-found/index.html +3 -3
- package/out/_not-found/index.txt +13 -13
- package/out/admin/__next._full.txt +15 -15
- package/out/admin/__next._head.txt +3 -3
- package/out/admin/__next._index.txt +8 -8
- package/out/admin/__next._tree.txt +4 -4
- package/out/admin/__next.admin.__PAGE__.txt +4 -4
- package/out/admin/__next.admin.txt +4 -4
- package/out/admin/index.html +3 -3
- package/out/admin/index.txt +15 -15
- package/out/app/__next._full.txt +14 -14
- package/out/app/__next._head.txt +3 -3
- package/out/app/__next._index.txt +8 -8
- package/out/app/__next._tree.txt +3 -3
- package/out/app/__next.app.__PAGE__.txt +4 -4
- package/out/app/__next.app.txt +3 -3
- package/out/app/index.html +3 -3
- package/out/app/index.txt +14 -14
- package/out/chat/__next._full.txt +15 -15
- package/out/chat/__next._head.txt +3 -3
- package/out/chat/__next._index.txt +8 -8
- package/out/chat/__next._tree.txt +4 -4
- package/out/chat/__next.chat.__PAGE__.txt +4 -4
- package/out/chat/__next.chat.txt +4 -4
- package/out/chat/index.html +3 -3
- package/out/chat/index.txt +15 -15
- package/out/chat/join/__next._full.txt +15 -15
- package/out/chat/join/__next._head.txt +3 -3
- package/out/chat/join/__next._index.txt +8 -8
- package/out/chat/join/__next._tree.txt +4 -4
- package/out/chat/join/__next.chat.join.__PAGE__.txt +4 -4
- package/out/chat/join/__next.chat.join.txt +3 -3
- package/out/chat/join/__next.chat.txt +4 -4
- package/out/chat/join/index.html +3 -3
- package/out/chat/join/index.txt +15 -15
- package/out/demo/__next._full.txt +27 -0
- package/out/demo/__next._head.txt +5 -0
- package/out/demo/__next._index.txt +9 -0
- package/out/demo/__next._tree.txt +7 -0
- package/out/demo/__next.demo.__PAGE__.txt +12 -0
- package/out/demo/__next.demo.txt +5 -0
- package/out/demo/index.html +17 -0
- package/out/demo/index.txt +27 -0
- package/out/download/__next._full.txt +37 -35
- package/out/download/__next._head.txt +3 -3
- package/out/download/__next._index.txt +8 -8
- package/out/download/__next._tree.txt +5 -5
- package/out/download/__next.download.__PAGE__.txt +7 -7
- package/out/download/__next.download.txt +3 -3
- package/out/download/index.html +3 -3
- package/out/download/index.txt +37 -35
- package/out/game/__next._full.txt +13 -13
- package/out/game/__next._head.txt +3 -3
- package/out/game/__next._index.txt +8 -8
- package/out/game/__next._tree.txt +4 -4
- package/out/game/__next.game.__PAGE__.txt +2 -2
- package/out/game/__next.game.txt +4 -4
- package/out/game/gandengyan/__next._full.txt +16 -16
- package/out/game/gandengyan/__next._head.txt +3 -3
- package/out/game/gandengyan/__next._index.txt +8 -8
- package/out/game/gandengyan/__next._tree.txt +5 -5
- package/out/game/gandengyan/__next.game.gandengyan.__PAGE__.txt +5 -5
- package/out/game/gandengyan/__next.game.gandengyan.txt +3 -3
- package/out/game/gandengyan/__next.game.txt +4 -4
- package/out/game/gandengyan/index.html +3 -3
- package/out/game/gandengyan/index.txt +16 -16
- package/out/game/index.html +1 -1
- package/out/game/index.txt +13 -13
- package/out/game/zhajinhua/__next._full.txt +16 -15
- package/out/game/zhajinhua/__next._head.txt +3 -3
- package/out/game/zhajinhua/__next._index.txt +8 -8
- package/out/game/zhajinhua/__next._tree.txt +5 -4
- package/out/game/zhajinhua/__next.game.txt +4 -4
- package/out/game/zhajinhua/__next.game.zhajinhua.__PAGE__.txt +5 -4
- package/out/game/zhajinhua/__next.game.zhajinhua.txt +3 -3
- package/out/game/zhajinhua/index.html +3 -3
- package/out/game/zhajinhua/index.txt +16 -15
- package/out/index.html +3 -3
- package/out/index.txt +16 -16
- package/out/note/__next._full.txt +14 -14
- package/out/note/__next._head.txt +3 -3
- package/out/note/__next._index.txt +8 -8
- package/out/note/__next._tree.txt +3 -3
- package/out/note/__next.note.__PAGE__.txt +4 -4
- package/out/note/__next.note.txt +3 -3
- package/out/note/index.html +3 -3
- package/out/note/index.txt +14 -14
- package/out/ping/__next._full.txt +16 -16
- package/out/ping/__next._head.txt +3 -3
- package/out/ping/__next._index.txt +8 -8
- package/out/ping/__next._tree.txt +5 -5
- package/out/ping/__next.ping.__PAGE__.txt +5 -5
- package/out/ping/__next.ping.txt +4 -4
- package/out/ping/index.html +3 -3
- package/out/ping/index.txt +16 -16
- package/out/web3/__next._full.txt +15 -15
- package/out/web3/__next._head.txt +3 -3
- package/out/web3/__next._index.txt +8 -8
- package/out/web3/__next._tree.txt +4 -4
- package/out/web3/__next.web3.__PAGE__.txt +4 -4
- package/out/web3/__next.web3.txt +4 -4
- package/out/web3/ed25519/__next._full.txt +13 -13
- package/out/web3/ed25519/__next._head.txt +3 -3
- package/out/web3/ed25519/__next._index.txt +8 -8
- package/out/web3/ed25519/__next._tree.txt +4 -4
- package/out/web3/ed25519/__next.web3.ed25519.__PAGE__.txt +2 -2
- package/out/web3/ed25519/__next.web3.ed25519.txt +3 -3
- package/out/web3/ed25519/__next.web3.txt +4 -4
- package/out/web3/ed25519/index.html +1 -1
- package/out/web3/ed25519/index.txt +13 -13
- package/out/web3/index.html +3 -3
- package/out/web3/index.txt +15 -15
- package/out/web3/tools/__next._full.txt +13 -13
- package/out/web3/tools/__next._head.txt +3 -3
- package/out/web3/tools/__next._index.txt +8 -8
- package/out/web3/tools/__next._tree.txt +4 -4
- package/out/web3/tools/__next.web3.tools.__PAGE__.txt +2 -2
- package/out/web3/tools/__next.web3.tools.txt +3 -3
- package/out/web3/tools/__next.web3.txt +4 -4
- package/out/web3/tools/index.html +1 -1
- package/out/web3/tools/index.txt +13 -13
- package/package.json +23 -23
- package/server/src/core/gameRoom.js +12 -0
- package/server/src/core/mostLink.js +1 -1
- package/server/src/core/zhajinhua.js +82 -14
- package/server/src/games/gandengyan.js +79 -14
- package/server/src/http/app.js +25 -2
- package/server/src/http/nodeStatus.js +37 -0
- package/server/src/index.js +160 -25
- package/out/_next/static/chunks/0.4ov9319fecg.css +0 -1
- package/out/_next/static/chunks/0._8s6pbfw.xk.js +0 -1
- package/out/_next/static/chunks/06lttvu7563zo.css +0 -1
- package/out/_next/static/chunks/09h7l4i38xc7q.css +0 -24
- package/out/_next/static/chunks/09hqx79-jkvm_.css +0 -1
- package/out/_next/static/chunks/09vcm1ku9k7o8.js +0 -1
- package/out/_next/static/chunks/0c6e_d2jq179x.js +0 -1
- package/out/_next/static/chunks/0ccalho416.d7.js +0 -1
- package/out/_next/static/chunks/0exj_tg.ew-t3.js +0 -1
- package/out/_next/static/chunks/0f-wz5d~tv-r4.js +0 -1
- package/out/_next/static/chunks/0f0jhsujtf-61.js +0 -1
- package/out/_next/static/chunks/0h4r.qtmpa6eh.js +0 -1
- package/out/_next/static/chunks/0hyds~bp.auvh.js +0 -1
- package/out/_next/static/chunks/0iq1h7g4dudg8.js +0 -1
- package/out/_next/static/chunks/0knnzo9aih48r.js +0 -1
- package/out/_next/static/chunks/0nzyk~sg_tn._.js +0 -1
- package/out/_next/static/chunks/0o9ce4cyf76by.js +0 -736
- package/out/_next/static/chunks/0t_3xxx4zkerp.js +0 -5
- package/out/_next/static/chunks/0w~2fjq86t7c7.css +0 -1
- package/out/_next/static/chunks/0xdwau5k2augv.css +0 -4
- package/out/_next/static/chunks/0xrqerhosrp9~.js +0 -1
- package/out/_next/static/chunks/0xx_10jns1.s7.css +0 -1
- package/out/_next/static/chunks/14-fm9r_mom81.js +0 -1
- package/out/_next/static/chunks/14jhy~xia8lh8.js +0 -1
- /package/out/_next/static/chunks/{0bld2u_ld~va2.js → 0-jy8rfo075fy.js} +0 -0
- /package/out/_next/static/chunks/{0bliugh5lxw55.js → 0-kczrcxjk7lc.js} +0 -0
- /package/out/_next/static/chunks/{00d9h1tddnnnd.js → 012yllpioyi-k.js} +0 -0
- /package/out/_next/static/chunks/{00tkdqwxch-3s.js → 02f7w-ybfnvpd.js} +0 -0
- /package/out/_next/static/chunks/{01l3o90g~1z42.js → 04_v8i3c2y4ni.js} +0 -0
- /package/out/_next/static/chunks/{01xlw8hd842-c.js → 05-c3ty_6dwfk.js} +0 -0
- /package/out/_next/static/chunks/{01mfky9camw6i.js → 052vp9tk7oqx6.js} +0 -0
- /package/out/_next/static/chunks/{01r.v-pqs1vrm.js → 05k6874y7n0cw.js} +0 -0
- /package/out/_next/static/chunks/{02zzxfop_k6tl.css → 09g8c9-u_uh1z.css} +0 -0
- /package/out/_next/static/chunks/{03edqrb4zdj~g.js → 0az8vxg2gfuhm.js} +0 -0
- /package/out/_next/static/chunks/{03h_6oo-gqkhz.js → 0b899y85ei3i_.js} +0 -0
- /package/out/_next/static/chunks/{03~yq9q893hmn.js → 0cz1d0mv5g_q7.js} +0 -0
- /package/out/_next/static/chunks/{04hcgsanv1hhu.js → 0eg1osglq6nq7.js} +0 -0
- /package/out/_next/static/chunks/{05g2q0w5b34.g.js → 0hlvocunlbrjs.js} +0 -0
- /package/out/_next/static/chunks/{05of77xycbt8~.js → 0i9k23rx749fx.js} +0 -0
- /package/out/_next/static/chunks/{05zwemzfjx3sh.js → 0j6wiyqf1637r.js} +0 -0
- /package/out/_next/static/chunks/{06dpc5df94.v1.js → 0knzyzd1jvley.js} +0 -0
- /package/out/_next/static/chunks/{06e1~1-z_ic9a.js → 0kp8ujaqwut11.js} +0 -0
- /package/out/_next/static/chunks/{075s7sn.ns~u5.js → 0n92y9hb-ta0u.js} +0 -0
- /package/out/_next/static/chunks/{07dynrbvd3.f4.js → 0nybb-z3ufrbx.js} +0 -0
- /package/out/_next/static/chunks/{07r9nn-pzlgg1.js → 0o-o9af-grvj8.js} +0 -0
- /package/out/_next/static/chunks/{07p~uva5pwgwe.js → 0oxr0r0aewn99.js} +0 -0
- /package/out/_next/static/chunks/{08576xhv~~jck.js → 0qh3b90ouc9bd.js} +0 -0
- /package/out/_next/static/chunks/{08qqf0rsi3oot.js → 0s7i7nfr9j3b1.js} +0 -0
- /package/out/_next/static/chunks/{08u211~k~qu52.js → 0sh_jm8siqvek.js} +0 -0
- /package/out/_next/static/chunks/{08.72abkgwy9g.js → 0t86ducxkqweb.js} +0 -0
- /package/out/_next/static/chunks/{098.p.2-zm4p7.js → 0u0j5i6-n4oqd.js} +0 -0
- /package/out/_next/static/chunks/{09ngvtajm7e5y.js → 0v73vfxjds7sj.js} +0 -0
- /package/out/_next/static/chunks/{09ps~-43n5qyo.js → 0ve8ixremhwy0.js} +0 -0
- /package/out/_next/static/chunks/{09v7_0gclxr46.js → 0vv5cwj6kr506.js} +0 -0
- /package/out/_next/static/chunks/{09yql86dir9c4.js → 0w3wf8o-ewec9.js} +0 -0
- /package/out/_next/static/chunks/{09zmlfljowj1~.js → 0w6o4o76scrb2.js} +0 -0
- /package/out/_next/static/chunks/{0n4t80gjc3q5h.js → 1-88dio6azz54.js} +0 -0
- /package/out/_next/static/chunks/{0cn9a7aimbdzq.js → 12zg24u7mbv4z.js} +0 -0
- /package/out/_next/static/chunks/{0d3f-nk3c.2re.js → 14lsse587-ccf.js} +0 -0
- /package/out/_next/static/chunks/{0dtohpf7~3d12.js → 16qtikqm_sate.js} +0 -0
- /package/out/_next/static/chunks/{0e531nije_ln2.js → 17_ly1mk2z3q8.js} +0 -0
- /package/out/_next/static/chunks/{0e5zvj_rh0z3m.js → 181421-y2xzj7.js} +0 -0
- /package/out/_next/static/chunks/{0myp4sjagr~h0.js → 1_e-vuvfsntao.js} +0 -0
- /package/out/_next/static/chunks/{0e-3e8h7g99yf.js → 1aljc62wfhqhr.js} +0 -0
- /package/out/_next/static/chunks/{0f4y~rkk-n81e.js → 1b7mbzsylsn-m.js} +0 -0
- /package/out/_next/static/chunks/{0fk~0~p7ivfn1.js → 1cjakikh0o1tm.js} +0 -0
- /package/out/_next/static/chunks/{0fw6juc~lsj3z.js → 1dfzez629llzh.js} +0 -0
- /package/out/_next/static/chunks/{0g0u7785a73vo.js → 1e4ilit3ave6c.js} +0 -0
- /package/out/_next/static/chunks/{0gze5uso1mbe9.js → 1gzgcv355ziff.js} +0 -0
- /package/out/_next/static/chunks/{0g_fpgh7drfda.js → 1h0o6fj73le9_.js} +0 -0
- /package/out/_next/static/chunks/{0hf.aosc-7172.js → 1in766ibz5l-p.js} +0 -0
- /package/out/_next/static/chunks/{0hgz35c1ejbs9.js → 1ip_c70si4tj2.js} +0 -0
- /package/out/_next/static/chunks/{0hrw-r.xmvmsq.js → 1jlu197-yog_n.js} +0 -0
- /package/out/_next/static/chunks/{0hzg4al.v~8~m.js → 1k788fny29y_j.js} +0 -0
- /package/out/_next/static/chunks/{0ig8a4sazk3~2.css → 1lxjpnw925-0p.css} +0 -0
- /package/out/_next/static/chunks/{0ip9xrols_83o.js → 1mnhfyfn52md5.js} +0 -0
- /package/out/_next/static/chunks/{0j4-d0qf.v~kn.js → 1o8brm8yipzn4.js} +0 -0
- /package/out/_next/static/chunks/{0jhdeq.j9_02m.js → 1p8oa39bqu6ed.js} +0 -0
- /package/out/_next/static/chunks/{0jy63h3i-y69i.js → 1qmnmb_dutuw8.js} +0 -0
- /package/out/_next/static/chunks/{0kdnx_u-60k9s.js → 1s6rdcw0q185p.js} +0 -0
- /package/out/_next/static/chunks/{0kq~edq42o1-c.js → 1ta0w8zc7tae7.js} +0 -0
- /package/out/_next/static/chunks/{0l682p362d-5w.js → 1uvi_hie0s3z5.js} +0 -0
- /package/out/_next/static/chunks/{0m68p9txef5rs.js → 1y36s6sv2z7r4.js} +0 -0
- /package/out/_next/static/chunks/{0mme-fm5d2oz2.js → 1zf4i-oj7n-ll.js} +0 -0
- /package/out/_next/static/chunks/{0y.li-~3oybew.js → 2-vtwv8h_uokj.js} +0 -0
- /package/out/_next/static/chunks/{0n.qlfk~z7o.6.js → 2227enga_0c-6.js} +0 -0
- /package/out/_next/static/chunks/{0oz3yl6_-716p.js → 24zr4q96g-eii.js} +0 -0
- /package/out/_next/static/chunks/{0pqt~8bl3ukh4.js → 27jktro2p5rq9.js} +0 -0
- /package/out/_next/static/chunks/{0yl2t7cs-n_ng.js → 2_cqphhur0a6t.js} +0 -0
- /package/out/_next/static/chunks/{0yq3kh.hchtm_.js → 2_s88st3j0tql.js} +0 -0
- /package/out/_next/static/chunks/{0ys0l5au.9c2c.js → 2_y6edbaubqrt.js} +0 -0
- /package/out/_next/static/chunks/{0qqupeexg83u7.js → 2at8y3pbt5cue.js} +0 -0
- /package/out/_next/static/chunks/{0rb-ri481.kc9.js → 2cv1zex4has67.js} +0 -0
- /package/out/_next/static/chunks/{0rsnmahfd.59p.js → 2e6j5h4ftd4jd.js} +0 -0
- /package/out/_next/static/chunks/{0rt6rgnvr-s_p.js → 2e8b26r0td7ou.js} +0 -0
- /package/out/_next/static/chunks/{0runh28p_gg6..js → 2ecppdrjm9cs4.js} +0 -0
- /package/out/_next/static/chunks/{0shy.t1fwqcev.js → 2gl0wusc9zf3d.js} +0 -0
- /package/out/_next/static/chunks/{0t2xr05rlu96l.js → 2im7c515bo69p.js} +0 -0
- /package/out/_next/static/chunks/{0t6h56rhg1y5i.js → 2ixaku9ie8hym.js} +0 -0
- /package/out/_next/static/chunks/{0tdqd1zunusgk.js → 2jhnrjgj_k2-z.js} +0 -0
- /package/out/_next/static/chunks/{0ujbnp38x63ek.js → 2n6pb94vmohgf.js} +0 -0
- /package/out/_next/static/chunks/{0ukyg~tkm~h2m.css → 2nbju8t9-ux58.css} +0 -0
- /package/out/_next/static/chunks/{0v68pdrp54lb-.js → 2pdxw43rsbho0.js} +0 -0
- /package/out/_next/static/chunks/{0vsm0m5sxrb.3.js → 2r6z3vlfw0ppd.js} +0 -0
- /package/out/_next/static/chunks/{0vzlz.iboqo3c.js → 2rskzmv3skmq3.js} +0 -0
- /package/out/_next/static/chunks/{0w87vbpkf-ogd.js → 2stoe6xiau1b3.js} +0 -0
- /package/out/_next/static/chunks/{0xgg0~kmf3gd-.js → 2wqoc60afpg_5.js} +0 -0
- /package/out/_next/static/chunks/{0xj24-70ptdzp.js → 2wyvwsayrr98o.js} +0 -0
- /package/out/_next/static/chunks/{0xxlx772fr3x4.js → 2y3o2mnyfnx68.js} +0 -0
- /package/out/_next/static/chunks/{16i.qbk8t8gf_.js → 3-7y7sjol3yto.js} +0 -0
- /package/out/_next/static/chunks/{0z48pmi6buytt.js → 3089gugfv3ov9.js} +0 -0
- /package/out/_next/static/chunks/{0zapnvgy89mg..js → 30s3_0brd77ky.js} +0 -0
- /package/out/_next/static/chunks/{0_s~ebb-7b2hr.js → 35idql3ziq0wz.js} +0 -0
- /package/out/_next/static/chunks/{0_w-0-2z5oqd_.js → 35unmm4isvqg5.js} +0 -0
- /package/out/_next/static/chunks/{0-n3pg7th.zza.js → 389wmv2b6x2nn.js} +0 -0
- /package/out/_next/static/chunks/{0~4f5p6tvn1lq.js → 39-oy5n969lo6.js} +0 -0
- /package/out/_next/static/chunks/{0~3ik-hfp9s-7.js → 39yvee40syj70.js} +0 -0
- /package/out/_next/static/chunks/{0~_0ys.2whxbw.js → 3clhij8e1eul0.js} +0 -0
- /package/out/_next/static/chunks/{0~_ui9l7.2sxf.js → 3cnsdzbvm3q7p.js} +0 -0
- /package/out/_next/static/chunks/{0~.-vxi5oc.r0.js → 3cxmalqqghdac.js} +0 -0
- /package/out/_next/static/chunks/{0.4j.0k5a64vg.js → 3d9p88evh2scq.js} +0 -0
- /package/out/_next/static/chunks/{0.ozi1_x2.m.~.js → 3eyprczj7yrg6.js} +0 -0
- /package/out/_next/static/chunks/{0.t5wlt51zou5.js → 3f9v_gtppe4hs.js} +0 -0
- /package/out/_next/static/chunks/{0.w4hkvap~bva.js → 3fj0amtzqae6f.js} +0 -0
- /package/out/_next/static/chunks/{1037jlyw5~7ht.js → 3gf98e08a-l_e.js} +0 -0
- /package/out/_next/static/chunks/{1045hfzu533z0.js → 3gi6og9m_yaak.js} +0 -0
- /package/out/_next/static/chunks/{104e5nmc.c-pl.js → 3giw7r1lii84y.js} +0 -0
- /package/out/_next/static/chunks/{109taw1pbh-0b.js → 3gzhy1cs_f2oi.js} +0 -0
- /package/out/_next/static/chunks/{10ynz1dy483wf.js → 3i_ceknny1oqt.js} +0 -0
- /package/out/_next/static/chunks/{10x7~onqwp338.js → 3iw0815ssih3b.js} +0 -0
- /package/out/_next/static/chunks/{11hds.mg~4_r-.js → 3kun-vwr7nzd4.js} +0 -0
- /package/out/_next/static/chunks/{11ibzaklcauw~.js → 3kxm1e-b1er3_.js} +0 -0
- /package/out/_next/static/chunks/{11z.0s6.42b.p.js → 3mc8fynmv71yg.js} +0 -0
- /package/out/_next/static/chunks/{126enaq~f7scl.js → 3n6cor2n9zyn7.js} +0 -0
- /package/out/_next/static/chunks/{12pep-2t-qg4n.css → 3or2h8swxfxyj.css} +0 -0
- /package/out/_next/static/chunks/{12-9n56l0y3yr.js → 3ppt04b6xqz29.js} +0 -0
- /package/out/_next/static/chunks/{1380op_pfk.qo.js → 3ql2pi_m5_5p_.js} +0 -0
- /package/out/_next/static/chunks/{14a4fwbiq.l3z.js → 3t-6u8caafiu9.js} +0 -0
- /package/out/_next/static/chunks/{146oiw1bggtn4.js → 3tqdzb_n12tdm.js} +0 -0
- /package/out/_next/static/chunks/{14cowsqn95m1k.js → 3u6zpg943kpst.js} +0 -0
- /package/out/_next/static/chunks/{14dtd3l03v.kx.js → 3uaedu2hf291z.js} +0 -0
- /package/out/_next/static/chunks/{14tm3qa-v9o-4.js → 3vladx3wh0d4k.js} +0 -0
- /package/out/_next/static/chunks/{14_inksek_rth.js → 3w4o9hklow6fg.js} +0 -0
- /package/out/_next/static/chunks/{14_po2rb_arn4.js → 3w56w25z6u89b.js} +0 -0
- /package/out/_next/static/chunks/{157z7bowux3xj.js → 3x1y_gkazt6kx.js} +0 -0
- /package/out/_next/static/chunks/{15m1_677az2cm.js → 3y7r1h96dtcov.js} +0 -0
- /package/out/_next/static/chunks/{15v.~.ne6ogkk.js → 3z0hydntmwg19.js} +0 -0
- /package/out/_next/static/chunks/{15-o4kb-evqd7.js → 3zhu1svjr0bc5.js} +0 -0
- /package/out/_next/static/chunks/{16u9f35gylw8l.js → 404orp1erq__7.js} +0 -0
- /package/out/_next/static/chunks/{17ajyb5ogk5yj.js → 41talcs-dc2tc.js} +0 -0
- /package/out/_next/static/chunks/{17dyfxbq8yz8n.js → 421pn8weymo-b.js} +0 -0
- /package/out/_next/static/chunks/{180zln9pcq9ih.js → 44987pmr20now.js} +0 -0
- /package/out/_next/static/chunks/{1814izi5gh.kp.js → 449ygeh62gitc.js} +0 -0
- /package/out/_next/static/{2smv1H9Y4Z2Ri-SL-UFgR → eXddCOt9eyz0j78b1m4Ex}/_buildManifest.js +0 -0
- /package/out/_next/static/{2smv1H9Y4Z2Ri-SL-UFgR → eXddCOt9eyz0j78b1m4Ex}/_clientMiddlewareManifest.js +0 -0
- /package/out/_next/static/{2smv1H9Y4Z2Ri-SL-UFgR → eXddCOt9eyz0j78b1m4Ex}/_ssgManifest.js +0 -0
- /package/out/_next/static/media/{KaTeX_AMS-Regular.0b~8ki5y928w2.woff → KaTeX_AMS-Regular.10y3kupq4t663.woff} +0 -0
- /package/out/_next/static/media/{KaTeX_AMS-Regular.0p1vbqd84i2~o.woff2 → KaTeX_AMS-Regular.25ieegmnh38ts.woff2} +0 -0
- /package/out/_next/static/media/{KaTeX_AMS-Regular.173t6ktr7uf-w.ttf → KaTeX_AMS-Regular.418dr7cz3fo2x.ttf} +0 -0
- /package/out/_next/static/media/{KaTeX_Caligraphic-Bold.01-pzluls4zgb.woff2 → KaTeX_Caligraphic-Bold.06b-ya9t43ioz.woff2} +0 -0
- /package/out/_next/static/media/{KaTeX_Caligraphic-Bold.0x2v1lwn~880f.woff → KaTeX_Caligraphic-Bold.2vmk2hva4ctha.woff} +0 -0
- /package/out/_next/static/media/{KaTeX_Caligraphic-Bold.16zv5fax0h0ka.ttf → KaTeX_Caligraphic-Bold.40ltxhe834pns.ttf} +0 -0
- /package/out/_next/static/media/{KaTeX_Caligraphic-Regular.02i3z7wig438t.ttf → KaTeX_Caligraphic-Regular.07-7u27-nhn_r.ttf} +0 -0
- /package/out/_next/static/media/{KaTeX_Caligraphic-Regular.0rysu1t-ncjq8.woff2 → KaTeX_Caligraphic-Regular.2eph4dlhid_m9.woff2} +0 -0
- /package/out/_next/static/media/{KaTeX_Caligraphic-Regular.10927swgekwun.woff → KaTeX_Caligraphic-Regular.3gxeetazf831f.woff} +0 -0
- /package/out/_next/static/media/{KaTeX_Fraktur-Bold.0et27v~3~4uhe.ttf → KaTeX_Fraktur-Bold.19yqa_tc9d_gx.ttf} +0 -0
- /package/out/_next/static/media/{KaTeX_Fraktur-Bold.0e-16u10iuyyf.woff → KaTeX_Fraktur-Bold.1alcy76__wdj2.woff} +0 -0
- /package/out/_next/static/media/{KaTeX_Fraktur-Bold.0w23i72~hprpq.woff2 → KaTeX_Fraktur-Bold.2sasz-d-jtw8y.woff2} +0 -0
- /package/out/_next/static/media/{KaTeX_Fraktur-Regular.0b.riegzdfue2.woff → KaTeX_Fraktur-Regular.110oo81prr9n5.woff} +0 -0
- /package/out/_next/static/media/{KaTeX_Fraktur-Regular.0rekyoa-52fj_.woff2 → KaTeX_Fraktur-Regular.2d10y4xmjvzlf.woff2} +0 -0
- /package/out/_next/static/media/{KaTeX_Fraktur-Regular.0vjwa15znhk~4.ttf → KaTeX_Fraktur-Regular.2qhy34r6a05dn.ttf} +0 -0
- /package/out/_next/static/media/{KaTeX_Main-Bold.09i7~607shf-h.ttf → KaTeX_Main-Bold.0us_n0tnxlxu7.ttf} +0 -0
- /package/out/_next/static/media/{KaTeX_Main-Bold.09lmynrorhcbw.woff → KaTeX_Main-Bold.0v1esh257kqpe.woff} +0 -0
- /package/out/_next/static/media/{KaTeX_Main-Bold.16pfc63_du6mx.woff2 → KaTeX_Main-Bold.3-rowy8o6_4ky.woff2} +0 -0
- /package/out/_next/static/media/{KaTeX_Main-BoldItalic.0cp37g7x1q8h6.woff → KaTeX_Main-BoldItalic.13355ck5zr48q.woff} +0 -0
- /package/out/_next/static/media/{KaTeX_Main-BoldItalic.0d54rk08rx11s.woff2 → KaTeX_Main-BoldItalic.14r2naom8mrec.woff2} +0 -0
- /package/out/_next/static/media/{KaTeX_Main-BoldItalic.15j6k~hix2t_0.ttf → KaTeX_Main-BoldItalic.3x_u9cepaced0.ttf} +0 -0
- /package/out/_next/static/media/{KaTeX_Main-Italic.0382gqciexmbu.woff → KaTeX_Main-Italic.0afv392dj4w59.woff} +0 -0
- /package/out/_next/static/media/{KaTeX_Main-Italic.06o5nq0_91v60.woff2 → KaTeX_Main-Italic.0lig0v9j0700p.woff2} +0 -0
- /package/out/_next/static/media/{KaTeX_Main-Italic.0su4i6mm18-wo.ttf → KaTeX_Main-Italic.2hkw3230mfwcv.ttf} +0 -0
- /package/out/_next/static/media/{KaTeX_Main-Regular.08zh8z.7shijf.ttf → KaTeX_Main-Regular.0symfa7dqj6jd.ttf} +0 -0
- /package/out/_next/static/media/{KaTeX_Main-Regular.0diheg01zyoph.woff → KaTeX_Main-Regular.15u8r3b2y7fv4.woff} +0 -0
- /package/out/_next/static/media/{KaTeX_Main-Regular.0kaf-ag2_wkm-.woff2 → KaTeX_Main-Regular.1ryvsdzh2w1_e.woff2} +0 -0
- /package/out/_next/static/media/{KaTeX_Math-BoldItalic.0ajzxypnbx1h1.ttf → KaTeX_Math-BoldItalic.0y5w36a5aq__2.ttf} +0 -0
- /package/out/_next/static/media/{KaTeX_Math-BoldItalic.0ck1myuerwyqw.woff → KaTeX_Math-BoldItalic.12pl58orkw9rg.woff} +0 -0
- /package/out/_next/static/media/{KaTeX_Math-BoldItalic.0ja97dn.cpc87.woff2 → KaTeX_Math-BoldItalic.1oopuu636h4il.woff2} +0 -0
- /package/out/_next/static/media/{KaTeX_Math-Italic.09xkhecjcn5r9.woff → KaTeX_Math-Italic.0w0b1ugh62cfr.woff} +0 -0
- /package/out/_next/static/media/{KaTeX_Math-Italic.0x23a-bmp-5tg.ttf → KaTeX_Math-Italic.2vkekfblmz5nb.ttf} +0 -0
- /package/out/_next/static/media/{KaTeX_Math-Italic.0zrha2c4sl2je.woff2 → KaTeX_Math-Italic.32405s1aq8vas.woff2} +0 -0
- /package/out/_next/static/media/{KaTeX_SansSerif-Bold.05a9.pc1j_zx9.woff2 → KaTeX_SansSerif-Bold.0h3wi2z_eouyg.woff2} +0 -0
- /package/out/_next/static/media/{KaTeX_SansSerif-Bold.0jcl-ayi1uun0.woff → KaTeX_SansSerif-Bold.1ovw5p-yjp56g.woff} +0 -0
- /package/out/_next/static/media/{KaTeX_SansSerif-Bold.0re8y.dm7.mt5.ttf → KaTeX_SansSerif-Bold.2d03q85pwxpti.ttf} +0 -0
- /package/out/_next/static/media/{KaTeX_SansSerif-Italic.0a0234dc3s62j.woff2 → KaTeX_SansSerif-Italic.0wkjc4dm2kcit.woff2} +0 -0
- /package/out/_next/static/media/{KaTeX_SansSerif-Italic.0judofdln9731.woff → KaTeX_SansSerif-Italic.1qavw__2zz8gk.woff} +0 -0
- /package/out/_next/static/media/{KaTeX_SansSerif-Italic.10z1iap9pfus8.ttf → KaTeX_SansSerif-Italic.3i-q087b23-m8.ttf} +0 -0
- /package/out/_next/static/media/{KaTeX_SansSerif-Regular.0h9yjlugq4q_e.woff → KaTeX_SansSerif-Regular.1i4afx8nk8n4r.woff} +0 -0
- /package/out/_next/static/media/{KaTeX_SansSerif-Regular.0v6gcj32-czft.woff2 → KaTeX_SansSerif-Regular.2peiewu59z3d-.woff2} +0 -0
- /package/out/_next/static/media/{KaTeX_SansSerif-Regular.0zm18kga42ebc.ttf → KaTeX_SansSerif-Regular.31pbu25feko_c.ttf} +0 -0
- /package/out/_next/static/media/{KaTeX_Script-Regular.0c4.h-mer83d_.woff2 → KaTeX_Script-Regular.11h14300o9pd0.woff2} +0 -0
- /package/out/_next/static/media/{KaTeX_Script-Regular.0q14y6zkzlpob.ttf → KaTeX_Script-Regular.28p_x7iz71ofe.ttf} +0 -0
- /package/out/_next/static/media/{KaTeX_Script-Regular.0ze6v4r_-99oy.woff → KaTeX_Script-Regular.3110jb9c-bxna.woff} +0 -0
- /package/out/_next/static/media/{KaTeX_Size1-Regular.013x6a4ierotp.woff2 → KaTeX_Size1-Regular.03lhvx36ekcou.woff2} +0 -0
- /package/out/_next/static/media/{KaTeX_Size1-Regular.0kidw0oi.m68o.woff → KaTeX_Size1-Regular.1slf4bh0hc6vm.woff} +0 -0
- /package/out/_next/static/media/{KaTeX_Size1-Regular.0m6y-i6wfokni.ttf → KaTeX_Size1-Regular.1y57-ck23ey8c.ttf} +0 -0
- /package/out/_next/static/media/{KaTeX_Size2-Regular.0blpmluwilgbg.woff → KaTeX_Size2-Regular.0-kwyvx03omo8.woff} +0 -0
- /package/out/_next/static/media/{KaTeX_Size2-Regular.0d5inmyp-tyv3.woff2 → KaTeX_Size2-Regular.14s5gg-puz6h-.woff2} +0 -0
- /package/out/_next/static/media/{KaTeX_Size2-Regular.0wnhnvj-.k9d5.ttf → KaTeX_Size2-Regular.2u0s-b07k2o9m.ttf} +0 -0
- /package/out/_next/static/media/{KaTeX_Size3-Regular.01h0xm_sfctj3.woff → KaTeX_Size3-Regular.04o9a_02gu_e8.woff} +0 -0
- /package/out/_next/static/media/{KaTeX_Size3-Regular.0iukctyhw5j56.woff2 → KaTeX_Size3-Regular.1n1rgzz84z8r9.woff2} +0 -0
- /package/out/_next/static/media/{KaTeX_Size3-Regular.0jl8mqyf4gzpn.ttf → KaTeX_Size3-Regular.1pkn-dge4q0fv.ttf} +0 -0
- /package/out/_next/static/media/{KaTeX_Size4-Regular.0w3.rb_c4stzk.woff2 → KaTeX_Size4-Regular.2sgotkdv3dcyv.woff2} +0 -0
- /package/out/_next/static/media/{KaTeX_Size4-Regular.0wr_9l81-mu06.ttf → KaTeX_Size4-Regular.2uelkfk2yna5e.ttf} +0 -0
- /package/out/_next/static/media/{KaTeX_Size4-Regular.12tvaesf3.zl3.woff → KaTeX_Size4-Regular.3p2r1l7xmebxv.woff} +0 -0
- /package/out/_next/static/media/{KaTeX_Typewriter-Regular.0c4zdxz~8frhm.woff2 → KaTeX_Typewriter-Regular.11gr2d2wuwz77.woff2} +0 -0
- /package/out/_next/static/media/{KaTeX_Typewriter-Regular.0cgrzn5l3kao5.woff → KaTeX_Typewriter-Regular.12f8myjij3617.woff} +0 -0
- /package/out/_next/static/media/{KaTeX_Typewriter-Regular.128~qc3858otl.ttf → KaTeX_Typewriter-Regular.3nee9kjfy6nm8.ttf} +0 -0
package/server/src/index.js
CHANGED
|
@@ -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 (
|
|
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 {
|
|
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:
|
|
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 {
|
|
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 (
|
|
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 {
|
|
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:
|
|
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 {
|
|
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
|
|
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
|
|
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.#
|
|
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}}
|