agmon 0.2.0 → 0.2.2
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/.next/BUILD_ID +1 -1
- package/.next/build-manifest.json +3 -3
- package/.next/fallback-build-manifest.json +3 -3
- package/.next/prerender-manifest.json +8 -8
- package/.next/server/app/_global-error.html +1 -1
- package/.next/server/app/_global-error.rsc +1 -1
- package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/server/app/_not-found.html +1 -1
- package/.next/server/app/_not-found.rsc +15 -13
- package/.next/server/app/_not-found.segments/_full.segment.rsc +15 -13
- package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +8 -6
- package/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/api/media/route.js.nft.json +1 -1
- package/.next/server/app/api/reports/tokens/route.js.nft.json +1 -1
- package/.next/server/app/api/sessions/[id]/transcript/route.js +1 -1
- package/.next/server/app/api/sessions/[id]/transcript/route.js.nft.json +1 -1
- package/.next/server/app/api/traces/stream/route.js +1 -1
- package/.next/server/app/api/traces/stream/route.js.nft.json +1 -1
- package/.next/server/app/api/version/route.js.nft.json +1 -1
- package/.next/server/app/api/workspace/file-content/route.js.nft.json +1 -1
- package/.next/server/app/api/workspace/files/route.js.nft.json +1 -1
- package/.next/server/app/chat/page.js.nft.json +1 -1
- package/.next/server/app/chat/page_client-reference-manifest.js +1 -1
- package/.next/server/app/chat.html +1 -1
- package/.next/server/app/chat.rsc +20 -19
- package/.next/server/app/chat.segments/_full.segment.rsc +20 -19
- package/.next/server/app/chat.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/chat.segments/chat/__PAGE__.segment.rsc +22 -20
- package/.next/server/app/index.html +1 -1
- package/.next/server/app/index.rsc +20 -18
- package/.next/server/app/index.segments/__PAGE__.segment.rsc +10 -9
- package/.next/server/app/index.segments/_full.segment.rsc +20 -18
- package/.next/server/app/index.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/page.js.nft.json +1 -1
- package/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/server/app/reports/page.js.nft.json +1 -1
- package/.next/server/app/reports/page_client-reference-manifest.js +1 -1
- package/.next/server/app/reports.html +1 -1
- package/.next/server/app/reports.rsc +4 -4
- package/.next/server/app/reports.segments/_full.segment.rsc +4 -4
- package/.next/server/app/reports.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/reports.segments/reports/__PAGE__.segment.rsc +6 -5
- package/.next/server/app/store/page.js.nft.json +1 -1
- package/.next/server/app/store/page_client-reference-manifest.js +1 -1
- package/.next/server/app/store.html +1 -1
- package/.next/server/app/store.rsc +5 -5
- package/.next/server/app/store.segments/_full.segment.rsc +5 -5
- package/.next/server/app/store.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/store.segments/store/__PAGE__.segment.rsc +7 -6
- package/.next/server/chunks/[root-of-the-server]__0dw97_pahi8uf._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__0dw97_pahi8uf._.js.map +1 -0
- package/.next/server/chunks/_0ao-_t4jkb46h._.js +2 -2
- package/.next/server/chunks/_0ao-_t4jkb46h._.js.map +1 -1
- package/.next/server/chunks/_1-8ipqazoyrrk._.js +1 -1
- package/.next/server/chunks/_1-8ipqazoyrrk._.js.map +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__0i2rbwbkxbdog._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__0i2rbwbkxbdog._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__0qzscpxebh28_._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__0qzscpxebh28_._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__1jwplflwix8wi._.js +427 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__1jwplflwix8wi._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__1kt7h7bz59mdn._.js +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__1kt7h7bz59mdn._.js.map +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__1otsvjy81s8my._.js +427 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__1otsvjy81s8my._.js.map +1 -0
- package/.next/server/chunks/ssr/_0e3frtjrk-wi9._.js +3 -0
- package/.next/server/chunks/ssr/_0e3frtjrk-wi9._.js.map +1 -0
- package/.next/server/chunks/ssr/_0h29jdf4relbq._.js +3 -0
- package/.next/server/chunks/ssr/_0h29jdf4relbq._.js.map +1 -0
- package/.next/server/chunks/ssr/_0zel-n0h--cnl._.js +3 -0
- package/.next/server/chunks/ssr/_0zel-n0h--cnl._.js.map +1 -0
- package/.next/server/chunks/ssr/_1487-zi23c5eb._.js +1 -1
- package/.next/server/chunks/ssr/_1487-zi23c5eb._.js.map +1 -1
- package/.next/server/chunks/ssr/_1vgwoe-shb9z7._.js +3 -0
- package/.next/server/chunks/ssr/_1vgwoe-shb9z7._.js.map +1 -0
- package/.next/server/chunks/ssr/_1zm4m-s8k7oe3._.js +3 -0
- package/.next/server/chunks/ssr/_1zm4m-s8k7oe3._.js.map +1 -0
- package/.next/server/chunks/ssr/_202tntue-jj6s._.js +3 -0
- package/.next/server/chunks/ssr/_202tntue-jj6s._.js.map +1 -0
- package/.next/server/chunks/ssr/{node_modules_1wlwrgnt65zus._.js → node_modules_00ebs67b4u61w._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_0f773uqgzj7y7._.js → node_modules_01avo0bde3tpo._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_0z3elum1675ve._.js → node_modules_01l0208e5kqic._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1c8i3jrmo4393._.js → node_modules_033x29yqle_sj._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1kr1c-ncf8q9t._.js → node_modules_03wbg__aslvui._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_02jwra-d9iqim._.js → node_modules_06mgkab1v5iox._.js} +2 -2
- package/.next/server/chunks/ssr/{node_modules_0z7rdbaf13024._.js → node_modules_08-bqkrz7sh0l._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_13nsmuhey_ti_._.js → node_modules_089w9jm7s2qa3._.js} +2 -2
- package/.next/server/chunks/ssr/{node_modules_0m3ihe65818y_._.js → node_modules_08q6a-f2itxyo._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_0__m9_odts7_e._.js → node_modules_0cy47-s63xjzh._.js} +2 -2
- package/.next/server/chunks/ssr/{node_modules_0b8ndnuql44z1._.js → node_modules_0czh0jcnsm5e6._.js} +2 -2
- package/.next/server/chunks/ssr/{node_modules_0fs8mckuwk2tj._.js → node_modules_0e6qoh__e4a69._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_05w7qhtrzvnk6._.js → node_modules_0fv321j1nslkb._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_061uaylfjwqk7._.js → node_modules_0g-wb7h-hsdwc._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1ll-58c1c-qab._.js → node_modules_0hb0q0epwvp--._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_0dq0dsblt-q0g._.js → node_modules_0l-y0kqtu_r3o._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1zs2nou5uogby._.js → node_modules_0l814qpw677vm._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1xyxigbqzb8vs._.js → node_modules_0o63z1gd17rhb._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1-sz_-qddwilq._.js → node_modules_0oz_zzlh8exwx._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_0oukyh0iq21ow._.js → node_modules_0so2agzqd9p8l._.js} +2 -2
- package/.next/server/chunks/ssr/{node_modules_12qw2ucebdvol._.js → node_modules_0w2w61b8bh769._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1dff7b_kvngr-._.js → node_modules_0wd6szix_zku7._.js} +2 -2
- package/.next/server/chunks/ssr/{node_modules_0fd1swhk15cx3._.js → node_modules_0wp7omf0xblv8._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_0nde84kzuwv2n._.js → node_modules_0yayrqhzfk8wy._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_0f4xh33v3iltc._.js → node_modules_0zb0i39mnjdf3._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1iovyom0-y7o_._.js → node_modules_10c51o2qv6mbi._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_02nv3yff2pqh8._.js → node_modules_10g1mmrf63d8a._.js} +2 -2
- package/.next/server/chunks/ssr/{node_modules_0-6sb1gkbjo93._.js → node_modules_152txg4c7ose3._.js} +2 -2
- package/.next/server/chunks/ssr/{node_modules_12qn4bepdou5v._.js → node_modules_185fuy4cv7loa._.js} +2 -2
- package/.next/server/chunks/ssr/{node_modules_1-iyhsn_1p9nx._.js → node_modules_19vqq7rvf-_ar._.js} +2 -2
- package/.next/server/chunks/ssr/{node_modules_0hqa9oxz17hip._.js → node_modules_1hd7j-tdb8drq._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1rlnehdn16ay-._.js → node_modules_1hu83gui7_nj2._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_07maxxr-t28ql._.js → node_modules_1i3x2csuq_-jt._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_0kovk4b6czb22._.js → node_modules_1j8hpoiygrs5e._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_0zc49fdcopqu9._.js → node_modules_1l2g7btuh3e4s._.js} +2 -2
- package/.next/server/chunks/ssr/{node_modules_0t4h1rucl35hl._.js → node_modules_1n4kig4mj6n4s._.js} +2 -2
- package/.next/server/chunks/ssr/{node_modules_0vn0kjn_84lmn._.js → node_modules_1nz3ckv6tu_66._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_0-nvg0c4pgfb8._.js → node_modules_1qnypguag6s_l._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1v4lexrfhnlhs._.js → node_modules_1r6w-jlme6d10._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1f4geuvkvlxj1._.js → node_modules_1s8oxeqa5_i3k._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1216007ogd5om._.js → node_modules_1tskcaktx6ods._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_02vtgweceovke._.js → node_modules_1xz1dstlo5ri-._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1kv6lsckqs-m0._.js → node_modules_1zii7uk468cay._.js} +2 -2
- package/.next/server/chunks/ssr/{node_modules_katex_dist_katex_mjs_0bmuudv_6eypr._.js → node_modules_katex_dist_katex_mjs_067omoj5szuys._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_katex_dist_katex_mjs_0qyy6pq9uzpk0._.js → node_modules_katex_dist_katex_mjs_1604s1ky8db8u._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_lucide-react_dist_esm_1d8fezw1qsiob._.js → node_modules_lucide-react_dist_esm_0-5bcc79665lq._.js} +2 -2
- package/.next/server/chunks/ssr/node_modules_lucide-react_dist_esm_0-5bcc79665lq._.js.map +1 -0
- package/.next/server/chunks/ssr/{node_modules_lucide-react_dist_esm_0pezg1352q13j._.js → node_modules_lucide-react_dist_esm_0axoa1eg51x1-._.js} +2 -2
- package/.next/server/chunks/ssr/node_modules_lucide-react_dist_esm_0axoa1eg51x1-._.js.map +1 -0
- package/.next/server/chunks/ssr/{node_modules_lucide-react_dist_esm_131i-tjzse3ye._.js → node_modules_lucide-react_dist_esm_18ei1-na3kusb._.js} +2 -2
- package/.next/server/chunks/ssr/node_modules_lucide-react_dist_esm_18ei1-na3kusb._.js.map +1 -0
- package/.next/server/chunks/ssr/{node_modules_lucide-react_dist_esm_1to-9cv1ysvs6._.js → node_modules_lucide-react_dist_esm_1tx493x2_auzs._.js} +2 -2
- package/.next/server/chunks/ssr/node_modules_lucide-react_dist_esm_1tx493x2_auzs._.js.map +1 -0
- package/.next/server/chunks/ssr/node_modules_mermaid_dist_mermaid_core_mjs_06it7ktosm1dr._.js +3 -0
- package/.next/server/chunks/ssr/node_modules_mermaid_dist_mermaid_core_mjs_06it7ktosm1dr._.js.map +1 -0
- package/.next/server/chunks/ssr/src_app_page_1vqfk0-j72fp6.js +1 -1
- package/.next/server/chunks/ssr/src_app_page_1vqfk0-j72fp6.js.map +1 -1
- package/.next/server/chunks/ssr/src_components_reports_TokenReportView_jsx_1g3p_enbbsadt._.js +1 -1
- package/.next/server/chunks/ssr/src_components_reports_TokenReportView_jsx_1g3p_enbbsadt._.js.map +1 -1
- package/.next/server/middleware-build-manifest.js +3 -3
- package/.next/server/pages/404.html +1 -1
- package/.next/server/pages/500.html +1 -1
- package/.next/server/preview-props.json +3 -3
- package/.next/server/server-reference-manifest.js +1 -1
- package/.next/server/server-reference-manifest.json +1 -1
- package/.next/static/chunks/0jo6fy2c_gmqn.js +1 -0
- package/.next/static/chunks/0r9apkv3exqv-.js +1 -0
- package/.next/static/chunks/1n_lb7wmn81jj.js +1 -0
- package/.next/static/chunks/2-w116ewoshm1.js +1 -0
- package/.next/static/chunks/23uup1e8841av.js +1 -0
- package/.next/static/chunks/2q9cwykv6ox1t.css +1 -0
- package/.next/static/chunks/2rx7xvi55ohln.js +1 -0
- package/.next/static/chunks/2zf44j8sjo0w0.js +425 -0
- package/.next/static/chunks/3rtpnpqd981z9.js +1 -0
- package/.next/trace +1 -1
- package/.next/trace-build +1 -1
- package/bin/cli.js +12 -0
- package/package.json +1 -1
- package/src/app/api/traces/stream/route.js +41 -5
- package/src/app/chat/page.js +14 -14
- package/src/app/globals.css +128 -0
- package/src/app/layout.js +8 -2
- package/src/app/page.js +18 -2
- package/src/components/chat/ChatMessageItem.js +12 -12
- package/src/components/chat/CodeBlock.js +5 -5
- package/src/components/chat/DiffViewer.js +27 -27
- package/src/components/chat/MarkdownRenderer.js +19 -19
- package/src/components/chat/SessionChatView.js +42 -42
- package/src/components/chat/SessionSearch.js +8 -8
- package/src/components/chat/ThinkingAccordion.js +3 -3
- package/src/components/chat/ToolCallCard.js +6 -6
- package/src/components/chat/ToolOutputView.js +19 -19
- package/src/components/factory/office-canvas.js +165 -3
- package/src/components/factory/scene/characters.js +267 -32
- package/src/components/layout/BottomPanel.jsx +6 -6
- package/src/components/layout/CommandPalette.jsx +12 -0
- package/src/components/layout/EditorTabs.jsx +17 -0
- package/src/components/layout/LayoutToggles.jsx +31 -2
- package/src/components/layout/LeftSidebar.jsx +88 -6
- package/src/components/layout/RightSidebar.jsx +8 -8
- package/src/components/layout/StatusBar.jsx +1 -1
- package/src/components/layout/TitleBar.jsx +76 -2
- package/src/components/layout/VSCodeWorkbench.jsx +99 -14
- package/src/components/store/Item3DRenderer.jsx +602 -48
- package/src/components/store/LiveFittingRoom.jsx +55 -791
- package/src/components/store/LiveReactAgent.jsx +1637 -0
- package/src/components/store/SupporterStoreModal.jsx +3 -2
- package/src/components/store/SupporterStoreView.jsx +94 -34
- package/src/components/theme/ThemeSettingsModal.jsx +40 -40
- package/src/components/ui/Button.jsx +4 -4
- package/src/components/ui/Input.jsx +1 -1
- package/src/components/ui/Modal.jsx +6 -6
- package/src/components/ui/Select.jsx +3 -3
- package/src/lib/catalog/auras.js +226 -1199
- package/src/lib/catalog/index.js +60 -1
- package/src/lib/catalog/pets.js +291 -2398
- package/src/lib/catalog/props.js +488 -4199
- package/src/lib/catalog/skins.js +773 -3249
- package/src/lib/catalog/trophies.js +226 -1199
- package/src/lib/mockTraces.js +28 -26
- package/src/lib/parsers/codexParser.js +373 -0
- package/src/lib/parsers/transcriptParser.js +35 -3
- package/src/lib/supporterStore.js +1 -1
- package/src/lib/traceContract.js +1 -1
- package/src/lib/useFactoryTraces.js +70 -5
- package/src/lib/watchers/antigravityWatcher.js +15 -1
- package/src/lib/watchers/claudeWatcher.js +86 -70
- package/src/lib/watchers/codexWatcher.js +482 -0
- package/src/lib/watchers/watcherManager.js +46 -30
- package/.next/server/chunks/src_lib_watchers_antigravityWatcher_0w1-atg39y__p.js +0 -3
- package/.next/server/chunks/src_lib_watchers_antigravityWatcher_0w1-atg39y__p.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__19s2v5rryc14o._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__19s2v5rryc14o._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__1_jerxrctq6ev._.js +0 -427
- package/.next/server/chunks/ssr/[root-of-the-server]__1_jerxrctq6ev._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__1pvso-uyf--97._.js +0 -427
- package/.next/server/chunks/ssr/[root-of-the-server]__1pvso-uyf--97._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__1y78dc7oiz7ks._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__1y78dc7oiz7ks._.js.map +0 -1
- package/.next/server/chunks/ssr/_0ozao7omdwbvd._.js +0 -3
- package/.next/server/chunks/ssr/_0ozao7omdwbvd._.js.map +0 -1
- package/.next/server/chunks/ssr/_0rcmpdyxc1qwj._.js +0 -3
- package/.next/server/chunks/ssr/_0rcmpdyxc1qwj._.js.map +0 -1
- package/.next/server/chunks/ssr/_0wv0xnhun3mk7._.js +0 -3
- package/.next/server/chunks/ssr/_0wv0xnhun3mk7._.js.map +0 -1
- package/.next/server/chunks/ssr/_17rmaft1zusua._.js +0 -3
- package/.next/server/chunks/ssr/_17rmaft1zusua._.js.map +0 -1
- package/.next/server/chunks/ssr/_1e-d4pcj59a7a._.js +0 -3
- package/.next/server/chunks/ssr/_1e-d4pcj59a7a._.js.map +0 -1
- package/.next/server/chunks/ssr/_1qr5gnh64z8pg._.js +0 -3
- package/.next/server/chunks/ssr/_1qr5gnh64z8pg._.js.map +0 -1
- package/.next/server/chunks/ssr/node_modules_lucide-react_dist_esm_0pezg1352q13j._.js.map +0 -1
- package/.next/server/chunks/ssr/node_modules_lucide-react_dist_esm_131i-tjzse3ye._.js.map +0 -1
- package/.next/server/chunks/ssr/node_modules_lucide-react_dist_esm_1d8fezw1qsiob._.js.map +0 -1
- package/.next/server/chunks/ssr/node_modules_lucide-react_dist_esm_1to-9cv1ysvs6._.js.map +0 -1
- package/.next/static/chunks/0_3s_e4gd9xl0.js +0 -1
- package/.next/static/chunks/0i4kx4yl-dwfg.js +0 -425
- package/.next/static/chunks/0z0jbobmmvqoc.js +0 -1
- package/.next/static/chunks/1_a_gmob5qzho.js +0 -1
- package/.next/static/chunks/1ifqr4qo4697b.js +0 -1
- package/.next/static/chunks/2ccq9i8ev4dsx.js +0 -1
- package/.next/static/chunks/2mif7onk_9jy-.css +0 -1
- package/.next/static/chunks/40wyf-mv0tiu3.js +0 -1
- /package/.next/server/chunks/ssr/{node_modules_1c8i3jrmo4393._.js.map → node_modules_00ebs67b4u61w._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules_0f773uqgzj7y7._.js.map → node_modules_01avo0bde3tpo._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules_0z3elum1675ve._.js.map → node_modules_01l0208e5kqic._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules_1wlwrgnt65zus._.js.map → node_modules_033x29yqle_sj._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules_1kr1c-ncf8q9t._.js.map → node_modules_03wbg__aslvui._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules_02jwra-d9iqim._.js.map → node_modules_06mgkab1v5iox._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules_0fs8mckuwk2tj._.js.map → node_modules_08-bqkrz7sh0l._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules_0-6sb1gkbjo93._.js.map → node_modules_089w9jm7s2qa3._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules_02vtgweceovke._.js.map → node_modules_08q6a-f2itxyo._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules_0__m9_odts7_e._.js.map → node_modules_0cy47-s63xjzh._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules_02nv3yff2pqh8._.js.map → node_modules_0czh0jcnsm5e6._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules_0z7rdbaf13024._.js.map → node_modules_0e6qoh__e4a69._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules_0-nvg0c4pgfb8._.js.map → node_modules_0fv321j1nslkb._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules_061uaylfjwqk7._.js.map → node_modules_0g-wb7h-hsdwc._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules_0t4h1rucl35hl._.js.map → node_modules_0hb0q0epwvp--._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules_0dq0dsblt-q0g._.js.map → node_modules_0l-y0kqtu_r3o._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules_0zc49fdcopqu9._.js.map → node_modules_0l814qpw677vm._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules_1xyxigbqzb8vs._.js.map → node_modules_0o63z1gd17rhb._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules_1-iyhsn_1p9nx._.js.map → node_modules_0oz_zzlh8exwx._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules_0oukyh0iq21ow._.js.map → node_modules_0so2agzqd9p8l._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules_07maxxr-t28ql._.js.map → node_modules_0w2w61b8bh769._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules_1dff7b_kvngr-._.js.map → node_modules_0wd6szix_zku7._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules_0fd1swhk15cx3._.js.map → node_modules_0wp7omf0xblv8._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules_0nde84kzuwv2n._.js.map → node_modules_0yayrqhzfk8wy._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules_0f4xh33v3iltc._.js.map → node_modules_0zb0i39mnjdf3._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules_1-sz_-qddwilq._.js.map → node_modules_10c51o2qv6mbi._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules_0b8ndnuql44z1._.js.map → node_modules_10g1mmrf63d8a._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules_13nsmuhey_ti_._.js.map → node_modules_152txg4c7ose3._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules_12qn4bepdou5v._.js.map → node_modules_185fuy4cv7loa._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules_1iovyom0-y7o_._.js.map → node_modules_19vqq7rvf-_ar._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules_0hqa9oxz17hip._.js.map → node_modules_1hd7j-tdb8drq._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules_1rlnehdn16ay-._.js.map → node_modules_1hu83gui7_nj2._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules_12qw2ucebdvol._.js.map → node_modules_1i3x2csuq_-jt._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules_0kovk4b6czb22._.js.map → node_modules_1j8hpoiygrs5e._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules_1ll-58c1c-qab._.js.map → node_modules_1l2g7btuh3e4s._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules_1zs2nou5uogby._.js.map → node_modules_1n4kig4mj6n4s._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules_0vn0kjn_84lmn._.js.map → node_modules_1nz3ckv6tu_66._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules_05w7qhtrzvnk6._.js.map → node_modules_1qnypguag6s_l._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules_1v4lexrfhnlhs._.js.map → node_modules_1r6w-jlme6d10._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules_1f4geuvkvlxj1._.js.map → node_modules_1s8oxeqa5_i3k._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules_1216007ogd5om._.js.map → node_modules_1tskcaktx6ods._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules_0m3ihe65818y_._.js.map → node_modules_1xz1dstlo5ri-._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules_1kv6lsckqs-m0._.js.map → node_modules_1zii7uk468cay._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules_katex_dist_katex_mjs_0bmuudv_6eypr._.js.map → node_modules_katex_dist_katex_mjs_067omoj5szuys._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules_katex_dist_katex_mjs_0qyy6pq9uzpk0._.js.map → node_modules_katex_dist_katex_mjs_1604s1ky8db8u._.js.map} +0 -0
- /package/.next/static/{sQnXeiP8rV6y2v0az_xw3 → dGN2VKPk5TJgezxS3JvRc}/_buildManifest.js +0 -0
- /package/.next/static/{sQnXeiP8rV6y2v0az_xw3 → dGN2VKPk5TJgezxS3JvRc}/_clientMiddlewareManifest.js +0 -0
- /package/.next/static/{sQnXeiP8rV6y2v0az_xw3 → dGN2VKPk5TJgezxS3JvRc}/_ssgManifest.js +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
|
|
3
|
-
import React, { useState, useEffect,
|
|
3
|
+
import React, { useState, useEffect, useMemo } from "react";
|
|
4
4
|
import {
|
|
5
5
|
Sparkles,
|
|
6
6
|
Bot,
|
|
@@ -27,20 +27,9 @@ import {
|
|
|
27
27
|
equipCustomLoadout,
|
|
28
28
|
SUPPORTER_CHANGE_EVENT,
|
|
29
29
|
} from "@/lib/supporterStore";
|
|
30
|
+
import { LiveReactAgent } from "./LiveReactAgent";
|
|
31
|
+
|
|
30
32
|
|
|
31
|
-
// Color presets for known archetypes & themes
|
|
32
|
-
const THEME_STYLES = {
|
|
33
|
-
theme_default: { name: "Classic Charcoal Slate", base: "#14161a", tile: "#1e222b", grid: "#2d3548", glow: "#38bdf8" },
|
|
34
|
-
theme_cyberpunk: { name: "Cyberpunk Neon Night", base: "#0d0819", tile: "#1c0d33", grid: "#ff2a85", glow: "#00f0ff" },
|
|
35
|
-
theme_matrix: { name: "Phosphor Matrix Terminal", base: "#020d05", tile: "#051f0b", grid: "#00ff66", glow: "#10b981" },
|
|
36
|
-
theme_wood: { name: "Cozy Scandinavian Loft", base: "#1f1610", tile: "#2c2017", grid: "#451a03", glow: "#f59e0b" },
|
|
37
|
-
theme_space: { name: "Deep Space Void", base: "#030712", tile: "#0b1329", grid: "#1e1b4b", glow: "#6366f1" },
|
|
38
|
-
theme_blueprint: { name: "Blueprint CAD Grid", base: "#0b1a30", tile: "#1e3a8a", grid: "#1d4ed8", glow: "#38bdf8" },
|
|
39
|
-
theme_synthwave: { name: "Retro Synthwave 80s", base: "#1a052e", tile: "#3b0764", grid: "#d946ef", glow: "#ec4899" },
|
|
40
|
-
theme_sakura_cyber: { name: "Sakura Cyber Garden", base: "#1c0e18", tile: "#2e1022", grid: "#f43f5e", glow: "#fb7185" },
|
|
41
|
-
theme_nordic_ice: { name: "Minimalist Nordic Ice", base: "#0f172a", tile: "#1e293b", grid: "#38bdf8", glow: "#e2e8f0" },
|
|
42
|
-
theme_industrial: { name: "High-Voltage Industrial", base: "#18181b", tile: "#27272a", grid: "#eab308", glow: "#f59e0b" },
|
|
43
|
-
};
|
|
44
33
|
|
|
45
34
|
export default function LiveFittingRoom({ initialStoreState, onEquipSuccess }) {
|
|
46
35
|
const [storeState, setStoreState] = useState(initialStoreState || getSupporterState());
|
|
@@ -64,10 +53,7 @@ export default function LiveFittingRoom({ initialStoreState, onEquipSuccess }) {
|
|
|
64
53
|
const [archetypeFilter, setArchetypeFilter] = useState("all");
|
|
65
54
|
const [saveToast, setSaveToast] = useState(false);
|
|
66
55
|
|
|
67
|
-
const
|
|
68
|
-
const animFrameRef = useRef(null);
|
|
69
|
-
const telemetryRef = useRef({ bob: 0, shake: 0, rotL: 0, rotR: 0, blink: false, fps: 60 });
|
|
70
|
-
const [telemetry, setTelemetry] = useState(telemetryRef.current);
|
|
56
|
+
const [telemetry, setTelemetry] = useState({ bob: 0, shake: 0, rotL: 0, rotR: 0, blink: false, fps: 60 });
|
|
71
57
|
|
|
72
58
|
// Sync with store state changes
|
|
73
59
|
useEffect(() => {
|
|
@@ -96,760 +82,7 @@ export default function LiveFittingRoom({ initialStoreState, onEquipSuccess }) {
|
|
|
96
82
|
return (COSMETIC_CATALOG.officeThemes || []).find((t) => t.id === activeThemeId) || (COSMETIC_CATALOG.officeThemes || [])[0];
|
|
97
83
|
}, [activeThemeId]);
|
|
98
84
|
|
|
99
|
-
// --------------------------------------------------------------------------
|
|
100
|
-
// CANVAS ANIMATION ENGINE (Procedural Vector Drawing)
|
|
101
|
-
// --------------------------------------------------------------------------
|
|
102
|
-
useEffect(() => {
|
|
103
|
-
const canvas = canvasRef.current;
|
|
104
|
-
if (!canvas) return;
|
|
105
|
-
const ctx = canvas.getContext("2d");
|
|
106
|
-
|
|
107
|
-
let lastTime = performance.now();
|
|
108
|
-
let frameCount = 0;
|
|
109
|
-
let fpsTimer = 0;
|
|
110
|
-
|
|
111
|
-
const render = (now) => {
|
|
112
|
-
const dt = now - lastTime;
|
|
113
|
-
lastTime = now;
|
|
114
|
-
|
|
115
|
-
// Telemetry FPS
|
|
116
|
-
frameCount++;
|
|
117
|
-
fpsTimer += dt;
|
|
118
|
-
if (fpsTimer >= 500) {
|
|
119
|
-
telemetryRef.current.fps = Math.round((frameCount * 1000) / fpsTimer);
|
|
120
|
-
frameCount = 0;
|
|
121
|
-
fpsTimer = 0;
|
|
122
|
-
setTelemetry({ ...telemetryRef.current });
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
ctx.clearRect(0, 0, canvas.width, canvas.height);
|
|
126
|
-
|
|
127
|
-
const cx = canvas.width / 2;
|
|
128
|
-
const cy = canvas.height / 2 + 55;
|
|
129
|
-
const t = isPlaying ? now : 0;
|
|
130
|
-
|
|
131
|
-
// 1. Draw Floor Theme Environment Background
|
|
132
|
-
drawFloorEnvironment(ctx, cx, cy, canvas.width, canvas.height, activeThemeId, t);
|
|
133
|
-
|
|
134
|
-
// 2. Draw Aura Behind Character
|
|
135
|
-
drawAura(ctx, cx, cy - 50, currentAuraItem, t, currentMode);
|
|
136
|
-
|
|
137
|
-
// 3. Draw Character Avatar Behind Desk
|
|
138
|
-
const tel = drawCharacter(
|
|
139
|
-
ctx,
|
|
140
|
-
cx,
|
|
141
|
-
cy - 50,
|
|
142
|
-
1.75,
|
|
143
|
-
t,
|
|
144
|
-
currentMode,
|
|
145
|
-
intensity,
|
|
146
|
-
currentSkinItem,
|
|
147
|
-
clientType
|
|
148
|
-
);
|
|
149
|
-
|
|
150
|
-
// 4. Draw Desk & Workstation in Front of Character
|
|
151
|
-
drawDesk(
|
|
152
|
-
ctx,
|
|
153
|
-
cx,
|
|
154
|
-
cy,
|
|
155
|
-
t,
|
|
156
|
-
intensity,
|
|
157
|
-
currentMode,
|
|
158
|
-
clientType,
|
|
159
|
-
activeProps,
|
|
160
|
-
currentSkinItem?.color || "#00f0ff"
|
|
161
|
-
);
|
|
162
|
-
|
|
163
|
-
// 5. Draw Companion Pet on/near Desk
|
|
164
|
-
drawPet(ctx, cx + 80, cy + 2, currentPetItem, t, currentMode);
|
|
165
|
-
|
|
166
|
-
telemetryRef.current.bob = tel.bob;
|
|
167
|
-
telemetryRef.current.shake = tel.shake;
|
|
168
|
-
telemetryRef.current.rotL = tel.rotL;
|
|
169
|
-
telemetryRef.current.rotR = tel.rotR;
|
|
170
|
-
telemetryRef.current.blink = tel.blinking;
|
|
171
|
-
|
|
172
|
-
if (isPlaying) {
|
|
173
|
-
animFrameRef.current = requestAnimationFrame(render);
|
|
174
|
-
}
|
|
175
|
-
};
|
|
176
|
-
|
|
177
|
-
animFrameRef.current = requestAnimationFrame(render);
|
|
178
|
-
return () => {
|
|
179
|
-
if (animFrameRef.current) cancelAnimationFrame(animFrameRef.current);
|
|
180
|
-
};
|
|
181
|
-
}, [
|
|
182
|
-
activeSkinId,
|
|
183
|
-
activePetId,
|
|
184
|
-
activeProps,
|
|
185
|
-
activeAuraId,
|
|
186
|
-
activeThemeId,
|
|
187
|
-
currentMode,
|
|
188
|
-
intensity,
|
|
189
|
-
clientType,
|
|
190
|
-
isPlaying,
|
|
191
|
-
currentSkinItem,
|
|
192
|
-
currentPetItem,
|
|
193
|
-
currentAuraItem,
|
|
194
|
-
currentThemeId,
|
|
195
|
-
]);
|
|
196
|
-
|
|
197
|
-
// --------------------------------------------------------------------------
|
|
198
|
-
// DRAWING ROUTINES (Canvas 2D Vector Primitives)
|
|
199
|
-
// --------------------------------------------------------------------------
|
|
200
|
-
|
|
201
|
-
function drawFloorEnvironment(ctx, cx, cy, width, height, themeId, t) {
|
|
202
|
-
ctx.save();
|
|
203
|
-
const style = THEME_STYLES[themeId] || THEME_STYLES.theme_default;
|
|
204
|
-
|
|
205
|
-
// Background radial ambient glow
|
|
206
|
-
const bgRad = ctx.createRadialGradient(cx, cy - 20, 20, cx, cy, width * 0.7);
|
|
207
|
-
bgRad.addColorStop(0, style.base);
|
|
208
|
-
bgRad.addColorStop(0.7, "#08090c");
|
|
209
|
-
bgRad.addColorStop(1, "#040507");
|
|
210
|
-
ctx.fillStyle = bgRad;
|
|
211
|
-
ctx.fillRect(0, 0, width, height);
|
|
212
|
-
|
|
213
|
-
// 3D Isometric Floor Slate
|
|
214
|
-
ctx.save();
|
|
215
|
-
ctx.translate(cx, cy + 70);
|
|
216
|
-
|
|
217
|
-
// Outer Floor Shadow
|
|
218
|
-
ctx.fillStyle = "rgba(0,0,0,0.55)";
|
|
219
|
-
ctx.beginPath();
|
|
220
|
-
ctx.ellipse(0, 15, 230, 75, 0, 0, Math.PI * 2);
|
|
221
|
-
ctx.fill();
|
|
222
|
-
|
|
223
|
-
// Isometric Floor Polygon
|
|
224
|
-
const fW = 240;
|
|
225
|
-
const fH = 110;
|
|
226
|
-
ctx.beginPath();
|
|
227
|
-
ctx.moveTo(0, -fH);
|
|
228
|
-
ctx.lineTo(fW, 0);
|
|
229
|
-
ctx.lineTo(0, fH);
|
|
230
|
-
ctx.lineTo(-fW, 0);
|
|
231
|
-
ctx.closePath();
|
|
232
|
-
|
|
233
|
-
const fGrad = ctx.createLinearGradient(0, -fH, 0, fH);
|
|
234
|
-
fGrad.addColorStop(0, style.tile);
|
|
235
|
-
fGrad.addColorStop(1, style.base);
|
|
236
|
-
ctx.fillStyle = fGrad;
|
|
237
|
-
ctx.fill();
|
|
238
|
-
|
|
239
|
-
// Floor Bevel Rim
|
|
240
|
-
ctx.strokeStyle = style.grid;
|
|
241
|
-
ctx.lineWidth = 1.8;
|
|
242
|
-
ctx.stroke();
|
|
243
|
-
|
|
244
|
-
// Floor Edge Thickness (Extrusion)
|
|
245
|
-
ctx.fillStyle = "rgba(0,0,0,0.4)";
|
|
246
|
-
ctx.beginPath();
|
|
247
|
-
ctx.moveTo(-fW, 0);
|
|
248
|
-
ctx.lineTo(0, fH);
|
|
249
|
-
ctx.lineTo(0, fH + 12);
|
|
250
|
-
ctx.lineTo(-fW, 12);
|
|
251
|
-
ctx.closePath();
|
|
252
|
-
ctx.fill();
|
|
253
|
-
|
|
254
|
-
ctx.fillStyle = "rgba(0,0,0,0.6)";
|
|
255
|
-
ctx.beginPath();
|
|
256
|
-
ctx.moveTo(fW, 0);
|
|
257
|
-
ctx.lineTo(0, fH);
|
|
258
|
-
ctx.lineTo(0, fH + 12);
|
|
259
|
-
ctx.lineTo(fW, 12);
|
|
260
|
-
ctx.closePath();
|
|
261
|
-
ctx.fill();
|
|
262
|
-
|
|
263
|
-
// Isometric Gridlines
|
|
264
|
-
ctx.strokeStyle = style.grid;
|
|
265
|
-
ctx.lineWidth = 1;
|
|
266
|
-
ctx.globalAlpha = 0.45;
|
|
267
|
-
for (let i = -3; i <= 3; i++) {
|
|
268
|
-
const off = i * 40;
|
|
269
|
-
ctx.beginPath();
|
|
270
|
-
ctx.moveTo(-fW / 2 + off, -fH / 2);
|
|
271
|
-
ctx.lineTo(fW / 2 + off, fH / 2);
|
|
272
|
-
ctx.stroke();
|
|
273
|
-
|
|
274
|
-
ctx.beginPath();
|
|
275
|
-
ctx.moveTo(fW / 2 - off, -fH / 2);
|
|
276
|
-
ctx.lineTo(-fW / 2 - off, fH / 2);
|
|
277
|
-
ctx.stroke();
|
|
278
|
-
}
|
|
279
|
-
ctx.globalAlpha = 1;
|
|
280
|
-
|
|
281
|
-
// Corner Neon Glow Brackets
|
|
282
|
-
ctx.strokeStyle = style.glow;
|
|
283
|
-
ctx.lineWidth = 2;
|
|
284
|
-
ctx.shadowColor = style.glow;
|
|
285
|
-
ctx.shadowBlur = 10;
|
|
286
|
-
ctx.beginPath();
|
|
287
|
-
ctx.moveTo(-fW + 30, -5); ctx.lineTo(-fW + 10, 0); ctx.lineTo(-fW + 30, 5);
|
|
288
|
-
ctx.moveTo(fW - 30, -5); ctx.lineTo(fW - 10, 0); ctx.lineTo(fW - 30, 5);
|
|
289
|
-
ctx.stroke();
|
|
290
|
-
ctx.shadowBlur = 0;
|
|
291
|
-
|
|
292
|
-
ctx.restore();
|
|
293
|
-
ctx.restore();
|
|
294
|
-
}
|
|
295
|
-
|
|
296
|
-
function drawAura(ctx, cx, cy, auraItem, t, mode) {
|
|
297
|
-
if (!auraItem || auraItem.id === "none" || auraItem.archetype === "none") return;
|
|
298
|
-
ctx.save();
|
|
299
|
-
ctx.translate(cx, cy);
|
|
300
|
-
|
|
301
|
-
const color = auraItem.color || "#00f0ff";
|
|
302
|
-
const arch = auraItem.archetype || "plasma_ring";
|
|
303
|
-
const pulse = 1 + Math.sin(t * 0.006) * 0.12;
|
|
304
|
-
const aAlpha = mode === "happy" ? 0.95 : mode === "error" ? 0.4 : mode === "sleeping" ? 0.25 : 0.65;
|
|
305
|
-
|
|
306
|
-
ctx.shadowColor = color;
|
|
307
|
-
ctx.shadowBlur = 12;
|
|
308
|
-
|
|
309
|
-
if (arch === "matrix_rain") {
|
|
310
|
-
ctx.strokeStyle = color;
|
|
311
|
-
ctx.fillStyle = "#ffffff";
|
|
312
|
-
ctx.lineWidth = 1.6;
|
|
313
|
-
for (let col = -3; col <= 3; col++) {
|
|
314
|
-
const rx = col * 12;
|
|
315
|
-
const dropP = ((t * 0.002 + col * 0.33) % 1);
|
|
316
|
-
const ry = -80 + dropP * 65;
|
|
317
|
-
ctx.globalAlpha = aAlpha * 0.8;
|
|
318
|
-
ctx.beginPath();
|
|
319
|
-
ctx.moveTo(rx, ry - 10);
|
|
320
|
-
ctx.lineTo(rx, ry);
|
|
321
|
-
ctx.stroke();
|
|
322
|
-
ctx.beginPath();
|
|
323
|
-
ctx.arc(rx, ry, 1.4, 0, Math.PI * 2);
|
|
324
|
-
ctx.fill();
|
|
325
|
-
}
|
|
326
|
-
} else if (arch === "quantum_mist") {
|
|
327
|
-
ctx.strokeStyle = color;
|
|
328
|
-
ctx.lineWidth = 1.4;
|
|
329
|
-
ctx.globalAlpha = aAlpha * 0.5;
|
|
330
|
-
for (let p = 0; p < 4; p++) {
|
|
331
|
-
const ang = t * 0.003 + (p * Math.PI) / 2;
|
|
332
|
-
const rx = 36 * pulse + Math.sin(ang) * 5;
|
|
333
|
-
const ry = 16 * pulse + Math.cos(ang) * 4;
|
|
334
|
-
ctx.beginPath();
|
|
335
|
-
ctx.ellipse(0, -42, rx, ry, 0, 0, Math.PI * 2);
|
|
336
|
-
ctx.stroke();
|
|
337
|
-
}
|
|
338
|
-
ctx.fillStyle = "#ffffff";
|
|
339
|
-
ctx.globalAlpha = aAlpha;
|
|
340
|
-
ctx.beginPath();
|
|
341
|
-
ctx.arc(Math.sin(t * 0.007) * 34, -42 + Math.cos(t * 0.007) * 14, 2.5, 0, Math.PI * 2);
|
|
342
|
-
ctx.fill();
|
|
343
|
-
} else if (arch === "glitch_halo") {
|
|
344
|
-
const jx = Math.sin(t * 0.09) * 3;
|
|
345
|
-
ctx.strokeStyle = color;
|
|
346
|
-
ctx.lineWidth = 2.2;
|
|
347
|
-
ctx.globalAlpha = aAlpha;
|
|
348
|
-
ctx.strokeRect(-38 * pulse + jx, -64 * pulse, 76 * pulse, 30 * pulse);
|
|
349
|
-
} else {
|
|
350
|
-
// Plasma Ring default
|
|
351
|
-
ctx.strokeStyle = color;
|
|
352
|
-
ctx.lineWidth = 2.4;
|
|
353
|
-
ctx.globalAlpha = aAlpha;
|
|
354
|
-
ctx.beginPath();
|
|
355
|
-
ctx.ellipse(0, -42, 42 * pulse, 16 * pulse, 0, 0, Math.PI * 2);
|
|
356
|
-
ctx.stroke();
|
|
357
|
-
|
|
358
|
-
ctx.strokeStyle = "#ffffff";
|
|
359
|
-
ctx.lineWidth = 1.2;
|
|
360
|
-
ctx.beginPath();
|
|
361
|
-
ctx.ellipse(0, -42, 32 * pulse, 11 * pulse, 0, 0, Math.PI * 2);
|
|
362
|
-
ctx.stroke();
|
|
363
|
-
}
|
|
364
|
-
|
|
365
|
-
ctx.restore();
|
|
366
|
-
}
|
|
367
|
-
|
|
368
|
-
function drawCharacter(ctx, cx, cy, scale, t, mode, intensity, skinItem, clientType) {
|
|
369
|
-
ctx.save();
|
|
370
|
-
ctx.translate(cx, cy);
|
|
371
|
-
ctx.scale(scale, scale);
|
|
372
|
-
|
|
373
|
-
const skinColor = skinItem?.color || "#00f0ff";
|
|
374
|
-
const skinArch = skinItem?.archetype || "cyber_classic";
|
|
375
|
-
const trimColor = clientType === "app" ? "#8b5cf6" : "#10b981";
|
|
376
|
-
const SHELL = "#1e2430";
|
|
377
|
-
const SHADE = "#111622";
|
|
378
|
-
const phase = t * 0.012;
|
|
379
|
-
|
|
380
|
-
// Body Motion Calculations
|
|
381
|
-
let bob = Math.sin(t * 0.004) * (0.8 + intensity * 1.4);
|
|
382
|
-
let shake = 0;
|
|
383
|
-
let tilt = 0;
|
|
384
|
-
|
|
385
|
-
if (mode === "happy") bob = -Math.abs(Math.sin(t * 0.005)) * 4.2;
|
|
386
|
-
if (mode === "sleeping") {
|
|
387
|
-
bob = Math.sin(t * 0.0016) * 1.1 + 2.2;
|
|
388
|
-
tilt = 0.12 + Math.sin(t * 0.0016) * 0.02;
|
|
389
|
-
}
|
|
390
|
-
if (mode === "error") shake = Math.sin(t * 0.09) * 2.2;
|
|
391
|
-
if (mode === "looping") {
|
|
392
|
-
shake = Math.sin(t * 0.08) * 2.5;
|
|
393
|
-
bob = Math.sin(t * 0.015) * 1.8;
|
|
394
|
-
tilt = Math.sin(t * 0.02) * 0.18;
|
|
395
|
-
}
|
|
396
|
-
|
|
397
|
-
ctx.translate(shake, bob);
|
|
398
|
-
ctx.rotate(tilt);
|
|
399
|
-
|
|
400
|
-
// 1. Torso
|
|
401
|
-
const bGrad = ctx.createLinearGradient(0, -30, 0, 0);
|
|
402
|
-
bGrad.addColorStop(0, "#ffffff");
|
|
403
|
-
bGrad.addColorStop(0.5, SHELL);
|
|
404
|
-
bGrad.addColorStop(1, SHADE);
|
|
405
|
-
ctx.fillStyle = bGrad;
|
|
406
|
-
ctx.beginPath();
|
|
407
|
-
ctx.roundRect(-17, -30, 34, 22, 11);
|
|
408
|
-
ctx.fill();
|
|
409
|
-
|
|
410
|
-
// Torso Trim Band
|
|
411
|
-
ctx.fillStyle = trimColor;
|
|
412
|
-
ctx.fillRect(-14, -12, 28, 6);
|
|
413
|
-
|
|
414
|
-
// Chest Arc Reactor
|
|
415
|
-
ctx.fillStyle = "#0f172a";
|
|
416
|
-
ctx.beginPath();
|
|
417
|
-
ctx.arc(0, -18, 4.5, 0, Math.PI * 2);
|
|
418
|
-
ctx.fill();
|
|
419
|
-
ctx.strokeStyle = skinColor;
|
|
420
|
-
ctx.lineWidth = 1.4;
|
|
421
|
-
ctx.stroke();
|
|
422
|
-
ctx.fillStyle = skinColor;
|
|
423
|
-
ctx.beginPath();
|
|
424
|
-
ctx.arc(0, -18, 2.2, 0, Math.PI * 2);
|
|
425
|
-
ctx.fill();
|
|
426
|
-
|
|
427
|
-
// 2. Arms (Pivot at shoulder)
|
|
428
|
-
let rotL = 0;
|
|
429
|
-
let rotR = 0;
|
|
430
85
|
|
|
431
|
-
if (mode === "streaming") {
|
|
432
|
-
rotL = Math.sin(phase) * 0.14 * (0.3 + intensity);
|
|
433
|
-
rotR = -Math.sin(phase + 1.3) * 0.14 * (0.3 + intensity);
|
|
434
|
-
} else if (mode === "pending") {
|
|
435
|
-
rotL = 2.5 + Math.sin(t * 0.012) * 0.35;
|
|
436
|
-
rotR = -Math.sin(phase + 1.3) * 0.06;
|
|
437
|
-
} else if (mode === "happy") {
|
|
438
|
-
rotL = 2.2 + Math.sin(t * 0.01) * 0.2;
|
|
439
|
-
rotR = -2.2 - Math.sin(t * 0.01 + 1) * 0.2;
|
|
440
|
-
} else if (mode === "error") {
|
|
441
|
-
rotL = 2.7 + Math.sin(t * 0.08) * 0.1;
|
|
442
|
-
rotR = -2.7 - Math.sin(t * 0.08) * 0.1;
|
|
443
|
-
} else if (mode === "looping") {
|
|
444
|
-
rotL = 2.4 + Math.sin(t * 0.02) * 0.4;
|
|
445
|
-
rotR = -2.4 - Math.sin(t * 0.02 + 1) * 0.4;
|
|
446
|
-
}
|
|
447
|
-
|
|
448
|
-
// Left Arm
|
|
449
|
-
ctx.save();
|
|
450
|
-
ctx.translate(-22, -26);
|
|
451
|
-
ctx.rotate(rotL);
|
|
452
|
-
ctx.fillStyle = SHELL;
|
|
453
|
-
ctx.beginPath();
|
|
454
|
-
ctx.roundRect(-4, 0, 8, 24, 4);
|
|
455
|
-
ctx.fill();
|
|
456
|
-
ctx.restore();
|
|
457
|
-
|
|
458
|
-
// Right Arm
|
|
459
|
-
ctx.save();
|
|
460
|
-
ctx.translate(22, -26);
|
|
461
|
-
ctx.rotate(rotR);
|
|
462
|
-
ctx.fillStyle = SHELL;
|
|
463
|
-
ctx.beginPath();
|
|
464
|
-
ctx.roundRect(-4, 0, 8, 24, 4);
|
|
465
|
-
ctx.fill();
|
|
466
|
-
ctx.restore();
|
|
467
|
-
|
|
468
|
-
// 3. Head & Comm Pods
|
|
469
|
-
ctx.fillStyle = skinColor;
|
|
470
|
-
ctx.beginPath();
|
|
471
|
-
ctx.arc(-27, -56, 8, 0, Math.PI * 2);
|
|
472
|
-
ctx.arc(27, -56, 8, 0, Math.PI * 2);
|
|
473
|
-
ctx.fill();
|
|
474
|
-
|
|
475
|
-
// Helmet Sphere
|
|
476
|
-
const hGrad = ctx.createLinearGradient(0, -80, 0, -32);
|
|
477
|
-
hGrad.addColorStop(0, "#2d3748");
|
|
478
|
-
hGrad.addColorStop(0.6, SHELL);
|
|
479
|
-
hGrad.addColorStop(1, SHADE);
|
|
480
|
-
ctx.fillStyle = hGrad;
|
|
481
|
-
ctx.strokeStyle = skinColor;
|
|
482
|
-
ctx.lineWidth = 2.2;
|
|
483
|
-
ctx.beginPath();
|
|
484
|
-
ctx.ellipse(0, -56, 26, 24, 0, 0, Math.PI * 2);
|
|
485
|
-
ctx.fill();
|
|
486
|
-
ctx.stroke();
|
|
487
|
-
|
|
488
|
-
// Visor Cavity
|
|
489
|
-
ctx.fillStyle = "#0f141c";
|
|
490
|
-
ctx.beginPath();
|
|
491
|
-
ctx.ellipse(0, -53, 20, 15.5, 0, 0, Math.PI * 2);
|
|
492
|
-
ctx.fill();
|
|
493
|
-
|
|
494
|
-
// Head Archetype Accessories
|
|
495
|
-
if (skinArch === "cyber_cat") {
|
|
496
|
-
// Cute Cat Ears
|
|
497
|
-
ctx.fillStyle = SHELL;
|
|
498
|
-
ctx.beginPath();
|
|
499
|
-
ctx.moveTo(-22, -72); ctx.lineTo(-14, -86); ctx.lineTo(-6, -76); ctx.closePath();
|
|
500
|
-
ctx.moveTo(6, -76); ctx.lineTo(14, -86); ctx.lineTo(22, -72); ctx.closePath();
|
|
501
|
-
ctx.fill();
|
|
502
|
-
ctx.fillStyle = "#f472b6";
|
|
503
|
-
ctx.beginPath();
|
|
504
|
-
ctx.moveTo(-20, -73); ctx.lineTo(-14, -83); ctx.lineTo(-8, -76); ctx.closePath();
|
|
505
|
-
ctx.moveTo(8, -76); ctx.lineTo(14, -83); ctx.lineTo(20, -73); ctx.closePath();
|
|
506
|
-
ctx.fill();
|
|
507
|
-
} else if (skinArch === "stealth_ninja") {
|
|
508
|
-
// Ninja Headband
|
|
509
|
-
ctx.fillStyle = "#1e1b4b";
|
|
510
|
-
ctx.strokeStyle = skinColor;
|
|
511
|
-
ctx.lineWidth = 1.5;
|
|
512
|
-
ctx.fillRect(-24, -66, 48, 8);
|
|
513
|
-
ctx.strokeRect(-24, -66, 48, 8);
|
|
514
|
-
ctx.fillStyle = "#38bdf8";
|
|
515
|
-
ctx.beginPath();
|
|
516
|
-
ctx.arc(0, -62, 3, 0, Math.PI * 2);
|
|
517
|
-
ctx.fill();
|
|
518
|
-
} else if (skinArch === "mecha_pilot") {
|
|
519
|
-
// Dual Antennas
|
|
520
|
-
ctx.fillStyle = skinColor;
|
|
521
|
-
ctx.fillRect(-20, -88, 3, 20);
|
|
522
|
-
ctx.fillRect(17, -88, 3, 20);
|
|
523
|
-
ctx.fillStyle = "#ffffff";
|
|
524
|
-
ctx.beginPath();
|
|
525
|
-
ctx.arc(-18.5, -88, 3, 0, Math.PI * 2);
|
|
526
|
-
ctx.arc(18.5, -88, 3, 0, Math.PI * 2);
|
|
527
|
-
ctx.fill();
|
|
528
|
-
} else if (skinArch === "celestial_astro") {
|
|
529
|
-
// Solar Halo
|
|
530
|
-
ctx.strokeStyle = skinColor;
|
|
531
|
-
ctx.lineWidth = 2;
|
|
532
|
-
ctx.beginPath();
|
|
533
|
-
ctx.ellipse(0, -64, 30, 8, 0, 0, Math.PI * 2);
|
|
534
|
-
ctx.stroke();
|
|
535
|
-
} else if (skinArch === "matrix_hacker") {
|
|
536
|
-
// Hacker Hoodie Cowl
|
|
537
|
-
ctx.strokeStyle = skinColor;
|
|
538
|
-
ctx.lineWidth = 1.8;
|
|
539
|
-
ctx.strokeRect(-26, -76, 52, 44);
|
|
540
|
-
} else if (skinArch === "cyber_suit") {
|
|
541
|
-
// Tactical Brow & Wing Antennas
|
|
542
|
-
ctx.fillStyle = skinColor;
|
|
543
|
-
ctx.fillRect(-24, -66, 48, 6);
|
|
544
|
-
}
|
|
545
|
-
|
|
546
|
-
// 4. Eyes & Facial Expression
|
|
547
|
-
const blinking = Math.sin(t * 0.0013) > 0.985;
|
|
548
|
-
const flicker = 0.85 + Math.sin(t * 0.01) * 0.15;
|
|
549
|
-
ctx.strokeStyle = skinColor;
|
|
550
|
-
ctx.fillStyle = skinColor;
|
|
551
|
-
ctx.lineWidth = 2.2;
|
|
552
|
-
ctx.globalAlpha = flicker;
|
|
553
|
-
|
|
554
|
-
const drawEye = (ex, ey, kind) => {
|
|
555
|
-
ctx.save();
|
|
556
|
-
if (kind === "happy") {
|
|
557
|
-
ctx.beginPath();
|
|
558
|
-
ctx.arc(ex, ey + 2, 4.6, Math.PI, 0);
|
|
559
|
-
ctx.stroke();
|
|
560
|
-
} else if (kind === "sleep") {
|
|
561
|
-
ctx.beginPath();
|
|
562
|
-
ctx.arc(ex, ey, 4.6, 0, Math.PI);
|
|
563
|
-
ctx.stroke();
|
|
564
|
-
} else if (kind === "x") {
|
|
565
|
-
ctx.beginPath();
|
|
566
|
-
ctx.moveTo(ex - 4, ey - 4); ctx.lineTo(ex + 4, ey + 4);
|
|
567
|
-
ctx.moveTo(ex + 4, ey - 4); ctx.lineTo(ex - 4, ey + 4);
|
|
568
|
-
ctx.stroke();
|
|
569
|
-
} else if (kind === "looping") {
|
|
570
|
-
ctx.beginPath();
|
|
571
|
-
ctx.arc(ex, ey, 4.2, 0, Math.PI * 2);
|
|
572
|
-
ctx.stroke();
|
|
573
|
-
ctx.beginPath();
|
|
574
|
-
ctx.arc(ex, ey, 2.0, 0, Math.PI * 2);
|
|
575
|
-
ctx.stroke();
|
|
576
|
-
} else {
|
|
577
|
-
const eh = blinking ? 0.8 : 4.4;
|
|
578
|
-
ctx.beginPath();
|
|
579
|
-
ctx.ellipse(ex, ey, 4.8, eh, 0, 0, Math.PI * 2);
|
|
580
|
-
ctx.fill();
|
|
581
|
-
if (!blinking) {
|
|
582
|
-
ctx.fillStyle = "#0f141c";
|
|
583
|
-
for (let sy = ey - eh + 1; sy < ey + eh; sy += 2.4) {
|
|
584
|
-
ctx.fillRect(ex - 6, sy, 12, 1);
|
|
585
|
-
}
|
|
586
|
-
}
|
|
587
|
-
}
|
|
588
|
-
ctx.restore();
|
|
589
|
-
};
|
|
590
|
-
|
|
591
|
-
const eyeKind =
|
|
592
|
-
mode === "happy"
|
|
593
|
-
? "happy"
|
|
594
|
-
: mode === "sleeping"
|
|
595
|
-
? "sleep"
|
|
596
|
-
: mode === "error"
|
|
597
|
-
? "x"
|
|
598
|
-
: mode === "looping"
|
|
599
|
-
? "looping"
|
|
600
|
-
: "scan";
|
|
601
|
-
|
|
602
|
-
drawEye(-8, -57, eyeKind);
|
|
603
|
-
drawEye(8, -57, eyeKind);
|
|
604
|
-
|
|
605
|
-
// Mouth
|
|
606
|
-
if (mode === "happy") {
|
|
607
|
-
ctx.beginPath();
|
|
608
|
-
ctx.arc(0, -48, 6, 0, Math.PI);
|
|
609
|
-
ctx.stroke();
|
|
610
|
-
} else if (mode === "sleeping") {
|
|
611
|
-
ctx.beginPath();
|
|
612
|
-
ctx.arc(0, -45, 1.8, 0, Math.PI * 2);
|
|
613
|
-
ctx.stroke();
|
|
614
|
-
} else if (mode === "error") {
|
|
615
|
-
ctx.beginPath();
|
|
616
|
-
ctx.moveTo(-7, -45); ctx.lineTo(-3.5, -48); ctx.lineTo(0, -45); ctx.lineTo(3.5, -48); ctx.lineTo(7, -45);
|
|
617
|
-
ctx.stroke();
|
|
618
|
-
} else if (mode === "looping") {
|
|
619
|
-
ctx.beginPath();
|
|
620
|
-
ctx.arc(0, -46, 3.2, 0, Math.PI * 2);
|
|
621
|
-
ctx.stroke();
|
|
622
|
-
} else {
|
|
623
|
-
const mw = 5 + intensity * 3;
|
|
624
|
-
ctx.beginPath();
|
|
625
|
-
ctx.ellipse(0, -46, mw, 2.4 + intensity * 1.2, 0, 0, Math.PI * 2);
|
|
626
|
-
ctx.fill();
|
|
627
|
-
}
|
|
628
|
-
|
|
629
|
-
// 5. Particles (Z's or Smoke)
|
|
630
|
-
if (mode === "sleeping") {
|
|
631
|
-
for (let k = 0; k < 3; k++) {
|
|
632
|
-
const p = ((t * 0.0004 + k / 3) % 1);
|
|
633
|
-
const zx = 20 + p * 16;
|
|
634
|
-
const zy = -78 - p * 30;
|
|
635
|
-
const s = 3 + p * 4;
|
|
636
|
-
ctx.strokeStyle = "#a5b4cc";
|
|
637
|
-
ctx.globalAlpha = 1 - p;
|
|
638
|
-
ctx.lineWidth = 1.6;
|
|
639
|
-
ctx.beginPath();
|
|
640
|
-
ctx.moveTo(zx, zy); ctx.lineTo(zx + s, zy); ctx.lineTo(zx, zy + s); ctx.lineTo(zx + s, zy + s);
|
|
641
|
-
ctx.stroke();
|
|
642
|
-
}
|
|
643
|
-
} else if (mode === "error" || mode === "looping") {
|
|
644
|
-
for (let k = 0; k < 5; k++) {
|
|
645
|
-
const p = ((t * 0.0008 + k / 5) % 1);
|
|
646
|
-
const sx = Math.sin(p * 8 + k * 1.3) * 7 + (k - 2) * 3.5;
|
|
647
|
-
const sy = -76 - p * 38;
|
|
648
|
-
const r = 2.5 + p * 7;
|
|
649
|
-
ctx.fillStyle = "#4b5563";
|
|
650
|
-
ctx.globalAlpha = 0.65 * (1 - p);
|
|
651
|
-
ctx.beginPath();
|
|
652
|
-
ctx.arc(sx, sy, r, 0, Math.PI * 2);
|
|
653
|
-
ctx.fill();
|
|
654
|
-
}
|
|
655
|
-
}
|
|
656
|
-
|
|
657
|
-
ctx.restore();
|
|
658
|
-
return { bob, shake, rotL, rotR, blinking };
|
|
659
|
-
}
|
|
660
|
-
|
|
661
|
-
function drawDesk(ctx, cx, cy, t, intensity, mode, clientType, propsList, accentColor) {
|
|
662
|
-
ctx.save();
|
|
663
|
-
ctx.translate(cx, cy);
|
|
664
|
-
|
|
665
|
-
const W = 210;
|
|
666
|
-
const H = 120;
|
|
667
|
-
|
|
668
|
-
// Desk Slab
|
|
669
|
-
const dGrad = ctx.createLinearGradient(0, -30, 0, H - 30);
|
|
670
|
-
dGrad.addColorStop(0, "#2b3443");
|
|
671
|
-
dGrad.addColorStop(1, "#181d26");
|
|
672
|
-
ctx.fillStyle = dGrad;
|
|
673
|
-
ctx.beginPath();
|
|
674
|
-
ctx.roundRect(-W / 2, 0, W, H, 10);
|
|
675
|
-
ctx.fill();
|
|
676
|
-
ctx.strokeStyle = "#475569";
|
|
677
|
-
ctx.lineWidth = 1.5;
|
|
678
|
-
ctx.stroke();
|
|
679
|
-
|
|
680
|
-
// Desk Lip Highlight
|
|
681
|
-
ctx.fillStyle = "rgba(255,255,255,0.15)";
|
|
682
|
-
ctx.fillRect(-W / 2, 0, W, 4);
|
|
683
|
-
|
|
684
|
-
// Latency Progress Bar
|
|
685
|
-
const barW = W - 40;
|
|
686
|
-
ctx.fillStyle = "#0f141c";
|
|
687
|
-
ctx.fillRect(-barW / 2, H - 14, barW, 6);
|
|
688
|
-
ctx.fillStyle = mode === "error" ? "#f43f5e" : intensity > 0.8 ? "#f59e0b" : "#10b981";
|
|
689
|
-
ctx.fillRect(-barW / 2, H - 14, barW * (0.3 + intensity * 0.7), 6);
|
|
690
|
-
|
|
691
|
-
// Center Monitor Screen
|
|
692
|
-
ctx.fillStyle = "#0b0e13";
|
|
693
|
-
ctx.fillRect(-45, -45, 90, 48);
|
|
694
|
-
ctx.fillStyle = mode === "error" ? "rgba(244,63,94,0.3)" : "rgba(0,240,255,0.25)";
|
|
695
|
-
ctx.fillRect(-42, -42, 84, 42);
|
|
696
|
-
|
|
697
|
-
// Screen Code Lines
|
|
698
|
-
ctx.fillStyle = "#ffffff";
|
|
699
|
-
for (let i = 0; i < 4; i++) {
|
|
700
|
-
ctx.globalAlpha = 0.4 + Math.sin(t * 0.01 + i) * 0.2;
|
|
701
|
-
ctx.fillRect(-38, -38 + i * 9, 20 + ((i * 19) % 36), 3);
|
|
702
|
-
}
|
|
703
|
-
ctx.globalAlpha = 1;
|
|
704
|
-
|
|
705
|
-
// Monitor Client Badge
|
|
706
|
-
ctx.fillStyle = clientType === "app" ? "#3b0764" : "#064e3b";
|
|
707
|
-
ctx.fillRect(-42, -42, 28, 12);
|
|
708
|
-
ctx.fillStyle = clientType === "app" ? "#d8b4fe" : "#6ee7b7";
|
|
709
|
-
ctx.font = "bold 8px monospace";
|
|
710
|
-
ctx.fillText(clientType === "app" ? "APP" : "CLI", -38, -33);
|
|
711
|
-
|
|
712
|
-
// ------------------------------------------------------------------------
|
|
713
|
-
// PROPS ON DESK (Dynamic based on activeProps)
|
|
714
|
-
// ------------------------------------------------------------------------
|
|
715
|
-
const hasProp = (keyword) => activeProps.some((p) => String(p).toLowerCase().includes(keyword));
|
|
716
|
-
|
|
717
|
-
// 1. Hologram Cube
|
|
718
|
-
if (hasProp("holo") || hasProp("cube") || hasProp("prop_2") || activeProps.length > 2) {
|
|
719
|
-
ctx.save();
|
|
720
|
-
ctx.translate(65, -15);
|
|
721
|
-
ctx.rotate(t * 0.002);
|
|
722
|
-
ctx.strokeStyle = accentColor || "#38bdf8";
|
|
723
|
-
ctx.lineWidth = 1.4;
|
|
724
|
-
ctx.strokeRect(-10, -10, 20, 20);
|
|
725
|
-
ctx.restore();
|
|
726
|
-
}
|
|
727
|
-
|
|
728
|
-
// 2. Steaming Coffee Mug
|
|
729
|
-
if (hasProp("coffee") || hasProp("mug") || hasProp("prop_0") || activeProps.length > 0) {
|
|
730
|
-
ctx.fillStyle = "#e2e8f0";
|
|
731
|
-
ctx.fillRect(-80, 10, 14, 16);
|
|
732
|
-
if (intensity > 0) {
|
|
733
|
-
for (let i = 0; i < 3; i++) {
|
|
734
|
-
const p = ((t * 0.001 + i / 3) % 1);
|
|
735
|
-
const sx = -73 + Math.sin(p * 5 + i) * 3;
|
|
736
|
-
const sy = 8 - p * 14;
|
|
737
|
-
ctx.fillStyle = "rgba(255,255,255," + (0.45 * (1 - p)) + ")";
|
|
738
|
-
ctx.beginPath();
|
|
739
|
-
ctx.arc(sx, sy, 1 + p * 2, 0, Math.PI * 2);
|
|
740
|
-
ctx.fill();
|
|
741
|
-
}
|
|
742
|
-
}
|
|
743
|
-
}
|
|
744
|
-
|
|
745
|
-
// 3. Server Tower with Multi-Color Blinking LEDs
|
|
746
|
-
if (hasProp("server") || hasProp("tower") || hasProp("prop_1") || activeProps.length > 1) {
|
|
747
|
-
ctx.fillStyle = "#1e293b";
|
|
748
|
-
ctx.fillRect(-96, -26, 12, 38);
|
|
749
|
-
for (let idx = 0; idx < 4; idx++) {
|
|
750
|
-
const blink = Math.sin(t * 0.008 + idx * 1.6) > 0;
|
|
751
|
-
const ledCol = ["#22c55e", "#00f0ff", "#f59e0b", "#ec4899"][idx];
|
|
752
|
-
ctx.fillStyle = blink ? ledCol : "#0f172a";
|
|
753
|
-
ctx.beginPath();
|
|
754
|
-
ctx.arc(-90, -20 + idx * 8, 1.6, 0, Math.PI * 2);
|
|
755
|
-
ctx.fill();
|
|
756
|
-
}
|
|
757
|
-
}
|
|
758
|
-
|
|
759
|
-
// 4. Oscilloscope
|
|
760
|
-
if (hasProp("osc") || hasProp("wave") || hasProp("prop_3")) {
|
|
761
|
-
ctx.fillStyle = "#111827";
|
|
762
|
-
ctx.fillRect(55, 10, 32, 22);
|
|
763
|
-
ctx.strokeStyle = "#10b981";
|
|
764
|
-
ctx.lineWidth = 1.2;
|
|
765
|
-
ctx.beginPath();
|
|
766
|
-
ctx.moveTo(57, 21);
|
|
767
|
-
for (let ox = 57; ox <= 85; ox += 2) {
|
|
768
|
-
const oy = 21 + Math.sin(t * 0.01 + ox * 0.8) * 4;
|
|
769
|
-
ctx.lineTo(ox, oy);
|
|
770
|
-
}
|
|
771
|
-
ctx.stroke();
|
|
772
|
-
}
|
|
773
|
-
|
|
774
|
-
ctx.restore();
|
|
775
|
-
}
|
|
776
|
-
|
|
777
|
-
function drawPet(ctx, cx, cy, petItem, t, mode) {
|
|
778
|
-
if (!petItem || petItem.id === "pet_0" || petItem.archetype === "none") return;
|
|
779
|
-
ctx.save();
|
|
780
|
-
|
|
781
|
-
const arch = petItem.archetype || "hover_drone";
|
|
782
|
-
const color = petItem.color || "#00f0ff";
|
|
783
|
-
|
|
784
|
-
let py = cy;
|
|
785
|
-
let px = cx;
|
|
786
|
-
let scaleY = 1;
|
|
787
|
-
|
|
788
|
-
if (arch === "hover_drone") {
|
|
789
|
-
py = cy - 25 + Math.sin(t * 0.005) * 5;
|
|
790
|
-
} else if (mode === "happy") {
|
|
791
|
-
py = cy - Math.abs(Math.sin(t * 0.008)) * 8;
|
|
792
|
-
scaleY = 1 + Math.abs(Math.sin(t * 0.008)) * 0.15;
|
|
793
|
-
} else if (mode === "sleeping") {
|
|
794
|
-
scaleY = 1 + Math.sin(t * 0.0016) * 0.04;
|
|
795
|
-
} else if (mode === "error") {
|
|
796
|
-
px = cx + Math.sin(t * 0.08) * 2;
|
|
797
|
-
} else if (mode === "looping") {
|
|
798
|
-
ctx.rotate(Math.sin(t * 0.04) * 0.15);
|
|
799
|
-
}
|
|
800
|
-
|
|
801
|
-
ctx.translate(px, py);
|
|
802
|
-
ctx.scale(1, scaleY);
|
|
803
|
-
|
|
804
|
-
if (arch === "hover_drone") {
|
|
805
|
-
// Hover Drone
|
|
806
|
-
ctx.fillStyle = "#0f172a";
|
|
807
|
-
ctx.beginPath();
|
|
808
|
-
ctx.ellipse(0, 0, 14, 8, 0, 0, Math.PI * 2);
|
|
809
|
-
ctx.fill();
|
|
810
|
-
ctx.strokeStyle = color;
|
|
811
|
-
ctx.lineWidth = 1.5;
|
|
812
|
-
ctx.stroke();
|
|
813
|
-
|
|
814
|
-
// Spinning Halo Rotor
|
|
815
|
-
ctx.strokeStyle = "#ffffff";
|
|
816
|
-
ctx.lineWidth = 1;
|
|
817
|
-
ctx.beginPath();
|
|
818
|
-
ctx.ellipse(0, -6, 16, 3, 0, 0, Math.PI * 2);
|
|
819
|
-
ctx.stroke();
|
|
820
|
-
|
|
821
|
-
// Scanner Eye
|
|
822
|
-
ctx.fillStyle = color;
|
|
823
|
-
ctx.beginPath();
|
|
824
|
-
ctx.arc(0, 0, 2.5, 0, Math.PI * 2);
|
|
825
|
-
ctx.fill();
|
|
826
|
-
} else {
|
|
827
|
-
// Cyber Cat / Robo Pup Ground Companion
|
|
828
|
-
ctx.fillStyle = "#1e293b";
|
|
829
|
-
ctx.beginPath();
|
|
830
|
-
ctx.roundRect(-10, -14, 20, 16, 5);
|
|
831
|
-
ctx.fill();
|
|
832
|
-
ctx.strokeStyle = color;
|
|
833
|
-
ctx.lineWidth = 1.4;
|
|
834
|
-
ctx.stroke();
|
|
835
|
-
|
|
836
|
-
// Ears
|
|
837
|
-
ctx.fillStyle = color;
|
|
838
|
-
ctx.beginPath();
|
|
839
|
-
ctx.moveTo(-8, -14); ctx.lineTo(-4, -20); ctx.lineTo(-1, -14);
|
|
840
|
-
ctx.moveTo(1, -14); ctx.lineTo(4, -20); ctx.lineTo(8, -14);
|
|
841
|
-
ctx.fill();
|
|
842
|
-
|
|
843
|
-
// Glowing Eyes
|
|
844
|
-
ctx.fillStyle = mode === "sleeping" ? "#64748b" : "#ffffff";
|
|
845
|
-
ctx.beginPath();
|
|
846
|
-
ctx.arc(-4, -8, 1.5, 0, Math.PI * 2);
|
|
847
|
-
ctx.arc(4, -8, 1.5, 0, Math.PI * 2);
|
|
848
|
-
ctx.fill();
|
|
849
|
-
}
|
|
850
|
-
|
|
851
|
-
ctx.restore();
|
|
852
|
-
}
|
|
853
86
|
|
|
854
87
|
// --------------------------------------------------------------------------
|
|
855
88
|
// ACTIONS: RANDOMIZE, RESET, APPLY LOADOUT
|
|
@@ -957,7 +190,7 @@ export default function LiveFittingRoom({ initialStoreState, onEquipSuccess }) {
|
|
|
957
190
|
</span>
|
|
958
191
|
</div>
|
|
959
192
|
<p className="text-xs text-slate-400">
|
|
960
|
-
Mix and match
|
|
193
|
+
Mix and match 148 skins, desk props, cyber pets, auras, and floor themes with live animated actions.
|
|
961
194
|
</p>
|
|
962
195
|
</div>
|
|
963
196
|
</div>
|
|
@@ -1024,18 +257,37 @@ export default function LiveFittingRoom({ initialStoreState, onEquipSuccess }) {
|
|
|
1024
257
|
</div>
|
|
1025
258
|
</div>
|
|
1026
259
|
|
|
1027
|
-
{/*
|
|
260
|
+
{/* Live React SVG Agent Viewport */}
|
|
1028
261
|
<div className="relative rounded-lg overflow-hidden border border-[#2d2d3a] bg-[#0c0d12] flex items-center justify-center shadow-inner h-[380px]">
|
|
1029
|
-
<
|
|
262
|
+
<LiveReactAgent
|
|
263
|
+
skinId={activeSkinId}
|
|
264
|
+
skinItem={currentSkinItem}
|
|
265
|
+
petId={activePetId}
|
|
266
|
+
petItem={currentPetItem}
|
|
267
|
+
propsList={activeProps}
|
|
268
|
+
auraId={activeAuraId}
|
|
269
|
+
auraItem={currentAuraItem}
|
|
270
|
+
themeId={activeThemeId}
|
|
271
|
+
themeItem={currentThemeItem}
|
|
272
|
+
mode={currentMode}
|
|
273
|
+
intensity={intensity}
|
|
274
|
+
clientType={clientType}
|
|
275
|
+
isPlaying={isPlaying}
|
|
276
|
+
interactive={true}
|
|
277
|
+
showFloor={true}
|
|
278
|
+
showDesk={true}
|
|
279
|
+
onTelemetry={setTelemetry}
|
|
280
|
+
className="w-full h-full"
|
|
281
|
+
/>
|
|
1030
282
|
|
|
1031
283
|
{/* Theme Badge Overlay */}
|
|
1032
|
-
<div className="absolute top-2.5 left-2.5 px-2.5 py-1 rounded-md bg-black/60 backdrop-blur-md border border-white/10 text-[10px] font-mono text-slate-300 flex items-center gap-1.5">
|
|
284
|
+
<div className="absolute top-2.5 left-2.5 px-2.5 py-1 rounded-md bg-black/60 backdrop-blur-md border border-white/10 text-[10px] font-mono text-slate-300 flex items-center gap-1.5 pointer-events-none z-10">
|
|
1033
285
|
<Palette className="w-3 h-3 text-cyan-400" />
|
|
1034
286
|
<span>{currentThemeItem?.name || "Classic Slate"}</span>
|
|
1035
287
|
</div>
|
|
1036
288
|
|
|
1037
289
|
{/* Action Mode Overlay */}
|
|
1038
|
-
<div className="absolute top-2.5 right-2.5 px-2.5 py-1 rounded-md bg-black/60 backdrop-blur-md border border-white/10 text-[10px] font-mono font-bold text-cyan-300 uppercase">
|
|
290
|
+
<div className="absolute top-2.5 right-2.5 px-2.5 py-1 rounded-md bg-black/60 backdrop-blur-md border border-white/10 text-[10px] font-mono font-bold text-cyan-300 uppercase pointer-events-none z-10">
|
|
1039
291
|
{currentMode}
|
|
1040
292
|
</div>
|
|
1041
293
|
</div>
|
|
@@ -1118,6 +370,18 @@ export default function LiveFittingRoom({ initialStoreState, onEquipSuccess }) {
|
|
|
1118
370
|
</div>
|
|
1119
371
|
</div>
|
|
1120
372
|
|
|
373
|
+
{/* Active VFX Indicator */}
|
|
374
|
+
<div className="flex items-center justify-between px-2.5 py-1.5 rounded-lg bg-[#13141a] border border-[#272836] text-[11px]">
|
|
375
|
+
<div className="flex items-center gap-1.5 text-slate-300">
|
|
376
|
+
<Sparkles className="w-3.5 h-3.5 text-cyan-400" />
|
|
377
|
+
<span className="text-slate-400">Equipped VFX:</span>
|
|
378
|
+
<span className="font-bold text-cyan-300 truncate max-w-[200px]">{currentAuraItem?.name || "None"}</span>
|
|
379
|
+
</div>
|
|
380
|
+
<span className="px-1.5 py-0.5 rounded bg-cyan-500/20 text-cyan-300 font-mono font-bold text-[9px] uppercase border border-cyan-500/30">
|
|
381
|
+
Live 60 FPS VFX
|
|
382
|
+
</span>
|
|
383
|
+
</div>
|
|
384
|
+
|
|
1121
385
|
{/* Live Telemetry Measurements */}
|
|
1122
386
|
<div className="grid grid-cols-4 gap-2 p-2 rounded-lg bg-[#121217] border border-[#252530] text-[10px] font-mono text-center">
|
|
1123
387
|
<div>
|
|
@@ -1148,11 +412,11 @@ export default function LiveFittingRoom({ initialStoreState, onEquipSuccess }) {
|
|
|
1148
412
|
{/* Mixer Category Navigation Tabs */}
|
|
1149
413
|
<div className="flex items-center gap-1.5 border-b border-[#2b2b38] pb-2 overflow-x-auto">
|
|
1150
414
|
{[
|
|
1151
|
-
{ id: "skins", label:
|
|
1152
|
-
{ id: "props", label:
|
|
1153
|
-
{ id: "pets", label:
|
|
1154
|
-
{ id: "auras", label:
|
|
1155
|
-
{ id: "themes", label:
|
|
415
|
+
{ id: "skins", label: `Skins (${(COSMETIC_CATALOG.skins || []).length})`, icon: Bot, count: (COSMETIC_CATALOG.skins || []).length },
|
|
416
|
+
{ id: "props", label: `Props (${(COSMETIC_CATALOG.props || []).length})`, icon: Laptop, count: (COSMETIC_CATALOG.props || []).length },
|
|
417
|
+
{ id: "pets", label: `Pets (${(COSMETIC_CATALOG.pets || []).length})`, icon: Sparkles, count: (COSMETIC_CATALOG.pets || []).length },
|
|
418
|
+
{ id: "auras", label: `Auras (${(COSMETIC_CATALOG.auras || []).length})`, icon: Layers, count: (COSMETIC_CATALOG.auras || []).length },
|
|
419
|
+
{ id: "themes", label: `Themes (${(COSMETIC_CATALOG.officeThemes || []).length})`, icon: Palette, count: (COSMETIC_CATALOG.officeThemes || []).length },
|
|
1156
420
|
].map((tab) => {
|
|
1157
421
|
const Icon = tab.icon;
|
|
1158
422
|
const active = mixerTab === tab.id;
|
|
@@ -1196,13 +460,12 @@ export default function LiveFittingRoom({ initialStoreState, onEquipSuccess }) {
|
|
|
1196
460
|
onChange={(e) => setArchetypeFilter(e.target.value)}
|
|
1197
461
|
className="bg-[#111116] border border-[#2b2b36] rounded-lg px-2.5 py-1.5 text-xs text-slate-300 focus:outline-none"
|
|
1198
462
|
>
|
|
1199
|
-
<option value="all">All Archetypes</option>
|
|
1200
|
-
<option value="
|
|
1201
|
-
<option value="
|
|
1202
|
-
<option value="
|
|
1203
|
-
<option value="matrix_hacker">Matrix Hacker</option>
|
|
1204
|
-
<option value="celestial_astro">Celestial</option>
|
|
1205
|
-
<option value="cyber_suit">Cyber Suit</option>
|
|
463
|
+
<option value="all">All Archetypes (50)</option>
|
|
464
|
+
<option value="cyber_suit">Cyber Suit (10)</option>
|
|
465
|
+
<option value="mecha_pilot">Mecha Pilot (10)</option>
|
|
466
|
+
<option value="stealth_ninja">Stealth Ninja (10)</option>
|
|
467
|
+
<option value="matrix_hacker">Matrix Hacker (10)</option>
|
|
468
|
+
<option value="celestial_astro">Celestial Astro (10)</option>
|
|
1206
469
|
</select>
|
|
1207
470
|
)}
|
|
1208
471
|
</div>
|
|
@@ -1276,11 +539,12 @@ export default function LiveFittingRoom({ initialStoreState, onEquipSuccess }) {
|
|
|
1276
539
|
|
|
1277
540
|
{/* Loadout Summary Footer */}
|
|
1278
541
|
<div className="pt-2 border-t border-[#262632] flex flex-wrap items-center justify-between text-[11px] text-slate-400">
|
|
1279
|
-
<div className="truncate">
|
|
542
|
+
<div className="truncate max-w-[80%]">
|
|
1280
543
|
<span>Loadout: </span>
|
|
1281
|
-
<strong className="text-slate-200">{currentSkinItem?.name}</strong> +{" "}
|
|
544
|
+
<strong className="text-slate-200">{currentSkinItem?.name || "Agent"}</strong> +{" "}
|
|
1282
545
|
<strong className="text-slate-200">{activeProps.length} Props</strong> +{" "}
|
|
1283
|
-
<strong className="text-slate-200">{currentPetItem?.name}</strong>
|
|
546
|
+
<strong className="text-slate-200">{currentPetItem?.name || "None"}</strong> +{" "}
|
|
547
|
+
<strong className="text-cyan-300">{currentAuraItem?.name || "No VFX"}</strong>
|
|
1284
548
|
</div>
|
|
1285
549
|
<button
|
|
1286
550
|
onClick={handleApplyLoadout}
|