diff --git a/neode-ui/.gitignore b/neode-ui/.gitignore index 9f90fd9..51b4011 100644 --- a/neode-ui/.gitignore +++ b/neode-ui/.gitignore @@ -8,7 +8,6 @@ pnpm-debug.log* lerna-debug.log* node_modules -dist dist-ssr *.local diff --git a/neode-ui/dist/.DS_Store b/neode-ui/dist/.DS_Store new file mode 100644 index 0000000..5e47f3a Binary files /dev/null and b/neode-ui/dist/.DS_Store differ diff --git a/neode-ui/dist/assets/.DS_Store b/neode-ui/dist/assets/.DS_Store new file mode 100644 index 0000000..3aa07a6 Binary files /dev/null and b/neode-ui/dist/assets/.DS_Store differ diff --git a/neode-ui/dist/assets/AppDetails-DfPGLgac.js b/neode-ui/dist/assets/AppDetails-DfPGLgac.js new file mode 100644 index 0000000..79dc8a7 --- /dev/null +++ b/neode-ui/dist/assets/AppDetails-DfPGLgac.js @@ -0,0 +1,7 @@ +import{d as pe,z as ue,y as he,a0 as me,c,a as e,J as h,D as s,m as ge,a1 as fe,f as w,E as a,G as p,F as C,P as ee,h as te,i as se,T as ne,x as ve,j as g,Q as oe,b as be,r as R,u as we,q as l,t as xe}from"./index-DnbYEqLr.js";import{S as d,P as r}from"./api-CHkUAu4g.js";const j={bitcoin:{state:r.Running,"static-files":{license:"MIT",instructions:"Bitcoin Core node for the Neode network",icon:"/assets/img/app-icons/bitcoin.svg"},manifest:{id:"bitcoin",title:"Bitcoin Core",version:"24.0.0",description:{short:"Full Bitcoin node implementation",long:"Bitcoin Core is the reference implementation of Bitcoin. It provides a full node implementation that validates and relays transactions, maintains the blockchain, and serves as a wallet."},"release-notes":"Initial release",license:"MIT","wrapper-repo":"https://github.com/bitcoin/bitcoin","upstream-repo":"https://github.com/bitcoin/bitcoin","support-site":"https://github.com/bitcoin/bitcoin/issues","marketing-site":"https://bitcoin.org","donation-url":null},installed:{"current-dependents":{},"current-dependencies":{},"last-backup":null,"interface-addresses":{main:{"tor-address":"bitcoin.onion","lan-address":"http://localhost:18443"}},status:d.Running}},"btcpay-server":{state:r.Running,"static-files":{license:"MIT",instructions:"BTCPay Server payment processor",icon:"/assets/img/app-icons/btcpay-server.png"},manifest:{id:"btcpay-server",title:"BTCPay Server",version:"1.12.0",description:{short:"Self-hosted Bitcoin payment processor",long:"BTCPay Server is a free, open-source cryptocurrency payment processor. Accept Bitcoin payments without intermediaries or fees. Complete merchant solution with invoicing, point of sale, and more."},"release-notes":"Initial release",license:"MIT","wrapper-repo":"https://github.com/btcpayserver/btcpayserver","upstream-repo":"https://github.com/btcpayserver/btcpayserver","support-site":"https://github.com/btcpayserver/btcpayserver/issues","marketing-site":"https://btcpayserver.org","donation-url":null},installed:{"current-dependents":{},"current-dependencies":{},"last-backup":null,"interface-addresses":{main:{"tor-address":"btcpay.onion","lan-address":"http://localhost:14142"}},status:d.Running}},homeassistant:{state:r.Running,"static-files":{license:"Apache-2.0",instructions:"Home automation platform",icon:"/assets/img/app-icons/homeassistant.png"},manifest:{id:"homeassistant",title:"Home Assistant",version:"2024.1.0",description:{short:"Open source home automation platform",long:"Home Assistant is an open-source home automation platform running on Python. It tracks and controls all devices at home and offers a platform for automating control."},"release-notes":"Initial release",license:"Apache-2.0","wrapper-repo":"https://github.com/home-assistant/core","upstream-repo":"https://github.com/home-assistant/core","support-site":"https://github.com/home-assistant/core/issues","marketing-site":"https://www.home-assistant.io","donation-url":null},installed:{"current-dependents":{},"current-dependencies":{},"last-backup":null,"interface-addresses":{main:{"tor-address":"homeassistant.onion","lan-address":"http://localhost:8123"}},status:d.Running}},lorabell:{state:r.Running,"static-files":{license:"MIT",instructions:"A LoRa based doorbell",icon:"/assets/img/app-icons/lorabell.png"},manifest:{id:"lorabell",title:"LoraBell",version:"1.0.0",description:{short:"A LoRa based doorbell",long:"A LoRa based doorbell - receive doorbell notifications over LoRa radio."},"release-notes":"Initial release",license:"MIT","wrapper-repo":"#","upstream-repo":"#","support-site":"#","marketing-site":"#","donation-url":null},installed:{"current-dependents":{},"current-dependencies":{},"last-backup":null,"interface-addresses":{main:{"tor-address":"lorabell.onion","lan-address":"http://192.168.1.166"}},status:d.Running}},grafana:{state:r.Running,"static-files":{license:"Apache-2.0",instructions:"Analytics and monitoring platform",icon:"/assets/img/grafana.png"},manifest:{id:"grafana",title:"Grafana",version:"10.2.0",description:{short:"Analytics and monitoring platform",long:"Grafana is an open-source analytics and monitoring platform. Create dashboards, query metrics, and visualize data from multiple sources."},"release-notes":"Initial release",license:"Apache-2.0","wrapper-repo":"https://github.com/grafana/grafana","upstream-repo":"https://github.com/grafana/grafana","support-site":"https://github.com/grafana/grafana/issues","marketing-site":"https://grafana.com","donation-url":null},installed:{"current-dependents":{},"current-dependencies":{},"last-backup":null,"interface-addresses":{main:{"tor-address":"grafana.onion","lan-address":"http://localhost:3000"}},status:d.Running}},endurain:{state:r.Stopped,"static-files":{license:"MIT",instructions:"Endurain application",icon:"/assets/img/endurain.png"},manifest:{id:"endurain",title:"Endurain",version:"1.0.0",description:{short:"Endurain application platform",long:"Endurain provides a platform for decentralized applications and services."},"release-notes":"Initial release",license:"MIT","wrapper-repo":"https://github.com/endurain/endurain","upstream-repo":"https://github.com/endurain/endurain","support-site":"https://github.com/endurain/endurain/issues","marketing-site":"https://endurain.io","donation-url":null},installed:{"current-dependents":{},"current-dependencies":{},"last-backup":null,"interface-addresses":{main:{"tor-address":"endurain.onion","lan-address":"http://localhost:8084"}},status:d.Stopped}},fedimint:{state:r.Running,"static-files":{license:"MIT",instructions:"Federated Bitcoin mint",icon:"/assets/img/app-icons/fedimint.png"},manifest:{id:"fedimint",title:"Fedimint",version:"0.3.0",description:{short:"Federated Bitcoin minting service",long:"Fedimint is a federated Bitcoin mint that enables private, scalable Bitcoin transactions through a federation of guardians."},"release-notes":"Initial release",license:"MIT","wrapper-repo":"https://github.com/fedimint/fedimint","upstream-repo":"https://github.com/fedimint/fedimint","support-site":"https://github.com/fedimint/fedimint/issues","marketing-site":"https://fedimint.org","donation-url":null},installed:{"current-dependents":{},"current-dependencies":{},"last-backup":null,"interface-addresses":{main:{"tor-address":"fedimint.onion","lan-address":"http://localhost:8175"}},status:d.Running}},"morphos-server":{state:r.Running,"static-files":{license:"MIT",instructions:"MorphOS server application",icon:"/assets/img/morphos.png"},manifest:{id:"morphos-server",title:"MorphOS Server",version:"1.0.0",description:{short:"MorphOS server platform",long:"MorphOS Server provides a flexible server platform for various applications and services."},"release-notes":"Initial release",license:"MIT","wrapper-repo":"https://github.com/morphos/morphos","upstream-repo":"https://github.com/morphos/morphos","support-site":"https://github.com/morphos/morphos/issues","marketing-site":"https://morphos.io","donation-url":null},installed:{"current-dependents":{},"current-dependencies":{},"last-backup":null,"interface-addresses":{main:{"tor-address":"morphos.onion","lan-address":"http://localhost:8081"}},status:d.Running}},"lightning-stack":{state:r.Running,"static-files":{license:"MIT",instructions:"Lightning Network stack",icon:"/assets/img/app-icons/lightning-stack.png"},manifest:{id:"lightning-stack",title:"Lightning Stack",version:"0.12.0",description:{short:"Complete Lightning Network implementation",long:"Lightning Stack provides a complete Lightning Network node implementation with LND, CLN, and supporting services for fast Bitcoin transactions."},"release-notes":"Initial release",license:"MIT","wrapper-repo":"https://github.com/lightningnetwork/lnd","upstream-repo":"https://github.com/lightningnetwork/lnd","support-site":"https://github.com/lightningnetwork/lnd/issues","marketing-site":"https://lightning.network","donation-url":null},installed:{"current-dependents":{},"current-dependencies":{},"last-backup":null,"interface-addresses":{main:{"tor-address":"lightning.onion","lan-address":"http://localhost:8080"}},status:d.Running}},mempool:{state:r.Running,"static-files":{license:"AGPL-3.0",instructions:"Bitcoin mempool explorer",icon:"/assets/img/app-icons/mempool.png"},manifest:{id:"mempool",title:"Mempool",version:"2.5.0",description:{short:"Bitcoin mempool and blockchain explorer",long:"Mempool is an open-source Bitcoin mempool and blockchain explorer. View transactions, blocks, and network statistics in real-time."},"release-notes":"Initial release",license:"AGPL-3.0","wrapper-repo":"https://github.com/mempool/mempool","upstream-repo":"https://github.com/mempool/mempool","support-site":"https://github.com/mempool/mempool/issues","marketing-site":"https://mempool.space","donation-url":null},installed:{"current-dependents":{},"current-dependencies":{},"last-backup":null,"interface-addresses":{main:{"tor-address":"mempool.onion","lan-address":"http://localhost:4080"}},status:d.Running}},ollama:{state:r.Running,"static-files":{license:"MIT",instructions:"Local AI model runner",icon:"/assets/img/app-icons/ollama.png"},manifest:{id:"ollama",title:"Ollama",version:"0.1.0",description:{short:"Run large language models locally",long:"Ollama allows you to run large language models locally on your Neode server. Download and run models like Llama, Mistral, and more without cloud dependencies."},"release-notes":"Initial release",license:"MIT","wrapper-repo":"https://github.com/ollama/ollama","upstream-repo":"https://github.com/ollama/ollama","support-site":"https://github.com/ollama/ollama/issues","marketing-site":"https://ollama.ai","donation-url":null},installed:{"current-dependents":{},"current-dependencies":{},"last-backup":null,"interface-addresses":{main:{"tor-address":"ollama.onion","lan-address":"http://localhost:11434"}},status:d.Running}},searxng:{state:r.Running,"static-files":{license:"AGPL-3.0",instructions:"Privacy-respecting search engine",icon:"/assets/img/app-icons/searxng.png"},manifest:{id:"searxng",title:"SearXNG",version:"2024.1.0",description:{short:"Privacy-respecting metasearch engine",long:"SearXNG is a privacy-respecting, hackable metasearch engine. Aggregate results from multiple search engines without tracking or ads."},"release-notes":"Initial release",license:"AGPL-3.0","wrapper-repo":"https://github.com/searxng/searxng","upstream-repo":"https://github.com/searxng/searxng","support-site":"https://github.com/searxng/searxng/issues","marketing-site":"https://searxng.org","donation-url":null},installed:{"current-dependents":{},"current-dependencies":{},"last-backup":null,"interface-addresses":{main:{"tor-address":"searxng.onion","lan-address":"http://localhost:8082"}},status:d.Running}},onlyoffice:{state:r.Running,"static-files":{license:"AGPL-3.0",instructions:"Office suite and document collaboration",icon:"/assets/img/onlyoffice.webp"},manifest:{id:"onlyoffice",title:"OnlyOffice",version:"7.5.0",description:{short:"Office suite and document collaboration",long:"OnlyOffice is a secure office suite that enables real-time collaborative editing of documents, spreadsheets, and presentations. Self-hosted alternative to Google Workspace and Microsoft 365."},"release-notes":"Initial release",license:"AGPL-3.0","wrapper-repo":"https://github.com/ONLYOFFICE/DocumentServer","upstream-repo":"https://github.com/ONLYOFFICE/DocumentServer","support-site":"https://github.com/ONLYOFFICE/DocumentServer/issues","marketing-site":"https://www.onlyoffice.com","donation-url":null},installed:{"current-dependents":{},"current-dependencies":{},"last-backup":null,"interface-addresses":{main:{"tor-address":"onlyoffice.onion","lan-address":"http://localhost:8083"}},status:d.Running}},penpot:{state:r.Running,"static-files":{license:"MPL-2.0",instructions:"Design and prototyping platform",icon:"/assets/img/penpot.webp"},manifest:{id:"penpot",title:"Penpot",version:"2.0.0",description:{short:"Open-source design and prototyping platform",long:"Penpot is an open-source design and prototyping platform for teams. Create designs, prototypes, and collaborate in real-time. Self-hosted alternative to Figma."},"release-notes":"Initial release",license:"MPL-2.0","wrapper-repo":"https://github.com/penpot/penpot","upstream-repo":"https://github.com/penpot/penpot","support-site":"https://github.com/penpot/penpot/issues","marketing-site":"https://penpot.app","donation-url":null},installed:{"current-dependents":{},"current-dependencies":{},"last-backup":null,"interface-addresses":{main:{"tor-address":"penpot.onion","lan-address":"http://localhost:9001"}},status:d.Running}},indeedhub:{state:r.Running,"static-files":{license:"MIT",instructions:"Decentralized media streaming platform",icon:"/assets/img/app-icons/indeedhub.png"},manifest:{id:"indeedhub",title:"Indeehub",version:"0.1.0",description:{short:"Decentralized media streaming platform",long:"Indeehub is a decentralized media streaming platform built on Nostr. Stream Bitcoin-focused documentaries, educational content, and independent films. Netflix-inspired interface with glassmorphism design, supporting content creators through the decentralized web."},"release-notes":"Initial release with Netflix-inspired interface",license:"MIT","wrapper-repo":"https://github.com/indeedhub/indeedhub","upstream-repo":"https://github.com/indeedhub/indeedhub","support-site":"https://github.com/indeedhub/indeedhub/issues","marketing-site":"https://indeedhub.com","donation-url":null},installed:{"current-dependents":{},"current-dependencies":{},"last-backup":null,"interface-addresses":{main:{"tor-address":"","lan-address":"http://localhost:8190"}},status:d.Running}},botfights:{state:r.Running,"static-files":{license:"MIT",instructions:"AI bot arena",icon:"/assets/img/app-icons/botfights.svg"},manifest:{id:"botfights",title:"BotFights",version:"1.0.0",description:{short:"AI bot arena — build, train, and battle autonomous agents",long:"BotFights is an AI bot arena where you can build, train, and battle autonomous agents. Create intelligent bots using various strategies, pit them against other players' creations, and climb the leaderboard. Features real-time battle visualization, multiple game modes, and a growing community of bot builders."},"release-notes":"Initial release",license:"MIT","wrapper-repo":"","upstream-repo":"","support-site":"","marketing-site":"https://botfights.net",website:"https://botfights.net","donation-url":null},installed:{"current-dependents":{},"current-dependencies":{},"last-backup":null,"interface-addresses":{main:{"tor-address":"","lan-address":"https://botfights.net"}},status:d.Running}},nwnn:{state:r.Running,"static-files":{license:"MIT",instructions:"Decentralized news aggregator",icon:"/assets/img/app-icons/nwnn.png"},manifest:{id:"nwnn",title:"Next Web News Network",version:"1.0.0",description:{short:"Decentralized news aggregator, synced from Telegram",long:"Next Web News Network (NWNN) is a decentralized news aggregation platform that curates and syncs content from Telegram channels. Stay informed with the latest developments in Bitcoin, decentralization, and sovereign technology. Clean reading experience with no ads or tracking."},"release-notes":"Initial release",license:"MIT","wrapper-repo":"","upstream-repo":"","support-site":"","marketing-site":"https://nwnn.l484.com",website:"https://nwnn.l484.com","donation-url":null},installed:{"current-dependents":{},"current-dependencies":{},"last-backup":null,"interface-addresses":{main:{"tor-address":"","lan-address":"https://nwnn.l484.com"}},status:d.Running}},"484-kitchen":{state:r.Running,"static-files":{license:"MIT",instructions:"K484 application platform",icon:"/assets/img/app-icons/484-kitchen.png"},manifest:{id:"484-kitchen",title:"484 Kitchen",version:"1.0.0",description:{short:"K484 application platform",long:"484 Kitchen is a creative application platform from the K484 collective. Explore experimental tools, interactive experiences, and cutting-edge web applications built with a focus on sovereignty and decentralization."},"release-notes":"Initial release",license:"MIT","wrapper-repo":"","upstream-repo":"","support-site":"","marketing-site":"https://484.kitchen",website:"https://484.kitchen","donation-url":null},installed:{"current-dependents":{},"current-dependencies":{},"last-backup":null,"interface-addresses":{main:{"tor-address":"","lan-address":"https://484.kitchen"}},status:d.Running}},"call-the-operator":{state:r.Running,"static-files":{license:"MIT",instructions:"Escape the Matrix",icon:"/assets/img/app-icons/call-the-operator.png"},manifest:{id:"call-the-operator",title:"Call the Operator",version:"1.0.0",description:{short:"Escape the Matrix — explore decentralized alternatives",long:"Call the Operator is an interactive guide to escaping the centralized matrix. Discover decentralized alternatives to mainstream services, learn about self-sovereignty, and take back control of your digital life. Beautiful dreamcore aesthetic with immersive 3D visuals."},"release-notes":"Initial release",license:"MIT","wrapper-repo":"","upstream-repo":"","support-site":"","marketing-site":"https://cta.tx1138.com",website:"https://cta.tx1138.com","donation-url":null},installed:{"current-dependents":{},"current-dependencies":{},"last-backup":null,"interface-addresses":{main:{"tor-address":"","lan-address":"https://cta.tx1138.com"}},status:d.Running}},"arch-presentation":{state:r.Running,"static-files":{license:"MIT",instructions:"Archipelago presentation",icon:"/assets/img/app-icons/arch-presentation.png"},manifest:{id:"arch-presentation",title:"Arch Presentation",version:"1.0.0",description:{short:"Archipelago: The Future of Decentralized Infrastructure",long:"The official Archipelago presentation deck. Learn about the vision, architecture, and roadmap of the Archipelago Bitcoin Node OS. Interactive slides showcasing the future of decentralized personal infrastructure, self-sovereign computing, and the Web5 stack."},"release-notes":"Initial release",license:"MIT","wrapper-repo":"","upstream-repo":"","support-site":"","marketing-site":"https://present.l484.com",website:"https://present.l484.com","donation-url":null},installed:{"current-dependents":{},"current-dependencies":{},"last-backup":null,"interface-addresses":{main:{"tor-address":"","lan-address":"https://present.l484.com"}},status:d.Running}},"syntropy-institute":{state:r.Running,"static-files":{license:"MIT",instructions:"Frequency analysis and therapy",icon:"/assets/img/app-icons/syntropy-institute.png"},manifest:{id:"syntropy-institute",title:"Syntropy Institute",version:"1.0.0",description:{short:"Medicine Reimagined — frequency analysis and therapy",long:"Syntropy Institute presents a new paradigm in health and wellness through frequency analysis and therapy. Explore cutting-edge research into bioresonance, quantum biology, and the energetic foundations of health. A bridge between ancient healing wisdom and modern technology."},"release-notes":"Initial release",license:"MIT","wrapper-repo":"","upstream-repo":"","support-site":"","marketing-site":"https://syntropy.institute",website:"https://syntropy.institute","donation-url":null},installed:{"current-dependents":{},"current-dependencies":{},"last-backup":null,"interface-addresses":{main:{"tor-address":"","lan-address":"https://syntropy.institute"}},status:d.Running}},"t-zero":{state:r.Running,"static-files":{license:"MIT",instructions:"Documentary series",icon:"/assets/img/app-icons/t-zero.png"},manifest:{id:"t-zero",title:"T-0",version:"1.0.0",description:{short:"Documentary series on decentralization and Bitcoin",long:"T-0 (Tee Minus Zero) is a documentary series exploring the intersection of decentralization, Bitcoin, and personal sovereignty. Follow the stories of builders, dreamers, and freedom advocates creating the infrastructure for a more sovereign future."},"release-notes":"Initial release",license:"MIT","wrapper-repo":"","upstream-repo":"","support-site":"","marketing-site":"https://teeminuszero.net",website:"https://teeminuszero.net","donation-url":null},installed:{"current-dependents":{},"current-dependencies":{},"last-backup":null,"interface-addresses":{main:{"tor-address":"","lan-address":"https://teeminuszero.net"}},status:d.Running}}},ke={class:"app-details-container pb-16 md:pb-16"},ye={key:0},_e={class:"glass-card p-6 mb-6"},Me={class:"hidden md:flex items-center gap-6"},Ie=["src","alt"],Ce={class:"flex-1 min-w-0"},Re={class:"text-2xl font-bold text-white mb-1"},Te={class:"text-white/70 text-sm mb-2"},Ae={class:"flex items-center gap-2"},Be={class:"text-white/50 text-xs"},ze={class:"flex items-center gap-2 flex-shrink-0"},Se={class:"md:hidden"},De={class:"flex items-start gap-4 mb-4"},Le=["src","alt"],je={class:"flex-1 min-w-0"},Pe={class:"text-xl font-bold text-white mb-1"},Ee={class:"text-white/70 text-xs mb-2 line-clamp-2"},Ne={class:"flex flex-wrap items-center gap-2"},Oe={class:"text-white/50 text-xs"},Fe=["title"],He={class:"grid grid-cols-2 gap-2"},Ve={class:"grid grid-cols-1 lg:grid-cols-3 gap-6"},$e={class:"lg:col-span-2 space-y-6"},Ue={class:"glass-card p-6"},Ge={class:"text-2xl font-bold text-white mb-4"},Ke={class:"grid grid-cols-1 md:grid-cols-2 gap-4"},qe={class:"text-white/60 text-sm mt-3 text-center"},We={class:"glass-card p-6"},Ye={class:"text-2xl font-bold text-white mb-4"},Ze={class:"text-white/80 leading-relaxed whitespace-pre-line"},Xe={key:0,class:"glass-card p-6"},Je={class:"text-2xl font-bold text-white mb-4"},Qe={class:"space-y-3"},et={class:"space-y-6"},tt={class:"glass-card p-6"},st={class:"text-lg font-bold text-white mb-4"},nt={class:"space-y-3"},ot={class:"flex items-center justify-between py-2 border-b border-white/10"},it={class:"text-white/60 text-sm"},at={class:"text-white font-medium"},rt={key:0,class:"flex items-center justify-between py-2 border-b border-white/10"},lt={class:"text-white/60 text-sm"},ct={class:"text-white font-medium"},dt={class:"flex items-center justify-between py-2 border-b border-white/10"},pt={class:"text-white/60 text-sm"},ut={class:"text-white font-medium capitalize"},ht={key:1,class:"flex items-center justify-between py-2 border-b border-white/10"},mt={class:"text-white/60 text-sm"},gt={class:"text-white font-medium"},ft={class:"flex items-center justify-between py-2"},vt={class:"text-white/60 text-sm"},bt={key:0,class:"glass-card p-6"},wt={class:"text-lg font-bold text-white mb-4"},xt={class:"space-y-3"},kt={class:"flex items-center gap-3 py-2 border-b border-white/10"},yt={class:"flex-1"},_t={class:"text-white/80 font-medium text-sm"},Mt={class:"text-white/50 text-xs capitalize"},It={class:"flex items-center gap-3 py-2"},Ct={class:"flex-1"},Rt={class:"text-white/80 font-medium text-sm"},Tt={class:"text-white/50 text-xs capitalize"},At={key:1,class:"glass-card p-6"},Bt={class:"text-lg font-bold text-white mb-4"},zt={class:"space-y-3"},St={key:0,class:"flex items-start gap-3"},Dt={class:"flex-1 min-w-0"},Lt={class:"text-white/80 font-medium"},jt=["href"],Pt={key:1,class:"flex items-start gap-3"},Et={class:"flex-1 min-w-0"},Nt={class:"text-white/80 font-medium"},Ot={class:"text-amber-300/90 text-sm font-mono break-all"},Ft={class:"text-white/50 text-xs mt-1"},Ht={key:2,class:"glass-card p-6"},Vt={class:"text-lg font-bold text-white mb-4"},$t={class:"space-y-3"},Ut={class:"flex items-start gap-3"},Gt={class:"flex-1"},Kt={class:"text-white/80 font-medium"},qt={class:"text-white/60 text-sm"},Wt={class:"flex items-start gap-3"},Yt={class:"flex-1"},Zt={class:"text-white/80 font-medium"},Xt={class:"text-white/60 text-sm"},Jt={class:"glass-card p-6"},Qt={class:"text-lg font-bold text-white mb-4"},es={class:"space-y-2"},ts=["href"],ss={href:"#",class:"flex items-center gap-2 text-blue-400 hover:text-blue-300 transition-colors"},ns={href:"#",class:"flex items-center gap-2 text-blue-400 hover:text-blue-300 transition-colors"},os={key:1,class:"glass-card p-12 text-center"},is={class:"text-2xl font-semibold text-white mb-2"},as={class:"text-white/70"},rs={class:"flex items-start gap-4 mb-6"},ls={class:"flex-1 min-w-0"},cs={class:"text-xl font-semibold text-white mb-2"},ds={class:"text-white/70 text-sm"},ps={class:"flex flex-col-reverse md:flex-row gap-3 md:justify-end"},us={key:0,class:"fixed bottom-20 left-1/2 -translate-x-1/2 z-50 max-w-md w-full px-4",role:"alert","aria-live":"assertive"},hs={class:"bg-red-500/20 border border-red-500/40 backdrop-blur-sm rounded-lg px-4 py-3 text-red-200 text-sm flex items-center justify-between gap-3"},ms=["aria-label"],gs=pe({__name:"AppDetails",setup(fs){const T=ve(),P=we(),f=ue(),{t:i}=he(),v=g(()=>P.params.id),E={indeedhub:`${window.location.protocol}//${window.location.hostname}:7777`,botfights:"https://botfights.net",nwnn:"https://nwnn.l484.com","484-kitchen":"https://484.kitchen","call-the-operator":"https://cta.tx1138.com","arch-presentation":"https://present.l484.com","syntropy-institute":"https://syntropy.institute","t-zero":"https://teeminuszero.net"},x=g(()=>v.value in E),ie={mempool:"mempool-web","mempool-electrs":"mempool-electrs",electrs:"mempool-electrs",btcpay:"btcpay-server","btcpay-server":"btcpay-server",fedimint:"fedimint","fedimint-gateway":"fedimint-gateway",lnd:"lnd","lnd-ui":"lnd",bitcoin:"bitcoin-knots","bitcoin-knots":"bitcoin-knots",homeassistant:"homeassistant","home-assistant":"homeassistant",grafana:"grafana",searxng:"searxng",ollama:"ollama",onlyoffice:"onlyoffice",penpot:"penpot",nextcloud:"nextcloud",vaultwarden:"vaultwarden",jellyfin:"jellyfin",photoprism:"photoprism",immich:"immich",filebrowser:"filebrowser","nginx-proxy-manager":"nginx-proxy-manager",portainer:"portainer","uptime-kuma":"uptime-kuma",tailscale:"tailscale"},ae={immich:["immich_server","immich-server"],nextcloud:["nextcloud-aio","nextcloud-server"]};function N(n){return ie[n]??n}const o=g(()=>{const n=v.value,t=N(n);if(f.packages[t])return f.packages[t];if(f.packages[n])return f.packages[n];const u=ae[n];if(u){for(const m of u)if(f.packages[m])return f.packages[m]}return j[n]?j[n]:null}),k=g(()=>{const n=o.value?.installed?.["interface-addresses"]?.main;return!n||!n["lan-address"]&&!A(n["tor-address"])?null:n});function A(n){return!!(n&&n.endsWith(".onion")&&n.length>=60&&n.length<=70)}const re=g(()=>{const n=k.value?.["lan-address"];return n?n.includes("localhost")?n.replace("localhost",window.location.hostname):n:"#"}),le=g(()=>{const n=k.value?.["tor-address"];return!n||!A(n)?"":n.startsWith("http")?n:`http://${n}`}),O=g(()=>N(v.value)),B=g(()=>{const n=f.packages["fedimint-gateway"];return n?n.state:"not installed"}),_=R("");let z;function M(n){_.value=n,z&&clearTimeout(z),z=setTimeout(()=>{_.value=""},5e3)}const y=R({show:!1,appTitle:""}),F=R(null),H=R(null);function S(){H.value?.focus?.(),y.value.show=!1}me(F,g(()=>y.value.show),S,{restoreFocusRef:H});const V=g(()=>P.query.from==="marketplace"?i("appDetails.backToStore"):i("appDetails.backToApps")),D=g(()=>{if(!o.value)return!1;if(x.value)return!0;const n=o.value.manifest.interfaces?.main?.ui||o.value.installed?.["interface-addresses"]?.main,t=o.value.state==="running";return n&&t}),$=g(()=>["Self-hosted and privacy-focused","Easy installation and updates","Automatic backups","Secure by default"]);function U(n){const t=n.target,u=t.src,m=v.value;if(j[m]){const b=[`https://raw.githubusercontent.com/Start9Labs/${m}-startos/main/icon.png`,`https://raw.githubusercontent.com/Start9Labs/${m}-startos/main/icon.svg`,`/assets/img/app-icons/${m}.png`,`/assets/img/app-icons/${m}.svg`],Q=b.findIndex(I=>u.includes(I));if(Q + + + + + `)}`;u.includes("data:image")?t.src="/assets/img/logo-archipelago.svg":t.src=L}function G(){T.back()}function K(){if(!o.value)return;const n=v.value,t=E[n];if(t){oe().open({url:t,title:o.value.manifest.title});return}const u={lorabell:{dev:"http://192.168.1.166",prod:"http://192.168.1.166"},atob:{dev:"http://localhost:8102",prod:"https://app.atobitcoin.io"},k484:{dev:"http://localhost:8103",prod:"http://localhost:8103"},indeedhub:{dev:"https://archipelago.indeehub.studio",prod:"https://archipelago.indeehub.studio"},bitcoin:{dev:"http://localhost:8332",prod:"http://localhost:8332"},"btcpay-server":{dev:"http://localhost:23000",prod:"http://localhost:23000"},homeassistant:{dev:"http://localhost:8123",prod:"http://localhost:8123"},grafana:{dev:"http://localhost:3000",prod:"http://localhost:3000"},endurain:{dev:"http://localhost:8080",prod:"http://localhost:8080"},fedimint:{dev:"http://localhost:8175",prod:"http://192.168.1.228:8175"},"fedimint-gateway":{dev:"http://localhost:8176",prod:"http://192.168.1.228:8176"},"morphos-server":{dev:"http://localhost:8081",prod:"http://localhost:8081"},"lightning-stack":{dev:"http://localhost:9735",prod:"http://localhost:9735"},mempool:{dev:"http://localhost:4080",prod:"http://localhost:4080"},ollama:{dev:"http://localhost:11434",prod:"http://localhost:11434"},searxng:{dev:"http://localhost:8888",prod:"http://localhost:8888"},onlyoffice:{dev:"http://localhost:9980",prod:"http://localhost:9980"},penpot:{dev:"http://localhost:9001",prod:"http://localhost:9001"},nextcloud:{dev:"http://localhost:8085",prod:"http://localhost:8085"},vaultwarden:{dev:"http://localhost:8082",prod:"http://localhost:8082"},jellyfin:{dev:"http://localhost:8096",prod:"http://localhost:8096"},photoprism:{dev:"http://localhost:2342",prod:"http://localhost:2342"},immich:{dev:"http://localhost:2283",prod:"http://localhost:2283"},filebrowser:{dev:"http://localhost:8083",prod:"http://localhost:8083"},"nginx-proxy-manager":{dev:"http://localhost:81",prod:"http://localhost:81"},portainer:{dev:"http://localhost:9000",prod:"http://localhost:9000"},"uptime-kuma":{dev:"http://localhost:3001",prod:"http://localhost:3001"},tailscale:{dev:"http://localhost:8240",prod:"http://localhost:8240"},lnd:{dev:"http://localhost:8081",prod:"http://localhost:8081"},"bitcoin-knots":{dev:"http://localhost:8334",prod:"http://localhost:8334"},botfights:{dev:"https://botfights.net",prod:"https://botfights.net"},nwnn:{dev:"https://nwnn.l484.com",prod:"https://nwnn.l484.com"},"484-kitchen":{dev:"https://484.kitchen",prod:"https://484.kitchen"},"call-the-operator":{dev:"https://cta.tx1138.com",prod:"https://cta.tx1138.com"},"arch-presentation":{dev:"https://present.l484.com",prod:"https://present.l484.com"},"syntropy-institute":{dev:"https://syntropy.institute",prod:"https://syntropy.institute"},"t-zero":{dev:"https://teeminuszero.net",prod:"https://teeminuszero.net"}};if(u[n]){let b=u[n].prod;b.includes("localhost")&&(b=b.replace("localhost",window.location.hostname)),oe().open({url:b,title:o.value.manifest.title});return}const m=o.value.manifest.interfaces?.main?.["tor-config"],L=o.value.manifest.interfaces?.main?.["lan-config"];(m||L)&&M(i("appDetails.noLaunchUrl"))}async function q(){try{await f.startPackage(v.value)}catch(n){M(`Failed to start: ${n instanceof Error?n.message:"Unknown error"}`)}}async function W(){try{await f.stopPackage(v.value)}catch(n){M(`Failed to stop: ${n instanceof Error?n.message:"Unknown error"}`)}}async function Y(){try{await f.restartPackage(v.value)}catch(n){M(`Failed to restart: ${n instanceof Error?n.message:"Unknown error"}`)}}function ce(){o.value&&(y.value={show:!0,appTitle:o.value.manifest.title})}async function de(){y.value.show=!1;try{await f.uninstallPackage(v.value),T.push("/dashboard/apps").catch(()=>{})}catch(n){M(`Failed to uninstall: ${n instanceof Error?n.message:"Unknown error"}`)}}async function Z(){ce()}function X(n){switch(n){case r.Running:return"bg-green-500/20 text-green-200 border border-green-500/30";case r.Stopped:return"bg-gray-500/20 text-gray-200 border border-gray-500/30";case r.Starting:case r.Stopping:case r.Restarting:return"bg-yellow-500/20 text-yellow-200 border border-yellow-500/30";case r.Installing:return"bg-blue-500/20 text-blue-200 border border-blue-500/30";default:return"bg-gray-500/20 text-gray-200 border border-gray-500/30"}}function J(n){switch(n){case r.Running:return"bg-green-400";case r.Stopped:return"bg-gray-400";case r.Starting:case r.Stopping:case r.Restarting:return"bg-yellow-400 animate-pulse";case r.Installing:return"bg-blue-400 animate-pulse";default:return"bg-gray-400"}}return(n,t)=>(l(),c("div",ke,[e("button",{onClick:G,class:"hidden md:flex mb-6 items-center gap-2 text-white/70 hover:text-white transition-colors"},[t[5]||(t[5]=e("svg",{class:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M15 19l-7-7 7-7"})],-1)),h(" "+s(V.value),1)]),(l(),ge(fe,{to:"body"},[e("button",{onClick:G,class:"md:hidden mobile-back-btn glass-button px-6 py-3 rounded-lg font-medium shadow-2xl flex items-center justify-center gap-2"},[t[6]||(t[6]=e("svg",{class:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M15 19l-7-7 7-7"})],-1)),e("span",null,s(V.value),1)])])),o.value?(l(),c("div",ye,[e("div",_e,[e("div",Me,[e("img",{src:o.value["static-files"]?.icon||`/assets/img/app-icons/${o.value.manifest?.id||v.value}.png`,alt:o.value.manifest.title,class:"w-20 h-20 rounded-xl shadow-xl flex-shrink-0",onError:U},null,40,Ie),e("div",Ce,[e("h1",Re,s(o.value.manifest.title),1),e("p",Te,s(o.value.manifest.description.short),1),e("div",Ae,[e("span",{class:w(["inline-flex items-center px-2.5 py-1 rounded-lg text-xs font-medium",X(o.value.state)])},[e("span",{class:w(["w-1.5 h-1.5 rounded-full mr-1.5",J(o.value.state)])},null,2),h(" "+s(o.value.state),1)],2),e("span",Be,"v"+s(o.value.manifest.version),1)])]),e("div",ze,[O.value==="lnd"?(l(),c("button",{key:0,onClick:t[0]||(t[0]=u=>a(T).push("/dashboard/apps/lnd/channels")),class:"glass-button glass-button-sm px-4 py-2.5 rounded-lg text-sm font-medium flex items-center gap-2"},[t[7]||(t[7]=e("svg",{class:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M13 10V3L4 14h7v7l9-11h-7z"})],-1)),h(" "+s(a(i)("appDetails.channels")),1)])):p("",!0),D.value?(l(),c("button",{key:1,onClick:K,class:"glass-button glass-button-sm px-6 py-2.5 rounded-lg text-sm font-semibold flex items-center gap-2"},[t[8]||(t[8]=e("svg",{class:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14"})],-1)),h(" "+s(a(i)("common.launch")),1)])):p("",!0),x.value?p("",!0):(l(),c(C,{key:2},[o.value.state==="stopped"?(l(),c("button",{key:0,onClick:q,class:"px-4 py-2.5 bg-green-500/20 border border-green-500/40 rounded-lg text-green-200 text-sm font-medium hover:bg-green-500/30 transition-colors flex items-center gap-2"},[t[9]||(t[9]=e("svg",{class:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M14.752 11.168l-3.197-2.132A1 1 0 0010 9.87v4.263a1 1 0 001.555.832l3.197-2.132a1 1 0 000-1.664z"})],-1)),h(" "+s(a(i)("common.start")),1)])):p("",!0),e("button",{onClick:Y,class:"px-4 py-2.5 glass-button rounded-lg text-sm font-medium hover:bg-white/15 transition-colors flex items-center gap-2"},[t[10]||(t[10]=e("svg",{class:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15"})],-1)),h(" "+s(a(i)("common.restart")),1)]),o.value.state==="running"?(l(),c("button",{key:1,onClick:W,class:"px-4 py-2.5 bg-yellow-500/20 border border-yellow-500/40 rounded-lg text-yellow-200 text-sm font-medium hover:bg-yellow-500/30 transition-colors flex items-center gap-2"},[t[11]||(t[11]=e("svg",{class:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M21 12a9 9 0 11-18 0 9 9 0 0118 0z"}),e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M9 10a1 1 0 011-1h4a1 1 0 011 1v4a1 1 0 01-1 1h-4a1 1 0 01-1-1v-4z"})],-1)),h(" "+s(a(i)("common.stop")),1)])):p("",!0),e("button",{onClick:Z,class:"px-4 py-2.5 bg-red-600/20 border border-red-600/40 rounded-lg text-red-300 text-sm font-medium hover:bg-red-600/30 transition-colors flex items-center gap-2"},[t[12]||(t[12]=e("svg",{class:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16"})],-1)),h(" "+s(a(i)("common.uninstall")),1)])],64))])]),e("div",Se,[e("div",De,[e("img",{src:o.value["static-files"]?.icon||`/assets/img/app-icons/${o.value.manifest?.id||v.value}.png`,alt:o.value.manifest.title,class:"w-20 h-20 rounded-xl shadow-xl flex-shrink-0",onError:U},null,40,Le),e("div",je,[e("h1",Pe,s(o.value.manifest.title),1),e("p",Ee,s(o.value.manifest.description.short),1),e("div",Ne,[e("span",{class:w(["inline-flex items-center px-2 py-0.5 rounded text-xs font-medium",X(o.value.state)])},[e("span",{class:w(["w-1.5 h-1.5 rounded-full mr-1",J(o.value.state)])},null,2),h(" "+s(o.value.state),1)],2),e("span",Oe,"v"+s(o.value.manifest.version),1)])]),x.value?p("",!0):(l(),c("button",{key:0,onClick:Z,class:"flex-shrink-0 w-10 h-10 rounded-lg bg-red-600/20 border border-red-600/40 text-red-300 hover:bg-red-600/30 transition-colors flex items-center justify-center",title:a(i)("common.uninstall")},[...t[13]||(t[13]=[e("svg",{class:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16"})],-1)])],8,Fe))]),e("div",He,[D.value?(l(),c("button",{key:0,onClick:K,class:w([x.value?"col-span-2":"","glass-button glass-button-sm px-4 py-2.5 rounded-lg text-sm font-semibold flex items-center justify-center gap-2"])},[t[14]||(t[14]=e("svg",{class:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14"})],-1)),h(" "+s(a(i)("common.launch")),1)],2)):p("",!0),x.value?p("",!0):(l(),c(C,{key:1},[o.value.state==="stopped"?(l(),c("button",{key:0,onClick:q,class:"px-4 py-2.5 bg-green-500/20 border border-green-500/40 rounded-lg text-green-200 text-sm font-medium hover:bg-green-500/30 transition-colors flex items-center justify-center gap-2"},[t[15]||(t[15]=e("svg",{class:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M14.752 11.168l-3.197-2.132A1 1 0 0010 9.87v4.263a1 1 0 001.555.832l3.197-2.132a1 1 0 000-1.664z"})],-1)),h(" "+s(a(i)("common.start")),1)])):p("",!0),o.value.state==="running"?(l(),c("button",{key:1,onClick:W,class:"px-4 py-2.5 bg-yellow-500/20 border border-yellow-500/40 rounded-lg text-yellow-200 text-sm font-medium hover:bg-yellow-500/30 transition-colors flex items-center justify-center gap-2"},[t[16]||(t[16]=e("svg",{class:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M21 12a9 9 0 11-18 0 9 9 0 0118 0z"}),e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M9 10a1 1 0 011-1h4a1 1 0 011 1v4a1 1 0 01-1 1h-4a1 1 0 01-1-1v-4z"})],-1)),h(" "+s(a(i)("common.stop")),1)])):p("",!0),e("button",{onClick:Y,class:w([[D.value&&(o.value.state==="stopped"||o.value.state==="running")?"col-span-2":""],"px-4 py-2.5 glass-button rounded-lg text-sm font-medium hover:bg-white/15 transition-colors flex items-center justify-center gap-2"])},[t[17]||(t[17]=e("svg",{class:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15"})],-1)),h(" "+s(a(i)("common.restart")),1)],2)],64))])])]),e("div",Ve,[e("div",$e,[e("div",Ue,[e("h2",Ge,s(a(i)("appDetails.screenshots")),1),e("div",Ke,[(l(),c(C,null,ee(4,u=>e("div",{key:u,class:"aspect-video rounded-xl bg-white/5 border border-white/10 flex items-center justify-center hover:bg-white/10 transition-colors cursor-pointer"},[...t[18]||(t[18]=[e("svg",{class:"w-16 h-16 text-white/20",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M4 16l4.586-4.586a2 2 0 012.828 0L16 16m-2-2l1.586-1.586a2 2 0 012.828 0L20 14m-6-6h.01M6 20h12a2 2 0 002-2V6a2 2 0 00-2-2H6a2 2 0 00-2 2v12a2 2 0 002 2z"})],-1)])])),64))]),e("p",qe,s(a(i)("appDetails.screenshotPlaceholder")),1)]),e("div",We,[e("h2",Ye,s(a(i)("appDetails.about",{name:o.value.manifest.title})),1),e("p",Ze,s(o.value.manifest.description.long),1)]),$.value.length>0?(l(),c("div",Xe,[e("h2",Je,s(a(i)("appDetails.features")),1),e("ul",Qe,[(l(!0),c(C,null,ee($.value,(u,m)=>(l(),c("li",{key:m,class:"flex items-start gap-3 text-white/80"},[t[19]||(t[19]=e("svg",{class:"w-6 h-6 text-green-400 flex-shrink-0 mt-0.5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z"})],-1)),e("span",null,s(u),1)]))),128))])])):p("",!0)]),e("div",et,[e("div",tt,[e("h3",st,s(a(i)("appDetails.information")),1),e("div",nt,[e("div",ot,[e("span",it,s(a(i)("common.version")),1),e("span",at,s(o.value.manifest.version),1)]),o.value.manifest.author?(l(),c("div",rt,[e("span",lt,s(a(i)("common.developer")),1),e("span",ct,s(o.value.manifest.author),1)])):p("",!0),e("div",dt,[e("span",pt,s(a(i)("common.status")),1),e("span",ut,s(o.value.state),1)]),o.value.manifest.license?(l(),c("div",ht,[e("span",mt,s(a(i)("common.license")),1),e("span",gt,s(o.value.manifest.license),1)])):p("",!0),e("div",ft,[e("span",vt,s(a(i)("common.category")),1),t[20]||(t[20]=e("span",{class:"text-white font-medium"},"App",-1))])])]),O.value==="fedimint"?(l(),c("div",bt,[e("h3",wt,s(a(i)("appDetails.services")),1),e("div",xt,[e("div",kt,[e("span",{class:w(["w-2 h-2 rounded-full",o.value.state==="running"?"bg-green-400":"bg-yellow-400"])},null,2),e("div",yt,[e("p",_t,s(a(i)("appDetails.guardian")),1),e("p",Mt,s(o.value.state),1)])]),e("div",It,[e("span",{class:w(["w-2 h-2 rounded-full",B.value==="running"?"bg-green-400":B.value==="stopped"?"bg-yellow-400":"bg-red-400"])},null,2),e("div",Ct,[e("p",Rt,s(a(i)("appDetails.gateway")),1),e("p",Tt,s(B.value),1)])])])])):p("",!0),k.value?(l(),c("div",At,[e("h3",Bt,s(a(i)("appDetails.access")),1),e("div",zt,[k.value["lan-address"]?(l(),c("div",St,[t[21]||(t[21]=e("svg",{class:"w-5 h-5 text-green-400 flex-shrink-0 mt-0.5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M21 12a9 9 0 01-9 9m9-9a9 9 0 00-9-9m9 9H3m9 9a9 9 0 01-9-9m9 9c1.657 0 3-4.03 3-9s-1.343-9-3-9m0 18c-1.657 0-3-4.03-3-9s1.343-9 3-9m-9 9a9 9 0 019-9"})],-1)),e("div",Dt,[e("p",Lt,s(a(i)("appDetails.lan")),1),e("a",{href:re.value,target:"_blank",rel:"noopener noreferrer",class:"text-blue-400 hover:text-blue-300 text-sm break-all"},s(k.value["lan-address"]),9,jt)])])):p("",!0),A(k.value["tor-address"])?(l(),c("div",Pt,[t[22]||(t[22]=e("svg",{class:"w-5 h-5 text-amber-400 flex-shrink-0 mt-0.5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1"})],-1)),e("div",Et,[e("p",Nt,s(a(i)("appDetails.tor")),1),e("span",Ot,s(le.value),1),e("p",Ft,s(a(i)("appDetails.requiresTor")),1)])])):p("",!0)])])):p("",!0),x.value?p("",!0):(l(),c("div",Ht,[e("h3",Vt,s(a(i)("appDetails.requirements")),1),e("div",$t,[e("div",Ut,[t[23]||(t[23]=e("svg",{class:"w-5 h-5 text-blue-400 flex-shrink-0 mt-0.5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M9 3v2m6-2v2M9 19v2m6-2v2M5 9H3m2 6H3m18-6h-2m2 6h-2M7 19h10a2 2 0 002-2V7a2 2 0 00-2-2H7a2 2 0 00-2 2v10a2 2 0 002 2zM9 9h6v6H9V9z"})],-1)),e("div",Gt,[e("p",Kt,s(a(i)("appDetails.ram")),1),e("p",qt,s(a(i)("appDetails.ramDesc")),1)])]),e("div",Wt,[t[24]||(t[24]=e("svg",{class:"w-5 h-5 text-purple-400 flex-shrink-0 mt-0.5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M4 7v10c0 2.21 3.582 4 8 4s8-1.79 8-4V7M4 7c0 2.21 3.582 4 8 4s8-1.79 8-4M4 7c0-2.21 3.582-4 8-4s8 1.79 8 4"})],-1)),e("div",Yt,[e("p",Zt,s(a(i)("appDetails.storage")),1),e("p",Xt,s(a(i)("appDetails.storageDesc")),1)])])])])),e("div",Jt,[e("h3",Qt,s(a(i)("appDetails.links")),1),e("div",es,[o.value.manifest.website?(l(),c("a",{key:0,href:o.value.manifest.website,target:"_blank",rel:"noopener noreferrer",class:"flex items-center gap-2 text-blue-400 hover:text-blue-300 transition-colors"},[t[25]||(t[25]=e("svg",{class:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M21 12a9 9 0 01-9 9m9-9a9 9 0 00-9-9m9 9H3m9 9a9 9 0 01-9-9m9 9c1.657 0 3-4.03 3-9s-1.343-9-3-9m0 18c-1.657 0-3-4.03-3-9s1.343-9 3-9m-9 9a9 9 0 019-9"})],-1)),h(" "+s(a(i)("appDetails.website")),1)],8,ts)):p("",!0),e("a",ss,[t[26]||(t[26]=e("svg",{class:"w-5 h-5",fill:"currentColor",viewBox:"0 0 24 24"},[e("path",{d:"M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.840 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z"})],-1)),h(" "+s(a(i)("appDetails.sourceCode")),1)]),e("a",ns,[t[27]||(t[27]=e("svg",{class:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"})],-1)),h(" "+s(a(i)("appDetails.documentation")),1)])])])])])])):(l(),c("div",os,[t[28]||(t[28]=e("svg",{class:"w-24 h-24 text-white/20 mx-auto mb-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M9.172 16.172a4 4 0 015.656 0M9 10h.01M15 10h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"})],-1)),e("h3",is,s(a(i)("appDetails.notFoundTitle")),1),e("p",as,s(a(i)("appDetails.notFoundMessage")),1)])),te(ne,{name:"modal"},{default:se(()=>[y.value.show?(l(),c("div",{key:0,class:"fixed inset-0 z-50 flex items-center justify-center p-4",onClick:t[3]||(t[3]=u=>S())},[t[30]||(t[30]=e("div",{class:"absolute inset-0 bg-black/60 backdrop-blur-sm"},null,-1)),e("div",{ref_key:"uninstallModalRef",ref:F,onClick:t[2]||(t[2]=be(()=>{},["stop"])),class:"glass-card p-6 md:p-8 max-w-md w-full relative z-10"},[e("div",rs,[t[29]||(t[29]=e("div",{class:"p-3 bg-red-500/20 rounded-lg flex-shrink-0"},[e("svg",{class:"w-6 h-6 text-red-400",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z"})])],-1)),e("div",ls,[e("h3",cs,s(a(i)("appDetails.uninstallTitle")),1),e("p",ds,s(a(i)("appDetails.uninstallConfirm",{name:y.value.appTitle})),1)])]),e("div",ps,[e("button",{onClick:t[1]||(t[1]=u=>S()),class:"w-full md:w-auto px-6 py-3 glass-button rounded-lg text-sm font-medium"},s(a(i)("common.cancel")),1),e("button",{onClick:de,class:"w-full md:w-auto px-6 py-3 bg-red-600/80 hover:bg-red-600 rounded-lg text-white text-sm font-medium transition-colors"},s(a(i)("common.uninstall")),1)])],512)])):p("",!0)]),_:1}),te(ne,{name:"fade"},{default:se(()=>[_.value?(l(),c("div",us,[e("div",hs,[e("span",null,s(_.value),1),e("button",{onClick:t[4]||(t[4]=u=>_.value=""),"aria-label":a(i)("apps.dismissError"),class:"text-red-300 hover:text-white shrink-0"},"×",8,ms)])])):p("",!0)]),_:1})]))}}),ws=xe(gs,[["__scopeId","data-v-46d35a3e"]]);export{ws as default}; diff --git a/neode-ui/dist/assets/AppDetails-DjlSPTt1.css b/neode-ui/dist/assets/AppDetails-DjlSPTt1.css new file mode 100644 index 0000000..f6a9744 --- /dev/null +++ b/neode-ui/dist/assets/AppDetails-DjlSPTt1.css @@ -0,0 +1 @@ +.modal-enter-active[data-v-46d35a3e],.modal-leave-active[data-v-46d35a3e]{transition:opacity .3s ease}.modal-enter-active .glass-card[data-v-46d35a3e],.modal-leave-active .glass-card[data-v-46d35a3e]{transition:transform .3s ease,opacity .3s ease}.modal-enter-from[data-v-46d35a3e],.modal-leave-to[data-v-46d35a3e]{opacity:0}.modal-enter-from .glass-card[data-v-46d35a3e],.modal-leave-to .glass-card[data-v-46d35a3e]{transform:scale(.95);opacity:0}.fade-enter-active[data-v-46d35a3e],.fade-leave-active[data-v-46d35a3e]{transition:opacity .3s ease}.fade-enter-from[data-v-46d35a3e],.fade-leave-to[data-v-46d35a3e]{opacity:0} diff --git a/neode-ui/dist/assets/AppSession-Cw_auYBr.js b/neode-ui/dist/assets/AppSession-Cw_auYBr.js new file mode 100644 index 0000000..17ee5ba --- /dev/null +++ b/neode-ui/dist/assets/AppSession-Cw_auYBr.js @@ -0,0 +1 @@ +import{d as Ce,r as p,w as Ie,o as Ee,A as Me,c as d,m as Pe,a as n,b as Q,f as C,D as z,h as S,i as F,T as V,G as P,a9 as _e,a1 as Te,j as b,x as Be,B as f,J as D,Q as Se,u as Ae,q as c,t as $e}from"./index-DnbYEqLr.js";const Ne={class:"app-session-root"},je={class:"sticky top-0 z-10 flex items-center gap-3 border-b border-white/10 px-4 py-3 bg-black/60 backdrop-blur-md md:bg-transparent md:backdrop-blur-none"},Re={class:"flex-1 truncate text-sm font-medium text-white/90"},Le=["disabled"],Oe={key:0,class:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},ze={key:1,class:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},Fe={key:2,class:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},Ve={key:0,class:"absolute right-0 top-full mt-1 w-48 bg-black/90 border border-white/10 rounded-lg backdrop-blur-xl shadow-2xl overflow-hidden z-50"},De={class:"relative flex-1 min-h-0 bg-black/40 overflow-hidden"},He={key:0,class:"absolute inset-0 z-10 flex items-center justify-center bg-black/40"},qe=["src"],Ke={key:0,class:"absolute inset-0 z-10 flex flex-col items-center justify-center"},Ue={class:"text-center px-8"},Ye={class:"text-white/50 text-sm mb-6"},Ge={key:1,class:"absolute inset-0 flex items-center justify-center"},We={class:"text-center px-8"},Je={class:"text-white/50 text-sm"},H="archipelago_app_display_mode",Z="archipelago_app_identity_",Xe=Ce({__name:"AppSession",props:{appIdProp:{}},emits:["close"],setup(ee,{emit:te}){const q=ee,A=te,v=b(()=>!!q.appIdProp),$=Ae(),_=Be(),y=p(null),I=p(null),N=p(null),h=p(!0),E=p(!1),w=p(!1),K=p(0),M=p(!1),g=p(!1);let r=null;const ne=new Set([]),i=p(localStorage.getItem(H)||"panel");function j(t){if(i.value==="fullscreen"&&document.fullscreenElement&&document.exitFullscreen().catch(()=>{}),i.value=t,localStorage.setItem(H,t),g.value=!1,v.value&&t!=="panel"){const e=u.value;A("close"),_.push({name:"app-session",params:{appId:e}});return}if(!v.value&&t==="panel"){const e=u.value,o=Se();_.push({name:"apps"}).then(()=>{o.panelAppId=e});return}t==="fullscreen"&&y.value&&!document.fullscreenElement&&y.value.requestFullscreen().catch(()=>{})}const oe=b(()=>v.value?"app-session-backdrop-inline":"app-session-backdrop-overlay"),se=b(()=>{const t="app-session-panel glass-card";return v.value?`${t} app-session-inline`:i.value==="fullscreen"?`${t} app-session-fullscreen`:`${t} app-session-overlay`}),u=b(()=>q.appIdProp||$.params.appId),U={"bitcoin-knots":8334,"bitcoin-ui":8334,electrumx:50002,electrs:50002,"archy-electrs-ui":50002,"mempool-electrs":50002,"btcpay-server":23e3,lnd:8081,"archy-lnd-ui":8081,mempool:4080,"mempool-web":4080,"archy-mempool-web":4080,homeassistant:8123,grafana:3e3,searxng:8888,ollama:11434,onlyoffice:9980,penpot:9001,nextcloud:8085,vaultwarden:8082,jellyfin:8096,photoprism:2342,immich:2283,immich_server:2283,filebrowser:8083,"nginx-proxy-manager":81,portainer:9e3,"uptime-kuma":3001,tailscale:8240,fedimint:8175,"fedimint-gateway":8176,"nostr-rs-relay":18081,indeedhub:7777,dwn:3100,endurain:8080},le={},ae={"bitcoin-knots":"/app/bitcoin-ui/","bitcoin-ui":"/app/bitcoin-ui/",lnd:"/app/lnd/",electrumx:"/app/electrs/",electrs:"/app/electrs/","mempool-electrs":"/app/electrs/",mempool:"/app/mempool/","mempool-web":"/app/mempool/","archy-mempool-web":"/app/mempool/",fedimint:"/app/fedimint/","fedimint-gateway":"/app/fedimint-gateway/",jellyfin:"/app/jellyfin/",searxng:"/app/searxng/",filebrowser:"/app/filebrowser/",ollama:"/app/ollama/",onlyoffice:"/app/onlyoffice/",immich:"/app/immich/",immich_server:"/app/immich/",tailscale:"/app/tailscale/",endurain:"/app/endurain/",dwn:"/app/dwn/"},ie={botfights:"https://botfights.net",nwnn:"https://nwnn.l484.com","484-kitchen":"https://484.kitchen","call-the-operator":"https://cta.tx1138.com","syntropy-institute":"https://syntropy.institute","t-zero":"https://teeminuszero.net",nostrudel:"https://nostrudel.ninja"},re={"bitcoin-knots":"Bitcoin","btcpay-server":"BTCPay Server",indeedhub:"Indeehub",botfights:"BotFights","484-kitchen":"484 Kitchen","arch-presentation":"Presentation",homeassistant:"Home Assistant","uptime-kuma":"Uptime Kuma","nginx-proxy-manager":"Nginx Proxy Manager","nostr-rs-relay":"Nostr Relay","call-the-operator":"Call The Operator","syntropy-institute":"Syntropy Institute","t-zero":"T-Zero",nostrudel:"noStrudel"},R=b(()=>re[u.value]||u.value.replace(/-/g," ").replace(/\b\w/g,t=>t.toUpperCase())),ue=new Set(["btcpay-server","grafana","photoprism","homeassistant","vaultwarden","nextcloud","uptime-kuma","penpot"]),ce=b(()=>ue.has(u.value)),m=b(()=>{const t=u.value,e=ie[t];if(e)return e;const o=le[t];if(o)return`${window.location.origin}${o}`;if(t==="indeedhub"){const l=U[t];if(l){let s=`${window.location.protocol}//${window.location.hostname}:${l}`;const B=$.query.path;return B&&(s+=B),s}}if(window.location.protocol==="https:"){const l=ae[t];if(l)return`${window.location.origin}${l}`}const a=U[t];if(!a)return"";let x=`http://${window.location.hostname}:${a}`;const k=$.query.path;return k&&(x+=k),x});function pe(t){return t==="indeedhub"||t==="nostrudel"}function L(){try{const t=localStorage.getItem(Z+u.value);return t?JSON.parse(t):null}catch{return null}}function de(t){try{localStorage.setItem(Z+u.value,JSON.stringify(t))}catch{}}function me(t){M.value=!1,de(t),O(t)}async function O(t){try{const e=`archipelago-identity:${Date.now()}`,o=await f.call({method:"identity.sign",params:{id:t.id,message:e}});I.value?.contentWindow?.postMessage({type:"archipelago:identity",did:t.did,name:t.name,pubkey:t.pubkey,nostr_pubkey:t.nostr_pubkey||null,nostr_npub:t.nostr_npub||null,challenge:e,signature:o.signature},"*")}catch{}}function fe(){if(r&&(clearTimeout(r),r=null),h.value=!1,E.value=!1,setTimeout(()=>{try{const t=I.value?.contentDocument;if(t){const e=t.body;(!e||e.children.length===0&&e.innerText.trim()==="")&&(w.value=!0)}}catch{}},1e3),pe(u.value)){const t=L();t?O(t):M.value=!0}}function ve(){r&&(clearTimeout(r),r=null),h.value=!1,E.value=!1,w.value=!0}function he(){E.value=!0,h.value=!0,w.value=!1,K.value++,Y()}function Y(){r&&clearTimeout(r),r=setTimeout(()=>{h.value&&(h.value=!1,w.value=!0)},12e3)}function we(){m.value&&window.open(m.value,"_blank","noopener,noreferrer"),T()}function ke(){m.value&&window.open(m.value,"_blank","noopener,noreferrer")}function be(){try{I.value?.contentWindow?.history.back()}catch{}}function ye(){try{I.value?.contentWindow?.history.forward()}catch{}}function ge(){T()}function T(){document.fullscreenElement&&document.exitFullscreen().catch(()=>{}),v.value?A("close"):_.push({name:"apps"})}function G(t){t.key==="Escape"&&(document.fullscreenElement?document.exitFullscreen().catch(()=>{}):T(),t.preventDefault())}function W(t){g.value&&N.value&&!N.value.contains(t.target)&&(g.value=!1)}function J(){!document.fullscreenElement&&i.value==="fullscreen"&&(i.value="overlay",localStorage.setItem(H,"overlay"))}Ie(i,t=>{t==="fullscreen"&&y.value&&!document.fullscreenElement&&y.value.requestFullscreen().catch(()=>{})});function X(t){if(t.data?.type==="nostr-request"&&xe(t),t.data?.type==="archipelago:identity:request"){const e=L();e?O(e):M.value=!0}}async function xe(t){const{id:e,method:o,params:a}=t.data,x=t.source;if(!x)return;const k=L(),l=k?.id||null;console.log(`[NIP-07] ${o} identityId=${l} storedPubkey=${k?.nostr_pubkey?.slice(0,12)||"none"}`);try{let s;if(o==="getPublicKey")k?.nostr_pubkey?(s=k.nostr_pubkey,console.log("[NIP-07] getPublicKey from stored identity:",s.slice(0,12))):l?s=(await f.call({method:"identity.get",params:{id:l}})).nostr_pubkey:s=(await f.call({method:"node.nostr-pubkey"})).nostr_pubkey;else if(o==="signEvent")console.log(`[NIP-07] signEvent kind=${a.event?.kind} using identity=${l||"node-default"}`),l?s=await f.call({method:"identity.nostr-sign",params:{id:l,event:a.event}}):s=await f.call({method:"node.nostr-sign",params:{event:a.event}}),console.log("[NIP-07] signEvent OK");else if(o==="getRelays")s={};else if(o==="nip04.encrypt")s=(await f.call({method:"identity.nostr-encrypt-nip04",params:{id:l||void 0,pubkey:a.pubkey,plaintext:a.plaintext}})).ciphertext;else if(o==="nip04.decrypt")s=(await f.call({method:"identity.nostr-decrypt-nip04",params:{id:l||void 0,pubkey:a.pubkey,ciphertext:a.ciphertext}})).plaintext;else if(o==="nip44.encrypt")s=(await f.call({method:"identity.nostr-encrypt-nip44",params:{id:l||void 0,pubkey:a.pubkey,plaintext:a.plaintext}})).ciphertext;else if(o==="nip44.decrypt")s=(await f.call({method:"identity.nostr-decrypt-nip44",params:{id:l||void 0,pubkey:a.pubkey,ciphertext:a.ciphertext}})).plaintext;else throw new Error(`Unsupported NIP-07 method: ${o}`);x.postMessage({type:"nostr-response",id:e,result:s},"*")}catch(s){console.error(`[NIP-07] ${o} FAILED:`,s instanceof Error?s.message:s),x.postMessage({type:"nostr-response",id:e,error:s instanceof Error?s.message:"Unknown error"},"*")}}return Ee(()=>{if(ce.value&&m.value){window.open(m.value,"_blank","noopener,noreferrer"),v.value?A("close"):_.back();return}window.addEventListener("keydown",G,!0),window.addEventListener("message",X),document.addEventListener("click",W),document.addEventListener("fullscreenchange",J),ne.has(u.value)?(h.value=!1,w.value=!0):Y(),i.value==="fullscreen"&&requestAnimationFrame(()=>{y.value?.requestFullscreen().catch(()=>{})})}),Me(()=>{r&&clearTimeout(r),window.removeEventListener("keydown",G,!0),window.removeEventListener("message",X),document.removeEventListener("click",W),document.removeEventListener("fullscreenchange",J),document.fullscreenElement&&document.exitFullscreen().catch(()=>{})}),(t,e)=>(c(),d("div",Ne,[(c(),Pe(Te,{to:"body",disabled:v.value},[n("div",{class:C(oe.value),onClick:Q(ge,["self"])},[n("div",{ref_key:"sessionRef",ref:y,class:C(se.value),onClick:e[4]||(e[4]=Q(()=>{},["stop"]))},[n("div",je,[n("div",{class:"flex items-center gap-0.5"},[n("button",{class:"app-session-btn","aria-label":"Back",title:"Go back",onClick:be},[...e[6]||(e[6]=[n("svg",{class:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[n("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M15 19l-7-7 7-7"})],-1)])]),n("button",{class:"app-session-btn","aria-label":"Forward",title:"Go forward",onClick:ye},[...e[7]||(e[7]=[n("svg",{class:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[n("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M9 5l7 7-7 7"})],-1)])])]),n("span",Re,z(R.value),1),n("button",{class:"app-session-btn","aria-label":"Refresh",disabled:E.value,onClick:he},[(c(),d("svg",{class:C(["w-5 h-5 transition-transform duration-300",{"animate-spin":E.value}]),fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[...e[8]||(e[8]=[n("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15"},null,-1)])],2))],8,Le),n("div",{class:"relative",ref_key:"modeMenuRef",ref:N},[n("button",{class:"app-session-btn","aria-label":"Display mode",title:"Display mode",onClick:e[0]||(e[0]=o=>g.value=!g.value)},[i.value==="panel"?(c(),d("svg",Oe,[...e[9]||(e[9]=[n("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M9 3v18m12-18H3a1 1 0 00-1 1v16a1 1 0 001 1h18a1 1 0 001-1V4a1 1 0 00-1-1z"},null,-1)])])):i.value==="overlay"?(c(),d("svg",ze,[...e[10]||(e[10]=[n("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M4 5a1 1 0 011-1h14a1 1 0 011 1v14a1 1 0 01-1 1H5a1 1 0 01-1-1V5z"},null,-1)])])):(c(),d("svg",Fe,[...e[11]||(e[11]=[n("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M4 8V4m0 0h4M4 4l5 5m11-1V4m0 0h-4m4 0l-5 5M4 16v4m0 0h4m-4 0l5-5m11 5v-4m0 4h-4m4 0l-5-5"},null,-1)])]))]),S(V,{name:"menu-fade"},{default:F(()=>[g.value?(c(),d("div",Ve,[n("button",{class:C(["mode-option",{"mode-option-active":i.value==="panel"}]),onClick:e[1]||(e[1]=o=>j("panel"))},[...e[12]||(e[12]=[n("svg",{class:"w-4 h-4 shrink-0",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[n("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M9 3v18m12-18H3a1 1 0 00-1 1v16a1 1 0 001 1h18a1 1 0 001-1V4a1 1 0 00-1-1z"})],-1),n("span",null,"Right panel",-1)])],2),n("button",{class:C(["mode-option",{"mode-option-active":i.value==="overlay"}]),onClick:e[2]||(e[2]=o=>j("overlay"))},[...e[13]||(e[13]=[n("svg",{class:"w-4 h-4 shrink-0",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[n("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M4 5a1 1 0 011-1h14a1 1 0 011 1v14a1 1 0 01-1 1H5a1 1 0 01-1-1V5z"})],-1),n("span",null,"Over whole app",-1)])],2),n("button",{class:C(["mode-option",{"mode-option-active":i.value==="fullscreen"}]),onClick:e[3]||(e[3]=o=>j("fullscreen"))},[...e[14]||(e[14]=[n("svg",{class:"w-4 h-4 shrink-0",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[n("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M4 8V4m0 0h4M4 4l5 5m11-1V4m0 0h-4m4 0l-5 5M4 16v4m0 0h4m-4 0l5-5m11 5v-4m0 4h-4m4 0l-5-5"})],-1),n("span",null,"Open fullscreen",-1)])],2)])):P("",!0)]),_:1})],512),n("button",{class:"app-session-btn","aria-label":"Open in new tab",title:"Open in new tab",onClick:ke},[...e[15]||(e[15]=[n("svg",{class:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[n("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14"})],-1)])]),n("button",{class:"app-session-btn","aria-label":"Close",onClick:T},[...e[16]||(e[16]=[n("svg",{class:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[n("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M6 18L18 6M6 6l12 12"})],-1)])]),e[17]||(e[17]=n("kbd",{class:"hidden sm:inline-flex px-2 py-1 text-xs text-white/50 bg-white/10 rounded"},"Esc",-1))]),n("div",De,[S(V,{name:"content-fade"},{default:F(()=>[h.value?(c(),d("div",He,[...e[18]||(e[18]=[n("svg",{class:"animate-spin h-8 w-8 text-blue-400",viewBox:"0 0 24 24",fill:"none"},[n("circle",{class:"opacity-25",cx:"12",cy:"12",r:"10",stroke:"currentColor","stroke-width":"4"}),n("path",{class:"opacity-75",fill:"currentColor",d:"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"})],-1)])])):P("",!0)]),_:1}),m.value&&!w.value?(c(),d("iframe",{ref_key:"iframeRef",ref:I,key:K.value,src:m.value,class:"absolute inset-0 w-full h-full border-0 iframe-scrollbar-hide",title:"App content",onLoad:fe,onError:ve},null,40,qe)):P("",!0),S(V,{name:"content-fade"},{default:F(()=>[w.value?(c(),d("div",Ke,[n("div",Ue,[e[22]||(e[22]=n("div",{class:"w-16 h-16 mx-auto mb-4 rounded-2xl bg-white/5 border border-white/10 flex items-center justify-center"},[n("svg",{class:"w-8 h-8 text-white/40",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[n("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"1.5",d:"M12 15v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2zm10-10V7a4 4 0 00-8 0v4h8z"})])],-1)),e[23]||(e[23]=n("h3",{class:"text-lg font-semibold text-white mb-2"},"This site blocks embedded viewing",-1)),n("p",Ye,[D(z(R.value)+" sets security headers that prevent iframe embedding.",1),e[19]||(e[19]=n("br",null,null,-1)),e[20]||(e[20]=D("Open it in a new browser tab instead.",-1))]),n("button",{onClick:we,class:"glass-button px-6 py-3 rounded-lg text-sm font-semibold inline-flex items-center gap-2"},[...e[21]||(e[21]=[n("svg",{class:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[n("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14"})],-1),D(" Open in new tab ",-1)])])])])):P("",!0)]),_:1}),m.value?P("",!0):(c(),d("div",Ge,[n("div",We,[e[24]||(e[24]=n("h3",{class:"text-lg font-semibold text-white mb-2"},"App not configured",-1)),n("p",Je,"No URL found for "+z(u.value),1)])]))])],2),S(_e,{show:M.value,"app-name":R.value,onSelect:me,onCancel:e[5]||(e[5]=o=>M.value=!1)},null,8,["show","app-name"])],2)],8,["disabled"]))]))}}),Ze=$e(Xe,[["__scopeId","data-v-6994c7f2"]]);export{Ze as default}; diff --git a/neode-ui/dist/assets/AppSession-DK48XcUX.css b/neode-ui/dist/assets/AppSession-DK48XcUX.css new file mode 100644 index 0000000..a28a10e --- /dev/null +++ b/neode-ui/dist/assets/AppSession-DK48XcUX.css @@ -0,0 +1 @@ +.app-session-root[data-v-6994c7f2]{width:100%;height:100%}.app-session-backdrop-inline[data-v-6994c7f2]{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;background:#0006;padding:0}.app-session-inline[data-v-6994c7f2]{display:flex;flex-direction:column;overflow:hidden;width:100%;height:100%;border-radius:0}@media(min-width:768px){.app-session-backdrop-inline[data-v-6994c7f2]{padding:1.5rem}.app-session-inline[data-v-6994c7f2]{border-radius:1rem;max-width:calc(100% - 1rem);max-height:calc(100vh - 6rem);box-shadow:0 25px 50px -12px #00000080}}.app-session-backdrop-overlay[data-v-6994c7f2]{position:fixed;inset:0;z-index:2400;display:flex;align-items:center;justify-content:center;padding:0;background:#0009;-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px)}@media(min-width:768px){.app-session-backdrop-overlay[data-v-6994c7f2]{padding:2.5rem}}.app-session-overlay[data-v-6994c7f2]{position:relative;z-index:10;display:flex;flex-direction:column;overflow:hidden;width:100%;height:100%;border-radius:0;box-shadow:0 25px 50px -12px #0009}@media(min-width:768px){.app-session-overlay[data-v-6994c7f2]{max-width:calc(100vw - 5rem);max-height:calc(100vh - 5rem);border-radius:1rem}}.app-session-fullscreen[data-v-6994c7f2]{display:flex;flex-direction:column;overflow:hidden;width:100%;height:100%;border-radius:0!important;max-width:none!important;max-height:none!important}.app-session-btn[data-v-6994c7f2]{display:flex;align-items:center;justify-content:center;width:36px;height:36px;border-radius:8px;color:#ffffffb3;transition:all .15s ease;flex-shrink:0}.app-session-btn[data-v-6994c7f2]:hover{background:#ffffff26;color:#fff}.app-session-btn[data-v-6994c7f2]:disabled{opacity:.5}.mode-option[data-v-6994c7f2]{display:flex;align-items:center;gap:8px;width:100%;padding:10px 14px;font-size:13px;color:#ffffffb3;transition:all .15s ease;text-align:left}.mode-option[data-v-6994c7f2]:hover{background:#ffffff14;color:#fff}.mode-option-active[data-v-6994c7f2]{color:#fb923c;background:#fb923c14}.menu-fade-enter-active[data-v-6994c7f2],.menu-fade-leave-active[data-v-6994c7f2]{transition:opacity .15s ease,transform .15s ease}.menu-fade-enter-from[data-v-6994c7f2],.menu-fade-leave-to[data-v-6994c7f2]{opacity:0;transform:translateY(-4px)}.content-fade-enter-active[data-v-6994c7f2],.content-fade-leave-active[data-v-6994c7f2]{transition:opacity .2s ease}.content-fade-enter-from[data-v-6994c7f2],.content-fade-leave-to[data-v-6994c7f2]{opacity:0} diff --git a/neode-ui/dist/assets/Apps-JbZuzA3H.js b/neode-ui/dist/assets/Apps-JbZuzA3H.js new file mode 100644 index 0000000..4fabaf6 --- /dev/null +++ b/neode-ui/dist/assets/Apps-JbZuzA3H.js @@ -0,0 +1,7 @@ +import{d as ie,y as le,z as re,a0 as ce,A as de,c as l,a as s,f as _,h as C,i as A,E as a,U as V,g as K,H as W,F as q,P as D,D as r,G as u,T as O,r as g,j as z,J as B,N as ue,I as pe,n as me,b as S,Q as he,x as ve,q as c,t as ge}from"./index-DnbYEqLr.js";import{P as w}from"./api-CHkUAu4g.js";const fe={class:"pb-6"},be={class:"hidden md:flex items-center gap-4 mb-4"},we={class:"mode-switcher flex-shrink-0"},xe=["placeholder","aria-label"],ye={class:"md:hidden mb-4"},ke={class:"mode-switcher mode-switcher-full mb-3"},_e=["placeholder","aria-label"],Ce={key:0,class:"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4 pb-6"},Ae={key:1,class:"text-center py-16 pb-6"},Se={class:"glass-card p-12 max-w-md mx-auto"},Me={class:"text-xl font-semibold text-white mb-2"},ze={class:"text-white/70 mb-6"},Te={key:2,class:"text-center py-12"},$e={class:"text-white/70"},Le={class:"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4 pb-6"},Ee=["data-controller-launch","onClick","onKeydown"],Ve=["onClick","aria-label","title"],Be={class:"flex items-start gap-4"},Pe=["src","alt"],Re={class:"flex-1 min-w-0 overflow-hidden"},He=["title"],Ie={class:"text-sm text-white/70 mb-2 truncate"},Ue={class:"flex items-center gap-2"},je={class:"text-xs text-white/50"},Ne={class:"mt-4 flex gap-2"},Fe=["onClick"],Ke=["onClick","disabled"],We={key:0,class:"animate-spin h-4 w-4","aria-hidden":"true",xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24"},qe=["onClick","disabled"],De={key:0,class:"animate-spin h-4 w-4","aria-hidden":"true",xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24"},Oe={class:"flex items-start gap-4 mb-4"},Qe={class:"flex-1"},Ye={id:"uninstall-dialog-title",class:"text-xl font-semibold text-white mb-2"},Ze={class:"text-white/70"},Ge={class:"flex gap-3 justify-end"},Je=["disabled"],Xe={key:0,class:"animate-spin h-4 w-4","aria-hidden":"true",fill:"none",viewBox:"0 0 24 24"},et={key:0,class:"fixed bottom-20 left-1/2 -translate-x-1/2 z-50 max-w-md w-full px-4",role:"alert","aria-live":"assertive"},tt={class:"bg-red-500/20 border border-red-500/40 backdrop-blur-sm rounded-lg px-4 py-3 text-red-200 text-sm flex items-center justify-between gap-3"},st=["aria-label"],nt=ie({__name:"Apps",setup(at){const{t:i}=le(),Q=ve(),x=re(),m=g("apps"),P=new Set(["archy-mempool-db","archy-btcpay-db","archy-nbxplorer","archy-tor","immich_postgres","immich_redis","penpot-postgres","penpot-valkey","penpot-backend","penpot-exporter","indeedhub-postgres","indeedhub-redis","indeedhub-minio","indeedhub-relay","indeedhub-build_api_1","indeedhub-build_ffmpeg-worker_1","mysql-mempool"]);function Y(t){if(P.has(t))return!0;const e=t.toLowerCase();return e.includes("_db")||e.includes("-db")&&!e.includes("indeedhub")?P.has(t):!1}const h=g(""),d=g({}),y=g("");let T;function $(t){y.value=t,T&&clearTimeout(T),T=setTimeout(()=>{y.value=""},5e3)}const Z={botfights:"https://botfights.net",nwnn:"https://nwnn.l484.com","484-kitchen":"https://484.kitchen","call-the-operator":"https://cta.tx1138.com","syntropy-institute":"https://syntropy.institute","t-zero":"https://teeminuszero.net"};function b(t){return t in Z}const G={botfights:{state:"running",manifest:{id:"botfights",title:"BotFights",version:"1.0.0",description:{short:"AI bot arena — build, train, and battle autonomous agents",long:""},"release-notes":"",license:"","wrapper-repo":"","upstream-repo":"","support-site":"","marketing-site":"","donation-url":null},"static-files":{license:"",instructions:"",icon:"/assets/img/app-icons/botfights.svg"}},nwnn:{state:"running",manifest:{id:"nwnn",title:"Next Web News Network",version:"1.0.0",description:{short:"Decentralized news aggregator, synced from Telegram",long:""},"release-notes":"",license:"","wrapper-repo":"","upstream-repo":"","support-site":"","marketing-site":"","donation-url":null},"static-files":{license:"",instructions:"",icon:"/assets/img/app-icons/nwnn.png"}},"484-kitchen":{state:"running",manifest:{id:"484-kitchen",title:"484 Kitchen",version:"1.0.0",description:{short:"K484 application platform",long:""},"release-notes":"",license:"","wrapper-repo":"","upstream-repo":"","support-site":"","marketing-site":"","donation-url":null},"static-files":{license:"",instructions:"",icon:"/assets/img/app-icons/484-kitchen.png"}},"call-the-operator":{state:"running",manifest:{id:"call-the-operator",title:"Call the Operator",version:"1.0.0",description:{short:"Escape the Matrix — explore decentralized alternatives",long:""},"release-notes":"",license:"","wrapper-repo":"","upstream-repo":"","support-site":"","marketing-site":"","donation-url":null},"static-files":{license:"",instructions:"",icon:"/assets/img/app-icons/call-the-operator.png"}},"syntropy-institute":{state:"running",manifest:{id:"syntropy-institute",title:"Syntropy Institute",version:"1.0.0",description:{short:"Medicine Reimagined — frequency analysis-therapy",long:""},"release-notes":"",license:"","wrapper-repo":"","upstream-repo":"","support-site":"","marketing-site":"","donation-url":null},"static-files":{license:"",instructions:"",icon:"/assets/img/app-icons/syntropy-institute.png"}},"t-zero":{state:"running",manifest:{id:"t-zero",title:"T-0",version:"1.0.0",description:{short:"Documentary series on decentralization and Bitcoin",long:""},"release-notes":"",license:"","wrapper-repo":"","upstream-repo":"","support-site":"","marketing-site":"","donation-url":null},"static-files":{license:"",instructions:"",icon:"/assets/img/app-icons/t-zero.png"}}},J=z(()=>{const t=x.packages||{};return{...G,...t}}),M=z(()=>Object.entries(J.value).filter(([n])=>{const o=Y(n);return m.value==="services"?o:!o}).sort(([n,o],[E,f])=>{const N=b(n)?0:1,F=b(E)?0:1;return N!==F?N-F:(o.manifest?.title??"").localeCompare(f.manifest?.title??"",void 0,{sensitivity:"base"})})),R=z(()=>{if(!h.value)return M.value;const t=h.value.toLowerCase();return M.value.filter(([e,n])=>(n.manifest?.title??"").toLowerCase().includes(t)||(n.manifest?.description?.short??"").toLowerCase().includes(t)||e.toLowerCase().includes(t))}),v=g({show:!1,appId:"",appTitle:""}),H=g(null),I=g(null);function L(){I.value?.focus?.(),v.value.show=!1}ce(H,z(()=>v.value.show),L,{restoreFocusRef:I});function U(t){if(b(t.manifest.id))return!0;const e=t.manifest.interfaces?.main?.ui||t.installed?.["interface-addresses"]?.main,n=t.state==="running"||t.state==="starting";return!!e&&n}function X(t){he().openSession(t)}function ee(t){switch(t){case w.Running:return"bg-green-500/20 text-green-200";case w.Stopped:return"bg-gray-500/20 text-gray-200";case w.Starting:case w.Stopping:case w.Restarting:return"bg-yellow-500/20 text-yellow-200";case w.Installing:return"bg-blue-500/20 text-blue-200";default:return"bg-gray-500/20 text-gray-200"}}function j(t){Q.push(`/dashboard/apps/${t}`).catch(()=>{})}const p=new Map;async function te(t){d.value[t]=!0;try{await x.startPackage(t),p.has(t)&&clearTimeout(p.get(t)),p.set(t,setTimeout(()=>{d.value[t]=!1,p.delete(t)},5e3))}catch(e){$(`Failed to start app: ${e instanceof Error?e.message:"Unknown error"}`),d.value[t]=!1}}async function se(t){d.value[t]=!0;try{await x.stopPackage(t),p.has(t)&&clearTimeout(p.get(t)),p.set(t,setTimeout(()=>{d.value[t]=!1,p.delete(t)},5e3))}catch(e){$(`Failed to stop app: ${e instanceof Error?e.message:"Unknown error"}`),d.value[t]=!1}}de(()=>{for(const t of p.values())clearTimeout(t);p.clear()});function ne(t,e){v.value={show:!0,appId:t,appTitle:e.manifest.title}}const k=g(!1);async function ae(){const{appId:t}=v.value;k.value=!0;try{await x.uninstallPackage(t),v.value.show=!1}catch(e){$(`Failed to uninstall app: ${e instanceof Error?e.message:"Unknown error"}`),v.value.show=!1}finally{k.value=!1}}function oe(t){const e=t.target,n=e.src,o=`data:image/svg+xml,${encodeURIComponent(` + + + + + + `)}`;n.includes("data:image")||(e.src=o)}return(t,e)=>(c(),l("div",fe,[s("div",be,[s("div",we,[s("button",{class:_(["mode-switcher-btn",{"mode-switcher-btn-active":m.value==="apps"}]),onClick:e[0]||(e[0]=n=>m.value="apps")},"My Apps",2),C(a(V),{to:"/dashboard/marketplace",class:"mode-switcher-btn"},{default:A(()=>[...e[10]||(e[10]=[B("App Store",-1)])]),_:1}),s("button",{class:_(["mode-switcher-btn",{"mode-switcher-btn-active":m.value==="services"}]),onClick:e[1]||(e[1]=n=>m.value="services")},"Services",2)]),K(s("input",{"onUpdate:modelValue":e[2]||(e[2]=n=>h.value=n),type:"text",placeholder:a(i)("apps.searchPlaceholder"),"aria-label":a(i)("apps.searchLabel"),class:"flex-1 px-4 py-2 bg-white/10 border border-white/20 rounded-lg text-white placeholder-white/50 focus:outline-none focus:border-white/40 transition-colors"},null,8,xe),[[W,h.value]])]),s("div",ye,[s("div",ke,[s("button",{class:_(["mode-switcher-btn",{"mode-switcher-btn-active":m.value==="apps"}]),onClick:e[3]||(e[3]=n=>m.value="apps")},"My Apps",2),C(a(V),{to:"/dashboard/marketplace",class:"mode-switcher-btn"},{default:A(()=>[...e[11]||(e[11]=[B("App Store",-1)])]),_:1}),s("button",{class:_(["mode-switcher-btn",{"mode-switcher-btn-active":m.value==="services"}]),onClick:e[4]||(e[4]=n=>m.value="services")},"Services",2)]),K(s("input",{"onUpdate:modelValue":e[5]||(e[5]=n=>h.value=n),type:"text",placeholder:a(i)("apps.searchPlaceholder"),"aria-label":a(i)("apps.searchLabel"),class:"w-full px-4 py-3 bg-white/10 border border-white/20 rounded-lg text-white placeholder-white/50 focus:outline-none focus:border-white/40 transition-colors"},null,8,_e),[[W,h.value]])]),!a(x).isConnected&&M.value.length===0?(c(),l("div",Ce,[(c(),l(q,null,D(3,n=>s("div",{key:n,class:"glass-card p-6 animate-pulse"},[...e[12]||(e[12]=[ue('
',2)])])),64))])):M.value.length===0&&!h.value?(c(),l("div",Ae,[s("div",Se,[e[13]||(e[13]=s("svg",{class:"w-16 h-16 mx-auto text-white/40 mb-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[s("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M20 13V6a2 2 0 00-2-2H6a2 2 0 00-2 2v7m16 0v5a2 2 0 01-2 2H6a2 2 0 01-2-2v-5m16 0h-2.586a1 1 0 00-.707.293l-2.414 2.414a1 1 0 01-.707.293h-3.172a1 1 0 01-.707-.293l-2.414-2.414A1 1 0 006.586 13H4"})],-1)),s("h3",Me,r(a(i)("apps.noAppsTitle")),1),s("p",ze,r(a(i)("apps.noAppsMessage")),1),C(a(V),{to:"/dashboard/marketplace",class:"inline-block glass-button px-6 py-3 rounded-lg font-medium transition-all hover:bg-black/70 hover:border-white/30"},{default:A(()=>[B(r(a(i)("apps.browseAppStore")),1)]),_:1})])])):u("",!0),R.value.length===0&&h.value?(c(),l("div",Te,[s("p",$e,r(a(i)("apps.noResults",{query:h.value})),1)])):u("",!0),s("div",Le,[(c(!0),l(q,null,D(R.value,([n,o],E)=>(c(),l("div",{key:n,"data-controller-container":"","data-controller-launch":U(o)?"":void 0,tabindex:"0",role:"link",class:"glass-card card-stagger p-6 transition-all hover:-translate-y-1 cursor-pointer relative min-w-0 overflow-hidden",style:me({"--stagger-index":E}),onClick:f=>j(n),onKeydown:pe(f=>j(n),["enter"])},[b(n)?u("",!0):(c(),l("button",{key:0,onClick:S(f=>ne(n,o),["stop"]),class:"absolute top-4 right-4 p-2 rounded-lg text-white/60 hover:text-red-400 hover:bg-red-500/20 transition-colors z-10","aria-label":`${a(i)("common.uninstall")} ${o.manifest?.title||n}`,title:a(i)("common.uninstall")},[...e[14]||(e[14]=[s("svg",{class:"w-5 h-5","aria-hidden":"true",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[s("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16"})],-1)])],8,Ve)),s("div",Be,[s("img",{src:o["static-files"]?.icon||`/assets/img/app-icons/${n}.png`,alt:o.manifest?.title||String(n),class:"w-16 h-16 rounded-lg object-cover bg-white/10",onError:oe},null,40,Pe),s("div",Re,[s("h3",{class:"text-lg font-semibold text-white mb-1 truncate",title:o.manifest.title},r(o.manifest.title),9,He),s("p",Ie,r(o.manifest?.description?.short||""),1),s("div",Ue,[s("span",{class:_(["inline-flex items-center px-2 py-1 rounded text-xs font-medium",ee(o.state)])},r(o.state),3),s("span",je," v"+r(o.manifest.version),1)])])]),s("div",Ne,[U(o)?(c(),l("button",{key:0,"data-controller-launch-btn":"",onClick:S(f=>X(n),["stop"]),class:"flex-1 px-4 py-2 glass-button glass-button-sm rounded-lg text-sm font-medium"},r(a(i)("common.launch")),9,Fe)):u("",!0),!b(n)&&(o.state==="stopped"||o.state==="exited")?(c(),l("button",{key:1,onClick:S(f=>te(n),["stop"]),disabled:d.value[n],class:"flex-1 px-4 py-2 bg-green-500/20 border border-green-500/40 rounded-lg text-green-200 text-sm font-medium hover:bg-green-500/30 transition-colors disabled:opacity-50 disabled:cursor-not-allowed flex items-center justify-center gap-2"},[d.value[n]?(c(),l("svg",We,[...e[15]||(e[15]=[s("circle",{class:"opacity-25",cx:"12",cy:"12",r:"10",stroke:"currentColor","stroke-width":"4"},null,-1),s("path",{class:"opacity-75",fill:"currentColor",d:"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"},null,-1)])])):u("",!0),s("span",null,r(d.value[n]?a(i)("common.starting"):a(i)("common.start")),1)],8,Ke)):u("",!0),!b(n)&&(o.state==="running"||o.state==="starting")?(c(),l("button",{key:2,onClick:S(f=>se(n),["stop"]),disabled:d.value[n],class:"flex-1 px-4 py-2 bg-yellow-500/20 border border-yellow-500/40 rounded-lg text-yellow-200 text-sm font-medium hover:bg-yellow-500/30 transition-colors disabled:opacity-50 disabled:cursor-not-allowed flex items-center justify-center gap-2"},[d.value[n]?(c(),l("svg",De,[...e[16]||(e[16]=[s("circle",{class:"opacity-25",cx:"12",cy:"12",r:"10",stroke:"currentColor","stroke-width":"4"},null,-1),s("path",{class:"opacity-75",fill:"currentColor",d:"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"},null,-1)])])):u("",!0),s("span",null,r(d.value[n]?a(i)("common.stopping"):a(i)("common.stop")),1)],8,qe)):u("",!0)])],44,Ee))),128))]),C(O,{name:"modal"},{default:A(()=>[v.value.show?(c(),l("div",{key:0,class:"fixed inset-0 z-50 flex items-center justify-center p-4",onClick:e[8]||(e[8]=n=>L())},[e[19]||(e[19]=s("div",{class:"absolute inset-0 bg-black/60 backdrop-blur-md"},null,-1)),s("div",{ref_key:"uninstallModalRef",ref:H,onClick:e[7]||(e[7]=S(()=>{},["stop"])),role:"dialog","aria-modal":"true","aria-labelledby":"uninstall-dialog-title",class:"glass-card p-6 max-w-2xl w-full relative z-10"},[s("div",Oe,[e[17]||(e[17]=s("div",{class:"p-3 bg-red-500/20 rounded-lg"},[s("svg",{class:"w-6 h-6 text-red-400","aria-hidden":"true",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[s("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z"})])],-1)),s("div",Qe,[s("h3",Ye,r(a(i)("apps.uninstallTitle")),1),s("p",Ze,r(a(i)("apps.uninstallConfirm",{name:v.value.appTitle})),1)])]),s("div",Ge,[s("button",{onClick:e[6]||(e[6]=n=>L()),class:"px-4 py-2 glass-button rounded-lg text-sm font-medium"},r(a(i)("common.cancel")),1),s("button",{onClick:ae,disabled:k.value,class:"px-4 py-2 bg-red-600/80 hover:bg-red-600 rounded-lg text-white text-sm font-medium transition-colors disabled:opacity-50 disabled:cursor-not-allowed flex items-center justify-center gap-2"},[k.value?(c(),l("svg",Xe,[...e[18]||(e[18]=[s("circle",{class:"opacity-25",cx:"12",cy:"12",r:"10",stroke:"currentColor","stroke-width":"4"},null,-1),s("path",{class:"opacity-75",fill:"currentColor",d:"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"},null,-1)])])):u("",!0),s("span",null,r(k.value?a(i)("common.uninstalling"):a(i)("common.uninstall")),1)],8,Je)])],512)])):u("",!0)]),_:1}),C(O,{name:"fade"},{default:A(()=>[y.value?(c(),l("div",et,[s("div",tt,[s("span",null,r(y.value),1),s("button",{onClick:e[9]||(e[9]=n=>y.value=""),"aria-label":a(i)("apps.dismissError"),class:"text-red-300 hover:text-white shrink-0"},"×",8,st)])])):u("",!0)]),_:1})]))}}),lt=ge(nt,[["__scopeId","data-v-5129aeb7"]]);export{lt as default}; diff --git a/neode-ui/dist/assets/Apps-NkvfRZrs.css b/neode-ui/dist/assets/Apps-NkvfRZrs.css new file mode 100644 index 0000000..a4b4f5c --- /dev/null +++ b/neode-ui/dist/assets/Apps-NkvfRZrs.css @@ -0,0 +1 @@ +.modal-enter-active[data-v-5129aeb7],.modal-leave-active[data-v-5129aeb7]{transition:opacity .3s ease}.modal-enter-active .glass-card[data-v-5129aeb7],.modal-leave-active .glass-card[data-v-5129aeb7]{transition:transform .3s ease,opacity .3s ease}.modal-enter-from[data-v-5129aeb7],.modal-leave-to[data-v-5129aeb7]{opacity:0}.modal-enter-from .glass-card[data-v-5129aeb7],.modal-leave-to .glass-card[data-v-5129aeb7]{transform:scale(.95);opacity:0} diff --git a/neode-ui/dist/assets/Chat-BLEXivD6.js b/neode-ui/dist/assets/Chat-BLEXivD6.js new file mode 100644 index 0000000..f301a52 --- /dev/null +++ b/neode-ui/dist/assets/Chat-BLEXivD6.js @@ -0,0 +1 @@ +import{B as p,$ as W,r as A,j as w,z as x,d as j,y as V,o as K,A as G,c as L,a as d,E as b,D as E,h as Z,i as J,T as Q,G as M,x as X,q as z,t as Y}from"./index-DnbYEqLr.js";import{u as D}from"./aiPermissions-sblnS_DK.js";import{f as k}from"./filebrowser-client-DRXM9PC4.js";const v={async installApp(c){return p.call({method:"container-install",params:{manifest_path:c}})},async startContainer(c){return p.call({method:"container-start",params:{app_id:c}})},async stopContainer(c){return p.call({method:"container-stop",params:{app_id:c}})},async removeContainer(c){return p.call({method:"container-remove",params:{app_id:c}})},async getContainerStatus(c){return p.call({method:"container-status",params:{app_id:c}})},async getContainerLogs(c,e=100){return p.call({method:"container-logs",params:{app_id:c,lines:e}})},async listContainers(){return p.call({method:"container-list",params:{}})},async getHealthStatus(){return p.call({method:"container-health",params:{}})},async startBundledApp(c){return p.call({method:"bundled-app-start",params:{app_id:c.id,image:c.image,ports:c.ports,volumes:c.volumes}})},async stopBundledApp(c){return p.call({method:"bundled-app-stop",params:{app_id:c}})}},ee={"bitcoin-knots":["bitcoin-knots","bitcoin-ui"],lnd:["lnd","archy-lnd-ui"],"btcpay-server":["btcpay-server"],mempool:["archy-mempool-web"],electrumx:["archy-electrs-ui","electrumx","mempool-electrs"]},F=[{id:"bitcoin-knots",name:"Bitcoin Knots",image:"localhost/bitcoinknots/bitcoin:29",description:"Full Bitcoin node with additional features",icon:"₿",ports:[{host:8334,container:80}],volumes:[{host:"/var/lib/archipelago/bitcoin",container:"/data"}],category:"bitcoin"},{id:"lnd",name:"Lightning (LND)",image:"docker.io/lightninglabs/lnd:v0.18.4-beta",description:"Lightning Network Daemon for fast Bitcoin payments",icon:"⚡",ports:[{host:8081,container:80}],volumes:[{host:"/var/lib/archipelago/lnd",container:"/root/.lnd"}],category:"lightning"},{id:"homeassistant",name:"Home Assistant",image:"ghcr.io/home-assistant/home-assistant:stable",description:"Open source home automation platform",icon:"🏠",ports:[{host:8123,container:8123}],volumes:[{host:"/var/lib/archipelago/homeassistant",container:"/config"}],category:"home"},{id:"btcpay-server",name:"BTCPay Server",image:"docker.io/btcpayserver/btcpayserver:latest",description:"Self-hosted Bitcoin payment processor",icon:"💳",ports:[{host:23e3,container:49392}],volumes:[{host:"/var/lib/archipelago/btcpay",container:"/datadir"}],category:"bitcoin"},{id:"mempool",name:"Mempool Explorer",image:"docker.io/mempool/frontend:latest",description:"Bitcoin blockchain and mempool visualizer",icon:"🔍",ports:[{host:4080,container:8080}],volumes:[{host:"/var/lib/archipelago/mempool",container:"/data"}],category:"bitcoin"},{id:"tailscale",name:"Tailscale VPN",image:"docker.io/tailscale/tailscale:latest",description:"Zero-config VPN mesh network",icon:"🔒",ports:[],volumes:[{host:"/var/lib/archipelago/tailscale",container:"/var/lib/tailscale"}],category:"other"}],S=W("container",()=>{const c=A([]),e=A({}),a=A(!1),t=A(new Set),s=A(null),n=w(()=>c.value.filter(o=>o.state==="running")),i=w(()=>c.value.filter(o=>o.state==="stopped"||o.state==="exited")),l=w(()=>o=>c.value.find(r=>r.name.includes(o))),f=w(()=>o=>e.value[o]||"unknown"),u=w(()=>o=>{const r=ee[o];if(r)for(const y of r){const B=c.value.find(H=>H.name===y);if(B)return B}return c.value.find(y=>y.name===o)}),h=w(()=>o=>t.value.has(o)),m=w(()=>o=>{const r=u.value(o);return r?r.state:"not-installed"}),_=w(()=>F.map(o=>{const r=u.value(o.id);return{...o,lan_address:r?.lan_address}}));async function g(){a.value=!0,s.value=null;try{c.value=await v.listContainers()}catch(o){s.value=o instanceof Error?o.message:"Failed to fetch containers"}finally{a.value=!1}}async function C(){try{e.value=await v.getHealthStatus()}catch{}}async function I(o){a.value=!0,s.value=null;try{const r=await v.installApp(o);return await g(),r}catch(r){throw s.value=r instanceof Error?r.message:"Failed to install app",r}finally{a.value=!1}}async function N(o){t.value.add(o),s.value=null;try{await v.startContainer(o),await g(),await C()}catch(r){throw s.value=r instanceof Error?r.message:"Failed to start container",r}finally{t.value.delete(o)}}async function R(o){t.value.add(o),s.value=null;try{await v.stopContainer(o),await g()}catch(r){throw s.value=r instanceof Error?r.message:"Failed to stop container",r}finally{t.value.delete(o)}}async function P(o){t.value.add(o.id),s.value=null;try{await v.startBundledApp(o),await g(),await C()}catch(r){throw s.value=r instanceof Error?r.message:"Failed to start app",r}finally{t.value.delete(o.id)}}async function U(o){t.value.add(o),s.value=null;try{await v.stopBundledApp(o),await g()}catch(r){throw s.value=r instanceof Error?r.message:"Failed to stop app",r}finally{t.value.delete(o)}}async function q(o){a.value=!0,s.value=null;try{await v.removeContainer(o),await g()}catch(r){throw s.value=r instanceof Error?r.message:"Failed to remove container",r}finally{a.value=!1}}async function O(o,r=100){try{return await v.getContainerLogs(o,r)}catch(y){throw s.value=y instanceof Error?y.message:"Failed to get logs",y}}async function $(o){try{return await v.getContainerStatus(o)}catch(r){throw s.value=r instanceof Error?r.message:"Failed to get status",r}}return{containers:c,healthStatus:e,loading:a,loadingApps:t,error:s,runningContainers:n,stoppedContainers:i,getContainerById:l,getHealthStatus:f,getContainerForApp:u,isAppLoading:h,getAppState:m,enrichedBundledApps:_,fetchContainers:g,fetchHealthStatus:C,installApp:I,startContainer:N,stopContainer:R,removeContainer:q,getContainerLogs:O,getContainerStatus:$,startBundledApp:P,stopBundledApp:U}});class T{iframe;allowedOrigin;listener=null;constructor(e,a){this.iframe=e;try{const t=new URL(a,window.location.origin);this.allowedOrigin=t.origin}catch{this.allowedOrigin=window.location.origin}}start(){this.listener=e=>this.handleMessage(e),window.addEventListener("message",this.listener)}stop(){this.listener&&(window.removeEventListener("message",this.listener),this.listener=null)}sendPermissionsUpdate(){const e=D();this.postToIframe({type:"permissions:update",categories:e.enabledCategories})}sendTheme(){this.postToIframe({type:"theme:response",theme:{accent:"#fb923c",mode:"dark"}})}handleMessage(e){if(e.origin!==this.allowedOrigin)return;const a=e.data;if(!(!a||typeof a.type!="string"))switch(a.type){case"ready":this.sendPermissionsUpdate(),this.sendTheme();break;case"context:request":this.handleContextRequest(a.id,a.category,a.query);break;case"action:request":this.handleActionRequest(a.id,a.action,a.params);break;case"theme:request":this.sendTheme();break}}async handleContextRequest(e,a,t){if(!D().isEnabled(a)){this.postToIframe({type:"context:response",id:e,data:null,permitted:!1});return}const n=await this.fetchAndSanitize(a,t);this.postToIframe({type:"context:response",id:e,data:n,permitted:!0})}handleActionRequest(e,a,t){const s=x();let n=!1,i;try{switch(a){case"navigate":t.path?(window.dispatchEvent(new CustomEvent("aiui:navigate",{detail:t.path})),n=!0):i="Missing path parameter";break;case"open-app":case"launch-app":t.appId?this.getAppUrl(t.appId)?(window.dispatchEvent(new CustomEvent("aiui:open-app",{detail:t.appId})),n=!0):i=`App "${t.appId}" not found or not running`:i="Missing appId parameter";break;case"install-app":if(t.appId&&t.marketplaceUrl&&t.version){const f=(s.packages||{})[t.appId];if(f&&f.state==="installed"){this.postToIframe({type:"action:response",id:e,success:!1,error:`${t.appId} is already installed`});return}const u=t.appId,h=t.marketplaceUrl,m=t.version;window.dispatchEvent(new CustomEvent("aiui:install-request",{detail:{requestId:e,appId:u,marketplaceUrl:h,version:m}}));{const _=this,g=C=>{const I=C.detail;I.requestId===e&&(window.removeEventListener("aiui:install-response",g),I.confirmed?s.installPackage(u,h,m).then(()=>{_.postToIframe({type:"action:response",id:e,success:!0})}).catch(N=>{_.postToIframe({type:"action:response",id:e,success:!1,error:N.message})}):_.postToIframe({type:"action:response",id:e,success:!1,error:"User declined the installation"}))};window.addEventListener("aiui:install-response",g),setTimeout(()=>{window.removeEventListener("aiui:install-response",g)},6e4)}return}i="Missing required parameters (appId, marketplaceUrl, version)";break;case"search-web":if(t.query){this.handleSearchAction(e,t.query);return}i="Missing query parameter";break;case"read-file":this.handleReadFileAction(e,t.path);return;case"tail-logs":this.handleTailLogsAction(e,t.appId,t.lines);return;default:i=`Unknown action: ${a}`}}catch(l){i=l instanceof Error?l.message:"Unknown error"}this.postToIframe({type:"action:response",id:e,success:n,error:i})}async handleSearchAction(e,a){const n=(x().packages||{}).searxng;if(!n||n.state!=="installed"||n.installed?.status!=="running"){this.postToIframe({type:"action:response",id:e,success:!1,error:"SearXNG is not installed or not running"});return}try{const l=await(await fetch(`/apps/searxng/search?q=${encodeURIComponent(a)}&format=json`)).json();this.postToIframe({type:"action:response",id:e,success:!0,data:l})}catch(i){this.postToIframe({type:"action:response",id:e,success:!1,error:i instanceof Error?i.message:"Search failed"})}}getAppUrl(e){const s=(x().packages||{})[e];if(s?.installed?.status==="running"){const u=s.installed["interface-addresses"];if(u){const h=u.main||Object.values(u)[0];if(h?.["lan-address"])return h["lan-address"]}}const l=S().containers.find(u=>u.name===e||u.name===`archy-${e}`);return l?.lan_address?l.lan_address:F.find(u=>u.id===e)?.ports?.[0]?`/apps/${e}/`:null}async fetchAndSanitize(e,a){const t=x();switch(e){case"apps":return this.sanitizeApps(t);case"system":return await this.sanitizeSystem(t);case"network":return this.sanitizeNetwork(t);case"wallet":return this.sanitizeWallet(t);case"files":return this.sanitizeFiles();case"bitcoin":return this.sanitizeBitcoin(t);case"media":return this.sanitizeMedia(t);case"search":return this.sanitizeSearch(t);case"ai-local":return this.sanitizeAILocal(t);case"notes":return this.sanitizeNotes();default:return null}}sanitizeApps(e){const a=e.packages||{},t=S(),s=Object.entries(a).map(([i,l])=>{const f=!!l.manifest?.interfaces?.main?.ui,u=f?`/apps/${i}/`:null;return{id:i,name:l.manifest?.title||i,version:l.manifest?.version||"unknown",state:l.state||"unknown",status:l.installed?.status||"unknown",hasWebUI:f,url:u}}),n=t.containers.map(i=>({id:i.name,name:F.find(l=>l.id===i.name)?.name||i.name,state:i.state==="running"?"installed":"stopped",status:i.state,hasWebUI:!!F.find(l=>l.id===i.name)?.ports?.length,url:i.lan_address||null}));return[...s,...n]}async sanitizeSystem(e){const a=e.serverInfo,t={version:a?.version||"unknown",name:a?.name||"Archipelago"};try{const[s,n]=await Promise.all([p.call({method:"server.metrics"}),p.call({method:"server.time"})]);return{...t,cpu:s.cpu,memory:{used:s.memory.used,total:s.memory.total},disk:{used:s.disk.used,total:s.disk.total},uptime:n.uptime}}catch{return{...t,status:"metrics unavailable"}}}sanitizeNetwork(e){const a=e.serverInfo,s=S().containers.find(i=>i.name==="tailscale"),n=!!a?.["tor-address"];return{connected:e.isConnected,torConnected:n,tailscaleActive:s?.state==="running"}}async sanitizeBitcoin(e){const a=e.packages||{},t=S(),s=a.bitcoind||a["bitcoin-core"]||a.bitcoin,n=t.containers.find(l=>l.name==="bitcoin-knots"||l.name==="archy-bitcoin-knots");if(!(s?.installed?.status==="running"||n?.state==="running"))return{available:!1,message:"Bitcoin Core not running"};try{return{available:!0,status:"running",...await p.call({method:"bitcoin.getinfo"})}}catch{return{available:!0,status:"running",network:"mainnet"}}}sanitizeMedia(e){const a=e.packages||{},t=["plex","jellyfin","navidrome","nextcloud"],s=[];for(const n of t){const i=a[n];i&&(i.state==="installed"||i.state==="running"||i.state==="stopped")&&s.push({source:n,name:i.manifest?.title||n,status:i.state})}return s.length===0?{available:!1,libraries:[],message:"No media apps installed. Install Plex or Jellyfin from the App Store."}:{available:!0,libraries:s}}async sanitizeFiles(){try{if(!k.isAuthenticated&&!await k.login())return{available:!1,message:"File browser authentication failed"};const e=await k.getUsage(),a=await k.listDirectory("/"),t=a.filter(n=>n.isDir).map(n=>({name:n.name,path:n.path})),s=a.filter(n=>!n.isDir).sort((n,i)=>new Date(i.modified).getTime()-new Date(n.modified).getTime()).slice(0,10).map(n=>({name:n.name,path:n.path,size:n.size,modified:n.modified}));return{available:!0,totalSize:e.totalSize,folderCount:e.folderCount,fileCount:e.fileCount,folders:t,recentFiles:s}}catch{return{available:!1,message:"File browser not reachable"}}}sanitizeSearch(e){const t=(e.packages||{}).searxng;return!t||t.state!=="installed"||t.installed?.status!=="running"?{available:!1}:{available:!0,engine:"searxng",endpoint:"/apps/searxng/"}}sanitizeAILocal(e){const t=(e.packages||{}).ollama;return!t||t.state!=="installed"||t.installed?.status!=="running"?{available:!1}:{available:!0,models:[],message:"Ollama is running. Query /api/tags for model list."}}async sanitizeWallet(e){const a=e.packages||{},t=S(),s=a.lnd,n=t.containers.find(l=>l.name==="lnd"||l.name==="archy-lnd");if(!(s?.installed?.status==="running"||n?.state==="running"))return{available:!1,message:"Lightning (LND) not running"};try{return{available:!0,status:"running",...await p.call({method:"lnd.getinfo"})}}catch{return{available:!0,status:"running",message:"LND is running but detailed info unavailable"}}}sanitizeNotes(){return{available:!1,documents:[],message:"No note-taking apps installed"}}static ALLOWED_FILE_DIRS=["/var/lib/archipelago/","/var/log/","/opt/archipelago/","/home/archipelago/"];static SENSITIVE_PATH_PATTERNS=["id_rsa","id_ed25519","private","secret","password","seed",".env","wallet","macaroon","tls.key","tls.cert","credentials","keystore","mnemonic"];isPathAllowed(e){const a=e.replace(/\/+/g,"/").replace(/\.\.\//g,"");if(!T.ALLOWED_FILE_DIRS.some(n=>a.startsWith(n)))return!1;const s=a.toLowerCase();return!T.SENSITIVE_PATH_PATTERNS.some(n=>s.includes(n))}async handleReadFileAction(e,a){if(!D().isEnabled("files")){this.postToIframe({type:"action:response",id:e,success:!1,error:"File access not permitted"});return}if(!a){this.postToIframe({type:"action:response",id:e,success:!1,error:"Missing path parameter"});return}if(!this.isPathAllowed(a)){this.postToIframe({type:"action:response",id:e,success:!1,error:"Access denied: path is outside allowed directories or contains sensitive patterns"});return}try{if(!k.isAuthenticated&&!await k.login())throw new Error("FileBrowser authentication failed");const s=await k.readFileAsText(a);this.postToIframe({type:"action:response",id:e,success:!0,data:{content:s.content,truncated:s.truncated,size:s.size,path:a}})}catch(s){this.postToIframe({type:"action:response",id:e,success:!1,error:s instanceof Error?s.message:"Failed to read file"})}}async handleTailLogsAction(e,a,t){if(!D().isEnabled("apps")){this.postToIframe({type:"action:response",id:e,success:!1,error:"App access not permitted"});return}if(!a){this.postToIframe({type:"action:response",id:e,success:!1,error:"Missing appId parameter"});return}const n=Math.min(parseInt(t||"50",10)||50,200);try{const l=(await p.call({method:"container-logs",params:{app_id:a,lines:n}})).map(f=>T.redactLogLine(f));this.postToIframe({type:"action:response",id:e,success:!0,data:{appId:a,lines:l,count:l.length}})}catch(i){this.postToIframe({type:"action:response",id:e,success:!1,error:i instanceof Error?i.message:"Failed to fetch logs"})}}static redactLogLine(e){let a=e.replace(/(?:rpcpassword|rpcauth|password|passwd|secret|token|apikey|api_key|macaroon)[\s]*[=:]\s*\S+/gi,"$&".replace(/[=:]\s*\S+/,"=[REDACTED]"));return a=a.replace(/((?:password|secret|token|apikey|api_key|macaroon|rpcpassword|rpcauth)\s*[=:]\s*)\S+/gi,"$1[REDACTED]"),a=a.replace(/\b[0-9a-fA-F]{64,}\b/g,"[REDACTED_KEY]"),a=a.replace(/\b[A-Za-z0-9+/]{64,}={0,2}\b/g,"[REDACTED_TOKEN]"),a}postToIframe(e){this.iframe.value?.contentWindow&&this.iframe.value.contentWindow.postMessage(e,this.allowedOrigin)}}const te={class:"chat-fullscreen"},ae={class:"chat-mode-pill flex"},se=["aria-label"],ne={class:"text-xs font-medium"},ie={key:0,class:"chat-loading",role:"status","aria-live":"polite"},oe={class:"glass-card p-8 flex flex-col items-center gap-4"},re={class:"text-sm text-white/60"},le=["src","title"],ce={key:1,class:"chat-placeholder"},ue={class:"chat-placeholder-inner"},de={class:"text-2xl font-semibold text-white mb-2"},pe={class:"text-white/60 mb-4 leading-relaxed"},he={class:"text-xs text-white/30"},me=j({__name:"Chat",setup(c){const{t:e}=V(),a=X(),t=A(null);let s=null;const n=A(null),i=w(()=>n.value===!0?`/aiui/?embedded=true&hideClose=true&v=${Date.now()}`:"");async function l(){try{const h=await fetch("/aiui/",{method:"HEAD"});n.value=h.ok}catch{n.value=!1}}function f(){window.history.length>1?a.back():a.push("/dashboard")}function u(h){if(i.value){try{const m=new URL(i.value,window.location.origin).origin;if(h.origin!==m)return}catch{return}h.data?.type}}return K(async()=>{window.addEventListener("message",u),await l(),i.value&&(s=new T(t,i.value),s.start())}),G(()=>{window.removeEventListener("message",u),s?.stop(),s=null}),(h,m)=>(z(),L("div",te,[d("div",ae,[d("button",{class:"chat-close-btn","aria-label":b(e)("chat.closeAssistant"),onClick:f},[m[0]||(m[0]=d("svg",{class:"w-4 h-4","aria-hidden":"true",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[d("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M6 18L18 6M6 6l12 12"})],-1)),d("span",ne,E(b(e)("chat.close")),1)],8,se)]),Z(Q,{name:"fade"},{default:J(()=>[n.value===null?(z(),L("div",ie,[d("div",oe,[m[1]||(m[1]=d("div",{class:"chat-loading-spinner","aria-hidden":"true"},null,-1)),d("p",re,E(b(e)("chat.loadingAssistant")),1)])])):M("",!0)]),_:1}),i.value?(z(),L("iframe",{key:0,ref_key:"aiuiFrame",ref:t,src:i.value,title:b(e)("chat.aiAssistant"),class:"chat-iframe chat-iframe-mobile",allow:"microphone",style:{background:"transparent"}},null,8,le)):n.value===!1?(z(),L("div",ce,[d("div",ue,[m[2]||(m[2]=d("div",{class:"chat-placeholder-icon"},[d("svg",{class:"w-8 h-8 text-white/40","aria-hidden":"true",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[d("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M8 12h.01M12 12h.01M16 12h.01M21 12c0 4.418-4.03 8-9 8a9.863 9.863 0 01-4.255-.949L3 20l1.395-3.72C3.512 15.042 3 13.574 3 12c0-4.418 4.03-8 9-8s9 3.582 9 8z"})])],-1)),d("h2",de,E(b(e)("chat.aiAssistant")),1),d("p",pe,E(b(e)("chat.notConfigured")),1),d("p",he,E(b(e)("chat.deployCta")),1)])])):M("",!0)]))}}),we=Y(me,[["__scopeId","data-v-18b2b408"]]);export{we as default}; diff --git a/neode-ui/dist/assets/Chat-_Y5LN8Cp.css b/neode-ui/dist/assets/Chat-_Y5LN8Cp.css new file mode 100644 index 0000000..7a18110 --- /dev/null +++ b/neode-ui/dist/assets/Chat-_Y5LN8Cp.css @@ -0,0 +1 @@ +.chat-loading[data-v-18b2b408]{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;z-index:10}.chat-loading-spinner[data-v-18b2b408]{width:32px;height:32px;border:3px solid rgba(255,255,255,.1);border-top-color:#fb923c;border-radius:50%;animation:spin-18b2b408 .8s linear infinite}@keyframes spin-18b2b408{to{transform:rotate(360deg)}}.fade-enter-active[data-v-18b2b408],.fade-leave-active[data-v-18b2b408]{transition:opacity .3s ease}.fade-enter-from[data-v-18b2b408],.fade-leave-to[data-v-18b2b408]{opacity:0} diff --git a/neode-ui/dist/assets/Cloud-BkxOai3U.js b/neode-ui/dist/assets/Cloud-BkxOai3U.js new file mode 100644 index 0000000..e882eb7 --- /dev/null +++ b/neode-ui/dist/assets/Cloud-BkxOai3U.js @@ -0,0 +1 @@ +import{d as I,z as j,o as A,B as F,c as n,a as t,F as x,P as g,E as v,N as z,G as w,h as D,i as H,U as E,x as R,r as p,j as T,f as a,D as l,J as b,q as r}from"./index-DnbYEqLr.js";import{f as y}from"./filebrowser-client-DRXM9PC4.js";const $={class:"pb-6"},O={class:"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4"},q=["onClick"],G={class:"flex items-center gap-4 mb-4"},J=["d"],U={class:"flex-1 min-w-0"},Y={class:"text-lg font-semibold text-white mb-0.5 truncate"},K={class:"text-xs text-white/50"},Q={class:"flex items-center gap-2 text-xs"},W={key:0,class:"text-white/30"},X={key:1,class:"text-white/30 animate-pulse"},Z={key:2,class:"text-white/30"},ee=["onClick"],te={class:"flex items-center gap-4 mb-4"},se={class:"flex-1 min-w-0"},oe={class:"text-lg font-semibold text-white mb-0.5 truncate"},ne={class:"text-xs text-white/50 truncate"},re={class:"flex items-center gap-2 text-xs"},ie={key:0,class:"glass-card p-8 mt-6 text-center"},de=I({__name:"Cloud",setup(le){const h=R(),C=j(),c=p({}),f=p(!1),d=p([]),m=p(!0),B={immich:["immich_server","immich-server"],nextcloud:["nextcloud-aio","nextcloud-server"]};function u(o){const s=C.packages;if(s[o]?.state==="running")return!0;const e=B[o];if(e){for(const i of e)if(s[i]?.state==="running")return!0}return!1}const k=T(()=>u("filebrowser")),_=[{id:"photos",name:"Photos & Videos",description:"Auto-backup & browse your media",appId:"filebrowser",appLabel:"File Browser",iconPaths:["M4 16l4.586-4.586a2 2 0 012.828 0L16 16m-2-2l1.586-1.586a2 2 0 012.828 0L20 14m-6-6h.01M6 20h12a2 2 0 002-2V6a2 2 0 00-2-2H6a2 2 0 00-2 2v12a2 2 0 002 2z"],iconBg:"bg-blue-500/15",iconColor:"text-blue-400"},{id:"music",name:"Music",description:"Your music collection",appId:"filebrowser",appLabel:"File Browser",iconPaths:["M9 19V6l12-3v13M9 19c0 1.105-1.343 2-3 2s-3-.895-3-2 1.343-2 3-2 3 .895 3 2zm12-3c0 1.105-1.343 2-3 2s-3-.895-3-2 1.343-2 3-2 3 .895 3 2zM9 10l12-3"],iconBg:"bg-orange-500/15",iconColor:"text-orange-400"},{id:"documents",name:"Documents",description:"Files, docs & spreadsheets",appId:"filebrowser",appLabel:"File Browser",iconPaths:["M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"],iconBg:"bg-green-500/15",iconColor:"text-green-400"},{id:"files",name:"All Files",description:"Browse your server file system",appId:"filebrowser",appLabel:"File Browser",iconPaths:["M3 7v10a2 2 0 002 2h14a2 2 0 002-2V9a2 2 0 00-2-2h-6l-2-2H5a2 2 0 00-2 2z"],iconBg:"bg-white/10",iconColor:"text-white/70"}],M={photos:"/Photos",music:"/Music",documents:"/Documents",files:"/"};async function L(){if(k.value){f.value=!0;try{if(!await y.login())return;for(const s of _){const e=M[s.id];if(e)try{const i=await y.listDirectory(e);c.value[s.id]=i.length}catch{c.value[s.id]=0}}}catch{}finally{f.value=!1}}}A(()=>{L(),P()});async function P(){m.value=!0;try{const o=await F.federationListNodes();d.value=o?.nodes??[]}catch{d.value=[]}finally{m.value=!1}}function N(o){return o.length<=24?o:o.slice(0,16)+"..."+o.slice(-8)}function S(o){h.push({name:"cloud-folder",params:{folderId:o.id}})}return(o,s)=>(r(),n("div",$,[t("div",O,[(r(),n(x,null,g(_,e=>t("div",{key:e.id,"data-controller-container":"",tabindex:"0",class:"glass-card p-6 cursor-pointer transition-all hover:-translate-y-1 hover:bg-white/10",onClick:i=>S(e)},[t("div",G,[t("div",{class:a(["flex-shrink-0 w-12 h-12 rounded-xl flex items-center justify-center",e.iconBg])},[(r(),n("svg",{class:a(["w-7 h-7",e.iconColor]),fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[(r(!0),n(x,null,g(e.iconPaths,(i,V)=>(r(),n("path",{key:V,"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:i},null,8,J))),128))],2))],2),t("div",U,[t("h3",Y,l(e.name),1),t("p",K,l(e.description),1)]),s[1]||(s[1]=t("svg",{class:"w-5 h-5 text-white/30",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[t("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M9 5l7 7-7 7"})],-1))]),t("div",Q,[t("span",{class:a(["inline-flex items-center gap-1.5 px-2 py-1 rounded-full",u(e.appId)?"bg-green-500/15 text-green-400":"bg-white/5 text-white/40"])},[t("span",{class:a(["w-1.5 h-1.5 rounded-full",u(e.appId)?"bg-green-400":"bg-white/30"])},null,2),b(" "+l(e.appLabel),1)],2),u(e.appId)?f.value?(r(),n("span",X,"Loading...")):c.value[e.id]!==void 0?(r(),n("span",Z,l(c.value[e.id])+" items",1)):w("",!0):(r(),n("span",W,"Not installed"))])],8,q)),64)),(r(!0),n(x,null,g(d.value,e=>(r(),n("div",{key:e.did,"data-controller-container":"",tabindex:"0",class:"glass-card p-6 cursor-pointer transition-all hover:-translate-y-1 hover:bg-white/10",onClick:i=>v(h).push({name:"peer-files",params:{peerId:e.onion}})},[t("div",te,[s[2]||(s[2]=t("div",{class:"flex-shrink-0 w-12 h-12 rounded-xl flex items-center justify-center bg-purple-500/15"},[t("svg",{class:"w-7 h-7 text-purple-400",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[t("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M5 12h14M5 12a2 2 0 01-2-2V6a2 2 0 012-2h14a2 2 0 012 2v4a2 2 0 01-2 2M5 12a2 2 0 00-2 2v4a2 2 0 002 2h14a2 2 0 002-2v-4a2 2 0 00-2-2"})])],-1)),t("div",se,[t("h3",oe,l(e.name||N(e.did)),1),t("p",ne,l(e.onion),1)]),s[3]||(s[3]=t("svg",{class:"w-5 h-5 text-white/30",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[t("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M9 5l7 7-7 7"})],-1))]),t("div",re,[t("span",{class:a(["inline-flex items-center gap-1.5 px-2 py-1 rounded-full",e.trust_level==="trusted"?"bg-green-500/15 text-green-400":"bg-purple-500/15 text-purple-400"])},[t("span",{class:a(["w-1.5 h-1.5 rounded-full",e.trust_level==="trusted"?"bg-green-400":"bg-purple-400"])},null,2),b(" "+l(e.trust_level),1)],2),s[4]||(s[4]=t("span",{class:"text-white/30"},"Peer Node",-1))])],8,ee))),128)),!m.value&&d.value.length===0?(r(),n("div",{key:0,"data-controller-container":"",tabindex:"0",class:"glass-card p-6 cursor-pointer transition-all hover:-translate-y-1 hover:bg-white/10",onClick:s[0]||(s[0]=e=>v(h).push("/dashboard/server/federation"))},[...s[5]||(s[5]=[z('

Peer Files

Set up federation to share files with peers

No peers yet
',2)])])):w("",!0)]),k.value?w("",!0):(r(),n("div",ie,[s[7]||(s[7]=t("p",{class:"text-white/60 mb-3"},"Install File Browser from the App Store to get started with your cloud storage.",-1)),D(v(E),{to:"/dashboard/marketplace",class:"glass-button inline-flex items-center gap-2 px-5 py-2.5 rounded-lg text-sm font-medium"},{default:H(()=>[...s[6]||(s[6]=[b(" Open App Store ",-1)])]),_:1})]))]))}});export{de as default}; diff --git a/neode-ui/dist/assets/CloudFolder-8jSNyq3F.js b/neode-ui/dist/assets/CloudFolder-8jSNyq3F.js new file mode 100644 index 0000000..92f5d45 --- /dev/null +++ b/neode-ui/dist/assets/CloudFolder-8jSNyq3F.js @@ -0,0 +1 @@ +import{$ as fe,r as b,j as k,d as G,c as i,a as e,F as P,P as O,f as z,D as M,G as $,q as l,E as p,b as V,N as ne,m as q,o as pe,B as H,a1 as ae,g as ie,a2 as he,H as ge,z as we,w as ke,J as Z,h as _,i as xe,U as be,n as ye,x as $e,u as Ce}from"./index-DnbYEqLr.js";import{f as I}from"./filebrowser-client-DRXM9PC4.js";const ee=fe("cloud",()=>{const t=b("/"),f=b([]),s=b(!1),h=b(null),a=b(!1),r=k(()=>{const c=t.value.split("/").filter(Boolean),v=[{name:"Home",path:"/"}];let x="";for(const U of c)x+=`/${U}`,v.push({name:U,path:x});return v}),u=k(()=>{const c=f.value.filter(x=>x.isDir),v=f.value.filter(x=>!x.isDir);return c.sort((x,U)=>x.name.localeCompare(U.name)),v.sort((x,U)=>x.name.localeCompare(U.name)),[...c,...v]});async function d(){if(a.value)return!0;const c=await I.login();return a.value=c,c}async function g(c){s.value=!0,h.value=null;try{if(!a.value&&!await d()){h.value="Failed to authenticate with File Browser";return}try{const v=await I.listDirectory(c);f.value=v,t.value=c}catch{if(c!=="/")try{const v=c.substring(0,c.lastIndexOf("/"))||"/",x=c.substring(c.lastIndexOf("/")+1);await I.createFolder(v,x);const U=await I.listDirectory(c);f.value=U,t.value=c}catch{const v=await I.listDirectory("/");f.value=v,t.value="/"}else throw new Error("Failed to list root directory")}}catch(v){h.value=v instanceof Error?v.message:"Failed to load files"}finally{s.value=!1}}async function y(){await g(t.value)}async function E(c){await I.upload(t.value,c),await y()}async function B(c){await I.deleteItem(c),await y()}function o(c){return I.downloadUrl(c)}async function m(c){return I.fetchBlobUrl(c)}async function C(c){return I.downloadFile(c)}function L(){t.value="/",f.value=[],s.value=!1,h.value=null}return{currentPath:t,items:f,loading:s,error:h,authenticated:a,breadcrumbs:r,sortedItems:u,init:d,navigate:g,refresh:y,uploadFile:E,deleteItem:B,downloadUrl:o,fetchBlobUrl:m,downloadFile:C,reset:L}}),Me={class:"cloud-toolbar"},Be={class:"cloud-breadcrumbs"},Se=["onClick"],De={key:0,class:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},je={key:1},ze={key:2,class:"w-3 h-3 text-white/30 mx-1",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},Le={class:"flex items-center gap-2"},Ue={class:"cloud-view-toggle"},Ve=G({__name:"CloudToolbar",props:{breadcrumbs:{},viewMode:{}},emits:["navigate","refresh","upload","update:viewMode"],setup(t,{emit:f}){const s=f,h=b(null);function a(){h.value?.click()}function r(u){const d=u.target;d.files&&d.files.length>0&&(s("upload",Array.from(d.files)),d.value="")}return(u,d)=>(l(),i("div",Me,[e("nav",Be,[(l(!0),i(P,null,O(t.breadcrumbs,(g,y)=>(l(),i("button",{key:g.path,class:z(["cloud-breadcrumb-item",{"cloud-breadcrumb-active":y===t.breadcrumbs.length-1}]),onClick:E=>yu.$emit("update:viewMode","grid"))},[...d[5]||(d[5]=[e("svg",{class:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M4 6a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2H6a2 2 0 01-2-2V6zm10 0a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2h-2a2 2 0 01-2-2V6zM4 16a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2H6a2 2 0 01-2-2v-2zm10 0a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2h-2a2 2 0 01-2-2v-2z"})],-1)])],2),e("button",{class:z(["cloud-view-toggle-btn",{"cloud-view-toggle-active":t.viewMode==="list"}]),title:"List view",onClick:d[1]||(d[1]=g=>u.$emit("update:viewMode","list"))},[...d[6]||(d[6]=[e("svg",{class:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M4 6h16M4 10h16M4 14h16M4 18h16"})],-1)])],2)]),e("button",{class:"glass-button cloud-toolbar-btn",title:"Upload file",onClick:a},[...d[7]||(d[7]=[e("svg",{class:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-8l-4-4m0 0L8 8m4-4v12"})],-1),e("span",{class:"hidden md:inline"},"Upload",-1)])]),e("button",{class:"glass-button cloud-toolbar-btn",title:"Refresh",onClick:d[2]||(d[2]=g=>u.$emit("refresh"))},[...d[8]||(d[8]=[e("svg",{class:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15"})],-1)])])]),e("input",{ref_key:"fileInput",ref:h,type:"file",class:"hidden",multiple:"",onChange:r},null,544)]))}}),Ee=new Set(["jpg","jpeg","png","gif","webp","svg","bmp","ico"]),Ae=new Set(["mp3","flac","wav","ogg","aac","m4a","wma"]),Ie=new Set(["mp4","mkv","avi","mov","webm","wmv","flv"]),Fe=new Set(["pdf","doc","docx","txt","rtf","odt","md"]),Te=new Set(["xls","xlsx","csv","ods"]),Pe=new Set(["zip","tar","gz","rar","7z","bz2"]);function He(t,f){return f?"folder":Ee.has(t)?"image":Ae.has(t)?"audio":Ie.has(t)?"video":Fe.has(t)?"document":Te.has(t)?"spreadsheet":Pe.has(t)?"archive":"file"}const Ne={folder:["M3 7v10a2 2 0 002 2h14a2 2 0 002-2V9a2 2 0 00-2-2h-6l-2-2H5a2 2 0 00-2 2z"],audio:["M9 19V6l12-3v13M9 19c0 1.105-1.343 2-3 2s-3-.895-3-2 1.343-2 3-2 3 .895 3 2zm12-3c0 1.105-1.343 2-3 2s-3-.895-3-2 1.343-2 3-2 3 .895 3 2zM9 10l12-3"],video:["M14.752 11.168l-3.197-2.132A1 1 0 0010 9.87v4.263a1 1 0 001.555.832l3.197-2.132a1 1 0 000-1.664z","M21 12a9 9 0 11-18 0 9 9 0 0118 0z"],image:["M4 16l4.586-4.586a2 2 0 012.828 0L16 16m-2-2l1.586-1.586a2 2 0 012.828 0L20 14m-6-6h.01M6 20h12a2 2 0 002-2V6a2 2 0 00-2-2H6a2 2 0 00-2 2v12a2 2 0 002 2z"],document:["M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"],spreadsheet:["M3 10h18M3 14h18M3 6h18M3 18h18M8 6v12M16 6v12"],archive:["M5 8h14M5 8a2 2 0 110-4h14a2 2 0 110 4M5 8v10a2 2 0 002 2h10a2 2 0 002-2V8m-9 4h4"],file:["M7 21h10a2 2 0 002-2V9.414a1 1 0 00-.293-.707l-5.414-5.414A1 1 0 0012.586 3H7a2 2 0 00-2 2v14a2 2 0 002 2z"]},Oe={folder:"text-amber-400",audio:"text-orange-400",video:"text-purple-400",image:"text-blue-400",document:"text-green-400",spreadsheet:"text-emerald-400",archive:"text-yellow-400",file:"text-white/50"},Re={folder:"Folder",audio:"Audio",video:"Video",image:"Image",document:"Document",spreadsheet:"Spreadsheet",archive:"Archive",file:"File"},Ge={folder:"bg-amber-500/15 text-amber-400/70",audio:"bg-orange-500/15 text-orange-400/70",video:"bg-purple-500/15 text-purple-400/70",image:"bg-blue-500/15 text-blue-400/70",document:"bg-green-500/15 text-green-400/70",spreadsheet:"bg-emerald-500/15 text-emerald-400/70",archive:"bg-yellow-500/15 text-yellow-400/70",file:"bg-white/8 text-white/50"};function re(t,f){const s=k(()=>He(t.value,f.value)),h=k(()=>s.value==="image"),a=k(()=>s.value==="audio"),r=k(()=>s.value==="video"),u=k(()=>Ne[s.value]),d=k(()=>Oe[s.value]),g=k(()=>Re[s.value]),y=k(()=>Ge[s.value]);return{category:s,isImage:h,isAudio:a,isVideo:r,iconPaths:u,iconColor:d,badgeLabel:g,badgeClass:y}}function ue(t){if(t===0)return"0 B";const f=["B","KB","MB","GB","TB"],s=Math.floor(Math.log(t)/Math.log(1024));return`${(t/Math.pow(1024,s)).toFixed(s>0?1:0)} ${f[s]}`}function de(t){const f=new Date(t),h=Date.now()-f.getTime(),a=Math.floor(h/6e4);if(a<1)return"Just now";if(a<60)return`${a}m ago`;const r=Math.floor(a/60);if(r<24)return`${r}h ago`;const u=Math.floor(r/24);return u<7?`${u}d ago`:f.toLocaleDateString()}const Xe={class:"cloud-file-item-thumb"},Ye=["src","alt"],qe={key:1,class:"w-full h-full rounded-[6px] flex items-center justify-center bg-white/8"},Je=["d"],Ke={class:"min-w-0 flex-1 py-0.5"},Qe={class:"text-sm font-semibold truncate text-white/90"},We={class:"text-xs mt-0.5 text-white/40"},Ze={key:0},_e={key:1},et={class:"flex items-center gap-1.5 mt-1.5"},tt={key:0,class:"cloud-file-badge bg-white/8 text-white/50"},lt=["href"],ot={key:2,class:"w-4 h-4 text-white/30",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},st=G({__name:"FileCard",props:{item:{}},emits:["navigate","delete","share"],setup(t,{emit:f}){const s=t,h=f,a=ee(),r=b(!1),u=k(()=>s.item.extension),d=k(()=>s.item.isDir),{isImage:g,iconPaths:y,iconColor:E,badgeLabel:B,badgeClass:o}=re(u,d),m=k(()=>!g.value||r.value?null:a.downloadUrl(s.item.path)),C=k(()=>a.downloadUrl(s.item.path));function L(){s.item.isDir&&h("navigate",s.item.path)}return(c,v)=>(l(),i("button",{class:"cloud-file-item group","data-controller-container":"",tabindex:"0",onClick:L},[e("div",Xe,[p(g)&&m.value&&!r.value?(l(),i("img",{key:0,src:m.value,alt:t.item.name,class:"w-full h-full object-cover rounded-[6px] transition-transform duration-300 group-hover:scale-105",loading:"lazy",onError:v[0]||(v[0]=x=>r.value=!0)},null,40,Ye)):(l(),i("div",qe,[(l(),i("svg",{class:z(["w-5 h-5",p(E)]),fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[(l(!0),i(P,null,O(p(y),(x,U)=>(l(),i("path",{key:U,"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"1.5",d:x},null,8,Je))),128))],2))]))]),e("div",Ke,[e("p",Qe,M(t.item.name),1),e("p",We,[t.item.isDir?$("",!0):(l(),i("span",Ze,M(p(ue)(t.item.size)),1)),t.item.isDir?$("",!0):(l(),i("span",_e," · ")),e("span",null,M(p(de)(t.item.modified)),1)]),e("div",et,[e("span",{class:z(["cloud-file-badge",p(o)])},M(p(B)),3),t.item.extension&&!t.item.isDir?(l(),i("span",tt," ."+M(t.item.extension),1)):$("",!0)])]),e("div",{class:"cloud-file-item-actions",onClick:v[4]||(v[4]=V(()=>{},["stop"]))},[e("button",{class:"cloud-file-action-btn cloud-file-action-share",title:"Share with peers",onClick:v[1]||(v[1]=V(x=>c.$emit("share",t.item.path,t.item.name,t.item.isDir),["stop"]))},[...v[5]||(v[5]=[e("svg",{class:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M8.684 13.342C8.886 12.938 9 12.482 9 12c0-.482-.114-.938-.316-1.342m0 2.684a3 3 0 110-2.684m0 2.684l6.632 3.316m-6.632-6l6.632-3.316m0 0a3 3 0 105.367-2.684 3 3 0 00-5.367 2.684zm0 9.316a3 3 0 105.368 2.684 3 3 0 00-5.368-2.684z"})],-1)])]),t.item.isDir?$("",!0):(l(),i("a",{key:0,href:C.value,download:"",class:"cloud-file-action-btn",title:"Download",onClick:v[2]||(v[2]=V(()=>{},["stop"]))},[...v[6]||(v[6]=[e("svg",{class:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-4l-4 4m0 0l-4-4m4 4V4"})],-1)])],8,lt)),t.item.isDir?$("",!0):(l(),i("button",{key:1,class:"cloud-file-action-btn cloud-file-action-delete",title:"Delete",onClick:v[3]||(v[3]=V(x=>c.$emit("delete",t.item.path),["stop"]))},[...v[7]||(v[7]=[e("svg",{class:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16"})],-1)])])),t.item.isDir?(l(),i("svg",ot,[...v[8]||(v[8]=[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M9 5l7 7-7 7"},null,-1)])])):$("",!0)])]))}}),D=b(null),Y=b(null),te=b(""),N=b(!1),le=b(0),J=b(0),X=b(null);function it(t,f){if(D.value||(D.value=new Audio,D.value.addEventListener("timeupdate",()=>{le.value=D.value?.currentTime??0}),D.value.addEventListener("loadedmetadata",()=>{J.value=D.value?.duration??0,X.value=null}),D.value.addEventListener("ended",()=>{N.value=!1}),D.value.addEventListener("pause",()=>{N.value=!1}),D.value.addEventListener("play",()=>{N.value=!0,X.value=null}),D.value.addEventListener("error",()=>{N.value=!1,X.value="Could not play audio. File Browser may not be running."})),X.value=null,Y.value===t&&N.value){D.value.pause();return}Y.value!==t&&(D.value.src=t,Y.value=t,te.value=f),D.value.play()}function nt(){D.value?.pause()}function at(t){D.value&&(D.value.currentTime=t)}function rt(){D.value&&(D.value.pause(),D.value.currentTime=0),N.value=!1,Y.value=null,te.value=""}const ut=k(()=>J.value===0?0:le.value/J.value*100);function ce(){return{play:it,pause:nt,seek:at,stop:rt,playing:N,currentName:te,currentTime:le,duration:J,progress:ut,currentSrc:Y,error:X}}const dt=["src","alt"],ct=["src","alt"],vt=["d"],mt={class:"cloud-grid-card-play-btn"},ft={key:0,class:"w-8 h-8 text-white",fill:"currentColor",viewBox:"0 0 24 24"},pt={key:1,class:"w-8 h-8 text-white",fill:"currentColor",viewBox:"0 0 24 24"},ht={class:"cloud-grid-card-info"},gt={class:"text-xs font-semibold text-white/90 leading-tight truncate"},wt={class:"flex items-center gap-1 mt-0.5"},kt={key:0,class:"text-xs text-white/40"},xt={key:1,class:"text-xs text-white/40"},bt={class:"text-xs text-white/40"},yt={class:"cloud-grid-card-badges"},$t=["href"],Ct=G({__name:"FileCardGrid",props:{item:{}},emits:["navigate","delete","play","share"],setup(t,{emit:f}){const s=t,h=f,a=ee(),r=b(!1),u=k(()=>s.item.extension),d=k(()=>s.item.isDir),{category:g,isImage:y,isAudio:E,isVideo:B,iconPaths:o,iconColor:m,badgeLabel:C,badgeClass:L}=re(u,d),c=k(()=>r.value?null:y.value||B.value?a.downloadUrl(s.item.path):null),v=k(()=>a.downloadUrl(s.item.path)),{playing:x,currentSrc:U}=ce(),T=k(()=>x.value&&U.value===v.value),R=k(()=>y.value||B.value?"aspect-square":g.value==="document"||g.value==="folder"?"aspect-[4/3]":"aspect-square"),A=k(()=>s.item.isDir?"bg-amber-500/10":E.value?"bg-orange-500/10":B.value?"bg-purple-500/10":y.value?"bg-blue-500/10":g.value==="document"?"bg-green-500/10":g.value==="spreadsheet"?"bg-emerald-500/10":g.value==="archive"?"bg-yellow-500/10":"bg-white/5");function K(){s.item.isDir&&h("navigate",s.item.path)}return(oe,w)=>(l(),i("button",{class:"cloud-grid-card group","data-controller-container":"",tabindex:"0",onClick:K},[e("div",{class:z(["cloud-grid-card-cover",R.value])},[p(y)&&c.value&&!r.value?(l(),i("img",{key:0,src:c.value,alt:t.item.name,class:"w-full h-full object-cover transition-transform duration-300 group-hover:scale-110",loading:"lazy",onError:w[0]||(w[0]=F=>r.value=!0)},null,40,dt)):p(B)&&c.value&&!r.value?(l(),i("img",{key:1,src:c.value,alt:t.item.name,class:"w-full h-full object-cover transition-transform duration-300 group-hover:scale-110",loading:"lazy",onError:w[1]||(w[1]=F=>r.value=!0)},null,40,ct)):(l(),i("div",{key:2,class:z(["w-full h-full flex items-center justify-center",A.value])},[(l(),i("svg",{class:z(["w-10 h-10",p(m)]),fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[(l(!0),i(P,null,O(p(o),(F,Q)=>(l(),i("path",{key:Q,"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"1.5",d:F},null,8,vt))),128))],2))],2)),w[12]||(w[12]=e("div",{class:"cloud-grid-card-gradient"},null,-1)),p(E)||p(B)?(l(),i("div",{key:3,class:z(["cloud-grid-card-play",{"cloud-grid-card-play-active":T.value}]),onClick:w[2]||(w[2]=V(F=>h("play",t.item.path,t.item.name),["stop"]))},[e("span",mt,[T.value?(l(),i("svg",pt,[...w[8]||(w[8]=[e("path",{d:"M6 4h4v16H6V4zm8 0h4v16h-4V4z"},null,-1)])])):(l(),i("svg",ft,[...w[7]||(w[7]=[e("path",{d:"M8 5v14l11-7L8 5z"},null,-1)])]))])],2)):$("",!0),e("div",ht,[e("p",gt,M(t.item.name),1),e("div",wt,[t.item.isDir?$("",!0):(l(),i("span",kt,M(p(ue)(t.item.size)),1)),t.item.isDir?$("",!0):(l(),i("span",xt,"·")),e("span",bt,M(p(de)(t.item.modified)),1)])]),e("div",yt,[e("span",{class:z(["cloud-grid-card-badge",p(L)])},M(p(C)),3)]),e("div",{class:"cloud-grid-card-actions",onClick:w[6]||(w[6]=V(()=>{},["stop"]))},[e("button",{class:"cloud-file-action-btn cloud-file-action-share",title:"Share with peers",onClick:w[3]||(w[3]=V(F=>h("share",t.item.path,t.item.name,t.item.isDir),["stop"]))},[...w[9]||(w[9]=[e("svg",{class:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M8.684 13.342C8.886 12.938 9 12.482 9 12c0-.482-.114-.938-.316-1.342m0 2.684a3 3 0 110-2.684m0 2.684l6.632 3.316m-6.632-6l6.632-3.316m0 0a3 3 0 105.367-2.684 3 3 0 00-5.367 2.684zm0 9.316a3 3 0 105.368 2.684 3 3 0 00-5.368-2.684z"})],-1)])]),t.item.isDir?$("",!0):(l(),i("a",{key:0,href:v.value,download:"",class:"cloud-file-action-btn",title:"Download",onClick:w[4]||(w[4]=V(()=>{},["stop"]))},[...w[10]||(w[10]=[e("svg",{class:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-4l-4 4m0 0l-4-4m4 4V4"})],-1)])],8,$t)),t.item.isDir?$("",!0):(l(),i("button",{key:1,class:"cloud-file-action-btn cloud-file-action-delete",title:"Delete",onClick:w[5]||(w[5]=V(F=>h("delete",t.item.path),["stop"]))},[...w[11]||(w[11]=[e("svg",{class:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16"})],-1)])]))])],2)]))}}),Mt={class:"flex-1 min-h-0 overflow-y-auto"},Bt={key:0,class:"aspect-square rounded-[10px] bg-white/8 animate-pulse"},St={key:1,class:"flex flex-col items-center justify-center py-16 text-center"},Dt={key:2,class:"cloud-card-grid"},jt={key:3,class:"cloud-file-list"},zt=G({__name:"FileGrid",props:{items:{},loading:{type:Boolean},viewMode:{default:"grid"}},emits:["navigate","delete","play","share"],setup(t){return(f,s)=>(l(),i("div",Mt,[t.loading?(l(),i("div",{key:0,class:z(t.viewMode==="grid"?"cloud-card-grid":"cloud-file-list")},[(l(),i(P,null,O(6,h=>e("div",{key:h,class:z(t.viewMode==="grid"?"cloud-grid-card-skeleton":"cloud-file-item cloud-file-item-skeleton")},[t.viewMode==="grid"?(l(),i("div",Bt)):(l(),i(P,{key:1},[s[7]||(s[7]=ne('
',2))],64))],2)),64))],2)):t.items.length===0?(l(),i("div",St,[...s[8]||(s[8]=[e("svg",{class:"w-16 h-16 text-white/10 mb-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"1.5",d:"M3 7v10a2 2 0 002 2h14a2 2 0 002-2V9a2 2 0 00-2-2h-6l-2-2H5a2 2 0 00-2 2z"})],-1),e("p",{class:"text-white/50 text-sm"},"This folder is empty",-1),e("p",{class:"text-white/30 text-xs mt-1"},"Upload files to get started",-1)])])):t.viewMode==="grid"?(l(),i("div",Dt,[(l(!0),i(P,null,O(t.items,h=>(l(),q(Ct,{key:h.path,item:h,onNavigate:s[0]||(s[0]=a=>f.$emit("navigate",a)),onDelete:s[1]||(s[1]=a=>f.$emit("delete",a)),onPlay:s[2]||(s[2]=(a,r)=>f.$emit("play",a,r)),onShare:s[3]||(s[3]=(a,r,u)=>f.$emit("share",a,r,u))},null,8,["item"]))),128))])):(l(),i("div",jt,[(l(!0),i(P,null,O(t.items,h=>(l(),q(st,{key:h.path,item:h,onNavigate:s[4]||(s[4]=a=>f.$emit("navigate",a)),onDelete:s[5]||(s[5]=a=>f.$emit("delete",a)),onShare:s[6]||(s[6]=(a,r,u)=>f.$emit("share",a,r,u))},null,8,["item"]))),128))]))]))}}),Lt={class:"share-modal glass-card"},Ut={class:"flex items-center justify-between mb-5"},Vt={class:"flex items-center gap-3"},Et={class:"text-xs text-white/50 truncate max-w-[200px]"},At={class:"share-modal-row"},It={class:"flex-1"},Ft={class:"text-sm font-medium text-white/90"},Tt={class:"share-toggle"},Pt={key:0,class:"mt-4 space-y-3"},Ht={class:"share-access-options"},Nt={key:0,class:"share-price-input-wrap"},Ot={key:1,class:"share-modal-status mt-4"},Rt={key:2,class:"share-modal-error mt-4"},Gt={class:"text-sm text-red-400"},Xt={key:3,class:"share-modal-success mt-4"},Yt={class:"text-sm text-green-400"},qt={class:"flex justify-end gap-3 mt-5"},Jt=["disabled"],Kt=G({__name:"ShareModal",props:{filename:{},filepath:{},isDir:{type:Boolean},existingItemId:{}},emits:["close","saved"],setup(t,{emit:f}){const s=t,h=f,a=b(!1),r=b("free"),u=b(100),d=b(!1),g=b(null),y=b(null);pe(async()=>{try{const o=(await H.call({method:"content.list-mine"})).items.find(m=>m.filename===s.filename||m.filename===s.filepath);if(o){a.value=!0;const m=o.access;typeof m=="string"?m==="free"?r.value="free":m==="peersonly"&&(r.value="peers_only"):m&&typeof m=="object"&&("paid"in m&&m.paid?(r.value="paid",u.value=m.paid.price_sats||100):"peersonly"in m&&(r.value="peers_only"))}}catch{}});async function E(){d.value=!0,g.value=null,y.value=null;try{if(a.value){let o=(await H.call({method:"content.list-mine"})).items.find(L=>L.filename===s.filename||L.filename===s.filepath)?.id;if(!o){const L=s.filename.split(".").pop()?.toLowerCase()||"",c={jpg:"image/jpeg",jpeg:"image/jpeg",png:"image/png",gif:"image/gif",webp:"image/webp",mp4:"video/mp4",webm:"video/webm",mkv:"video/x-matroska",mp3:"audio/mpeg",flac:"audio/flac",ogg:"audio/ogg",wav:"audio/wav",pdf:"application/pdf",zip:"application/zip",txt:"text/plain"};o=(await H.call({method:"content.add",params:{filename:s.filepath||s.filename,mime_type:c[L]||"application/octet-stream",description:""}})).item.id}const m={id:o,access:r.value};r.value==="paid"&&(m.price_sats=u.value),await H.call({method:"content.set-pricing",params:m}),await H.call({method:"content.set-availability",params:{id:o,availability:"all_peers"}});const C=r.value==="paid"?`Shared for ${u.value} sats`:r.value==="peers_only"?"Shared with peers":"Shared (free)";y.value=C}else{const o=(await H.call({method:"content.list-mine"})).items.find(m=>m.filename===s.filename||m.filename===s.filepath);o&&await H.call({method:"content.remove",params:{id:o.id}}),y.value="Sharing disabled"}setTimeout(()=>h("saved"),800)}catch(B){g.value=B instanceof Error?B.message:"Failed to update sharing"}finally{d.value=!1}}return(B,o)=>(l(),q(ae,{to:"body"},[e("div",{class:"share-modal-backdrop",onClick:o[7]||(o[7]=V(m=>B.$emit("close"),["self"]))},[e("div",Lt,[e("div",Ut,[e("div",Vt,[o[9]||(o[9]=e("div",{class:"w-9 h-9 rounded-lg bg-orange-500/15 flex items-center justify-center"},[e("svg",{class:"w-5 h-5 text-orange-400",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M8.684 13.342C8.886 12.938 9 12.482 9 12c0-.482-.114-.938-.316-1.342m0 2.684a3 3 0 110-2.684m0 2.684l6.632 3.316m-6.632-6l6.632-3.316m0 0a3 3 0 105.367-2.684 3 3 0 00-5.367 2.684zm0 9.316a3 3 0 105.368 2.684 3 3 0 00-5.368-2.684z"})])],-1)),e("div",null,[o[8]||(o[8]=e("h3",{class:"text-base font-semibold text-white"},"Share with Peers",-1)),e("p",Et,M(t.filename),1)])]),e("button",{class:"share-modal-close",onClick:o[0]||(o[0]=m=>B.$emit("close"))},[...o[10]||(o[10]=[e("svg",{class:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M6 18L18 6M6 6l12 12"})],-1)])])]),e("div",At,[e("div",It,[e("p",Ft,"Share this "+M(t.isDir?"folder":"file"),1),o[11]||(o[11]=e("p",{class:"text-xs text-white/50 mt-0.5"},"Make visible to connected peers",-1))]),e("label",Tt,[ie(e("input",{type:"checkbox","onUpdate:modelValue":o[1]||(o[1]=m=>a.value=m)},null,512),[[he,a.value]]),o[12]||(o[12]=e("span",{class:"share-toggle-slider"},null,-1))])]),a.value?(l(),i("div",Pt,[o[18]||(o[18]=e("p",{class:"text-xs font-medium text-white/60 uppercase tracking-wider"},"Access Type",-1)),e("div",Ht,[e("button",{class:z(["share-access-option",{"share-access-option-active":r.value==="free"}]),onClick:o[2]||(o[2]=m=>r.value="free")},[...o[13]||(o[13]=[e("svg",{class:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M3.055 11H5a2 2 0 012 2v1a2 2 0 002 2 2 2 0 012 2v2.945M8 3.935V5.5A2.5 2.5 0 0010.5 8h.5a2 2 0 012 2 2 2 0 104 0 2 2 0 012-2h1.064M15 20.488V18a2 2 0 012-2h3.064M21 12a9 9 0 11-18 0 9 9 0 0118 0z"})],-1),e("span",{class:"text-sm font-medium"},"Free",-1),e("span",{class:"text-xs text-white/40"},"Open access",-1)])],2),e("button",{class:z(["share-access-option",{"share-access-option-active":r.value==="peers_only"}]),onClick:o[3]||(o[3]=m=>r.value="peers_only")},[...o[14]||(o[14]=[e("svg",{class:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 4.354a4 4 0 110 5.292M15 21H3v-1a6 6 0 0112 0v1zm0 0h6v-1a6 6 0 00-9-5.197M13 7a4 4 0 11-8 0 4 4 0 018 0z"})],-1),e("span",{class:"text-sm font-medium"},"Peers Only",-1),e("span",{class:"text-xs text-white/40"},"Authenticated",-1)])],2),e("button",{class:z(["share-access-option",{"share-access-option-active":r.value==="paid"}]),onClick:o[4]||(o[4]=m=>r.value="paid")},[...o[15]||(o[15]=[e("svg",{class:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M13 10V3L4 14h7v7l9-11h-7z"})],-1),e("span",{class:"text-sm font-medium"},"Paid",-1),e("span",{class:"text-xs text-white/40"},"Earn sats",-1)])],2)]),r.value==="paid"?(l(),i("div",Nt,[o[16]||(o[16]=e("div",{class:"share-price-icon"},[e("svg",{class:"w-4 h-4 text-orange-400",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M13 10V3L4 14h7v7l9-11h-7z"})])],-1)),ie(e("input",{"onUpdate:modelValue":o[5]||(o[5]=m=>u.value=m),type:"number",min:"1",max:"1000000",placeholder:"Price in sats",class:"share-price-input"},null,512),[[ge,u.value,void 0,{number:!0}]]),o[17]||(o[17]=e("span",{class:"share-price-unit"},"sats",-1))])):$("",!0)])):$("",!0),d.value?(l(),i("div",Ot,[...o[19]||(o[19]=[e("div",{class:"w-4 h-4 border-2 border-white/20 border-t-white/80 rounded-full animate-spin"},null,-1),e("span",{class:"text-sm text-white/60"},"Saving...",-1)])])):$("",!0),g.value?(l(),i("div",Rt,[e("span",Gt,M(g.value),1)])):$("",!0),y.value?(l(),i("div",Xt,[o[20]||(o[20]=e("svg",{class:"w-4 h-4 text-green-400",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M5 13l4 4L19 7"})],-1)),e("span",Yt,M(y.value),1)])):$("",!0),e("div",qt,[e("button",{class:"glass-button px-4 py-2 rounded-lg text-sm",onClick:o[6]||(o[6]=m=>B.$emit("close"))},"Cancel"),e("button",{class:"glass-button px-5 py-2 rounded-lg text-sm font-medium share-modal-save",disabled:d.value||a.value&&r.value==="paid"&&(!u.value||u.value<1),onClick:E},M(a.value?"Share":"Stop Sharing"),9,Jt)])])])]))}}),Qt={class:"cloud-folder-container flex flex-col h-full"},Wt={class:"shrink-0 mb-4"},Zt={class:"flex items-center justify-between"},_t={class:"flex items-center gap-4"},el=["d"],tl={class:"hidden md:block"},ll={class:"text-2xl font-bold text-white"},ol={class:"text-sm text-white/50"},sl={class:"flex gap-2"},il={key:0,class:"glass-card p-12 text-center flex-1 flex flex-col items-center justify-center"},nl={class:"text-xl font-semibold text-white mb-2"},al={class:"text-white/60 mb-4"},rl={key:0,class:"cloud-drop-overlay"},ul={key:1,class:"glass-card p-3 mb-3 flex items-center gap-3"},dl={key:2,class:"glass-card p-3 mb-3 flex items-center gap-3 border border-red-500/30"},cl={class:"text-sm text-red-400"},vl={key:3,class:"cloud-audio-player"},ml={key:0,class:"w-6 h-6",fill:"currentColor",viewBox:"0 0 24 24"},fl={key:1,class:"w-6 h-6",fill:"currentColor",viewBox:"0 0 24 24"},pl={class:"flex-1 min-w-0"},hl={key:0,class:"text-sm text-red-400 truncate"},gl={key:1,class:"text-sm font-medium text-white/90 truncate"},wl={class:"cloud-audio-progress"},kl={key:2,class:"flex-1 min-h-0 rounded-xl overflow-hidden border border-white/10"},xl={key:0,class:"flex items-center justify-center h-full"},bl={class:"glass-card p-8 flex flex-col items-center gap-4"},yl={class:"text-sm text-white/60"},$l=["src"],Bl=G({__name:"CloudFolder",setup(t){const f=$e(),s=Ce(),h=we(),a=ee(),r=b("grid"),u=ce(),d=b(!1),g=b(!1),y=k(()=>s.params.folderId),E={immich:["immich_server","immich-server"],nextcloud:["nextcloud-aio","nextcloud-server"]};function B(j){const n=h.packages;if(n[j]?.state==="running")return!0;const S=E[j];if(S){for(const W of S)if(n[W]?.state==="running")return!0}return!1}const o=k(()=>window.location.origin),m={photos:()=>({name:"Photos & Videos",description:"Auto-backup & browse your media",appId:"filebrowser",appLabel:"File Browser",iconPaths:["M4 16l4.586-4.586a2 2 0 012.828 0L16 16m-2-2l1.586-1.586a2 2 0 012.828 0L20 14m-6-6h.01M6 20h12a2 2 0 002-2V6a2 2 0 00-2-2H6a2 2 0 00-2 2v12a2 2 0 002 2z"],iconBg:"bg-blue-500/15",iconColor:"text-blue-400",iframeUrl:`${o.value}/app/immich/photos`,externalUrl:`${o.value}/app/filebrowser/`,nativeUI:!0,initialPath:"/Photos"}),music:()=>({name:"Music",description:"Your music collection",appId:"filebrowser",appLabel:"File Browser",iconPaths:["M9 19V6l12-3v13M9 19c0 1.105-1.343 2-3 2s-3-.895-3-2 1.343-2 3-2 3 .895 3 2zm12-3c0 1.105-1.343 2-3 2s-3-.895-3-2 1.343-2 3-2 3 .895 3 2zM9 10l12-3"],iconBg:"bg-orange-500/15",iconColor:"text-orange-400",iframeUrl:`${o.value}/app/nextcloud/apps/files/?dir=/Songs`,externalUrl:`${o.value}/app/filebrowser/`,nativeUI:!0,initialPath:"/Music"}),documents:()=>({name:"Documents",description:"Files, docs & spreadsheets",appId:"filebrowser",appLabel:"File Browser",iconPaths:["M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"],iconBg:"bg-green-500/15",iconColor:"text-green-400",iframeUrl:`${o.value}/app/nextcloud/apps/files/?dir=/Documents`,externalUrl:`${o.value}/app/filebrowser/`,nativeUI:!0,initialPath:"/Documents"}),files:()=>({name:"All Files",description:"Browse your server file system",appId:"filebrowser",appLabel:"File Browser",iconPaths:["M3 7v10a2 2 0 002 2h14a2 2 0 002-2V9a2 2 0 00-2-2h-6l-2-2H5a2 2 0 00-2 2z"],iconBg:"bg-white/10",iconColor:"text-white/70",iframeUrl:`${o.value}/app/filebrowser/`,externalUrl:`${o.value}/app/filebrowser/`,nativeUI:!0,initialPath:"/"})},C=k(()=>{const j=m[y.value];return j?j():null}),L=k(()=>C.value?B(C.value.appId):!1),c=k(()=>C.value?.nativeUI===!0&&L.value),v=k(()=>C.value?.iframeUrl||"");ke([c,C],async([j,n])=>{j&&n&&(a.reset(),await a.init()&&await a.navigate(n.initialPath))},{immediate:!0});const x=b(null);function U(j,n,S){x.value={path:j,name:n,isDir:S}}const T=b(null),R=b(!1);let A=null;function K(){A&&(clearTimeout(A),A=null),R.value=!0}function oe(){A&&clearTimeout(A),A=setTimeout(()=>{R.value=!1},100)}function w(j){R.value=!1,A&&(clearTimeout(A),A=null);const n=j.dataTransfer;n?.files?.length&&F(Array.from(n.files))}async function F(j){g.value=!0,T.value=null;try{for(const n of j)await a.uploadFile(n)}catch(n){T.value=n instanceof Error?n.message:"Upload failed"}finally{g.value=!1}}async function Q(j){await a.deleteItem(j)}function ve(j,n){const S=a.downloadUrl(j);u.play(S,n)}function me(){C.value&&window.open(C.value.externalUrl,"_blank","noopener,noreferrer")}function se(){f.push("/dashboard/cloud")}return(j,n)=>(l(),i("div",Qt,[e("div",Wt,[e("button",{onClick:se,class:"hidden md:flex mb-4 items-center gap-2 text-white/70 hover:text-white transition-colors"},[...n[10]||(n[10]=[e("svg",{class:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M15 19l-7-7 7-7"})],-1),Z(" Back to Cloud ",-1)])]),(l(),q(ae,{to:"body"},[e("button",{onClick:se,class:"md:hidden mobile-back-btn glass-button px-6 py-3 rounded-lg font-medium shadow-2xl flex items-center justify-center gap-2"},[...n[11]||(n[11]=[e("svg",{class:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M15 19l-7-7 7-7"})],-1),e("span",null,"Back to Cloud",-1)])])])),e("div",Zt,[e("div",_t,[e("div",{class:z(["flex-shrink-0 w-12 h-12 rounded-xl flex items-center justify-center",C.value?.iconBg||"bg-white/10"])},[(l(),i("svg",{class:z(["w-7 h-7",C.value?.iconColor||"text-white/70"]),fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[(l(!0),i(P,null,O(C.value?.iconPaths||[],(S,W)=>(l(),i("path",{key:W,"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:S},null,8,el))),128))],2))],2),e("div",tl,[e("h1",ll,M(C.value?.name||"Folder"),1),e("p",ol,M(C.value?.description),1)])]),e("div",sl,[L.value?(l(),i("button",{key:0,onClick:me,class:"glass-button px-4 py-2 rounded-lg text-sm font-medium flex items-center gap-2"},[...n[12]||(n[12]=[e("svg",{class:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14"})],-1),Z(" Open in New Tab ",-1)])])):$("",!0)])])]),L.value?c.value?(l(),i("div",{key:1,class:"flex-1 min-h-0 flex flex-col relative",onDragover:V(K,["prevent"]),onDragleave:oe,onDrop:V(w,["prevent"])},[R.value?(l(),i("div",rl,[...n[15]||(n[15]=[ne('

Drop files to upload

Files will be added to the current folder

',1)])])):$("",!0),g.value?(l(),i("div",ul,[...n[16]||(n[16]=[e("div",{class:"w-5 h-5 border-2 border-white/20 border-t-white/80 rounded-full animate-spin"},null,-1),e("span",{class:"text-sm text-white/70"},"Uploading...",-1)])])):$("",!0),T.value?(l(),i("div",dl,[e("span",cl,M(T.value),1),e("button",{class:"text-xs text-white/50 hover:text-white ml-auto",onClick:n[0]||(n[0]=S=>T.value=null)},"Dismiss")])):$("",!0),_(Ve,{breadcrumbs:p(a).breadcrumbs,"view-mode":r.value,onNavigate:n[1]||(n[1]=S=>p(a).navigate(S)),onRefresh:n[2]||(n[2]=S=>p(a).refresh()),onUpload:F,"onUpdate:viewMode":n[3]||(n[3]=S=>r.value=S)},null,8,["breadcrumbs","view-mode"]),_(zt,{items:p(a).sortedItems,loading:p(a).loading,"view-mode":r.value,onNavigate:n[4]||(n[4]=S=>p(a).navigate(S)),onDelete:Q,onPlay:ve,onShare:U},null,8,["items","loading","view-mode"]),p(u).currentName.value?(l(),i("div",vl,[e("button",{class:"cloud-audio-player-btn",onClick:n[5]||(n[5]=S=>p(u).playing.value?p(u).pause():p(u).play(p(u).currentSrc.value,p(u).currentName.value))},[p(u).playing.value?(l(),i("svg",fl,[...n[18]||(n[18]=[e("path",{d:"M6 4h4v16H6V4zm8 0h4v16h-4V4z"},null,-1)])])):(l(),i("svg",ml,[...n[17]||(n[17]=[e("path",{d:"M8 5v14l11-7L8 5z"},null,-1)])]))]),e("div",pl,[p(u).error.value?(l(),i("p",hl,M(p(u).error.value),1)):(l(),i("p",gl,M(p(u).currentName.value),1)),e("div",wl,[e("div",{class:"cloud-audio-progress-bar",style:ye({width:p(u).progress.value+"%"})},null,4)])]),e("button",{class:"cloud-audio-player-btn",onClick:n[6]||(n[6]=S=>p(u).stop())},[...n[19]||(n[19]=[e("svg",{class:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M6 18L18 6M6 6l12 12"})],-1)])])])):$("",!0)],32)):(l(),i("div",kl,[d.value?$("",!0):(l(),i("div",xl,[e("div",bl,[n[20]||(n[20]=e("div",{class:"w-8 h-8 border-2 border-white/20 border-t-white/80 rounded-full animate-spin"},null,-1)),e("p",yl,"Loading "+M(C.value?.appLabel)+"...",1)])])),L.value?(l(),i("iframe",{key:1,src:v.value,class:z(["w-full h-full border-0",{"opacity-0":!d.value}]),style:{"min-height":"500px"},onLoad:n[7]||(n[7]=S=>d.value=!0),sandbox:"allow-scripts allow-same-origin allow-forms allow-popups"},null,42,$l)):$("",!0)])):(l(),i("div",il,[n[14]||(n[14]=e("svg",{class:"w-20 h-20 text-white/15 mb-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 9v2m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"})],-1)),e("h3",nl,M(C.value?.appLabel)+" not running",1),e("p",al,"Install "+M(C.value?.appLabel)+" from the App Store to manage your "+M(C.value?.name?.toLowerCase())+".",1),_(p(be),{to:"/dashboard/marketplace",class:"glass-button inline-flex items-center gap-2 px-5 py-2.5 rounded-lg text-sm font-medium"},{default:xe(()=>[...n[13]||(n[13]=[Z(" Open App Store ",-1)])]),_:1})])),x.value?(l(),q(Kt,{key:3,filename:x.value.name,filepath:x.value.path,"is-dir":x.value.isDir,onClose:n[8]||(n[8]=S=>x.value=null),onSaved:n[9]||(n[9]=S=>x.value=null)},null,8,["filename","filepath","is-dir"])):$("",!0)]))}});export{Bl as default}; diff --git a/neode-ui/dist/assets/ControllerIndicator.vue_vue_type_script_setup_true_lang-DH-pMX35.js b/neode-ui/dist/assets/ControllerIndicator.vue_vue_type_script_setup_true_lang-DH-pMX35.js new file mode 100644 index 0000000..48f84da --- /dev/null +++ b/neode-ui/dist/assets/ControllerIndicator.vue_vue_type_script_setup_true_lang-DH-pMX35.js @@ -0,0 +1 @@ +import{d as t,a8 as o,E as n,c as s,N as c,G as i,q as l}from"./index-DnbYEqLr.js";const a={key:0,class:"flex items-center gap-2 px-3 py-2 rounded-lg bg-white/5 border border-white/10",title:"Controller connected - use arrows & Enter to navigate"},x=t({__name:"ControllerIndicator",setup(d){const r=o();return(h,e)=>n(r).isActive?(l(),s("div",a,[...e[0]||(e[0]=[c('',2)])])):i("",!0)}});export{x as _}; diff --git a/neode-ui/dist/assets/Credentials-BgvGHu_K.css b/neode-ui/dist/assets/Credentials-BgvGHu_K.css new file mode 100644 index 0000000..dacffe9 --- /dev/null +++ b/neode-ui/dist/assets/Credentials-BgvGHu_K.css @@ -0,0 +1 @@ +.credential-input[data-v-1283cbe7]{background:#ffffff0d;border:1px solid rgba(255,255,255,.15);border-radius:.5rem;padding:.5rem .75rem;color:#ffffffe6;font-size:.875rem;outline:none;transition:border-color .2s ease}.credential-input[data-v-1283cbe7]:focus{border-color:#ffffff4d}.credential-input[data-v-1283cbe7]::-moz-placeholder{color:#ffffff4d}.credential-input[data-v-1283cbe7]::placeholder{color:#ffffff4d}select.credential-input[data-v-1283cbe7]{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='rgba(255,255,255,0.5)' d='M6 8L1 3h10z'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right .75rem center;padding-right:2rem}select.credential-input option[data-v-1283cbe7]{background:#1a1a2e;color:#fff}textarea.credential-input[data-v-1283cbe7]{resize:vertical;min-height:4rem} diff --git a/neode-ui/dist/assets/Credentials-DP_VdhTb.js b/neode-ui/dist/assets/Credentials-DP_VdhTb.js new file mode 100644 index 0000000..dabc559 --- /dev/null +++ b/neode-ui/dist/assets/Credentials-DP_VdhTb.js @@ -0,0 +1 @@ +import{d as B,o as F,c as d,a as e,J as I,g as v,a3 as L,F as N,P as J,H as b,D as a,f,G as y,m as M,b as z,a1 as P,r,B as g,q as n,t as R}from"./index-DnbYEqLr.js";const q={class:"pb-6"},G={class:"mb-8"},H={class:"flex items-center gap-3 mb-2"},W={class:"glass-card p-6 mb-6"},Y={class:"space-y-4"},K={class:"grid grid-cols-1 md:grid-cols-2 gap-4"},Q=["value"],X=["disabled"],Z={class:"glass-card p-6 mb-6"},ee={class:"flex items-center justify-between mb-4"},te=["disabled"],se={key:0,class:"text-white/50 text-sm py-8 text-center"},le={key:1,class:"text-white/50 text-sm py-8 text-center"},ae={key:2,class:"space-y-3"},ie=["onClick"],oe={class:"flex items-center justify-between mb-2"},ne={class:"flex items-center gap-2"},de={class:"text-sm font-medium text-white"},re={class:"text-xs text-white/40 font-mono"},ue={class:"text-xs text-white/50 space-y-0.5"},ce={class:"font-mono"},ve={class:"font-mono"},pe={class:"glass-card p-6 mb-6"},xe={class:"space-y-4"},me={class:"flex items-center gap-4"},be=["disabled"],fe={key:0,class:"flex items-center gap-2"},ye={class:"relative glass-card p-6 max-w-2xl w-full max-h-[80vh] overflow-y-auto"},ge={class:"flex items-center justify-between mb-4"},we={class:"space-y-3 text-sm"},he={class:"bg-black/20 rounded-lg p-3"},ke={class:"text-white font-medium"},Ce={class:"bg-black/20 rounded-lg p-3"},_e={class:"text-white/80 font-mono text-xs break-all"},Ie={class:"bg-black/20 rounded-lg p-3"},De={class:"text-white/80 font-mono text-xs break-all"},je={class:"bg-black/20 rounded-lg p-3"},Ve={class:"text-white/80 font-mono text-xs break-all"},Se={key:0,class:"bg-black/20 rounded-lg p-3"},Ne={class:"text-white/80 font-mono text-xs whitespace-pre-wrap"},Je={class:"grid grid-cols-2 gap-3"},Te={class:"bg-black/20 rounded-lg p-3"},Ue={class:"text-white/80 text-xs"},Ee={class:"bg-black/20 rounded-lg p-3"},$e={class:"text-white/80 text-xs"},Oe={class:"bg-black/20 rounded-lg p-3"},Ae={class:"text-white/80 text-xs"},Be={class:"text-white/60 font-mono text-xs mt-1 break-all"},Fe={class:"bg-black/20 rounded-lg p-3"},Le={class:"flex gap-3 mt-6"},Me=["disabled"],ze=B({__name:"Credentials",setup(Pe){const D=r([]),w=r([]),p=r(!1),i=r(null),j=r(!1),h=r(!1),o=r({issuerId:"",subjectDid:"",type:"NodeOperator",claimsJson:"{}",expiresAt:""}),k=r(!1),x=r(""),C=r(!1),c=r(null),m=r(null);function u(s,t="success"){m.value={message:s,type:t},setTimeout(()=>{m.value=null},3e3)}function V(s){if(!s)return"N/A";try{return new Date(s).toLocaleString()}catch{return s}}function S(s){if(!s.type||s.type.length===0)return"Credential";const t=s.type.filter(l=>l!=="VerifiableCredential");return t.length>0?t[t.length-1]??"Credential":"VerifiableCredential"}function T(s){const t={...s};return delete t.id,JSON.stringify(t,null,2)}async function U(){try{const s=await g.call({method:"identity.list",params:{}});D.value=s.identities||[]}catch{D.value=[]}}async function _(){p.value=!0;try{const s=await g.call({method:"identity.list-credentials",params:{}});w.value=s.credentials||[]}catch(s){u(`Failed to load credentials: ${s instanceof Error?s.message:"Unknown error"}`,"error")}finally{p.value=!1}}async function E(){if(!o.value.issuerId||!o.value.subjectDid){u("Issuer identity and subject DID are required","error");return}let s;try{s=JSON.parse(o.value.claimsJson)}catch{u("Invalid JSON in claims field","error");return}k.value=!0;try{await g.call({method:"identity.issue-credential",params:{issuer_id:o.value.issuerId,subject_did:o.value.subjectDid,type:o.value.type||"VerifiableCredential",claims:s,expires_at:o.value.expiresAt||void 0}}),u("Credential issued successfully"),o.value.subjectDid="",o.value.claimsJson="{}",o.value.expiresAt="",await _()}catch(t){u(`Failed to issue credential: ${t instanceof Error?t.message:"Unknown error"}`,"error")}finally{k.value=!1}}async function $(){if(!x.value){u("Enter a credential ID to verify","error");return}C.value=!0,c.value=null;try{const s=await g.call({method:"identity.verify-credential",params:{id:x.value}});c.value=s.valid}catch(s){u(`Verification failed: ${s instanceof Error?s.message:"Unknown error"}`,"error"),c.value=!1}finally{C.value=!1}}async function O(){if(i.value){h.value=!0;try{await g.call({method:"identity.revoke-credential",params:{id:i.value.id}}),u("Credential revoked"),i.value=null,await _()}catch(s){u(`Failed to revoke: ${s instanceof Error?s.message:"Unknown error"}`,"error")}finally{h.value=!1}}}async function A(){if(!i.value)return;const s=JSON.stringify(i.value,null,2);try{await navigator.clipboard.writeText(s)}catch{const t=document.createElement("textarea");t.value=s,t.style.position="fixed",t.style.opacity="0",document.body.appendChild(t),t.select(),document.execCommand("copy"),document.body.removeChild(t)}j.value=!0,setTimeout(()=>{j.value=!1},2e3)}return F(async()=>{await Promise.all([U(),_()])}),(s,t)=>(n(),d("div",q,[e("div",G,[e("div",H,[e("button",{onClick:t[0]||(t[0]=l=>s.$router.push("/dashboard/web5")),class:"glass-button glass-button-sm px-3 py-1.5 text-sm"}," ← Back "),t[9]||(t[9]=e("h1",{class:"text-3xl font-bold text-white"},"Credentials",-1))]),t[10]||(t[10]=e("p",{class:"text-white/70"},"Issue, view, and verify W3C Verifiable Credentials",-1))]),e("div",W,[t[17]||(t[17]=e("h2",{class:"text-lg font-semibold text-white mb-4"},"Issue New Credential",-1)),e("div",Y,[e("div",K,[e("div",null,[t[12]||(t[12]=e("label",{class:"block text-sm text-white/70 mb-1"},[I("Issuer Identity "),e("span",{class:"text-red-400"},"*")],-1)),v(e("select",{"onUpdate:modelValue":t[1]||(t[1]=l=>o.value.issuerId=l),class:"credential-input w-full"},[t[11]||(t[11]=e("option",{value:"",disabled:""},"Select identity",-1)),(n(!0),d(N,null,J(D.value,l=>(n(),d("option",{key:l.id,value:l.id},a(l.name)+" ("+a(l.did?.slice(0,24))+"...) ",9,Q))),128))],512),[[L,o.value.issuerId]])]),e("div",null,[t[13]||(t[13]=e("label",{class:"block text-sm text-white/70 mb-1"},"Credential Type",-1)),v(e("input",{"onUpdate:modelValue":t[2]||(t[2]=l=>o.value.type=l),type:"text",placeholder:"e.g. NodeOperator",class:"credential-input w-full"},null,512),[[b,o.value.type]])])]),e("div",null,[t[14]||(t[14]=e("label",{class:"block text-sm text-white/70 mb-1"},[I("Subject DID "),e("span",{class:"text-red-400"},"*")],-1)),v(e("input",{"onUpdate:modelValue":t[3]||(t[3]=l=>o.value.subjectDid=l),type:"text",placeholder:"did:key:z6Mk...",class:"credential-input w-full font-mono text-sm"},null,512),[[b,o.value.subjectDid]])]),e("div",null,[t[15]||(t[15]=e("label",{class:"block text-sm text-white/70 mb-1"},"Claims (JSON)",-1)),v(e("textarea",{"onUpdate:modelValue":t[4]||(t[4]=l=>o.value.claimsJson=l),rows:"3",placeholder:'{"role": "admin", "level": "full"}',class:"credential-input w-full font-mono text-sm"},null,512),[[b,o.value.claimsJson]])]),e("div",null,[t[16]||(t[16]=e("label",{class:"block text-sm text-white/70 mb-1"},"Expiration (optional)",-1)),v(e("input",{"onUpdate:modelValue":t[5]||(t[5]=l=>o.value.expiresAt=l),type:"datetime-local",class:"credential-input w-full"},null,512),[[b,o.value.expiresAt]])]),e("button",{onClick:E,disabled:k.value||!o.value.issuerId||!o.value.subjectDid,class:"glass-button px-6 py-2 text-sm font-medium disabled:opacity-50 disabled:cursor-not-allowed"},a(k.value?"Issuing...":"Issue Credential"),9,X)])]),e("div",Z,[e("div",ee,[t[18]||(t[18]=e("h2",{class:"text-lg font-semibold text-white"},"Your Credentials",-1)),e("button",{onClick:_,disabled:p.value,class:"glass-button glass-button-sm px-3 py-1.5 text-xs"},a(p.value?"Loading...":"Refresh"),9,te)]),p.value&&w.value.length===0?(n(),d("div",se," Loading credentials... ")):w.value.length===0?(n(),d("div",le," No credentials yet. Issue one above or receive one from a peer. ")):(n(),d("div",ae,[(n(!0),d(N,null,J(w.value,l=>(n(),d("div",{key:l.id,class:"bg-black/20 rounded-xl border border-white/10 p-4 cursor-pointer hover:border-white/20 transition-colors",onClick:Re=>i.value=l},[e("div",oe,[e("div",ne,[e("span",de,a(S(l)),1),e("span",{class:f(["px-2 py-0.5 rounded text-xs font-medium",l.status==="revoked"?"bg-red-500/20 text-red-400":"bg-green-500/20 text-green-400"])},a(l.status),3)]),e("span",re,a(l.id?.slice(0,20))+"...",1)]),e("div",ue,[e("p",null,[t[19]||(t[19]=I("Issuer: ",-1)),e("span",ce,a(l.issuer?.slice(0,32))+"...",1)]),e("p",null,[t[20]||(t[20]=I("Subject: ",-1)),e("span",ve,a(l.credentialSubject?.id?.slice(0,32))+"...",1)]),e("p",null,"Issued: "+a(V(l.issuanceDate)),1)])],8,ie))),128))]))]),e("div",pe,[t[22]||(t[22]=e("h2",{class:"text-lg font-semibold text-white mb-4"},"Verify Credential",-1)),e("div",xe,[e("div",null,[t[21]||(t[21]=e("label",{class:"block text-sm text-white/70 mb-1"},"Credential ID",-1)),v(e("input",{"onUpdate:modelValue":t[6]||(t[6]=l=>x.value=l),type:"text",placeholder:"urn:uuid:...",class:"credential-input w-full font-mono text-sm"},null,512),[[b,x.value]])]),e("div",me,[e("button",{onClick:$,disabled:C.value||!x.value,class:"glass-button px-6 py-2 text-sm font-medium disabled:opacity-50 disabled:cursor-not-allowed"},a(C.value?"Verifying...":"Verify"),9,be),c.value!==null?(n(),d("div",fe,[e("div",{class:f(["w-3 h-3 rounded-full",c.value?"bg-green-400":"bg-red-400"])},null,2),e("span",{class:f(["text-sm",c.value?"text-green-400":"text-red-400"])},a(c.value?"Valid":"Invalid"),3)])):y("",!0)])])]),(n(),M(P,{to:"body"},[i.value?(n(),d("div",{key:0,class:"fixed inset-0 z-50 flex items-center justify-center p-4",onClick:t[8]||(t[8]=z(l=>i.value=null,["self"]))},[t[33]||(t[33]=e("div",{class:"fixed inset-0 bg-black/10 backdrop-blur-md"},null,-1)),e("div",ye,[e("div",ge,[t[23]||(t[23]=e("h3",{class:"text-lg font-semibold text-white"},"Credential Details",-1)),e("button",{onClick:t[7]||(t[7]=l=>i.value=null),class:"text-white/60 hover:text-white text-xl"},"✕")]),e("div",we,[e("div",he,[t[24]||(t[24]=e("p",{class:"text-white/50 text-xs mb-1"},"Type",-1)),e("p",ke,a(S(i.value)),1)]),e("div",Ce,[t[25]||(t[25]=e("p",{class:"text-white/50 text-xs mb-1"},"ID",-1)),e("p",_e,a(i.value.id),1)]),e("div",Ie,[t[26]||(t[26]=e("p",{class:"text-white/50 text-xs mb-1"},"Issuer",-1)),e("p",De,a(i.value.issuer),1)]),e("div",je,[t[27]||(t[27]=e("p",{class:"text-white/50 text-xs mb-1"},"Subject",-1)),e("p",Ve,a(i.value.credentialSubject?.id),1)]),i.value.credentialSubject?(n(),d("div",Se,[t[28]||(t[28]=e("p",{class:"text-white/50 text-xs mb-1"},"Claims",-1)),e("pre",Ne,a(T(i.value.credentialSubject)),1)])):y("",!0),e("div",Je,[e("div",Te,[t[29]||(t[29]=e("p",{class:"text-white/50 text-xs mb-1"},"Issued",-1)),e("p",Ue,a(V(i.value.issuanceDate)),1)]),e("div",Ee,[t[30]||(t[30]=e("p",{class:"text-white/50 text-xs mb-1"},"Expires",-1)),e("p",$e,a(i.value.expirationDate?V(i.value.expirationDate):"Never"),1)])]),e("div",Oe,[t[31]||(t[31]=e("p",{class:"text-white/50 text-xs mb-1"},"Proof",-1)),e("p",Ae,a(i.value.proof?.type)+" — "+a(i.value.proof?.proofPurpose),1),e("p",Be,a(i.value.proof?.proofValue),1)]),e("div",Fe,[t[32]||(t[32]=e("p",{class:"text-white/50 text-xs mb-1"},"Status",-1)),e("span",{class:f(["px-2 py-0.5 rounded text-xs font-medium",i.value.status==="revoked"?"bg-red-500/20 text-red-400":"bg-green-500/20 text-green-400"])},a(i.value.status),3)])]),e("div",Le,[e("button",{onClick:A,class:"glass-button px-4 py-2 text-sm"},a(j.value?"Copied!":"Copy JSON"),1),i.value.status!=="revoked"?(n(),d("button",{key:0,onClick:O,disabled:h.value,class:"glass-button px-4 py-2 text-sm text-red-400 hover:text-red-300"},a(h.value?"Revoking...":"Revoke"),9,Me)):y("",!0)])])])):y("",!0)])),m.value?(n(),d("div",{key:0,class:f(["fixed bottom-20 left-1/2 -translate-x-1/2 z-50 px-6 py-3 rounded-xl text-sm font-medium shadow-lg",m.value.type==="error"?"bg-red-500/90 text-white":"bg-green-500/90 text-white"])},a(m.value.message),3)):y("",!0)]))}}),Ge=R(ze,[["__scopeId","data-v-1283cbe7"]]);export{Ge as default}; diff --git a/neode-ui/dist/assets/Dashboard-Byxe5sIJ.js b/neode-ui/dist/assets/Dashboard-Byxe5sIJ.js new file mode 100644 index 0000000..d4cff2a --- /dev/null +++ b/neode-ui/dist/assets/Dashboard-Byxe5sIJ.js @@ -0,0 +1 @@ +import{d as ae,R as Qe,c as l,a as t,q as i,S as Ce,D as m,F as R,P as L,j as h,f as d,E as s,x as Me,y as Xe,z as Ye,Q as et,r as b,w as te,o as tt,A as at,n as A,G as _,g as st,v as ot,h as g,C as nt,i as M,U as j,V as it,T as ye,u as lt,m as F,J as K,p as _e,W as rt,X as dt}from"./index-DnbYEqLr.js";import ct from"./AppSession-Cw_auYBr.js";import{u as pt}from"./loginTransition-Bm4PAghQ.js";import{_ as ut}from"./ControllerIndicator.vue_vue_type_script_setup_true_lang-DH-pMX35.js";import{u as ht}from"./web5Badge-C9_VaejO.js";import{u as bt}from"./mesh-DgF5cqYW.js";const vt=ae({__name:"OnlineStatusPill",setup(q){const k=Qe();function T(){k.open()}return(B,x)=>(i(),l("button",{type:"button","data-controller-ignore":"",class:"w-full flex items-center gap-2 text-white/80 hover:text-white transition-colors",title:"Open CLI (F)",onClick:T},[...x[0]||(x[0]=[t("div",{class:"relative shrink-0"},[t("div",{class:"w-2 h-2 rounded-full bg-green-400"}),t("div",{class:"absolute inset-0 w-2 h-2 rounded-full bg-green-400 animate-ping opacity-50"})],-1),t("span",{class:"text-xs font-medium"},"Online",-1)])]))}}),ft={class:"text-xs font-medium"},gt={key:1,class:"mode-switcher mode-switcher-full"},mt=["onClick"],wt=ae({__name:"ModeSwitcher",props:{compact:{type:Boolean}},setup(q){const k=Ce(),T=Me(),B=[{id:"easy",label:"Easy"},{id:"gamer",label:"Pro"}],x=h(()=>{const c=B.find(w=>w.id===k.mode);return c?c.label:"Pro"});function n(){const c=k.cycleMode();T.push(c==="chat"?"/dashboard/chat":"/dashboard")}return(c,w)=>q.compact?(i(),l("div",{key:0,class:"chat-mode-pill-inner",onClick:n},[w[0]||(w[0]=t("svg",{class:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[t("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M4 6h16M4 12h16M4 18h16"})],-1)),t("span",ft,m(x.value),1)])):(i(),l("div",gt,[(i(),l(R,null,L(B,y=>t("button",{key:y.id,onClick:D=>s(k).setMode(y.id),class:d(["mode-switcher-btn",{"mode-switcher-btn-active":s(k).mode===y.id}])},m(y.label),11,mt)),64))]))}}),kt={href:"#main-content",class:"skip-to-content"},xt={class:"bg-perspective-container"},yt={key:0,class:"fixed inset-0 pointer-events-none z-[100] oomph-flash","aria-hidden":"true"},_t={key:1,class:"fixed inset-0 pointer-events-none z-[99] reveal-flash-glitch","aria-hidden":"true"},Ct={class:"sidebar-shell"},Mt={class:"sidebar-inner flex flex-col min-h-full"},Tt={class:"sidebar-logo flex items-center gap-3 mb-8 p-6 pb-0 shrink-0"},At={class:"min-w-0 flex-1"},Rt={class:"text-lg font-semibold text-white truncate"},Lt={class:"text-xs text-white/60"},zt=["aria-label"],St={class:"w-5 h-5","aria-hidden":"true",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},It=["d"],Wt={key:0,class:"ml-auto w-5 h-5 flex items-center justify-center rounded-full bg-orange-500 text-white text-[10px] font-bold"},jt={key:1,class:"ml-auto w-5 h-5 flex items-center justify-center rounded-full bg-orange-500 text-white text-[10px] font-bold"},Bt={class:"w-5 h-5","aria-hidden":"true",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},Nt=["d"],Dt={class:"sidebar-controller px-6 pb-2 shrink-0"},$t={class:"px-6 pb-2 shrink-0"},Ht={class:"rounded-lg bg-white/5 border border-white/10 px-4 py-2.5"},Ot={class:"px-6 pb-6 shrink-0"},Pt={key:0,class:"path-option-card mx-6 mt-6 px-6 py-3 border-l-4 border-yellow-500"},Et={class:"flex items-center gap-2 text-yellow-200"},Vt={class:"font-medium"},Ut={key:1,class:"path-option-card mx-6 mt-6 px-6 py-3 border-l-4 border-blue-500"},Ft={class:"glass-card p-2 rounded-lg flex gap-2 relative"},Kt={class:"glass-card p-2 rounded-lg flex gap-2 relative"},qt={class:"perspective-container"},Gt={key:0,class:"h-full"},Jt={key:0,class:"app-panel-container"},Zt=["aria-label"],Qt={class:"flex justify-around items-center px-2 py-3 relative"},Xt={class:"w-6 h-6 transition-all duration-300","aria-hidden":"true",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},Yt=["d"],ea={class:"text-[10px] leading-tight"},ta={class:"w-6 h-6",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},aa=["d"],sa={key:2,class:"fixed top-4 right-4 z-[200] flex flex-col gap-2 max-w-sm"},oa={class:"flex items-start gap-2"},na={class:"flex-1 min-w-0"},ia={class:"text-sm font-medium text-white"},la={class:"text-xs text-white/60 mt-0.5"},ra=["onClick"],va=ae({__name:"Dashboard",setup(q){const{t:k}=Xe(),T=Ce(),B=h(()=>n.path==="/dashboard/chat"),x=Me(),n=lt(),c=Ye(),w=et(),y=pt(),D=ht(),se=bt(),f=b(!1),G=[];function C(o,e){const a=setTimeout(o,e);return G.push(a),a}function $(o){return o.includes("/apps/")&&!o.endsWith("/apps")||o.includes("/marketplace/")&&!o.endsWith("/marketplace")}const H=b(!1),Te=h(()=>n.path==="/dashboard"||n.path==="/dashboard/"),z=b(!1),Ae={"/dashboard":"bg-home.jpg","/dashboard/":"bg-home.jpg","/dashboard/apps":"bg-myapps.jpg","/dashboard/marketplace":"bg-appstore.jpg","/dashboard/cloud":"bg-cloud.jpg","/dashboard/mesh":"bg-mesh.jpg","/dashboard/server":"bg-network.jpg","/dashboard/web5":"bg-web5.jpg","/dashboard/settings":"bg-settings.jpg","/dashboard/chat":"bg-home.jpg"},J=h(()=>$(n.path)?"bg-intro.jpg":Ae[n.path]||"bg-home.jpg"),oe=h(()=>{const o=n.path;return o.includes("/dashboard/web5")||o.includes("/dashboard/server")||o.includes("/dashboard/settings")||o.includes("/dashboard/apps")&&!$(o)||o.includes("/dashboard/marketplace")||o.includes("/dashboard/cloud")}),ne=b(oe.value);let S=null;te(oe,o=>{S&&(clearTimeout(S),S=null),o?ne.value=!0:S=C(()=>{ne.value=!1},450)});const Z=b(null),ie=b(null),le=b(null),re=b(0),de=b(0),ce=b(null),pe=b(null),ue=b(0),he=b(0);te(()=>n.path,o=>{const e=$(o),a=H.value;H.value=e,e&&!a&&C(()=>{z.value=!0,C(()=>{z.value=!1},375)},500)});const Re=h(()=>$(n.path)),O=h(()=>typeof window>"u"||window.innerWidth>=768?!1:n.path.includes("/apps")||n.path.includes("/marketplace")),Q=h(()=>typeof window>"u"||window.innerWidth>=768||n.name==="cloud-folder"?!1:n.path.includes("/server")||n.path.includes("/cloud")),be=h(()=>typeof window>"u"||window.innerWidth>=768?0:O.value&&Q.value?160:O.value||Q.value?80:0);function Le(){if(!(typeof window>"u")&&Z.value){const o=Z.value.offsetHeight;document.documentElement.style.setProperty("--mobile-tab-bar-height",`${o}px`)}}function ve(){if(typeof window>"u"||window.innerWidth>=768)return;const e=n.path==="/dashboard/apps"||n.path.startsWith("/dashboard/apps/")?ie.value:le.value;if(!e)return;const a=e.parentElement;if(!a)return;const r=a.getBoundingClientRect(),v=e.getBoundingClientRect();re.value=v.left-r.left,de.value=v.width}function fe(){if(typeof window>"u"||window.innerWidth>=768)return;const e=n.path==="/dashboard/cloud"||n.path.startsWith("/dashboard/cloud/")?pe.value:ce.value;if(!e)return;const a=e.parentElement;if(!a)return;const r=a.getBoundingClientRect(),v=e.getBoundingClientRect();ue.value=v.left-r.left,he.value=v.width}function X(){Le(),ve(),fe()}tt(()=>{if(document.body.classList.add("dashboard-active"),y.justLoggedIn){rt(),f.value=!0,y.setPendingWelcomeTyping(!0),y.setJustLoggedIn(!1);const o=()=>{z.value=!0,C(()=>{z.value=!1},380)};C(o,500),C(o,1200),C(o,2e3),C(()=>{f.value=!1},8e3),C(()=>{y.setStartWelcomeTyping(!0),y.setPendingWelcomeTyping(!1)},4e3)}X(),window.addEventListener("resize",X),window.addEventListener("keydown",ge),D.refresh()}),at(()=>{document.body.classList.remove("dashboard-active"),window.removeEventListener("resize",X),window.removeEventListener("keydown",ge);for(const o of G)clearTimeout(o);G.length=0,S&&(clearTimeout(S),S=null)});function ze(){try{return localStorage.getItem("kiosk")==="true"||new URLSearchParams(window.location.search).has("kiosk")}catch{return!1}}function ge(o){ze()&&o.ctrlKey&&o.shiftKey&&(o.key==="R"||o.key==="r"?(o.preventDefault(),x.push("/recovery")):o.key==="H"||o.key==="h"?(o.preventDefault(),x.push("/dashboard")):(o.key==="Q"||o.key==="q")&&(o.preventDefault(),confirm("Reboot the server?")&&fetch("/rpc/",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({method:"system.reboot"})}).catch(()=>{})))}te(()=>n.path,()=>{dt(()=>{ve(),fe()})});const Se=h(()=>c.serverName),Ie=h(()=>c.serverInfo?.version||"0.0.0"),We=h(()=>c.isOffline),je=h(()=>c.isRestarting),Be=h(()=>c.isShuttingDown),Ne=[{path:"/dashboard",label:"Home",icon:"home"},{path:"/dashboard/apps",label:"Apps",icon:"apps",isCombined:!0},{path:"/dashboard/cloud",label:"Cloud",icon:"cloud"},{path:"/dashboard/mesh",label:"Mesh",icon:"mesh"},{path:"/dashboard/server",label:"Network",icon:"server"},{path:"/dashboard/web5",label:"Web5",icon:"web5"},{path:"/dashboard/settings",label:"Settings",icon:"settings"}],De=[{path:"/dashboard",label:"Home",icon:"home"},{path:"/dashboard/apps",label:"My Apps",icon:"apps"},{path:"/dashboard/cloud",label:"Cloud",icon:"cloud"},{path:"/dashboard/settings",label:"Settings",icon:"settings"}],$e=[{path:"/dashboard",label:"Home",icon:"home"},{path:"/dashboard/apps",label:"My Apps",icon:"apps"},{path:"/dashboard/settings",label:"Settings",icon:"settings"}],He=h(()=>T.isEasy?De:T.isChat?$e:Ne),Oe=[{path:"/dashboard",label:"Home",icon:"home"},{path:"/dashboard/apps",label:"Apps",icon:"apps",isCombined:!0},{path:"/dashboard/cloud",label:"Network",icon:"server",isCombined:!0},{path:"/dashboard/settings",label:"Settings",icon:"settings"}],Pe=[{path:"/dashboard",label:"Home",icon:"home"},{path:"/dashboard/apps",label:"Apps",icon:"apps"},{path:"/dashboard/cloud",label:"Cloud",icon:"cloud"},{path:"/dashboard/settings",label:"Settings",icon:"settings"}],Ee=[{path:"/dashboard",label:"Home",icon:"home"},{path:"/dashboard/apps",label:"Apps",icon:"apps"},{path:"/dashboard/settings",label:"Settings",icon:"settings"}],Ve=h(()=>T.isEasy?Pe:T.isChat?Ee:Oe);function P(o){return{home:["M3 12l2-2m0 0l7-7 7 7M5 10v10a1 1 0 001 1h3m10-11l2 2m-2-2v10a1 1 0 01-1 1h-3m-6 0a1 1 0 001-1v-4a1 1 0 011-1h2a1 1 0 011 1v4a1 1 0 001 1m-6 0h6"],apps:["M4 6a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2H6a2 2 0 01-2-2V6zM14 6a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2h-2a2 2 0 01-2-2V6zM4 16a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2H6a2 2 0 01-2-2v-2zM14 16a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2h-2a2 2 0 01-2-2v-2z"],marketplace:["M16 11V7a4 4 0 00-8 0v4M5 9h14l1 12H4L5 9z"],cloud:["M3 15a4 4 0 004 4h9a5 5 0 10-.1-9.999 5.002 5.002 0 10-9.78 2.096A4.001 4.001 0 003 15z"],server:["M5 12h14M5 12a2 2 0 01-2-2V6a2 2 0 012-2h14a2 2 0 012 2v4a2 2 0 01-2 2M5 12a2 2 0 00-2 2v4a2 2 0 002 2h14a2 2 0 002-2v-4a2 2 0 00-2-2m-2-4h.01M17 16h.01"],web5:["M21 12a9 9 0 01-9 9m9-9a9 9 0 00-9-9m9 9H3m9 9a9 9 0 01-9-9m9 9c1.657 0 3-4.03 3-9s-1.343-9-3-9m0 18c-1.657 0-3-4.03-3-9s1.343-9 3-9m-9 9a9 9 0 019-9"],mesh:["M8.111 16.404a5.5 5.5 0 017.778 0M12 20h.01M5.636 13.636a9 9 0 0112.728 0M1.5 10.5a14 14 0 0121 0"],chat:["M8 12h.01M12 12h.01M16 12h.01M21 12c0 4.418-4.03 8-9 8a9.863 9.863 0 01-4.255-.949L3 20l1.395-3.72C3.512 15.042 3 13.574 3 12c0-4.418 4.03-8 9-8s9 3.582 9 8z"],settings:["M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z","M15 12a3 3 0 11-6 0 3 3 0 016 0z"]}[o]||[]}async function Ue(){try{await c.logout()}catch{}x.push("/login").catch(()=>{window.location.href="/login"})}let p="";const E=["/dashboard","/dashboard/apps","/dashboard/marketplace","/dashboard/cloud","/dashboard/mesh","/dashboard/server","/dashboard/web5","/dashboard/chat","/dashboard/settings"];function Fe(o){const e=o.path;if(!p)return p=e,"fade";const a=e==="/dashboard/chat",r=p==="/dashboard/chat";if(a)return p=e,"chat-open";if(r)return p=e,"chat-close";const v=e.includes("/apps/")&&!e.endsWith("/apps"),N=e==="/dashboard/apps",we=p.includes("/apps/")&&!p.endsWith("/apps"),ee=p==="/dashboard/apps",qe=e.includes("/marketplace/")&&!e.endsWith("/marketplace"),V=e==="/dashboard/marketplace",Ge=p.includes("/marketplace/")&&!p.endsWith("/marketplace"),U=p==="/dashboard/marketplace",Je=e.includes("/cloud/")&&!e.endsWith("/cloud"),ke=e==="/dashboard/cloud",Ze=p.includes("/cloud/")&&!p.endsWith("/cloud"),xe=p==="/dashboard/cloud";let u="fade";if(typeof window<"u"&&window.innerWidth<768)if(U&&N)u="slide-right";else if(ee&&V)u="slide-left";else if(p==="/dashboard/server"&&ke)u="slide-right";else if(xe&&e==="/dashboard/server")u="slide-left";else{const I=E.indexOf(e),W=E.indexOf(p);I!==-1&&W!==-1&&I!==W&&(I>W?u="slide-down":u="slide-up")}else if(ee&&v)u="depth-forward";else if(we&&N)u="depth-back";else if(U&&qe)u="depth-forward";else if(Ge&&V)u="depth-back";else if(xe&&Je)u="depth-forward";else if(Ze&&ke)u="depth-back";else if(U&&v)u="depth-forward";else if(we&&V)u="depth-back";else if(ee&&V||U&&N)u="fade";else{const I=E.indexOf(e),W=E.indexOf(p);I!==-1&&W!==-1&&I!==W&&(I>W?u="slide-down":u="slide-up")}return p=e,u}const Y=b(new Set),me=h(()=>{const e=(c.data?.notifications??[]).filter(r=>!Y.value.has(r.id)),a=new Map;for(const r of e)a.set(r.title,r);return[...a.values()].slice(-3)});function Ke(o){const e=(c.data?.notifications??[]).find(a=>a.id===o);if(e)for(const a of c.data?.notifications??[])a.title===e.title&&Y.value.add(a.id);Y.value.add(o)}return(o,e)=>(i(),l("div",{class:d(["min-h-screen flex relative dashboard-view",{"glass-throw-active":f.value}])},[t("a",kt,m(s(k)("common.skipToContent")),1),t("div",xt,[t("div",{ref:"bgDefault",class:d(["bg-layer bg-fullwidth",[{"bg-transitioning-out":H.value},{"zoom-reveal-bg":f.value}]]),style:A({backgroundImage:`url(/assets/img/${J.value})`})},null,6),t("div",{ref:"bgAlt",class:d(["bg-layer bg-fullwidth",{"bg-transitioning-in":H.value}]),style:{"background-image":"url(/assets/img/bg-intro-3.jpg)"}},null,2),t("div",{class:d(["bg-glitch-layer-1",{"glitch-active":z.value}]),style:A({backgroundImage:`url(/assets/img/${J.value})`})},null,6),t("div",{class:d(["bg-glitch-layer-2",{"glitch-active":z.value}]),style:A({backgroundImage:`url(/assets/img/${J.value})`})},null,6),t("div",{class:d(["bg-glitch-scan",{"glitch-active":z.value}])},null,2)]),f.value?(i(),l("div",yt)):_("",!0),f.value?(i(),l("div",_t)):_("",!0),e[18]||(e[18]=t("div",{class:"fixed inset-0 pointer-events-none bg-black/20",style:{"z-index":"-5"}},null,-1)),st(t("aside",{"data-controller-zone":"sidebar",class:d(["hidden md:flex w-[256px] flex-shrink-0 relative flex-col z-10",{"sidebar-animate":f.value}])},[t("div",Ct,[t("div",Mt,[t("div",Tt,[g(nt),t("div",At,[t("h2",Rt,m(Se.value),1),t("p",Lt,"v"+m(Ie.value),1)])]),t("nav",{class:"sidebar-nav flex-1 min-h-0 space-y-2 p-6 pt-4","aria-label":s(k)("dashboard.mainNav")},[(i(!0),l(R,null,L(He.value,(a,r)=>(i(),F(s(j),{key:a.path,to:a.path,class:d(["sidebar-nav-item flex items-center gap-3 px-4 py-3 rounded-lg text-white/80 hover:bg-white/10 hover:text-white transition-colors",{"nav-tab-active":a.isCombined&&(s(n).path.includes("/apps")||s(n).path.includes("/marketplace")||s(n).path.includes("/app-session")||a.path==="/dashboard/apps"&&!!s(w).panelAppId)}]),"exact-active-class":a.isCombined?void 0:"nav-tab-active",onClick:e[0]||(e[0]=v=>s(w).closePanel()),style:A({"--nav-stagger":r})},{default:M(()=>[(i(),l("svg",St,[(i(!0),l(R,null,L(P(a.icon),(v,N)=>(i(),l("path",{key:N,"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:v},null,8,It))),128))])),t("span",null,m(a.label),1),a.path==="/dashboard/web5"&&s(D).pendingRequestCount>0?(i(),l("span",Wt,m(s(D).pendingRequestCount),1)):_("",!0),a.path==="/dashboard/mesh"&&s(se).totalUnread>0?(i(),l("span",jt,m(s(se).totalUnread),1)):_("",!0)]),_:2},1032,["to","class","exact-active-class","style"]))),128)),t("button",{onClick:e[1]||(e[1]=a=>s(x).push("/dashboard/chat")),class:"chat-launcher-btn w-full flex items-center gap-3 px-4 py-3 rounded-lg transition-all duration-300"},[(i(),l("svg",Bt,[(i(!0),l(R,null,L(P("chat"),(a,r)=>(i(),l("path",{key:r,"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:a},null,8,Nt))),128))])),e[5]||(e[5]=t("span",null,"AIUI",-1))]),t("button",{onClick:Ue,class:"sidebar-logout-btn w-full flex items-center gap-3 px-4 py-3 rounded-lg text-white/80 hover:bg-white/10 hover:text-white transition-colors"},[...e[6]||(e[6]=[t("svg",{class:"w-5 h-5","aria-hidden":"true",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[t("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M17 16l4-4m0 0l-4-4m4 4H7m6 4v1a3 3 0 01-3 3H6a3 3 0 01-3-3V7a3 3 0 013-3h4a3 3 0 013 3v1"})],-1),t("span",null,"Logout",-1)])])],8,zt),t("div",Dt,[g(ut)]),t("div",$t,[t("div",Ht,[g(vt)])]),t("div",Ot,[g(wt)])])])],2),[[ot,!B.value]]),t("main",{id:"main-content","data-controller-zone":"main",class:d(["flex-1 overflow-hidden relative pb-0 glass-piece z-10",{"glass-throw-main":f.value}])},[e[14]||(e[14]=t("div",{"data-controller-main-entry":"",class:"absolute top-4 right-4 md:top-6 md:right-8 z-20"},null,-1)),We.value&&!s(c).isReconnecting&&s(c).isAuthenticated?(i(),l("div",Pt,[t("div",Et,[e[7]||(e[7]=t("svg",{class:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[t("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z"})],-1)),t("span",Vt,m(je.value?"Server is restarting...":Be.value?"Server is shutting down...":"Connection lost"),1)])])):_("",!0),s(c).isReconnecting&&s(c).isAuthenticated?(i(),l("div",Ut,[...e[8]||(e[8]=[t("div",{class:"flex items-center gap-2 text-blue-200"},[t("svg",{class:"w-5 h-5 animate-spin",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[t("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15"})]),t("span",{class:"font-medium"},"Reconnecting...")],-1)])])):_("",!0),O.value?(i(),l("div",{key:2,class:d(["md:hidden fixed top-0 left-0 right-0 z-40 px-4 pt-4 pb-2 glass-piece",{"glass-throw-mobile-tabs":f.value}]),style:{background:"rgba(0, 0, 0, 0.25)","backdrop-filter":"blur(18px)","-webkit-backdrop-filter":"blur(18px)",transform:"translateZ(0)"}},[t("div",Ft,[t("div",{class:"absolute top-2 bottom-2 rounded-lg bg-white/20 transition-all duration-300 ease-out",style:A({left:`${re.value}px`,width:`${de.value}px`})},null,4),g(s(j),{ref_key:"appsTabRef",ref:ie,to:"/dashboard/apps",class:d(["flex-1 px-4 py-2 rounded-lg font-medium transition-all duration-300 text-center relative z-10",{"bg-white/20 text-white":s(n).path==="/dashboard/apps"||s(n).path.startsWith("/dashboard/apps/"),"text-white/60 hover:text-white/80":!(s(n).path==="/dashboard/apps"||s(n).path.startsWith("/dashboard/apps/"))}])},{default:M(()=>[...e[9]||(e[9]=[K(" My Apps ",-1)])]),_:1},8,["class"]),g(s(j),{ref_key:"marketplaceTabRef",ref:le,to:"/dashboard/marketplace",class:d(["flex-1 px-4 py-2 rounded-lg font-medium transition-all duration-300 text-center relative z-10",{"bg-white/20 text-white":s(n).path==="/dashboard/marketplace"||s(n).path.startsWith("/dashboard/marketplace/"),"text-white/60 hover:text-white/80":!(s(n).path==="/dashboard/marketplace"||s(n).path.startsWith("/dashboard/marketplace/"))}])},{default:M(()=>[...e[10]||(e[10]=[K(" App Store ",-1)])]),_:1},8,["class"])])],2)):_("",!0),Q.value?(i(),l("div",{key:3,class:d(["md:hidden fixed top-0 left-0 right-0 z-40 px-4 pt-4 pb-2 glass-piece",{"glass-throw-mobile-tabs-2":f.value}]),style:A([{background:"rgba(0, 0, 0, 0.25)","backdrop-filter":"blur(18px)","-webkit-backdrop-filter":"blur(18px)",transform:"translateZ(0)"},{top:O.value?"80px":"0"}])},[t("div",Kt,[t("div",{class:"absolute top-2 bottom-2 rounded-lg bg-white/20 transition-all duration-300 ease-out",style:A({left:`${ue.value}px`,width:`${he.value}px`})},null,4),g(s(j),{ref_key:"cloudTabRef",ref:pe,to:"/dashboard/cloud",class:d(["flex-1 px-4 py-2 rounded-lg font-medium transition-all duration-300 text-center relative z-10",{"bg-white/20 text-white":s(n).path==="/dashboard/cloud"||s(n).path.startsWith("/dashboard/cloud/"),"text-white/60 hover:text-white/80":!(s(n).path==="/dashboard/cloud"||s(n).path.startsWith("/dashboard/cloud/"))}])},{default:M(()=>[...e[11]||(e[11]=[K(" Cloud ",-1)])]),_:1},8,["class"]),g(s(j),{ref_key:"serverTabRef",ref:ce,to:"/dashboard/server",class:d(["flex-1 px-4 py-2 rounded-lg font-medium transition-all duration-300 text-center relative z-10",{"bg-white/20 text-white":s(n).path==="/dashboard/server"||s(n).path.startsWith("/dashboard/server/"),"text-white/60 hover:text-white/80":!(s(n).path==="/dashboard/server"||s(n).path.startsWith("/dashboard/server/"))}])},{default:M(()=>[...e[12]||(e[12]=[K(" Network ",-1)])]),_:1},8,["class"])])],6)):_("",!0),t("div",{class:d(["perspective-container-wrapper glass-piece",{"glass-throw-content":f.value&&!Te.value}])},[t("div",qt,[g(s(it),null,{default:M(({Component:a,route:r})=>[g(ye,{name:Fe(r)},{default:M(()=>[(i(),l("div",{key:r.path,class:"view-wrapper"},[r.path==="/dashboard/chat"?(i(),l("div",Gt,[(i(),F(_e(a)))])):(i(),l("div",{key:1,class:d(["absolute inset-0 px-4 pt-4 md:pt-8 md:px-8 overflow-y-auto",Re.value?"mobile-scroll-pad-back":"mobile-scroll-pad"]),style:A(be.value?{paddingTop:be.value+16+"px"}:void 0)},[(i(),F(_e(a),{class:"view-container flex-none"})),e[13]||(e[13]=t("div",{class:"shrink-0 h-6 md:h-12","aria-hidden":"true"},null,-1))],6))]))]),_:2},1032,["name"])]),_:1})])],2),g(ye,{name:"panel-slide"},{default:M(()=>[s(w).panelAppId?(i(),l("div",Jt,[g(ct,{"app-id-prop":s(w).panelAppId,onClose:e[2]||(e[2]=a=>s(w).closePanel())},null,8,["app-id-prop"])])):_("",!0)]),_:1})],2),t("nav",{ref_key:"mobileTabBar",ref:Z,"data-mobile-tab-bar":"","aria-label":s(k)("dashboard.mobileNav"),class:d(["md:hidden fixed bottom-0 left-0 right-0 border-t border-glass-border shadow-glass z-50 glass-piece",{"glass-throw-tabbar":f.value}]),style:{background:"rgba(0, 0, 0, 0.25)","backdrop-filter":"blur(18px)","-webkit-backdrop-filter":"blur(18px)","padding-bottom":"env(safe-area-inset-bottom, 0px)"}},[t("div",Qt,[(i(!0),l(R,null,L(Ve.value,a=>(i(),F(s(j),{key:a.path,to:a.path,onClick:e[3]||(e[3]=r=>s(w).closePanel()),class:d(["flex flex-col items-center justify-center w-full py-1.5 rounded-lg text-white/70 transition-all duration-300 relative z-10 gap-0.5",{"nav-tab-active":a.isCombined?a.path==="/dashboard/apps"?s(n).path.includes("/apps")||s(n).path.includes("/marketplace")||s(n).path.includes("/app-session"):s(n).path.includes("/cloud")||s(n).path.includes("/server"):void 0}]),"exact-active-class":a.isCombined?void 0:"nav-tab-active"},{default:M(()=>[(i(),l("svg",Xt,[(i(!0),l(R,null,L(P(a.icon),(r,v)=>(i(),l("path",{key:v,"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:r},null,8,Yt))),128))])),t("span",ea,m(a.label),1)]),_:2},1032,["to","class","exact-active-class"]))),128)),t("button",{onClick:e[4]||(e[4]=a=>s(x).push("/dashboard/chat")),class:"chat-launcher-btn-mobile flex flex-col items-center justify-center w-full py-1.5 rounded-lg transition-all duration-300 relative z-10 gap-0.5"},[(i(),l("svg",ta,[(i(!0),l(R,null,L(P("chat"),(a,r)=>(i(),l("path",{key:r,"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:a},null,8,aa))),128))])),e[15]||(e[15]=t("span",{class:"text-[10px] leading-tight"},"AIUI",-1))])])],10,Zt),me.value.length>0?(i(),l("div",sa,[(i(!0),l(R,null,L(me.value,a=>(i(),l("div",{key:a.id,class:d(["p-3 rounded-xl border backdrop-blur-lg shadow-lg",a.level==="error"?"bg-red-500/15 border-red-500/30":a.level==="warning"?"bg-yellow-500/15 border-yellow-500/30":"bg-blue-500/15 border-blue-500/30"])},[t("div",oa,[(i(),l("svg",{xmlns:"http://www.w3.org/2000/svg",class:d(["h-4 w-4 mt-0.5 shrink-0",a.level==="error"?"text-red-400":a.level==="warning"?"text-yellow-400":"text-blue-400"]),fill:"none",viewBox:"0 0 24 24",stroke:"currentColor"},[...e[16]||(e[16]=[t("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-2.5L13.732 4.5c-.77-.833-2.694-.833-3.464 0L3.34 16.5c-.77.833.192 2.5 1.732 2.5z"},null,-1)])],2)),t("div",na,[t("p",ia,m(a.title),1),t("p",la,m(a.message),1)]),t("button",{class:"text-white/40 hover:text-white/80 transition-colors shrink-0",onClick:r=>Ke(a.id)},[...e[17]||(e[17]=[t("svg",{class:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[t("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M6 18L18 6M6 6l12 12"})],-1)])],8,ra)])],2))),128))])):_("",!0)],2))}});export{va as default}; diff --git a/neode-ui/dist/assets/Dashboard-C4e6Zldy.css b/neode-ui/dist/assets/Dashboard-C4e6Zldy.css new file mode 100644 index 0000000..5fb0172 --- /dev/null +++ b/neode-ui/dist/assets/Dashboard-C4e6Zldy.css @@ -0,0 +1 @@ +.zoom-reveal-bg{animation:zoom-reveal 2.8s cubic-bezier(.25,.46,.45,.94) forwards;transform-origin:center center;opacity:0;transform:scale(.15);filter:blur(24px)}@keyframes zoom-reveal{0%{opacity:0;transform:scale(.15);filter:blur(24px)}35%{opacity:.5;transform:scale(.5);filter:blur(20px)}65%{opacity:.85;transform:scale(.88);filter:blur(6px)}to{opacity:1;transform:scale(1);filter:blur(0)}}.glass-throw-active{perspective:1400px}.glass-piece{will-change:transform,opacity}.sidebar-shell{width:100%;height:100%;min-height:100vh;background:#00000040;backdrop-filter:blur(18px);-webkit-backdrop-filter:blur(18px);border-right:1px solid transparent;box-shadow:4px 0 24px #0000004d;overflow:hidden}.sidebar-animate .sidebar-shell{animation:sidebar-shell-fly 1.2s cubic-bezier(.25,.46,.45,.94) forwards;animation-delay:5.2s;opacity:0;transform:translate(-100%)}@keyframes sidebar-shell-fly{0%{opacity:0;transform:translate(-100%);border-color:transparent}70%{opacity:1;transform:translate(0);border-color:transparent}to{opacity:1;transform:translate(0);border-color:#ffffff2e}}.sidebar-inner{overflow:hidden;opacity:0}.sidebar-animate .sidebar-inner{animation:sidebar-inner-draw .7s cubic-bezier(.25,.46,.45,.94) forwards;animation-delay:6.1s}@keyframes sidebar-inner-draw{0%{opacity:0;clip-path:inset(0 100% 0 0)}20%{opacity:1}to{opacity:1;clip-path:inset(0 0 0 0)}}.sidebar-nav-item{opacity:0;transform:translate(-12px)}.sidebar-animate .sidebar-nav-item{animation:sidebar-nav-item-in .4s cubic-bezier(.25,.46,.45,.94) forwards;animation-delay:calc(6.3s + var(--nav-stagger, 0) * .06s)}@keyframes sidebar-nav-item-in{0%{opacity:0;transform:translate(-12px)}to{opacity:1;transform:translate(0)}}.sidebar-controller{opacity:0}.sidebar-animate .sidebar-controller{animation:sidebar-fade-in .4s ease-out forwards;animation-delay:6.9s}.sidebar-logout-btn{opacity:0;transform:scale(.95)}.sidebar-animate .sidebar-logout-btn{animation:sidebar-logout-pop .45s cubic-bezier(.34,1.56,.64,1) forwards;animation-delay:7.1s}@keyframes sidebar-fade-in{0%{opacity:0}to{opacity:1}}@keyframes sidebar-logout-pop{0%{opacity:0;transform:scale(.95)}to{opacity:1;transform:scale(1)}}.sidebar-logo{opacity:0;transform:translateY(-8px)}.sidebar-animate .sidebar-logo{animation:sidebar-logo-in .5s cubic-bezier(.25,.46,.45,.94) forwards;animation-delay:6.15s}@keyframes sidebar-logo-in{0%{opacity:0;transform:translateY(-8px)}to{opacity:1;transform:translateY(0)}}aside:not(.sidebar-animate) .sidebar-shell{border-color:#ffffff2e;opacity:1;transform:none}aside:not(.sidebar-animate) .sidebar-inner,aside:not(.sidebar-animate) .sidebar-logo,aside:not(.sidebar-animate) .sidebar-nav-item,aside:not(.sidebar-animate) .sidebar-controller,aside:not(.sidebar-animate) .sidebar-logout-btn{opacity:1;transform:none;animation:none;clip-path:none}.glass-throw-main{animation:glass-throw-main 1.6s cubic-bezier(.25,.46,.45,.94) .15s forwards;opacity:0;transform:translate(20%) scale(.2);filter:blur(14px)}.glass-throw-content{animation:glass-throw-content 1.5s cubic-bezier(.25,.46,.45,.94) .22s forwards;opacity:0;transform:translateY(12%) scale(.25);filter:blur(10px)}.glass-throw-mobile-tabs{animation:glass-throw-top 1.3s cubic-bezier(.25,.46,.45,.94) .08s forwards;opacity:0;transform:translateY(-90%) scale(.28);filter:blur(10px)}.glass-throw-mobile-tabs-2{animation:glass-throw-top 1.35s cubic-bezier(.25,.46,.45,.94) .18s forwards;opacity:0;transform:translateY(-90%) scale(.28);filter:blur(10px)}.glass-throw-tabbar{animation:glass-throw-bottom 1.4s cubic-bezier(.25,.46,.45,.94) .2s forwards;opacity:0;transform:translateY(85%) scale(.25);filter:blur(10px)}@keyframes glass-throw-sidebar{0%{opacity:0;transform:translate(-100%) scale(.25);filter:blur(12px)}45%{opacity:.9;transform:translate(-15%) scale(.85);filter:blur(8px)}to{opacity:1;transform:translate(0) scale(1);filter:blur(0)}}@keyframes glass-throw-main{0%{opacity:0;transform:translate(20%) scale(.2);filter:blur(14px)}50%{opacity:.85;transform:translate(0) scale(.9);filter:blur(6px)}to{opacity:1;transform:translate(0) scale(1);filter:blur(0)}}@keyframes glass-throw-content{0%{opacity:0;transform:translateY(12%) scale(.25);filter:blur(10px)}50%{opacity:.9;transform:translateY(0) scale(.9);filter:blur(4px)}to{opacity:1;transform:translateY(0) scale(1);filter:blur(0)}}@keyframes glass-throw-top{0%{opacity:0;transform:translateY(-90%) scale(.28);filter:blur(10px)}50%{opacity:.9;transform:translateY(0) scale(.95);filter:blur(4px)}to{opacity:1;transform:translateY(0) scale(1);filter:blur(0)}}@keyframes glass-throw-bottom{0%{opacity:0;transform:translateY(85%) scale(.25);filter:blur(10px)}50%{opacity:.9;transform:translateY(0) scale(.95);filter:blur(4px)}to{opacity:1;transform:translateY(0) scale(1);filter:blur(0)}}.oomph-flash{background:radial-gradient(ellipse at center,rgba(255,255,255,.08) 0%,transparent 65%);animation:oomph-flash .7s cubic-bezier(.25,.46,.45,.94) forwards}@keyframes oomph-flash{0%{opacity:0}25%{opacity:.9}to{opacity:0}}.reveal-flash-glitch{background:radial-gradient(ellipse at center,rgba(255,255,255,.12) 0%,transparent 70%);animation:reveal-flash-sequence 2.8s ease-out forwards}@keyframes reveal-flash-sequence{0%{opacity:0}12%{opacity:.6}18%{opacity:0}42%{opacity:.4}48%{opacity:0}70%{opacity:.35}78%{opacity:0}to{opacity:0}}.app-panel-container{position:absolute;inset:0;z-index:100}.panel-slide-enter-active{transition:opacity .25s ease}.panel-slide-leave-active{transition:transform .3s ease,opacity .3s ease}.panel-slide-enter-from{opacity:0}.panel-slide-leave-to{transform:translate(40px) scale(.97);opacity:0}.perspective-container-wrapper{position:relative;overflow:hidden;height:100%}.perspective-container{perspective:2000px;perspective-origin:50% 50%;position:relative;height:100%;overflow:hidden}.view-wrapper{position:absolute;inset:0;transform-style:preserve-3d;backface-visibility:hidden;will-change:transform,opacity;opacity:1}.depth-forward-enter-active.view-wrapper,.depth-forward-leave-active.view-wrapper{transition:all .8s cubic-bezier(.25,.46,.45,.94)}.depth-forward-enter-from.view-wrapper{opacity:0;transform:translateZ(-800px) scale(.75);filter:blur(4px)}.depth-forward-enter-to.view-wrapper,.depth-forward-leave-from.view-wrapper{opacity:1;transform:translateZ(0) scale(1);filter:blur(0px)}.depth-forward-leave-to.view-wrapper{opacity:0;transform:translateZ(400px) scale(1.2);filter:blur(8px)}.depth-back-enter-active.view-wrapper,.depth-back-leave-active.view-wrapper{transition:all .8s cubic-bezier(.25,.46,.45,.94)}.depth-back-enter-from.view-wrapper{opacity:0;transform:translateZ(400px) scale(1.2);filter:blur(8px)}.depth-back-enter-to.view-wrapper,.depth-back-leave-from.view-wrapper{opacity:1;transform:translateZ(0) scale(1);filter:blur(0px)}.depth-back-leave-to.view-wrapper{opacity:0;transform:translateZ(-800px) scale(.75);filter:blur(4px)}@media(min-width:768px){.depth-forward-enter-from.view-wrapper{transform:translateZ(-800px) scale(.75) rotateX(5deg)}.depth-forward-leave-to.view-wrapper,.depth-back-enter-from.view-wrapper{transform:translateZ(400px) scale(1.2) rotateX(-4deg)}.depth-back-leave-to.view-wrapper{transform:translateZ(-800px) scale(.75) rotateX(5deg)}}.chat-open-enter-active.view-wrapper,.chat-open-leave-active.view-wrapper{transition:opacity .5s cubic-bezier(.22,1,.36,1),transform .5s cubic-bezier(.22,1,.36,1)}.chat-open-enter-from.view-wrapper{opacity:0;transform:translate(-60px) scale(.96)}.chat-open-enter-to.view-wrapper,.chat-open-leave-from.view-wrapper{opacity:1;transform:translate(0) scale(1)}.chat-open-leave-to.view-wrapper{opacity:0;transform:translate(60px) scale(.96)}.chat-close-enter-active.view-wrapper,.chat-close-leave-active.view-wrapper{transition:opacity .5s cubic-bezier(.22,1,.36,1),transform .5s cubic-bezier(.22,1,.36,1)}.chat-close-enter-from.view-wrapper{opacity:0;transform:translate(60px) scale(.96)}.chat-close-enter-to.view-wrapper,.chat-close-leave-from.view-wrapper{opacity:1;transform:translate(0) scale(1)}.chat-close-leave-to.view-wrapper{opacity:0;transform:translate(-60px) scale(.96)}.fade-enter-active,.fade-leave-active{transition:opacity .3s ease}.fade-enter-from,.fade-leave-to{opacity:0}.fade-enter-to,.fade-leave-from{opacity:1}.slide-left-enter-active.view-wrapper,.slide-left-leave-active.view-wrapper{transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s ease}.slide-left-enter-from.view-wrapper{transform:translate(100%);opacity:0}.slide-left-enter-to.view-wrapper,.slide-left-leave-from.view-wrapper{transform:translate(0);opacity:1}.slide-left-leave-to.view-wrapper{transform:translate(-100%);opacity:0}.slide-right-enter-active.view-wrapper,.slide-right-leave-active.view-wrapper{transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s ease}.slide-right-enter-from.view-wrapper{transform:translate(-100%);opacity:0}.slide-right-enter-to.view-wrapper,.slide-right-leave-from.view-wrapper{transform:translate(0);opacity:1}.slide-right-leave-to.view-wrapper{transform:translate(100%);opacity:0}.slide-down-enter-active.view-wrapper{transition:all .5s cubic-bezier(.25,.46,.45,.94)}.slide-down-leave-active.view-wrapper{transition:transform .5s cubic-bezier(.25,.46,.45,.94),opacity .5s cubic-bezier(.4,0,.2,1)}.slide-down-enter-from.view-wrapper{opacity:0;transform:translateY(40vh)}.slide-down-enter-to.view-wrapper,.slide-down-leave-from.view-wrapper{opacity:1;transform:translateY(0)}.slide-down-leave-to.view-wrapper{opacity:0;transform:translateY(-30vh)}.slide-up-enter-active.view-wrapper{transition:all .5s cubic-bezier(.25,.46,.45,.94)}.slide-up-leave-active.view-wrapper{transition:transform .5s cubic-bezier(.25,.46,.45,.94),opacity .5s cubic-bezier(.4,0,.2,1)}.slide-up-enter-from.view-wrapper{opacity:0;transform:translateY(-40vh)}.slide-up-enter-to.view-wrapper,.slide-up-leave-from.view-wrapper{opacity:1;transform:translateY(0)}.slide-up-leave-to.view-wrapper{opacity:0;transform:translateY(30vh)}.dashboard-view .bg-perspective-container{position:fixed;inset:0;z-index:-10;perspective:1000px;perspective-origin:50% 50%;overflow:hidden;left:0!important;right:0!important;width:100%!important;min-width:100%!important;background:#000}.dashboard-view .bg-layer{position:absolute;inset:0;background-size:cover!important;background-position:center center!important;background-repeat:no-repeat!important;transition:all .45s cubic-bezier(.68,-.55,.265,1.55);transform-style:preserve-3d;will-change:transform,opacity}.dashboard-view .bg-layer:first-of-type{opacity:1;transform:translateZ(0) scale(1)}.dashboard-view .bg-layer:nth-of-type(2){opacity:0;transform:translateZ(-200px) scale(.9) rotateY(-15deg)}.dashboard-view .bg-layer.bg-transitioning-out{opacity:0;transform:translateZ(200px) scale(1.15) rotateY(15deg)!important}.dashboard-view .bg-layer.bg-transitioning-in{opacity:1;transform:translateZ(0) scale(1.05) rotateY(0)!important}.bg-glitch-layer-1,.bg-glitch-layer-2,.bg-glitch-scan{content:"";position:fixed;inset:0;pointer-events:none;z-index:10;opacity:0}.bg-glitch-layer-1{background-size:cover;background-position:center;mix-blend-mode:lighten;filter:brightness(1.8) contrast(2) saturate(1.5) hue-rotate(180deg);will-change:transform,clip-path,opacity}.bg-glitch-layer-2{background-size:cover;background-position:center;mix-blend-mode:color-dodge;filter:brightness(2) contrast(2) saturate(2) hue-rotate(90deg);will-change:transform,clip-path,opacity}.bg-glitch-scan{background:linear-gradient(90deg,#f0f3,#0ff3,#ff03,#0ff3,#f0f3),repeating-linear-gradient(0deg,rgba(255,255,255,.05) 0px,rgba(255,255,255,.05) 2px,transparent 2px,transparent 4px);will-change:transform,opacity}.bg-glitch-layer-1.glitch-active{animation:bg-glitch-shift .375s steps(15,end) forwards}.bg-glitch-layer-2.glitch-active{animation:bg-glitch-shift-2 .375s steps(12,end) forwards}.bg-glitch-scan.glitch-active{animation:bg-glitch-scan .375s linear forwards}@keyframes bg-glitch-shift{0%{transform:translate(0);clip-path:inset(0% 0 0 0);opacity:0}5%{opacity:.5}12%{transform:translate(15px,-8px);clip-path:inset(12% 0 70% 0)}20%{transform:translate(-20px,10px);clip-path:inset(45% 0 35% 0)}28%{transform:translate(18px,-5px);clip-path:inset(68% 0 15% 0)}36%{transform:translate(-15px,12px);clip-path:inset(20% 0 60% 0)}44%{transform:translate(22px,-10px);clip-path:inset(52% 0 28% 0)}52%{transform:translate(-18px,8px);clip-path:inset(10% 0 75% 0)}60%{transform:translate(12px,-6px);clip-path:inset(58% 0 22% 0)}68%{transform:translate(-10px,15px);clip-path:inset(32% 0 48% 0)}76%{transform:translate(16px,-4px);clip-path:inset(72% 0 12% 0)}84%{transform:translate(-12px,7px);clip-path:inset(18% 0 65% 0)}92%{transform:translate(8px,-3px);clip-path:inset(42% 0 40% 0)}96%{opacity:.4}to{transform:translate(0);clip-path:inset(0% 0 0 0);opacity:0}}@keyframes bg-glitch-shift-2{0%{transform:translate(0) skew(0);clip-path:inset(0% 0 0 0);opacity:0}8%{opacity:.5}15%{transform:translate(-18px,10px) skew(4deg);clip-path:inset(25% 0 55% 0)}23%{transform:translate(22px,-12px) skew(-5deg);clip-path:inset(50% 0 30% 0)}31%{transform:translate(-16px,8px) skew(3deg);clip-path:inset(72% 0 12% 0)}39%{transform:translate(20px,-15px) skew(-4deg);clip-path:inset(18% 0 65% 0)}47%{transform:translate(-22px,12px) skew(5deg);clip-path:inset(42% 0 38% 0)}55%{transform:translate(18px,-8px) skew(-3deg);clip-path:inset(62% 0 20% 0)}63%{transform:translate(-14px,14px) skew(4deg);clip-path:inset(30% 0 52% 0)}71%{transform:translate(16px,-6px) skew(-2deg);clip-path:inset(8% 0 78% 0)}79%{transform:translate(-12px,10px) skew(3deg);clip-path:inset(55% 0 28% 0)}87%{transform:translate(10px,-4px) skew(-2deg);clip-path:inset(35% 0 45% 0)}95%{opacity:.4}to{transform:translate(0) skew(0);clip-path:inset(0% 0 0 0);opacity:0}}@keyframes bg-glitch-scan{0%{opacity:0;transform:translate(-120%)}5%{opacity:.5}15%{opacity:.55;transform:translate(-80%)}30%{opacity:.6;transform:translate(-40%)}50%{opacity:.6;transform:translate(0)}70%{opacity:.55;transform:translate(40%)}85%{opacity:.5;transform:translate(80%)}95%{opacity:.45}to{opacity:0;transform:translate(120%)}}.dashboard-view .bg-fullwidth{min-width:100%;width:100%;background-size:cover!important;background-position:center center!important}.dashboard-glitch-layer{position:absolute;inset:0;pointer-events:none;z-index:5;background-size:cover;background-position:center;background-repeat:no-repeat;opacity:0}.dashboard-glitch-1{mix-blend-mode:screen;filter:hue-rotate(22deg) saturate(1.35);animation:dashboard-glitch-shift 5s steps(10,end) infinite;background-size:cover!important;background-position:center center!important}.dashboard-glitch-2{mix-blend-mode:screen;filter:hue-rotate(-30deg) saturate(1.45);animation:dashboard-glitch-shift-2 5s steps(9,end) infinite;background-size:cover!important;background-position:center center!important}.dashboard-glitch-scan{position:absolute;inset:0;pointer-events:none;z-index:6;background:linear-gradient(180deg,#ffffff29,#0000 60%),repeating-linear-gradient(180deg,#ffffff0d 0 2px,#0000 2px 4px),radial-gradient(ellipse at center,#0000 40%,#00000059);opacity:0;animation:dashboard-glitch-scan 5s ease-out infinite}@keyframes dashboard-glitch-shift{0%,82%{transform:translate(0);clip-path:inset(0% 0 0 0);opacity:0}82.1%{opacity:.28}84%{transform:translate(6px,-2px);clip-path:inset(8% 0 70% 0)}86%{transform:translate(-5px,2px);clip-path:inset(42% 0 40% 0)}88%{transform:translate(3px);clip-path:inset(68% 0 10% 0)}91%{transform:translate(-4px,3px);clip-path:inset(18% 0 60% 0)}93%{transform:translate(5px,-3px);clip-path:inset(55% 0 20% 0)}95%{transform:translate(-3px,1px);clip-path:inset(10% 0 80% 0)}to{transform:translate(0);clip-path:inset(0% 0 0 0);opacity:0}}@keyframes dashboard-glitch-shift-2{0%,82%{transform:translate(0);clip-path:inset(0% 0 0 0);opacity:0}82.1%{opacity:.24}84%{transform:translate(-6px,2px);clip-path:inset(12% 0 65% 0)}86%{transform:translate(5px,-1px) skew(.6deg);clip-path:inset(36% 0 42% 0)}89%{transform:translate(-3px,2px);clip-path:inset(72% 0 8% 0)}92%{transform:translate(4px,-3px);clip-path:inset(22% 0 58% 0)}95%{transform:translate(-4px,1px);clip-path:inset(50% 0 26% 0)}to{transform:translate(0);clip-path:inset(0% 0 0 0);opacity:0}}@keyframes dashboard-glitch-scan{0%,82%{opacity:0;transform:translateY(-20%)}84%{opacity:.5}90%{opacity:.35}to{opacity:0;transform:translateY(115%)}} diff --git a/neode-ui/dist/assets/Federation-BIPGM17A.js b/neode-ui/dist/assets/Federation-BIPGM17A.js new file mode 100644 index 0000000..5f7db2b --- /dev/null +++ b/neode-ui/dist/assets/Federation-BIPGM17A.js @@ -0,0 +1,3 @@ +import{d as Ue,o as Ye,O as kn,w as Nn,c as E,r as I,q as T,t as An,B as Y,a as g,E as Cn,J as ot,D as M,F as dt,P as St,G as L,h as $n,N as Qt,b as _e,g as be,H as ke,f as J,x as Mn,j as Et}from"./index-DnbYEqLr.js";import{u as Sn}from"./transport-B_E2RH1i.js";var En={value:()=>{}};function Ut(){for(var t=0,e=arguments.length,n={},r;t=0&&(r=n.slice(i+1),n=n.slice(0,i)),n&&!e.hasOwnProperty(n))throw new Error("unknown type: "+n);return{type:n,name:r}})}Ft.prototype=Ut.prototype={constructor:Ft,on:function(t,e){var n=this._,r=Tn(t+"",n),i,s=-1,o=r.length;if(arguments.length<2){for(;++s0)for(var n=new Array(i),r=0,i,s;r=0&&(e=t.slice(0,n))!=="xmlns"&&(t=t.slice(n+1)),Ae.hasOwnProperty(e)?{space:Ae[e],local:t}:t}function Dn(t){return function(){var e=this.ownerDocument,n=this.namespaceURI;return n===ee&&e.documentElement.namespaceURI===ee?e.createElement(t):e.createElementNS(n,t)}}function In(t){return function(){return this.ownerDocument.createElementNS(t.space,t.local)}}function qe(t){var e=Yt(t);return(e.local?In:Dn)(e)}function Fn(){}function ue(t){return t==null?Fn:function(){return this.querySelector(t)}}function Bn(t){typeof t!="function"&&(t=ue(t));for(var e=this._groups,n=e.length,r=new Array(n),i=0;i=x&&(x=_+1);!(A=y[x])&&++x=0;)(o=r[i])&&(s&&o.compareDocumentPosition(s)^4&&s.parentNode.insertBefore(o,s),s=o);return this}function ar(t){t||(t=lr);function e(v,d){return v&&d?t(v.__data__,d.__data__):!v-!d}for(var n=this._groups,r=n.length,i=new Array(r),s=0;se?1:t>=e?0:NaN}function ur(){var t=arguments[0];return arguments[0]=this,t.apply(null,arguments),this}function cr(){return Array.from(this)}function fr(){for(var t=this._groups,e=0,n=t.length;e1?this.each((e==null?br:typeof e=="function"?Nr:kr)(t,e,n??"")):ut(this.node(),t)}function ut(t,e){return t.style.getPropertyValue(e)||Qe(t).getComputedStyle(t,null).getPropertyValue(e)}function Cr(t){return function(){delete this[t]}}function $r(t,e){return function(){this[t]=e}}function Mr(t,e){return function(){var n=e.apply(this,arguments);n==null?delete this[t]:this[t]=n}}function Sr(t,e){return arguments.length>1?this.each((e==null?Cr:typeof e=="function"?Mr:$r)(t,e)):this.node()[t]}function Ze(t){return t.trim().split(/^|\s+/)}function ce(t){return t.classList||new je(t)}function je(t){this._node=t,this._names=Ze(t.getAttribute("class")||"")}je.prototype={add:function(t){var e=this._names.indexOf(t);e<0&&(this._names.push(t),this._node.setAttribute("class",this._names.join(" ")))},remove:function(t){var e=this._names.indexOf(t);e>=0&&(this._names.splice(e,1),this._node.setAttribute("class",this._names.join(" ")))},contains:function(t){return this._names.indexOf(t)>=0}};function tn(t,e){for(var n=ce(t),r=-1,i=e.length;++r=0&&(n=e.slice(r+1),e=e.slice(0,r)),{type:e,name:n}})}function ri(t){return function(){var e=this.__on;if(e){for(var n=0,r=-1,i=e.length,s;n()=>t;function ne(t,{sourceEvent:e,subject:n,target:r,identifier:i,active:s,x:o,y:a,dx:u,dy:l,dispatch:c}){Object.defineProperties(this,{type:{value:t,enumerable:!0,configurable:!0},sourceEvent:{value:e,enumerable:!0,configurable:!0},subject:{value:n,enumerable:!0,configurable:!0},target:{value:r,enumerable:!0,configurable:!0},identifier:{value:i,enumerable:!0,configurable:!0},active:{value:s,enumerable:!0,configurable:!0},x:{value:o,enumerable:!0,configurable:!0},y:{value:a,enumerable:!0,configurable:!0},dx:{value:u,enumerable:!0,configurable:!0},dy:{value:l,enumerable:!0,configurable:!0},_:{value:c}})}ne.prototype.on=function(){var t=this._.on.apply(this._,arguments);return t===this._?this:t};function gi(t){return!t.ctrlKey&&!t.button}function vi(){return this.parentNode}function xi(t,e){return e??{x:t.x,y:t.y}}function yi(){return navigator.maxTouchPoints||"ontouchstart"in this}function wi(){var t=gi,e=vi,n=xi,r=yi,i={},s=Ut("start","drag","end"),o=0,a,u,l,c,v=0;function d(f){f.on("mousedown.drag",h).filter(r).on("touchstart.drag",y).on("touchmove.drag",m,hi).on("touchend.drag touchcancel.drag",_).style("touch-action","none").style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}function h(f,A){if(!(c||!t.call(this,f,A))){var C=x(this,e.call(this,f,A),f,A,"mouse");C&&(yt(f.view).on("mousemove.drag",b,wt).on("mouseup.drag",w,wt),di(f.view),Zt(f),l=!1,a=f.clientX,u=f.clientY,C("start",f))}}function b(f){if(at(f),!l){var A=f.clientX-a,C=f.clientY-u;l=A*A+C*C>v}i.mouse("drag",f)}function w(f){yt(f.view).on("mousemove.drag mouseup.drag",null),pi(f.view,l),at(f),i.mouse("end",f)}function y(f,A){if(t.call(this,f,A)){var C=f.changedTouches,S=e.call(this,f,A),$=C.length,F,D;for(F=0;F<$;++F)(D=x(this,S,f,A,C[F].identifier,C[F]))&&(Zt(f),D("start",f,C[F]))}}function m(f){var A=f.changedTouches,C=A.length,S,$;for(S=0;S>8&15|e>>4&240,e>>4&15|e&240,(e&15)<<4|e&15,1):n===8?Rt(e>>24&255,e>>16&255,e>>8&255,(e&255)/255):n===4?Rt(e>>12&15|e>>8&240,e>>8&15|e>>4&240,e>>4&15|e&240,((e&15)<<4|e&15)/255):null):(e=_i.exec(t))?new X(e[1],e[2],e[3],1):(e=bi.exec(t))?new X(e[1]*255/100,e[2]*255/100,e[3]*255/100,1):(e=ki.exec(t))?Rt(e[1],e[2],e[3],e[4]):(e=Ni.exec(t))?Rt(e[1]*255/100,e[2]*255/100,e[3]*255/100,e[4]):(e=Ai.exec(t))?De(e[1],e[2]/100,e[3]/100,1):(e=Ci.exec(t))?De(e[1],e[2]/100,e[3]/100,e[4]):$e.hasOwnProperty(t)?Ee($e[t]):t==="transparent"?new X(NaN,NaN,NaN,0):null}function Ee(t){return new X(t>>16&255,t>>8&255,t&255,1)}function Rt(t,e,n,r){return r<=0&&(t=e=n=NaN),new X(t,e,n,r)}function Si(t){return t instanceof At||(t=bt(t)),t?(t=t.rgb(),new X(t.r,t.g,t.b,t.opacity)):new X}function re(t,e,n,r){return arguments.length===1?Si(t):new X(t,e,n,r??1)}function X(t,e,n,r){this.r=+t,this.g=+e,this.b=+n,this.opacity=+r}fe(X,re,sn(At,{brighter(t){return t=t==null?zt:Math.pow(zt,t),new X(this.r*t,this.g*t,this.b*t,this.opacity)},darker(t){return t=t==null?mt:Math.pow(mt,t),new X(this.r*t,this.g*t,this.b*t,this.opacity)},rgb(){return this},clamp(){return new X(nt(this.r),nt(this.g),nt(this.b),Lt(this.opacity))},displayable(){return-.5<=this.r&&this.r<255.5&&-.5<=this.g&&this.g<255.5&&-.5<=this.b&&this.b<255.5&&0<=this.opacity&&this.opacity<=1},hex:Te,formatHex:Te,formatHex8:Ei,formatRgb:Re,toString:Re}));function Te(){return`#${et(this.r)}${et(this.g)}${et(this.b)}`}function Ei(){return`#${et(this.r)}${et(this.g)}${et(this.b)}${et((isNaN(this.opacity)?1:this.opacity)*255)}`}function Re(){const t=Lt(this.opacity);return`${t===1?"rgb(":"rgba("}${nt(this.r)}, ${nt(this.g)}, ${nt(this.b)}${t===1?")":`, ${t})`}`}function Lt(t){return isNaN(t)?1:Math.max(0,Math.min(1,t))}function nt(t){return Math.max(0,Math.min(255,Math.round(t)||0))}function et(t){return t=nt(t),(t<16?"0":"")+t.toString(16)}function De(t,e,n,r){return r<=0?t=e=n=NaN:n<=0||n>=1?t=e=NaN:e<=0&&(t=NaN),new V(t,e,n,r)}function on(t){if(t instanceof V)return new V(t.h,t.s,t.l,t.opacity);if(t instanceof At||(t=bt(t)),!t)return new V;if(t instanceof V)return t;t=t.rgb();var e=t.r/255,n=t.g/255,r=t.b/255,i=Math.min(e,n,r),s=Math.max(e,n,r),o=NaN,a=s-i,u=(s+i)/2;return a?(e===s?o=(n-r)/a+(n0&&u<1?0:o,new V(o,a,u,t.opacity)}function Ti(t,e,n,r){return arguments.length===1?on(t):new V(t,e,n,r??1)}function V(t,e,n,r){this.h=+t,this.s=+e,this.l=+n,this.opacity=+r}fe(V,Ti,sn(At,{brighter(t){return t=t==null?zt:Math.pow(zt,t),new V(this.h,this.s,this.l*t,this.opacity)},darker(t){return t=t==null?mt:Math.pow(mt,t),new V(this.h,this.s,this.l*t,this.opacity)},rgb(){var t=this.h%360+(this.h<0)*360,e=isNaN(t)||isNaN(this.s)?0:this.s,n=this.l,r=n+(n<.5?n:1-n)*e,i=2*n-r;return new X(jt(t>=240?t-240:t+120,i,r),jt(t,i,r),jt(t<120?t+240:t-120,i,r),this.opacity)},clamp(){return new V(Ie(this.h),Dt(this.s),Dt(this.l),Lt(this.opacity))},displayable(){return(0<=this.s&&this.s<=1||isNaN(this.s))&&0<=this.l&&this.l<=1&&0<=this.opacity&&this.opacity<=1},formatHsl(){const t=Lt(this.opacity);return`${t===1?"hsl(":"hsla("}${Ie(this.h)}, ${Dt(this.s)*100}%, ${Dt(this.l)*100}%${t===1?")":`, ${t})`}`}}));function Ie(t){return t=(t||0)%360,t<0?t+360:t}function Dt(t){return Math.max(0,Math.min(1,t||0))}function jt(t,e,n){return(t<60?e+(n-e)*t/60:t<180?n:t<240?e+(n-e)*(240-t)/60:e)*255}const an=t=>()=>t;function Ri(t,e){return function(n){return t+n*e}}function Di(t,e,n){return t=Math.pow(t,n),e=Math.pow(e,n)-t,n=1/n,function(r){return Math.pow(t+r*e,n)}}function Ii(t){return(t=+t)==1?ln:function(e,n){return n-e?Di(e,n,t):an(isNaN(e)?n:e)}}function ln(t,e){var n=e-t;return n?Ri(t,n):an(isNaN(t)?e:t)}const Fe=(function t(e){var n=Ii(e);function r(i,s){var o=n((i=re(i)).r,(s=re(s)).r),a=n(i.g,s.g),u=n(i.b,s.b),l=ln(i.opacity,s.opacity);return function(c){return i.r=o(c),i.g=a(c),i.b=u(c),i.opacity=l(c),i+""}}return r.gamma=t,r})(1);function Q(t,e){return t=+t,e=+e,function(n){return t*(1-n)+e*n}}var ie=/[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g,te=new RegExp(ie.source,"g");function Fi(t){return function(){return t}}function Bi(t){return function(e){return t(e)+""}}function Pi(t,e){var n=ie.lastIndex=te.lastIndex=0,r,i,s,o=-1,a=[],u=[];for(t=t+"",e=e+"";(r=ie.exec(t))&&(i=te.exec(e));)(s=i.index)>n&&(s=e.slice(n,s),a[o]?a[o]+=s:a[++o]=s),(r=r[0])===(i=i[0])?a[o]?a[o]+=i:a[++o]=i:(a[++o]=null,u.push({i:o,x:Q(r,i)})),n=te.lastIndex;return n180?c+=360:c-l>180&&(l+=360),d.push({i:v.push(i(v)+"rotate(",null,r)-2,x:Q(l,c)})):c&&v.push(i(v)+"rotate("+c+r)}function a(l,c,v,d){l!==c?d.push({i:v.push(i(v)+"skewX(",null,r)-2,x:Q(l,c)}):c&&v.push(i(v)+"skewX("+c+r)}function u(l,c,v,d,h,b){if(l!==v||c!==d){var w=h.push(i(h)+"scale(",null,",",null,")");b.push({i:w-4,x:Q(l,v)},{i:w-2,x:Q(c,d)})}else(v!==1||d!==1)&&h.push(i(h)+"scale("+v+","+d+")")}return function(l,c){var v=[],d=[];return l=t(l),c=t(c),s(l.translateX,l.translateY,c.translateX,c.translateY,v,d),o(l.rotate,c.rotate,v,d),a(l.skewX,c.skewX,v,d),u(l.scaleX,l.scaleY,c.scaleX,c.scaleY,v,d),l=c=null,function(h){for(var b=-1,w=d.length,y;++b=0&&t._call.call(void 0,e),t=t._next;--ct}function Pe(){it=(Ot=kt.now())+qt,ct=gt=0;try{Vi()}finally{ct=0,Yi(),it=0}}function Ui(){var t=kt.now(),e=t-Ot;e>fn&&(qt-=e,Ot=t)}function Yi(){for(var t,e=Xt,n,r=1/0;e;)e._call?(r>e._time&&(r=e._time),t=e,e=e._next):(n=e._next,e._next=null,e=t?t._next=n:Xt=n);vt=t,oe(r)}function oe(t){if(!ct){gt&&(gt=clearTimeout(gt));var e=t-it;e>24?(t<1/0&&(gt=setTimeout(Pe,t-kt.now()-qt)),pt&&(pt=clearInterval(pt))):(pt||(Ot=kt.now(),pt=setInterval(Ui,fn)),ct=1,hn(Pe))}}function He(t,e,n){var r=new Vt;return e=e==null?0:+e,r.restart(i=>{r.stop(),t(i+e)},e,n),r}var qi=Ut("start","end","cancel","interrupt"),Gi=[],dn=0,ze=1,ae=2,Bt=3,Le=4,le=5,Pt=6;function Gt(t,e,n,r,i,s){var o=t.__transition;if(!o)t.__transition={};else if(n in o)return;Ji(t,n,{name:e,index:r,group:i,on:qi,tween:Gi,time:s.time,delay:s.delay,duration:s.duration,ease:s.ease,timer:null,state:dn})}function pe(t,e){var n=U(t,e);if(n.state>dn)throw new Error("too late; already scheduled");return n}function G(t,e){var n=U(t,e);if(n.state>Bt)throw new Error("too late; already running");return n}function U(t,e){var n=t.__transition;if(!n||!(n=n[e]))throw new Error("transition not found");return n}function Ji(t,e,n){var r=t.__transition,i;r[e]=n,n.timer=de(s,0,n.time);function s(l){n.state=ze,n.timer.restart(o,n.delay,n.time),n.delay<=l&&o(l-n.delay)}function o(l){var c,v,d,h;if(n.state!==ze)return u();for(c in r)if(h=r[c],h.name===n.name){if(h.state===Bt)return He(o);h.state===Le?(h.state=Pt,h.timer.stop(),h.on.call("interrupt",t,t.__data__,h.index,h.group),delete r[c]):+cae&&r.state=0&&(e=e.slice(0,n)),!e||e==="start"})}function As(t,e,n){var r,i,s=Ns(e)?pe:G;return function(){var o=s(this,t),a=o.on;a!==r&&(i=(r=a).copy()).on(e,n),o.on=i}}function Cs(t,e){var n=this._id;return arguments.length<2?U(this.node(),n).on.on(t):this.each(As(n,t,e))}function $s(t){return function(){var e=this.parentNode;for(var n in this.__transition)if(+n!==t)return;e&&e.removeChild(this)}}function Ms(){return this.on("end.remove",$s(this._id))}function Ss(t){var e=this._name,n=this._id;typeof t!="function"&&(t=ue(t));for(var r=this._groups,i=r.length,s=new Array(i),o=0;o=(v=(a+l)/2))?a=v:l=v,(y=n>=(d=(u+c)/2))?u=d:c=d,i=s,!(s=s[m=y<<1|w]))return i[m]=o,t;if(h=+t._x.call(null,s.data),b=+t._y.call(null,s.data),e===h&&n===b)return o.next=s,i?i[m]=o:t._root=o,t;do i=i?i[m]=new Array(4):t._root=new Array(4),(w=e>=(v=(a+l)/2))?a=v:l=v,(y=n>=(d=(u+c)/2))?u=d:c=d;while((m=y<<1|w)===(_=(b>=d)<<1|h>=v));return i[_]=s,i[m]=o,t}function no(t){var e,n,r=t.length,i,s,o=new Array(r),a=new Array(r),u=1/0,l=1/0,c=-1/0,v=-1/0;for(n=0;nc&&(c=i),sv&&(v=s));if(u>c||l>v)return this;for(this.cover(u,l).cover(c,v),n=0;nt||t>=i||r>e||e>=s;)switch(l=(ec||(a=b.y0)>v||(u=b.x1)=m)<<1|t>=y)&&(b=d[d.length-1],d[d.length-1]=d[d.length-1-w],d[d.length-1-w]=b)}else{var _=t-+this._x.call(null,h.data),x=e-+this._y.call(null,h.data),f=_*_+x*x;if(f=(d=(o+u)/2))?o=d:u=d,(w=v>=(h=(a+l)/2))?a=h:l=h,e=n,!(n=n[y=w<<1|b]))return this;if(!n.length)break;(e[y+1&3]||e[y+2&3]||e[y+3&3])&&(r=e,m=y)}for(;n.data!==t;)if(i=n,!(n=n.next))return this;return(s=n.next)&&delete n.next,i?(s?i.next=s:delete i.next,this):e?(s?e[y]=s:delete e[y],(n=e[0]||e[1]||e[2]||e[3])&&n===(e[3]||e[2]||e[1]||e[0])&&!n.length&&(r?r[m]=n:this._root=n),this):(this._root=s,this)}function lo(t){for(var e=0,n=t.length;ed.index){var R=h-$.x-$.vx,B=b-$.y-$.vy,P=R*R+B*B;Ph+D||Cb+D||Sl.r&&(l.r=l[c].r)}function u(){if(e){var l,c=e.length,v;for(n=new Array(c),l=0;l[e(A,C,o),A])),f;for(y=0,a=new Array(m);y<_;++y)f=t[y],f.index=y,typeof f.source!="object"&&(f.source=Oe(x,f.source)),typeof f.target!="object"&&(f.target=Oe(x,f.target)),a[f.source.index]=(a[f.source.index]||0)+1,a[f.target.index]=(a[f.target.index]||0)+1;for(y=0,u=new Array(_);y<_;++y)f=t[y],u[y]=a[f.source.index]/(a[f.source.index]+a[f.target.index]);r=new Array(_),b(),s=new Array(_),w()}}function b(){if(o)for(var y=0,m=t.length;y(t=(ko*t+No)%Ve)/Ve}function Co(t){return t.x}function $o(t){return t.y}var Mo=10,So=Math.PI*(3-Math.sqrt(5));function Eo(t){var e,n=1,r=.001,i=1-Math.pow(r,1/300),s=0,o=.6,a=new Map,u=de(v),l=Ut("tick","end"),c=Ao();t==null&&(t=[]);function v(){d(),l.call("tick",e),n1?(y==null?a.delete(w):a.set(w,b(y)),e):a.get(w)},find:function(w,y,m){var _=0,x=t.length,f,A,C,S,$;for(m==null?m=1/0:m*=m,_=0;_1?(l.on(w,y),e):l.on(w)}}}function To(){var t,e,n,r,i=rt(-30),s,o=1,a=1/0,u=.81;function l(h){var b,w=t.length,y=ve(t,Co,$o).visitAfter(v);for(r=h,b=0;b=a)return;(h.data!==e||h.next)&&(m===0&&(m=Z(n),f+=m*m),_===0&&(_=Z(n),f+=_*_),f({...x})),b=e.links.map(x=>({...x})),w=h.find(x=>x.is_self);w&&(w.fx=v/2,w.fy=d/2),i=Eo(h).force("link",bo(b).id(x=>x.did).distance(120)).force("charge",To().strength(-300)).force("center",to(v/2,d/2)).force("collision",mo().radius(x=>a(x)+5));const y=l.append("g"),m=y.append("g").selectAll("line").data(b).join("line").attr("stroke",x=>{const f=typeof x.source=="object"?x.source:h.find(C=>C.did===x.source),A=typeof x.target=="object"?x.target:h.find(C=>C.did===x.target);return f?.online&&A?.online?"#4ade8060":"#6b728050"}).attr("stroke-width",2).attr("stroke-dasharray",x=>{const f=typeof x.source=="object"?x.source:h.find(C=>C.did===x.source),A=typeof x.target=="object"?x.target:h.find(C=>C.did===x.target);return f?.online&&A?.online?"none":"6 4"}),_=y.append("g").selectAll("g").data(h).join("g").attr("cursor","pointer").call(wi().on("start",(x,f)=>{x.active||i.alphaTarget(.3).restart(),f.fx=f.x,f.fy=f.y}).on("drag",(x,f)=>{f.fx=x.x,f.fy=x.y}).on("end",(x,f)=>{x.active||i.alphaTarget(0),f.is_self||(f.fx=null,f.fy=null)}));_.append("circle").attr("r",x=>a(x)).attr("fill",x=>o(x.trust_level)).attr("fill-opacity",x=>x.online?.8:.3).attr("stroke",x=>x.is_self?"#fb923c":o(x.trust_level)).attr("stroke-width",x=>x.is_self?3:1.5).attr("stroke-opacity",x=>x.online?1:.4),_.append("text").text(x=>x.label).attr("dy",x=>a(x)+14).attr("text-anchor","middle").attr("fill","rgba(255,255,255,0.7)").attr("font-size","11px").attr("font-family","'Avenir Next', sans-serif"),_.append("title").text(x=>`${x.did} +Apps: ${x.app_count} +${x.online?"Online":"Offline"}`),i.on("tick",()=>{m.attr("x1",x=>x.source.x).attr("y1",x=>x.source.y).attr("x2",x=>x.target.x).attr("y2",x=>x.target.y),_.attr("transform",x=>`translate(${x.x},${x.y})`)})}return Ye(()=>{u(),s=new ResizeObserver(()=>u()),n.value&&s.observe(n.value)}),kn(()=>{i?.stop(),s?.disconnect()}),Nn(()=>[e.nodes,e.links],()=>u(),{deep:!0}),(l,c)=>(T(),E("div",{ref_key:"containerRef",ref:n,class:"network-map-container"},[(T(),E("svg",{ref_key:"svgRef",ref:r,class:"w-full h-full"},null,512))],512))}}),Do=An(Ro,[["__scopeId","data-v-0e9c18d1"]]),Io={class:"pb-6"},Fo={class:"mb-8"},Bo={class:"text-sm text-white/60 mt-2"},Po={key:0,class:"flex gap-1 mb-6 p-1 bg-black/20 rounded-lg w-fit"},Ho=["onClick"],zo={key:1,class:"mb-6"},Lo={class:"glass-card p-6 mb-6"},Xo={class:"grid grid-cols-1 sm:grid-cols-3 gap-4"},Oo={"data-controller-container":"",tabindex:"0",class:"flex flex-col gap-3 p-4 bg-white/5 rounded-lg min-w-0"},Vo=["disabled"],Uo={"data-controller-container":"",tabindex:"0",class:"flex flex-col gap-3 p-4 bg-white/5 rounded-lg min-w-0"},Yo={"data-controller-container":"",tabindex:"0",class:"flex flex-col gap-3 p-4 bg-white/5 rounded-lg min-w-0"},qo=["disabled"],Go={key:0,class:"glass-card p-6 mb-6"},Jo={class:"flex items-center justify-between mb-4"},Wo={class:"bg-black/30 rounded-lg p-4 font-mono text-xs text-orange-300 break-all select-all"},Ko={key:1,class:"glass-card p-6 mb-6"},Qo={class:"flex items-center justify-between mb-4"},Zo={class:"space-y-2"},jo={class:"text-sm text-white/80 font-mono truncate"},ta={key:0,class:"text-xs text-green-400"},ea={key:1,class:"text-xs text-red-400 truncate"},na={key:2,class:"glass-card p-4 mb-6 border-red-400/30"},ra={class:"text-sm text-red-400"},ia={class:"glass-card p-6 mb-6"},sa={key:0,class:"flex items-center gap-3 py-8 justify-center"},oa={key:1,class:"text-center py-12"},aa={key:2,class:"space-y-3"},la=["onClick"],ua={class:"flex items-center justify-between mb-2"},ca={class:"flex items-center gap-3 min-w-0"},fa={class:"text-sm font-medium text-white truncate"},ha=["title"],da={class:"grid grid-cols-2 sm:grid-cols-4 gap-2 text-xs text-white/50"},pa={class:"flex items-center gap-1"},ga={class:"glass-card p-6 w-full max-w-lg max-h-[80vh] overflow-y-auto"},va={class:"flex items-center justify-between mb-6"},xa={class:"space-y-4"},ya={class:"bg-white/5 rounded-lg p-3"},wa={class:"text-sm text-white/80 font-mono break-all"},ma={class:"bg-white/5 rounded-lg p-3"},_a={class:"text-sm text-white/80 font-mono break-all"},ba={class:"bg-white/5 rounded-lg p-3"},ka={class:"flex items-center gap-2 mt-1"},Na=["value"],Aa={class:"bg-white/5 rounded-lg p-3"},Ca={class:"text-sm text-white/80"},$a={key:0,class:"bg-white/5 rounded-lg p-3"},Ma={class:"grid grid-cols-2 gap-2 text-sm text-white/70"},Sa={key:1,class:"bg-white/5 rounded-lg p-3"},Ea={class:"text-xs text-white/40 mb-2"},Ta={class:"space-y-1"},Ra={class:"text-white/80"},Da={key:2,class:"bg-white/5 rounded-lg p-3"},Ia={class:"flex gap-2"},Fa=["disabled"],Ba={class:"bg-white/5 rounded-lg p-3"},Pa={class:"flex items-center justify-between mb-2"},Ha={class:"flex items-center gap-1.5"},za={class:"text-xs text-white/50"},La={class:"grid grid-cols-2 gap-2 text-sm text-white/70 mb-3"},Xa=["disabled"],Oa={key:3},Va={key:4,class:"mt-4 p-3 bg-red-400/10 rounded-lg border border-red-400/20"},Ua={class:"flex gap-3"},Ya={class:"glass-card p-6 w-full max-w-md"},qa={class:"flex items-center justify-between mb-6"},Ga={key:0,class:"mt-3 text-sm text-red-400"},Ja={key:1,class:"mt-3 text-sm text-green-400"},Wa={class:"flex gap-3 mt-4"},Ka=["disabled"],ja=Ue({__name:"Federation",setup(t){const e=Mn(),n=Sn(),r=I([]),i=I(!0),s=I(""),o=I(null),a=I(""),u=I(!1),l=I(!1),c=I(!1),v=I(""),d=I(!1),h=I(""),b=I(!1),w=I(!1),y=I([]),m=I(!1),_=I(""),x=I(!1),f=I(""),A=[{id:"list",label:"List View"},{id:"map",label:"Network Map"}],C=I(localStorage.getItem("federation-view")||(r.value.length>=3?"map":"list"));function S(k){C.value=k,localStorage.setItem("federation-view",k)}const $=I(""),F=Et(()=>{const k=[];$.value&&k.push({did:$.value,label:"This Node",trust_level:"trusted",online:!0,app_count:0,is_self:!0});for(const p of r.value)k.push({did:p.did,label:p.name||Wt(p.did),trust_level:p.trust_level,online:we(p),app_count:p.last_state?.apps?.length??0,is_self:!1});return k}),D=Et(()=>$.value?r.value.map(k=>({source:$.value,target:k.did})):[]),R=I(null),B=I(!1),P=Et(()=>{if(!R.value)return"bg-white/30";switch(R.value.sync_status){case"synced":return"bg-green-400";case"syncing":return"bg-yellow-400 animate-pulse";case"error":return"bg-red-400";default:return"bg-white/30"}}),st=Et(()=>{if(!R.value)return"Unknown";switch(R.value.sync_status){case"synced":return"Synced";case"syncing":return"Syncing...";case"error":return"Error";default:return R.value.sync_status}});async function j(){try{i.value=!0;const k=await Y.federationListNodes();r.value=k.nodes}catch(k){s.value=k instanceof Error?k.message:"Failed to load nodes"}finally{i.value=!1}}async function ft(){try{u.value=!0,s.value="";const k=await Y.federationInvite();a.value=k.code}catch(k){s.value=k instanceof Error?k.message:"Failed to generate invite"}finally{u.value=!1}}async function Ct(){try{await window.navigator.clipboard.writeText(a.value)}catch{const k=document.createElement("textarea");k.value=a.value,k.style.position="fixed",k.style.opacity="0",document.body.appendChild(k),k.select(),document.execCommand("copy"),document.body.removeChild(k)}l.value=!0,setTimeout(()=>{l.value=!1},2e3)}async function Jt(){try{d.value=!0,h.value="",b.value=!1,await Y.federationJoin(v.value.trim()),b.value=!0,v.value="",await j(),setTimeout(()=>{c.value=!1,b.value=!1},1500)}catch(k){h.value=k instanceof Error?k.message:"Failed to join"}finally{d.value=!1}}async function $t(){try{w.value=!0,s.value="";const k=await Y.federationSyncState();y.value=k.results,await j()}catch(k){s.value=k instanceof Error?k.message:"Sync failed"}finally{w.value=!1}}async function ht(k,p){try{await Y.federationSetTrust(k,p),await j(),o.value?.did===k&&(o.value=r.value.find(N=>N.did===k)??null)}catch(N){s.value=N instanceof Error?N.message:"Failed to update trust level"}}async function yn(k){try{await Y.federationRemoveNode(k),m.value=!1,o.value=null,await j()}catch(p){m.value=!1,s.value=p instanceof Error?p.message:"Failed to remove node"}}async function wn(k){try{x.value=!0,f.value="",await Y.federationDeployApp({did:k,appId:_.value.trim()}),f.value=`Successfully deployed ${_.value} to remote node`,_.value=""}catch(p){f.value=`Error: ${p instanceof Error?p.message:"Deploy failed"}`}finally{x.value=!1}}async function ye(){try{const k=await Y.call({method:"dwn.status"});R.value=k}catch{R.value=null}}async function mn(){try{B.value=!0,await Y.call({method:"dwn.sync",timeout:12e4}),await ye()}catch{}finally{B.value=!1}}function we(k){if(!k.last_seen)return!1;const p=new Date(k.last_seen).getTime(),N=Date.now()-600*1e3;return p>N}function Wt(k){return k.length<=24?k:k.slice(0,16)+"..."+k.slice(-8)}function me(k){const p=Math.floor((Date.now()-new Date(k).getTime())/1e3);return p<60?"just now":p<3600?Math.floor(p/60)+"m ago":p<86400?Math.floor(p/3600)+"h ago":Math.floor(p/86400)+"d ago"}function Mt(k){if(k==null||k===0)return"--";const p=["B","KB","MB","GB","TB"];let N=0,tt=k;for(;tt>=1024&&N0)return`${p}d ${N}h`;const tt=Math.floor(k%3600/60);return`${N}h ${tt}m`}function bn(k){switch(k){case"trusted":return"bg-green-400/20 text-green-400";case"observer":return"bg-blue-400/20 text-blue-400";case"untrusted":return"bg-white/10 text-white/50";default:return"bg-white/10 text-white/50"}}function Kt(k){const p=n.peers.find(N=>N.did===k);if(!p)return{icon:"?",color:"text-white/30",label:"unknown"};switch(p.preferred_transport){case"mesh":return{icon:"📡",color:"text-orange-400",label:"mesh"};case"lan":return{icon:"🌐",color:"text-green-400",label:"lan"};case"tor":return{icon:"🧅",color:"text-purple-400",label:"tor"};default:return{icon:"?",color:"text-white/30",label:"unknown"}}}return Ye(async()=>{j(),ye(),n.fetchPeers();try{const k=await Y.getNodeDid();$.value=k.did}catch{}}),(k,p)=>(T(),E("div",Io,[g("div",Fo,[g("button",{onClick:p[0]||(p[0]=N=>Cn(e).push("/dashboard/web5")),class:"flex items-center gap-2 text-white/50 hover:text-white/80 transition-colors text-sm mb-4"},[...p[16]||(p[16]=[g("svg",{class:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[g("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M15 19l-7-7 7-7"})],-1),ot(" Back to Web5 ",-1)])]),p[17]||(p[17]=g("h1",{class:"text-3xl font-bold text-white mb-2"},"Federation",-1)),p[18]||(p[18]=g("p",{class:"text-white/70"},"Manage trusted node clusters and sync state across your network",-1)),g("p",Bo,M(r.value.length)+" federated node"+M(r.value.length!==1?"s":""),1)]),r.value.length>0?(T(),E("div",Po,[(T(),E(dt,null,St(A,N=>g("button",{key:N.id,class:J(["px-4 py-2 rounded text-sm font-medium transition-colors",C.value===N.id?"bg-white/10 text-white border-b-2 border-orange-400":"text-white/50 hover:text-white/70"]),onClick:tt=>S(N.id)},M(N.label),11,Ho)),64))])):L("",!0),C.value==="map"&&r.value.length>0?(T(),E("div",zo,[$n(Do,{nodes:F.value,links:D.value},null,8,["nodes","links"])])):L("",!0),C.value==="list"?(T(),E(dt,{key:2},[g("div",Lo,[g("div",Xo,[g("div",Oo,[p[19]||(p[19]=Qt('

Invite Node

Generate invite code

',1)),g("button",{onClick:ft,class:"w-fit px-3 py-1.5 glass-button glass-button-sm rounded text-xs font-medium text-white/90 hover:text-white transition-colors disabled:opacity-50",disabled:u.value},M(u.value?"Generating...":"Generate"),9,Vo)]),g("div",Uo,[p[20]||(p[20]=Qt('

Join

Accept an invite code

',1)),g("button",{onClick:p[1]||(p[1]=N=>c.value=!0),class:"w-fit px-3 py-1.5 glass-button glass-button-sm rounded text-xs font-medium text-white/90 hover:text-white transition-colors"}," Join ")]),g("div",Yo,[p[21]||(p[21]=Qt('

Sync

Refresh all node states

',1)),g("button",{onClick:$t,class:"w-fit px-3 py-1.5 glass-button glass-button-sm rounded text-xs font-medium text-white/90 hover:text-white transition-colors disabled:opacity-50",disabled:w.value},M(w.value?"Syncing...":"Sync Now"),9,qo)])])]),a.value?(T(),E("div",Go,[g("div",Jo,[p[22]||(p[22]=g("h2",{class:"text-lg font-semibold text-white"},"Invite Code",-1)),g("button",{onClick:p[2]||(p[2]=N=>a.value=""),class:"text-white/40 hover:text-white/70 transition-colors text-sm"},"Dismiss")]),p[23]||(p[23]=g("p",{class:"text-xs text-white/60 mb-3"},"Share this code with the node you want to federate with. It can only be used once.",-1)),g("div",Wo,M(a.value),1),g("button",{onClick:Ct,class:"mt-3 px-4 py-2 glass-button rounded text-sm text-white/90 hover:text-white transition-colors"},M(l.value?"Copied":"Copy to Clipboard"),1)])):L("",!0),y.value.length>0?(T(),E("div",Ko,[g("div",Qo,[p[24]||(p[24]=g("h2",{class:"text-lg font-semibold text-white"},"Sync Results",-1)),g("button",{onClick:p[3]||(p[3]=N=>y.value=[]),class:"text-white/40 hover:text-white/70 transition-colors text-sm"},"Dismiss")]),g("div",Zo,[(T(!0),E(dt,null,St(y.value,N=>(T(),E("div",{key:N.did,class:"flex items-center gap-3 p-3 bg-white/5 rounded-lg"},[g("div",{class:J(["w-2 h-2 rounded-full shrink-0",N.status==="ok"?"bg-green-400":"bg-red-400"])},null,2),g("span",jo,M(Wt(N.did)),1),N.status==="ok"?(T(),E("span",ta,M(N.apps)+" apps",1)):(T(),E("span",ea,M(N.error),1))]))),128))])])):L("",!0),s.value?(T(),E("div",na,[g("p",ra,M(s.value),1)])):L("",!0),g("div",ia,[p[31]||(p[31]=g("h2",{class:"text-lg font-semibold text-white mb-4"},"Federated Nodes",-1)),i.value?(T(),E("div",sa,[...p[25]||(p[25]=[g("div",{class:"w-5 h-5 border-2 border-white/20 border-t-orange-400 rounded-full animate-spin"},null,-1),g("span",{class:"text-white/60 text-sm"},"Loading nodes...",-1)])])):r.value.length===0?(T(),E("div",oa,[...p[26]||(p[26]=[g("svg",{class:"w-16 h-16 text-white/20 mx-auto mb-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[g("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"1.5",d:"M21 12a9 9 0 01-9 9m9-9a9 9 0 00-9-9m9 9H3m9 9a9 9 0 01-9-9m9 9c1.657 0 3-4.03 3-9s-1.343-9-3-9m0 18c-1.657 0-3-4.03-3-9s1.343-9 3-9m-9 9a9 9 0 019-9"})],-1),g("p",{class:"text-white/50 text-sm mb-2"},"No federated nodes yet",-1),g("p",{class:"text-white/30 text-xs"},"Generate an invite code or join an existing federation",-1)])])):(T(),E("div",aa,[(T(!0),E(dt,null,St(r.value,N=>(T(),E("div",{key:N.did,class:"bg-black/20 rounded-xl border border-white/10 p-4 cursor-pointer hover:border-white/20 transition-colors",onClick:tt=>o.value=N},[g("div",ua,[g("div",ca,[g("div",{class:J(["w-2.5 h-2.5 rounded-full shrink-0",we(N)?"bg-green-400":"bg-white/30"])},null,2),g("span",fa,M(N.name||Wt(N.did)),1),g("span",{class:J(["text-xs shrink-0",Kt(N.did).color]),title:"Transport: "+Kt(N.did).label},M(Kt(N.did).icon),11,ha)]),g("span",{class:J(["text-xs px-2 py-0.5 rounded-full shrink-0",bn(N.trust_level)])},M(N.trust_level),3)]),g("div",da,[g("div",null,[p[27]||(p[27]=g("span",{class:"text-white/30"},"Apps:",-1)),ot(" "+M(N.last_state?.apps?.length??"--"),1)]),g("div",null,[p[28]||(p[28]=g("span",{class:"text-white/30"},"CPU:",-1)),ot(" "+M(N.last_state?.cpu_usage_percent!=null?N.last_state.cpu_usage_percent.toFixed(1)+"%":"--"),1)]),g("div",pa,[p[29]||(p[29]=g("span",{class:"text-white/30"},"DWN:",-1)),g("span",{class:J(["w-1.5 h-1.5 rounded-full",P.value])},null,2)]),g("div",null,[p[30]||(p[30]=g("span",{class:"text-white/30"},"Seen:",-1)),ot(" "+M(N.last_seen?me(N.last_seen):"never"),1)])])],8,la))),128))]))])],64)):L("",!0),o.value?(T(),E("div",{key:3,class:"fixed inset-0 z-50 flex items-center justify-center p-4 bg-black/10 backdrop-blur-md",onClick:p[11]||(p[11]=_e(N=>{o.value=null,m.value=!1},["self"]))},[g("div",ga,[g("div",va,[p[33]||(p[33]=g("h2",{class:"text-xl font-semibold text-white"},"Node Details",-1)),g("button",{onClick:p[4]||(p[4]=N=>{o.value=null,m.value=!1}),class:"text-white/40 hover:text-white/70 transition-colors"},[...p[32]||(p[32]=[g("svg",{class:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[g("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M6 18L18 6M6 6l12 12"})],-1)])])]),g("div",xa,[g("div",ya,[p[34]||(p[34]=g("p",{class:"text-xs text-white/40 mb-1"},"DID",-1)),g("p",wa,M(o.value.did),1)]),g("div",ma,[p[35]||(p[35]=g("p",{class:"text-xs text-white/40 mb-1"},"Onion Address",-1)),g("p",_a,M(o.value.onion),1)]),g("div",ba,[p[37]||(p[37]=g("p",{class:"text-xs text-white/40 mb-1"},"Trust Level",-1)),g("div",ka,[g("select",{value:o.value.trust_level,onChange:p[5]||(p[5]=N=>ht(o.value.did,N.target.value)),class:"bg-black/30 text-white text-sm rounded px-2 py-1 border border-white/10"},[...p[36]||(p[36]=[g("option",{value:"trusted"},"Trusted",-1),g("option",{value:"observer"},"Observer",-1),g("option",{value:"untrusted"},"Untrusted",-1)])],40,Na)])]),g("div",Aa,[p[38]||(p[38]=g("p",{class:"text-xs text-white/40 mb-1"},"Added",-1)),g("p",Ca,M(o.value.added_at),1)]),o.value.last_state?(T(),E("div",$a,[p[39]||(p[39]=g("p",{class:"text-xs text-white/40 mb-2"},"Resource Usage",-1)),g("div",Ma,[g("div",null,"CPU: "+M(o.value.last_state.cpu_usage_percent?.toFixed(1)??"--")+"%",1),g("div",null,"Uptime: "+M(o.value.last_state.uptime_secs?_n(o.value.last_state.uptime_secs):"--"),1),g("div",null,"RAM: "+M(Mt(o.value.last_state.mem_used_bytes))+" / "+M(Mt(o.value.last_state.mem_total_bytes)),1),g("div",null,"Disk: "+M(Mt(o.value.last_state.disk_used_bytes))+" / "+M(Mt(o.value.last_state.disk_total_bytes)),1)])])):L("",!0),o.value.last_state?.apps?.length?(T(),E("div",Sa,[g("p",Ea,"Apps ("+M(o.value.last_state.apps.length)+")",1),g("div",Ta,[(T(!0),E(dt,null,St(o.value.last_state.apps,N=>(T(),E("div",{key:N.id,class:"flex items-center justify-between text-sm"},[g("span",Ra,M(N.id),1),g("span",{class:J(["text-xs",N.status==="running"?"text-green-400":"text-white/40"])},M(N.status),3)]))),128))])])):L("",!0),o.value.trust_level==="trusted"?(T(),E("div",Da,[p[40]||(p[40]=g("p",{class:"text-xs text-white/40 mb-2"},"Deploy App",-1)),g("div",Ia,[be(g("input",{"onUpdate:modelValue":p[6]||(p[6]=N=>_.value=N),placeholder:"App ID (e.g. bitcoin)",class:"flex-1 bg-black/30 text-white text-sm rounded px-2 py-1.5 border border-white/10 focus:border-orange-400/50 focus:outline-none"},null,512),[[ke,_.value]]),g("button",{onClick:p[7]||(p[7]=N=>wn(o.value.did)),class:"px-3 py-1.5 glass-button rounded text-xs text-white/90 font-medium disabled:opacity-50",disabled:x.value||!_.value.trim()},M(x.value?"Deploying...":"Deploy"),9,Fa)]),f.value?(T(),E("p",{key:0,class:J(["text-xs mt-2",f.value.startsWith("Error")?"text-red-400":"text-green-400"])},M(f.value),3)):L("",!0)])):L("",!0),g("div",Ba,[g("div",Pa,[p[41]||(p[41]=g("p",{class:"text-xs text-white/40"},"DWN Sync",-1)),g("div",Ha,[g("span",{class:J(["w-1.5 h-1.5 rounded-full",P.value])},null,2),g("span",za,M(st.value),1)])]),g("div",La,[g("div",null,[p[42]||(p[42]=g("span",{class:"text-white/30"},"Messages:",-1)),ot(" "+M(R.value?.message_count??"--"),1)]),g("div",null,[p[43]||(p[43]=g("span",{class:"text-white/30"},"Last sync:",-1)),ot(" "+M(R.value?.last_sync?me(R.value.last_sync):"never"),1)])]),g("button",{onClick:mn,class:"px-3 py-1.5 glass-button rounded text-xs text-white/90 font-medium disabled:opacity-50",disabled:B.value},M(B.value?"Syncing...":"Sync Now"),9,Xa)]),m.value?(T(),E("div",Va,[p[44]||(p[44]=g("p",{class:"text-sm text-red-400 mb-3"},"Are you sure? This node will be removed from your federation.",-1)),g("div",Ua,[g("button",{onClick:p[9]||(p[9]=N=>m.value=!1),class:"flex-1 px-3 py-1.5 glass-button rounded text-sm text-white/70"},"Cancel"),g("button",{onClick:p[10]||(p[10]=N=>yn(o.value.did)),class:"flex-1 px-3 py-1.5 rounded text-sm text-red-400 border border-red-400/30 hover:bg-red-400/10 transition-colors font-medium"},"Confirm Remove")])])):(T(),E("div",Oa,[g("button",{onClick:p[8]||(p[8]=N=>m.value=!0),class:"w-full mt-4 px-4 py-2 rounded text-sm text-red-400 border border-red-400/30 hover:bg-red-400/10 transition-colors"}," Remove from Federation ")]))])])])):L("",!0),c.value?(T(),E("div",{key:4,class:"fixed inset-0 z-50 flex items-center justify-center p-4 bg-black/10 backdrop-blur-md",onClick:p[15]||(p[15]=_e(N=>c.value=!1,["self"]))},[g("div",Ya,[g("div",qa,[p[46]||(p[46]=g("h2",{class:"text-xl font-semibold text-white"},"Join Federation",-1)),g("button",{onClick:p[12]||(p[12]=N=>c.value=!1),class:"text-white/40 hover:text-white/70 transition-colors"},[...p[45]||(p[45]=[g("svg",{class:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[g("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M6 18L18 6M6 6l12 12"})],-1)])])]),p[47]||(p[47]=g("p",{class:"text-sm text-white/60 mb-4"},"Paste the invite code from the node you want to federate with.",-1)),be(g("textarea",{"onUpdate:modelValue":p[13]||(p[13]=N=>v.value=N),placeholder:"fed1:...",rows:"3",class:"w-full bg-black/30 text-white text-sm rounded-lg p-3 border border-white/10 focus:border-orange-400/50 focus:outline-none font-mono resize-none"},null,512),[[ke,v.value]]),h.value?(T(),E("div",Ga,M(h.value),1)):L("",!0),b.value?(T(),E("div",Ja,"Successfully joined federation")):L("",!0),g("div",Wa,[g("button",{onClick:p[14]||(p[14]=N=>c.value=!1),class:"flex-1 px-4 py-2 glass-button rounded text-sm text-white/70"},"Cancel"),g("button",{onClick:Jt,class:"flex-1 px-4 py-2 glass-button rounded text-sm text-white font-medium disabled:opacity-50",disabled:d.value||!v.value.trim()},M(d.value?"Joining...":"Join"),9,Ka)])])])):L("",!0)]))}});export{ja as default}; diff --git a/neode-ui/dist/assets/Federation-gSEt_uL4.css b/neode-ui/dist/assets/Federation-gSEt_uL4.css new file mode 100644 index 0000000..73a2843 --- /dev/null +++ b/neode-ui/dist/assets/Federation-gSEt_uL4.css @@ -0,0 +1 @@ +.network-map-container[data-v-0e9c18d1]{background:#0009;-webkit-backdrop-filter:blur(24px);backdrop-filter:blur(24px);border-radius:.75rem;border:1px solid rgba(255,255,255,.1);box-shadow:inset 0 1px #ffffff38;min-height:400px;width:100%} diff --git a/neode-ui/dist/assets/GoalDetail-BDM8F7F1.js b/neode-ui/dist/assets/GoalDetail-BDM8F7F1.js new file mode 100644 index 0000000..9d4c039 --- /dev/null +++ b/neode-ui/dist/assets/GoalDetail-BDM8F7F1.js @@ -0,0 +1 @@ +import{d as U,y as H,z as J,c as n,a as e,D as a,E as c,F as A,f as S,n as K,G as _,P as Q,h as j,i as B,U as W,T as X,j as u,x as Y,J as Z,r as G,u as ee,q as i,t as te}from"./index-DnbYEqLr.js";import{u as se,g as oe}from"./goals-f4yPn45c.js";const ae={class:"pb-6"},le={key:0,class:"glass-card p-12 text-center"},ne={class:"text-white/70"},ie={class:"mb-8"},re={class:"text-3xl font-bold text-white mb-2 drop-shadow-[0_2px_8px_rgba(0,0,0,0.6)]"},ce={class:"text-white/70"},de={class:"mb-8"},ue={class:"flex items-center justify-between mb-2"},pe={class:"text-sm text-white/60"},ge={class:"w-full h-2 bg-white/10 rounded-full overflow-hidden"},me={key:0,class:"glass-card p-6 mb-6 border-l-4 border-orange-400"},ve={class:"text-lg font-semibold text-white mb-1"},fe={class:"text-white/60 text-sm leading-relaxed"},he={class:"space-y-3"},_e={class:"flex items-start gap-4"},xe={class:"mt-0.5 shrink-0"},be={key:0,class:"w-6 h-6 rounded-full bg-green-500/20 flex items-center justify-center"},ke={key:1,class:"w-6 h-6 rounded-full bg-orange-500/20 flex items-center justify-center"},we={key:2,class:"w-6 h-6 rounded-full bg-white/10 flex items-center justify-center"},ye={class:"text-xs text-white/40 font-medium"},Se={class:"flex-1 min-w-0"},Ce={class:"text-base font-semibold text-white/90 mb-1"},De={class:"text-sm text-white/55 leading-relaxed"},Ie={key:0,class:"mt-4"},Ae=["onClick","disabled"],je=["onClick"],Be=["onClick"],Ge={key:3,disabled:"",class:"glass-button glass-button-sm rounded-lg px-5 py-2 text-sm font-medium opacity-50"},Me={key:1,class:"glass-card p-8 mt-6 text-center"},Te={class:"text-xl font-semibold text-white mb-2"},ze={class:"text-white/60 mb-6"},$e={key:0,class:"fixed bottom-20 left-1/2 -translate-x-1/2 z-50 max-w-md w-full px-4",role:"alert","aria-live":"assertive"},Ee={class:"bg-red-500/20 border border-red-500/40 backdrop-blur-sm rounded-lg px-4 py-3 text-red-200 text-sm flex items-center justify-between gap-3"},Le=U({__name:"GoalDetail",setup(Pe){const{t:l}=H(),M=ee(),C=Y(),b=J(),p=se(),d=u(()=>M.params.goalId),r=u(()=>oe(d.value)),m=G(!1),v=G("");let k;function T(s){v.value=s,k&&clearTimeout(k),k=setTimeout(()=>{v.value=""},5e3)}const g=u(()=>p.getGoalStatus(d.value)),w=u(()=>{if(!r.value)return new Set;const s=new Set;for(const t of r.value.steps)t.appId&&y(t.appId)&&s.add(t.id),p.progress[d.value]?.completedSteps.includes(t.id)&&s.add(t.id);return s}),f=u(()=>{if(!r.value)return 0;const s=r.value.steps;for(let t=0;tMath.min(f.value+1,r.value?.steps.length||1)),$=u(()=>r.value?Math.round(w.value.size/r.value.steps.length*100):0),E=u(()=>g.value==="completed"?l("goalDetail.completed"):g.value==="in-progress"?l("goalDetail.inProgress"):l("goalDetail.notStarted")),L=u(()=>g.value==="completed"?"goal-status-badge-completed":g.value==="in-progress"?"goal-status-badge-in-progress":"goal-status-badge-not-started"),P=u(()=>{if(!r.value)return!1;const s=r.value.requiredApps.includes("bitcoin-knots"),t=!N("bitcoin-knots");return s&&t&&g.value!=="completed"});function x(s){return w.value.has(s.id)}const R={immich:["immich-server","immich-app","immich_server"],nextcloud:["nextcloud-aio","nextcloud-server"],"bitcoin-knots":["bitcoin","bitcoin-core"]};function D(s,t){if(s===t)return!0;const o=R[t];return o?o.includes(s):!1}function y(s){return Object.keys(b.packages).some(t=>D(t,s))}function N(s){return Object.entries(b.packages).some(([t,o])=>D(t,s)&&o.state==="running")}async function V(s){if(s.appId){m.value=!0,p.progress[d.value]||p.startGoal(d.value);try{await b.installPackage(s.appId,"","latest"),p.completeStep(d.value,s.id)}catch(t){T(`Install failed: ${t instanceof Error?t.message:"Unknown error"}`)}finally{m.value=!1}}}function F(s){p.completeStep(d.value,s.id),s.appId&&C.push(`/dashboard/apps/${s.appId}`)}function O(s){p.progress[d.value]||p.startGoal(d.value),p.completeStep(d.value,s.id)}function q(){C.push("/dashboard")}return(s,t)=>(i(),n("div",ae,[e("button",{onClick:q,class:"flex items-center gap-2 text-white/60 hover:text-white mb-6 transition-colors"},[t[1]||(t[1]=e("svg",{class:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M15 19l-7-7 7-7"})],-1)),e("span",null,a(c(l)("goalDetail.backToGoals")),1)]),r.value?(i(),n(A,{key:1},[e("div",ie,[e("h1",re,a(r.value.title),1),e("p",ce,a(r.value.subtitle),1)]),e("div",de,[e("div",ue,[e("span",pe,a(c(l)("goalDetail.stepOf",{current:z.value,total:r.value.steps.length})),1),e("span",{class:S(["goal-status-badge",L.value])},a(E.value),3)]),e("div",ge,[e("div",{class:S(["h-full rounded-full transition-all duration-500 ease-out",g.value==="completed"?"bg-green-400":"bg-orange-400"]),style:K({width:`${$.value}%`})},null,6)])]),P.value?(i(),n("div",me,[e("h3",ve,a(c(l)("goalDetail.syncTitle")),1),e("p",fe,a(c(l)("goalDetail.syncMessage")),1)])):_("",!0),e("div",he,[(i(!0),n(A,null,Q(r.value.steps,(o,h)=>(i(),n("div",{key:o.id,class:"glass-card p-0 overflow-hidden"},[e("div",{class:S(["goal-step",{"goal-step-completed":x(o),"goal-step-active":h===f.value&&g.value!=="completed","goal-step-pending":h>f.value&&!x(o)}])},[e("div",_e,[e("div",xe,[x(o)?(i(),n("div",be,[...t[2]||(t[2]=[e("svg",{class:"w-4 h-4 text-green-400",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M5 13l4 4L19 7"})],-1)])])):h===f.value&&m.value?(i(),n("div",ke,[...t[3]||(t[3]=[e("svg",{class:"w-4 h-4 text-orange-400 animate-spin",fill:"none",viewBox:"0 0 24 24"},[e("circle",{class:"opacity-25",cx:"12",cy:"12",r:"10",stroke:"currentColor","stroke-width":"4"}),e("path",{class:"opacity-75",fill:"currentColor",d:"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"})],-1)])])):(i(),n("div",we,[e("span",ye,a(h+1),1)]))]),e("div",Se,[e("h3",Ce,a(o.title),1),e("p",De,a(o.description),1),h===f.value&&g.value!=="completed"?(i(),n("div",Ie,[o.action==="install"&&o.appId&&!y(o.appId)?(i(),n("button",{key:0,onClick:I=>V(o),disabled:m.value,class:"glass-button glass-button-sm rounded-lg px-5 py-2 text-sm font-medium"},a(m.value?c(l)("common.installing"):c(l)("goalDetail.installApp",{name:o.title.replace("Install ","")})),9,Ae)):o.action==="configure"?(i(),n("button",{key:1,onClick:I=>F(o),class:"glass-button glass-button-sm rounded-lg px-5 py-2 text-sm font-medium"},a(c(l)("goalDetail.openAndConfigure")),9,je)):o.action==="info"?(i(),n("button",{key:2,onClick:I=>O(o),class:"glass-button glass-button-sm rounded-lg px-5 py-2 text-sm font-medium"},a(c(l)("goalDetail.iveDoneThis")),9,Be)):x(o)||y(o.appId||"")?(i(),n("button",Ge,a(c(l)("goalDetail.complete")),1)):_("",!0)])):_("",!0)])])],2)]))),128))]),g.value==="completed"?(i(),n("div",Me,[t[4]||(t[4]=e("div",{class:"w-16 h-16 mx-auto mb-4 rounded-full bg-green-500/20 flex items-center justify-center"},[e("svg",{class:"w-8 h-8 text-green-400",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M5 13l4 4L19 7"})])],-1)),e("h2",Te,a(c(l)("goalDetail.allSet")),1),e("p",ze,a(c(l)("goalDetail.goalReady",{title:r.value.title})),1),j(c(W),{to:"/dashboard/apps",class:"glass-button rounded-lg px-6 py-3 font-medium"},{default:B(()=>[Z(a(c(l)("goalDetail.viewMyServices")),1)]),_:1})])):_("",!0)],64)):(i(),n("div",le,[e("p",ne,a(c(l)("goalDetail.notFound")),1)])),j(X,{name:"fade"},{default:B(()=>[v.value?(i(),n("div",$e,[e("div",Ee,[e("span",null,a(v.value),1),e("button",{onClick:t[0]||(t[0]=o=>v.value=""),class:"text-red-300 hover:text-white shrink-0"},"×")])])):_("",!0)]),_:1})]))}}),Ve=te(Le,[["__scopeId","data-v-35eaa724"]]);export{Ve as default}; diff --git a/neode-ui/dist/assets/GoalDetail-gx_165AC.css b/neode-ui/dist/assets/GoalDetail-gx_165AC.css new file mode 100644 index 0000000..dee69f4 --- /dev/null +++ b/neode-ui/dist/assets/GoalDetail-gx_165AC.css @@ -0,0 +1 @@ +.fade-enter-active[data-v-35eaa724],.fade-leave-active[data-v-35eaa724]{transition:opacity .3s ease}.fade-enter-from[data-v-35eaa724],.fade-leave-to[data-v-35eaa724]{opacity:0} diff --git a/neode-ui/dist/assets/Home-BM_tfGHm.js b/neode-ui/dist/assets/Home-BM_tfGHm.js new file mode 100644 index 0000000..d3aee37 --- /dev/null +++ b/neode-ui/dist/assets/Home-BM_tfGHm.js @@ -0,0 +1 @@ +import{d as he,c as u,f as i,F as $,P as O,E as t,m as ae,i as f,a as e,D as s,G as k,J as y,n as D,U as g,q as r,y as De,S as Ue,z as Le,A as Ne,w as re,o as Re,B as j,h as _,r as c,j as m,Y as Fe,Q as ce,x as Oe,Z as Qe,t as We}from"./index-DnbYEqLr.js";import{u as Ee}from"./loginTransition-Bm4PAghQ.js";import{P as ue}from"./api-CHkUAu4g.js";import{u as Ge,G as me}from"./goals-f4yPn45c.js";import{f as qe}from"./filebrowser-client-DRXM9PC4.js";const Ke={class:"flex items-start justify-between mb-4"},Ve={class:"w-10 h-10 rounded-xl bg-white/10 flex items-center justify-center shrink-0"},He={class:"text-xl"},ze={key:0,class:"w-1.5 h-1.5 rounded-full bg-green-400"},Je={key:1,class:"w-1.5 h-1.5 rounded-full bg-orange-400"},Ye={class:"text-lg font-semibold text-white mb-1"},Ze={class:"text-sm text-white/55 mb-4 leading-relaxed"},Xe={class:"flex items-center justify-between"},et={class:"text-xs text-white/40"},tt={class:"text-xs text-white/50 flex items-center gap-1"},st=he({__name:"EasyHome",props:{show:{type:Boolean},animate:{type:Boolean}},setup(Q){const a=Ge(),W=me,S=a.goalStatuses;function v(b){return{shop:"🏪",payments:"⚡",photos:"📸",files:"📁",lightning:"⚡",identity:"🔑",backup:"💾"}[b]||"📦"}function U(b){const x=S[b];return x==="completed"?"Done":x==="in-progress"?"In Progress":"Start"}function E(b){const x=S[b];return x==="completed"?"goal-status-badge-completed":x==="in-progress"?"goal-status-badge-in-progress":"goal-status-badge-not-started"}return(b,x)=>(r(),u("div",{class:i(["grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-5 mb-8 transition-opacity duration-300",{"opacity-0 pointer-events-none":!Q.show}])},[(r(!0),u($,null,O(t(W),(h,I)=>(r(),ae(t(g),{key:h.id,to:`/dashboard/goals/${h.id}`,class:i(["goal-card glass-card p-6 block",{"home-card-animate":Q.animate}]),style:D({"--card-stagger":I})},{default:f(()=>[e("div",Ke,[e("div",Ve,[e("span",He,s(v(h.icon)),1)]),e("span",{class:i(["goal-status-badge",E(h.id)])},[t(S)[h.id]==="completed"?(r(),u("span",ze)):t(S)[h.id]==="in-progress"?(r(),u("span",Je)):k("",!0),y(" "+s(U(h.id)),1)],2)]),e("h3",Ye,s(h.title),1),e("p",Ze,s(h.subtitle),1),e("div",Xe,[e("span",et,s(h.estimatedTime),1),e("span",tt,s(h.difficulty==="beginner"?"Beginner":"Intermediate"),1)])]),_:2},1032,["to","class","style"]))),128))],2))}}),ot={class:"pb-6"},at={class:"mb-4 md:mb-8 flex items-start justify-between gap-4"},nt={class:"min-h-[4.5rem]"},it={class:"text-3xl font-bold text-white mb-2 drop-shadow-[0_2px_8px_rgba(0,0,0,0.6)]"},lt={key:0,class:"typing-caret"},dt={class:"text-white/80"},rt={key:0,class:"typing-caret"},ct=["aria-selected"],ut=["aria-selected"],ht={class:"flex items-center gap-3 min-w-0"},mt={class:"min-w-0"},vt={class:"text-sm font-medium text-white"},pt={key:0,class:"text-xs text-white/60 truncate"},ft={class:"flex items-center gap-2 shrink-0"},gt=["aria-selected"],_t=["aria-selected"],bt={class:"home-card-shell"},xt={class:"home-card-inner p-6 flex flex-col h-full min-h-0"},wt={class:"home-card-header flex items-start justify-between mb-4 shrink-0"},yt={class:"home-card-text"},kt={class:"text-xl font-semibold text-white mb-1"},St={class:"text-sm text-white/70"},Ct={class:"home-card-stats grid grid-cols-1 sm:grid-cols-2 gap-4 mb-4 flex-1 min-h-0"},jt={class:"p-4 bg-white/5 rounded-lg"},Tt={class:"text-2xl font-bold text-white"},Bt={class:"p-4 bg-white/5 rounded-lg flex items-center justify-around"},$t=["onClick","title"],It=["src","alt"],At={class:"home-card-buttons flex gap-2 mt-auto pt-4 shrink-0"},Mt={class:"home-card-shell"},Pt={class:"home-card-inner p-6 flex flex-col h-full min-h-0"},Dt={class:"home-card-header flex items-start justify-between mb-4 shrink-0"},Ut={class:"home-card-text"},Lt={class:"text-xl font-semibold text-white mb-1"},Nt={class:"text-sm text-white/70"},Rt={class:"home-card-stats grid grid-cols-1 sm:grid-cols-2 gap-4 mb-4 flex-1 min-h-0"},Ft={class:"p-4 bg-white/5 rounded-lg"},Ot={class:"text-xs text-white/60 mb-1"},Qt={class:"text-2xl font-bold text-white"},Wt={class:"p-4 bg-white/5 rounded-lg"},Et={class:"text-xs text-white/60 mb-1"},Gt={class:"text-2xl font-bold text-white"},qt={class:"home-card-buttons flex gap-2 mt-auto pt-4 shrink-0"},Kt={class:"home-card-shell"},Vt={class:"home-card-inner p-6 flex flex-col h-full min-h-0"},Ht={class:"home-card-header flex items-start justify-between mb-4 shrink-0"},zt={class:"home-card-text"},Jt={class:"text-xl font-semibold text-white mb-1"},Yt={class:"text-sm text-white/70"},Zt={class:"home-card-stats space-y-3 mb-4 flex-1 min-h-0"},Xt={class:"flex items-center justify-between p-3 bg-white/5 rounded-lg"},es={class:"flex items-center gap-3"},ts={class:"text-sm text-white/80"},ss={class:"flex items-center justify-between p-3 bg-white/5 rounded-lg"},os={class:"flex items-center gap-3"},as={class:"text-sm text-white/80"},ns={class:"flex items-center justify-between p-3 bg-white/5 rounded-lg"},is={class:"flex items-center gap-3"},ls={class:"text-sm text-white/80"},ds={class:"text-sm text-white/80 font-medium"},rs={class:"home-card-buttons flex gap-2 mt-auto pt-4 shrink-0"},cs={class:"home-card-shell"},us={class:"home-card-inner p-6 flex flex-col h-full min-h-0"},hs={class:"home-card-header flex items-start justify-between mb-4 shrink-0"},ms={class:"home-card-text"},vs={class:"text-xl font-semibold text-white mb-1"},ps={class:"text-sm text-white/70"},fs={class:"home-card-stats space-y-3 mb-4 flex-1 min-h-0"},gs={class:"flex items-center justify-between p-3 bg-white/5 rounded-lg"},_s={class:"flex items-center gap-3"},bs={class:"text-sm text-white/80"},xs={class:"flex items-center justify-between p-3 bg-white/5 rounded-lg"},ws={class:"flex items-center gap-3"},ys={class:"text-sm text-white/80"},ks={class:"flex items-center justify-between p-3 bg-white/5 rounded-lg"},Ss={class:"flex items-center gap-3"},Cs={class:"text-sm text-white/80"},js={class:"text-sm text-white/50 font-medium"},Ts={class:"home-card-buttons flex gap-2 mt-auto pt-4 shrink-0"},Bs={class:"home-card-shell"},$s={class:"home-card-inner p-6 flex flex-col h-full min-h-0"},Is={class:"home-card-header flex items-start justify-between mb-4 shrink-0"},As={class:"home-card-text"},Ms={class:"text-xl font-semibold text-white mb-1"},Ps={class:"text-sm text-white/70"},Ds={class:"home-card-stats grid grid-cols-1 sm:grid-cols-3 gap-4 flex-1 min-h-0"},Us={class:"p-4 bg-white/5 rounded-lg"},Ls={class:"flex items-center justify-between mb-2"},Ns={class:"text-xs text-white/60"},Rs={class:"w-full h-2 bg-white/10 rounded-full overflow-hidden"},Fs={class:"p-4 bg-white/5 rounded-lg"},Os={class:"flex items-center justify-between mb-2"},Qs={class:"text-xs text-white/60"},Ws={class:"w-full h-2 bg-white/10 rounded-full overflow-hidden"},Es={class:"p-4 bg-white/5 rounded-lg"},Gs={class:"flex items-center justify-between mb-2"},qs={class:"text-xs text-white/60"},Ks={class:"w-full h-2 bg-white/10 rounded-full overflow-hidden"},Vs={class:"home-card-shell"},Hs={class:"home-card-inner px-6 py-6"},zs={class:"flex items-start justify-between mb-2"},Js={class:"text-xl font-semibold text-white/96 mb-1"},Ys={class:"text-sm text-white/60 mb-4"},Zs={class:"grid grid-cols-1 md:grid-cols-3 gap-3"},Xs={key:2,class:"flex flex-col items-center justify-center min-h-[40vh]"},oe="archipelago-quick-start-dismissed",eo=5,to=55,so=he({__name:"Home",setup(Q){const{t:a}=De(),W=Oe(),S=Ue(),v=c("dashboard"),U=me.slice(0,3),E=[...new Set(U.flatMap(o=>o.requiredApps))],b=Le(),x=Ee(),h=a("home.title"),I=a("home.subtitle"),G=c(""),q=c(""),K=c(!1),L=c(!1),w=c(!1),ne=c(!1),p=c(!1);let T=null;const ve=m(()=>w.value?G.value:h),pe=m(()=>w.value?q.value:I);Ne(()=>{T&&clearInterval(T),se&&clearInterval(se)}),re(()=>x.pendingWelcomeTyping,o=>{o&&(w.value=!0)}),re(()=>x.startWelcomeTyping,o=>{if(!o||ne.value)return;ne.value=!0,w.value=!0,G.value="",q.value="",K.value=!0,L.value=!1,Qe(),p.value=!0;let n=0;T=setInterval(()=>{nb.packages),C=m(()=>Object.keys(N.value||{}).length),R=m(()=>Object.values(N.value||{}).filter(o=>o.state===ue.Running).length),fe=[{id:"indeedhub",name:"Indeehub",icon:"/assets/img/app-icons/indeedhub.png",bg:"#0a0a0a",padded:!0},{id:"botfights",name:"BotFights",icon:"/assets/img/app-icons/botfights.svg",bg:"",padded:!1},{id:"484-kitchen",name:"484 Kitchen",icon:"/assets/img/app-icons/484-kitchen.png",bg:"",padded:!1}],V=m(()=>C.value>0&&R.value===C.value),ge=m(()=>C.value===0?a("home.noApps"):V.value?a("home.allRunning"):`${R.value}/${C.value} ${a("home.runningLabel")}`),_e=m(()=>C.value===0?"text-white/60":V.value?"text-green-400":"text-yellow-400"),be=m(()=>C.value===0?"bg-white/40":V.value?"bg-green-400":"bg-yellow-400"),xe=m(()=>b.isConnected?a("common.connected"):a("common.disconnected")),we=m(()=>b.isConnected?"text-green-400":"text-red-400"),ye=m(()=>b.isConnected?"bg-green-400":"bg-red-400"),B=c(!1),ke=m(()=>E.every(o=>Object.keys(N.value).includes(o))),Se=m(()=>ke.value?!1:!B.value);function Ce(){try{const o=localStorage.getItem(oe);if(!o){B.value=!1;return}const n=JSON.parse(o);if(!n.dismissed){B.value=!1;return}const l=(n.loginCount||0)+1;localStorage.setItem(oe,JSON.stringify({dismissed:!0,loginCount:l})),B.value=l%eo!==0}catch{B.value=!1}}function je(){B.value=!0;try{localStorage.setItem(oe,JSON.stringify({dismissed:!0,loginCount:0}))}catch{}}Ce();const H=c(!1),ie=c(!1),le=c(""),z=c("");async function Te(){try{const o=await j.call({method:"update.status"});H.value=o.update_available}catch{}if(H.value)try{const o=await j.call({method:"update.check"});o.update&&(le.value=o.update.version,z.value=o.update.changelog.slice(0,2).join("; "))}catch{}}async function Be(){ie.value=!0;try{await j.call({method:"update.dismiss"})}catch{}}const J=c(null),Y=c(null);function A(o){if(o===0)return"0 B";const n=["B","KB","MB","GB","TB"],l=Math.floor(Math.log(o)/Math.log(1024)),F=o/Math.pow(1024,l);return`${F<10?F.toFixed(1):Math.round(F)} ${n[l]}`}const $e=m(()=>J.value!==null?A(J.value):"..."),Ie=m(()=>Y.value!==null?String(Y.value):"...");Re(async()=>{try{const o=await qe.getUsage();J.value=o.totalSize,Y.value=o.folderCount}catch{}de(),se=setInterval(de,3e4),Te(),Ae()});const M=c("--"),P=c("--"),Z=c("--");async function Ae(){try{const o=await j.call({method:"identity.get",timeout:5e3});M.value=o.did?"Active":"Inactive"}catch{M.value="--"}try{const o=await j.call({method:"dwn.health",timeout:5e3});P.value=o.status==="ok"?"Synced":o.status||"--"}catch{P.value="--"}try{const o=await j.call({method:"identity.list-credentials",timeout:5e3});Z.value=String(o.credentials?.length??0)}catch{Z.value="0"}}const X=c(!1),d=Fe({cpuPercent:0,memUsed:0,memTotal:0,memPercent:0,diskUsed:0,diskTotal:0,diskPercent:0,uptimeSecs:0}),Me=m(()=>{if(d.uptimeSecs===0)return a("home.systemMonitoring");const o=Math.floor(d.uptimeSecs/86400),n=Math.floor(d.uptimeSecs%86400/3600);if(o>0)return`Uptime: ${o}d ${n}h`;const l=Math.floor(d.uptimeSecs%3600/60);return`Uptime: ${n}h ${l}m`});function ee(o){return o>=90?"text-red-400":o>=70?"text-orange-400":"text-green-400"}function te(o){return o>=90?"bg-red-400":o>=70?"bg-orange-400":"bg-green-400"}let se=null;async function de(){try{const o=await j.call({method:"system.stats"});d.cpuPercent=o.cpu_usage_percent,d.memUsed=o.mem_used_bytes,d.memTotal=o.mem_total_bytes,d.memPercent=o.mem_total_bytes>0?o.mem_used_bytes/o.mem_total_bytes*100:0,d.diskUsed=o.disk_used_bytes,d.diskTotal=o.disk_total_bytes,d.diskPercent=o.disk_total_bytes>0?o.disk_used_bytes/o.disk_total_bytes*100:0,d.uptimeSecs=o.uptime_secs,X.value=!0}catch{X.value=!0}}function Pe(){const o=N.value.filebrowser;if(o&&o.state===ue.Running){const n=window.location.hostname;ce().open({url:`http://${n}:8083`,title:"File Browser"})}else W.push("/dashboard/cloud")}return(o,n)=>(r(),u("div",ot,[e("div",at,[e("div",nt,[e("h1",it,[y(s(ve.value),1),K.value?(r(),u("span",lt)):k("",!0)]),e("p",dt,[y(s(pe.value),1),L.value?(r(),u("span",rt)):k("",!0)])]),t(S).isChat?k("",!0):(r(),u("div",{key:0,class:i(["hidden md:flex mode-switcher flex-shrink-0 transition-opacity duration-500",{"opacity-0 pointer-events-none":w.value&&!p.value}])},[e("button",{class:i(["mode-switcher-btn",{"mode-switcher-btn-active":v.value==="dashboard"}]),role:"tab","aria-selected":v.value==="dashboard",onClick:n[0]||(n[0]=l=>v.value="dashboard")},s(t(a)("home.dashboardTab")),11,ct),e("button",{class:i(["mode-switcher-btn",{"mode-switcher-btn-active":v.value==="setup"}]),role:"tab","aria-selected":v.value==="setup",onClick:n[1]||(n[1]=l=>v.value="setup")},s(t(a)("home.setupTab")),11,ut)],2))]),H.value&&!ie.value?(r(),u("div",{key:0,role:"alert",class:i(["mb-6 glass-card p-4 flex items-center justify-between gap-4 border-l-4 border-orange-400 transition-opacity duration-300",{"opacity-0 pointer-events-none":w.value&&!p.value}])},[e("div",ht,[n[4]||(n[4]=e("svg",{class:"w-6 h-6 text-orange-400 shrink-0","aria-hidden":"true",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-4l-4 4m0 0l-4-4m4 4V4"})],-1)),e("div",mt,[e("p",vt,s(t(a)("home.updateAvailable",{version:le.value})),1),z.value?(r(),u("p",pt,s(z.value),1)):k("",!0)])]),e("div",ft,[_(t(g),{to:"/dashboard/settings/update",class:"glass-button rounded-lg px-4 py-2 text-sm font-medium"},{default:f(()=>[y(s(t(a)("home.updateNow")),1)]),_:1}),e("button",{onClick:Be,"aria-label":"Dismiss update notification",class:"text-white/40 hover:text-white/80 transition-colors p-1",title:"Dismiss"},[...n[5]||(n[5]=[e("svg",{class:"w-5 h-5","aria-hidden":"true",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M6 18L18 6M6 6l12 12"})],-1)])])])],2)):k("",!0),t(S).isChat?k("",!0):(r(),u($,{key:1},[e("div",{class:i(["md:hidden mode-switcher mb-6 w-full transition-opacity duration-500",{"opacity-0 pointer-events-none":w.value&&!p.value}]),role:"tablist"},[e("button",{class:i(["mode-switcher-btn",{"mode-switcher-btn-active":v.value==="dashboard"}]),role:"tab","aria-selected":v.value==="dashboard",onClick:n[2]||(n[2]=l=>v.value="dashboard")},s(t(a)("home.dashboardTab")),11,gt),e("button",{class:i(["mode-switcher-btn",{"mode-switcher-btn-active":v.value==="setup"}]),role:"tab","aria-selected":v.value==="setup",onClick:n[3]||(n[3]=l=>v.value="setup")},s(t(a)("home.setupTab")),11,_t)],2),v.value==="setup"?(r(),ae(st,{key:0,show:!w.value||p.value,animate:p.value},null,8,["show","animate"])):(r(),u("div",{key:1,class:i(["grid grid-cols-1 lg:grid-cols-2 gap-6 mb-8 transition-opacity duration-300",{"opacity-0 pointer-events-none":w.value&&!p.value}])},[e("div",{"data-controller-container":"",tabindex:"0",class:i(["home-card controller-focusable",{"home-card-animate":p.value}]),style:{"--card-stagger":"0"}},[e("div",bt,[e("div",xt,[e("div",wt,[e("div",yt,[e("h2",kt,s(t(a)("home.myApps")),1),e("p",St,s(t(a)("home.myAppsDesc")),1)]),_(t(g),{to:"/dashboard/apps","aria-label":t(a)("home.goToApps"),class:"text-white/60 hover:text-white transition-colors"},{default:f(()=>[...n[6]||(n[6]=[e("svg",{class:"w-5 h-5","aria-hidden":"true",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M9 5l7 7-7 7"})],-1)])]),_:1},8,["aria-label"])]),e("div",Ct,[e("div",jt,[n[7]||(n[7]=e("p",{class:"text-xs text-white/60 mb-1"},"Installed / Running",-1)),e("p",Tt,s(C.value)+"/"+s(R.value),1)]),e("div",Bt,[(r(),u($,null,O(fe,l=>e("button",{key:l.id,onClick:F=>t(ce)().openSession(l.id),class:"group",title:l.name},[e("div",{class:i(["w-14 h-14 rounded-xl overflow-hidden border border-white/10 transition-all group-hover:-translate-y-1 group-hover:border-white/25 group-hover:shadow-lg flex items-center justify-center",{"bg-white/5":!l.bg}]),style:D(l.bg?{background:l.bg}:{})},[e("img",{src:l.icon,alt:l.name,class:i(l.padded?"w-10 h-10 object-contain":"w-full h-full object-cover")},null,10,It)],6)],8,$t)),64))])]),e("div",At,[_(t(g),{to:"/dashboard/marketplace",class:"home-card-btn flex-1 px-4 py-2 glass-button rounded-lg text-sm font-medium text-center transition-colors"},{default:f(()=>[y(s(t(a)("home.browseStore")),1)]),_:1}),_(t(g),{to:"/dashboard/apps",class:"home-card-btn flex-1 px-4 py-2 glass-button rounded-lg text-sm font-medium text-center transition-colors"},{default:f(()=>[y(s(t(a)("home.manageApps")),1)]),_:1})])])])],2),e("div",{"data-controller-container":"",tabindex:"0",class:i(["home-card controller-focusable",{"home-card-animate":p.value}]),style:{"--card-stagger":"1"}},[e("div",Mt,[e("div",Pt,[e("div",Dt,[e("div",Ut,[e("h2",Lt,s(t(a)("home.cloud")),1),e("p",Nt,s(t(a)("home.cloudDesc")),1)]),_(t(g),{to:"/dashboard/cloud","aria-label":t(a)("home.goToCloud"),class:"text-white/60 hover:text-white transition-colors"},{default:f(()=>[...n[8]||(n[8]=[e("svg",{class:"w-5 h-5","aria-hidden":"true",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M9 5l7 7-7 7"})],-1)])]),_:1},8,["aria-label"])]),e("div",Rt,[e("div",Ft,[e("p",Ot,s(t(a)("home.storageUsed")),1),e("p",Qt,s($e.value),1)]),e("div",Wt,[e("p",Et,s(t(a)("home.folders")),1),e("p",Gt,s(Ie.value),1)])]),e("div",qt,[_(t(g),{to:"/dashboard/cloud",class:"home-card-btn flex-1 px-4 py-2 glass-button rounded-lg text-sm font-medium text-center transition-colors"},{default:f(()=>[y(s(t(a)("home.viewFolders")),1)]),_:1}),e("button",{onClick:Pe,class:"home-card-btn flex-1 px-4 py-2 glass-button rounded-lg text-sm font-medium text-center transition-colors"},s(t(a)("home.uploadFiles")),1)])])])],2),e("div",{"data-controller-container":"",tabindex:"0",class:i(["home-card controller-focusable",{"home-card-animate":p.value}]),style:{"--card-stagger":"2"}},[e("div",Kt,[e("div",Vt,[e("div",Ht,[e("div",zt,[e("h2",Jt,s(t(a)("home.network")),1),e("p",Yt,s(t(a)("home.networkDesc")),1)]),_(t(g),{to:"/dashboard/server","aria-label":t(a)("home.goToNetwork"),class:"text-white/60 hover:text-white transition-colors"},{default:f(()=>[...n[9]||(n[9]=[e("svg",{class:"w-5 h-5","aria-hidden":"true",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M9 5l7 7-7 7"})],-1)])]),_:1},8,["aria-label"])]),e("div",Zt,[e("div",Xt,[e("div",es,[e("div",{class:i(["w-2 h-2 rounded-full",be.value])},null,2),e("span",ts,s(t(a)("home.servicesStatus")),1)]),e("span",{class:i(["text-sm font-medium",_e.value])},s(ge.value),3)]),e("div",ss,[e("div",os,[e("div",{class:i(["w-2 h-2 rounded-full",ye.value])},null,2),e("span",as,s(t(a)("home.connectivity")),1)]),e("span",{class:i(["text-sm font-medium",we.value])},s(xe.value),3)]),e("div",ns,[e("div",is,[n[10]||(n[10]=e("div",{class:"w-2 h-2 rounded-full bg-blue-400"},null,-1)),e("span",ls,s(t(a)("home.runningApps")),1)]),e("span",ds,s(R.value),1)])]),e("div",rs,[_(t(g),{to:"/dashboard/server",class:"home-card-btn flex-1 px-4 py-2 glass-button rounded-lg text-sm font-medium text-center transition-colors"},{default:f(()=>[y(s(t(a)("home.manageNetwork")),1)]),_:1})])])])],2),e("div",{"data-controller-container":"",tabindex:"0",class:i(["home-card controller-focusable",{"home-card-animate":p.value}]),style:{"--card-stagger":"3"}},[e("div",cs,[e("div",us,[e("div",hs,[e("div",ms,[e("h2",vs,s(t(a)("home.web5")),1),e("p",ps,s(t(a)("home.web5Desc")),1)]),_(t(g),{to:"/dashboard/web5","aria-label":t(a)("home.goToWeb5"),class:"text-white/60 hover:text-white transition-colors"},{default:f(()=>[...n[11]||(n[11]=[e("svg",{class:"w-5 h-5","aria-hidden":"true",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M9 5l7 7-7 7"})],-1)])]),_:1},8,["aria-label"])]),e("div",fs,[e("div",gs,[e("div",_s,[e("div",{class:i(["w-2 h-2 rounded-full",M.value==="Active"?"bg-green-400":"bg-white/30"])},null,2),e("span",bs,s(t(a)("home.didStatus")),1)]),e("span",{class:i(["text-sm font-medium",M.value==="Active"?"text-green-400":"text-white/50"])},s(M.value),3)]),e("div",xs,[e("div",ws,[e("div",{class:i(["w-2 h-2 rounded-full",P.value==="Synced"?"bg-green-400":"bg-white/30"])},null,2),e("span",ys,s(t(a)("home.dwnSync")),1)]),e("span",{class:i(["text-sm font-medium",P.value==="Synced"?"text-green-400":"text-white/50"])},s(P.value),3)]),e("div",ks,[e("div",Ss,[n[12]||(n[12]=e("div",{class:"w-2 h-2 rounded-full bg-white/30"},null,-1)),e("span",Cs,s(t(a)("home.credentials")),1)]),e("span",js,s(Z.value),1)])]),e("div",Ts,[_(t(g),{to:"/dashboard/web5",class:"home-card-btn flex-1 px-4 py-2 glass-button rounded-lg text-sm font-medium text-center transition-colors"},{default:f(()=>[y(s(t(a)("home.manageWeb5")),1)]),_:1})])])])],2),e("div",{"data-controller-container":"",tabindex:"0",class:i(["home-card controller-focusable lg:col-span-2",{"home-card-animate":p.value}]),style:{"--card-stagger":"4"}},[e("div",Bs,[e("div",$s,[e("div",Is,[e("div",As,[e("h2",Ms,s(t(a)("home.system")),1),e("p",Ps,s(Me.value),1)]),_(t(g),{to:"/dashboard/server","aria-label":t(a)("home.goToSettings"),class:"text-white/60 hover:text-white transition-colors"},{default:f(()=>[...n[13]||(n[13]=[e("svg",{class:"w-5 h-5","aria-hidden":"true",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M9 5l7 7-7 7"})],-1)])]),_:1},8,["aria-label"])]),e("div",Ds,[X.value?(r(),u($,{key:1},[e("div",Us,[e("div",Ls,[e("p",Ns,s(t(a)("home.cpu")),1),e("p",{class:i(["text-sm font-medium",ee(d.cpuPercent)])},s(d.cpuPercent.toFixed(0))+"%",3)]),e("div",Rs,[e("div",{class:i(["h-full rounded-full transition-all duration-500",te(d.cpuPercent)]),style:D({width:d.cpuPercent+"%"})},null,6)])]),e("div",Fs,[e("div",Os,[e("p",Qs,s(t(a)("home.ram")),1),e("p",{class:i(["text-sm font-medium",ee(d.memPercent)])},s(A(d.memUsed))+" / "+s(A(d.memTotal)),3)]),e("div",Ws,[e("div",{class:i(["h-full rounded-full transition-all duration-500",te(d.memPercent)]),style:D({width:d.memPercent+"%"})},null,6)])]),e("div",Es,[e("div",Gs,[e("p",qs,s(t(a)("home.disk")),1),e("p",{class:i(["text-sm font-medium",ee(d.diskPercent)])},s(A(d.diskUsed))+" / "+s(A(d.diskTotal)),3)]),e("div",Ks,[e("div",{class:i(["h-full rounded-full transition-all duration-500",te(d.diskPercent)]),style:D({width:d.diskPercent+"%"})},null,6)])])],64)):(r(),u($,{key:0},O(3,l=>e("div",{key:l,class:"p-4 bg-white/5 rounded-lg animate-pulse"},[...n[14]||(n[14]=[e("div",{class:"flex items-center justify-between mb-2"},[e("div",{class:"w-8 h-3 bg-white/10 rounded"}),e("div",{class:"w-12 h-4 bg-white/10 rounded"})],-1),e("div",{class:"w-full h-2 bg-white/10 rounded-full"},null,-1)])])),64))])])])],2)],2)),v.value==="dashboard"&&Se.value?(r(),u("div",{key:2,class:i(["home-card transition-opacity duration-300",{"home-card-animate":p.value,"opacity-0 pointer-events-none":w.value&&!p.value}]),style:{"--card-stagger":"5"}},[e("div",Vs,[e("div",Hs,[e("div",zs,[e("div",null,[e("h2",Js,s(t(a)("home.quickStartGoals")),1),e("p",Ys,s(t(a)("home.quickStartDesc")),1)]),e("button",{onClick:je,"aria-label":"Dismiss Quick Start",class:"text-white/40 hover:text-white/80 transition-colors p-1 -mt-1 -mr-1",title:"Dismiss"},[...n[15]||(n[15]=[e("svg",{class:"w-5 h-5","aria-hidden":"true",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M6 18L18 6M6 6l12 12"})],-1)])])]),e("div",Zs,[(r(!0),u($,null,O(t(U),l=>(r(),ae(t(g),{key:l.id,to:`/dashboard/goals/${l.id}`,class:"home-card-btn path-action-button path-action-button--continue flex items-center justify-center gap-3"},{default:f(()=>[e("span",null,s(l.title),1)]),_:2},1032,["to"]))),128))])])])],2)):k("",!0)],64)),t(S).isChat?(r(),u("div",Xs,[_(t(g),{to:"/dashboard/chat",class:"glass-button rounded-lg px-8 py-4 text-lg font-medium"},{default:f(()=>[y(s(t(a)("home.openAI")),1)]),_:1})])):k("",!0)]))}}),ro=We(so,[["__scopeId","data-v-ed7f5b36"]]);export{ro as default}; diff --git a/neode-ui/dist/assets/Home-DFbCs8LP.css b/neode-ui/dist/assets/Home-DFbCs8LP.css new file mode 100644 index 0000000..010d669 --- /dev/null +++ b/neode-ui/dist/assets/Home-DFbCs8LP.css @@ -0,0 +1 @@ +.typing-caret[data-v-ed7f5b36]:after{content:"";display:inline-block;width:3px;height:1.1em;background:#fbbf24;margin-left:2px;vertical-align:text-bottom;animation:caret-blink-ed7f5b36 .7s step-end infinite}@keyframes caret-blink-ed7f5b36{0%,to{opacity:1}50%{opacity:0}}.grid>.home-card[data-v-ed7f5b36]{min-height:280px}.home-card-shell[data-v-ed7f5b36]{background-color:#000000a6;backdrop-filter:blur(18px);-webkit-backdrop-filter:blur(18px);border-radius:1rem;overflow:hidden;box-shadow:0 8px 24px #00000073;border:1px solid transparent;height:100%}.home-card-animate .home-card-shell[data-v-ed7f5b36]{animation:card-fly-in-ed7f5b36 1.2s cubic-bezier(.25,.46,.45,.94) forwards;animation-delay:calc(var(--card-stagger) * .18s);opacity:0;transform:translateY(50px) scale(.92)}@keyframes card-fly-in-ed7f5b36{0%{opacity:0;transform:translateY(50px) scale(.92);border-color:transparent}75%{opacity:1;transform:translateY(0) scale(1);border-color:transparent}to{opacity:1;transform:translateY(0) scale(1);border-color:#ffffff2e}}.home-card-inner[data-v-ed7f5b36]{overflow:hidden;opacity:0}.home-card-animate .home-card-inner[data-v-ed7f5b36]{animation:inner-draw-ed7f5b36 .8s cubic-bezier(.25,.46,.45,.94) forwards;animation-delay:calc(var(--card-stagger) * .18s + .9s)}@keyframes inner-draw-ed7f5b36{0%{opacity:0;clip-path:inset(0 100% 0 0)}15%{opacity:1}to{opacity:1;clip-path:inset(0 0 0 0)}}.home-card-text[data-v-ed7f5b36],.home-card-stats[data-v-ed7f5b36]{overflow:hidden}.home-card-btn[data-v-ed7f5b36]{opacity:0;transform:scale(.5);border-color:transparent;min-height:44px;padding-top:10px;padding-bottom:10px}.home-card-animate .home-card-btn[data-v-ed7f5b36]{animation:btn-pop-ed7f5b36 .5s cubic-bezier(.34,1.56,.64,1) forwards;animation-delay:calc(var(--card-stagger) * .18s + 1.5s)}@keyframes btn-pop-ed7f5b36{0%{opacity:0;transform:scale(.5);border-color:transparent}85%{opacity:1;transform:scale(1);border-color:transparent}to{opacity:1;transform:scale(1);border-color:#ffffff2e}}.home-card:not(.home-card-animate) .home-card-inner[data-v-ed7f5b36],.home-card:not(.home-card-animate) .home-card-btn[data-v-ed7f5b36]{opacity:1;animation:none;clip-path:none;transform:none;border-color:#ffffff2e}.home-card:not(.home-card-animate) .home-card-shell[data-v-ed7f5b36]{border-color:#ffffff2e} diff --git a/neode-ui/dist/assets/INTRO-ASSETS-REPLACE.md b/neode-ui/dist/assets/INTRO-ASSETS-REPLACE.md new file mode 100644 index 0000000..ca54191 --- /dev/null +++ b/neode-ui/dist/assets/INTRO-ASSETS-REPLACE.md @@ -0,0 +1,84 @@ +# Replace Intro & Dashboard Backgrounds + +To change the intro splash and dashboard tab backgrounds **without touching any code**, overwrite these files with your own assets. Use the exact names and locations below. + +**Location:** All images go in `neode-ui/public/assets/img/` +**Format:** JPG recommended. Portrait or landscape; they use `background-size: cover` and `center center`. + +--- + +## Intro Background + +| Filename | Used for | +|----------|----------| +| **`bg-intro.jpg`** | Intro splash (alien typing + video poster + fallback), Dashboard default | + +--- + +## Intro Video + +| Filename | Where | Used for | +|----------|-------|----------| +| **`video-intro.mp4`** | `neode-ui/public/assets/video/` | Welcome Noderunner + logo, onboarding, login | + +**Format:** MP4 (H.264). Keep under ~5MB for web. See `VIDEO_COMPRESSION_GUIDE.md` for optimization. + +--- + +--- + +## Dashboard Tab Backgrounds + +| Filename | Tab | +|----------|-----| +| **`bg-home.jpg`** | Home | +| **`bg-web5.jpg`** | Web5 | +| **`bg-network.jpg`** | Server / Network | +| **`bg-settings.jpg`** | Settings | +| **`bg-myapps.jpg`** | My Apps | +| **`bg-appstore.jpg`** | App Store / Marketplace | +| **`bg-cloud.jpg`** | Cloud | +| **`bg-intro.jpg`** | Default (also intro) | +| **`bg-intro-3.jpg`** | Alternate layer during transitions | + +--- + +## Intro Flow Backgrounds (onboarding) + +| Filename | Used for | +|----------|----------| +| **`bg-intro-1.jpg`** | Onboarding done, login | +| **`bg-intro-2.jpg`** | Onboarding verify | +| **`bg-intro-3.jpg`** | Onboarding path, dashboard transition layer | +| **`bg-intro-4.jpg`** | Onboarding options | +| **`bg-intro-5.jpg`** | Onboarding did | +| **`bg-intro-6.jpg`** | Onboarding backup | + +--- + +## Quick Reference + +| Asset | Full path | +|-------|-----------| +| Intro image | `neode-ui/public/assets/img/bg-intro.jpg` | +| Intro video | `neode-ui/public/assets/video/video-intro.mp4` | +| Home | `neode-ui/public/assets/img/bg-home.jpg` | +| Web5 | `neode-ui/public/assets/img/bg-web5.jpg` | +| Network | `neode-ui/public/assets/img/bg-network.jpg` | +| Settings | `neode-ui/public/assets/img/bg-settings.jpg` | +| My Apps | `neode-ui/public/assets/img/bg-myapps.jpg` | +| App Store | `neode-ui/public/assets/img/bg-appstore.jpg` | +| Cloud | `neode-ui/public/assets/img/bg-cloud.jpg` | +| Default | `neode-ui/public/assets/img/bg-intro.jpg` | +| Transition | `neode-ui/public/assets/img/bg-intro-3.jpg` | +| Intro 1–6 | `neode-ui/public/assets/img/bg-intro-1.jpg` … `bg-intro-6.jpg` | + +--- + +## Steps to Replace + +1. Put your images in `neode-ui/public/assets/img/` with the exact filenames above. +2. Put your video in `neode-ui/public/assets/video/video-intro.mp4`. +3. Run `npm run build` (or deploy) so the new assets are included. + +No code changes required. diff --git a/neode-ui/dist/assets/Kiosk-3Tm3M7Cs.css b/neode-ui/dist/assets/Kiosk-3Tm3M7Cs.css new file mode 100644 index 0000000..ada40e0 --- /dev/null +++ b/neode-ui/dist/assets/Kiosk-3Tm3M7Cs.css @@ -0,0 +1 @@ +.kiosk-root[data-v-4bc5ca3f]{position:fixed;inset:0;background:#000;outline:none;overflow:hidden;z-index:9999}.kiosk-launcher[data-v-4bc5ca3f]{height:100vh;display:flex;flex-direction:column;padding:2rem 3rem;background:linear-gradient(180deg,#0a0a12,#000)}.kiosk-header[data-v-4bc5ca3f]{display:flex;justify-content:space-between;align-items:center;padding-bottom:2rem;border-bottom:1px solid rgba(255,255,255,.08);margin-bottom:2rem}.kiosk-status-pill[data-v-4bc5ca3f]{display:flex;align-items:center;gap:.5rem;padding:.375rem .75rem;border-radius:9999px;font-size:.875rem;font-weight:500}.kiosk-grid[data-v-4bc5ca3f]{flex:1;display:grid;grid-template-columns:repeat(auto-fill,minmax(140px,1fr));gap:1.5rem;align-content:start;overflow-y:auto;padding:.5rem}.kiosk-app-tile[data-v-4bc5ca3f]{display:flex;flex-direction:column;align-items:center;gap:.75rem;padding:1.25rem .75rem;border-radius:1rem;background:#ffffff0a;border:1px solid rgba(255,255,255,.06);transition:all .25s ease;cursor:pointer}.kiosk-app-tile[data-v-4bc5ca3f]:hover,.kiosk-app-tile[data-v-4bc5ca3f]:focus-visible{background:#ffffff1a;border-color:#fb923c66;transform:scale(1.05);box-shadow:0 0 30px #fb923c26;outline:none}.kiosk-app-icon-wrap[data-v-4bc5ca3f]{position:relative;width:64px;height:64px}.kiosk-app-icon[data-v-4bc5ca3f]{width:64px;height:64px;border-radius:16px;-o-object-fit:cover;object-fit:cover;background:#ffffff0d}.kiosk-app-status[data-v-4bc5ca3f]{position:absolute;bottom:-2px;right:-2px;width:14px;height:14px;border-radius:50%;border:3px solid #000}.kiosk-app-label[data-v-4bc5ca3f]{font-size:.8125rem;font-weight:500;color:#ffffffd9;text-align:center;line-height:1.2;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.kiosk-footer[data-v-4bc5ca3f]{padding-top:1.5rem;text-align:center;border-top:1px solid rgba(255,255,255,.06);margin-top:1.5rem} diff --git a/neode-ui/dist/assets/Kiosk-CEZdJvXG.js b/neode-ui/dist/assets/Kiosk-CEZdJvXG.js new file mode 100644 index 0000000..d2fcb35 --- /dev/null +++ b/neode-ui/dist/assets/Kiosk-CEZdJvXG.js @@ -0,0 +1 @@ +import{d as I,y as L,z as S,Q as j,o as z,O as B,c as d,a as t,D as l,f as k,J as D,E as m,F as E,P as F,r as x,j as b,q as g,t as K}from"./index-DnbYEqLr.js";const N={class:"kiosk-launcher"},O={class:"kiosk-header"},R={class:"flex items-center gap-4"},T={class:"text-sm text-white/50"},M={class:"flex items-center gap-3"},V={class:"kiosk-grid"},$=["onClick"],q={class:"kiosk-app-icon-wrap"},H=["src","alt"],J={class:"kiosk-app-label"},P={class:"kiosk-footer"},Q={class:"text-white/30 text-sm"},U=I({__name:"Kiosk",setup(W){const{t:r}=L(),i=S(),y=j(),h=x(null),c="/assets/img/favico.png",f=x(""),p=b(()=>i.isConnected),w=b(()=>{const n=i.data?.["package-data"]||{},o=[],s={"bitcoin-knots":"/app/bitcoin-ui/",lnd:"/app/lnd/",mempool:"/app/mempool/","btcpay-server":"/app/btcpay/",homeassistant:"/app/homeassistant/",grafana:"/app/grafana/",jellyfin:"/app/jellyfin/",nextcloud:"/app/nextcloud/",immich:"/app/immich/",photoprism:"/app/photoprism/",vaultwarden:"/app/vaultwarden/",filebrowser:"/app/filebrowser/",searxng:"/app/searxng/",ollama:"/app/ollama/",penpot:"/app/penpot/",onlyoffice:"/app/onlyoffice/",portainer:"/app/portainer/","uptime-kuma":"/app/uptime-kuma/","nginx-proxy-manager":"/app/nginx-proxy-manager/",tailscale:"/app/tailscale/",fedimint:"/app/fedimint/","fedimint-gateway":"/app/fedimint-gateway/",dwn:"/app/dwn/","nostr-rs-relay":"/app/nostr-rs-relay/",indeedhub:"http://localhost:8190",botfights:"https://botfights.net",nwnn:"https://nwnn.l484.com","484-kitchen":"https://484.kitchen","call-the-operator":"https://cta.tx1138.com","arch-presentation":"https://present.l484.com","syntropy-institute":"https://syntropy.institute","t-zero":"https://teeminuszero.net"};for(const[e,a]of Object.entries(n)){const v=s[e];if(!v)continue;const A=a.state==="running"||a.installed?.status==="running";o.push({id:e,title:a.manifest?.title||e,icon:a["static-files"]?.icon||c,url:v,running:A})}return o.sort((e,a)=>e.running!==a.running?e.running?-1:1:e.title.localeCompare(a.title))});function C(n){y.open({url:n.url,title:n.title})}let u;function _(){const n=new Date;f.value=n.toLocaleTimeString([],{hour:"2-digit",minute:"2-digit"})}return z(()=>{_(),u=setInterval(_,3e4),h.value?.focus(),i.isConnected||i.connectWebSocket().catch(()=>{})}),B(()=>{u&&clearInterval(u)}),(n,o)=>(g(),d("div",{class:"kiosk-root",tabindex:"0",ref_key:"kioskRoot",ref:h},[t("div",N,[t("div",O,[t("div",R,[t("img",{src:c,alt:"Archipelago",class:"w-10 h-10"}),t("div",null,[o[1]||(o[1]=t("h1",{class:"text-2xl font-bold text-white font-archipelago"},"Archipelago",-1)),t("p",T,l(f.value),1)])]),t("div",M,[t("div",{class:k(["kiosk-status-pill",p.value?"bg-green-500/20 text-green-400":"bg-red-500/20 text-red-400"])},[t("div",{class:k(["w-2 h-2 rounded-full",p.value?"bg-green-400":"bg-red-400"])},null,2),D(" "+l(p.value?m(r)("kiosk.online"):m(r)("kiosk.offline")),1)],2)])]),t("div",V,[(g(!0),d(E,null,F(w.value,s=>(g(),d("button",{key:s.id,class:"kiosk-app-tile",onClick:e=>C(s),"data-controller-focusable":!0},[t("div",q,[t("img",{src:s.icon,alt:s.title,class:"kiosk-app-icon",onError:o[0]||(o[0]=e=>e.target.src=c)},null,40,H),t("div",{class:k(["kiosk-app-status",s.running?"bg-green-400":"bg-white/30"])},null,2)]),t("span",J,l(s.title),1)],8,$))),128))]),t("div",P,[t("span",Q,l(m(r)("kiosk.navHint")),1)])])],512))}}),X=K(U,[["__scopeId","data-v-4bc5ca3f"]]);export{X as default}; diff --git a/neode-ui/dist/assets/KioskRecovery-DsarIru9.js b/neode-ui/dist/assets/KioskRecovery-DsarIru9.js new file mode 100644 index 0000000..e0dd72d --- /dev/null +++ b/neode-ui/dist/assets/KioskRecovery-DsarIru9.js @@ -0,0 +1 @@ +import{d as w,y,o as R,c as h,a as e,D as t,E as o,G as x,f as g,r as c,j as C,x as j,q as m}from"./index-DnbYEqLr.js";const S={class:"min-h-screen bg-black flex items-center justify-center p-6"},T={class:"glass-card p-8 w-full max-w-lg"},U={class:"text-center mb-6"},q={class:"text-2xl font-bold text-white mb-1"},D={class:"text-sm text-white/50"},A={class:"bg-white/5 rounded-lg p-4 mb-4"},B={class:"text-xs text-white/50 mb-1"},I={class:"text-lg font-mono text-white font-medium"},L={key:0,class:"text-xs text-white/40 mt-1"},N={key:0,class:"bg-white/5 rounded-lg p-4 mb-4 flex flex-col items-center"},$={class:"text-xs text-white/50 mb-2"},z={class:"bg-white p-3 rounded-lg inline-block"},E=["src"],F={class:"space-y-2 mb-6"},M={class:"flex items-center justify-between bg-white/5 rounded-lg p-3"},O={class:"text-sm text-white/70"},P={class:"flex items-center gap-2"},V={class:"flex items-center justify-between bg-white/5 rounded-lg p-3"},G={class:"text-sm text-white/70"},H={class:"text-sm text-white font-medium"},J={class:"flex items-center justify-between bg-white/5 rounded-lg p-3"},K={class:"text-sm text-white/70"},Q={class:"text-sm text-white font-medium"},W={class:"flex gap-3"},X={class:"text-center mt-4"},Y={class:"text-xs text-white/30"},te=w({__name:"KioskRecovery",setup(Z){const p=j(),{t:s}=y(),n=c(""),a=c(!1),d=c("—"),r=c("—"),_=c("—"),f=C(()=>{if(!n.value)return"";const i=`http://${n.value}`;return`https://api.qrserver.com/v1/create-qr-code/?size=128x128&data=${encodeURIComponent(i)}`});async function v(){_.value=new Date().toLocaleTimeString(),n.value=window.location.hostname!=="localhost"?window.location.hostname:"127.0.0.1";try{const i=await fetch("/health",{signal:AbortSignal.timeout(5e3)});a.value=i.ok}catch{a.value=!1}if(a.value)try{const l=await(await fetch("/rpc/",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({method:"system.stats"}),signal:AbortSignal.timeout(5e3)})).json();if(l.result){const u=l.result.disk;if(u){const b=(u.used/u.total*100).toFixed(0);r.value=`${b}% used`}d.value=String(l.result.containers?.running??"—")}}catch{d.value="—",r.value="—"}}function k(){p.push("/login")}return R(()=>{v()}),(i,l)=>(m(),h("div",S,[e("div",T,[e("div",U,[e("h1",q,t(o(s)("kioskRecovery.title")),1),e("p",D,t(o(s)("kioskRecovery.subtitle")),1)]),e("div",A,[e("div",B,t(o(s)("kioskRecovery.serverAddress")),1),e("div",I,t(n.value||o(s)("common.loading")),1),n.value?(m(),h("div",L,t(o(s)("kioskRecovery.webUi",{address:n.value})),1)):x("",!0)]),n.value?(m(),h("div",N,[e("div",$,t(o(s)("kioskRecovery.scanForMobile")),1),e("div",z,[e("img",{src:f.value,alt:"QR Code",class:"w-32 h-32"},null,8,E)])])):x("",!0),e("div",F,[e("div",M,[e("span",O,t(o(s)("kioskRecovery.backend")),1),e("div",P,[e("div",{class:g(["w-2 h-2 rounded-full",a.value?"bg-green-400":"bg-red-400"])},null,2),e("span",{class:g(["text-sm",a.value?"text-green-400":"text-red-400"])},t(a.value?o(s)("common.healthy"):o(s)("kioskRecovery.unreachable")),3)])]),e("div",V,[e("span",G,t(o(s)("kioskRecovery.containers")),1),e("span",H,t(d.value),1)]),e("div",J,[e("span",K,t(o(s)("monitoring.diskUsage")),1),e("span",Q,t(r.value),1)])]),e("div",W,[e("button",{onClick:v,class:"glass-button px-4 py-2 rounded-lg text-sm flex-1"},t(o(s)("common.refresh")),1),e("button",{onClick:k,class:"glass-button px-4 py-2 rounded-lg text-sm flex-1 bg-orange-500/20 border-orange-500/30"},t(o(s)("kioskRecovery.goToLogin")),1)]),e("div",X,[e("p",Y,t(o(s)("kioskRecovery.lastChecked",{time:_.value})),1)])])]))}});export{te as default}; diff --git a/neode-ui/dist/assets/LightningChannels-BTRz5y8m.js b/neode-ui/dist/assets/LightningChannels-BTRz5y8m.js new file mode 100644 index 0000000..a65f84e --- /dev/null +++ b/neode-ui/dist/assets/LightningChannels-BTRz5y8m.js @@ -0,0 +1 @@ +import{d as E,o as O,c as o,a as e,J as $,E as N,D as n,h as R,i as D,T as P,b as B,g as F,H as T,G as b,x as H,r as i,B as _,F as I,P as S,f as q,n as U,q as a}from"./index-DnbYEqLr.js";const A={class:"pb-16 md:pb-4"},G={class:"grid grid-cols-1 md:grid-cols-3 gap-4 mb-6"},J={class:"glass-card p-4"},K={class:"text-white text-xl font-bold"},Q={class:"glass-card p-4"},W={class:"text-white text-xl font-bold"},X={class:"glass-card p-4"},Y={class:"text-white text-xl font-bold"},Z={class:"flex justify-end mb-4"},ee={key:"loading",class:"glass-card p-12 text-center"},te={key:"error",class:"glass-card p-6 text-center"},se={class:"text-red-300 mb-4"},le={key:"empty",class:"glass-card p-8 text-center"},ne={key:"channels",class:"space-y-3"},oe={class:"flex items-center justify-between mb-3"},ae={class:"flex items-center gap-2"},ie={class:"text-white/80 text-sm font-medium capitalize"},re=["onClick"],ue=["title"],de={class:"mb-2"},ce={class:"flex justify-between text-xs text-white/60 mb-1"},pe={class:"h-2 bg-white/10 rounded-full overflow-hidden flex"},me={class:"text-white/40 text-xs mt-1 text-center"},xe={class:"glass-card p-6 w-full max-w-md mx-4"},ve={class:"space-y-4"},be={key:0,class:"mt-3 p-2 bg-red-500/20 border border-red-500/30 rounded-lg"},fe={class:"text-red-300 text-xs"},he={class:"flex gap-3 mt-6"},ge=["disabled"],we={class:"glass-card p-6 w-full max-w-sm mx-4"},ye={class:"text-white/60 text-sm mb-4"},_e={key:0,class:"mb-3 p-2 bg-red-500/20 border border-red-500/30 rounded-lg"},ke={class:"text-red-300 text-xs"},Ce={class:"flex gap-3"},Me=["disabled"],Fe=E({__name:"LightningChannels",setup($e){const j=H(),w=i(!0),f=i(null),h=i([]),y=i({total_inbound:0,total_outbound:0}),c=i(!1),r=i({peerUri:"",amount:1e5}),p=i(!1),d=i(null),u=i(null),m=i(!1),x=i(null);function v(l){return l>=1e8?`${(l/1e8).toFixed(2)} BTC`:l>=1e6?`${(l/1e6).toFixed(1)}M sats`:l>=1e3?`${(l/1e3).toFixed(1)}k sats`:`${l} sats`}function k(l,t){return t<=0?0:Math.round(l/t*100)}async function g(){w.value=!0,f.value=null;try{const l=await _.call({method:"lnd.listchannels",timeout:15e3});h.value=l.channels||[],y.value={total_inbound:l.total_inbound||0,total_outbound:l.total_outbound||0}}catch(l){f.value=l instanceof Error?l.message:"Failed to load channels"}finally{w.value=!1}}async function z(){if(p.value)return;d.value=null;const l=r.value.peerUri.trim();if(!l){d.value="Peer URI is required";return}if(r.value.amount<2e4){d.value="Minimum 20,000 sats";return}const t=l.split("@"),s=t[0],C=t[1]||void 0;p.value=!0;try{await _.call({method:"lnd.openchannel",params:{pubkey:s,address:C,amount:r.value.amount},timeout:3e4}),c.value=!1,r.value={peerUri:"",amount:1e5},await g()}catch(M){d.value=M instanceof Error?M.message:"Failed to open channel"}finally{p.value=!1}}function L(l){u.value=l,x.value=null}async function V(){if(!(m.value||!u.value)){x.value=null,m.value=!0;try{await _.call({method:"lnd.closechannel",params:{channel_point:u.value.channel_point},timeout:3e4}),u.value=null,await g()}catch(l){x.value=l instanceof Error?l.message:"Failed to close channel"}finally{m.value=!1}}}return O(g),(l,t)=>(a(),o("div",A,[e("button",{onClick:t[0]||(t[0]=s=>N(j).push("/dashboard/apps/lnd")),class:"mb-6 flex items-center gap-2 text-white/70 hover:text-white transition-colors"},[...t[8]||(t[8]=[e("svg",{class:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M15 19l-7-7 7-7"})],-1),$(" Back to LND ",-1)])]),t[21]||(t[21]=e("h1",{class:"text-2xl font-bold text-white mb-6"},"Lightning Channels",-1)),e("div",G,[e("div",J,[t[9]||(t[9]=e("p",{class:"text-white/60 text-sm mb-1"},"Total Outbound",-1)),e("p",K,n(v(y.value.total_outbound)),1)]),e("div",Q,[t[10]||(t[10]=e("p",{class:"text-white/60 text-sm mb-1"},"Total Inbound",-1)),e("p",W,n(v(y.value.total_inbound)),1)]),e("div",X,[t[11]||(t[11]=e("p",{class:"text-white/60 text-sm mb-1"},"Channels",-1)),e("p",Y,n(h.value.length),1)])]),e("div",Z,[e("button",{onClick:t[1]||(t[1]=s=>c.value=!0),class:"glass-button px-4 py-2 rounded-lg text-sm font-medium flex items-center gap-2"},[...t[12]||(t[12]=[e("svg",{class:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 4v16m8-8H4"})],-1),$(" Open Channel ",-1)])])]),R(P,{name:"content-fade",mode:"out-in"},{default:D(()=>[w.value?(a(),o("div",ee,[...t[13]||(t[13]=[e("svg",{class:"animate-spin h-8 w-8 text-blue-400 mx-auto mb-4",xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24"},[e("circle",{class:"opacity-25",cx:"12",cy:"12",r:"10",stroke:"currentColor","stroke-width":"4"}),e("path",{class:"opacity-75",fill:"currentColor",d:"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"})],-1),e("p",{class:"text-white/70"},"Loading channels...",-1)])])):f.value?(a(),o("div",te,[e("p",se,n(f.value),1),e("button",{onClick:g,class:"glass-button px-4 py-2 rounded-lg text-sm"},"Retry")])):h.value.length===0?(a(),o("div",le,[...t[14]||(t[14]=[e("svg",{class:"w-16 h-16 text-white/20 mx-auto mb-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M13 10V3L4 14h7v7l9-11h-7z"})],-1),e("p",{class:"text-white/70 mb-2"},"No channels yet",-1),e("p",{class:"text-white/50 text-sm"},"Open a channel to start sending and receiving Lightning payments.",-1)])])):(a(),o("div",ne,[(a(!0),o(I,null,S(h.value,s=>(a(),o("div",{key:s.chan_id||s.channel_point,class:"glass-card p-4"},[e("div",oe,[e("div",ae,[e("span",{class:q(["w-2 h-2 rounded-full",{"bg-green-400":s.status==="active","bg-yellow-400":s.status==="pending_open","bg-red-400":s.status==="inactive"}])},null,2),e("span",ie,n(s.status.replace("_"," ")),1)]),s.status!=="pending_open"?(a(),o("button",{key:0,onClick:C=>L(s),class:"text-red-400/70 hover:text-red-400 text-xs transition-colors"}," Close ",8,re)):b("",!0)]),e("p",{class:"text-white/50 text-xs font-mono mb-3 truncate",title:s.remote_pubkey},n(s.remote_pubkey),9,ue),e("div",de,[e("div",ce,[e("span",null,"Local: "+n(v(s.local_balance)),1),e("span",null,"Remote: "+n(v(s.remote_balance)),1)]),e("div",pe,[e("div",{class:"bg-blue-400 h-full transition-all",style:U({width:k(s.local_balance,s.capacity)+"%"})},null,4),e("div",{class:"bg-orange-400 h-full transition-all",style:U({width:k(s.remote_balance,s.capacity)+"%"})},null,4)]),e("p",me," Capacity: "+n(v(s.capacity)),1)])]))),128))]))]),_:1}),c.value?(a(),o("div",{key:0,class:"fixed inset-0 z-50 flex items-center justify-center bg-black/10 backdrop-blur-md",onClick:t[5]||(t[5]=B(s=>c.value=!1,["self"]))},[e("div",xe,[t[19]||(t[19]=e("h2",{class:"text-lg font-bold text-white mb-4"},"Open Channel",-1)),e("div",ve,[e("div",null,[t[15]||(t[15]=e("label",{class:"text-white/60 text-sm block mb-1"},"Peer URI",-1)),F(e("input",{"onUpdate:modelValue":t[2]||(t[2]=s=>r.value.peerUri=s),type:"text",placeholder:"pubkey@host:port",class:"w-full bg-white/5 border border-white/10 rounded-lg px-3 py-2 text-white text-sm focus:outline-none focus:border-white/30"},null,512),[[T,r.value.peerUri]]),t[16]||(t[16]=e("p",{class:"text-white/40 text-xs mt-1"},"Format: pubkey@host:port",-1))]),e("div",null,[t[17]||(t[17]=e("label",{class:"text-white/60 text-sm block mb-1"},"Amount (sats)",-1)),F(e("input",{"onUpdate:modelValue":t[3]||(t[3]=s=>r.value.amount=s),type:"number",min:"20000",placeholder:"100000",class:"w-full bg-white/5 border border-white/10 rounded-lg px-3 py-2 text-white text-sm focus:outline-none focus:border-white/30"},null,512),[[T,r.value.amount,void 0,{number:!0}]]),t[18]||(t[18]=e("p",{class:"text-white/40 text-xs mt-1"},"Minimum 20,000 sats",-1))])]),d.value?(a(),o("div",be,[e("p",fe,n(d.value),1)])):b("",!0),e("div",he,[e("button",{onClick:t[4]||(t[4]=s=>c.value=!1),class:"flex-1 glass-button px-4 py-2 rounded-lg text-sm"},"Cancel"),e("button",{onClick:z,disabled:p.value,class:"flex-1 glass-button px-4 py-2 rounded-lg text-sm font-medium bg-blue-500/20 border-blue-500/30"},n(p.value?"Opening...":"Open Channel"),9,ge)])])])):b("",!0),u.value?(a(),o("div",{key:1,class:"fixed inset-0 z-50 flex items-center justify-center bg-black/10 backdrop-blur-md",onClick:t[7]||(t[7]=B(s=>u.value=null,["self"]))},[e("div",we,[t[20]||(t[20]=e("h2",{class:"text-lg font-bold text-white mb-2"},"Close Channel?",-1)),e("p",ye,"This will cooperatively close the channel with peer "+n(u.value.remote_pubkey.slice(0,16))+"...",1),x.value?(a(),o("div",_e,[e("p",ke,n(x.value),1)])):b("",!0),e("div",Ce,[e("button",{onClick:t[6]||(t[6]=s=>u.value=null),class:"flex-1 glass-button px-4 py-2 rounded-lg text-sm"},"Cancel"),e("button",{onClick:V,disabled:m.value,class:"flex-1 glass-button px-4 py-2 rounded-lg text-sm font-medium bg-red-500/20 border-red-500/30"},n(m.value?"Closing...":"Close"),9,Me)])])])):b("",!0)]))}});export{Fe as default}; diff --git a/neode-ui/dist/assets/Login-CJkTG_B-.js b/neode-ui/dist/assets/Login-CJkTG_B-.js new file mode 100644 index 0000000..92e4859 --- /dev/null +++ b/neode-ui/dist/assets/Login-CJkTG_B-.js @@ -0,0 +1 @@ +import{d as se,y as ae,z as le,A as ne,o as re,B as I,c as i,a as e,f as ie,h as ue,C as ce,D as n,E as s,n as de,G,F as j,g as L,H as T,I as B,J as R,r as u,j as X,k as pe,K as W,L as H,M as U,x as ve,u as he,s as K,q as c,t as ge}from"./index-DnbYEqLr.js";import{u as me}from"./loginTransition-Bm4PAghQ.js";const we={class:"min-h-screen flex items-center justify-center p-4 relative z-10 login-fly-perspective"},fe={class:"w-full max-w-md relative z-20"},be={class:"absolute -top-10 left-1/2 -translate-x-1/2 z-10"},ye={class:"logo-gradient-border w-20 h-20"},xe={class:"text-2xl font-semibold text-white/96 text-center mb-8 drop-shadow-[0_2px_6px_rgba(0,0,0,0.4)]"},_e={key:0},ke={key:1},Se={key:0,class:"mb-6",role:"status","aria-live":"polite"},Ce={class:"flex items-center justify-center gap-2 mb-3"},Ie={class:"text-sm text-white/60"},Le={class:"startup-progress-track"},Te={key:1,role:"alert",class:"mb-4 p-3 bg-red-500/20 border border-red-500/40 rounded-lg text-red-200 text-sm"},Be={class:"mb-4"},Pe={for:"setup-password",class:"block text-sm font-medium text-white/80 mb-2"},ze=["placeholder","disabled"],Ae={class:"mb-6"},Ve={for:"setup-confirm-password",class:"block text-sm font-medium text-white/80 mb-2"},Me=["placeholder","disabled"],Ee=["disabled"],je={key:0},Re={key:1,class:"flex items-center justify-center"},Xe={class:"mb-6 text-center"},He={class:"text-white/80 text-sm mb-1"},Ue={class:"text-white/50 text-xs"},Ke={class:"mb-4"},Ne=["aria-label","placeholder","disabled"],qe=["disabled"],Fe={key:0},Je={key:1,class:"flex items-center justify-center"},De={class:"mb-6"},Oe={for:"login-password",class:"block text-sm font-medium text-white/80 mb-2"},Ge=["placeholder","disabled"],We=["disabled"],$e={key:0},Qe={key:1,class:"flex items-center justify-center"},Ye={class:"mt-6 text-center text-sm text-white/40"},Ze={class:"mt-8 text-center flex items-center justify-center gap-4"},et=["disabled"],tt=se({__name:"Login",setup(ot){const{t:o}=ae(),k=ve(),$=he(),g=X(()=>$.query.redirect||"/dashboard"),P=le(),z=me(),r=u(""),f=u(""),l=u(!1),d=u(null),b=u(!1),m=u(!1),A=u(!1),v=u(""),y=u(!1),N=u(null),S=u(!1),q=u(!0),w=u(0);let V=null,x=null;const M=X(()=>!1),_=X(()=>!S.value);async function F(){try{const a=await fetch("/rpc/v1",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({method:"server.echo",params:{message:"ping"}}),signal:AbortSignal.timeout(5e3)});return a.status!==502&&a.status!==503}catch{return!1}}function Q(){return new Promise(a=>{x=setInterval(()=>{w.value<90&&(w.value+=Math.random()*8+2,w.value>90&&(w.value=90))},600);const t=async()=>{if(await F()){x&&clearInterval(x),w.value=100,await new Promise(oe=>setTimeout(oe,400)),S.value=!0,q.value=!1,a();return}V=setTimeout(t,2e3)};t()})}let h=null;function J(){h&&(document.removeEventListener("click",h),document.removeEventListener("touchstart",h),document.removeEventListener("keydown",h),h=null)}ne(()=>{J(),V&&clearTimeout(V),x&&clearInterval(x)}),re(async()=>{const a=sessionStorage.getItem("archipelago_from_splash")==="1";if(a&&sessionStorage.removeItem("archipelago_from_splash"),h=()=>{a||(pe(),K()),J()},document.addEventListener("click",h,{once:!0}),document.addEventListener("touchstart",h,{once:!0}),document.addEventListener("keydown",h,{once:!0}),await F()?(S.value=!0,q.value=!1):await Q(),M.value)try{const p=await I.call({method:"auth.isSetup",params:{},timeout:8e3});b.value=!!p}catch{b.value=!1}else b.value=!0});function E(){!l.value&&r.value&&r.value===f.value&&W(),Y()}async function Y(){if(!r.value||r.value.length<8){d.value=o("login.errorMinLength");return}if(r.value!==f.value){d.value=o("login.errorMismatch");return}l.value=!0,d.value=null;try{await I.call({method:"auth.setup",params:{password:r.value}}),H(),m.value=!0,U(),z.setJustLoggedIn(!0),await P.login(r.value),await new Promise(a=>setTimeout(a,520)),await k.replace(g.value).catch(()=>{window.location.href=g.value})}catch(a){m.value=!1;const t=a instanceof Error?a.message:"";/502|503|Bad Gateway|timeout|fetch|network/i.test(t)?d.value=o("login.errorServerStarting"):d.value=t||o("login.errorSetupFailed"),K()}finally{l.value=!1}}function D(){!l.value&&r.value&&W(),Z()}async function Z(){if(r.value){l.value=!0,d.value=null;try{if((await P.login(r.value))?.requires_totp){A.value=!0,l.value=!1,setTimeout(()=>N.value?.focus(),100);return}H(),m.value=!0,U(),z.setJustLoggedIn(!0),await new Promise(t=>setTimeout(t,520)),await k.replace(g.value).catch(()=>{window.location.href=g.value})}catch(a){m.value=!1;const t=a instanceof Error?a.message:"";/502|503|Bad Gateway|timeout|fetch|network/i.test(t)?d.value=o("login.errorServerStarting"):d.value=t||o("login.errorLoginFailed"),K()}finally{l.value=!1}}}async function O(){if(v.value){l.value=!0,d.value=null;try{y.value?await I.loginBackup(v.value):await I.loginTotp(v.value),await P.completeLoginAfterTotp(),H(),m.value=!0,U(),z.setJustLoggedIn(!0),await new Promise(a=>setTimeout(a,520)),await k.replace(g.value).catch(()=>{window.location.href=g.value})}catch(a){const t=a instanceof Error?a.message:"";/expired|too many/i.test(t)?(A.value=!1,v.value="",d.value=t):d.value=t||o("login.errorInvalidCode"),v.value=""}finally{l.value=!1}}}function ee(){localStorage.removeItem("neode_intro_seen"),window.location.href="/"}const C=u(!1);async function te(){C.value||(C.value=!0,localStorage.removeItem("neode_onboarding_complete"),localStorage.removeItem("neode_did"),localStorage.removeItem("neode_did_state"),localStorage.removeItem("neode_backup_created"),k.push("/onboarding/intro").then(()=>{window.location.reload()}).catch(()=>{window.location.href="/onboarding/intro"}))}return(a,t)=>(c(),i("div",we,[e("div",fe,[e("div",{class:ie(["glass-card p-8 pt-20 relative login-card overflow-visible",{"login-fly-towards":m.value}])},[e("div",be,[e("div",ye,[ue(ce,{"no-border":"",fit:""})])]),e("h1",xe,[M.value&&!b.value?(c(),i("span",_e,n(s(o)("login.setupTitle")),1)):(c(),i("span",ke,n(s(o)("login.title")),1))]),S.value?G("",!0):(c(),i("div",Se,[e("div",Ce,[t[5]||(t[5]=e("svg",{class:"animate-spin h-4 w-4 text-orange-400","aria-hidden":"true",xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24"},[e("circle",{class:"opacity-25",cx:"12",cy:"12",r:"10",stroke:"currentColor","stroke-width":"4"}),e("path",{class:"opacity-75",fill:"currentColor",d:"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"})],-1)),e("span",Ie,n(s(o)("login.serverStarting")),1)]),e("div",Le,[e("div",{class:"startup-progress-bar",style:de({width:w.value+"%"})},null,4)])])),d.value?(c(),i("div",Te,n(d.value),1)):G("",!0),M.value&&!b.value?(c(),i(j,{key:2},[t[7]||(t[7]=e("div",{class:"mb-4 p-4 bg-white/5 border border-white/10 rounded-lg text-white/80 text-sm"},[e("p",{class:"mb-2"},"Create a password to secure your Archipelago node."),e("p",{class:"text-white/60 text-xs"},"This password will be required to access your node.")],-1)),e("div",Be,[e("label",Pe,n(s(o)("login.password")),1),L(e("input",{id:"setup-password","onUpdate:modelValue":t[0]||(t[0]=p=>r.value=p),type:"password",class:"w-full px-4 py-3 bg-transparent border border-white/20 rounded-lg text-white placeholder-white/40 focus:outline-none focus:border-white/40 focus:ring-1 focus:ring-white/20 transition-colors",placeholder:s(o)("login.enterPasswordSetup"),onKeyup:B(E,["enter"]),disabled:l.value||_.value},null,40,ze),[[T,r.value]])]),e("div",Ae,[e("label",Ve,n(s(o)("login.confirmPassword")),1),L(e("input",{id:"setup-confirm-password","onUpdate:modelValue":t[1]||(t[1]=p=>f.value=p),type:"password",class:"w-full px-4 py-3 bg-transparent border border-white/20 rounded-lg text-white placeholder-white/40 focus:outline-none focus:border-white/40 focus:ring-1 focus:ring-white/20 transition-colors",placeholder:s(o)("login.confirmPasswordPlaceholder"),onKeyup:B(E,["enter"]),disabled:l.value||_.value},null,40,Me),[[T,f.value]])]),e("button",{onClick:E,disabled:l.value||_.value||!r.value||r.value.length<8||r.value!==f.value,class:"w-full glass-button px-6 py-3 rounded-lg font-medium transition-all hover:bg-black/70 hover:border-white/30 disabled:opacity-50 disabled:cursor-not-allowed"},[l.value?(c(),i("span",Re,[t[6]||(t[6]=e("svg",{class:"animate-spin h-5 w-5 mr-2",xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24"},[e("circle",{class:"opacity-25",cx:"12",cy:"12",r:"10",stroke:"currentColor","stroke-width":"4"}),e("path",{class:"opacity-75",fill:"currentColor",d:"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"})],-1)),R(" "+n(s(o)("login.settingUp")),1)])):(c(),i("span",je,n(s(o)("login.setupButton")),1))],8,Ee)],64)):A.value?(c(),i(j,{key:3},[e("div",Xe,[t[8]||(t[8]=e("svg",{xmlns:"http://www.w3.org/2000/svg",class:"w-12 h-12 mx-auto mb-3 text-orange-400",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor","stroke-width":"1.5"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"M9 12.75L11.25 15 15 9.75m-3-7.036A11.959 11.959 0 013.598 6 11.99 11.99 0 003 9.749c0 5.592 3.824 10.29 9 11.623 5.176-1.332 9-6.03 9-11.622 0-1.31-.21-2.571-.598-3.751h-.152c-3.196 0-6.1-1.248-8.25-3.285z"})],-1)),e("p",He,n(s(o)("login.twoFactorTitle")),1),e("p",Ue,n(s(o)("login.totpInstruction")),1)]),e("div",Ke,[L(e("input",{ref_key:"totpInputRef",ref:N,"onUpdate:modelValue":t[2]||(t[2]=p=>v.value=p),type:"text",inputmode:"numeric",pattern:"[0-9]*",maxlength:"8",autocomplete:"one-time-code","aria-label":s(o)("login.totpLabel"),class:"w-full px-4 py-3 bg-transparent border border-white/20 rounded-lg text-white text-center text-2xl tracking-[0.5em] placeholder-white/40 focus:outline-none focus:border-orange-400/60 focus:ring-1 focus:ring-orange-400/30 transition-colors",placeholder:y.value?"XXXX-XXXX":"000000",onKeyup:B(O,["enter"]),disabled:l.value},null,40,Ne),[[T,v.value]])]),e("button",{onClick:O,disabled:l.value||!v.value,class:"w-full glass-button px-6 py-3 rounded-lg font-medium transition-all hover:bg-black/70 hover:border-white/30 disabled:opacity-50 disabled:cursor-not-allowed mb-3"},[l.value?(c(),i("span",Je,[t[9]||(t[9]=e("svg",{class:"animate-spin h-5 w-5 mr-2",xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24"},[e("circle",{class:"opacity-25",cx:"12",cy:"12",r:"10",stroke:"currentColor","stroke-width":"4"}),e("path",{class:"opacity-75",fill:"currentColor",d:"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"})],-1)),R(" "+n(s(o)("login.verifying")),1)])):(c(),i("span",Fe,n(s(o)("login.verifyButton")),1))],8,qe),e("button",{onClick:t[3]||(t[3]=p=>{y.value=!y.value,v.value=""}),class:"w-full text-white/50 text-sm hover:text-white/70 transition-colors py-2"},n(y.value?s(o)("login.useAuthCode"):s(o)("login.useBackupCode")),1)],64)):(c(),i(j,{key:4},[e("div",De,[e("label",Oe,n(s(o)("login.password")),1),L(e("input",{id:"login-password","onUpdate:modelValue":t[4]||(t[4]=p=>r.value=p),type:"password",class:"w-full px-4 py-3 bg-transparent border border-white/20 rounded-lg text-white placeholder-white/40 focus:outline-none focus:border-white/40 focus:ring-1 focus:ring-white/20 transition-colors",placeholder:s(o)("login.enterPasswordPlaceholder"),onKeyup:B(D,["enter"]),disabled:l.value||_.value},null,40,Ge),[[T,r.value]])]),e("button",{onClick:D,disabled:l.value||_.value||!r.value,class:"w-full glass-button px-6 py-3 rounded-lg font-medium transition-all hover:bg-black/70 hover:border-white/30 disabled:opacity-50 disabled:cursor-not-allowed"},[l.value?(c(),i("span",Qe,[t[10]||(t[10]=e("svg",{class:"animate-spin h-5 w-5 mr-2",xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24"},[e("circle",{class:"opacity-25",cx:"12",cy:"12",r:"10",stroke:"currentColor","stroke-width":"4"}),e("path",{class:"opacity-75",fill:"currentColor",d:"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"})],-1)),R(" "+n(s(o)("login.loggingIn")),1)])):(c(),i("span",$e,n(s(o)("login.loginButton")),1))],8,We)],64)),e("div",Ye,n(s(o)("login.recoveryNote")),1)],2),e("div",Ze,[e("button",{onClick:ee,class:"text-xs text-white/50 hover:text-white/70 transition-colors underline-offset-2 hover:underline"},n(s(o)("login.replayIntro")),1),t[11]||(t[11]=e("span",{class:"text-white/30"},"|",-1)),e("button",{onClick:te,disabled:C.value,class:"text-xs text-white/50 hover:text-white/70 transition-colors underline-offset-2 hover:underline disabled:opacity-50 disabled:cursor-not-allowed"},n(C.value?s(o)("login.resetting"):s(o)("login.onboarding")),9,et)])])]))}}),lt=ge(tt,[["__scopeId","data-v-a59fcd7f"]]);export{lt as default}; diff --git a/neode-ui/dist/assets/Login-DRIS0ldM.css b/neode-ui/dist/assets/Login-DRIS0ldM.css new file mode 100644 index 0000000..8dd628c --- /dev/null +++ b/neode-ui/dist/assets/Login-DRIS0ldM.css @@ -0,0 +1 @@ +.startup-progress-track[data-v-a59fcd7f]{height:4px;background:#ffffff14;border-radius:2px;overflow:hidden}.startup-progress-bar[data-v-a59fcd7f]{height:100%;background:linear-gradient(90deg,#fb923c,#f59e0b);border-radius:2px;transition:width .5s ease-out;box-shadow:0 0 8px #fb923c66}.login-fly-perspective[data-v-a59fcd7f]{perspective:1200px;perspective-origin:center center}.login-card[data-v-a59fcd7f]{transform-style:preserve-3d;transition:transform .5s cubic-bezier(.25,.46,.45,.94),opacity .5s cubic-bezier(.25,.46,.45,.94),filter .5s ease-out}.login-fly-towards[data-v-a59fcd7f]{animation:login-fly-towards-a59fcd7f .5s cubic-bezier(.25,.46,.45,.94) forwards}@keyframes login-fly-towards-a59fcd7f{0%{transform:translateZ(0) scale(1);opacity:1;filter:blur(0)}60%{transform:translateZ(180px) scale(1.4);opacity:.95;filter:blur(2px)}to{transform:translateZ(400px) scale(2);opacity:0;filter:blur(8px)}} diff --git a/neode-ui/dist/assets/Marketplace-BasZfUkN.css b/neode-ui/dist/assets/Marketplace-BasZfUkN.css new file mode 100644 index 0000000..f00bec3 --- /dev/null +++ b/neode-ui/dist/assets/Marketplace-BasZfUkN.css @@ -0,0 +1 @@ +.line-clamp-3[data-v-f5eafd6d]{display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}.modal-enter-active[data-v-f5eafd6d],.modal-leave-active[data-v-f5eafd6d]{transition:opacity .3s ease}.modal-enter-from[data-v-f5eafd6d],.modal-leave-to[data-v-f5eafd6d]{opacity:0}.modal-enter-active .glass-card[data-v-f5eafd6d],.modal-leave-active .glass-card[data-v-f5eafd6d]{transition:transform .3s ease}.modal-enter-from .glass-card[data-v-f5eafd6d],.modal-leave-to .glass-card[data-v-f5eafd6d]{transform:scale(.95)}.marketplace-container[data-v-f5eafd6d] ::-webkit-scrollbar{width:8px}.marketplace-container[data-v-f5eafd6d] ::-webkit-scrollbar-track{background:#ffffff0d;border-radius:4px}.marketplace-container[data-v-f5eafd6d] ::-webkit-scrollbar-thumb{background:#fff3;border-radius:4px;-webkit-transition:background .3s ease;transition:background .3s ease}.marketplace-container[data-v-f5eafd6d] ::-webkit-scrollbar-thumb:hover{background:#ffffff4d}.marketplace-container[data-v-f5eafd6d]{scrollbar-width:thin;scrollbar-color:rgba(255,255,255,.2) rgba(255,255,255,.05)} diff --git a/neode-ui/dist/assets/Marketplace-dnuGfUDf.js b/neode-ui/dist/assets/Marketplace-dnuGfUDf.js new file mode 100644 index 0000000..e6d89c4 --- /dev/null +++ b/neode-ui/dist/assets/Marketplace-dnuGfUDf.js @@ -0,0 +1 @@ +import{d as fe,z as we,y as ke,Q as ye,w as be,a0 as xe,o as _e,A as Ce,c as r,a as i,F as A,P as L,G as g,h as D,i as F,E as u,U as ee,g as te,H as oe,D as d,m as Ue,a1 as Me,T as Ie,r as m,j as _,B as V,f as y,n as ie,J as C,I as ze,b as $,x as Be,q as n,t as Ae}from"./index-DnbYEqLr.js";import{u as Le}from"./useMarketplaceApp-BxXpq2aX.js";const Se={class:"marketplace-container"},je={key:0,"aria-live":"polite",class:"mb-6 space-y-3"},Te={class:"flex items-center justify-between mb-3"},Ne={class:"flex items-center gap-3"},Pe={key:0,class:"animate-spin h-5 w-5 text-blue-400","aria-hidden":"true",xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24"},De={key:1,class:"h-5 w-5 text-green-400",xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor"},Fe={key:2,class:"h-5 w-5 text-red-400",xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor"},Ve={class:"text-white font-medium"},$e={class:"text-white/70 text-sm"},He={class:"text-white/60 text-sm"},Re={class:"w-full bg-white/10 rounded-full h-2 overflow-hidden"},Oe={class:"hidden md:flex mb-4 items-center gap-4"},Ee={class:"mode-switcher flex-shrink-0"},Ke={class:"mode-switcher flex-shrink-0"},Ge=["onClick"],qe={key:0,class:"ml-1 text-xs px-1.5 py-0.5 rounded-full bg-white/10"},We=["placeholder","aria-label"],Je={class:"md:hidden mb-4"},Xe=["placeholder","aria-label"],Qe={class:"pb-8"},Ye={class:"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6"},Ze=["data-controller-install","onClick","onKeydown"],et={class:"flex items-start gap-4 mb-4"},tt=["src","alt"],ot={key:1,class:"w-16 h-16 rounded-lg bg-white/10 flex items-center justify-center"},it={class:"flex-1"},st={class:"text-xl font-semibold text-white mb-1"},nt={class:"text-sm text-white/60"},rt={key:0,class:"text-xs text-white/50 mt-1"},at={key:0,class:"flex items-center gap-2 mb-3"},lt={class:"text-xs text-white/40"},ct={key:0,class:"text-xs text-white/40"},dt={class:"text-white/80 text-sm mb-4 line-clamp-3 flex-1"},ut={class:"flex gap-2 mt-auto"},mt={key:0,class:"flex-1 px-4 py-2 bg-white/20 rounded-lg text-white/60 text-sm font-medium text-center cursor-default"},ht=["onClick"],gt=["onClick","disabled"],pt={key:0,class:"flex items-center justify-center gap-2"},vt={key:1},ft={key:3,disabled:"",class:"flex-1 px-4 py-2 bg-white/10 rounded-lg text-white/40 text-sm font-medium cursor-not-allowed"},wt={key:0,class:"text-center py-12"},kt={key:0,class:"flex flex-col items-center gap-4"},yt={class:"text-white/70"},bt={key:1,class:"flex flex-col items-center gap-4"},xt={class:"text-white/70"},_t={class:"text-white/40 text-sm"},Ct={key:2,class:"text-white/70"},Ut={class:"flex items-center justify-between mb-6"},Mt={class:"text-2xl font-bold text-white"},It={class:"grid grid-cols-1 sm:grid-cols-2 gap-3"},zt=["onClick"],Bt={class:"flex items-center gap-3"},At={class:"flex-shrink-0 w-10 h-10 rounded-lg bg-white/10 flex items-center justify-center"},Lt={key:0,class:"w-6 h-6",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},St={key:1,class:"w-6 h-6",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},jt={key:2,class:"w-6 h-6",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},Tt={key:3,class:"w-6 h-6",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},Nt={key:4,class:"w-6 h-6",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},Pt={key:5,class:"w-6 h-6",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},Dt={key:6,class:"w-6 h-6",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},Ft={key:7,class:"w-6 h-6",viewBox:"0 0 122.88 122.88",fill:"currentColor"},Vt={key:8,class:"w-6 h-6",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},$t={key:9,class:"w-6 h-6",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},Ht={class:"flex-1"},Rt={class:"font-semibold"},Ot={key:0,class:"text-xs text-white/60 mt-1"},Et={key:0,class:"w-5 h-5 text-white flex-shrink-0",fill:"currentColor",viewBox:"0 0 20 20"},Kt=fe({__name:"Marketplace",setup(Gt){const H=Be(),R=we(),{t:c}=ke(),{setCurrentApp:se}=Le(),ne=ye(),h=m("all"),S=_(()=>[{id:"all",name:c("marketplace.all")},{id:"community",name:c("marketplace.community")},{id:"nostr",name:"Nostr"},{id:"commerce",name:c("marketplace.commerce")},{id:"money",name:c("marketplace.money")},{id:"data",name:c("marketplace.data")},{id:"home",name:c("marketplace.homeCategory")},{id:"car",name:c("marketplace.auto")},{id:"networking",name:c("marketplace.networking")},{id:"l484",name:"L484"},{id:"other",name:c("marketplace.other")}]),a=m(new Map),re=m(60);be(()=>R.packages,o=>{if(o)for(const[e,t]of Object.entries(o)){const s=t["install-progress"];if(s&&t.state==="installing"&&a.value.has(e)){const l=a.value.get(e),v=s.size>0?Math.round(s.downloaded/s.size*100):0,P=(s.downloaded/(1024*1024)).toFixed(1),ve=(s.size/(1024*1024)).toFixed(1);a.value.set(e,{...l,status:"downloading",progress:Math.min(v,95),message:s.size>0?`Downloading: ${P} / ${ve} MB (${v}%)`:c("marketplace.downloading")})}}},{deep:!0});const U=m(!1),O=m(null),E=m(null);function M(){E.value?.focus?.(),U.value=!1}xe(O,U,M,{restoreFocusRef:E});function K(o){h.value=o,o==="nostr"&&f.value.length===0&&!k.value&&G()}const I=m(!1),ae=m(""),j=m([]),p=m(""),f=m([]),k=m(!1),z=m("");async function G(){if(!(f.value.length>0||k.value)){k.value=!0,z.value="";try{const o=await V.marketplaceDiscover();f.value=o.apps.map(e=>({id:e.manifest.app_id,title:e.manifest.name,version:e.manifest.version,description:(typeof e.manifest.description=="string",e.manifest.description),icon:e.manifest.icon_url||"",author:e.manifest.author.name,dockerImage:e.manifest.container.image,repoUrl:e.manifest.repo_url,category:e.manifest.category,source:"nostr",trustScore:e.trust_score,trustTier:e.trust_tier,relayCount:e.relay_count}))}catch(o){z.value=o instanceof Error?o.message:"Discovery failed"}finally{k.value=!1}}}const q=_(()=>R.data?.["package-data"]||{});function W(o){if(o.category)return o.category;const e=o.id.toLowerCase(),t=o.title?.toLowerCase()||"",s=(typeof o.description=="string"?o.description:o.description?.short??"").toLowerCase(),l=`${e} ${t} ${s}`;return e.includes("bitcoin")||e.includes("btc")||e.includes("lightning")||e.includes("lnd")||e.includes("cln")||e.includes("electr")||e.includes("fedimint")||e.includes("cashu")||t.includes("lightning")||l.includes("wallet")||l.includes("satoshi")?"money":e.includes("btcpay")||e.includes("commerce")||e.includes("shop")||e.includes("store")||e.includes("pos")||e.includes("payment")||l.includes("merchant")||l.includes("invoice")?"commerce":e.includes("cloud")||e.includes("nextcloud")||e.includes("sync")||e.includes("storage")||e.includes("backup")||e.includes("file")||e.includes("photo")||e.includes("immich")||e.includes("jellyfin")||e.includes("plex")||e.includes("media")||e.includes("vault")||l.includes("password manager")||l.includes("file storage")?"data":e.includes("home-assistant")||e.includes("homeassistant")||e.includes("smart-home")||e.includes("automation")||e.includes("iot")||l.includes("home automation")||l.includes("smart home")?"home":e.includes("nostr")||e.includes("relay")&&l.includes("nostr")||l.includes("nostr relay")||l.includes("nostr client")?"nostr":e.includes("vpn")||e.includes("wireguard")||e.includes("tailscale")||e.includes("proxy")||e.includes("dns")||e.includes("pihole")||e.includes("adguard")||e.includes("nginx")||e.includes("tor")||l.includes("network")||l.includes("firewall")?"networking":e.includes("matrix")||e.includes("synapse")||e.includes("element")||e.includes("mastodon")||e.includes("lemmy")||e.includes("messenger")||e.includes("chat")||e.includes("social")||e.includes("cups")||l.includes("communication")||l.includes("messaging")?"community":"other"}const J=_(()=>{const o=[],e=j.value.map(s=>{const l=W(s);return{...s,category:l,source:"community"}}),t=[...o,...e];if(f.value.length>0){const s=new Set(t.map(v=>v.id)),l=f.value.filter(v=>!s.has(v.id)).map(v=>{const P=v.category||W(v);return{...v,category:P,source:"nostr"}});return[...t,...l]}return t}),X=_(()=>{const o=J.value;return S.value.filter(e=>e.id==="all"?o.length>0:o.some(t=>t.category===e.id))}),Q=_(()=>{let o=J.value;if(h.value&&h.value!=="all"&&(o=o.filter(e=>e.category===h.value)),p.value){const e=p.value.toLowerCase();o=o.filter(t=>t.title?.toLowerCase().includes(e)||typeof t.description=="string"&&t.description.toLowerCase().includes(e)||typeof t.description=="object"&&t.description?.short?.toLowerCase().includes(e)||t.id?.toLowerCase().includes(e)||t.author?.toLowerCase().includes(e))}return o}),le={mempool:["mempool-web"],bitcoin:["bitcoin-knots"],btcpay:["btcpay-server"],immich:["immich-server","immich-app","immich_server"],nextcloud:["nextcloud-aio","nextcloud-server"]};function w(o){if(o in q.value)return!0;const e=le[o];return e?e.some(t=>t in q.value):!1}function ce(o){ne.openSession(o.id)}_e(()=>{j.value.length===0&&!I.value&&de()});async function de(){I.value=!0,ae.value="",j.value=ue(),I.value=!1}function T(o){const e=["bitcoin-knots","bitcoin","lnd","mempool","btcpay-server","dwn","filebrowser"],t=["fedimint","vaultwarden","uptime-kuma","grafana","searxng","tailscale","portainer"];return e.includes(o)?"core":t.includes(o)?"recommended":"optional"}function ue(){return[{id:"bitcoin-knots",title:"Bitcoin Knots",version:"28.1.0",description:"Run a full Bitcoin node. Validate and relay blocks and transactions on the Bitcoin network.",icon:"/assets/img/app-icons/bitcoin-knots.webp",author:"Bitcoin Knots",dockerImage:"docker.io/bitcoinknots/bitcoin:v28.1",manifestUrl:void 0,repoUrl:"https://github.com/bitcoinknots/bitcoin"},{id:"btcpay-server",title:"BTCPay Server",version:"1.13.5",description:"Self-hosted Bitcoin payment processor. Accept Bitcoin payments without intermediaries or fees.",icon:"/assets/img/app-icons/btcpay-server.png",author:"BTCPay Server Foundation",dockerImage:"docker.io/btcpayserver/btcpayserver:1.13.5",manifestUrl:void 0,repoUrl:"https://github.com/btcpayserver/btcpayserver"},{id:"lnd",title:"LND",version:"0.17.4",description:"Lightning Network Daemon. Fast and cheap Bitcoin payments through the Lightning Network.",icon:"/assets/img/app-icons/lnd.svg",author:"Lightning Labs",dockerImage:"docker.io/lightninglabs/lnd:v0.17.4-beta",manifestUrl:void 0,repoUrl:"https://github.com/lightningnetwork/lnd"},{id:"mempool",title:"Mempool Explorer",version:"2.5.0",description:"Self-hosted Bitcoin blockchain and mempool visualizer with beautiful explorer interface.",icon:"/assets/img/app-icons/mempool.webp",author:"Mempool",dockerImage:"docker.io/mempool/frontend:v2.5.0",manifestUrl:void 0,repoUrl:"https://github.com/mempool/mempool"},{id:"homeassistant",title:"Home Assistant",version:"2024.1",description:"Open-source home automation platform. Control and automate your smart home devices privately.",icon:"/assets/img/app-icons/homeassistant.png",author:"Home Assistant",dockerImage:"docker.io/homeassistant/home-assistant:2024.1",manifestUrl:void 0,repoUrl:"https://github.com/home-assistant/core"},{id:"grafana",title:"Grafana",version:"10.2.0",description:"Analytics and monitoring platform. Create dashboards and visualize data from multiple sources.",icon:"/assets/img/app-icons/grafana.png",author:"Grafana Labs",dockerImage:"docker.io/grafana/grafana:10.2.0",manifestUrl:void 0,repoUrl:"https://github.com/grafana/grafana"},{id:"searxng",title:"SearXNG",version:"2024.1.0",description:"Privacy-respecting metasearch engine. Search without tracking or ads.",icon:"/assets/img/app-icons/searxng.png",author:"SearXNG",dockerImage:"docker.io/searxng/searxng:2024.11.17-e2554de75",manifestUrl:void 0,repoUrl:"https://github.com/searxng/searxng"},{id:"ollama",title:"Ollama",version:"0.1.0",description:"Run large language models locally. Download and run AI models like Llama, Mistral on your own hardware.",icon:"/assets/img/app-icons/ollama.png",author:"Ollama",dockerImage:"docker.io/ollama/ollama:0.5.4",manifestUrl:void 0,repoUrl:"https://github.com/ollama/ollama"},{id:"onlyoffice",title:"OnlyOffice",version:"7.5.1",description:"Office suite for document collaboration. Edit docs, spreadsheets, and presentations.",icon:"/assets/img/app-icons/onlyoffice.webp",author:"Ascensio System SIA",dockerImage:"docker.io/onlyoffice/documentserver:7.5.1",manifestUrl:void 0,repoUrl:"https://github.com/ONLYOFFICE/DocumentServer"},{id:"penpot",title:"Penpot",version:"2.4",description:"Open-source design and prototyping platform. Self-hosted alternative to Figma.",icon:"/assets/img/app-icons/penpot.webp",author:"Penpot",dockerImage:"docker.io/penpotapp/frontend:2.4",manifestUrl:void 0,repoUrl:"https://github.com/penpot/penpot"},{id:"nextcloud",title:"Nextcloud",version:"28.0",description:"Self-hosted cloud storage and collaboration platform. Your own private cloud.",icon:"/assets/img/app-icons/nextcloud.webp",author:"Nextcloud",dockerImage:"docker.io/library/nextcloud:28",manifestUrl:void 0,repoUrl:"https://github.com/nextcloud/server"},{id:"vaultwarden",title:"Vaultwarden",version:"1.30.0",description:"Self-hosted password manager (Bitwarden-compatible). Secure vault for passwords and secrets.",icon:"/assets/img/app-icons/vaultwarden.webp",author:"Vaultwarden",dockerImage:"docker.io/vaultwarden/server:1.30.0-alpine",manifestUrl:void 0,repoUrl:"https://github.com/dani-garcia/vaultwarden"},{id:"jellyfin",title:"Jellyfin",version:"10.8.0",description:"Free media server system. Stream your movies, music, and photos to any device.",icon:"/assets/img/app-icons/jellyfin.webp",author:"Jellyfin",dockerImage:"docker.io/jellyfin/jellyfin:10.8.13",manifestUrl:void 0,repoUrl:"https://github.com/jellyfin/jellyfin"},{id:"photoprism",title:"PhotoPrism",version:"240915",description:"AI-powered photo management. Organize and browse photos with facial recognition.",icon:"/assets/img/app-icons/photoprism.svg",author:"PhotoPrism",dockerImage:"docker.io/photoprism/photoprism:240915",manifestUrl:void 0,repoUrl:"https://github.com/photoprism/photoprism"},{id:"immich",title:"Immich",version:"1.90.0",description:"High-performance self-hosted photo and video backup. Mobile-first with ML features.",icon:"/assets/img/app-icons/immich.png",author:"Immich",dockerImage:"ghcr.io/immich-app/immich-server:release",manifestUrl:void 0,repoUrl:"https://github.com/immich-app/immich"},{id:"filebrowser",title:"File Browser",version:"2.27.0",description:"Web-based file manager. Browse, upload, and manage files through a web interface.",icon:"/assets/img/app-icons/file-browser.webp",author:"File Browser",dockerImage:"docker.io/filebrowser/filebrowser:v2.27.0",manifestUrl:void 0,repoUrl:"https://github.com/filebrowser/filebrowser"},{id:"nginx-proxy-manager",title:"Nginx Proxy Manager",version:"2.11.0",description:"Easy proxy management with SSL. Beautiful web interface for managing reverse proxies.",icon:"/assets/img/app-icons/nginx.svg",author:"Nginx Proxy Manager",dockerImage:"docker.io/jc21/nginx-proxy-manager:2.12.1",manifestUrl:void 0,repoUrl:"https://github.com/NginxProxyManager/nginx-proxy-manager"},{id:"portainer",title:"Portainer",version:"2.19.0",description:"Container management UI. Manage Docker containers through a beautiful web interface.",icon:"/assets/img/app-icons/portainer.webp",author:"Portainer",dockerImage:"docker.io/portainer/portainer-ce:2.19.4",manifestUrl:void 0,repoUrl:"https://github.com/portainer/portainer"},{id:"uptime-kuma",title:"Uptime Kuma",version:"1.23.0",description:"Self-hosted monitoring tool. Monitor uptime for HTTP(s), TCP, DNS, and more.",icon:"/assets/img/app-icons/uptime-kuma.webp",author:"Uptime Kuma",dockerImage:"docker.io/louislam/uptime-kuma:1",manifestUrl:void 0,repoUrl:"https://github.com/louislam/uptime-kuma"},{id:"tailscale",title:"Tailscale",version:"1.78.0",description:"Zero-config VPN for secure remote access. Connect all your devices with WireGuard mesh network.",icon:"/assets/img/app-icons/tailscale.webp",author:"Tailscale",dockerImage:"docker.io/tailscale/tailscale:stable",manifestUrl:void 0,repoUrl:"https://github.com/tailscale/tailscale"},{id:"fedimint",title:"Fedimint",version:"0.10.0",description:"Federated Bitcoin mint with built-in Guardian UI. Private, scalable Bitcoin through federated guardians.",icon:"/assets/img/app-icons/fedimint.png",author:"Fedimint",dockerImage:"docker.io/fedimint/fedimintd:v0.10.0",manifestUrl:void 0,repoUrl:"https://github.com/fedimint/fedimint"},{id:"indeedhub",title:"Indeehub",version:"0.1.0",description:"Bitcoin documentary streaming platform with Nostr identity sign-in. Stream God Bless Bitcoin and other educational content about sovereignty and decentralized technology.",icon:"/assets/img/app-icons/indeedhub.png",author:"Indeehub Team",dockerImage:"localhost/indeedhub:latest",manifestUrl:void 0,repoUrl:"https://github.com/indeedhub/indeedhub"},{id:"dwn",title:"Decentralized Web Node",version:"0.4.0",description:"Store and sync your personal data across devices using decentralized web node protocols. Own your data with DID-based access control.",icon:"/assets/img/app-icons/dwn.svg",author:"TBD",dockerImage:"ghcr.io/tbd54566975/dwn-server:main",manifestUrl:void 0,repoUrl:"https://github.com/TBD54566975/dwn-server"},{id:"nostrudel",title:"noStrudel",version:"0.40.0",category:"nostr",description:"A feature-rich Nostr web client with NIP-07 signer support. Browse your feed, post notes, manage relays, and interact with the Nostr network — all signed with your node's Nostr identity.",icon:"/assets/img/app-icons/nostrudel.svg",author:"hzrd149",dockerImage:"",manifestUrl:void 0,repoUrl:"https://github.com/hzrd149/nostrudel",webUrl:"https://nostrudel.ninja"},{id:"nostr-rs-relay",title:"Nostr Relay",version:"0.9.0",category:"nostr",description:"Run your own Nostr relay. Store your events locally, relay for friends, and publish over Tor. A sovereign relay for your sovereign node.",icon:"/assets/img/app-icons/nostr-rs-relay.svg",author:"scsiblade",dockerImage:"docker.io/scsiblade/nostr-rs-relay:0.9.0",manifestUrl:void 0,repoUrl:"https://sr.ht/~gheartsfield/nostr-rs-relay/"},{id:"botfights",title:"BotFights",version:"1.0.0",description:"AI bot arena — build, train, and battle autonomous agents. Compete in strategy tournaments with your own coded bots.",icon:"/assets/img/app-icons/botfights.svg",author:"BotFights",dockerImage:"",manifestUrl:void 0,repoUrl:"https://botfights.net",webUrl:"https://botfights.net"},{id:"nwnn",title:"Next Web News Network",version:"1.0.0",category:"l484",description:"Decentralized news and link aggregator, synchronized from Telegram. Community-curated content on Bitcoin, sovereignty, and decentralized tech.",icon:"/assets/img/app-icons/nwnn.png",author:"L484",dockerImage:"",manifestUrl:void 0,repoUrl:"https://nwnn.l484.com",webUrl:"https://nwnn.l484.com"},{id:"484-kitchen",title:"484 Kitchen",version:"1.0.0",category:"l484",description:"K484 application platform — an internal tool for the L484 network.",icon:"/assets/img/app-icons/484-kitchen.png",author:"L484",dockerImage:"",manifestUrl:void 0,repoUrl:"https://484.kitchen",webUrl:"https://484.kitchen"},{id:"call-the-operator",title:"Call the Operator",version:"1.0.0",category:"l484",description:"Escape the Matrix — a portal for exploring decentralized alternatives and reclaiming digital sovereignty.",icon:"/assets/img/app-icons/call-the-operator.png",author:"TX1138",dockerImage:"",manifestUrl:void 0,repoUrl:"https://cta.tx1138.com",webUrl:"https://cta.tx1138.com"},{id:"arch-presentation",title:"Arch Presentation",version:"1.0.0",category:"l484",description:"Archipelago: The Future of Decentralized Infrastructure — an interactive presentation about the Archipelago project vision.",icon:"/assets/img/app-icons/arch-presentation.png",author:"L484",dockerImage:"",manifestUrl:void 0,repoUrl:"https://present.l484.com",webUrl:"https://present.l484.com"},{id:"syntropy-institute",title:"Syntropy Institute",version:"1.0.0",category:"l484",description:"Medicine Reimagined — Manual Kinetics, Syntropy Frequency analysis-therapy, digital homeopathy, and concierge protocols.",icon:"/assets/img/app-icons/syntropy-institute.png",author:"Syntropy Institute",dockerImage:"",manifestUrl:void 0,repoUrl:"https://syntropy.institute",webUrl:"https://syntropy.institute"},{id:"t-zero",title:"T-0",version:"1.0.0",category:"l484",description:"Documentary series exploring decentralization, Bitcoin, and the mavericks building the ungovernable future. Conversations with the builders, powered by Nostr.",icon:"/assets/img/app-icons/t-zero.png",author:"T-0",dockerImage:"",manifestUrl:void 0,repoUrl:"https://teeminuszero.net",webUrl:"https://teeminuszero.net"}]}function Y(o){try{w(o.id)?H.push({name:"app-details",params:{id:o.id}}):(se(o),H.push({name:"marketplace-app-detail",params:{id:o.id}}))}catch{}}const b=[],x=[];function B(o,e){const t=setTimeout(()=>{const s=b.indexOf(t);s!==-1&&b.splice(s,1),o()},e);return b.push(t),t}function me(o,e){const t=setInterval(o,e);return x.push(t),t}function N(o){clearInterval(o);const e=x.indexOf(o);e!==-1&&x.splice(e,1)}Ce(()=>{for(const o of b)clearTimeout(o);b.length=0;for(const o of x)clearInterval(o);x.length=0});function Z(o,e){const t=me(()=>{const s=a.value.get(o);if(!s){N(t);return}const l=s.attempt+1;a.value.set(o,{...s,attempt:l,progress:Math.min(60+l*.5,95),message:e}),w(o)?(N(t),a.value.set(o,{...s,status:"complete",progress:100,message:"Installation complete!"}),B(()=>{a.value.delete(o)},2e3)):l>=re.value&&(N(t),a.value.set(o,{...s,status:"error",progress:0,message:"Installation timeout"}),B(()=>{a.value.delete(o)},5e3))},1e3)}async function he(o){if(!(a.value.has(o.id)||w(o.id))){a.value.set(o.id,{id:o.id,title:o.title??o.id,status:"downloading",progress:10,message:"Preparing installation...",attempt:0});try{const e=o.url||o.manifestUrl||o.s9pkUrl;a.value.set(o.id,{...a.value.get(o.id),status:"downloading",progress:30,message:"Downloading package..."}),await V.call({method:"package.install",params:{id:o.id,url:e,version:o.version}}),a.value.set(o.id,{...a.value.get(o.id),status:"installing",progress:60,message:"Installing package..."}),Z(o.id,"Starting application...")}catch(e){a.value.set(o.id,{...a.value.get(o.id),status:"error",progress:0,message:`Failed: ${e}`}),B(()=>{a.value.delete(o.id)},5e3)}}}async function ge(o){if(!(a.value.has(o.id)||w(o.id)||!o.dockerImage)){a.value.set(o.id,{id:o.id,title:o.title??o.id,status:"downloading",progress:10,message:"Pulling Docker image...",attempt:0});try{a.value.set(o.id,{...a.value.get(o.id),status:"downloading",progress:20,message:"Downloading container image..."}),await V.call({method:"package.install",params:{id:o.id,dockerImage:o.dockerImage,version:o.version},timeout:18e4}),a.value.set(o.id,{...a.value.get(o.id),status:"installing",progress:60,message:"Starting container..."}),Z(o.id,"Initializing application...")}catch(e){a.value.set(o.id,{...a.value.get(o.id),status:"error",progress:0,message:`Failed: ${e}`}),B(()=>{a.value.delete(o.id)},5e3)}}}function pe(o){const e=o.target;e.src="/assets/img/logo-archipelago.svg"}return(o,e)=>(n(),r("div",Se,[i("div",null,[a.value.size>0?(n(),r("div",je,[(n(!0),r(A,null,L(a.value,([t,s])=>(n(),r("div",{key:t,class:y(["glass-card p-4 border-l-4",{"border-blue-500":s.status==="downloading"||s.status==="installing","border-orange-500":s.status==="starting","border-green-500":s.status==="complete","border-red-500":s.status==="error"}])},[i("div",Te,[i("div",Ne,[s.status!=="complete"&&s.status!=="error"?(n(),r("svg",Pe,[...e[6]||(e[6]=[i("circle",{class:"opacity-25",cx:"12",cy:"12",r:"10",stroke:"currentColor","stroke-width":"4"},null,-1),i("path",{class:"opacity-75",fill:"currentColor",d:"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"},null,-1)])])):s.status==="complete"?(n(),r("svg",De,[...e[7]||(e[7]=[i("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z"},null,-1)])])):(n(),r("svg",Fe,[...e[8]||(e[8]=[i("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M10 14l2-2m0 0l2-2m-2 2l-2-2m2 2l2 2m7-2a9 9 0 11-18 0 9 9 0 0118 0z"},null,-1)])])),i("div",null,[i("p",Ve,d(s.title),1),i("p",$e,d(s.message),1)])]),i("div",He,d(s.progress)+"% ",1)]),i("div",Re,[i("div",{class:y(["h-full rounded-full transition-all duration-500",{"bg-gradient-to-r from-blue-500 to-blue-400":s.status==="downloading"||s.status==="installing","bg-gradient-to-r from-orange-500 to-orange-400":s.status==="starting","bg-gradient-to-r from-green-500 to-green-400":s.status==="complete","bg-gradient-to-r from-red-500 to-red-400":s.status==="error"}]),style:ie({width:`${s.progress}%`})},null,6)])],2))),128))])):g("",!0),i("div",Oe,[i("div",Ee,[D(u(ee),{to:"/dashboard/apps",class:"mode-switcher-btn"},{default:F(()=>[...e[9]||(e[9]=[C("My Apps",-1)])]),_:1}),D(u(ee),{to:"/dashboard/marketplace",class:"mode-switcher-btn mode-switcher-btn-active"},{default:F(()=>[...e[10]||(e[10]=[C("App Store",-1)])]),_:1})]),i("div",Ke,[(n(!0),r(A,null,L(X.value,t=>(n(),r("button",{key:t.id,onClick:s=>K(t.id),class:y(["mode-switcher-btn",{"mode-switcher-btn-active":h.value===t.id}])},[C(d(t.name)+" ",1),t.id==="nostr"&&f.value.length>0?(n(),r("span",qe,"+"+d(f.value.length),1)):g("",!0)],10,Ge))),128))]),te(i("input",{"onUpdate:modelValue":e[0]||(e[0]=t=>p.value=t),type:"text",placeholder:u(c)("marketplace.searchPlaceholder"),"aria-label":u(c)("marketplace.searchApps"),class:"flex-1 px-4 py-2 bg-white/10 border border-white/20 rounded-lg text-white placeholder-white/50 focus:outline-none focus:border-white/40 transition-colors"},null,8,We),[[oe,p.value]])]),i("div",Je,[te(i("input",{"onUpdate:modelValue":e[1]||(e[1]=t=>p.value=t),type:"text",placeholder:u(c)("marketplace.searchPlaceholder"),"aria-label":u(c)("marketplace.searchApps"),class:"w-full px-4 py-3 md:py-2 bg-white/10 border border-white/20 rounded-lg text-white placeholder-white/50 focus:outline-none focus:border-white/40 transition-colors"},null,8,Xe),[[oe,p.value]])])]),i("div",Qe,[i("div",Ye,[(n(!0),r(A,null,L(Q.value,(t,s)=>(n(),r("div",{key:t.id,"data-controller-container":"","data-controller-install":!(w(t.id)||a.value.has(t.id))&&(t.source==="local"||t.dockerImage)?"1":void 0,tabindex:"0",role:"link",class:"glass-card card-stagger p-6 hover:bg-white/10 transition-all cursor-pointer flex flex-col",style:ie({"--stagger-index":s}),onClick:l=>Y(t),onKeydown:ze(l=>Y(t),["enter"])},[i("div",et,[t.icon?(n(),r("img",{key:0,src:t.icon,alt:t.title,class:"w-16 h-16 rounded-lg object-cover",onError:pe},null,40,tt)):(n(),r("div",ot,[...e[11]||(e[11]=[i("svg",{class:"w-8 h-8 text-white/40",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[i("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M20 7l-8-4-8 4m16 0l-8 4m8-4v10l-8 4m0-10L4 7m8 4v10M4 7v10l8 4"})],-1)])])),i("div",it,[i("h3",st,[C(d(t.title)+" ",1),T(t.id)!=="optional"?(n(),r("span",{key:0,class:y(["tier-badge",T(t.id)==="core"?"tier-badge-core":"tier-badge-recommended"])},d(T(t.id)),3)):g("",!0)]),i("p",nt,d(t.version?`v${t.version}`:"latest"),1),t.author?(n(),r("p",rt,"by "+d(t.author),1)):g("",!0)])]),t.trustTier?(n(),r("div",at,[i("span",{class:y(["text-xs px-2 py-0.5 rounded-full font-medium",{"bg-green-400/20 text-green-400":t.trustTier==="verified","bg-yellow-400/20 text-yellow-400":t.trustTier==="community","bg-orange-400/20 text-orange-400":t.trustTier==="unverified","bg-red-400/20 text-red-400":t.trustTier==="untrusted"}])},d(t.trustTier),3),i("span",lt,"Score: "+d(t.trustScore)+"/100",1),t.relayCount?(n(),r("span",ct,"· "+d(t.relayCount)+" relay"+d(t.relayCount!==1?"s":""),1)):g("",!0)])):g("",!0),i("p",dt,d(typeof t.description=="object"?t.description.short:t.description||"No description available"),1),i("div",ut,[w(t.id)?(n(),r("span",mt,d(u(c)("marketplace.alreadyInstalled")),1)):g("",!0),w(t.id)?(n(),r("button",{key:1,onClick:$(l=>ce(t),["stop"]),class:"px-4 py-2 glass-button glass-button-sm rounded-lg text-sm font-medium"},d(u(c)("common.launch")),9,ht)):t.source==="local"||t.dockerImage?(n(),r("button",{key:2,"data-controller-install-btn":"",onClick:$(l=>t.source==="local"?he(t):ge(t),["stop"]),disabled:a.value.has(t.id),class:"flex-1 px-4 py-2 glass-button glass-button-sm rounded-lg text-sm font-medium disabled:opacity-50 disabled:cursor-not-allowed"},[a.value.has(t.id)?(n(),r("span",pt,[e[12]||(e[12]=i("svg",{class:"animate-spin h-4 w-4",xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24"},[i("circle",{class:"opacity-25",cx:"12",cy:"12",r:"10",stroke:"currentColor","stroke-width":"4"}),i("path",{class:"opacity-75",fill:"currentColor",d:"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"})],-1)),C(" "+d(a.value.get(t.id)?.message||u(c)("common.installing")),1)])):(n(),r("span",vt,d(u(c)("common.install")),1))],8,gt)):(n(),r("button",ft,d(u(c)("common.notAvailable")),1))])],44,Ze))),128))]),Q.value.length===0?(n(),r("div",wt,[I.value||k.value?(n(),r("div",kt,[e[13]||(e[13]=i("svg",{class:"animate-spin h-12 w-12 text-blue-400",xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24"},[i("circle",{class:"opacity-25",cx:"12",cy:"12",r:"10",stroke:"currentColor","stroke-width":"4"}),i("path",{class:"opacity-75",fill:"currentColor",d:"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"})],-1)),i("p",yt,d(k.value?u(c)("marketplace.queryingRelays"):u(c)("common.loading")),1)])):z.value&&h.value==="nostr"?(n(),r("div",bt,[i("p",xt,d(u(c)("marketplace.noCommunityApps")),1),i("p",_t,d(z.value),1),i("button",{onClick:e[2]||(e[2]=t=>{f.value=[],G()}),class:"px-4 py-2 glass-button rounded-lg text-sm"},d(u(c)("common.retry")),1)])):(n(),r("p",Ct,d(p.value&&h.value!=="all"?u(c)("marketplace.noResults",{category:S.value.find(t=>t.id===h.value)?.name,query:p.value}):p.value?u(c)("marketplace.noResultsSearch",{query:p.value}):u(c)("marketplace.noResultsCategory",{category:S.value.find(t=>t.id===h.value)?.name})),1))])):g("",!0)]),(n(),Ue(Me,{to:"body"},[i("button",{onClick:e[3]||(e[3]=t=>U.value=!0),class:"md:hidden fixed right-4 z-40 w-14 h-14 rounded-full glass-button flex items-center justify-center shadow-2xl mobile-back-btn",style:{left:"auto"}},[...e[14]||(e[14]=[i("svg",{class:"w-6 h-6",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[i("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M3 4a1 1 0 011-1h16a1 1 0 011 1v2.586a1 1 0 01-.293.707l-6.414 6.414a1 1 0 00-.293.707V17l-4 4v-6.586a1 1 0 00-.293-.707L3.293 7.293A1 1 0 013 6.586V4z"})],-1)])])])),D(Ie,{name:"modal"},{default:F(()=>[U.value?(n(),r("div",{key:0,class:"fixed inset-0 z-50 flex items-end justify-center md:hidden bg-black/10 backdrop-blur-md",onClick:e[5]||(e[5]=$(t=>M(),["self"]))},[i("div",{ref_key:"filterModalRef",ref:O,class:"glass-card p-6 w-full rounded-t-3xl max-h-[80vh] overflow-y-auto"},[i("div",Ut,[i("h2",Mt,d(u(c)("marketplace.filterByCategory")),1),i("button",{onClick:e[4]||(e[4]=t=>M()),class:"text-white/60 hover:text-white transition-colors"},[...e[15]||(e[15]=[i("svg",{class:"w-6 h-6",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[i("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M6 18L18 6M6 6l12 12"})],-1)])])]),i("div",It,[(n(!0),r(A,null,L(X.value,t=>(n(),r("button",{key:t.id,onClick:s=>{K(t.id),M()},class:y(["p-4 rounded-xl font-medium transition-all text-left",h.value===t.id?"bg-white/20 text-white border-2 border-white/40":"glass-card text-white/80 hover:bg-white/10"])},[i("div",Bt,[i("div",At,[t.id==="all"?(n(),r("svg",Lt,[...e[16]||(e[16]=[i("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M4 6a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2H6a2 2 0 01-2-2V6zM14 6a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2h-2a2 2 0 01-2-2V6zM4 16a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2H6a2 2 0 01-2-2v-2zM14 16a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2h-2a2 2 0 01-2-2v-2z"},null,-1)])])):t.id==="community"?(n(),r("svg",St,[...e[17]||(e[17]=[i("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M17 20h5v-2a3 3 0 00-5.356-1.857M17 20H7m10 0v-2c0-.656-.126-1.283-.356-1.857M7 20H2v-2a3 3 0 015.356-1.857M7 20v-2c0-.656.126-1.283.356-1.857m0 0a5.002 5.002 0 019.288 0M15 7a3 3 0 11-6 0 3 3 0 016 0zm6 3a2 2 0 11-4 0 2 2 0 014 0zM7 10a2 2 0 11-4 0 2 2 0 014 0z"},null,-1)])])):t.id==="nostr"?(n(),r("svg",jt,[...e[18]||(e[18]=[i("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M13 10V3L4 14h7v7l9-11h-7z"},null,-1)])])):t.id==="commerce"?(n(),r("svg",Tt,[...e[19]||(e[19]=[i("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M3 3h2l.4 2M7 13h10l4-8H5.4M7 13L5.4 5M7 13l-2.293 2.293c-.63.63-.184 1.707.707 1.707H17m0 0a2 2 0 100 4 2 2 0 000-4zm-8 2a2 2 0 11-4 0 2 2 0 014 0z"},null,-1)])])):t.id==="money"?(n(),r("svg",Nt,[...e[20]||(e[20]=[i("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 8c-1.657 0-3 .895-3 2s1.343 2 3 2 3 .895 3 2-1.343 2-3 2m0-8c1.11 0 2.08.402 2.599 1M12 8V7m0 1v8m0 0v1m0-1c-1.11 0-2.08-.402-2.599-1M21 12a9 9 0 11-18 0 9 9 0 0118 0z"},null,-1)])])):t.id==="data"?(n(),r("svg",Pt,[...e[21]||(e[21]=[i("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M4 7v10c0 2.21 3.582 4 8 4s8-1.79 8-4V7M4 7c0 2.21 3.582 4 8 4s8-1.79 8-4M4 7c0-2.21 3.582-4 8-4s8 1.79 8 4m0 5c0 2.21-3.582 4-8 4s-8-1.79-8-4"},null,-1)])])):t.id==="home"?(n(),r("svg",Dt,[...e[22]||(e[22]=[i("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M3 12l2-2m0 0l7-7 7 7M5 10v10a1 1 0 001 1h3m10-11l2 2m-2-2v10a1 1 0 01-1 1h-3m-6 0a1 1 0 001-1v-4a1 1 0 011-1h2a1 1 0 011 1v4a1 1 0 001 1m-6 0h6"},null,-1)])])):t.id==="car"?(n(),r("svg",Ft,[...e[23]||(e[23]=[i("path",{d:"M61.44,0c33.93,0,61.44,27.51,61.44,61.44c0,33.93-27.51,61.44-61.44,61.44S0,95.37,0,61.44 C0,27.51,27.51,0,61.44,0L61.44,0z M61.17,61.6c1.76,0,3.18,1.42,3.18,3.18c0,1.76-1.42,3.18-3.18,3.18 c-1.76,0-3.18-1.42-3.18-3.18C57.99,63.03,59.42,61.6,61.17,61.6L61.17,61.6z M61.2,53.28c6.34,0,11.47,5.14,11.47,11.47 c0,6.34-5.14,11.47-11.47,11.47c-6.33,0-11.47-5.14-11.47-11.47C49.73,58.41,54.87,53.28,61.2,53.28L61.2,53.28z M14.78,44.57 c4.45-12.31,13.52-22.7,24.9-28.01c15.63-7.29,34.61-7.75,50.69,4.15c9.48,7.01,12.94,12.76,17.67,22.95 c3.58,9.03,0.64,11.97-10.87,6.9c-23.79-11.77-47.84-11.24-72.12,0C16.09,56.41,11.06,51.53,14.78,44.57L14.78,44.57z M75.9,109.05 c16.62-5.23,26.32-15.81,32.27-29.3c3.87-10.43-8.26-13.97-12.52-7.1c-2.55,5.06-5.59,9.4-9.55,12.77 c-6.2,5.27-15.18,6.23-16.58,16.16C68.79,106.74,69.97,111.38,75.9,109.05L75.9,109.05z M47.26,109.05 c-16.62-5.23-26.32-15.81-32.27-29.3c-3.87-10.43,8.26-13.97,12.52-7.1c2.55,5.06,5.59,9.4,9.55,12.77 c6.2,5.27,15.18,6.23,16.58,16.16C54.37,106.74,53.19,111.38,47.26,109.05L47.26,109.05z"},null,-1)])])):t.id==="networking"?(n(),r("svg",Vt,[...e[24]||(e[24]=[i("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M21 12a9 9 0 01-9 9m9-9a9 9 0 00-9-9m9 9H3m9 9a9 9 0 01-9-9m9 9c1.657 0 3-4.03 3-9s-1.343-9-3-9m0 18c-1.657 0-3-4.03-3-9s1.343-9 3-9m-9 9a9 9 0 019-9"},null,-1)])])):(n(),r("svg",$t,[...e[25]||(e[25]=[i("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M4 6a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2H6a2 2 0 01-2-2V6zM14 6a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2h-2a2 2 0 01-2-2V6zM4 16a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2H6a2 2 0 01-2-2v-2zM14 16a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2h-2a2 2 0 01-2-2v-2z"},null,-1)])]))]),i("div",Ht,[i("p",Rt,d(t.name),1),h.value===t.id?(n(),r("p",Ot,"Currently viewing")):g("",!0)]),h.value===t.id?(n(),r("svg",Et,[...e[26]||(e[26]=[i("path",{"fill-rule":"evenodd",d:"M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z","clip-rule":"evenodd"},null,-1)])])):g("",!0)])],10,zt))),128))])],512)])):g("",!0)]),_:1})]))}}),Jt=Ae(Kt,[["__scopeId","data-v-f5eafd6d"]]);export{Jt as default}; diff --git a/neode-ui/dist/assets/MarketplaceAppDetails-DhlIl2UT.js b/neode-ui/dist/assets/MarketplaceAppDetails-DhlIl2UT.js new file mode 100644 index 0000000..1efd2ef --- /dev/null +++ b/neode-ui/dist/assets/MarketplaceAppDetails-DhlIl2UT.js @@ -0,0 +1 @@ +import{o as P,A as U,r as b,j as v,d as O,y as $,z as K,c as i,a as e,J as p,D as o,E as n,n as G,h as J,i as Q,T as W,x as X,G as h,F as z,P as I,Q as Y,B as E,u as Z,q as a}from"./index-DnbYEqLr.js";import{u as ee}from"./useMarketplaceApp-BxXpq2aX.js";function te(){const f=b(72),l=v(()=>`${f.value+8}px`),j=v(()=>`bottom-[${f.value+8}px]`);let u=null,g=null,w=null;function x(){if(typeof window>"u")return;const s=document.querySelector("[data-mobile-tab-bar]");if(s&&s.offsetHeight>0){f.value=s.offsetHeight;return}const c=getComputedStyle(document.documentElement).getPropertyValue("--mobile-tab-bar-height").trim();if(c){const m=parseFloat(c);if(!isNaN(m)&&m>0){f.value=m;return}}}return P(()=>{x(),g=new MutationObserver(()=>{x()}),g.observe(document.documentElement,{attributes:!0,attributeFilter:["style"]});const s=document.querySelector("[data-mobile-tab-bar]");s&&"ResizeObserver"in window&&(u=new ResizeObserver(()=>{x()}),u.observe(s)),window.addEventListener("resize",x),w=setInterval(()=>{x()},1e3)}),U(()=>{g&&g.disconnect(),u&&u.disconnect(),w&&clearInterval(w),window.removeEventListener("resize",x)}),{bottomPosition:l,bottomClass:j,tabBarHeight:f}}const se={class:"app-details-container pb-16 md:pb-16"},oe={key:"loading",class:"glass-card p-12 text-center"},le={class:"text-white/70"},ne={key:"content"},ie={class:"glass-card p-6 mb-6"},ae={class:"hidden md:flex items-center gap-6"},re=["src","alt"],de={key:1,class:"w-20 h-20 rounded-xl bg-white/10 flex items-center justify-center flex-shrink-0"},ce={class:"flex-1 min-w-0"},ue={class:"text-2xl font-bold text-white mb-1"},me={class:"text-white/70 text-sm mb-2"},pe={class:"flex items-center gap-2"},he={key:0,class:"inline-flex items-center px-2.5 py-1 rounded-lg text-xs font-medium bg-green-500/20 text-green-200 border border-green-500/30"},ve={class:"text-white/50 text-xs"},xe={class:"flex items-center gap-2 flex-shrink-0"},ke=["disabled"],fe={key:0,class:"animate-spin h-4 w-4",xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24"},ge={key:1,class:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},we={class:"md:hidden"},be={class:"grid grid-cols-[80px_1fr] gap-4 mb-4"},_e=["src","alt"],ye={key:1,class:"w-20 h-20 rounded-xl bg-white/10 flex items-center justify-center"},Ce={class:"min-w-0"},De={class:"text-xl font-bold text-white mb-1"},Me={class:"text-white/70 text-xs mb-2 line-clamp-2"},Be={class:"flex flex-wrap items-center gap-2"},je={key:0,class:"inline-flex items-center px-2 py-0.5 rounded text-xs font-medium bg-green-500/20 text-green-200 border border-green-500/30"},ze={class:"text-white/50 text-xs"},Ie={class:"grid grid-cols-2 gap-2"},Ee=["disabled"],Ve={key:0,class:"animate-spin h-4 w-4",xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24"},Ae={key:1,class:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},He={key:0,class:"mt-4 p-3 bg-red-500/20 border border-red-500/40 rounded-lg"},Se={class:"flex items-start gap-2"},Te={class:"flex-1"},Le={class:"text-red-200 font-medium text-sm"},Pe={class:"text-red-300 text-xs mt-1"},Ue={key:0,class:"hidden md:block mt-4 p-4 bg-red-500/20 border border-red-500/40 rounded-lg"},Fe={class:"flex items-start gap-3"},Ne={class:"flex-1"},Re={class:"text-red-200 font-medium"},qe={class:"text-red-300 text-sm mt-1"},Oe={class:"grid grid-cols-1 lg:grid-cols-3 gap-6"},$e={class:"lg:col-span-2 space-y-6"},Ke={class:"glass-card p-6"},Ge={class:"text-2xl font-bold text-white mb-4"},Je={class:"grid grid-cols-1 md:grid-cols-2 gap-4"},Qe={class:"text-white/60 text-sm mt-3 text-center"},We={class:"glass-card p-6"},Xe={class:"text-2xl font-bold text-white mb-4"},Ye={class:"text-white/80 leading-relaxed whitespace-pre-line"},Ze={class:"glass-card p-6"},et={class:"text-2xl font-bold text-white mb-4"},tt={class:"space-y-3"},st={class:"space-y-6"},ot={class:"glass-card p-6"},lt={class:"text-lg font-bold text-white mb-4"},nt={class:"space-y-3"},it={class:"flex items-center justify-between py-2 border-b border-white/10"},at={class:"text-white/60 text-sm"},rt={class:"text-white font-medium"},dt={key:0,class:"flex items-center justify-between py-2 border-b border-white/10"},ct={class:"text-white/60 text-sm"},ut={class:"text-white font-medium"},mt={class:"flex items-center justify-between py-2 border-b border-white/10"},pt={class:"text-white/60 text-sm"},ht={class:"text-white font-medium"},vt={class:"flex items-center justify-between py-2 border-b border-white/10"},xt={class:"text-white/60 text-sm"},kt={class:"text-white font-medium capitalize"},ft={key:1,class:"flex items-center justify-between py-2"},gt={class:"glass-card p-6"},wt={class:"text-lg font-bold text-white mb-4"},bt={class:"space-y-3"},_t={key:0,class:"space-y-2 mb-4"},yt={key:0,class:"w-5 h-5 text-green-400 flex-shrink-0",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},Ct={key:1,class:"w-5 h-5 text-yellow-400 flex-shrink-0",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},Dt={key:2,class:"w-5 h-5 text-red-400 flex-shrink-0",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},Mt={class:"flex-1"},Bt={class:"text-white/80 font-medium text-sm"},jt={class:"text-white/50 text-xs"},zt=["disabled"],It={key:0,class:"animate-spin h-4 w-4",xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24"},Et={key:1,class:"py-2 border-b border-white/10"},Vt={class:"text-white/60 text-sm"},At={class:"flex items-start gap-3"},Ht={class:"flex-1"},St={class:"text-white/80 font-medium"},Tt={class:"text-white/60 text-sm"},Lt={class:"flex items-start gap-3"},Pt={class:"flex-1"},Ut={class:"text-white/80 font-medium"},Ft={class:"text-white/60 text-sm"},Nt={key:0,class:"glass-card p-6"},Rt={class:"text-lg font-bold text-white mb-4"},qt={class:"space-y-2"},Ot=["href"],$t={key:"not-found",class:"glass-card p-12 text-center"},Kt={class:"text-2xl font-semibold text-white mb-2"},Gt={class:"text-white/70"},Wt=O({__name:"MarketplaceAppDetails",setup(f){const{t:l}=$(),{bottomPosition:j}=te(),u=X(),g=Z(),w=K(),{getCurrentApp:x}=ee(),s=b(null),c=b(!1),m=b(!1),k=b(null),D=b(!0),_=v(()=>g.params.id),V=v(()=>!!(s.value?.webUrl&&!s.value?.dockerImage)),y=v(()=>V.value?!0:!!w.packages[_.value]),A=v(()=>{try{if(!s.value)return"";const r=s.value.description;return typeof r=="object"&&r?r.short||r.long||"":r||""}catch{return""}}),F=v(()=>{try{if(!s.value)return"";const r=s.value.description;return typeof r=="object"&&r?r.long||r.short||"":r||""}catch{return""}}),N=v(()=>["Self-hosted and privacy-focused","Easy installation and updates","Automatic backups","Secure by default","Open source"]),R={electrumx:[{id:"bitcoin-knots",title:"Bitcoin Knots",dockerImage:"docker.io/bitcoinknots/bitcoin:latest"}],lnd:[{id:"bitcoin-knots",title:"Bitcoin Knots",dockerImage:"docker.io/bitcoinknots/bitcoin:latest"}],"btcpay-server":[{id:"bitcoin-knots",title:"Bitcoin Knots",dockerImage:"docker.io/bitcoinknots/bitcoin:latest"}],mempool:[{id:"bitcoin-knots",title:"Bitcoin Knots",dockerImage:"docker.io/bitcoinknots/bitcoin:latest"},{id:"electrumx",title:"ElectrumX",dockerImage:"docker.io/lukechilds/electrumx:v1.18.0"}],fedimint:[{id:"bitcoin-knots",title:"Bitcoin Knots",dockerImage:"docker.io/bitcoinknots/bitcoin:latest"}]},M=v(()=>{if(!s.value)return[];const r=R[s.value.id];return r?r.map(t=>{const d=w.packages[t.id];let B="missing";return d&&(B=d.state==="running"?"running":"stopped"),{...t,status:B}}):[]});let C=null;P(()=>{try{const r=x();r&&r.id===_.value?(s.value=r,D.value=!1):(D.value=!1,C=setTimeout(()=>{u.push("/dashboard/marketplace").catch(()=>{})},500))}catch{D.value=!1,C=setTimeout(()=>{u.push("/dashboard/marketplace").catch(()=>{})},500)}}),U(()=>{C&&(clearTimeout(C),C=null)});function H(r){const t=r.target;t.src="/assets/img/logo-archipelago.svg"}function S(){u.push("/dashboard/marketplace").catch(()=>{})}function T(){if(V.value&&s.value?.webUrl){Y().open({url:s.value.webUrl,title:s.value.title||_.value});return}u.push({path:`/dashboard/apps/${_.value}`,query:{from:"marketplace"}}).catch(()=>{})}async function q(){if(m.value)return;const r=M.value.filter(t=>t.status==="missing");if(r.length){m.value=!0,k.value=null;try{for(const t of r)await E.call({method:"package.install",params:{id:t.id,dockerImage:t.dockerImage},timeout:18e4}),await new Promise(d=>setTimeout(d,2e3))}catch(t){k.value=t instanceof Error?t.message:l("marketplaceDetails.installFailed")}finally{m.value=!1}}}async function L(){if(!(c.value||!s.value)&&!(!s.value.manifestUrl&&!s.value.dockerImage)){c.value=!0,k.value=null;try{if(s.value.dockerImage)await E.call({method:"package.install",params:{id:s.value.id,dockerImage:s.value.dockerImage,version:s.value.version},timeout:18e4});else{const r=s.value.url||s.value.manifestUrl;await E.call({method:"package.install",params:{id:s.value.id,url:r,version:s.value.version}})}await new Promise(r=>setTimeout(r,1e3)),u.push(`/dashboard/apps/${_.value}`).catch(()=>{})}catch(r){k.value=r instanceof Error?r.message:l("marketplaceDetails.installFailed")}finally{c.value=!1}}}return(r,t)=>(a(),i("div",se,[e("button",{onClick:S,class:"hidden md:flex mb-6 items-center gap-2 text-white/70 hover:text-white transition-colors"},[t[0]||(t[0]=e("svg",{class:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M15 19l-7-7 7-7"})],-1)),p(" "+o(n(l)("marketplaceDetails.backToStore")),1)]),e("button",{onClick:S,class:"md:hidden fixed left-4 right-4 z-40 glass-button px-6 py-3 rounded-lg font-medium shadow-2xl flex items-center justify-center gap-2",style:G({bottom:n(j),filter:"drop-shadow(0 10px 25px rgba(0, 0, 0, 0.5))"})},[t[1]||(t[1]=e("svg",{class:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M15 19l-7-7 7-7"})],-1)),e("span",null,o(n(l)("marketplaceDetails.backToStore")),1)],4),J(W,{name:"content-fade",mode:"out-in"},{default:Q(()=>[D.value?(a(),i("div",oe,[t[2]||(t[2]=e("svg",{class:"animate-spin h-12 w-12 text-blue-400 mx-auto mb-4",xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24"},[e("circle",{class:"opacity-25",cx:"12",cy:"12",r:"10",stroke:"currentColor","stroke-width":"4"}),e("path",{class:"opacity-75",fill:"currentColor",d:"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"})],-1)),e("p",le,o(n(l)("marketplaceDetails.loadingDetails")),1)])):s.value?(a(),i("div",ne,[e("div",ie,[e("div",ae,[s.value.icon?(a(),i("img",{key:0,src:s.value.icon,alt:s.value.title,class:"w-20 h-20 rounded-xl shadow-xl flex-shrink-0",onError:H},null,40,re)):(a(),i("div",de,[...t[3]||(t[3]=[e("svg",{class:"w-10 h-10 text-white/40",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M20 7l-8-4-8 4m16 0l-8 4m8-4v10l-8 4m0-10L4 7m8 4v10M4 7v10l8 4"})],-1)])])),e("div",ce,[e("h1",ue,o(s.value.title),1),e("p",me,o(A.value),1),e("div",pe,[y.value?(a(),i("span",he,[t[4]||(t[4]=e("span",{class:"w-1.5 h-1.5 rounded-full bg-green-400 mr-1.5"},null,-1)),p(" "+o(n(l)("marketplaceDetails.installed")),1)])):h("",!0),e("span",ve,o(s.value.version?`v${s.value.version}`:"latest"),1)])]),e("div",xe,[y.value?(a(),i("button",{key:0,onClick:T,class:"glass-button glass-button-sm px-6 py-2.5 rounded-lg text-sm font-semibold flex items-center gap-2"},[t[5]||(t[5]=e("svg",{class:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14"})],-1)),p(" "+o(n(l)("marketplaceDetails.open")),1)])):(a(),i("button",{key:1,onClick:L,disabled:c.value||!s.value.manifestUrl&&!s.value.dockerImage,class:"glass-button glass-button-sm px-6 py-2.5 rounded-lg text-sm font-semibold flex items-center gap-2 disabled:opacity-50 disabled:cursor-not-allowed"},[c.value?(a(),i("svg",fe,[...t[6]||(t[6]=[e("circle",{class:"opacity-25",cx:"12",cy:"12",r:"10",stroke:"currentColor","stroke-width":"4"},null,-1),e("path",{class:"opacity-75",fill:"currentColor",d:"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"},null,-1)])])):(a(),i("svg",ge,[...t[7]||(t[7]=[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-4l-4 4m0 0l-4-4m4 4V4"},null,-1)])])),p(" "+o(c.value?n(l)("common.installing"):n(l)("common.install")),1)],8,ke))])]),e("div",we,[e("div",be,[s.value.icon?(a(),i("img",{key:0,src:s.value.icon,alt:s.value.title,class:"w-20 h-20 rounded-xl shadow-xl",onError:H},null,40,_e)):(a(),i("div",ye,[...t[8]||(t[8]=[e("svg",{class:"w-10 h-10 text-white/40",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M20 7l-8-4-8 4m16 0l-8 4m8-4v10l-8 4m0-10L4 7m8 4v10M4 7v10l8 4"})],-1)])])),e("div",Ce,[e("h1",De,o(s.value.title),1),e("p",Me,o(A.value),1),e("div",Be,[y.value?(a(),i("span",je,[t[9]||(t[9]=e("span",{class:"w-1.5 h-1.5 rounded-full bg-green-400 mr-1"},null,-1)),p(" "+o(n(l)("marketplaceDetails.installed")),1)])):h("",!0),e("span",ze,o(s.value.version?`v${s.value.version}`:"latest"),1)])])]),e("div",Ie,[y.value?(a(),i("button",{key:0,onClick:T,class:"glass-button glass-button-sm px-4 py-2.5 rounded-lg text-sm font-semibold flex items-center justify-center gap-2"},[t[10]||(t[10]=e("svg",{class:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14"})],-1)),p(" "+o(n(l)("marketplaceDetails.open")),1)])):(a(),i("button",{key:1,onClick:L,disabled:c.value||!s.value.manifestUrl&&!s.value.dockerImage,class:"glass-button glass-button-sm px-4 py-2.5 rounded-lg text-sm font-semibold flex items-center justify-center gap-2 disabled:opacity-50 disabled:cursor-not-allowed col-span-2"},[c.value?(a(),i("svg",Ve,[...t[11]||(t[11]=[e("circle",{class:"opacity-25",cx:"12",cy:"12",r:"10",stroke:"currentColor","stroke-width":"4"},null,-1),e("path",{class:"opacity-75",fill:"currentColor",d:"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"},null,-1)])])):(a(),i("svg",Ae,[...t[12]||(t[12]=[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-4l-4 4m0 0l-4-4m4 4V4"},null,-1)])])),p(" "+o(c.value?n(l)("common.installing"):n(l)("common.install")),1)],8,Ee))]),k.value?(a(),i("div",He,[e("div",Se,[t[13]||(t[13]=e("svg",{class:"w-4 h-4 text-red-400 flex-shrink-0 mt-0.5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"})],-1)),e("div",Te,[e("p",Le,o(n(l)("marketplaceDetails.installFailed")),1),e("p",Pe,o(k.value),1)])])])):h("",!0)]),k.value?(a(),i("div",Ue,[e("div",Fe,[t[14]||(t[14]=e("svg",{class:"w-5 h-5 text-red-400 flex-shrink-0 mt-0.5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"})],-1)),e("div",Ne,[e("p",Re,o(n(l)("marketplaceDetails.installFailed")),1),e("p",qe,o(k.value),1)])])])):h("",!0)]),e("div",Oe,[e("div",$e,[e("div",Ke,[e("h2",Ge,o(n(l)("marketplaceDetails.screenshots")),1),e("div",Je,[(a(),i(z,null,I(4,d=>e("div",{key:d,class:"aspect-video rounded-xl bg-white/5 border border-white/10 flex items-center justify-center hover:bg-white/10 transition-colors cursor-pointer"},[...t[15]||(t[15]=[e("svg",{class:"w-16 h-16 text-white/20",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M4 16l4.586-4.586a2 2 0 012.828 0L16 16m-2-2l1.586-1.586a2 2 0 012.828 0L20 14m-6-6h.01M6 20h12a2 2 0 002-2V6a2 2 0 00-2-2H6a2 2 0 00-2 2v12a2 2 0 002 2z"})],-1)])])),64))]),e("p",Qe,o(n(l)("marketplaceDetails.screenshotPlaceholder")),1)]),e("div",We,[e("h2",Xe,o(n(l)("marketplaceDetails.about",{name:s.value.title})),1),e("p",Ye,o(F.value),1)]),e("div",Ze,[e("h2",et,o(n(l)("marketplaceDetails.features")),1),e("ul",tt,[(a(!0),i(z,null,I(N.value,(d,B)=>(a(),i("li",{key:B,class:"flex items-start gap-3 text-white/80"},[t[16]||(t[16]=e("svg",{class:"w-6 h-6 text-green-400 flex-shrink-0 mt-0.5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z"})],-1)),e("span",null,o(d),1)]))),128))])])]),e("div",st,[e("div",ot,[e("h3",lt,o(n(l)("marketplaceDetails.information")),1),e("div",nt,[e("div",it,[e("span",at,o(n(l)("common.version")),1),e("span",rt,o(s.value.version||"latest"),1)]),s.value.author?(a(),i("div",dt,[e("span",ct,o(n(l)("common.developer")),1),e("span",ut,o(s.value.author),1)])):h("",!0),e("div",mt,[e("span",pt,o(n(l)("common.status")),1),e("span",ht,o(y.value?n(l)("marketplaceDetails.installed"):n(l)("marketplaceDetails.notInstalled")),1)]),e("div",vt,[e("span",xt,o(n(l)("common.category")),1),e("span",kt,o(s.value.category||"App"),1)]),s.value.manifestUrl?(a(),i("div",ft,[...t[17]||(t[17]=[e("span",{class:"text-white/60 text-sm"},"Package",-1),e("span",{class:"text-white font-medium text-xs"},".s9pk",-1)])])):h("",!0)])]),e("div",gt,[e("h3",wt,o(n(l)("marketplaceDetails.requirements")),1),e("div",bt,[M.value.length>0?(a(),i("div",_t,[(a(!0),i(z,null,I(M.value,d=>(a(),i("div",{key:d.id,class:"flex items-center gap-3 py-2 border-b border-white/10"},[d.status==="running"?(a(),i("svg",yt,[...t[18]||(t[18]=[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z"},null,-1)])])):d.status==="stopped"?(a(),i("svg",Ct,[...t[19]||(t[19]=[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z"},null,-1)])])):(a(),i("svg",Dt,[...t[20]||(t[20]=[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M10 14l2-2m0 0l2-2m-2 2l-2-2m2 2l2 2m7-2a9 9 0 11-18 0 9 9 0 0118 0z"},null,-1)])])),e("div",Mt,[e("p",Bt,o(d.title),1),e("p",jt,o(d.status==="running"?n(l)("marketplaceDetails.depRunning"):d.status==="stopped"?n(l)("marketplaceDetails.depStopped"):n(l)("marketplaceDetails.depNotInstalled")),1)])]))),128)),M.value.some(d=>d.status==="missing")?(a(),i("button",{key:0,onClick:q,disabled:m.value,class:"glass-button w-full mt-3 px-4 py-2 rounded-lg text-sm font-medium flex items-center justify-center gap-2"},[m.value?(a(),i("svg",It,[...t[21]||(t[21]=[e("circle",{class:"opacity-25",cx:"12",cy:"12",r:"10",stroke:"currentColor","stroke-width":"4"},null,-1),e("path",{class:"opacity-75",fill:"currentColor",d:"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"},null,-1)])])):h("",!0),p(" "+o(m.value?n(l)("common.installing"):n(l)("marketplaceDetails.installRequirements")),1)],8,zt)):h("",!0)])):(a(),i("div",Et,[e("p",Vt,o(n(l)("marketplaceDetails.noRequirements")),1)])),e("div",At,[t[22]||(t[22]=e("svg",{class:"w-5 h-5 text-blue-400 flex-shrink-0 mt-0.5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M9 3v2m6-2v2M9 19v2m6-2v2M5 9H3m2 6H3m18-6h-2m2 6h-2M7 19h10a2 2 0 002-2V7a2 2 0 00-2-2H7a2 2 0 00-2 2v10a2 2 0 002 2zM9 9h6v6H9V9z"})],-1)),e("div",Ht,[e("p",St,o(n(l)("appDetails.ram")),1),e("p",Tt,o(n(l)("appDetails.ramDesc")),1)])]),e("div",Lt,[t[23]||(t[23]=e("svg",{class:"w-5 h-5 text-purple-400 flex-shrink-0 mt-0.5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M4 7v10c0 2.21 3.582 4 8 4s8-1.79 8-4V7M4 7c0 2.21 3.582 4 8 4s8-1.79 8-4M4 7c0-2.21 3.582-4 8-4s8 1.79 8 4"})],-1)),e("div",Pt,[e("p",Ut,o(n(l)("appDetails.storage")),1),e("p",Ft,o(n(l)("appDetails.storageDesc")),1)])])])]),s.value.manifestUrl?(a(),i("div",Nt,[e("h3",Rt,o(n(l)("marketplaceDetails.links")),1),e("div",qt,[e("a",{href:s.value.manifestUrl,target:"_blank",rel:"noopener noreferrer",class:"flex items-center gap-2 text-blue-400 hover:text-blue-300 transition-colors"},[t[24]||(t[24]=e("svg",{class:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 10v6m0 0l-3-3m3 3l3-3m2 8H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"})],-1)),p(" "+o(n(l)("marketplaceDetails.downloadPackage")),1)],8,Ot)])])):h("",!0)])])])):(a(),i("div",$t,[t[25]||(t[25]=e("svg",{class:"w-24 h-24 text-white/20 mx-auto mb-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M9.172 16.172a4 4 0 015.656 0M9 10h.01M15 10h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"})],-1)),e("h3",Kt,o(n(l)("marketplaceDetails.notFoundTitle")),1),e("p",Gt,o(n(l)("marketplaceDetails.notFoundMessage")),1)]))]),_:1})]))}});export{Wt as default}; diff --git a/neode-ui/dist/assets/Mesh-CPUFszgS.js b/neode-ui/dist/assets/Mesh-CPUFszgS.js new file mode 100644 index 0000000..c83302f --- /dev/null +++ b/neode-ui/dist/assets/Mesh-CPUFszgS.js @@ -0,0 +1 @@ +import{d as q,w as J,o as W,O as X,c as o,a as e,J as b,D as l,E as d,G as i,f as u,F as g,P as M,g as Y,H as Q,I as Z,b as ee,r as v,j as w,X as D,m as se,C as te,q as n,t as ae}from"./index-DnbYEqLr.js";import{u as ne}from"./mesh-DgF5cqYW.js";import{u as oe}from"./transport-B_E2RH1i.js";const le={class:"mesh-view"},de={class:"mesh-header"},ce={class:"mesh-header-left"},ie={class:"mesh-subtitle"},re={key:0,class:"mesh-subtitle-badge"},he={key:0,class:"mesh-error"},ue={class:"mesh-columns"},_e={class:"mesh-left"},pe={class:"glass-card mesh-status-card"},ve={class:"mesh-status-header"},me={key:0,class:"mesh-loading"},ye={key:1,class:"mesh-status-grid"},be={class:"mesh-stat"},fe={class:"mesh-stat"},ke={class:"mesh-stat-value"},ge={class:"mesh-stat"},we={class:"mesh-stat-value"},Ce={class:"mesh-stat"},xe={class:"mesh-stat-value"},Me={class:"mesh-stat"},Se={class:"mesh-stat-value"},Ae={class:"mesh-stat"},Ee={class:"mesh-stat-value"},Te={key:2,class:"mesh-detected-devices"},De={class:"mesh-device-path"},Ne={key:0,class:"mesh-offgrid-banner"},Oe={class:"mesh-actions"},Be=["disabled"],Pe=["disabled"],Ie=["disabled"],Le={class:"glass-card mesh-peers-card"},Fe={class:"mesh-section-title"},Ge={class:"mesh-peer-count"},Re={key:0,class:"mesh-empty"},$e={key:1,class:"mesh-peer-list"},Ve=["onClick"],ze={class:"mesh-peer-info"},Ue={class:"mesh-peer-name"},Ke={key:0,class:"mesh-peer-archy-badge"},je={class:"mesh-peer-sub"},He={key:0,class:"mesh-unread-badge"},qe={class:"mesh-peer-signal"},Je={class:"mesh-signal-bars"},We={class:"mesh-right"},Xe={class:"glass-card mesh-chat-card"},Ye={key:0,class:"mesh-chat-empty"},Qe={class:"mesh-chat-header"},Ze={class:"mesh-chat-header-info"},es={class:"mesh-chat-header-name"},ss={key:0,class:"mesh-peer-archy-badge"},ts={key:1,class:"mesh-peer-channel-badge"},as={class:"mesh-chat-header-sub"},ns={class:"mesh-chat-header-status"},os=["title"],ls={key:1,class:"mesh-chat-header-time"},ds={key:0,class:"mesh-chat-no-messages"},cs={key:0,class:"mesh-typed-invoice"},is={class:"mesh-typed-invoice-header"},rs={key:0,class:"mesh-typed-paid"},hs={class:"mesh-typed-invoice-amount"},us={key:0,class:"mesh-typed-invoice-memo"},_s={class:"mesh-typed-invoice-bolt11"},ps={class:"mesh-typed-alert-header"},vs={class:"mesh-typed-icon"},ms={class:"mesh-typed-label"},ys={key:0,class:"mesh-typed-signed"},bs={class:"mesh-typed-alert-message"},fs=["href"],ks={key:2,class:"mesh-typed-coordinate"},gs={class:"mesh-typed-coordinate-value"},ws={key:0,class:"mesh-typed-coordinate-label"},Cs=["href"],xs={key:3,class:"mesh-typed-block"},Ms={class:"mesh-typed-label"},Ss={key:4,class:"mesh-chat-bubble-text"},As={class:"mesh-chat-bubble-meta"},Es={key:0,class:"mesh-chat-e2e"},Ts={key:1,class:"mesh-chat-ack"},Ds={class:"mesh-chat-bubble-time"},Ns={class:"mesh-chat-compose"},Os={key:0,class:"mesh-chat-send-error"},Bs={class:"mesh-chat-compose-row"},Ps=["onKeydown"],Is=["disabled"],Ls={class:"mesh-chat-compose-meta"},Fs=q({__name:"Mesh",setup(Gs){const a=ne(),f=oe(),r=v(null),h=v(null),p=v(""),k=v(""),C=v(!1),S=v(!1),x=v(null);let A=null;const I={index:0,name:"Public"},E=v(!1),m=v(null);J(()=>r.value,async c=>{if(c)try{m.value=await a.getSessionStatus(c.contact_id)}catch{m.value=null}else m.value=null});async function L(){E.value=!0;try{await f.setMeshOnly(!f.meshOnly)}finally{E.value=!1}}W(async()=>{await Promise.all([a.refreshAll(),f.fetchStatus()]),A=setInterval(()=>{a.fetchStatus(),a.fetchPeers(),a.fetchMessages()},5e3)}),X(()=>{A&&clearInterval(A)});const F=w(()=>h.value?h.value.name:r.value?r.value.advert_name:""),G=w(()=>h.value?"Mesh channel":r.value?P(r.value.pubkey_hex):""),R=w(()=>!!r.value||!!h.value),N=w(()=>{if(h.value){const c=-(h.value.index+1);return a.messages.filter(t=>t.peer_contact_id===c)}if(r.value){const c=r.value.contact_id;return a.messages.filter(t=>t.peer_contact_id===c)}return[]});function y(c){return c.advert_name.startsWith("Archy-")}const $=w(()=>[...a.peers].sort((c,t)=>{const s=y(c)?0:1,_=y(t)?0:1;return s!==_?s-_:c.advert_name.localeCompare(t.advert_name)}));function V(c){r.value=c,h.value=null,k.value="",p.value="",a.markChatRead(c.contact_id),D(()=>T())}function z(c){h.value=c,r.value=null,k.value="",p.value="",D(()=>T())}function U(){r.value=null,h.value=null,a.clearViewingChat()}async function O(){if(!(!r.value||!p.value.trim())){k.value="";try{await a.sendMessage(r.value.contact_id,p.value),p.value="",D(()=>T())}catch(c){k.value=c instanceof Error?c.message:"Send failed"}}}function T(){x.value&&(x.value.scrollTop=x.value.scrollHeight)}async function K(){C.value=!0;try{await a.broadcastIdentity()}finally{C.value=!1}}async function j(){S.value=!0;try{const c=!(a.status?.enabled??!1);await a.configure({enabled:c})}finally{S.value=!1}}function H(c){return c===null?0:c>-60?4:c>-75?3:c>-90?2:1}function B(c){const t=Date.now()-new Date(c).getTime(),s=Math.floor(t/1e3);if(s<60)return`${s}s ago`;const _=Math.floor(s/60);return _<60?`${_}m ago`:`${Math.floor(_/60)}h ago`}function P(c){return c?c.slice(0,8)+"..."+c.slice(-6):""}return(c,t)=>(n(),o("div",le,[e("div",de,[e("div",ce,[t[3]||(t[3]=e("h1",{class:"mesh-title"},"Mesh Network",-1)),e("p",ie,[b(l(d(a).status?.peer_count??0)+" peer"+l((d(a).status?.peer_count??0)!==1?"s":"")+" ",1),d(a).status?.device_connected?(n(),o("span",re,"Live")):i("",!0)])]),t[4]||(t[4]=e("a",{href:"https://flasher.meshcore.co.uk/",target:"_blank",rel:"noopener noreferrer",class:"glass-button mesh-flasher-btn"},[b(" Flash Meshcore "),e("span",{class:"mesh-flasher-sep"},"|"),b(" Choose Companion USB ")],-1))]),d(a).error?(n(),o("div",he,l(d(a).error),1)):i("",!0),e("div",ue,[e("div",_e,[e("div",pe,[e("div",ve,[e("div",{class:u(["mesh-status-indicator",d(a).status?.device_connected?"connected":"disconnected"])},null,2),t[5]||(t[5]=e("h2",{class:"mesh-section-title"},"Device",-1))]),d(a).loading&&!d(a).status?(n(),o("div",me,"Loading...")):d(a).status?(n(),o("div",ye,[e("div",be,[t[6]||(t[6]=e("span",{class:"mesh-stat-label"},"Status",-1)),e("span",{class:u(["mesh-stat-value",d(a).status.device_connected?"text-green":d(a).status.enabled?"text-orange":"text-muted"])},l(d(a).status.device_connected?"Broadcasting":d(a).status.enabled?"Connecting...":"Disabled"),3)]),e("div",fe,[t[7]||(t[7]=e("span",{class:"mesh-stat-label"},"Type",-1)),e("span",ke,l(d(a).status.device_type==="unknown"?"—":d(a).status.device_type),1)]),e("div",ge,[t[8]||(t[8]=e("span",{class:"mesh-stat-label"},"Port",-1)),e("span",we,l(d(a).status.device_path??"Auto"),1)]),e("div",Ce,[t[9]||(t[9]=e("span",{class:"mesh-stat-label"},"Sent",-1)),e("span",xe,l(d(a).status.messages_sent),1)]),e("div",Me,[t[10]||(t[10]=e("span",{class:"mesh-stat-label"},"Recv",-1)),e("span",Se,l(d(a).status.messages_received),1)]),e("div",Ae,[t[11]||(t[11]=e("span",{class:"mesh-stat-label"},"Channel",-1)),e("span",Ee,l(d(a).status.channel_name),1)])])):i("",!0),d(a).status?.detected_devices?.length?(n(),o("div",Te,[(n(!0),o(g,null,M(d(a).status.detected_devices,s=>(n(),o("div",{key:s,class:"mesh-device-row"},[t[12]||(t[12]=e("div",{class:"mesh-device-indicator"},null,-1)),e("span",De,l(s),1)]))),128))])):i("",!0)]),d(f).meshOnly?(n(),o("div",Ne,[...t[13]||(t[13]=[e("svg",{class:"w-4 h-4 text-orange-400 shrink-0",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M18.364 5.636a9 9 0 11-12.728 0M12 9v4m0 4h.01"})],-1),e("span",{class:"text-sm font-medium text-orange-300"},"OFF-GRID",-1),e("span",{class:"text-xs text-white/50"},"Tor disabled — mesh only",-1)])])):i("",!0),e("div",Oe,[e("button",{class:"glass-button mesh-action-btn",disabled:S.value,onClick:j},l(d(a).status?.enabled?"Disable":"Enable"),9,Be),e("button",{class:"glass-button mesh-action-btn",disabled:!d(a).status?.device_connected||C.value,onClick:K},l(C.value?"Sending...":"Broadcast"),9,Pe),e("button",{class:u(["glass-button mesh-action-btn",d(f).meshOnly?"mesh-offgrid-active":""]),disabled:E.value,onClick:L},l(d(f).meshOnly?"Go Online":"Off-Grid"),11,Ie),e("button",{class:"glass-button mesh-action-btn",onClick:t[0]||(t[0]=s=>d(a).refreshAll())},"Refresh")]),e("div",Le,[e("h2",Fe,[t[14]||(t[14]=b("Peers ",-1)),e("span",Ge,l(d(a).peers.length),1)]),d(a).peers.length===0&&!d(a).status?.device_connected?(n(),o("div",Re," No peers discovered yet. ")):(n(),o("div",$e,[e("div",{class:u(["mesh-peer-row is-channel",{active:h.value?.index===0}]),onClick:t[1]||(t[1]=s=>z(I))},[...t[15]||(t[15]=[e("div",{class:"mesh-peer-avatar channel"},"#",-1),e("div",{class:"mesh-peer-info"},[e("div",{class:"mesh-peer-name"},"Public"),e("div",{class:"mesh-peer-sub"},"Mesh channel")],-1)])],2),(n(!0),o(g,null,M($.value,s=>(n(),o("div",{key:s.contact_id,class:u(["mesh-peer-row",{active:r.value?.contact_id===s.contact_id,"is-archy":y(s)}]),onClick:_=>V(s)},[e("div",{class:u(["mesh-peer-avatar",{archy:y(s)}])},[y(s)?(n(),se(te,{key:0,size:"sm"})):(n(),o(g,{key:1},[b(l(s.advert_name.charAt(0).toUpperCase()),1)],64))],2),e("div",ze,[e("div",Ue,[b(l(s.advert_name||`Node #${s.contact_id}`)+" ",1),y(s)?(n(),o("span",Ke,"Archy")):i("",!0)]),e("div",je,l(P(s.pubkey_hex)),1)]),d(a).unreadCounts[s.contact_id]?(n(),o("span",He,l(d(a).unreadCounts[s.contact_id]),1)):i("",!0),e("div",qe,[e("div",Je,[(n(),o(g,null,M(4,_=>e("div",{key:_,class:u(["mesh-signal-bar",{active:_<=H(s.rssi)}])},null,2)),64))])])],10,Ve))),128))]))])]),e("div",We,[e("div",Xe,[R.value?(n(),o(g,{key:1},[e("div",Qe,[e("button",{class:"mesh-chat-back",onClick:U},"←"),e("div",Ze,[e("div",es,[b(l(F.value)+" ",1),r.value&&y(r.value)?(n(),o("span",ss,"Archy")):i("",!0),h.value?(n(),o("span",ts,"Channel")):i("",!0)]),e("div",as,l(G.value),1)]),e("div",ns,[r.value&&m.value?(n(),o("span",{key:0,class:u(["mesh-session-badge",m.value.forward_secrecy?"session-ratchet":m.value.has_session?"session-static":"session-none"]),title:m.value.forward_secrecy?"Double Ratchet (forward secrecy)":m.value.has_session?"Static encryption":"No encryption"},"🛡",10,os)):i("",!0),r.value?(n(),o("span",ls,l(B(r.value.last_heard)),1)):i("",!0)])]),e("div",{ref_key:"chatScrollEl",ref:x,class:"mesh-chat-messages"},[N.value.length===0?(n(),o("div",ds," No messages yet. Say hello! ")):i("",!0),(n(!0),o(g,null,M(N.value,s=>(n(),o("div",{key:s.id,class:u(["mesh-chat-bubble-wrapper",s.direction])},[e("div",{class:u(["mesh-chat-bubble",[s.direction,s.message_type?"typed-"+s.message_type:""]])},[s.message_type==="invoice"&&s.typed_payload?(n(),o("div",cs,[e("div",is,[t[17]||(t[17]=e("span",{class:"mesh-typed-icon"},"⚡",-1)),t[18]||(t[18]=e("span",{class:"mesh-typed-label"},"Lightning Invoice",-1)),s.typed_payload.paid?(n(),o("span",rs,"Paid")):i("",!0)]),e("div",hs,l((s.typed_payload.amount_sats||0).toLocaleString())+" sats",1),s.typed_payload.memo?(n(),o("div",us,l(s.typed_payload.memo),1)):i("",!0),e("div",_s,l((s.typed_payload.bolt11||"").substring(0,40))+"...",1)])):s.message_type==="alert"&&s.typed_payload?(n(),o("div",{key:1,class:u(["mesh-typed-alert","alert-"+(s.typed_payload.alert_type||"status")])},[e("div",ps,[e("span",vs,l(s.typed_payload.alert_type==="emergency"?"🚨":s.typed_payload.alert_type==="dead_man"?"☠":"ℹ"),1),e("span",ms,l(s.typed_payload.alert_type==="emergency"?"EMERGENCY":s.typed_payload.alert_type==="dead_man"?"DEAD MAN":"Status"),1),s.typed_payload.signed?(n(),o("span",ys,"Signed")):i("",!0)]),e("div",bs,l(s.typed_payload.message),1),s.typed_payload.coordinate?(n(),o("a",{key:0,class:"mesh-typed-alert-location",href:"https://www.openstreetmap.org/?mlat="+s.typed_payload.coordinate.lat/1e6+"&mlon="+s.typed_payload.coordinate.lng/1e6+"&zoom=14",target:"_blank",rel:"noopener"}," 📍 "+l(s.typed_payload.coordinate.label||"View location"),9,fs)):i("",!0)],2)):s.message_type==="coordinate"&&s.typed_payload?(n(),o("div",ks,[t[19]||(t[19]=e("div",{class:"mesh-typed-coordinate-header"},[e("span",{class:"mesh-typed-icon"},"📍"),e("span",{class:"mesh-typed-label"},"Location")],-1)),e("div",gs,l((s.typed_payload.lat/1e6).toFixed(4))+", "+l((s.typed_payload.lng/1e6).toFixed(4)),1),s.typed_payload.label?(n(),o("div",ws,l(s.typed_payload.label),1)):i("",!0),e("a",{class:"mesh-typed-coordinate-link",href:"https://www.openstreetmap.org/?mlat="+s.typed_payload.lat/1e6+"&mlon="+s.typed_payload.lng/1e6+"&zoom=14",target:"_blank",rel:"noopener"},"Open Map",8,Cs)])):s.message_type==="block_header"&&s.typed_payload?(n(),o("div",xs,[t[20]||(t[20]=e("span",{class:"mesh-typed-icon"},"⛓",-1)),e("span",Ms,l(s.typed_payload.message||s.plaintext),1)])):(n(),o("div",Ss,l(s.plaintext),1)),e("div",As,[s.encrypted?(n(),o("span",Es,"E2E")):i("",!0),s.delivered&&s.direction==="sent"?(n(),o("span",Ts,"✓✓")):i("",!0),e("span",Ds,l(B(s.timestamp)),1)])],2)],2))),128))],512),e("div",Ns,[k.value?(n(),o("div",Os,l(k.value),1)):i("",!0),e("div",Bs,[Y(e("input",{"onUpdate:modelValue":t[2]||(t[2]=s=>p.value=s),class:"mesh-chat-input",placeholder:"Type a message...",maxlength:"160",onKeydown:Z(ee(O,["exact","prevent"]),["enter"])},null,40,Ps),[[Q,p.value]]),e("button",{class:"glass-button mesh-chat-send-btn",disabled:!p.value.trim()||d(a).sending,onClick:O},l(d(a).sending?"...":"Send"),9,Is)]),e("div",Ls,[e("span",null,l(p.value.length)+"/160",1)])])],64)):(n(),o("div",Ye,[...t[16]||(t[16]=[e("div",{class:"mesh-chat-empty-icon"},"📡",-1),e("p",null,"Select a peer or channel to chat",-1),e("p",{class:"mesh-chat-empty-sub"},"Messages are sent over LoRa mesh radio",-1)])]))])])])]))}}),Us=ae(Fs,[["__scopeId","data-v-09fc6ab6"]]);export{Us as default}; diff --git a/neode-ui/dist/assets/Mesh-Dr5A9OgS.css b/neode-ui/dist/assets/Mesh-Dr5A9OgS.css new file mode 100644 index 0000000..eeb95d1 --- /dev/null +++ b/neode-ui/dist/assets/Mesh-Dr5A9OgS.css @@ -0,0 +1 @@ +.mesh-view[data-v-09fc6ab6]{padding:24px;max-width:1200px;margin:0 auto;display:flex;flex-direction:column;gap:16px;height:100%;overflow:hidden}.mesh-header[data-v-09fc6ab6]{display:flex;justify-content:space-between;align-items:center;gap:16px;flex-shrink:0}.mesh-header-left[data-v-09fc6ab6]{flex:1}.mesh-title[data-v-09fc6ab6]{font-size:1.5rem;font-weight:700;color:#fffffff2;margin:0}.mesh-subtitle[data-v-09fc6ab6]{color:#ffffff80;font-size:.85rem;margin:2px 0 0;display:flex;align-items:center;gap:8px}.mesh-subtitle-badge[data-v-09fc6ab6]{font-size:.65rem;font-weight:600;color:#4ade80;background:#4ade801f;padding:1px 6px;border-radius:4px;text-transform:uppercase;letter-spacing:.5px}.mesh-flasher-btn[data-v-09fc6ab6]{display:inline-flex;align-items:center;gap:0;padding:8px 16px;font-size:.9rem;text-decoration:none;white-space:nowrap;flex-shrink:0}.mesh-flasher-sep[data-v-09fc6ab6]{margin:0 8px;color:#fff3}.mesh-error[data-v-09fc6ab6]{color:#ef4444;font-size:.85rem;padding:8px 12px;background:#ef44441a;border-radius:8px;border:1px solid rgba(239,68,68,.2);flex-shrink:0}.mesh-columns[data-v-09fc6ab6]{display:flex;gap:16px;flex:1;min-height:0;overflow:hidden}.mesh-left[data-v-09fc6ab6]{width:380px;flex-shrink:0;display:flex;flex-direction:column;gap:12px;min-height:0;overflow:hidden}.mesh-right[data-v-09fc6ab6]{flex:1;min-width:0;min-height:0;display:flex;flex-direction:column}.mesh-status-card[data-v-09fc6ab6]{padding:16px;flex-shrink:0}.mesh-status-header[data-v-09fc6ab6]{display:flex;align-items:center;gap:8px;margin-bottom:12px}.mesh-status-indicator[data-v-09fc6ab6]{width:8px;height:8px;border-radius:50%;flex-shrink:0}.mesh-status-indicator.connected[data-v-09fc6ab6]{background:#4ade80;box-shadow:0 0 6px #4ade8080}.mesh-status-indicator.disconnected[data-v-09fc6ab6]{background:#ffffff4d}.mesh-section-title[data-v-09fc6ab6]{font-size:.95rem;font-weight:600;color:#ffffffe6;margin:0}.mesh-status-grid[data-v-09fc6ab6]{display:grid;grid-template-columns:repeat(3,1fr);gap:8px}.mesh-stat[data-v-09fc6ab6]{display:flex;flex-direction:column;gap:1px;padding:8px;background:#ffffff0d;border-radius:6px}.mesh-stat-label[data-v-09fc6ab6]{font-size:.65rem;color:#fff6;text-transform:uppercase;letter-spacing:.5px}.mesh-stat-value[data-v-09fc6ab6]{font-size:.8rem;color:#ffffffd9;font-weight:500}.text-green[data-v-09fc6ab6]{color:#4ade80}.text-orange[data-v-09fc6ab6]{color:#fb923c}.text-muted[data-v-09fc6ab6]{color:#fff6}.mesh-loading[data-v-09fc6ab6],.mesh-empty[data-v-09fc6ab6]{color:#fff6;font-size:.85rem;text-align:center;padding:16px 0}.mesh-detected-devices[data-v-09fc6ab6]{margin-top:10px;padding-top:10px;border-top:1px solid rgba(255,255,255,.06)}.mesh-device-row[data-v-09fc6ab6]{display:flex;align-items:center;gap:8px;padding:6px 8px;background:#ffffff0a;border-radius:6px}.mesh-device-indicator[data-v-09fc6ab6]{width:6px;height:6px;border-radius:50%;background:#4ade80;box-shadow:0 0 4px #4ade8066;flex-shrink:0}.mesh-device-path[data-v-09fc6ab6]{font-family:monospace;font-size:.8rem;color:#ffffffb3}.mesh-offgrid-banner[data-v-09fc6ab6]{display:flex;align-items:center;gap:8px;padding:8px 12px;background:#fb923c1a;border:1px solid rgba(251,146,60,.3);border-radius:8px;flex-shrink:0}.mesh-offgrid-active[data-v-09fc6ab6]{border-color:#fb923c66!important;color:#fb923c!important}.mesh-actions[data-v-09fc6ab6]{display:flex;gap:8px;flex-shrink:0}.mesh-action-btn[data-v-09fc6ab6]{flex:1;padding:8px 0;font-size:.8rem}.mesh-peers-card[data-v-09fc6ab6]{padding:14px;flex:1;min-height:0;display:flex;flex-direction:column}.mesh-peers-card .mesh-section-title[data-v-09fc6ab6]{margin-bottom:10px;flex-shrink:0}.mesh-peer-list[data-v-09fc6ab6]{display:flex;flex-direction:column;gap:4px;overflow-y:auto;flex:1;min-height:0}.mesh-peer-row[data-v-09fc6ab6]{display:flex;align-items:center;gap:10px;padding:10px;border-radius:8px;cursor:pointer;transition:background .15s}.mesh-peer-row[data-v-09fc6ab6]:hover{background:#ffffff0f}.mesh-peer-row.active[data-v-09fc6ab6]{background:#fb923c1a;border:1px solid rgba(251,146,60,.2)}.mesh-peer-avatar[data-v-09fc6ab6]{width:36px;height:36px;border-radius:50%;background:#ffffff14;display:flex;align-items:center;justify-content:center;font-size:.9rem;color:#fff9;flex-shrink:0;font-weight:600}.mesh-peer-avatar.archy[data-v-09fc6ab6]{background:#fb923c26;padding:0;overflow:hidden}.mesh-peer-avatar.archy[data-v-09fc6ab6]>div{width:26px;height:26px;border-radius:50%;overflow:hidden}.mesh-peer-avatar.channel[data-v-09fc6ab6]{background:#3b82f626;color:#3b82f6;font-weight:700;font-size:1.1rem}.mesh-peer-channel-badge[data-v-09fc6ab6]{font-size:.6rem;font-weight:700;color:#3b82f6;background:#3b82f61f;padding:1px 5px;border-radius:3px;text-transform:uppercase;letter-spacing:.5px}.mesh-peer-count[data-v-09fc6ab6]{font-size:.75rem;font-weight:600;color:#fff6;background:#ffffff14;padding:2px 8px;border-radius:10px;margin-left:6px;vertical-align:middle}.mesh-peer-row.is-channel[data-v-09fc6ab6]{border-bottom:1px solid rgba(255,255,255,.04);padding-bottom:12px;margin-bottom:4px}.mesh-peer-info[data-v-09fc6ab6]{flex:1;min-width:0}.mesh-peer-name[data-v-09fc6ab6]{font-weight:600;font-size:.85rem;color:#ffffffe6;display:flex;align-items:center;gap:6px}.mesh-peer-archy-badge[data-v-09fc6ab6]{font-size:.6rem;font-weight:700;color:#fb923c;background:#fb923c1f;padding:1px 5px;border-radius:3px;text-transform:uppercase;letter-spacing:.5px}.mesh-peer-sub[data-v-09fc6ab6]{font-size:.7rem;color:#ffffff4d;font-family:monospace;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.mesh-peer-signal[data-v-09fc6ab6]{flex-shrink:0}.mesh-signal-bars[data-v-09fc6ab6]{display:flex;align-items:flex-end;gap:2px;height:14px}.mesh-signal-bar[data-v-09fc6ab6]{width:3px;border-radius:1px;background:#ffffff1f}.mesh-signal-bar[data-v-09fc6ab6]:nth-child(1){height:3px}.mesh-signal-bar[data-v-09fc6ab6]:nth-child(2){height:6px}.mesh-signal-bar[data-v-09fc6ab6]:nth-child(3){height:10px}.mesh-signal-bar[data-v-09fc6ab6]:nth-child(4){height:14px}.mesh-signal-bar.active[data-v-09fc6ab6]{background:#4ade80}.mesh-unread-badge[data-v-09fc6ab6]{background:#fb923c;color:#000;font-size:.65rem;font-weight:700;min-width:18px;height:18px;border-radius:9px;display:flex;align-items:center;justify-content:center;padding:0 5px;flex-shrink:0}.mesh-chat-card[data-v-09fc6ab6]{padding:0;flex:1;display:flex;flex-direction:column;min-height:0;overflow:hidden}.mesh-chat-empty[data-v-09fc6ab6]{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;color:#ffffff4d;gap:8px;padding:40px}.mesh-chat-empty-icon[data-v-09fc6ab6]{font-size:3rem;opacity:.4}.mesh-chat-empty p[data-v-09fc6ab6]{margin:0;font-size:.9rem}.mesh-chat-empty-sub[data-v-09fc6ab6]{font-size:.75rem!important;color:#fff3}.mesh-chat-header[data-v-09fc6ab6]{display:flex;align-items:center;gap:10px;padding:14px 16px;border-bottom:1px solid rgba(255,255,255,.06);flex-shrink:0}.mesh-chat-back[data-v-09fc6ab6]{background:none;border:none;color:#fff9;font-size:1.2rem;cursor:pointer;padding:4px 8px;border-radius:6px;display:none}.mesh-chat-header-info[data-v-09fc6ab6]{flex:1;min-width:0}.mesh-chat-header-name[data-v-09fc6ab6]{font-weight:600;font-size:.95rem;color:#ffffffe6;display:flex;align-items:center;gap:6px}.mesh-chat-header-sub[data-v-09fc6ab6]{font-size:.7rem;color:#ffffff4d;font-family:monospace}.mesh-chat-header-status[data-v-09fc6ab6]{flex-shrink:0}.mesh-chat-header-time[data-v-09fc6ab6]{font-size:.7rem;color:#ffffff4d}.mesh-chat-messages[data-v-09fc6ab6]{flex:1;overflow-y:auto;padding:16px;display:flex;flex-direction:column;gap:8px;min-height:0}.mesh-chat-no-messages[data-v-09fc6ab6]{flex:1;display:flex;align-items:center;justify-content:center;color:#ffffff40;font-size:.85rem}.mesh-chat-bubble-wrapper[data-v-09fc6ab6]{display:flex}.mesh-chat-bubble-wrapper.sent[data-v-09fc6ab6]{justify-content:flex-end}.mesh-chat-bubble-wrapper.received[data-v-09fc6ab6]{justify-content:flex-start}.mesh-chat-bubble[data-v-09fc6ab6]{max-width:75%;padding:10px 14px;border-radius:16px;word-break:break-word}.mesh-chat-bubble.sent[data-v-09fc6ab6]{background:#fb923c26;border:1px solid rgba(251,146,60,.2);border-bottom-right-radius:4px}.mesh-chat-bubble.received[data-v-09fc6ab6]{background:#ffffff0f;border:1px solid rgba(255,255,255,.08);border-bottom-left-radius:4px}.mesh-chat-bubble-text[data-v-09fc6ab6]{color:#ffffffe6;font-size:.9rem;line-height:1.4}.mesh-chat-bubble-meta[data-v-09fc6ab6]{display:flex;align-items:center;gap:6px;margin-top:4px;justify-content:flex-end}.mesh-chat-bubble-time[data-v-09fc6ab6]{font-size:.65rem;color:#ffffff4d}.mesh-chat-e2e[data-v-09fc6ab6]{font-size:.55rem;font-weight:700;color:#4ade80;padding:0 3px;border:1px solid rgba(74,222,128,.3);border-radius:3px}.mesh-chat-ack[data-v-09fc6ab6]{font-size:.7rem;color:#3b82f6}.mesh-chat-compose[data-v-09fc6ab6]{padding:12px 16px;border-top:1px solid rgba(255,255,255,.06);flex-shrink:0}.mesh-chat-send-error[data-v-09fc6ab6]{color:#ef4444;font-size:.75rem;margin-bottom:6px}.mesh-chat-compose-row[data-v-09fc6ab6]{display:flex;gap:8px}.mesh-chat-input[data-v-09fc6ab6]{flex:1;background:#ffffff0f;border:1px solid rgba(255,255,255,.1);border-radius:20px;color:#ffffffe6;padding:10px 16px;font-size:.9rem;font-family:inherit;outline:none}.mesh-chat-input[data-v-09fc6ab6]:focus{border-color:#fb923c66}.mesh-chat-input[data-v-09fc6ab6]::-moz-placeholder{color:#ffffff40}.mesh-chat-input[data-v-09fc6ab6]::placeholder{color:#ffffff40}.mesh-chat-send-btn[data-v-09fc6ab6]{padding:10px 20px;border-radius:20px;font-size:.85rem;background:#fb923c26;border-color:#fb923c40}.mesh-chat-send-btn[data-v-09fc6ab6]:hover:not(:disabled){background:#fb923c40}.mesh-chat-compose-meta[data-v-09fc6ab6]{font-size:.65rem;color:#ffffff40;text-align:right;margin-top:4px}@media(max-width:768px){.mesh-view[data-v-09fc6ab6]{height:auto;padding:16px}.mesh-columns[data-v-09fc6ab6]{flex-direction:column;overflow:visible}.mesh-left[data-v-09fc6ab6]{width:100%;overflow:visible}.mesh-right[data-v-09fc6ab6]{min-height:400px}.mesh-status-grid[data-v-09fc6ab6]{grid-template-columns:repeat(2,1fr)}.mesh-chat-back[data-v-09fc6ab6]{display:block}}.mesh-session-badge[data-v-09fc6ab6]{font-size:.75rem;margin-right:6px;opacity:.7}.session-ratchet[data-v-09fc6ab6]{color:#4ade80;opacity:1}.session-static[data-v-09fc6ab6]{color:#fbbf24}.session-none[data-v-09fc6ab6]{color:#ffffff4d}.mesh-typed-icon[data-v-09fc6ab6]{margin-right:4px}.mesh-typed-label[data-v-09fc6ab6]{font-weight:600;font-size:.7rem;text-transform:uppercase;letter-spacing:.05em}.typed-invoice[data-v-09fc6ab6]{border-left:3px solid #fb923c}.mesh-typed-invoice[data-v-09fc6ab6]{padding:4px 0}.mesh-typed-invoice-header[data-v-09fc6ab6]{display:flex;align-items:center;gap:4px;margin-bottom:4px;color:#fb923c;font-size:.75rem}.mesh-typed-invoice-amount[data-v-09fc6ab6]{font-size:1.1rem;font-weight:700;color:#fb923c}.mesh-typed-invoice-memo[data-v-09fc6ab6]{font-size:.8rem;color:#ffffffb3;margin-top:2px}.mesh-typed-invoice-bolt11[data-v-09fc6ab6]{font-size:.65rem;color:#ffffff4d;font-family:monospace;margin-top:4px;word-break:break-all}.mesh-typed-paid[data-v-09fc6ab6]{background:#4ade8033;color:#4ade80;font-size:.65rem;padding:1px 6px;border-radius:4px;margin-left:auto}.typed-alert[data-v-09fc6ab6]{border-left:3px solid #ef4444}.typed-alert.alert-status[data-v-09fc6ab6]{border-left-color:#3b82f6}.mesh-typed-alert[data-v-09fc6ab6]{padding:4px 0}.mesh-typed-alert-header[data-v-09fc6ab6]{display:flex;align-items:center;gap:4px;margin-bottom:4px;font-size:.75rem}.alert-emergency .mesh-typed-alert-header[data-v-09fc6ab6],.alert-dead_man .mesh-typed-alert-header[data-v-09fc6ab6]{color:#ef4444}.alert-status .mesh-typed-alert-header[data-v-09fc6ab6]{color:#3b82f6}.mesh-typed-alert-message[data-v-09fc6ab6]{font-size:.85rem;color:#ffffffe6}.mesh-typed-alert-location[data-v-09fc6ab6]{display:block;font-size:.75rem;color:#3b82f6;margin-top:4px;text-decoration:underline}.mesh-typed-signed[data-v-09fc6ab6]{font-size:.6rem;color:#4ade80;border:1px solid rgba(74,222,128,.3);padding:0 4px;border-radius:3px;margin-left:auto}.typed-coordinate[data-v-09fc6ab6]{border-left:3px solid #3b82f6}.mesh-typed-coordinate[data-v-09fc6ab6]{padding:4px 0}.mesh-typed-coordinate-header[data-v-09fc6ab6]{display:flex;align-items:center;gap:4px;margin-bottom:4px;color:#3b82f6;font-size:.75rem}.mesh-typed-coordinate-value[data-v-09fc6ab6]{font-size:.9rem;font-family:monospace;color:#fffc}.mesh-typed-coordinate-label[data-v-09fc6ab6]{font-size:.8rem;color:#fff9;margin-top:2px}.mesh-typed-coordinate-link[data-v-09fc6ab6]{display:inline-block;font-size:.75rem;color:#3b82f6;margin-top:4px;text-decoration:underline}.typed-block_header[data-v-09fc6ab6]{border-left:3px solid #a855f7}.mesh-typed-block[data-v-09fc6ab6]{display:flex;align-items:center;gap:4px;color:#a855f7;font-size:.8rem} diff --git a/neode-ui/dist/assets/Monitoring-Bmi1t-3N.js b/neode-ui/dist/assets/Monitoring-Bmi1t-3N.js new file mode 100644 index 0000000..924362b --- /dev/null +++ b/neode-ui/dist/assets/Monitoring-Bmi1t-3N.js @@ -0,0 +1 @@ +import{d as J,w as ot,o as X,O as q,c as _,r as S,q as g,y as at,a as t,D as n,E as l,h as P,F as U,P as R,G as V,J as H,j as w,B as $,f as B,n as it}from"./index-DnbYEqLr.js";const lt=["width","height"],D=J({__name:"LineChart",props:{datasets:{},labels:{},width:{default:400},height:{default:180},yMax:{},yLabel:{},showGrid:{type:Boolean,default:!0}},setup(T){const s=T,u=S(null);function h(){const c=u.value;if(!c)return;const a=c.getContext("2d");if(!a)return;const b=window.devicePixelRatio||1;c.width=s.width*b,c.height=s.height*b,c.style.width=`${s.width}px`,c.style.height=`${s.height}px`,a.scale(b,b);const y=s.width,k=s.height,d={top:10,right:12,bottom:24,left:44},M=y-d.left-d.right,C=k-d.top-d.bottom;if(a.clearRect(0,0,y,k),!s.datasets.length||!s.datasets[0]?.data.length){a.fillStyle="rgba(255,255,255,0.3)",a.font="12px system-ui",a.textAlign="center",a.fillText("No data yet",y/2,k/2);return}let x=s.yMax??0;if(!x){for(const m of s.datasets)for(const r of m.data)r>x&&(x=r);x=x*1.1||1}const A=Math.max(...s.datasets.map(m=>m.data.length));if(s.showGrid){a.strokeStyle="rgba(255,255,255,0.06)",a.lineWidth=1;const m=4;for(let r=0;r<=m;r++){const p=d.top+C/m*r;a.beginPath(),a.moveTo(d.left,p),a.lineTo(d.left+M,p),a.stroke()}a.fillStyle="rgba(255,255,255,0.4)",a.font="10px system-ui",a.textAlign="right";for(let r=0;r<=m;r++){const p=d.top+C/m*r,F=x-x/m*r;a.fillText(L(F),d.left-6,p+3)}}for(const m of s.datasets)if(m.data.length){a.strokeStyle=m.color,a.lineWidth=1.5,a.lineJoin="round",a.lineCap="round",a.beginPath();for(let r=0;r0){a.fillStyle="rgba(255,255,255,0.4)",a.font="10px system-ui",a.textAlign="center";const m=[0,Math.floor(s.labels.length/2),s.labels.length-1];for(const r of m)if(r>=0&&ry,p),k-6)}}}function L(c){return c>=1e9?`${(c/1e9).toFixed(1)}G`:c>=1e6?`${(c/1e6).toFixed(1)}M`:c>=1e3?`${(c/1e3).toFixed(1)}K`:c.toFixed(c<10?1:0)}return ot(()=>[s.datasets,s.labels,s.width,s.height],()=>h(),{deep:!0}),X(()=>{h(),window.addEventListener("resize",h)}),q(()=>{window.removeEventListener("resize",h)}),(c,a)=>(g(),_("canvas",{ref_key:"canvasRef",ref:u,class:"monitoring-chart",width:T.width,height:T.height},null,8,lt))}}),rt={class:"pb-6"},ct={class:"hidden md:block mb-8"},dt={class:"flex items-center justify-between"},mt={class:"text-3xl font-bold text-white mb-2"},ut={class:"text-white/70"},ht={class:"flex gap-2"},_t={class:"grid grid-cols-2 lg:grid-cols-4 gap-4 mb-6"},gt={class:"monitoring-stat-card"},xt={class:"text-xs text-white/50 uppercase tracking-wide"},pt={class:"text-2xl font-bold text-white"},ft={class:"text-xs text-white/40"},yt={class:"monitoring-stat-card"},bt={class:"text-xs text-white/50 uppercase tracking-wide"},vt={class:"text-2xl font-bold text-white"},wt={class:"text-xs text-white/40"},kt={class:"monitoring-stat-card"},Ct={class:"text-xs text-white/50 uppercase tracking-wide"},$t={class:"text-2xl font-bold text-white"},St={class:"text-xs text-white/40"},Mt={class:"monitoring-stat-card"},Ft={class:"text-xs text-white/50 uppercase tracking-wide"},Lt={class:"text-2xl font-bold text-white"},Tt={class:"text-xs text-white/40"},At={class:"grid grid-cols-1 lg:grid-cols-2 gap-6 mb-6"},Pt={class:"glass-card p-5"},Ut={class:"text-sm font-medium text-white/80 mb-3"},Rt={class:"glass-card p-5"},Bt={class:"text-sm font-medium text-white/80 mb-3"},Dt={class:"glass-card p-5"},Nt={class:"text-sm font-medium text-white/80 mb-3"},jt={class:"glass-card p-5"},Et={class:"text-sm font-medium text-white/80 mb-3"},zt={class:"glass-card p-5 mb-6"},Ht={class:"flex items-center justify-between mb-4"},It={class:"text-sm font-medium text-white/80"},Ot={key:0,class:"mb-4 space-y-2"},Wt={class:"monitoring-alert-toggle"},Gt=["checked","onChange"],Vt={class:"flex-1 min-w-0"},Jt={class:"text-sm text-white"},Xt={class:"text-xs text-white/40"},qt={class:"flex items-center gap-2"},Kt=["value","onChange"],Qt={class:"text-xs text-white/40"},Yt={key:1,class:"text-white/40 text-sm py-4 text-center"},Zt={key:2,class:"space-y-2 max-h-64 overflow-y-auto"},te={class:"flex-1 min-w-0"},ee={class:"text-sm text-white"},se={class:"text-xs text-white/40"},ne=["onClick"],oe={class:"glass-card p-5 mb-6"},ae={class:"text-sm font-medium text-white/80 mb-4"},ie={key:0,class:"text-white/40 text-sm py-4 text-center"},le={key:1,class:"space-y-3"},re={class:"min-w-0 flex-1"},ce={class:"text-sm font-medium text-white truncate"},de={class:"flex gap-4 mt-1 text-xs text-white/50"},me={class:"monitoring-bar-container"},ue={class:"glass-card p-5"},he={class:"flex items-center justify-between mb-4"},_e={class:"text-sm font-medium text-white/80"},ge={class:"flex items-center gap-2 text-xs text-white/40"},xe={class:"flex gap-0.5 h-6"},pe=["title"],fe={class:"flex justify-between mt-1 text-xs text-white/30"},ye={class:"text-xs text-white/30 mt-4 text-center"},ve=J({__name:"Monitoring",setup(T){const{t:s}=at(),u=S(null),h=S([]),L=S([]),c=S([]),a=S([]),b=S(!1),y=S(380);let k=null;const d=w(()=>u.value?.system.mem_total_bytes?(u.value.system.mem_used_bytes/u.value.system.mem_total_bytes*100).toFixed(1):"--"),M=w(()=>u.value?.system.disk_total_bytes?(u.value.system.disk_used_bytes/u.value.system.disk_total_bytes*100).toFixed(1):"--"),C=w(()=>h.value.length||60),x=w(()=>h.value.length?h.value.map(e=>{const i=new Date(e.timestamp*1e3);return`${i.getHours().toString().padStart(2,"0")}:${i.getMinutes().toString().padStart(2,"0")}`}):[]),A=w(()=>[{label:"CPU",data:h.value.map(e=>e.system.cpu_percent),color:"#fb923c"}]),m=w(()=>[{label:"Memory",data:h.value.map(e=>e.system.mem_total_bytes>0?e.system.mem_used_bytes/e.system.mem_total_bytes*100:0),color:"#3b82f6"}]),r=w(()=>[{label:"RX",data:h.value.map(e=>e.system.net_rx_bytes),color:"#4ade80"},{label:"TX",data:h.value.map(e=>e.system.net_tx_bytes),color:"#f59e0b"}]),p=w(()=>[{label:"Latency",data:h.value.map(e=>e.rpc_latency_ms),color:"#a78bfa"}]),F=w(()=>h.value.length?h.value.map(e=>{const i=e.system.mem_total_bytes>0?e.system.mem_used_bytes/e.system.mem_total_bytes*100:0,o=new Date(e.timestamp*1e3),f=`${o.getHours().toString().padStart(2,"0")}:${o.getMinutes().toString().padStart(2,"0")}`;return{cpu:e.system.cpu_percent,mem:i,label:`${f} — CPU: ${e.system.cpu_percent.toFixed(1)}%, Mem: ${i.toFixed(1)}%`}}):Array.from({length:60},()=>({cpu:0,mem:0,label:"No data"})));function K(e){return e.cpu>90||e.mem>90?"bg-red-400/60":e.cpu>70||e.mem>70?"bg-orange-400/40":"bg-green-400/30"}function v(e){return e>=1073741824?`${(e/1073741824).toFixed(1)} GB`:e>=1048576?`${(e/1048576).toFixed(1)} MB`:e>=1024?`${(e/1024).toFixed(0)} KB`:`${e} B`}function Q(e){return{disk_usage:s("monitoring.diskUsage"),ram_usage:s("monitoring.ramUsage"),container_crash:s("monitoring.containerCrash"),backend_error_spike:s("monitoring.rpcLatencySpike"),ssl_cert_expiry:s("monitoring.sslCertExpiry")}[e]??e}function Y(e){return{disk_usage:"%",ram_usage:"%",container_crash:"",backend_error_spike:"ms",ssl_cert_expiry:"days"}[e]??""}function Z(e){return e==="container_crash"||e==="ssl_cert_expiry"?"bg-red-400":e==="disk_usage"||e==="ram_usage"?"bg-orange-400":"bg-yellow-400"}function tt(e){return new Date(e*1e3).toLocaleString()}async function I(e){try{const i=await $.call({method:"monitoring.export",params:{format:e,resolution:"minute",count:1440}});let o,f;e==="csv"&&i?.csv?(o=new Blob([i.csv],{type:"text/csv"}),f=`archipelago-metrics-${new Date().toISOString().slice(0,10)}.csv`):(o=new Blob([JSON.stringify(i?.data??[],null,2)],{type:"application/json"}),f=`archipelago-metrics-${new Date().toISOString().slice(0,10)}.json`);const G=URL.createObjectURL(o),z=document.createElement("a");z.href=G,z.download=f,z.click(),URL.revokeObjectURL(G)}catch{}}async function O(){try{const e=await $.call({method:"monitoring.current"});e&&"system"in e&&(u.value=e,L.value=e.containers??[])}catch{}}async function W(){try{const e=await $.call({method:"monitoring.history",params:{resolution:"minute",count:60}});e?.data&&(h.value=e.data)}catch{}}async function N(){try{const e=await $.call({method:"monitoring.alerts",params:{count:50}});e?.alerts&&(c.value=e.alerts.reverse())}catch{}}async function j(){try{const e=await $.call({method:"monitoring.alert-rules"});e?.rules&&(a.value=e.rules)}catch{}}async function et(e,i){try{await $.call({method:"monitoring.configure-alert",params:{kind:e,enabled:i}}),await j()}catch{}}async function st(e,i){const o=parseFloat(i);if(!(isNaN(o)||o<=0))try{await $.call({method:"monitoring.configure-alert",params:{kind:e,threshold:o}}),await j()}catch{}}async function nt(e){try{await $.call({method:"monitoring.acknowledge-alert",params:{id:e}}),await N()}catch{}}function E(){const e=document.querySelector(".glass-card");e&&(y.value=Math.max(e.clientWidth-40,200))}return X(async()=>{E(),window.addEventListener("resize",E),await Promise.all([O(),W(),N(),j()]),k=setInterval(async()=>{try{await Promise.all([O(),W(),N()])}catch{}},5e3)}),q(()=>{k&&clearInterval(k),window.removeEventListener("resize",E)}),(e,i)=>(g(),_("div",rt,[t("div",ct,[t("div",dt,[t("div",null,[t("h1",mt,n(l(s)("monitoring.title")),1),t("p",ut,n(l(s)("monitoring.subtitle")),1)]),t("div",ht,[t("button",{class:"glass-button text-sm px-4 py-2",onClick:i[0]||(i[0]=o=>I("csv"))},n(l(s)("monitoring.exportCsv")),1),t("button",{class:"glass-button text-sm px-4 py-2",onClick:i[1]||(i[1]=o=>I("json"))},n(l(s)("monitoring.exportJson")),1)])])]),t("div",_t,[t("div",gt,[t("p",xt,n(l(s)("monitoring.cpu")),1),t("p",pt,n(u.value?.system.cpu_percent.toFixed(1)??"--")+"%",1),t("p",ft,n(l(s)("monitoring.load"))+" "+n(u.value?.system.load_avg_1.toFixed(2)??"--"),1)]),t("div",yt,[t("p",bt,n(l(s)("monitoring.memory")),1),t("p",vt,n(d.value)+"%",1),t("p",wt,n(v(u.value?.system.mem_used_bytes??0))+" / "+n(v(u.value?.system.mem_total_bytes??0)),1)]),t("div",kt,[t("p",Ct,n(l(s)("monitoring.diskUsage")),1),t("p",$t,n(M.value)+"%",1),t("p",St,n(v(u.value?.system.disk_used_bytes??0))+" / "+n(v(u.value?.system.disk_total_bytes??0)),1)]),t("div",Mt,[t("p",Ft,n(l(s)("monitoring.network")),1),t("p",Lt,n(v(u.value?.system.net_rx_bytes??0)),1),t("p",Tt,"TX: "+n(v(u.value?.system.net_tx_bytes??0)),1)])]),t("div",At,[t("div",Pt,[t("h3",Ut,n(l(s)("monitoring.cpuUsage")),1),P(D,{datasets:A.value,labels:x.value,width:y.value,height:180,"y-max":100},null,8,["datasets","labels","width"])]),t("div",Rt,[t("h3",Bt,n(l(s)("monitoring.memoryUsage")),1),P(D,{datasets:m.value,labels:x.value,width:y.value,height:180,"y-max":100},null,8,["datasets","labels","width"])]),t("div",Dt,[t("h3",Nt,n(l(s)("monitoring.networkIo")),1),P(D,{datasets:r.value,labels:x.value,width:y.value,height:180},null,8,["datasets","labels","width"])]),t("div",jt,[t("h3",Et,n(l(s)("monitoring.rpcLatency")),1),P(D,{datasets:p.value,labels:x.value,width:y.value,height:180},null,8,["datasets","labels","width"])])]),t("div",zt,[t("div",Ht,[t("h3",It,n(l(s)("monitoring.alertHistory")),1),t("button",{class:"glass-button text-xs px-3 py-1",onClick:i[2]||(i[2]=o=>b.value=!b.value)},n(b.value?l(s)("monitoring.hideConfig"):l(s)("common.configure")),1)]),b.value?(g(),_("div",Ot,[(g(!0),_(U,null,R(a.value,o=>(g(),_("div",{key:o.kind,class:"flex items-center gap-3 p-3 bg-white/5 rounded-lg"},[t("label",Wt,[t("input",{type:"checkbox",checked:o.enabled,onChange:f=>et(o.kind,!o.enabled)},null,40,Gt),i[3]||(i[3]=t("span",{class:"monitoring-alert-toggle-slider"},null,-1))]),t("div",Vt,[t("p",Jt,n(Q(o.kind)),1),t("p",Xt,n(o.description),1)]),t("div",qt,[t("input",{type:"number",value:o.threshold,class:"monitoring-threshold-input",onChange:f=>st(o.kind,f.target.value)},null,40,Kt),t("span",Qt,n(Y(o.kind)),1)])]))),128))])):V("",!0),c.value.length?(g(),_("div",Zt,[(g(!0),_(U,null,R(c.value,o=>(g(),_("div",{key:o.id,class:B(["flex items-start gap-3 p-3 bg-white/5 rounded-lg",{"opacity-50":o.acknowledged}])},[t("span",{class:B(["inline-block w-2 h-2 rounded-full mt-1.5 flex-shrink-0",Z(o.kind)])},null,2),t("div",te,[t("p",ee,n(o.message),1),t("p",se,n(tt(o.timestamp)),1)]),o.acknowledged?V("",!0):(g(),_("button",{key:0,class:"text-xs text-white/40 hover:text-white/70 flex-shrink-0",onClick:f=>nt(o.id)},n(l(s)("common.dismiss")),9,ne))],2))),128))])):(g(),_("div",Yt,n(l(s)("monitoring.noAlerts")),1))]),t("div",oe,[t("h3",ae,n(l(s)("monitoring.containerResources")),1),L.value.length?(g(),_("div",le,[(g(!0),_(U,null,R(L.value,o=>(g(),_("div",{key:o.name,class:"flex items-center gap-4 p-3 bg-white/5 rounded-lg"},[t("div",re,[t("p",ce,n(o.name),1),t("div",de,[t("span",null,"CPU: "+n(o.cpu_percent.toFixed(1))+"%",1),t("span",null,"Mem: "+n(v(o.mem_used_bytes)),1),t("span",null,"Net: "+n(v(o.net_rx_bytes))+" / "+n(v(o.net_tx_bytes)),1)])]),t("div",me,[t("div",{class:B(["monitoring-bar-fill",o.cpu_percent>80?"monitoring-bar-danger":o.cpu_percent>50?"monitoring-bar-warn":"monitoring-bar-ok"]),style:it({width:Math.min(o.cpu_percent,100)+"%"})},null,6)])]))),128))])):(g(),_("div",ie,n(l(s)("monitoring.noContainerMetrics")),1))]),t("div",ue,[t("div",he,[t("h3",_e,n(l(s)("monitoring.systemHealth")),1),t("div",ge,[i[4]||(i[4]=t("span",{class:"inline-block w-2 h-2 rounded-full bg-green-400"},null,-1)),H(" "+n(l(s)("common.healthy"))+" ",1),i[5]||(i[5]=t("span",{class:"inline-block w-2 h-2 rounded-full bg-orange-400 ml-2"},null,-1)),H(" "+n(l(s)("common.elevated"))+" ",1),i[6]||(i[6]=t("span",{class:"inline-block w-2 h-2 rounded-full bg-red-400 ml-2"},null,-1)),H(" "+n(l(s)("common.critical")),1)])]),t("div",xe,[(g(!0),_(U,null,R(F.value,(o,f)=>(g(),_("div",{key:f,class:B(["flex-1 rounded-sm transition-colors",K(o)]),title:o.label},null,10,pe))),128))]),t("div",fe,[t("span",null,n(C.value)+"m ago",1),i[7]||(i[7]=t("span",null,"Now",-1))])]),t("p",ye,n(l(s)("monitoring.refreshFooter"))+" · "+n(l(s)("monitoring.wsConnections",{count:u.value?.ws_connections??0})),1)]))}});export{ve as default}; diff --git a/neode-ui/dist/assets/NotFound-D22kjDbC.js b/neode-ui/dist/assets/NotFound-D22kjDbC.js new file mode 100644 index 0000000..76a8644 --- /dev/null +++ b/neode-ui/dist/assets/NotFound-D22kjDbC.js @@ -0,0 +1 @@ +import{d as s,c as a,a as e,h as o,i as n,E as r,U as d,J as l,q as i}from"./index-DnbYEqLr.js";const x={class:"min-h-screen flex items-center justify-center px-4"},c={class:"glass-card px-8 py-10 text-center max-w-md"},f=s({__name:"NotFound",setup(p){return(m,t)=>(i(),a("div",x,[e("div",c,[t[1]||(t[1]=e("h1",{class:"text-6xl font-bold text-white/30 mb-4"},"404",-1)),t[2]||(t[2]=e("p",{class:"text-lg text-white/70 mb-6"},"Page not found",-1)),o(r(d),{to:"/dashboard",class:"glass-button inline-block px-6 py-3"},{default:n(()=>[...t[0]||(t[0]=[l(" Back to Dashboard ",-1)])]),_:1})])]))}});export{f as default}; diff --git a/neode-ui/dist/assets/OnboardingBackup-DGLHJlqA.js b/neode-ui/dist/assets/OnboardingBackup-DGLHJlqA.js new file mode 100644 index 0000000..955cd0b --- /dev/null +++ b/neode-ui/dist/assets/OnboardingBackup-DGLHJlqA.js @@ -0,0 +1 @@ +import{d as w,c as s,a as e,D as y,G as b,g,H as _,J as u,r,B,x as C,q as a}from"./index-DnbYEqLr.js";const j={class:"min-h-full flex items-center justify-center p-3 sm:p-4 md:p-6"},D={class:"max-w-[800px] w-full relative z-10 path-glass-container onb-scroll-container"},S={class:"flex flex-col items-center gap-4 sm:gap-6 mb-4 sm:mb-6 px-3 sm:px-4"},V={class:"w-full max-w-[600px] space-y-4 sm:space-y-6"},z={key:0,class:"text-orange-400/80 text-sm"},L={key:1,class:"text-red-400 text-sm"},M={class:"path-option-card cursor-default px-4 py-4 sm:px-6 sm:py-6"},N={class:"text-left w-full"},R={class:"relative"},U=["disabled"],E={key:0},O={key:1,class:"flex items-center justify-center gap-2"},F={key:2,class:"flex items-center justify-center gap-2"},H={key:2,class:"text-center"},T={class:"flex gap-3 sm:gap-4 max-w-[600px] mx-auto flex-shrink-0 px-3 sm:px-4 pb-4 sm:pb-6"},Y=["disabled"],P=w({__name:"OnboardingBackup",setup(I){const m=C(),l=r(""),i=r(!1),c=r(!1),p=r(""),x=r(!1);async function f(){if(l.value){i.value=!0,p.value="";try{const o=await B.createBackup(l.value),t=JSON.stringify(o,null,2),d=new Blob([t],{type:"application/json"}),h=URL.createObjectURL(d),n=document.createElement("a");n.href=h,n.download="archipelago-did-backup.json",n.style.display="none",document.body.appendChild(n),n.click(),setTimeout(()=>{document.body.removeChild(n),URL.revokeObjectURL(h)},1e3),c.value=!0,localStorage.setItem("neode_backup_created","1")}catch(o){const t=o instanceof Error?o.message:String(o);/502|503|504|timeout|fetch|network|Failed to fetch/i.test(t)?x.value=!0:p.value=t||"Failed to create backup. Please try again."}finally{i.value=!1}}}function v(){m.push("/onboarding/verify").catch(()=>{})}function k(){m.push("/onboarding/verify").catch(()=>{})}return(o,t)=>(a(),s("div",j,[e("div",D,[t[7]||(t[7]=e("div",{class:"text-center mb-4 sm:mb-6 flex-shrink-0 px-3 sm:px-4 pt-4 sm:pt-6"},[e("h1",{class:"text-xl sm:text-2xl md:text-[26px] font-semibold text-white/96 mb-2 drop-shadow-[0_2px_6px_rgba(0,0,0,0.4)]"}," Backup Your Identity "),e("p",{class:"text-sm sm:text-base md:text-[20px] text-white/75 leading-relaxed max-w-[600px] mx-auto"}," Create a secure backup of your identity. Set a passphrase and download your encrypted backup file. ")],-1)),e("div",S,[e("div",V,[x.value?(a(),s("p",z,"Server is still starting up. You can try again shortly or skip this step.")):p.value?(a(),s("p",L,y(p.value),1)):b("",!0),e("div",M,[e("div",N,[t[2]||(t[2]=e("label",{class:"block text-xs sm:text-sm font-semibold text-white/80 mb-2 sm:mb-3 uppercase tracking-wide"}," Backup Passphrase ",-1)),e("div",R,[t[1]||(t[1]=e("div",{class:"absolute inset-y-0 left-0 pl-4 flex items-center pointer-events-none"},[e("svg",{class:"w-5 h-5 text-white/60",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 15v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2zm10-10V7a4 4 0 00-8 0v4h8z"})])],-1)),g(e("input",{"onUpdate:modelValue":t[0]||(t[0]=d=>l.value=d),type:"password",placeholder:"Enter a strong passphrase",class:"w-full bg-black/40 border border-white/10 rounded-lg px-4 py-3 pl-12 text-white/95 placeholder-white/40 focus:outline-none focus:border-white/30 focus:bg-black/50 transition-all"},null,512),[[_,l.value]])]),t[3]||(t[3]=e("p",{class:"text-xs sm:text-sm md:text-base text-white/60 mt-2 sm:mt-3"}," Keep this passphrase safe. You'll need it to restore your identity from backup. ",-1))])]),e("button",{onClick:f,disabled:!l.value||i.value,class:"path-action-button path-action-button--continue w-full"},[!i.value&&!c.value?(a(),s("span",E,"Download Backup")):i.value?(a(),s("span",O,[...t[4]||(t[4]=[e("svg",{class:"animate-spin h-5 w-5",xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24"},[e("circle",{class:"opacity-25",cx:"12",cy:"12",r:"10",stroke:"currentColor","stroke-width":"4"}),e("path",{class:"opacity-75",fill:"currentColor",d:"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"})],-1),u(" Downloading... ",-1)])])):(a(),s("span",F,[...t[5]||(t[5]=[e("svg",{class:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M5 13l4 4L19 7"})],-1),u(" Downloaded ",-1)])]))],8,U),c.value?(a(),s("div",H,[...t[6]||(t[6]=[e("p",{class:"text-sm text-white/70"},[u(" Backup saved as "),e("span",{class:"font-mono text-white/90"},"archipelago-did-backup.json")],-1)])])):b("",!0)])]),e("div",T,[e("button",{onClick:k,class:"path-action-button path-action-button--skip"}," Skip "),e("button",{onClick:v,disabled:!c.value,class:"path-action-button path-action-button--continue disabled:opacity-50"}," Continue ",8,Y)])])]))}});export{P as default}; diff --git a/neode-ui/dist/assets/OnboardingDid-BxUaq9s9.css b/neode-ui/dist/assets/OnboardingDid-BxUaq9s9.css new file mode 100644 index 0000000..b3bf179 --- /dev/null +++ b/neode-ui/dist/assets/OnboardingDid-BxUaq9s9.css @@ -0,0 +1 @@ +.onb-lock-spin[data-v-8e98e431]{animation:onb-lock-pulse-8e98e431 1.2s ease-in-out infinite}@keyframes onb-lock-pulse-8e98e431{0%,to{transform:scale(1);opacity:1}50%{transform:scale(1.08);opacity:.7}} diff --git a/neode-ui/dist/assets/OnboardingDid-Cr_ec55a.js b/neode-ui/dist/assets/OnboardingDid-Cr_ec55a.js new file mode 100644 index 0000000..e727033 --- /dev/null +++ b/neode-ui/dist/assets/OnboardingDid-Cr_ec55a.js @@ -0,0 +1 @@ +import{d as j,o as T,O as B,c as o,a as t,G as l,D as m,N as M,r,B as _,x as z,q as a,t as V}from"./index-DnbYEqLr.js";const Y={class:"min-h-full flex items-center justify-center p-3 sm:p-4 md:p-6"},F={class:"max-w-[800px] w-full relative z-10 path-glass-container onb-scroll-container"},O={key:0,class:"text-center flex-shrink-0"},G={class:"flex flex-col items-center gap-6 mb-6"},H={key:0,class:"text-center"},L={key:0,class:"flex items-center justify-center gap-3 mb-2"},$={class:"text-sm text-white/40 font-mono tabular-nums"},E={key:1,class:"text-sm text-white/50"},P={key:2,class:"text-lg text-white/80"},q={key:1,class:"w-full max-w-[600px] space-y-4"},J={class:"path-option-card cursor-default px-6 py-6"},R={class:"text-left"},U={class:"bg-black/40 rounded-lg p-4 mb-3 backdrop-blur-sm border border-white/10 flex items-start gap-3"},W={class:"text-white/95 font-mono text-sm break-all leading-relaxed flex-1"},A=["title"],K={key:0,class:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24","stroke-width":"2"},Q={key:1,class:"w-4 h-4 text-green-400",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24","stroke-width":"2"},X={key:0,class:"text-left mt-4"},Z={class:"bg-black/40 rounded-lg p-4 mb-3 backdrop-blur-sm border border-white/10 flex items-start gap-3"},ee={class:"text-white/95 font-mono text-sm break-all leading-relaxed flex-1"},te=["title"],se={key:0,class:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24","stroke-width":"2"},oe={key:1,class:"w-4 h-4 text-green-400",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24","stroke-width":"2"},ae={class:"flex gap-4 max-w-[600px] mx-auto flex-shrink-0"},ne=j({__name:"OnboardingDid",setup(ie){const b=z(),n=r(""),d=r(""),c=r(!1),i=r(!1),p=r(!1),v=r(!1),k=r("0:00");let x=null,h=null,w=0;function y(){w=Date.now(),h=setInterval(()=>{const s=Math.floor((Date.now()-w)/1e3),e=Math.floor(s/60),u=s%60;k.value=`${e}:${u.toString().padStart(2,"0")}`},1e3)}function f(){x&&(clearTimeout(x),x=null),h&&(clearInterval(h),h=null)}function C(s,e){localStorage.setItem("neode_did",s),localStorage.setItem("neode_did_state",JSON.stringify({did:s,kid:`${s}#key-1`,pubkey:e}))}async function g(){i.value||(c.value=!0);try{const{did:s,pubkey:e}=await _.getNodeDid();f(),n.value=s,C(s,e),c.value=!1,i.value=!1,_.getNostrPubkey().then(({nostr_npub:u})=>{u&&(d.value=u,localStorage.setItem("neode_nostr_npub",u))}).catch(()=>{})}catch{c.value=!1,i.value||(i.value=!0,y()),x=setTimeout(g,4e3)}}T(()=>{const s=localStorage.getItem("neode_did"),e=localStorage.getItem("neode_nostr_npub");e&&(d.value=e),s&&!s.includes("...")?n.value=s:g()}),B(()=>{f()});function D(){f(),b.push("/onboarding/identity").catch(()=>{})}function I(){f(),b.push("/onboarding/identity").catch(()=>{})}function N(){n.value&&(navigator.clipboard.writeText(n.value).catch(()=>{}),p.value=!0,setTimeout(()=>{p.value=!1},2e3))}function S(){d.value&&(navigator.clipboard.writeText(d.value).catch(()=>{}),v.value=!0,setTimeout(()=>{v.value=!1},2e3))}return(s,e)=>(a(),o("div",Y,[t("div",F,[n.value?l("",!0):(a(),o("div",O,[...e[0]||(e[0]=[t("h1",{class:"text-xl sm:text-2xl md:text-[26px] font-semibold text-white/96 mb-3 sm:mb-6 drop-shadow-[0_2px_6px_rgba(0,0,0,0.4)]"}," Your node's identity ",-1),t("p",{class:"text-sm sm:text-base md:text-[20px] text-white/75 leading-relaxed max-w-[600px] mx-auto mb-4 sm:mb-6"}," Your node has a Decentralized Identifier (DID) for secure, passwordless authentication. ",-1)])])),t("div",G,[!n.value&&(c.value||i.value)?(a(),o("div",H,[e[2]||(e[2]=t("div",{class:"flex justify-center mb-4"},[t("div",{class:"w-16 h-16 rounded-full bg-white/10 flex items-center justify-center onb-lock-spin"},[t("svg",{class:"w-8 h-8 text-orange-400",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24","stroke-width":"2"},[t("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"M12 15v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2zm10-10V7a4 4 0 00-8 0v4h8z"})])])],-1)),i.value?(a(),o("div",L,[e[1]||(e[1]=t("p",{class:"text-lg text-white/80"},"Server starting up",-1)),t("span",$,m(k.value),1)])):l("",!0),i.value?(a(),o("p",E,"This usually takes 1–3 minutes after first boot")):l("",!0),i.value?l("",!0):(a(),o("p",P,"Generating your identity key..."))])):l("",!0),n.value?(a(),o("div",q,[e[11]||(e[11]=M('

Your node's decentralized identifier

',1)),t("div",J,[t("div",R,[e[5]||(e[5]=t("h3",{class:"text-sm font-semibold text-white/80 mb-2 uppercase tracking-wide"},"Your DID",-1)),t("div",U,[t("p",W,m(n.value),1),t("button",{onClick:N,class:"shrink-0 p-1.5 rounded hover:bg-white/10 transition-colors text-white/50 hover:text-white/90",title:p.value?"Copied!":"Copy DID"},[p.value?(a(),o("svg",Q,[...e[4]||(e[4]=[t("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"M5 13l4 4L19 7"},null,-1)])])):(a(),o("svg",K,[...e[3]||(e[3]=[t("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z"},null,-1)])]))],8,A)]),e[6]||(e[6]=t("p",{class:"text-xs text-white/50 mb-3"},"For Web5, federation, and verifiable credentials",-1))]),d.value?(a(),o("div",X,[e[9]||(e[9]=t("h3",{class:"text-sm font-semibold text-white/80 mb-2 uppercase tracking-wide"},"Your Nostr ID",-1)),t("div",Z,[t("p",ee,m(d.value),1),t("button",{onClick:S,class:"shrink-0 p-1.5 rounded hover:bg-white/10 transition-colors text-white/50 hover:text-white/90",title:v.value?"Copied!":"Copy npub"},[v.value?(a(),o("svg",oe,[...e[8]||(e[8]=[t("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"M5 13l4 4L19 7"},null,-1)])])):(a(),o("svg",se,[...e[7]||(e[7]=[t("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z"},null,-1)])]))],8,te)]),e[10]||(e[10]=t("p",{class:"text-xs text-white/50"},"For Nostr social apps and NIP-07 signing",-1))])):l("",!0)])])):l("",!0)]),t("div",ae,[t("button",{onClick:I,class:"path-action-button path-action-button--skip"}," Skip "),n.value?(a(),o("button",{key:0,onClick:D,class:"path-action-button path-action-button--continue"}," Continue ")):l("",!0)])])]))}}),re=V(ne,[["__scopeId","data-v-8e98e431"]]);export{re as default}; diff --git a/neode-ui/dist/assets/OnboardingDone-D8gm2WWx.js b/neode-ui/dist/assets/OnboardingDone-D8gm2WWx.js new file mode 100644 index 0000000..f9cf8f4 --- /dev/null +++ b/neode-ui/dist/assets/OnboardingDone-D8gm2WWx.js @@ -0,0 +1 @@ +import{d as a,c as n,a as t,N as r,x as i,q as l}from"./index-DnbYEqLr.js";const c={class:"min-h-full flex items-center justify-center p-3 sm:p-4 md:p-6"},u=a({__name:"OnboardingDone",setup(d){const o=i();function s(){o.push("/login").catch(()=>{})}return(p,e)=>(l(),n("div",c,[t("div",{class:"max-w-[800px] w-full relative z-10 path-glass-container onb-scroll-container"},[t("div",{class:"text-center space-y-4 sm:space-y-6 px-3 sm:px-4 py-4 sm:py-6"},[e[0]||(e[0]=r('

Your sovereign identity is ready. You can now log in and start your journey as a noderunner.

Sovereign Identity

Encrypted Backup

Ready to Use

',3)),t("button",{onClick:s,class:"path-action-button path-action-button--continue mx-auto"}," Go to Login ")])])]))}});export{u as default}; diff --git a/neode-ui/dist/assets/OnboardingIdentity-i_e-4MVD.js b/neode-ui/dist/assets/OnboardingIdentity-i_e-4MVD.js new file mode 100644 index 0000000..cadab0c --- /dev/null +++ b/neode-ui/dist/assets/OnboardingIdentity-i_e-4MVD.js @@ -0,0 +1 @@ +import{d as g,c as o,a as e,g as y,H as w,F as _,P as k,D as p,G as C,r as n,B as P,x as S,f as x,q as l}from"./index-DnbYEqLr.js";const B={class:"min-h-full flex items-center justify-center p-3 sm:p-4 md:p-6"},E={class:"max-w-[800px] w-full relative z-10 path-glass-container onb-scroll-container"},N={class:"flex flex-col items-center gap-4 sm:gap-6 mb-4 sm:mb-6 px-3 sm:px-4"},z={class:"w-full max-w-[600px] space-y-4 sm:space-y-6"},F={class:"path-option-card cursor-default px-4 py-4 sm:px-6 sm:py-6"},M={class:"path-option-card cursor-default px-4 py-4 sm:px-6 sm:py-6"},j={class:"grid grid-cols-1 sm:grid-cols-3 gap-3"},D=["onClick"],I={class:"flex items-center gap-2 mb-1"},V={class:"font-medium text-sm"},G={class:"text-xs text-white/50 ml-7"},Y={key:0,class:"text-center mb-4 px-3"},q={key:1,class:"text-red-400 text-sm text-center mb-4"},A={class:"flex gap-3 sm:gap-4 max-w-[600px] mx-auto flex-shrink-0 px-3 sm:px-4 pb-4 sm:pb-6"},H=["disabled"],L={key:0},O={key:1},$=g({__name:"OnboardingIdentity",setup(R){const m=S(),c=n("Personal"),d=n("personal"),i=n(!1),r=n(""),u=n(!1),b=[{value:"personal",label:"Personal",desc:"Everyday use",color:"bg-blue-500/30 text-blue-400"},{value:"business",label:"Business",desc:"Professional",color:"bg-orange-500/30 text-orange-400"},{value:"anonymous",label:"Anonymous",desc:"Private",color:"bg-purple-500/30 text-purple-400"}];function h(s){const t=s instanceof Error?s.message:String(s);return/502|503|504|timeout|fetch|network|Failed to fetch/i.test(t)}async function v(){i.value=!0,r.value="",u.value=!1;try{await P.call({method:"identity.create",params:{name:c.value||"Personal",purpose:d.value}}),m.push("/onboarding/backup").catch(()=>{})}catch(s){h(s)?u.value=!0:r.value=s instanceof Error?s.message:"Failed to create identity"}finally{i.value=!1}}function f(){m.push("/onboarding/backup").catch(()=>{})}return(s,t)=>(l(),o("div",B,[e("div",E,[t[5]||(t[5]=e("div",{class:"text-center flex-shrink-0 px-3 sm:px-4 pt-4 sm:pt-6"},[e("h1",{class:"text-xl sm:text-2xl md:text-[26px] font-semibold text-white/96 mb-2 sm:mb-4 drop-shadow-[0_2px_6px_rgba(0,0,0,0.4)]"}," Name your identity "),e("p",{class:"text-sm sm:text-base md:text-[20px] text-white/75 leading-relaxed max-w-[600px] mx-auto mb-4 sm:mb-6"}," Give your first identity a name and choose how you'll use it. You can create more identities later. ")],-1)),e("div",N,[e("div",z,[e("div",F,[t[1]||(t[1]=e("label",{class:"block text-sm font-semibold text-white/80 mb-3 uppercase tracking-wide"},"Identity Name",-1)),y(e("input",{"onUpdate:modelValue":t[0]||(t[0]=a=>c.value=a),type:"text",placeholder:"Personal",class:"w-full bg-black/40 border border-white/10 rounded-lg px-4 py-3 text-white/95 placeholder-white/40 focus:outline-none focus:border-white/30 focus:bg-black/50 transition-all"},null,512),[[w,c.value]])]),e("div",M,[t[3]||(t[3]=e("label",{class:"block text-sm font-semibold text-white/80 mb-3 uppercase tracking-wide"},"Purpose",-1)),e("div",j,[(l(),o(_,null,k(b,a=>e("button",{key:a.value,onClick:T=>d.value=a.value,class:x(["px-4 py-3 rounded-lg border text-left transition-all",d.value===a.value?"bg-white/15 border-white/30 text-white":"bg-black/20 border-white/10 text-white/60 hover:bg-white/10 hover:text-white/80"])},[e("div",I,[e("div",{class:x(["w-5 h-5 rounded-full flex items-center justify-center shrink-0",a.color])},[...t[2]||(t[2]=[e("svg",{class:"w-3 h-3",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M16 7a4 4 0 11-8 0 4 4 0 018 0zM12 14a7 7 0 00-7 7h14a7 7 0 00-7-7z"})],-1)])],2),e("span",V,p(a.label),1)]),e("p",G,p(a.desc),1)],10,D)),64))])])])]),u.value?(l(),o("div",Y,[...t[4]||(t[4]=[e("p",{class:"text-orange-400/80 text-sm"},"Server is still starting up. Your identity will be saved once it's ready.",-1)])])):r.value?(l(),o("p",q,p(r.value),1)):C("",!0),e("div",A,[e("button",{onClick:f,class:"path-action-button path-action-button--skip"}," Skip "),e("button",{onClick:v,disabled:i.value,class:"path-action-button path-action-button--continue"},[i.value?(l(),o("span",L,"Creating...")):(l(),o("span",O,"Continue"))],8,H)])])]))}});export{$ as default}; diff --git a/neode-ui/dist/assets/OnboardingIntro-CsYM21xo.js b/neode-ui/dist/assets/OnboardingIntro-CsYM21xo.js new file mode 100644 index 0000000..376fe03 --- /dev/null +++ b/neode-ui/dist/assets/OnboardingIntro-CsYM21xo.js @@ -0,0 +1 @@ +import{d as w,c as u,a as e,h as y,C as k,g as _,H as C,D as b,G as f,r as l,B as R,x as B,q as c,t as I}from"./index-DnbYEqLr.js";const N={class:"min-h-full flex items-center justify-center p-4 sm:p-6"},O={class:"max-w-2xl w-full"},S={class:"glass-card p-8 pt-16 sm:p-12 sm:pt-20 text-center relative overflow-visible onb-card"},T={class:"absolute -top-8 sm:-top-10 left-0 right-0 flex justify-center z-10 onb-logo"},V={class:"logo-gradient-border w-16 h-16 sm:w-20 sm:h-20"},j={key:0,class:"mt-6 glass-card px-6 py-6 text-left"},A={key:0,class:"text-red-400 text-xs mb-2"},D={key:1,class:"text-green-400 text-xs mb-2"},E={class:"flex gap-3"},F=["disabled"],L=w({__name:"OnboardingIntro",setup(U){const m=B();function v(){m.push("/onboarding/path").catch(()=>{})}const d=l(!1),a=l(null),r=l(""),i=l(!1),s=l(""),x=l(!1);function g(n){const o=n.target.files?.[0];if(!o)return;const p=new FileReader;p.onload=()=>{try{a.value=JSON.parse(p.result),s.value=""}catch{s.value="Invalid backup file format",a.value=null}},p.readAsText(o)}async function h(){if(!(!a.value||!r.value)){i.value=!0,s.value="";try{await R.call({method:"backup.restore-identity",params:{backup:a.value,passphrase:r.value}}),x.value=!0,setTimeout(()=>{m.push("/onboarding/did")},1500)}catch(n){s.value=n instanceof Error?n.message:"Restore failed"}finally{i.value=!1}}}return(n,t)=>(c(),u("div",N,[e("div",O,[e("div",S,[e("div",T,[e("div",V,[y(k,{"no-border":"",fit:""})])]),t[4]||(t[4]=e("h1",{class:"text-2xl sm:text-4xl font-bold text-white mb-3 sm:mb-4 onb-title"}," Welcome to Archipelago ",-1)),t[5]||(t[5]=e("p",{class:"text-base sm:text-xl text-white/80 mb-8 sm:mb-12 max-w-2xl mx-auto onb-tagline"}," Your personal server for a sovereign digital life ",-1)),e("button",{onClick:v,class:"glass-button px-6 py-3 sm:px-8 sm:py-4 rounded-lg text-base sm:text-lg font-medium transition-all hover:bg-black/70 hover:border-white/30 onb-cta"}," Unlock your sovereignty → "),e("a",{class:"text-white/50 hover:text-white/80 underline text-sm cursor-pointer mt-4 block text-center onb-cta",onClick:t[0]||(t[0]=o=>d.value=!0)}," Restore from backup "),d.value?(c(),u("div",j,[t[3]||(t[3]=e("h3",{class:"text-sm font-semibold text-white/80 mb-3 uppercase tracking-wide"},"Restore Identity from Backup",-1)),e("input",{type:"file",accept:".json",class:"block w-full text-sm text-white/60 file:mr-4 file:py-2 file:px-4 file:rounded file:border-0 file:text-sm file:bg-white/10 file:text-white/80 hover:file:bg-white/20 mb-3",onChange:g},null,32),_(e("input",{"onUpdate:modelValue":t[1]||(t[1]=o=>r.value=o),type:"password",placeholder:"Backup passphrase",class:"w-full px-4 py-2 bg-white/10 border border-white/20 rounded-lg text-white text-sm focus:outline-none focus:border-white/40 mb-3"},null,512),[[C,r.value]]),s.value?(c(),u("p",A,b(s.value),1)):f("",!0),x.value?(c(),u("p",D,"Identity restored successfully!")):f("",!0),e("div",E,[e("button",{class:"glass-button text-sm px-4 py-2",onClick:t[2]||(t[2]=o=>d.value=!1)},"Cancel"),e("button",{class:"glass-button text-sm px-4 py-2",disabled:!a.value||!r.value||i.value,onClick:h},b(i.value?"Restoring...":"Restore"),9,F)])])):f("",!0)])])]))}}),q=I(L,[["__scopeId","data-v-da05f75f"]]);export{q as default}; diff --git a/neode-ui/dist/assets/OnboardingIntro-CuS0o5GQ.css b/neode-ui/dist/assets/OnboardingIntro-CuS0o5GQ.css new file mode 100644 index 0000000..83b5001 --- /dev/null +++ b/neode-ui/dist/assets/OnboardingIntro-CuS0o5GQ.css @@ -0,0 +1 @@ +.onb-card[data-v-da05f75f]{opacity:0;animation:onb-card-in-da05f75f .6s cubic-bezier(.25,.46,.45,.94) .1s forwards}.onb-logo[data-v-da05f75f]{opacity:0;animation:onb-scale-in-da05f75f .5s cubic-bezier(.25,.46,.45,.94) .3s forwards}.onb-title[data-v-da05f75f]{opacity:0;animation:onb-slide-up-da05f75f .5s cubic-bezier(.25,.46,.45,.94) .7s forwards}.onb-tagline[data-v-da05f75f]{opacity:0;animation:onb-slide-up-da05f75f .5s cubic-bezier(.25,.46,.45,.94) 1s forwards}.onb-cta[data-v-da05f75f]{opacity:0;animation:onb-fade-in-da05f75f .6s ease 1.4s forwards}@keyframes onb-card-in-da05f75f{0%{opacity:0;transform:translateY(12px)}to{opacity:1;transform:translateY(0)}}@keyframes onb-scale-in-da05f75f{0%{opacity:0;transform:scale(.92)}to{opacity:1;transform:scale(1)}}@keyframes onb-slide-up-da05f75f{0%{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}@keyframes onb-fade-in-da05f75f{0%{opacity:0}to{opacity:1}} diff --git a/neode-ui/dist/assets/OnboardingOptions-BEL4MhY9.js b/neode-ui/dist/assets/OnboardingOptions-BEL4MhY9.js new file mode 100644 index 0000000..3654fd7 --- /dev/null +++ b/neode-ui/dist/assets/OnboardingOptions-BEL4MhY9.js @@ -0,0 +1 @@ +import{d as r,o as m,c,a as s,N as i,f as d,r as x,x as p,q as h}from"./index-DnbYEqLr.js";import{completeOnboarding as u}from"./useOnboarding-BgpIyX9l.js";const v="/assets/icon/favico-black-v2.svg",w={class:"min-h-full flex items-center justify-center p-3 sm:p-4 md:p-6"},b={class:"max-w-[1200px] w-full relative z-10 path-glass-container onb-scroll-container"},f={class:"grid grid-cols-1 md:grid-cols-3 gap-3 sm:gap-6 px-3 sm:px-4"},j=r({__name:"OnboardingOptions",setup(g){const n=p(),e=x(null);m(()=>{e.value="fresh"});function l(o){e.value=o}async function a(){try{await u()}catch{}n.push("/login").catch(()=>{})}return(o,t)=>(h(),c("div",w,[s("div",b,[t[3]||(t[3]=i('
Archipelago

Choose Your Setup

How would you like to get started?

',1)),s("div",f,[s("button",{onClick:t[0]||(t[0]=k=>l("fresh")),class:d(["path-option-card text-center",{"path-option-card--selected":e.value==="fresh"}])},[...t[1]||(t[1]=[i('

Fresh Start

Set up a new server from scratch

',3)])],2),t[2]||(t[2]=i('

Restore Backup

Restore from a previous backup

(Coming Soon)

Connect Existing

Connect to an existing Archipelago server

(Coming Soon)
',2))]),s("div",{class:"flex justify-center flex-shrink-0 px-3 sm:px-4 pb-4 sm:pb-6 mt-4 sm:mt-8"},[s("button",{onClick:a,class:"path-action-button path-action-button--continue"}," Continue ")])])]))}});export{j as default}; diff --git a/neode-ui/dist/assets/OnboardingPath-BE4wazNB.js b/neode-ui/dist/assets/OnboardingPath-BE4wazNB.js new file mode 100644 index 0000000..e9456c9 --- /dev/null +++ b/neode-ui/dist/assets/OnboardingPath-BE4wazNB.js @@ -0,0 +1 @@ +import{d as a,c as i,a as t,N as n,x as r,q as l}from"./index-DnbYEqLr.js";const d={class:"min-h-full flex items-center justify-center p-3 sm:p-4 md:p-6 relative"},m=a({__name:"OnboardingPath",setup(c){const o=r();function s(){o.push("/onboarding/did").catch(()=>{})}return(p,e)=>(l(),i("div",d,[t("div",{class:"max-w-[1200px] w-full relative z-10 path-glass-container onb-scroll-container"},[e[0]||(e[0]=n('

Your Node, Your Possibilities

Archipelago gives you the tools to build your sovereign digital life. All of these capabilities are available from your dashboard.

Self Sovereignty

Data, files, ownership, property of my data estate. Own, manage, edit, and even sell your personal data.

Community Commerce

Self contained and owned ecommerce system built on bitcoin and mesh networks. Trade freely without intermediaries.

Sovereign Projects

Logistics and project management self owned with privacy control. Collaborate without surveillance.

Data Transmitter

Assist the new sovereign net with relay points and networking where you get paid for your value.

Hoster

Host services and content, archives, and more to others for micro bitcoin payments. Earn while you serve.

Sovereign AI

Run AI models locally on your hardware. No cloud surveillance, complete privacy, full control over your AI assistant.

',2)),t("div",{class:"flex justify-center max-w-[600px] mx-auto flex-shrink-0 px-3 sm:px-4 pb-4 sm:pb-6"},[t("button",{onClick:s,class:"path-action-button path-action-button--continue"}," Continue ")])])]))}});export{m as default}; diff --git a/neode-ui/dist/assets/OnboardingVerify-P3nJC3Zw.js b/neode-ui/dist/assets/OnboardingVerify-P3nJC3Zw.js new file mode 100644 index 0000000..18b558d --- /dev/null +++ b/neode-ui/dist/assets/OnboardingVerify-P3nJC3Zw.js @@ -0,0 +1 @@ +import{d as C,c as s,a as t,G as c,D as g,J as S,N as V,r as i,B as f,x as B,q as a}from"./index-DnbYEqLr.js";import{completeOnboarding as v}from"./useOnboarding-BgpIyX9l.js";const N={class:"min-h-full flex items-center justify-center p-3 sm:p-4 md:p-6"},j={class:"max-w-[800px] w-full relative z-10 path-glass-container onb-scroll-container"},z={key:0,class:"text-center mb-4 sm:mb-6 flex-shrink-0 px-3 sm:px-4 pt-4 sm:pt-6"},F={class:"flex flex-col items-center gap-6 mb-6"},Y={key:0,class:"text-orange-400/80 text-sm"},M={key:1,class:"text-red-400 text-sm"},R=["disabled"],A={key:0},D={key:1,class:"flex items-center gap-2"},E={key:3,class:"w-full max-w-[600px]"},I={class:"path-option-card cursor-default px-6 py-6"},O={class:"text-left"},T={class:"bg-black/40 rounded-lg p-4 backdrop-blur-sm border border-white/10"},q={class:"text-white/95 font-mono text-xs break-all leading-relaxed"},G={class:"flex gap-3 sm:gap-4 max-w-[600px] mx-auto flex-shrink-0 px-3 sm:px-4 pb-4 sm:pb-6"},P=C({__name:"OnboardingVerify",setup(H){const x=B(),n=i(!1),l=i(!1),m=i(""),p=i(""),d=i(""),h=i(!1);function b(){const o=new Uint8Array(32);return crypto.getRandomValues(o),btoa(String.fromCharCode(...o))}async function y(){l.value=!0,d.value="";for(let o=0;o<3;o++)try{p.value=b();const{signature:e}=await f.signChallenge(p.value);m.value=e,l.value=!1;const r=localStorage.getItem("neode_did");if(r){const u=await f.call({method:"identity.verify",params:{did:r,message:p.value,signature:e}});n.value=u.valid!==!1}else n.value=!0;return}catch(e){const r=e instanceof Error?e.message:"",u=/502|503|504|timeout|fetch|network|Failed to fetch/i.test(r);!u||o===2?u?h.value=!0:d.value=r||"Failed to sign challenge. You can retry or skip this step.":await new Promise(k=>setTimeout(k,1e3*(o+1)))}l.value=!1}async function w(){try{await v()}catch{}x.push("/onboarding/done").catch(()=>{})}async function _(){try{await v()}catch{}x.push("/onboarding/done").catch(()=>{})}return(o,e)=>(a(),s("div",N,[t("div",j,[n.value?c("",!0):(a(),s("div",z,[...e[0]||(e[0]=[t("h1",{class:"text-xl sm:text-2xl md:text-[26px] font-semibold text-white/96 mb-2 drop-shadow-[0_2px_6px_rgba(0,0,0,0.4)]"}," Verify Your Identity ",-1),t("p",{class:"text-sm sm:text-base md:text-[20px] text-white/75 leading-relaxed max-w-[600px] mx-auto"}," Sign a challenge to verify your decentralized identity is working correctly. ",-1)])])),t("div",F,[h.value?(a(),s("p",Y,"Server is still starting up. You can try again shortly or skip this step.")):d.value?(a(),s("p",M,g(d.value),1)):c("",!0),n.value?c("",!0):(a(),s("button",{key:2,onClick:y,disabled:l.value,class:"path-action-button path-action-button--continue"},[l.value?(a(),s("span",D,[...e[1]||(e[1]=[t("svg",{class:"animate-spin h-5 w-5",xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24"},[t("circle",{class:"opacity-25",cx:"12",cy:"12",r:"10",stroke:"currentColor","stroke-width":"4"}),t("path",{class:"opacity-75",fill:"currentColor",d:"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"})],-1),S(" Signing... ",-1)])])):(a(),s("span",A,"Sign Challenge"))],8,R)),n.value?(a(),s("div",E,[e[3]||(e[3]=V('

Your identity has been successfully verified and is ready to use.

',1)),t("div",I,[t("div",O,[e[2]||(e[2]=t("h3",{class:"text-sm font-semibold text-white/80 mb-2 uppercase tracking-wide"},"Signature",-1)),t("div",T,[t("p",q,g(m.value),1)])])])])):c("",!0)]),t("div",G,[t("button",{onClick:_,class:"path-action-button path-action-button--skip"}," Skip "),n.value?(a(),s("button",{key:0,onClick:w,class:"path-action-button path-action-button--continue"}," Finish ")):c("",!0)])])]))}});export{P as default}; diff --git a/neode-ui/dist/assets/OnboardingWrapper-BHmgMze2.css b/neode-ui/dist/assets/OnboardingWrapper-BHmgMze2.css new file mode 100644 index 0000000..03d5751 --- /dev/null +++ b/neode-ui/dist/assets/OnboardingWrapper-BHmgMze2.css @@ -0,0 +1 @@ +.onb-viewport[data-v-67f94dcc]{height:100vh;height:100dvh;width:100%;position:fixed;inset:0}.perspective-container-wrapper[data-v-67f94dcc]{position:relative;overflow:hidden;height:100%}.perspective-container[data-v-67f94dcc]{perspective:1200px;perspective-origin:50% 50%;position:relative;height:100%;overflow:hidden}.view-wrapper[data-v-67f94dcc]{position:absolute;inset:0;transform-style:preserve-3d;backface-visibility:hidden;will-change:transform,opacity;overflow:hidden}.view-container[data-v-67f94dcc]{height:100%;overflow-y:auto;overflow-x:hidden;-webkit-overflow-scrolling:touch}.depth-forward-enter-active.view-wrapper[data-v-67f94dcc],.depth-forward-leave-active.view-wrapper[data-v-67f94dcc]{transition:all .9s cubic-bezier(.25,.46,.45,.94)}.depth-forward-enter-from.view-wrapper[data-v-67f94dcc]{opacity:0;transform:translateZ(-1200px) scale(.6);filter:blur(10px)}.depth-forward-enter-to.view-wrapper[data-v-67f94dcc],.depth-forward-leave-from.view-wrapper[data-v-67f94dcc]{opacity:1;transform:translateZ(0) scale(1);filter:blur(0px)}.depth-forward-leave-to.view-wrapper[data-v-67f94dcc]{opacity:0;transform:translateZ(500px) scale(1.25);filter:blur(10px)}.slide-left-enter-active.view-wrapper[data-v-67f94dcc],.slide-left-leave-active.view-wrapper[data-v-67f94dcc],.slide-right-enter-active.view-wrapper[data-v-67f94dcc],.slide-right-leave-active.view-wrapper[data-v-67f94dcc]{transition:transform .4s cubic-bezier(.25,.46,.45,.94),opacity .4s ease}.slide-left-enter-from.view-wrapper[data-v-67f94dcc]{opacity:0;transform:translate(60px)}.slide-left-leave-to.view-wrapper[data-v-67f94dcc],.slide-right-enter-from.view-wrapper[data-v-67f94dcc]{opacity:0;transform:translate(-60px)}.slide-right-leave-to.view-wrapper[data-v-67f94dcc]{opacity:0;transform:translate(60px)}.bg-zoom[data-v-67f94dcc]{transition:transform 1.8s cubic-bezier(.25,.46,.45,.94);transform:scale(1)}.bg-zoom-in[data-v-67f94dcc]{transform:scale(1.15)}@media(min-width:768px){.depth-forward-enter-from.view-wrapper[data-v-67f94dcc]{transform:translateZ(-1200px) scale(.6) rotateX(6deg)}.depth-forward-leave-to.view-wrapper[data-v-67f94dcc]{transform:translateZ(500px) scale(1.25) rotateX(-4deg)}}.bg-perspective-container[data-v-67f94dcc]{position:fixed;inset:0;perspective:1000px;perspective-origin:50% 50%;z-index:-10;overflow:hidden;min-width:100vw;width:100vw}.bg-fullwidth[data-v-67f94dcc]{min-width:100vw;width:100vw;background-size:cover;background-position:center center}.bg-layer[data-v-67f94dcc]{position:absolute;inset:0;background-size:cover;background-position:center;background-repeat:no-repeat;transform-style:preserve-3d;backface-visibility:hidden}.bg-layer video[data-v-67f94dcc],video.bg-layer[data-v-67f94dcc]{width:100%;height:100%;-o-object-fit:cover;object-fit:cover;-o-object-position:center;object-position:center;position:absolute;inset:0}.bg-static[data-v-67f94dcc]{opacity:1;transform:translateZ(0) scale(1)}.bg-login-static[data-v-67f94dcc]{opacity:1;transform:none}.login-glitch-layer[data-v-67f94dcc]{position:absolute;inset:0;pointer-events:none;z-index:5;background-size:cover;background-position:center;background-repeat:no-repeat;opacity:0}.login-glitch-1[data-v-67f94dcc]{mix-blend-mode:screen;filter:hue-rotate(22deg) saturate(1.35);animation:login-glitch-shift-67f94dcc 5s steps(10,end) infinite}.login-glitch-2[data-v-67f94dcc]{mix-blend-mode:screen;filter:hue-rotate(-30deg) saturate(1.45);animation:login-glitch-shift-2-67f94dcc 5s steps(9,end) infinite}.login-glitch-scan[data-v-67f94dcc]{position:absolute;inset:0;pointer-events:none;z-index:6;background:linear-gradient(180deg,#ffffff29,#0000 60%),repeating-linear-gradient(180deg,#ffffff0d 0 2px,#0000 2px 4px),radial-gradient(ellipse at center,#0000 40%,#00000059);opacity:0;animation:login-glitch-scan-67f94dcc 5s ease-out infinite}@keyframes login-glitch-shift-67f94dcc{0%,82%{transform:translate(0);clip-path:inset(0% 0 0 0);opacity:0}82.1%{opacity:.22}84%{transform:translate(6px,-2px);clip-path:inset(8% 0 70% 0)}86%{transform:translate(-5px,2px);clip-path:inset(42% 0 40% 0)}88%{transform:translate(3px);clip-path:inset(68% 0 10% 0)}91%{transform:translate(-4px,3px);clip-path:inset(18% 0 60% 0)}93%{transform:translate(5px,-3px);clip-path:inset(55% 0 20% 0)}95%{transform:translate(-3px,1px);clip-path:inset(10% 0 80% 0)}to{transform:translate(0);clip-path:inset(0% 0 0 0);opacity:0}}@keyframes login-glitch-shift-2-67f94dcc{0%,82%{transform:translate(0);clip-path:inset(0% 0 0 0);opacity:0}82.1%{opacity:.18}84%{transform:translate(-6px,2px);clip-path:inset(12% 0 65% 0)}86%{transform:translate(5px,-1px) skew(.6deg);clip-path:inset(36% 0 42% 0)}89%{transform:translate(-3px,2px);clip-path:inset(72% 0 8% 0)}92%{transform:translate(4px,-3px);clip-path:inset(22% 0 58% 0)}95%{transform:translate(-4px,1px);clip-path:inset(50% 0 26% 0)}to{transform:translate(0);clip-path:inset(0% 0 0 0);opacity:0}}@keyframes login-glitch-scan-67f94dcc{0%,82%{opacity:0;transform:translateY(-20%)}84%{opacity:.4}90%{opacity:.28}to{opacity:0;transform:translateY(115%)}}.bg-glitch-layer[data-v-67f94dcc]{position:absolute;inset:0;pointer-events:none;z-index:10;background:#ffffff1a;mix-blend-mode:overlay;opacity:0;animation:bg-glitch-flash-67f94dcc .5s ease-in-out}@keyframes bg-glitch-flash-67f94dcc{0%,to{opacity:0;transform:translate(0)}10%{opacity:.3;transform:translate(-3px)}20%{opacity:0;transform:translate(3px)}30%{opacity:.4;transform:translate(-2px)}40%{opacity:0;transform:translate(2px)}50%{opacity:.2;transform:translate(-1px)}60%{opacity:0;transform:translate(1px)}} diff --git a/neode-ui/dist/assets/OnboardingWrapper-BsOJSH8d.js b/neode-ui/dist/assets/OnboardingWrapper-BsOJSH8d.js new file mode 100644 index 0000000..b5df686 --- /dev/null +++ b/neode-ui/dist/assets/OnboardingWrapper-BsOJSH8d.js @@ -0,0 +1 @@ +import{d as R,w as _,o as S,c as b,a as n,_ as q,b as A,e as C,F as M,n as h,f as O,g as z,v as $,h as T,i as V,u as D,r as y,j as x,k as N,l as P,T as U,m as W,p as G,s as H,q as m,t as J}from"./index-DnbYEqLr.js";const K={class:"onb-viewport relative overflow-hidden"},Q={class:"bg-perspective-container"},X={class:"bg-glitch-layer"},Y={class:"perspective-container-wrapper"},Z={class:"perspective-container"},L="bg-intro-1.jpg",ee=R({__name:"OnboardingWrapper",setup(ae){const p=D(),l=y("bg-intro.jpg"),i=y(!1),s=y(!1),a=y(null),k=y("depth-forward"),j=["/onboarding/intro","/onboarding/path","/onboarding/options","/onboarding/did","/onboarding/identity","/onboarding/backup","/onboarding/verify","/onboarding/done","/login"],w=["/onboarding/intro","/login"],E=x(()=>p.path==="/login"),o=x(()=>w.includes(p.path)),I={"/onboarding/intro":"bg-intro.jpg","/onboarding/options":"bg-intro-4.jpg","/onboarding/path":"bg-intro-3.jpg","/onboarding/did":"bg-intro-5.jpg","/onboarding/identity":"bg-intro-5.jpg","/onboarding/backup":"bg-intro-6.jpg","/onboarding/verify":"bg-intro-2.jpg","/onboarding/done":"bg-intro-1.jpg","/login":"bg-intro.jpg"};function f(){if(a.value&&o.value){const e=sessionStorage.getItem("video_intro_currentTime"),t=sessionStorage.getItem("video_intro_wasPlaying")==="true",u=sessionStorage.getItem("video_intro_playbackRate");if(e){const v=parseFloat(e),r=u?parseFloat(u):1,c=()=>{a.value&&(a.value.playbackRate=r,a.value.currentTime=Math.max(0,v-.05),t&&requestAnimationFrame(()=>d()),sessionStorage.removeItem("video_intro_currentTime"),sessionStorage.removeItem("video_intro_wasPlaying"),sessionStorage.removeItem("video_intro_playbackRate"))};if(a.value.readyState>=2)c();else if(a.value.readyState>=1)c();else{const g=()=>{c(),a.value&&a.value.removeEventListener("loadedmetadata",g)};a.value.addEventListener("loadedmetadata",g,{once:!0})}}}}function d(e=3){const t=a.value;!t||!o.value||t.paused&&t.play().then(()=>{}).catch(()=>{e>0&&setTimeout(()=>d(e-1),300)})}_([o,p],([e])=>{e&&a.value&&requestAnimationFrame(()=>{a.value&&(f(),requestAnimationFrame(()=>{a.value&&a.value.paused&&d()}))})},{immediate:!0}),S(()=>{o.value&&a.value&&requestAnimationFrame(()=>{a.value&&(f(),requestAnimationFrame(()=>{a.value&&d()}))})}),_(a,e=>{e&&o.value&&requestAnimationFrame(()=>{if(e)if(e.readyState>=2)f();else if(e.readyState>=1)f();else{const t=()=>{f(),e.removeEventListener("loadedmetadata",t)};e.addEventListener("loadedmetadata",t,{once:!0})}})}),_(()=>p.path,(e,t)=>{const u=j.indexOf(t||""),v=j.indexOf(e);u>=0&&v>=0?k.value=v>=u?"slide-left":"slide-right":k.value="depth-forward";const r=I[e],c=w.includes(t||""),g=w.includes(e);if(c&&g&&a.value){a.value.paused&&d(),i.value=!1,s.value=!1;return}if((c||g)&&(i.value=!1,s.value=!1),e==="/login"){l.value="bg-intro-1.jpg",s.value=!1,i.value=!1;return}r&&r!==l.value&&(!g&&!c?(s.value=!0,l.value=r,setTimeout(()=>{i.value=!0,setTimeout(()=>{i.value=!1},500),s.value=!1},1550)):(l.value=r,s.value=!1,i.value=!1))});function B(e){o.value&&a.value&&(e.preventDefault(),d())}function F(){o.value&&a.value&&(a.value.currentTime=0,d())}return _(o,e=>{e?document.body.classList.add("video-background-active"):document.body.classList.remove("video-background-active")},{immediate:!0}),S(()=>{const e=I[p.path];if(e&&(l.value=e),o.value){s.value=!1,i.value=!1,document.body.classList.add("video-background-active");const t=()=>{N(),sessionStorage.getItem("archipelago_from_splash")!=="1"&&H(),document.removeEventListener("click",t),document.removeEventListener("touchstart",t),document.removeEventListener("keydown",t)};document.addEventListener("click",t,{once:!0}),document.addEventListener("touchstart",t,{once:!0}),document.addEventListener("keydown",t,{once:!0})}}),(e,t)=>{const u=P("RouterView");return m(),b("div",K,[n("div",Q,[o.value?(m(),b("video",{key:0,ref_key:"videoElement",ref:a,class:"bg-layer",autoplay:"",loop:"",muted:"",playsinline:"",preload:"auto",poster:q,style:{width:"100%",height:"100%","object-fit":"cover","object-position":"center",position:"absolute",inset:"0",transform:"scale(1)",transition:"none"},onPause:A(B,["prevent"]),onEnded:F},[...t[0]||(t[0]=[n("source",{src:C,type:"video/mp4"},null,-1)])],544)):E.value?(m(),b(M,{key:1},[n("div",{class:"bg-layer bg-login-static bg-fullwidth",style:h({backgroundImage:`url('/assets/img/${L}')`})},null,4),n("div",{class:"login-glitch-layer login-glitch-1",style:h({backgroundImage:`url('/assets/img/${L}')`})},null,4),n("div",{class:"login-glitch-layer login-glitch-2",style:h({backgroundImage:`url('/assets/img/${L}')`})},null,4),t[1]||(t[1]=n("div",{class:"login-glitch-scan"},null,-1))],64)):(m(),b("div",{class:O(["bg-layer bg-zoom",{"bg-zoom-in":s.value}]),style:h({backgroundImage:`url('/assets/img/${l.value}')`}),key:l.value},null,6)),z(n("div",X,null,512),[[$,i.value&&!o.value&&!E.value]])]),n("div",Y,[n("div",Z,[T(u,null,{default:V(({Component:v,route:r})=>[T(U,{name:k.value},{default:V(()=>[(m(),b("div",{key:r.path,class:"view-wrapper"},[(m(),W(G(v),{class:"view-container"}))]))]),_:2},1032,["name"])]),_:1})])])])}}}),oe=J(ee,[["__scopeId","data-v-67f94dcc"]]);export{oe as default}; diff --git a/neode-ui/dist/assets/PeerFiles-qTLuUhI-.js b/neode-ui/dist/assets/PeerFiles-qTLuUhI-.js new file mode 100644 index 0000000..3e68553 --- /dev/null +++ b/neode-ui/dist/assets/PeerFiles-qTLuUhI-.js @@ -0,0 +1 @@ +import{d as D,o as R,B as g,c as r,a as t,J as N,m as T,a1 as U,D as l,F as A,P as E,r as u,j as H,x as O,f as x,G as S,q as o}from"./index-DnbYEqLr.js";const G={class:"pb-6"},$={class:"shrink-0 mb-4"},q={class:"flex items-center gap-4"},J={class:"hidden md:block"},K={class:"text-2xl font-bold text-white"},Q={class:"text-sm text-white/50"},X={key:0,class:"glass-card p-8 text-center"},Y={key:1,class:"glass-card p-6"},Z={class:"text-red-400 text-sm mb-3"},ee={key:2,class:"glass-card p-8 text-center"},te={key:3,class:"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4"},ne=["d"],se={class:"flex-1 min-w-0"},oe={class:"text-sm font-medium text-white truncate"},re={class:"text-xs text-white/40"},ae={class:"flex items-center gap-2"},le=["disabled","onClick"],ce=D({__name:"PeerFiles",props:{peerId:{}},setup(b){const i=b,y=O(),c=u(!0),a=u(null),d=u(""),p=u([]),f=u(null),_=H(()=>a.value?.name?a.value.name:a.value?.did?C(a.value.did):i.peerId?B(i.peerId):"Peer Files");function v(){y.push({name:"cloud"})}R(async()=>{if(i.peerId){try{const n=(await g.federationListNodes())?.nodes??[];a.value=n.find(s=>s.onion===i.peerId)||null}catch{}await m()}else c.value=!1});async function m(){const e=i.peerId||a.value?.onion;if(e){c.value=!0,d.value="",p.value=[];try{const n=await g.call({method:"content.browse-peer",params:{onion:e},timeout:3e4});p.value=n?.items??[]}catch(n){d.value=n instanceof Error?n.message:"Failed to connect to peer"}finally{c.value=!1}}}function C(e){return e.length<=24?e:e.slice(0,16)+"..."+e.slice(-8)}function B(e){return e.length<=20?e:e.slice(0,12)+"..."}function M(e){if(e===0)return"0 B";const n=["B","KB","MB","GB"],s=Math.floor(Math.log(e)/Math.log(1024));return(e/Math.pow(1024,s)).toFixed(s>0?1:0)+" "+n[s]}function j(e){return e.startsWith("image/")?"bg-blue-500/15":e.startsWith("audio/")?"bg-orange-500/15":e.startsWith("video/")?"bg-pink-500/15":e.startsWith("text/")?"bg-green-500/15":"bg-white/10"}function I(e){return e.startsWith("image/")?"text-blue-400":e.startsWith("audio/")?"text-orange-400":e.startsWith("video/")?"text-pink-400":e.startsWith("text/")?"text-green-400":"text-white/60"}function W(e){return e.startsWith("image/")?"M4 16l4.586-4.586a2 2 0 012.828 0L16 16m-2-2l1.586-1.586a2 2 0 012.828 0L20 14m-6-6h.01M6 20h12a2 2 0 002-2V6a2 2 0 00-2-2H6a2 2 0 00-2 2v12a2 2 0 002 2z":e.startsWith("audio/")?"M9 19V6l12-3v13M9 19c0 1.105-1.343 2-3 2s-3-.895-3-2 1.343-2 3-2 3 .895 3 2zm12-3c0 1.105-1.343 2-3 2s-3-.895-3-2 1.343-2 3-2 3 .895 3 2zM9 10l12-3":e.startsWith("video/")?"M15 10l4.553-2.276A1 1 0 0121 8.618v6.764a1 1 0 01-1.447.894L15 14M5 18h8a2 2 0 002-2V8a2 2 0 00-2-2H5a2 2 0 00-2 2v8a2 2 0 002 2z":"M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"}function z(e){return e==="free"?"Free":e==="peersonly"?"Peers Only":typeof e=="object"&&"paid"in e?`${e.paid.price_sats} sats`:String(e)}function L(e){return e==="free"?"bg-green-500/15 text-green-400":e==="peersonly"?"bg-blue-500/15 text-blue-400":typeof e=="object"&&"paid"in e?"bg-orange-500/15 text-orange-400":"bg-white/10 text-white/50"}function V(e){return e==="free"||e==="peersonly"}async function F(e){const n=i.peerId||a.value?.onion;if(n){f.value=e.id;try{const s=await g.call({method:"content.download-peer",params:{onion:n,content_id:e.id},timeout:12e4});if(s?.data){const w=new Blob([Uint8Array.from(atob(s.data),P=>P.charCodeAt(0))],{type:e.mime_type}),k=URL.createObjectURL(w),h=document.createElement("a");h.href=k,h.download=e.filename.split("/").pop()||e.filename,h.click(),URL.revokeObjectURL(k)}}catch{}finally{f.value=null}}}return(e,n)=>(o(),r("div",G,[t("div",$,[t("button",{onClick:v,class:"hidden md:flex mb-4 items-center gap-2 text-white/70 hover:text-white transition-colors"},[...n[0]||(n[0]=[t("svg",{class:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[t("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M15 19l-7-7 7-7"})],-1),N(" Back to Cloud ",-1)])]),(o(),T(U,{to:"body"},[t("button",{onClick:v,class:"md:hidden mobile-back-btn glass-button px-6 py-3 rounded-lg font-medium shadow-2xl flex items-center justify-center gap-2"},[...n[1]||(n[1]=[t("svg",{class:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[t("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M15 19l-7-7 7-7"})],-1),t("span",null,"Back to Cloud",-1)])])])),t("div",q,[n[2]||(n[2]=t("div",{class:"flex-shrink-0 w-12 h-12 rounded-xl flex items-center justify-center bg-purple-500/15"},[t("svg",{class:"w-7 h-7 text-purple-400",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[t("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M5 12h14M5 12a2 2 0 01-2-2V6a2 2 0 012-2h14a2 2 0 012 2v4a2 2 0 01-2 2M5 12a2 2 0 00-2 2v4a2 2 0 002 2h14a2 2 0 002-2v-4a2 2 0 00-2-2"})])],-1)),t("div",J,[t("h1",K,l(_.value),1),t("p",Q,l(a.value?.onion||"Peer files"),1)])])]),c.value?(o(),r("div",X,[...n[3]||(n[3]=[t("svg",{class:"animate-spin h-6 w-6 text-purple-400 mx-auto mb-2",xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24"},[t("circle",{class:"opacity-25",cx:"12",cy:"12",r:"10",stroke:"currentColor","stroke-width":"4"}),t("path",{class:"opacity-75",fill:"currentColor",d:"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"})],-1),t("p",{class:"text-white/50 text-sm"},"Connecting via Tor... This may take a few seconds.",-1)])])):d.value?(o(),r("div",Y,[t("p",Z,l(d.value),1),t("button",{class:"glass-button px-4 py-2 rounded-lg text-sm",onClick:m},"Retry")])):p.value.length===0&&!c.value?(o(),r("div",ee,[...n[4]||(n[4]=[t("p",{class:"text-white/50"},"This peer has no shared files.",-1)])])):(o(),r("div",te,[(o(!0),r(A,null,E(p.value,s=>(o(),r("div",{key:s.id,class:"glass-card p-4 flex items-center gap-4"},[t("div",{class:x(["flex-shrink-0 w-10 h-10 rounded-lg flex items-center justify-center",j(s.mime_type)])},[(o(),r("svg",{class:x(["w-5 h-5",I(s.mime_type)]),fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[t("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:W(s.mime_type)},null,8,ne)],2))],2),t("div",se,[t("p",oe,l(s.filename),1),t("p",re,l(M(s.size_bytes)),1)]),t("div",ae,[t("span",{class:x(["text-xs px-2 py-0.5 rounded-full",L(s.access)])},l(z(s.access)),3),V(s.access)?(o(),r("button",{key:0,class:"glass-button px-3 py-1.5 rounded-lg text-xs font-medium",disabled:f.value===s.id,onClick:w=>F(s)},l(f.value===s.id?"...":"Download"),9,le)):S("",!0)])]))),128))]))]))}});export{ce as default}; diff --git a/neode-ui/dist/assets/RootRedirect-DU0Atc8N.css b/neode-ui/dist/assets/RootRedirect-DU0Atc8N.css new file mode 100644 index 0000000..b3a82bb --- /dev/null +++ b/neode-ui/dist/assets/RootRedirect-DU0Atc8N.css @@ -0,0 +1 @@ +.root-redirect-fade[data-v-e4035a68]{animation:root-fade-in-e4035a68 .3s ease .5s forwards}@keyframes root-fade-in-e4035a68{to{opacity:1}} diff --git a/neode-ui/dist/assets/RootRedirect-_cfWJoe8.js b/neode-ui/dist/assets/RootRedirect-_cfWJoe8.js new file mode 100644 index 0000000..f40e97f --- /dev/null +++ b/neode-ui/dist/assets/RootRedirect-_cfWJoe8.js @@ -0,0 +1 @@ +import{d as r,o as c,c as l,a as t,x as n,q as i,t as p}from"./index-DnbYEqLr.js";import{isOnboardingComplete as m}from"./useOnboarding-BgpIyX9l.js";const d={class:"min-h-full flex items-center justify-center"},f=r({__name:"RootRedirect",setup(u){const o=n();return c(async()=>{if(localStorage.getItem("neode_onboarding_complete")==="1"){o.replace("/login").catch(()=>{});return}let e=!1;try{e=await Promise.race([m(),new Promise(a=>setTimeout(()=>a(!1),3e3))])}catch{e=!1}o.replace(e?"/login":"/onboarding/intro").catch(()=>{})}),(s,e)=>(i(),l("div",d,[...e[0]||(e[0]=[t("div",{class:"flex flex-col items-center gap-4 opacity-0 root-redirect-fade"},[t("svg",{class:"animate-spin h-8 w-8 text-white/60",xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24"},[t("circle",{class:"opacity-25",cx:"12",cy:"12",r:"10",stroke:"currentColor","stroke-width":"4"}),t("path",{class:"opacity-75",fill:"currentColor",d:"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"})])],-1)])]))}}),h=p(f,[["__scopeId","data-v-e4035a68"]]);export{h as default}; diff --git a/neode-ui/dist/assets/Server-BNJJbUQb.js b/neode-ui/dist/assets/Server-BNJJbUQb.js new file mode 100644 index 0000000..6e0e52e --- /dev/null +++ b/neode-ui/dist/assets/Server-BNJJbUQb.js @@ -0,0 +1 @@ +import{d as be,o as ke,w as ee,B as c,c as n,f as h,a as e,D as o,G as v,N as U,F as p,P as f,J as te,b as se,g as le,H as ne,I as ye,h as _e,i as Ce,T as Se,r,j as O,n as je,q as i}from"./index-DnbYEqLr.js";const De={class:"pb-6"},Ne={class:"flex items-center gap-3"},Me={class:"text-xs text-white/60"},Pe=["disabled"],$e={class:"glass-card p-6 mb-6"},Be={class:"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-4"},He={"data-controller-container":"",tabindex:"0",class:"flex flex-col gap-3 p-4 bg-white/5 rounded-lg min-w-0"},Te={class:"flex items-center gap-3 min-w-0"},Ae={class:"relative shrink-0"},Le={key:0,class:"absolute inset-0 w-3 h-3 rounded-full bg-green-400 animate-ping opacity-75"},ze={class:"min-w-0"},Ve={class:"text-xs text-white/60"},We=["disabled"],Fe={"data-controller-container":"",tabindex:"0",class:"flex flex-col gap-3 p-4 bg-white/5 rounded-lg min-w-0"},Re={class:"flex items-center gap-3 min-w-0"},Ee={class:"relative shrink-0"},Ie={key:0,class:"absolute inset-0 w-3 h-3 rounded-full bg-green-400 animate-ping opacity-75"},Ue={class:"min-w-0"},Oe={class:"text-xs text-white/60 capitalize"},qe=["disabled"],Ge={"data-controller-container":"",tabindex:"0",class:"flex flex-col gap-3 p-4 bg-white/5 rounded-lg min-w-0"},Ke={class:"flex items-center justify-between min-w-0"},Je={class:"flex items-center gap-3 min-w-0"},Qe={class:"min-w-0"},Xe={class:"text-xs text-white/60"},Ye={"data-controller-container":"",tabindex:"0",class:"flex flex-col gap-3 p-4 bg-white/5 rounded-lg min-w-0"},Ze={class:"flex items-center gap-3 min-w-0"},et={class:"min-w-0"},tt={class:"text-xs text-white/60"},st={class:"grid grid-cols-1 lg:grid-cols-2 gap-6 mb-8"},lt={"data-controller-container":"",tabindex:"0",class:"glass-card p-6 flex flex-col"},nt={class:"space-y-3 flex-1 min-h-0"},it={class:"flex items-center justify-between p-3 bg-white/5 rounded-lg"},ot={class:"text-white/60 text-sm"},at={class:"flex items-center justify-between p-3 bg-white/5 rounded-lg"},rt={class:"flex items-center justify-between p-3 bg-white/5 rounded-lg"},dt={class:"text-white/60 text-sm"},ut={class:"flex items-center justify-between p-3 bg-white/5 rounded-lg"},ct={class:"glass-card p-6 mb-6"},vt={class:"flex items-center justify-between mb-4"},ht={key:0,class:"space-y-3"},mt={key:1,class:"space-y-3"},pt={class:"flex items-center gap-3"},xt={class:"text-sm font-medium text-white"},wt={class:"text-xs text-white/50"},ft={class:"text-right"},gt={key:0,class:"text-sm text-white/80"},bt={key:1,class:"text-sm text-white/40"},kt={key:0,class:"text-sm text-white/50 text-center py-4"},yt={class:"glass-card px-6 py-6 mb-6"},_t={key:0,class:"text-sm text-white/40 py-4 text-center"},Ct={key:1,class:"text-sm text-white/40 py-4 text-center"},St={key:2,class:"space-y-2"},jt={class:"flex-1 min-w-0"},Dt={class:"text-white text-sm font-medium"},Nt=["title","onClick"],Mt={key:1,class:"text-white/30 text-xs"},Pt={class:"flex items-center gap-2 shrink-0"},$t=["onClick","disabled"],Bt={class:"tor-toggle-label"},Ht=["checked","onChange"],Tt={class:"glass-card p-6 w-full max-w-md"},At={class:"flex items-center justify-between mb-4"},Lt={key:0,class:"space-y-3"},zt={key:1,class:"space-y-2 max-h-72 overflow-y-auto"},Vt=["onClick"],Wt={class:"text-sm font-medium text-white"},Ft={class:"text-xs text-white/50"},Rt={class:"flex items-center gap-2"},Et={class:"flex gap-0.5"},It={class:"text-xs text-white/50"},Ut={key:2,class:"text-sm text-white/50 text-center py-8"},Ot={key:3,class:"mt-4 pt-4 border-t border-white/10"},qt={class:"text-sm text-white/80 mb-2"},Gt={class:"font-medium text-white"},Kt={key:0,class:"text-sm text-red-400 mb-3"},Jt={class:"flex gap-2"},Qt=["disabled"],Xt=["disabled"],Yt={class:"glass-card p-6 w-full max-w-md"},Zt={class:"flex items-center justify-between mb-4"},es={class:"space-y-2 mb-4"},ts=["onClick"],ss={class:"text-sm font-medium text-white"},ls={class:"text-xs text-white/50"},ns={key:0,class:"text-xs px-2 py-0.5 rounded-full bg-green-400/20 text-green-400"},is={key:0,class:"mb-4"},os={key:1,class:"mb-4 p-3 bg-white/5 rounded-lg"},as={class:"text-sm text-white/80"},rs={key:2,class:"text-sm text-red-400 mb-3"},ds={class:"flex gap-2"},us=["disabled"],cs={key:0,class:"fixed bottom-20 left-1/2 -translate-x-1/2 z-50 max-w-md w-full px-4"},vs={class:"bg-white/10 border border-white/20 backdrop-blur-sm rounded-lg px-4 py-3 text-white/80 text-sm flex items-center justify-between gap-3"},ps=be({__name:"Server",setup(hs){const q=r(0),b=r(!0),S=r(!1),x=r("connected"),$=r(!1),j=r(!0),W=r(0),F=r(!0),a=r({wifiCount:"N/A",torConnected:!1,forwardCount:"N/A",vpnConnected:!1,vpnProvider:"",vpnIp:"",vpnHostname:"",vpnPeers:0,dnsProvider:"system",dnsServers:[],dnsDoH:!1});async function ie(){F.value=!0;try{const[l,t,s,d]=await Promise.allSettled([c.call({method:"network.diagnostics"}),c.call({method:"router.list-forwards"}),c.vpnStatus(),c.dnsStatus()]);if(l.status==="fulfilled"&&(a.value.torConnected=l.value.tor_connected,a.value.wifiCount=l.value.wifi_count!==void 0?`${l.value.wifi_count} configured`:"N/A"),t.status==="fulfilled"){const Z=t.value.forwards?.length??0;a.value.forwardCount=`${Z} rule${Z!==1?"s":""}`}s.status==="fulfilled"&&(a.value.vpnConnected=s.value.connected,a.value.vpnProvider=s.value.provider??"",a.value.vpnIp=s.value.ip_address??"",a.value.vpnHostname=s.value.hostname??"",a.value.vpnPeers=s.value.peers_connected),d.status==="fulfilled"&&(a.value.dnsProvider=d.value.provider,a.value.dnsServers=d.value.resolv_conf_servers??[],a.value.dnsDoH=d.value.doh_enabled)}catch{}finally{F.value=!1}}async function oe(){try{const l=await c.listPeers();q.value=l.peers?.length??0}catch{q.value=0}}const R=r(!0),B=r([]),G=O(()=>B.value.filter(l=>l.type==="ethernet"||l.type==="wifi")),ae=O(()=>B.value.some(l=>l.type==="wifi")),k=r(!1),E=r(!1),D=r([]),H=r(!1),N=r(!1),T=r(""),w=r(""),M=r(""),g=r(!1),y=r("system"),_=r(""),A=r(!1),C=r(""),K=[{value:"system",label:"System Default",description:"DHCP-assigned DNS servers",doh:!1},{value:"cloudflare",label:"Cloudflare",description:"1.1.1.1 / 1.0.0.1",doh:!0},{value:"google",label:"Google",description:"8.8.8.8 / 8.8.4.4",doh:!0},{value:"quad9",label:"Quad9",description:"9.9.9.9 / 149.112.112.112",doh:!0},{value:"mullvad",label:"Mullvad",description:"194.242.2.2 (no logging)",doh:!0},{value:"custom",label:"Custom",description:"Enter your own DNS servers",doh:!1}],re=O(()=>{const l=a.value.dnsProvider,t=K.find(s=>s.value===l);return t&&l!=="system"?`${t.label}${a.value.dnsDoH?" (DoH)":""}`:a.value.dnsServers.length>0?a.value.dnsServers.slice(0,2).join(", "):"System Default"});async function de(){A.value=!0,C.value="";try{const l=y.value,t={provider:l};l==="custom"&&(t.servers=_.value.split(",").map(d=>d.trim()).filter(d=>d.length>0));const s=await c.configureDns(t);a.value.dnsProvider=s.provider,a.value.dnsServers=s.servers,a.value.dnsDoH=s.doh_enabled,g.value=!1}catch(l){C.value=l instanceof Error?l.message:"DNS configuration failed. Please try again."}finally{A.value=!1}}async function J(){R.value=!0;try{const l=await c.call({method:"network.list-interfaces"});B.value=l.interfaces}catch{B.value=[]}finally{R.value=!1}}async function ue(){E.value=!0,D.value=[];try{const l=await c.call({method:"network.scan-wifi"});D.value=l.networks}catch{D.value=[]}finally{E.value=!1}}function ce(l){T.value=l,w.value="",H.value=!0}async function Q(){if(!(!w.value||!T.value)){M.value="",N.value=!0;try{await c.call({method:"network.configure-wifi",params:{ssid:T.value,password:w.value}}),k.value=!1,H.value=!1,w.value="",u.value="WiFi connected successfully",setTimeout(()=>{u.value=""},4e3),J()}catch(l){M.value=l instanceof Error?l.message:"WiFi connection failed. Check password and try again."}finally{N.value=!1}}}const m=r(null),L=r(!1);async function X(){try{const l=await c.diskStatus();l.level==="warning"||l.level==="critical"?m.value={level:l.level,used_percent:l.used_percent,free_bytes:l.free_bytes}:m.value=null}catch{}}async function ve(){L.value=!0;try{await c.diskCleanup(),await X(),u.value="Disk cleanup completed",setTimeout(()=>{u.value=""},4e3)}catch(l){u.value=`Disk cleanup failed: ${l instanceof Error?l.message:"Unknown error"}`,setTimeout(()=>{u.value=""},6e3)}finally{L.value=!1}}function he(l){return l>=1073741824?`${(l/1073741824).toFixed(1)} GB`:l>=1048576?`${(l/1048576).toFixed(0)} MB`:`${(l/1024).toFixed(0)} KB`}const P=r([]),I=r(!1);async function z(){I.value=!0;try{const l=await c.call({method:"tor.list-services"});P.value=l.services||[]}catch{P.value=[]}finally{I.value=!1}}const V=r(!1);function me(l){navigator.clipboard.writeText(l),u.value="Onion address copied to clipboard",setTimeout(()=>{u.value=""},3e3)}async function pe(l,t){try{await c.call({method:"tor.toggle-app",params:{app_id:l,enabled:t}}),await z()}catch{}}async function xe(l){V.value=l;try{await c.call({method:"tor.rotate-service",params:{name:l}}),await z()}catch{}finally{V.value=!1}}ke(()=>{Y(),ie(),oe(),J(),X(),z()}),ee(k,l=>{l&&ue()}),ee(g,l=>{l&&(y.value=a.value.dnsProvider||"system",_.value="",C.value="")});async function we(){S.value=!0,b.value=!1;try{await c.restartServer(),u.value="Services restarting...",setTimeout(()=>{u.value=""},4e3)}catch(t){u.value=`Restart failed: ${t instanceof Error?t.message:"Unknown error"}`,setTimeout(()=>{u.value=""},6e3)}(async t=>{for(let s=0;ssetTimeout(d,2e3));try{await c.call({method:"server.health",params:{}}),b.value=!0,S.value=!1;return}catch{}}S.value=!1,b.value=!1,x.value="disconnected"})(15)}async function Y(){$.value=!0,x.value="checking";try{await c.call({method:"server.health",params:{}}),x.value="connected"}catch{x.value="disconnected"}finally{$.value=!1}}function fe(){j.value=!j.value}const u=r("");function ge(){W.value=0,u.value="Server logs are available via SSH: journalctl -u archipelago -f",setTimeout(()=>{u.value=""},6e3)}return(l,t)=>(i(),n("div",De,[m.value?(i(),n("div",{key:0,class:h(["mb-6 p-4 rounded-xl border flex items-center justify-between",m.value.level==="critical"?"bg-red-500/10 border-red-500/30":"bg-yellow-500/10 border-yellow-500/30"])},[e("div",Ne,[(i(),n("svg",{xmlns:"http://www.w3.org/2000/svg",class:h(["h-5 w-5 shrink-0",m.value.level==="critical"?"text-red-400":"text-yellow-400"]),fill:"none",viewBox:"0 0 24 24",stroke:"currentColor"},[...t[11]||(t[11]=[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-2.5L13.732 4.5c-.77-.833-2.694-.833-3.464 0L3.34 16.5c-.77.833.192 2.5 1.732 2.5z"},null,-1)])],2)),e("div",null,[e("p",{class:h(["text-sm font-medium",m.value.level==="critical"?"text-red-300":"text-yellow-300"])},o(m.value.level==="critical"?"Disk Space Critical":"Disk Space Warning"),3),e("p",Me,o(m.value.used_percent.toFixed(1))+"% used — "+o(he(m.value.free_bytes))+" remaining ",1)])]),e("button",{class:"glass-button glass-button-sm px-3 py-1.5 text-xs font-medium rounded",disabled:L.value,onClick:ve},o(L.value?"Cleaning...":"Clean Up"),9,Pe)],2)):v("",!0),e("div",$e,[e("div",Be,[e("div",He,[e("div",Te,[e("div",Ae,[e("div",{class:h(["w-3 h-3 rounded-full",b.value?"bg-green-400":"bg-red-400"])},null,2),b.value?(i(),n("div",Le)):v("",!0)]),e("div",ze,[t[12]||(t[12]=e("p",{class:"text-sm font-medium text-white"},"Services",-1)),e("p",Ve,o(b.value?"All Running":"Some Stopped"),1)])]),e("button",{onClick:we,class:"w-full min-h-[44px] glass-button rounded-lg text-sm font-medium text-white/90 hover:text-white transition-colors disabled:opacity-50 flex items-center justify-center",disabled:S.value},o(S.value?"Restarting...":"Restart"),9,We)]),e("div",Fe,[e("div",Re,[e("div",Ee,[e("div",{class:h(["w-3 h-3 rounded-full",x.value==="connected"?"bg-green-400":x.value==="checking"?"bg-yellow-400":"bg-red-400"])},null,2),x.value==="connected"?(i(),n("div",Ie)):v("",!0)]),e("div",Ue,[t[13]||(t[13]=e("p",{class:"text-sm font-medium text-white"},"Connectivity",-1)),e("p",Oe,o(x.value),1)])]),e("button",{onClick:Y,class:"w-full min-h-[44px] glass-button rounded-lg text-sm font-medium text-white/90 hover:text-white transition-colors disabled:opacity-50 flex items-center justify-center",disabled:$.value},o($.value?"Checking...":"Check"),9,qe)]),e("div",Ge,[e("div",Ke,[e("div",Je,[t[15]||(t[15]=e("svg",{class:"w-5 h-5 text-white/60 shrink-0",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M8.684 13.342C8.886 12.938 9 12.482 9 12c0-.482-.114-.938-.316-1.342m0 2.684a3 3 0 110-2.684m0 2.684l6.632 3.316m-6.632-6l6.632-3.316m0 0a3 3 0 105.367-2.684 3 3 0 00-5.367 2.684zm0 9.316a3 3 0 105.368 2.684 3 3 0 00-5.368-2.684z"})],-1)),e("div",Qe,[t[14]||(t[14]=e("p",{class:"text-sm font-medium text-white"},"Auto-Sync",-1)),e("p",Xe,o(j.value?"Enabled":"Disabled"),1)])]),e("button",{onClick:fe,class:h(["relative inline-flex h-8 w-14 items-center rounded-full transition-colors shrink-0",j.value?"bg-green-500":"bg-white/20"])},[e("span",{class:h(["inline-block h-6 w-6 transform rounded-full bg-white transition-transform shadow",j.value?"translate-x-7":"translate-x-1"])},null,2)],2)])]),e("div",Ye,[e("div",Ze,[t[17]||(t[17]=e("svg",{class:"w-5 h-5 text-white/60 shrink-0",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"})],-1)),e("div",et,[t[16]||(t[16]=e("p",{class:"text-sm font-medium text-white"},"Logs",-1)),e("p",tt,o(W.value>0?`${W.value} new`:"No new logs"),1)])]),e("button",{onClick:ge,class:"w-full min-h-[44px] glass-button rounded-lg text-sm font-medium text-white/90 hover:text-white transition-colors flex items-center justify-center"}," View ")])])]),e("div",st,[e("div",lt,[t[25]||(t[25]=U('

Local Network

OpenWRT-integrated router and network management

',1)),e("div",nt,[F.value?(i(),n(p,{key:0},f(4,s=>e("div",{key:s,class:"flex items-center justify-between p-3 bg-white/5 rounded-lg animate-pulse"},[...t[18]||(t[18]=[e("div",{class:"flex items-center gap-3"},[e("div",{class:"w-5 h-5 bg-white/10 rounded"}),e("div",{class:"w-24 h-4 bg-white/10 rounded"})],-1),e("div",{class:"w-16 h-4 bg-white/10 rounded"},null,-1)])])),64)):(i(),n(p,{key:1},[t[24]||(t[24]=U('
Firewall Active
Protected
',1)),e("div",it,[t[19]||(t[19]=e("div",{class:"flex items-center gap-3"},[e("svg",{class:"w-5 h-5 text-white/60",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 15v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2zm10-10V7a4 4 0 00-8 0v4h8z"})]),e("span",{class:"text-white/80 text-sm"},"WiFi Networks")],-1)),e("span",ot,o(a.value.wifiCount),1)]),e("div",at,[t[20]||(t[20]=e("div",{class:"flex items-center gap-3"},[e("svg",{class:"w-5 h-5 text-white/60",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M21 12a9 9 0 01-9 9m9-9a9 9 0 00-9-9m9 9H3m9 9a9 9 0 01-9-9m9 9c1.657 0 3-4.03 3-9s-1.343-9-3-9m0 18c-1.657 0-3-4.03-3-9s1.343-9 3-9m-9 9a9 9 0 019-9"})]),e("span",{class:"text-white/80 text-sm"},"Connectivity")],-1)),e("span",{class:h(["text-sm",a.value.torConnected?"text-green-400":"text-white/60"])},o(a.value.torConnected?"Tor Connected":"N/A"),3)]),e("div",rt,[t[21]||(t[21]=e("div",{class:"flex items-center gap-3"},[e("svg",{class:"w-5 h-5 text-white/60",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M13 10V3L4 14h7v7l9-11h-7z"})]),e("span",{class:"text-white/80 text-sm"},"Port Forwarding")],-1)),e("span",dt,o(a.value.forwardCount),1)]),e("div",ut,[t[22]||(t[22]=e("div",{class:"flex items-center gap-3"},[e("svg",{class:"w-5 h-5 text-white/60",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 15v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2zm10-10V7a4 4 0 00-8 0v4h8z"})]),e("span",{class:"text-white/80 text-sm"},"VPN")],-1)),e("span",{class:h(["text-sm",a.value.vpnConnected?"text-green-400":"text-white/40"])},o(a.value.vpnConnected?`${a.value.vpnProvider} (${a.value.vpnIp})`:"Not Connected"),3)]),e("button",{class:"w-full flex items-center justify-between p-3 bg-white/5 rounded-lg hover:bg-white/10 transition-colors text-left",onClick:t[0]||(t[0]=s=>g.value=!0)},[t[23]||(t[23]=e("div",{class:"flex items-center gap-3"},[e("svg",{class:"w-5 h-5 text-white/60",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M21 12a9 9 0 01-9 9m9-9a9 9 0 00-9-9m9 9H3m9 9a9 9 0 01-9-9m9 9c1.657 0 3-4.03 3-9s-1.343-9-3-9m0 18c-1.657 0-3-4.03-3-9s1.343-9 3-9"})]),e("span",{class:"text-white/80 text-sm"},"DNS")],-1)),e("span",{class:h(["text-sm",a.value.dnsProvider!=="system"?"text-green-400":"text-white/60"])},o(re.value),3)])],64))]),t[26]||(t[26]=e("button",{disabled:"",title:"Coming Soon",class:"mt-4 w-full min-h-[44px] glass-button rounded-lg text-sm font-medium opacity-50 cursor-not-allowed flex items-center justify-center"}," Manage Local Network ",-1))]),t[27]||(t[27]=U('

Web3

Decentralized web hosting and services

Hosted Websites
Coming Soon
SSL Certificates
Coming Soon
IPFS Storage
Coming Soon
ENS Domains
Coming Soon
',1))]),e("div",ct,[e("div",vt,[t[28]||(t[28]=e("div",null,[e("h2",{class:"text-xl font-semibold text-white mb-1"},"Network Interfaces"),e("p",{class:"text-sm text-white/60"},"Detected hardware and virtual interfaces")],-1)),ae.value?(i(),n("button",{key:0,onClick:t[1]||(t[1]=s=>k.value=!0),class:"px-3 py-1.5 glass-button rounded text-xs font-medium text-white/90 hover:text-white transition-colors"}," Scan WiFi ")):v("",!0)]),R.value?(i(),n("div",ht,[(i(),n(p,null,f(3,s=>e("div",{key:s,class:"p-3 bg-white/5 rounded-lg animate-pulse h-14"})),64))])):(i(),n("div",mt,[(i(!0),n(p,null,f(G.value,s=>(i(),n("div",{key:s.name,class:"flex items-center justify-between p-3 bg-white/5 rounded-lg"},[e("div",pt,[e("div",{class:h(["w-2 h-2 rounded-full",s.state==="up"?"bg-green-400":"bg-white/30"])},null,2),e("div",null,[e("p",xt,o(s.name),1),e("p",wt,o(s.type==="wifi"?"WiFi":"Ethernet")+" · "+o(s.mac),1)])]),e("div",ft,[s.ipv4.length>0?(i(),n("p",gt,o(s.ipv4[0]),1)):(i(),n("p",bt,"No IP"))])]))),128)),G.value.length===0?(i(),n("p",kt,"No physical interfaces detected")):v("",!0)]))]),e("div",yt,[e("div",{class:"flex items-center justify-between mb-4"},[t[30]||(t[30]=e("div",null,[e("h2",{class:"text-xl font-semibold text-white/96"},"Tor Services"),e("p",{class:"text-sm text-white/60 mt-1"},"Manage hidden service addresses for your node and apps")],-1)),e("button",{onClick:z,class:"glass-button px-4 py-2 rounded-lg text-sm flex items-center gap-2"},[...t[29]||(t[29]=[e("svg",{class:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15"})],-1),te(" Refresh ",-1)])])]),I.value&&P.value.length===0?(i(),n("div",_t,"Loading Tor services...")):P.value.length===0?(i(),n("div",Ct,"No Tor services configured")):(i(),n("div",St,[(i(!0),n(p,null,f(P.value,s=>(i(),n("div",{key:s.name,class:"bg-black/20 rounded-xl border border-white/10 p-3 flex items-center justify-between gap-3"},[e("div",jt,[e("p",Dt,o(s.name),1),s.onion_address?(i(),n("p",{key:0,class:"text-amber-300/80 text-xs font-mono truncate cursor-pointer",title:s.onion_address,onClick:d=>me(s.onion_address)},o(s.onion_address),9,Nt)):(i(),n("p",Mt,"No .onion address"))]),e("div",Pt,[s.onion_address&&s.enabled?(i(),n("button",{key:0,onClick:d=>xe(s.name),disabled:V.value===s.name,class:"glass-button px-3 py-1.5 rounded-lg text-xs"},o(V.value===s.name?"Rotating...":"Rotate"),9,$t)):v("",!0),e("label",Bt,[e("input",{type:"checkbox",checked:s.enabled,onChange:d=>pe(s.name,!s.enabled),class:"tor-toggle-input"},null,40,Ht),t[31]||(t[31]=e("span",{class:"tor-toggle-slider"},null,-1))])])]))),128))]))]),k.value?(i(),n("div",{key:1,class:"fixed inset-0 bg-black/10 backdrop-blur-md z-50 flex items-center justify-center p-4",onClick:t[5]||(t[5]=se(s=>k.value=!1,["self"]))},[e("div",Tt,[e("div",At,[t[33]||(t[33]=e("h3",{class:"text-lg font-semibold text-white"},"WiFi Networks",-1)),e("button",{onClick:t[2]||(t[2]=s=>k.value=!1),class:"text-white/40 hover:text-white transition-colors"},[...t[32]||(t[32]=[e("svg",{class:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M6 18L18 6M6 6l12 12"})],-1)])])]),E.value?(i(),n("div",Lt,[(i(),n(p,null,f(4,s=>e("div",{key:s,class:"p-3 bg-white/5 rounded-lg animate-pulse h-12"})),64))])):D.value.length>0?(i(),n("div",zt,[(i(!0),n(p,null,f(D.value,s=>(i(),n("button",{key:s.ssid,class:"w-full flex items-center justify-between p-3 bg-white/5 rounded-lg hover:bg-white/10 transition-colors text-left",onClick:d=>ce(s.ssid)},[e("div",null,[e("p",Wt,o(s.ssid),1),e("p",Ft,o(s.security||"Open"),1)]),e("div",Rt,[e("div",Et,[(i(),n(p,null,f(4,d=>e("div",{key:d,class:h(["w-1 rounded-full",d<=Math.ceil(s.signal/25)?"bg-white/80":"bg-white/20"]),style:je({height:d*3+4+"px"})},null,6)),64))]),e("span",It,o(s.signal)+"%",1)])],8,Vt))),128))])):(i(),n("p",Ut,"No networks found")),H.value?(i(),n("div",Ot,[e("p",qt,[t[34]||(t[34]=te("Connect to ",-1)),e("span",Gt,o(T.value),1)]),le(e("input",{"onUpdate:modelValue":t[3]||(t[3]=s=>w.value=s),type:"password",placeholder:"WiFi password",class:"w-full px-3 py-2 bg-white/5 border border-white/10 rounded-lg text-white text-sm placeholder-white/30 focus:outline-none focus:border-white/30 mb-3",onKeyup:ye(Q,["enter"])},null,544),[[ne,w.value]]),M.value?(i(),n("p",Kt,o(M.value),1)):v("",!0),e("div",Jt,[e("button",{onClick:t[4]||(t[4]=s=>{H.value=!1,w.value="",M.value=""}),disabled:N.value,class:"flex-1 px-3 py-2 glass-button rounded-lg text-sm"},"Cancel",8,Qt),e("button",{onClick:Q,class:"flex-1 px-3 py-2 glass-button rounded-lg text-sm font-medium disabled:opacity-50 disabled:cursor-not-allowed",disabled:!w.value||N.value},o(N.value?"Connecting...":"Connect"),9,Xt)])])):v("",!0)])])):v("",!0),g.value?(i(),n("div",{key:2,class:"fixed inset-0 bg-black/10 backdrop-blur-md z-50 flex items-center justify-center p-4",onClick:t[9]||(t[9]=se(s=>g.value=!1,["self"]))},[e("div",Yt,[e("div",Zt,[t[36]||(t[36]=e("h3",{class:"text-lg font-semibold text-white"},"DNS Configuration",-1)),e("button",{onClick:t[6]||(t[6]=s=>g.value=!1),class:"text-white/40 hover:text-white transition-colors"},[...t[35]||(t[35]=[e("svg",{class:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M6 18L18 6M6 6l12 12"})],-1)])])]),t[39]||(t[39]=e("p",{class:"text-sm text-white/60 mb-4"},"Choose a DNS provider. Providers with DoH encrypt your DNS queries.",-1)),e("div",es,[(i(),n(p,null,f(K,s=>e("button",{key:s.value,class:h(["w-full flex items-center justify-between p-3 rounded-lg transition-colors text-left",y.value===s.value?"bg-white/15 border border-white/20":"bg-white/5 border border-transparent hover:bg-white/10"]),onClick:d=>{y.value=s.value,_.value=""}},[e("div",null,[e("p",ss,o(s.label),1),e("p",ls,o(s.description),1)]),s.doh?(i(),n("span",ns,"DoH")):v("",!0)],10,ts)),64))]),y.value==="custom"?(i(),n("div",is,[t[37]||(t[37]=e("label",{class:"block text-sm text-white/70 mb-1"},"DNS Servers (comma-separated)",-1)),le(e("input",{"onUpdate:modelValue":t[7]||(t[7]=s=>_.value=s),type:"text",placeholder:"1.1.1.1, 8.8.8.8",class:"w-full px-3 py-2 bg-white/5 border border-white/10 rounded-lg text-white text-sm placeholder-white/30 focus:outline-none focus:border-white/30"},null,512),[[ne,_.value]])])):v("",!0),a.value.dnsServers.length>0?(i(),n("div",os,[t[38]||(t[38]=e("p",{class:"text-xs text-white/50 mb-1"},"Current resolv.conf servers",-1)),e("p",as,o(a.value.dnsServers.join(", ")),1)])):v("",!0),C.value?(i(),n("p",rs,o(C.value),1)):v("",!0),e("div",ds,[e("button",{onClick:t[8]||(t[8]=s=>{g.value=!1,C.value=""}),class:"flex-1 px-3 py-2 glass-button rounded-lg text-sm"},"Cancel"),e("button",{onClick:de,class:"flex-1 px-3 py-2 glass-button rounded-lg text-sm font-medium",disabled:A.value||y.value==="custom"&&!_.value.trim()},o(A.value?"Applying...":"Apply"),9,us)])])])):v("",!0),_e(Se,{name:"fade"},{default:Ce(()=>[u.value?(i(),n("div",cs,[e("div",vs,[e("span",null,o(u.value),1),e("button",{onClick:t[10]||(t[10]=s=>u.value=""),class:"text-white/50 hover:text-white shrink-0"},"×")])])):v("",!0)]),_:1})]))}});export{ps as default}; diff --git a/neode-ui/dist/assets/Settings-a5XTzOeo.js b/neode-ui/dist/assets/Settings-a5XTzOeo.js new file mode 100644 index 0000000..643688d --- /dev/null +++ b/neode-ui/dist/assets/Settings-a5XTzOeo.js @@ -0,0 +1,2 @@ +import{d as Pt,y as St,z as Mt,S as Bt,a0 as jt,o as Tt,B as b,c as r,a as e,h as We,D as l,E as o,g,H as x,I as we,G as h,f as p,m as D,b as _,a2 as Dt,J as X,a1 as E,F as k,P as T,a6 as Et,i as At,x as Lt,r as d,j as S,X as $t,l as Ft,a7 as zt,q as i}from"./index-DnbYEqLr.js";import{u as Ut,A as Vt}from"./aiPermissions-sblnS_DK.js";import{_ as Rt}from"./ControllerIndicator.vue_vue_type_script_setup_true_lang-DH-pMX35.js";const Nt={class:"pb-6"},Ht={class:"md:hidden mb-4"},It={class:"glass-card px-6 py-6 mb-6"},Wt={class:"text-xl font-semibold text-white/96 mb-6"},qt={class:"grid grid-cols-1 md:grid-cols-2 gap-4 mb-6"},Ot={class:"bg-black/20 rounded-xl px-5 py-4 border border-white/10"},Kt={class:"flex items-center gap-3 mb-2"},Gt={class:"text-xs font-semibold text-white/60 uppercase tracking-wide"},Qt={key:0,class:"flex items-center gap-2"},Jt={class:"text-lg font-semibold text-white/95"},Zt={class:"bg-black/20 rounded-xl px-5 py-4 border border-white/10"},Xt={class:"flex items-center gap-3 mb-2"},Yt={class:"text-xs font-semibold text-white/60 uppercase tracking-wide"},es={class:"text-lg font-semibold text-white/95"},ts={class:"bg-black/20 rounded-xl px-5 py-4 border border-white/10 md:col-span-2"},ss={class:"flex items-center gap-3 mb-2"},os={class:"text-xs font-semibold text-white/60 uppercase tracking-wide"},ls={class:"text-base font-medium text-white/90"},ns={key:0,class:"bg-black/20 rounded-xl px-5 py-4 border border-white/10 md:col-span-2 space-y-4"},as={key:0},is={class:"flex items-center justify-between gap-2 mb-2"},rs={class:"flex items-center gap-3 min-w-0"},ds={class:"text-xs font-semibold text-white/60 uppercase tracking-wide"},cs={key:0,class:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},us={key:1,class:"text-green-400 text-xs"},ps={key:2},hs=["title"],bs={class:"text-xs text-white/50 mt-1"},ms={class:"flex items-center gap-3 mb-2"},gs={class:"text-xs font-semibold text-white/60 uppercase tracking-wide"},vs=["title"],xs={class:"text-xs text-white/50 mb-3"},fs={key:0,class:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},ws={key:1},ks={key:2,class:"text-green-400"},ys={"data-controller-container":"",tabindex:"0",class:"mb-6"},_s={class:"text-lg font-semibold text-white mb-4"},Cs={class:"text-white/70 text-sm mb-4"},Ps={class:"block text-sm font-medium text-white/80 mb-2"},Ss=["placeholder"],Ms={class:"block text-sm font-medium text-white/80 mb-2"},Bs=["placeholder"],js={class:"block text-sm font-medium text-white/80 mb-2"},Ts=["placeholder"],Ds={class:"flex items-center gap-2 text-sm text-white/80"},Es={key:0,class:"text-sm text-red-400"},As={key:1,class:"text-sm text-green-400"},Ls={class:"flex gap-3 pt-2"},$s=["disabled"],Fs={class:"mb-6"},zs={class:"flex items-center justify-between mb-3"},Us={class:"flex items-center gap-3"},Vs={class:"text-sm font-medium text-white/90"},Rs={class:"text-xs text-white/50"},Ns={class:"glass-card p-6 max-w-md w-full",role:"dialog","aria-modal":"true","aria-labelledby":"totp-setup-title"},Hs={id:"totp-setup-title",class:"text-lg font-semibold text-white mb-2"},Is={class:"text-white/60 text-sm mb-4"},Ws=["placeholder"],qs={key:0,class:"text-sm text-red-400"},Os={class:"flex gap-3"},Ks=["disabled"],Gs={class:"text-lg font-semibold text-white mb-2"},Qs={class:"text-white/60 text-sm mb-4"},Js=["innerHTML"],Zs={class:"bg-black/30 rounded-lg px-3 py-2 mb-4"},Xs={class:"text-xs text-white/50 mb-1"},Ys={class:"text-sm font-mono text-orange-400 break-all select-all"},eo=["placeholder"],to={key:0,class:"text-sm text-red-400"},so={class:"flex gap-3"},oo=["disabled"],lo={class:"text-lg font-semibold text-white mb-2"},no={class:"text-white/60 text-sm mb-4"},ao={class:"bg-black/30 rounded-xl p-4 mb-4"},io={class:"grid grid-cols-2 gap-2"},ro={key:0,class:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},co={class:"glass-card p-6 max-w-md w-full",role:"dialog","aria-modal":"true","aria-labelledby":"totp-disable-title"},uo={id:"totp-disable-title",class:"text-lg font-semibold text-white mb-2"},po={class:"text-white/60 text-sm mb-4"},ho={class:"block text-sm font-medium text-white/80 mb-2"},bo=["placeholder"],mo={class:"block text-sm font-medium text-white/80 mb-2"},go=["placeholder"],vo={key:0,class:"text-sm text-red-400"},xo={class:"flex gap-3"},fo=["disabled"],wo={class:"glass-card px-6 py-6 mb-6"},ko={class:"text-xl font-semibold text-white/96 mb-2"},yo={class:"text-sm text-white/60 mb-6"},_o={class:"grid grid-cols-1 md:grid-cols-3 gap-4"},Co=["onClick"],Po={class:"flex items-center gap-3 mb-3"},So={class:"w-6 h-6 text-white/70",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},Mo=["d"],Bo={class:"text-lg font-semibold text-white/96"},jo={class:"text-sm text-white/60 leading-relaxed"},To={class:"glass-card px-6 py-6 mb-6"},Do={class:"flex gap-3 flex-wrap"},Eo=["onClick"],Ao={class:"mr-2"},Lo={class:"glass-card px-6 py-6 mb-6"},$o={class:"text-xl font-semibold text-white/96 mb-2"},Fo={class:"text-sm text-white/60 mb-6"},zo={class:"bg-black/20 rounded-xl px-5 py-4 border border-white/10 mb-4"},Uo={class:"flex items-center gap-3 mb-2"},Vo={key:0,"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z"},Ro={key:1,"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M18.364 5.636a9 9 0 11-12.728 0M12 9v4m0 4h.01"},No={class:"text-xs font-semibold text-white/60 uppercase tracking-wide"},Ho={class:"glass-card p-0 max-w-lg w-full overflow-hidden",style:{height:"480px"}},Io={class:"flex items-center justify-between px-4 py-3 border-b border-white/10"},Wo={class:"text-sm font-semibold text-white/80"},qo={class:"glass-card px-6 py-6 mb-6"},Oo={class:"mb-2"},Ko={class:"text-xl font-semibold text-white/96"},Go={class:"text-sm text-white/60 mb-6"},Qo={class:"flex-1 min-w-0"},Jo={class:"text-xs text-white/50 mt-0.5"},Zo={class:"space-y-5"},Xo={class:"text-xs font-medium text-white/40 uppercase tracking-wider mb-2 px-1"},Yo={class:"space-y-2"},el=["onClick"],tl=["d"],sl={class:"flex-1 min-w-0"},ol={class:"text-xs text-white/50 mt-0.5"},ll={class:"glass-card px-6 py-6 mb-6"},nl={class:"flex items-center justify-between"},al={class:"text-xl font-semibold text-white/96"},il={class:"text-sm text-white/60 mt-1"},rl={class:"glass-card px-6 py-6 mb-6"},dl={class:"flex items-center justify-between mb-4"},cl={class:"text-xl font-semibold text-white/96"},ul={class:"text-sm text-white/60 mt-1"},pl={class:"flex items-center gap-3"},hl=["aria-checked","aria-label","title"],bl={class:"space-y-4"},ml={class:"text-xs text-white/50 block mb-1"},gl=["placeholder"],vl={class:"text-xs text-white/50 block mb-1"},xl=["placeholder"],fl={class:"text-xs text-white/50 block mb-2"},wl={class:"grid grid-cols-1 sm:grid-cols-2 gap-2"},kl=["onClick","aria-checked","aria-label"],yl={key:0,class:"w-3 h-3 text-white",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},_l={class:"min-w-0"},Cl={class:"text-sm text-white/90 font-medium"},Pl={class:"text-xs text-white/50"},Sl={class:"flex flex-col sm:flex-row gap-2 pt-2"},Ml=["disabled"],Bl=["disabled"],jl={class:"glass-card px-6 py-6 mb-6"},Tl={class:"mb-4"},Dl={class:"text-xl font-semibold text-white/96 mb-1"},El={class:"text-sm text-white/60 mb-3"},Al={key:0,class:"text-sm text-white/40 py-4 text-center"},Ll={key:1,class:"text-sm text-white/40 py-4 text-center"},$l={key:2,class:"space-y-2"},Fl={class:"min-w-0"},zl={class:"text-sm text-white font-medium"},Ul={class:"text-xs text-white/50"},Vl={class:"flex items-center gap-2 shrink-0 flex-wrap"},Rl=["onClick","disabled","title"],Nl=["onClick","disabled","title"],Hl=["onClick","title"],Il=["onClick","disabled","aria-label","title"],Wl={class:"glass-card p-6 w-full max-w-md",role:"dialog","aria-modal":"true","aria-labelledby":"create-backup-title"},ql={id:"create-backup-title",class:"text-lg font-semibold text-white mb-4"},Ol={class:"space-y-3"},Kl={class:"text-xs text-white/50 block mb-1"},Gl=["placeholder"],Ql={class:"text-xs text-white/50 block mb-1"},Jl=["placeholder"],Zl={class:"flex gap-3 mt-5"},Xl=["disabled"],Yl={class:"glass-card p-6 w-full max-w-md",role:"dialog","aria-modal":"true","aria-labelledby":"restore-backup-title"},en={id:"restore-backup-title",class:"text-lg font-semibold text-white mb-2"},tn={class:"text-sm text-red-400/80 mb-4"},sn={class:"text-xs text-white/50 block mb-1"},on=["placeholder"],ln={class:"flex gap-3 mt-5"},nn=["disabled"],an={class:"glass-card px-6 py-6 mb-6"},rn={class:"flex items-center justify-between"},dn={class:"text-xl font-semibold text-white/96"},cn={class:"text-sm text-white/60 mt-1"},un={class:"path-option-card px-6 py-6 mt-6 border-red-500/30"},pn={key:0,class:"fixed inset-0 z-50 flex items-center justify-center bg-black/60 backdrop-blur-sm"},hn={class:"glass-card px-8 py-8 max-w-md mx-4"},bn={class:"flex gap-3 justify-end"},mn=["disabled"],wn=Pt({__name:"Settings",setup(gn){const Y=Lt(),{t,locale:qe}=St(),ee=Mt(),U=d(!1),ke=d(!1);async function Oe(){ke.value=!0;try{await b.call({method:"system.factory-reset",params:{confirm:!0}}),localStorage.clear(),U.value=!1,Y.push("/onboarding/intro")}catch{localStorage.clear(),U.value=!1,Y.push("/onboarding/intro")}}const Ke=Et,Ge=S(()=>qe.value);async function Qe(a){await zt(a)}const Ae=Bt(),m=Ut(),Je=S(()=>{const a=[];for(const s of Vt){const v=a.find(n=>n.label===s.group);v?v.items.push(s):a.push({label:s.group,items:[s]})}return a}),Ze=S(()=>[{id:"easy",label:t("settings.modeEasy"),description:t("settings.modeEasyDesc"),iconPaths:["M14.828 14.828a4 4 0 01-5.656 0M9 10h.01M15 10h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"]},{id:"gamer",label:t("settings.modePro"),description:t("settings.modeProDesc"),iconPaths:["M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z","M15 12a3 3 0 11-6 0 3 3 0 016 0z"]},{id:"chat",label:t("settings.modeChat"),description:t("settings.modeChatDesc"),iconPaths:["M8 12h.01M12 12h.01M16 12h.01M21 12c0 4.418-4.03 8-9 8a9.863 9.863 0 01-4.255-.949L3 20l1.395-3.72C3.512 15.042 3 13.574 3 12c0-4.418 4.03-8 9-8s9 3.582 9 8z"]}]),ye=S(()=>ee.serverName),A=d(!1),te=d(""),Le=d(null);function Xe(){te.value=ye.value,A.value=!0,$t(()=>Le.value?.select())}async function $e(){const a=te.value.trim();if(!a||a===ye.value){A.value=!1;return}try{await b.call({method:"server.set-name",params:{name:a}})}catch(s){console.error("Failed to rename server:",s)}A.value=!1}const Ye=S(()=>ee.serverInfo?.version||"0.0.0"),Fe=S(()=>ee.serverInfo?.["tor-address"]||null),ze=d(null),V=S(()=>Fe.value||ze.value),M=S(()=>{try{return localStorage.getItem("neode_did")||null}catch{return null}}),y=d(!1),R=d(!1);function et(){fetch("/aiui/api/claude/v1/messages",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({model:"haiku",messages:[{role:"user",content:"ping"}]})}).then(a=>{if(!a.ok){y.value=!1;return}const s=a.body?.getReader();if(!s)return;const v=new TextDecoder;let n="";function c(){return s.read().then(({done:P,value:Ee})=>{if(P){y.value=!n.includes("Not logged in")&&!n.includes("error");return}return n+=v.decode(Ee,{stream:!0}),c()})}c()}).catch(()=>{y.value=!1})}function tt(){window.addEventListener("message",Ue)}function Ue(a){a.data?.type==="claude-auth-success"&&(y.value=!0,R.value=!1,window.removeEventListener("message",Ue))}const L=d(!1),_e=d(!1),Ce=d(!1),$=d(1),N=d(""),H=d(""),C=d(""),B=d(!1),Pe=d(""),Se=d(""),Me=d(""),se=d([]),I=d(!1),oe=d(""),le=d(""),W=d(""),ne=d(!1);async function st(){try{const a=await b.totpStatus();L.value=a.enabled}catch{}}async function ot(){C.value="",B.value=!0;try{const a=await b.totpSetupBegin(N.value);Pe.value=a.qr_svg,Se.value=a.secret_base32,Me.value=a.pending_token,$.value=2}catch(a){C.value=a instanceof Error?a.message:t("settings.setupFailed")}finally{B.value=!1}}async function lt(){C.value="",B.value=!0;try{const a=await b.totpSetupConfirm({code:H.value,password:N.value,pendingToken:Me.value});se.value=a.backup_codes,L.value=!0,$.value=3}catch(a){C.value=a instanceof Error?a.message:t("settings.verificationFailed")}finally{B.value=!1}}function q(){_e.value=!1,$.value=1,N.value="",H.value="",C.value="",Pe.value="",Se.value="",Me.value="",se.value=[],I.value=!1}async function nt(){W.value="",ne.value=!0;try{await b.totpDisable(oe.value,le.value),L.value=!1,ae()}catch(a){W.value=a instanceof Error?a.message:t("settings.disableFailed")}finally{ne.value=!1}}function ae(){Ce.value=!1,oe.value="",le.value="",W.value=""}async function at(){const a=se.value.join(` +`);try{await navigator.clipboard.writeText(a)}catch{const s=document.createElement("textarea");s.value=a,s.style.position="fixed",s.style.opacity="0",document.body.appendChild(s),s.select(),document.execCommand("copy"),document.body.removeChild(s)}I.value=!0,setTimeout(()=>{I.value=!1},2e3)}const ie=d(!1),re=d(!1),de=d(!1),Ve=d(null),Re=d(null);jt(Ve,de,ue,{restoreFocusRef:Re});const ce=d(!1),j=d(""),O=d(""),w=d({currentPassword:"",newPassword:"",confirmPassword:"",alsoChangeSsh:!0});function it(a){return a.length<12?t("settings.passwordMinLength"):/[A-Z]/.test(a)?/[a-z]/.test(a)?/\d/.test(a)?/[^A-Za-z0-9]/.test(a)?null:t("settings.passwordNeedSpecial"):t("settings.passwordNeedDigit"):t("settings.passwordNeedLowercase"):t("settings.passwordNeedUppercase")}async function rt(){j.value="",O.value="";const{currentPassword:a,newPassword:s,confirmPassword:v,alsoChangeSsh:n}=w.value;if(!a||!s||!v){j.value=t("settings.passwordAllFieldsRequired");return}if(s!==v){j.value=t("settings.passwordMismatch");return}const c=it(s);if(c){j.value=c;return}ce.value=!0;try{await b.changePassword({currentPassword:a,newPassword:s,alsoChangeSsh:n}),O.value=t("settings.passwordUpdatedSuccess"),w.value={currentPassword:"",newPassword:"",confirmPassword:"",alsoChangeSsh:!0},setTimeout(()=>{ue()},2e3)}catch(P){j.value=P instanceof Error?P.message:t("settings.passwordChangeFailed")}finally{ce.value=!1}}let Be=null;async function dt(){const a=V.value;if(a){try{await navigator.clipboard.writeText(a)}catch{const s=document.createElement("textarea");s.value=a,s.style.position="fixed",s.style.opacity="0",document.body.appendChild(s),s.select(),document.execCommand("copy"),document.body.removeChild(s)}ie.value=!0,Be&&clearTimeout(Be),Be=setTimeout(()=>{ie.value=!1},2e3)}}async function ct(){if(M.value){try{await navigator.clipboard.writeText(M.value)}catch{const a=document.createElement("textarea");a.value=M.value,a.style.position="fixed",a.style.opacity="0",document.body.appendChild(a),a.select(),document.execCommand("copy"),document.body.removeChild(a)}re.value=!0,setTimeout(()=>{re.value=!1},2e3)}}function ue(){Re.value?.focus?.(),de.value=!1,j.value="",O.value="",w.value={currentPassword:"",newPassword:"",confirmPassword:"",alsoChangeSsh:!0}}Tt(async()=>{if(et(),st(),De(),kt(),!Fe.value)try{const a=await b.getTorAddress();ze.value=a.tor_address??null}catch{}});async function ut(){try{await ee.logout()}catch{}Y.push("/login").catch(()=>{window.location.href="/login"})}const pe=d([]),je=d(!1),K=d(!1),F=d(""),he=d(""),G=d(!1),Q=d(!1),Ne=d(""),z=d(""),J=d(!1),be=d(null),Te=d(null),me=d(""),He=d("success");function pt(a){return a<1024?`${a} B`:a<1024*1024?`${(a/1024).toFixed(1)} KB`:a<1024*1024*1024?`${(a/(1024*1024)).toFixed(1)} MB`:`${(a/(1024*1024*1024)).toFixed(2)} GB`}function f(a,s){me.value=a,He.value=s,setTimeout(()=>{me.value=""},5e3)}async function De(){je.value=!0;try{const a=await b.call({method:"backup.list"});pe.value=a.backups||[]}catch{pe.value=[]}finally{je.value=!1}}async function ht(){if(!(G.value||!F.value)){G.value=!0;try{await b.call({method:"backup.create",params:{passphrase:F.value,description:he.value||void 0}}),K.value=!1,F.value="",he.value="",f(t("settings.backupCreatedSuccess"),"success"),await De()}catch{f(t("settings.backupCreateFailed"),"error")}finally{G.value=!1}}}async function bt(a){const s=prompt(t("settings.verifyPassphrasePrompt"));if(s){be.value=a;try{const v=await b.call({method:"backup.verify",params:{id:a,passphrase:s}});v.valid?f(t("settings.backupVerifiedOk"),"success"):f(t("settings.backupVerifyFailed",{error:v.error||"Unknown error"}),"error")}catch{f(t("settings.backupVerifyRequestFailed"),"error")}finally{be.value=null}}}function mt(a){Ne.value=a,z.value="",Q.value=!0}async function gt(){if(!(J.value||!z.value)){J.value=!0;try{await b.call({method:"backup.restore",params:{id:Ne.value,passphrase:z.value}}),Q.value=!1,f(t("settings.backupRestored"),"success")}catch{f(t("settings.backupRestoreFailed"),"error")}finally{J.value=!1}}}async function vt(a){if(confirm(t("settings.deleteBackupConfirm"))){Te.value=a;try{await b.call({method:"backup.delete",params:{id:a}}),f(t("settings.backupDeleted"),"success"),await De()}catch{f(t("settings.backupDeleteFailed"),"error")}finally{Te.value=null}}}const u=d({enabled:!1,url:"",secret:"",events:[]}),ge=d(!1),ve=d(!1),xe=d(""),Ie=d("success"),xt=S(()=>[{id:"container_crash",label:t("settings.containerCrash"),description:t("settings.containerCrashDesc")},{id:"update_available",label:t("settings.updateAvailableEvent"),description:t("settings.updateAvailableDesc")},{id:"disk_warning",label:t("settings.diskSpaceWarning"),description:t("settings.diskWarningDesc")},{id:"backup_complete",label:t("settings.backupComplete"),description:t("settings.backupCompleteDesc")}]);function Z(a,s){xe.value=a,Ie.value=s,setTimeout(()=>{xe.value=""},5e3)}function ft(a){const s=u.value.events.indexOf(a);s>=0?u.value.events.splice(s,1):u.value.events.push(a)}function wt(){u.value.enabled=!u.value.enabled}async function kt(){try{const a=await b.call({method:"webhook.get-config"});u.value.enabled=a.enabled,u.value.url=a.url,u.value.events=a.events||[]}catch{}}async function yt(){ge.value=!0;try{await b.call({method:"webhook.configure",params:{enabled:u.value.enabled,url:u.value.url,secret:u.value.secret||null,events:u.value.events}}),Z(t("settings.webhookSaved"),"success")}catch{Z(t("settings.webhookSaveFailed"),"error")}finally{ge.value=!1}}async function _t(){ve.value=!0;try{(await b.call({method:"webhook.test"})).sent?Z(t("settings.webhookTestSent"),"success"):Z(t("settings.webhookTestFailed"),"error")}catch{Z(t("settings.webhookSendFailed"),"error")}finally{ve.value=!1}}const fe=d(null);async function Ct(a){fe.value=a;try{const c=((await b.call({method:"backup.list-drives"})).drives||[]).filter(Ee=>Ee.mount_point)[0];if(!c?.mount_point){f(t("settings.noUsbDrives"),"error");return}const P=c.label||c.device;if(!confirm(`Copy backup to USB drive "${P}" at ${c.mount_point}?`))return;await b.call({method:"backup.to-usb",params:{id:a,mount_point:c.mount_point}}),f(t("settings.backupCopiedToUsb",{path:c.mount_point}),"success")}catch{f(t("settings.backupUsbFailed"),"error")}finally{fe.value=null}}return(a,s)=>{const v=Ft("RouterLink");return i(),r("div",Nt,[e("div",Ht,[We(Rt)]),e("div",It,[e("h2",Wt,l(o(t)("settings.account")),1),e("div",qt,[e("div",Ot,[e("div",Kt,[s[32]||(s[32]=e("svg",{class:"w-5 h-5 text-white/70",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M5 12h14M5 12a2 2 0 01-2-2V6a2 2 0 012-2h14a2 2 0 012 2v4a2 2 0 01-2 2M5 12a2 2 0 00-2 2v4a2 2 0 002 2h14a2 2 0 002-2v-4a2 2 0 00-2-2m-2-4h.01M17 16h.01"})],-1)),e("p",Gt,l(o(t)("settings.serverName")),1)]),A.value?(i(),r("div",Qt,[g(e("input",{ref_key:"serverNameInput",ref:Le,"onUpdate:modelValue":s[0]||(s[0]=n=>te.value=n),type:"text",maxlength:"64",class:"flex-1 px-3 py-1.5 bg-white/10 border border-white/20 rounded-lg text-white text-lg font-semibold focus:outline-none focus:border-white/40 transition-colors",onKeydown:[we($e,["enter"]),s[1]||(s[1]=we(n=>A.value=!1,["escape"]))]},null,544),[[x,te.value]]),e("button",{class:"px-3 py-1.5 bg-white/10 border border-white/20 rounded-lg text-white/70 hover:text-white hover:bg-white/15 transition-colors text-sm",onClick:$e},"Save"),e("button",{class:"px-3 py-1.5 text-white/50 hover:text-white/70 transition-colors text-sm",onClick:s[2]||(s[2]=n=>A.value=!1)},"Cancel")])):(i(),r("div",{key:1,class:"flex items-center gap-2 group cursor-pointer",onClick:Xe},[e("p",Jt,l(ye.value),1),s[33]||(s[33]=e("svg",{class:"w-4 h-4 text-white/30 group-hover:text-white/60 transition-colors",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M15.232 5.232l3.536 3.536m-2.036-5.036a2.5 2.5 0 113.536 3.536L6.5 21.036H3v-3.572L16.732 3.732z"})],-1))]))]),e("div",Zt,[e("div",Xt,[s[34]||(s[34]=e("svg",{class:"w-5 h-5 text-white/70",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M7 7h.01M7 3h5c.512 0 1.024.195 1.414.586l7 7a2 2 0 010 2.828l-7 7a2 2 0 01-2.828 0l-7-7A1.994 1.994 0 013 12V7a4 4 0 014-4z"})],-1)),e("p",Yt,l(o(t)("common.version")),1)]),e("p",es,l(Ye.value),1)]),e("div",ts,[e("div",ss,[s[35]||(s[35]=e("svg",{class:"w-5 h-5 text-green-400",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z"})],-1)),e("p",os,l(o(t)("settings.sessionStatus")),1)]),e("p",ls,l(o(t)("settings.loggedIn")),1)]),M.value||V.value?(i(),r("div",ns,[M.value?(i(),r("div",as,[e("div",is,[e("div",rs,[s[36]||(s[36]=e("svg",{class:"w-5 h-5 text-amber-400 shrink-0",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M15 7a2 2 0 012 2m4 0a6 6 0 01-7.743 5.743L11 17H9v2H7v2H4a1 1 0 01-1-1v-2.586a1 1 0 01.293-.707l5.964-5.964A6 6 0 1121 9z"})],-1)),e("p",ds,l(o(t)("settings.yourDid")),1)]),e("button",{onClick:ct,class:"shrink-0 px-3 py-1.5 rounded-lg glass-button glass-button-sm text-xs font-medium text-white/90 hover:text-white transition-colors flex items-center gap-1.5"},[re.value?(i(),r("span",us,l(o(t)("common.copied")),1)):(i(),r("svg",cs,[...s[37]||(s[37]=[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z"},null,-1)])])),re.value?h("",!0):(i(),r("span",ps,l(o(t)("common.copy")),1))])]),e("p",{class:"text-sm font-mono text-white/90 break-all",title:M.value},l(M.value),9,hs),e("p",bs,l(o(t)("settings.didHelper")),1)])):h("",!0),V.value?(i(),r("div",{key:1,class:p(M.value?"pt-4 border-t border-white/10":"")},[e("div",ms,[s[38]||(s[38]=e("svg",{class:"w-5 h-5 text-amber-400 shrink-0",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M21 12a9 9 0 01-9 9m9-9a9 9 0 00-9-9m9 9H3m9 9a9 9 0 01-9-9m9 9c1.657 0 3-4.03 3-9s-1.343-9-3-9m0 18c-1.657 0-3-4.03-3-9s1.343-9 3-9m-9 9a9 9 0 019-9"})],-1)),e("p",gs,l(o(t)("settings.onionAddress")),1)]),e("p",{class:"text-sm font-mono text-amber-400/90 break-all mb-1",title:V.value},l(V.value),9,vs),e("p",xs,l(o(t)("settings.onionHelper")),1),e("button",{onClick:dt,class:"w-full min-h-[44px] rounded-lg glass-button text-sm font-medium text-white/90 hover:text-white transition-colors flex items-center justify-center gap-2"},[ie.value?h("",!0):(i(),r("svg",fs,[...s[39]||(s[39]=[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z"},null,-1)])])),ie.value?(i(),r("span",ks,l(o(t)("common.copied")),1)):(i(),r("span",ws,l(o(t)("common.copy")),1))])],2)):h("",!0)])):h("",!0)]),e("div",ys,[e("button",{onClick:s[3]||(s[3]=n=>de.value=!0),class:"w-full flex items-center justify-center gap-2 mb-4 px-4 py-2 rounded-lg border border-orange-500/50 text-orange-400 font-medium hover:bg-orange-500/10 transition-colors"},[s[40]||(s[40]=e("svg",{class:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M15 7a2 2 0 012 2m4 0a6 6 0 01-7.743 5.743L11 17H9v2H7v2H4a1 1 0 01-1-1v-2.586a1 1 0 01.293-.707l5.964-5.964A6 6 0 1121 9z"})],-1)),e("span",null,l(o(t)("settings.changePassword")),1)])]),(i(),D(E,{to:"body"},[de.value?(i(),r("div",{key:0,class:"fixed inset-0 z-50 flex items-center justify-center p-4 bg-black/10 backdrop-blur-md",onClick:s[8]||(s[8]=_(n=>ue(),["self"]))},[e("div",{ref_key:"changePasswordModalRef",ref:Ve,class:"glass-card p-6 max-w-md w-full"},[e("h3",_s,l(o(t)("settings.changePasswordTitle")),1),e("p",Cs,l(o(t)("settings.changePasswordDesc")),1),e("form",{onSubmit:_(rt,["prevent"]),class:"space-y-4"},[e("div",null,[e("label",Ps,l(o(t)("settings.currentPassword")),1),g(e("input",{"onUpdate:modelValue":s[4]||(s[4]=n=>w.value.currentPassword=n),type:"password",required:"",autocomplete:"current-password",class:"w-full px-3 py-2 rounded-lg bg-white/10 text-white border border-white/20 focus:border-orange-500 focus:ring-1 focus:ring-orange-500",placeholder:o(t)("login.enterPasswordPlaceholder")},null,8,Ss),[[x,w.value.currentPassword]])]),e("div",null,[e("label",Ms,l(o(t)("settings.newPassword")),1),g(e("input",{"onUpdate:modelValue":s[5]||(s[5]=n=>w.value.newPassword=n),type:"password",required:"",autocomplete:"new-password",class:"w-full px-3 py-2 rounded-lg bg-white/10 text-white border border-white/20 focus:border-orange-500 focus:ring-1 focus:ring-orange-500",placeholder:o(t)("settings.passwordPlaceholder")},null,8,Bs),[[x,w.value.newPassword]])]),e("div",null,[e("label",js,l(o(t)("settings.confirmNewPassword")),1),g(e("input",{"onUpdate:modelValue":s[6]||(s[6]=n=>w.value.confirmPassword=n),type:"password",required:"",autocomplete:"new-password",class:"w-full px-3 py-2 rounded-lg bg-white/10 text-white border border-white/20 focus:border-orange-500 focus:ring-1 focus:ring-orange-500",placeholder:o(t)("settings.confirmNewPassword")},null,8,Ts),[[x,w.value.confirmPassword]])]),e("label",Ds,[g(e("input",{"onUpdate:modelValue":s[7]||(s[7]=n=>w.value.alsoChangeSsh=n),type:"checkbox",class:"rounded border-white/30"},null,512),[[Dt,w.value.alsoChangeSsh]]),X(" "+l(o(t)("settings.updateSshCheckbox")),1)]),j.value?(i(),r("p",Es,l(j.value),1)):h("",!0),O.value?(i(),r("p",As,l(O.value),1)):h("",!0),e("div",Ls,[e("button",{type:"submit",disabled:ce.value,class:"flex-1 px-4 py-2 rounded-lg bg-orange-500 text-white font-medium hover:bg-orange-600 disabled:opacity-50 disabled:cursor-not-allowed transition-colors"},l(ce.value?o(t)("settings.updatingPassword"):o(t)("settings.updatePassword")),9,$s),e("button",{type:"button",onClick:ue,class:"px-4 py-2 rounded-lg bg-white/10 text-white font-medium hover:bg-white/20 transition-colors"},l(o(t)("common.cancel")),1)])],32)],512)])):h("",!0)])),e("div",Fs,[e("div",zs,[e("div",Us,[s[41]||(s[41]=e("svg",{class:"w-5 h-5 text-white/70",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M9 12l2 2 4-4m5.618-4.016A11.955 11.955 0 0112 2.944a11.955 11.955 0 01-8.618 3.04A12.02 12.02 0 003 9c0 5.591 3.824 10.29 9 11.622 5.176-1.332 9-6.03 9-11.622 0-1.042-.133-2.052-.382-3.016z"})],-1)),e("div",null,[e("p",Vs,l(o(t)("settings.twoFactorAuth")),1),e("p",Rs,l(o(t)("settings.twoFaProtect")),1)])]),e("span",{class:p(["text-xs font-semibold px-2 py-1 rounded-full",L.value?"bg-green-500/20 text-green-400":"bg-white/10 text-white/50"])},l(L.value?o(t)("common.enabled"):o(t)("common.disabled")),3)]),L.value?(i(),r("button",{key:1,onClick:s[10]||(s[10]=n=>Ce.value=!0),class:"w-full flex items-center justify-center gap-2 px-4 py-2 rounded-lg border border-red-500/50 text-red-400 font-medium hover:bg-red-500/10 transition-colors"},[s[43]||(s[43]=e("svg",{class:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M8 11V7a4 4 0 118 0m-4 8v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2z"})],-1)),e("span",null,l(o(t)("settings.disable2fa")),1)])):(i(),r("button",{key:0,onClick:s[9]||(s[9]=n=>_e.value=!0),class:"w-full flex items-center justify-center gap-2 px-4 py-2 rounded-lg border border-orange-500/50 text-orange-400 font-medium hover:bg-orange-500/10 transition-colors"},[s[42]||(s[42]=e("svg",{class:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 15v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2zm10-10V7a4 4 0 00-8 0v4h8z"})],-1)),e("span",null,l(o(t)("settings.enable2fa")),1)]))]),(i(),D(E,{to:"body"},[_e.value?(i(),r("div",{key:0,class:"fixed inset-0 z-50 flex items-center justify-center p-4 bg-black/10 backdrop-blur-md",onClick:_(q,["self"]),onKeydown:we(q,["escape"])},[e("div",Ns,[$.value===1?(i(),r(k,{key:0},[e("h3",Hs,l(o(t)("settings.setup2faTitle")),1),e("p",Is,l(o(t)("settings.setup2faPasswordPrompt")),1),e("form",{onSubmit:_(ot,["prevent"]),class:"space-y-4"},[g(e("input",{"onUpdate:modelValue":s[11]||(s[11]=n=>N.value=n),type:"password",required:"",autocomplete:"current-password",class:"w-full px-3 py-2 rounded-lg bg-white/10 text-white border border-white/20 focus:border-orange-500 focus:ring-1 focus:ring-orange-500",placeholder:o(t)("login.enterPasswordPlaceholder")},null,8,Ws),[[x,N.value]]),C.value?(i(),r("p",qs,l(C.value),1)):h("",!0),e("div",Os,[e("button",{type:"submit",disabled:B.value,class:"flex-1 px-4 py-2 rounded-lg bg-orange-500 text-white font-medium hover:bg-orange-600 disabled:opacity-50 disabled:cursor-not-allowed transition-colors"},l(B.value?o(t)("common.loading"):o(t)("common.continue")),9,Ks),e("button",{type:"button",onClick:q,class:"px-4 py-2 rounded-lg bg-white/10 text-white font-medium hover:bg-white/20 transition-colors"},l(o(t)("common.cancel")),1)])],32)],64)):$.value===2?(i(),r(k,{key:1},[e("h3",Gs,l(o(t)("settings.scanQrCode")),1),e("p",Qs,l(o(t)("settings.scanQrInstruction")),1),e("div",{class:"flex justify-center mb-4 bg-white rounded-xl p-4 mx-auto w-fit",innerHTML:Pe.value},null,8,Js),e("div",Zs,[e("p",Xs,l(o(t)("settings.manualEntryKey")),1),e("p",Ys,l(Se.value),1)]),e("form",{onSubmit:_(lt,["prevent"]),class:"space-y-4"},[g(e("input",{"onUpdate:modelValue":s[12]||(s[12]=n=>H.value=n),type:"text",inputmode:"numeric",pattern:"[0-9]{6}",maxlength:"6",required:"",autocomplete:"one-time-code",class:"w-full px-3 py-3 rounded-lg bg-white/10 text-white text-center text-2xl tracking-[0.5em] border border-white/20 focus:border-orange-500 focus:ring-1 focus:ring-orange-500 font-mono",placeholder:o(t)("login.totpPlaceholder")},null,8,eo),[[x,H.value]]),C.value?(i(),r("p",to,l(C.value),1)):h("",!0),e("div",so,[e("button",{type:"submit",disabled:B.value||H.value.length!==6,class:"flex-1 px-4 py-2 rounded-lg bg-orange-500 text-white font-medium hover:bg-orange-600 disabled:opacity-50 disabled:cursor-not-allowed transition-colors"},l(B.value?o(t)("login.verifying"):o(t)("settings.verifyAndEnable")),9,oo),e("button",{type:"button",onClick:q,class:"px-4 py-2 rounded-lg bg-white/10 text-white font-medium hover:bg-white/20 transition-colors"},l(o(t)("common.cancel")),1)])],32)],64)):$.value===3?(i(),r(k,{key:2},[e("h3",lo,l(o(t)("settings.saveBackupCodes")),1),e("p",no,l(o(t)("settings.backupCodesInstruction")),1),e("div",ao,[e("div",io,[(i(!0),r(k,null,T(se.value,(n,c)=>(i(),r("div",{key:c,class:"text-sm font-mono text-white/90 bg-white/5 rounded px-3 py-2 text-center"},l(n),1))),128))])]),e("button",{onClick:at,class:"w-full mb-3 flex items-center justify-center gap-2 px-4 py-2 rounded-lg border border-white/20 text-white/80 font-medium hover:bg-white/5 transition-colors"},[I.value?h("",!0):(i(),r("svg",ro,[...s[44]||(s[44]=[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z"},null,-1)])])),e("span",null,l(I.value?o(t)("common.copiedBang"):o(t)("settings.copyAllCodes")),1)]),e("button",{onClick:q,class:"w-full px-4 py-2 rounded-lg bg-orange-500 text-white font-medium hover:bg-orange-600 transition-colors"},l(o(t)("common.done")),1)],64)):h("",!0)])],32)):h("",!0)])),(i(),D(E,{to:"body"},[Ce.value?(i(),r("div",{key:0,class:"fixed inset-0 z-50 flex items-center justify-center p-4 bg-black/10 backdrop-blur-md",onClick:_(ae,["self"]),onKeydown:we(ae,["escape"])},[e("div",co,[e("h3",uo,l(o(t)("settings.disable2faTitle")),1),e("p",po,l(o(t)("settings.disable2faDesc")),1),e("form",{onSubmit:_(nt,["prevent"]),class:"space-y-4"},[e("div",null,[e("label",ho,l(o(t)("login.password")),1),g(e("input",{"onUpdate:modelValue":s[13]||(s[13]=n=>oe.value=n),type:"password",required:"",autocomplete:"current-password",class:"w-full px-3 py-2 rounded-lg bg-white/10 text-white border border-white/20 focus:border-orange-500 focus:ring-1 focus:ring-orange-500",placeholder:o(t)("login.enterPasswordPlaceholder")},null,8,bo),[[x,oe.value]])]),e("div",null,[e("label",mo,l(o(t)("settings.authenticatorCode")),1),g(e("input",{"onUpdate:modelValue":s[14]||(s[14]=n=>le.value=n),type:"text",inputmode:"numeric",pattern:"[0-9]{6}",maxlength:"6",required:"",autocomplete:"one-time-code",class:"w-full px-3 py-3 rounded-lg bg-white/10 text-white text-center text-2xl tracking-[0.5em] border border-white/20 focus:border-orange-500 focus:ring-1 focus:ring-orange-500 font-mono",placeholder:o(t)("login.totpPlaceholder")},null,8,go),[[x,le.value]])]),W.value?(i(),r("p",vo,l(W.value),1)):h("",!0),e("div",xo,[e("button",{type:"submit",disabled:ne.value,class:"flex-1 px-4 py-2 rounded-lg bg-red-500 text-white font-medium hover:bg-red-600 disabled:opacity-50 disabled:cursor-not-allowed transition-colors"},l(ne.value?o(t)("common.disabling"):o(t)("settings.disable2fa")),9,fo),e("button",{type:"button",onClick:ae,class:"px-4 py-2 rounded-lg bg-white/10 text-white font-medium hover:bg-white/20 transition-colors"},l(o(t)("common.cancel")),1)])],32)])],32)):h("",!0)])),e("button",{onClick:ut,class:"w-full path-action-button path-action-button--continue flex items-center justify-center gap-2"},[s[45]||(s[45]=e("svg",{class:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M17 16l4-4m0 0l-4-4m4 4H7m6 4v1a3 3 0 01-3 3H6a3 3 0 01-3-3V7a3 3 0 013-3h4a3 3 0 013 3v1"})],-1)),e("span",null,l(o(t)("settings.logout")),1)])]),e("div",wo,[e("h2",ko,l(o(t)("settings.interfaceMode")),1),e("p",yo,l(o(t)("settings.interfaceModeDesc")),1),e("div",_o,[(i(!0),r(k,null,T(Ze.value,n=>(i(),r("button",{key:n.id,onClick:c=>o(Ae).setMode(n.id),class:p(["path-option-card text-left p-5",{"path-option-card--selected":o(Ae).mode===n.id}])},[e("div",Po,[(i(),r("svg",So,[(i(!0),r(k,null,T(n.iconPaths,(c,P)=>(i(),r("path",{key:P,"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:c},null,8,Mo))),128))])),e("h3",Bo,l(n.label),1)]),e("p",jo,l(n.description),1)],10,Co))),128))])]),e("div",To,[s[46]||(s[46]=e("h2",{class:"text-xl font-semibold text-white/96 mb-2"},"Language",-1)),s[47]||(s[47]=e("p",{class:"text-sm text-white/60 mb-4"},"Choose your preferred language",-1)),e("div",Do,[(i(!0),r(k,null,T(o(Ke),n=>(i(),r("button",{key:n.code,onClick:c=>Qe(n.code),class:p(["glass-button px-4 py-2 rounded-lg text-sm font-medium transition-all",Ge.value===n.code?"ring-2 ring-orange-400/60 bg-white/10":""])},[e("span",Ao,l(n.flag),1),X(l(n.name),1)],10,Eo))),128))])]),e("div",Lo,[e("h2",$o,l(o(t)("settings.claudeAuth")),1),e("p",Fo,l(o(t)("settings.claudeAuthDesc")),1),e("div",zo,[e("div",Uo,[(i(),r("svg",{class:p(["w-5 h-5 shrink-0",y.value?"text-green-400":"text-white/40"]),fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[y.value?(i(),r("path",Vo)):(i(),r("path",Ro))],2)),e("p",No,l(o(t)("settings.connectionStatus")),1)]),e("p",{class:p(["text-base font-medium",y.value?"text-green-400":"text-white/50"])},l(y.value?o(t)("common.connected"):o(t)("settings.notConnected")),3)]),e("button",{onClick:s[15]||(s[15]=n=>R.value=!0),class:p(["w-full flex items-center justify-center gap-2 px-4 py-3 rounded-lg border transition-colors",y.value?"border-white/20 text-white/70 hover:bg-white/5":"border-orange-500/50 text-orange-400 font-medium hover:bg-orange-500/10"])},[s[48]||(s[48]=e("svg",{class:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M11 16l-4-4m0 0l4-4m-4 4h14m-5 4v1a3 3 0 01-3 3H6a3 3 0 01-3-3V7a3 3 0 013-3h7a3 3 0 013 3v1"})],-1)),e("span",null,l(y.value?o(t)("settings.reAuthenticate"):o(t)("settings.loginWithClaude")),1)],2)]),(i(),D(E,{to:"body"},[R.value?(i(),r("div",{key:0,class:"fixed inset-0 z-50 flex items-center justify-center p-4 bg-black/10 backdrop-blur-md",onClick:s[17]||(s[17]=_(n=>R.value=!1,["self"]))},[e("div",Ho,[e("div",Io,[e("h3",Wo,l(o(t)("settings.claudeAuth")),1),e("button",{onClick:s[16]||(s[16]=n=>R.value=!1),class:"text-white/50 hover:text-white/80 transition-colors"},[...s[49]||(s[49]=[e("svg",{class:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M6 18L18 6M6 6l12 12"})],-1)])])]),e("iframe",{src:"/claude-login",class:"w-full border-0",style:{height:"calc(100% - 49px)"},onLoad:tt},null,32)])])):h("",!0)])),e("div",qo,[e("div",Oo,[e("h2",Ko,l(o(t)("settings.aiDataAccess")),1)]),e("p",Go,l(o(t)("settings.aiDataAccessDesc")),1),e("button",{onClick:s[18]||(s[18]=n=>o(m).allEnabled?o(m).disableAll():o(m).enableAll()),class:p(["w-full flex items-center gap-4 p-4 rounded-xl border transition-all text-left mb-6",o(m).allEnabled?"bg-white/10 border-orange-500/40":"bg-black/20 border-white/10 hover:border-white/20"])},[(i(),r("svg",{class:p(["w-5 h-5 shrink-0",o(m).allEnabled?"text-orange-400":"text-white/40"]),fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[...s[50]||(s[50]=[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M9 12l2 2 4-4m5.618-4.016A11.955 11.955 0 0112 2.944a11.955 11.955 0 01-8.618 3.04A12.02 12.02 0 003 9c0 5.591 3.824 10.29 9 11.622 5.176-1.332 9-6.03 9-11.622 0-1.042-.133-2.052-.382-3.016z"},null,-1)])],2)),e("div",Qo,[e("p",{class:p(["text-sm font-medium",o(m).allEnabled?"text-white/95":"text-white/70"])},l(o(t)("common.enableAll")),3),e("p",Jo,l(o(t)("settings.enableAllDesc")),1)]),e("div",{class:p(["w-10 h-6 rounded-full shrink-0 transition-colors relative",o(m).allEnabled?"bg-orange-500":"bg-white/15"])},[e("div",{class:p(["absolute top-1 w-4 h-4 rounded-full bg-white shadow transition-transform",o(m).allEnabled?"translate-x-5":"translate-x-1"])},null,2)],2)],2),e("div",Zo,[(i(!0),r(k,null,T(Je.value,n=>(i(),r("div",{key:n.label},[e("p",Xo,l(n.label),1),e("div",Yo,[(i(!0),r(k,null,T(n.items,c=>(i(),r("button",{key:c.id,onClick:P=>o(m).toggle(c.id),class:p(["w-full flex items-center gap-4 p-4 rounded-xl border transition-all text-left",o(m).isEnabled(c.id)?"bg-white/10 border-orange-500/40":"bg-black/20 border-white/10 hover:border-white/20"])},[(i(),r("svg",{class:p(["w-5 h-5 shrink-0",o(m).isEnabled(c.id)?"text-orange-400":"text-white/40"]),fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:c.icon},null,8,tl)],2)),e("div",sl,[e("p",{class:p(["text-sm font-medium",o(m).isEnabled(c.id)?"text-white/95":"text-white/70"])},l(c.label),3),e("p",ol,l(c.description),1)]),e("div",{class:p(["w-10 h-6 rounded-full shrink-0 transition-colors relative",o(m).isEnabled(c.id)?"bg-orange-500":"bg-white/15"])},[e("div",{class:p(["absolute top-1 w-4 h-4 rounded-full bg-white shadow transition-transform",o(m).isEnabled(c.id)?"translate-x-5":"translate-x-1"])},null,2)],2)],10,el))),128))])]))),128))])]),e("div",ll,[e("div",nl,[e("div",null,[e("h2",al,l(o(t)("settings.systemUpdates")),1),e("p",il,l(o(t)("settings.systemUpdatesDesc")),1)]),We(v,{to:"/dashboard/settings/update",class:"glass-button px-4 py-2 rounded-lg text-sm flex items-center gap-2"},{default:At(()=>[s[51]||(s[51]=e("svg",{class:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-4l-4 4m0 0l-4-4m4 4V4"})],-1)),X(" "+l(o(t)("common.manageUpdates")),1)]),_:1})])]),e("div",rl,[e("div",dl,[e("div",null,[e("h2",cl,l(o(t)("settings.webhookNotifications")),1),e("p",ul,l(o(t)("settings.webhookNotificationsDesc")),1)]),e("div",pl,[e("button",{onClick:wt,role:"switch","aria-checked":u.value.enabled,"aria-label":u.value.enabled?o(t)("settings.disableWebhooks"):o(t)("settings.enableWebhooks"),class:p(["w-10 h-6 rounded-full shrink-0 transition-colors relative",u.value.enabled?"bg-orange-500":"bg-white/15"]),title:u.value.enabled?o(t)("settings.disableWebhooks"):o(t)("settings.enableWebhooks")},[e("div",{class:p(["absolute top-1 w-4 h-4 rounded-full bg-white shadow transition-transform",u.value.enabled?"translate-x-5":"translate-x-1"])},null,2)],10,hl)])]),e("div",bl,[e("div",null,[e("label",ml,l(o(t)("settings.webhookUrlLabel")),1),g(e("input",{"onUpdate:modelValue":s[19]||(s[19]=n=>u.value.url=n),type:"url",placeholder:o(t)("settings.webhookUrlPlaceholder"),class:"w-full bg-black/30 border border-white/10 rounded-lg px-3 py-2 text-sm text-white placeholder-white/30 focus:outline-none focus:border-orange-500/50"},null,8,gl),[[x,u.value.url]])]),e("div",null,[e("label",vl,l(o(t)("settings.webhookSecretLabel")),1),g(e("input",{"onUpdate:modelValue":s[20]||(s[20]=n=>u.value.secret=n),type:"password",placeholder:o(t)("settings.webhookSecretPlaceholderFull"),class:"w-full bg-black/30 border border-white/10 rounded-lg px-3 py-2 text-sm text-white placeholder-white/30 focus:outline-none focus:border-orange-500/50"},null,8,xl),[[x,u.value.secret]])]),e("div",null,[e("label",fl,l(o(t)("settings.eventsToNotify")),1),e("div",wl,[(i(!0),r(k,null,T(xt.value,n=>(i(),r("button",{key:n.id,onClick:c=>ft(n.id),role:"checkbox","aria-checked":u.value.events.includes(n.id),"aria-label":n.label,class:p(["flex items-center gap-3 p-3 rounded-lg border transition-colors text-left",u.value.events.includes(n.id)?"bg-orange-500/10 border-orange-500/30":"bg-white/5 border-white/10 hover:border-white/20"])},[e("div",{class:p(["w-5 h-5 rounded border-2 flex items-center justify-center shrink-0 transition-colors",u.value.events.includes(n.id)?"border-orange-500 bg-orange-500":"border-white/30"])},[u.value.events.includes(n.id)?(i(),r("svg",yl,[...s[52]||(s[52]=[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"3",d:"M5 13l4 4L19 7"},null,-1)])])):h("",!0)],2),e("div",_l,[e("p",Cl,l(n.label),1),e("p",Pl,l(n.description),1)])],10,kl))),128))])]),e("div",Sl,[e("button",{onClick:yt,disabled:ge.value,class:"glass-button px-4 py-2 rounded-lg text-sm flex items-center justify-center gap-2 bg-orange-500/20 border-orange-500/30 disabled:opacity-50"},l(ge.value?o(t)("settings.savingWebhook"):o(t)("common.saveConfiguration")),9,Ml),e("button",{onClick:_t,disabled:ve.value||!u.value.url,class:"glass-button px-4 py-2 rounded-lg text-sm flex items-center justify-center gap-2 disabled:opacity-50"},l(ve.value?o(t)("common.sending"):o(t)("common.sendTest")),9,Bl)])]),xe.value?(i(),r("div",{key:0,role:"status","aria-live":"polite",class:p(["mt-3 text-xs px-3 py-2 rounded-lg",Ie.value==="error"?"bg-red-500/15 text-red-300":"bg-green-500/15 text-green-300"])},l(xe.value),3)):h("",!0)]),e("div",jl,[e("div",Tl,[e("h2",Dl,l(o(t)("settings.backup")),1),e("p",El,l(o(t)("settings.backupRestoreDesc")),1),e("button",{onClick:s[21]||(s[21]=n=>K.value=!0),class:"w-full min-h-[44px] glass-button rounded-lg text-sm font-medium flex items-center justify-center gap-2"},[s[53]||(s[53]=e("svg",{class:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 4v16m8-8H4"})],-1)),X(" "+l(o(t)("settings.createBackup")),1)])]),je.value?(i(),r("div",Al,l(o(t)("settings.loadingBackups")),1)):pe.value.length===0?(i(),r("div",Ll,l(o(t)("settings.noBackups")),1)):(i(),r("div",$l,[(i(!0),r(k,null,T(pe.value,n=>(i(),r("div",{key:n.id,class:"flex flex-col sm:flex-row sm:items-center sm:justify-between p-3 bg-white/5 rounded-lg gap-2"},[e("div",Fl,[e("div",zl,l(n.description||o(t)("settings.systemBackup")),1),e("div",Ul,l(new Date(n.created_at).toLocaleString())+" · "+l(pt(n.size_bytes)),1)]),e("div",Vl,[e("button",{onClick:c=>bt(n.id),disabled:be.value===n.id,class:"glass-button glass-button-sm px-3 py-1.5 rounded text-xs disabled:opacity-50",title:o(t)("common.verify")},l(be.value===n.id?"...":o(t)("common.verify")),9,Rl),e("button",{onClick:c=>Ct(n.id),disabled:fe.value===n.id,class:"glass-button glass-button-sm px-3 py-1.5 rounded text-xs text-blue-400 disabled:opacity-50",title:o(t)("settings.copyToUsb")},l(fe.value===n.id?"...":"USB"),9,Nl),e("button",{onClick:c=>mt(n.id),class:"glass-button glass-button-sm px-3 py-1.5 rounded text-xs text-orange-400",title:o(t)("common.restore")},l(o(t)("common.restore")),9,Hl),e("button",{onClick:c=>vt(n.id),disabled:Te.value===n.id,"aria-label":o(t)("settings.deleteBackup"),class:"glass-button glass-button-sm px-3 py-1.5 rounded text-xs text-red-400 disabled:opacity-50",title:o(t)("common.delete")}," × ",8,Il)])]))),128))])),me.value?(i(),r("div",{key:3,role:"status","aria-live":"polite",class:p(["mt-3 text-xs px-3 py-2 rounded-lg",He.value==="error"?"bg-red-500/15 text-red-300":"bg-green-500/15 text-green-300"])},l(me.value),3)):h("",!0)]),(i(),D(E,{to:"body"},[K.value?(i(),r("div",{key:0,class:"fixed inset-0 z-50 flex items-center justify-center p-4 bg-black/10 backdrop-blur-md",onClick:s[25]||(s[25]=_(n=>K.value=!1,["self"]))},[e("div",Wl,[e("h3",ql,l(o(t)("settings.createEncryptedBackup")),1),e("div",Ol,[e("div",null,[e("label",Kl,l(o(t)("settings.encryptionPassphrase")),1),g(e("input",{"onUpdate:modelValue":s[22]||(s[22]=n=>F.value=n),type:"password",placeholder:o(t)("settings.enterPassphrase"),class:"w-full bg-black/30 border border-white/10 rounded-lg px-3 py-2 text-sm text-white placeholder-white/30 focus:outline-none focus:border-blue-500/50"},null,8,Gl),[[x,F.value]])]),e("div",null,[e("label",Ql,l(o(t)("settings.descriptionOptional")),1),g(e("input",{"onUpdate:modelValue":s[23]||(s[23]=n=>he.value=n),type:"text",placeholder:o(t)("settings.descriptionPlaceholder"),class:"w-full bg-black/30 border border-white/10 rounded-lg px-3 py-2 text-sm text-white placeholder-white/30 focus:outline-none focus:border-blue-500/50"},null,8,Jl),[[x,he.value]])])]),e("div",Zl,[e("button",{onClick:s[24]||(s[24]=n=>K.value=!1),class:"glass-button px-4 py-2 rounded-lg text-sm flex-1"},l(o(t)("common.cancel")),1),e("button",{onClick:ht,disabled:G.value||!F.value,class:"glass-button px-4 py-2 rounded-lg text-sm flex-1 bg-orange-500/20 border-orange-500/30 disabled:opacity-50"},l(G.value?o(t)("settings.creatingBackup"):o(t)("settings.createBackup")),9,Xl)])])])):h("",!0)])),(i(),D(E,{to:"body"},[Q.value?(i(),r("div",{key:0,class:"fixed inset-0 z-50 flex items-center justify-center p-4 bg-black/10 backdrop-blur-md",onClick:s[28]||(s[28]=_(n=>Q.value=!1,["self"]))},[e("div",Yl,[e("h3",en,l(o(t)("settings.restoreBackupTitle")),1),e("p",tn,l(o(t)("settings.restoreWarning")),1),e("div",null,[e("label",sn,l(o(t)("settings.encryptionPassphrase")),1),g(e("input",{"onUpdate:modelValue":s[26]||(s[26]=n=>z.value=n),type:"password",placeholder:o(t)("settings.enterBackupPassphrase"),class:"w-full bg-black/30 border border-white/10 rounded-lg px-3 py-2 text-sm text-white placeholder-white/30 focus:outline-none focus:border-blue-500/50"},null,8,on),[[x,z.value]])]),e("div",ln,[e("button",{onClick:s[27]||(s[27]=n=>Q.value=!1),class:"glass-button px-4 py-2 rounded-lg text-sm flex-1"},l(o(t)("common.cancel")),1),e("button",{onClick:gt,disabled:J.value||!z.value,class:"glass-button px-4 py-2 rounded-lg text-sm flex-1 bg-red-500/20 border-red-500/30 disabled:opacity-50"},l(J.value?o(t)("common.restoring"):o(t)("common.restore")),9,nn)])])])):h("",!0)])),e("div",an,[e("div",rn,[e("div",null,[e("h2",dn,l(o(t)("common.network")),1),e("p",cn,l(o(t)("settings.networkDesc")),1)]),e("button",{onClick:s[29]||(s[29]=n=>o(Y).push("/dashboard/server")),class:"glass-button px-4 py-2 rounded-lg text-sm flex items-center gap-2"},[s[54]||(s[54]=e("svg",{class:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M13 7l5 5m0 0l-5 5m5-5H6"})],-1)),X(" "+l(o(t)("common.networkDiagnostics")),1)])])]),e("div",un,[s[55]||(s[55]=e("h2",{class:"text-xl font-semibold text-red-400/90 mb-3"},"Factory Reset",-1)),s[56]||(s[56]=e("p",{class:"text-sm text-white/60 mb-4"}," Wipe all user data, identities, and credentials. Container images are preserved. The node will restart and show the onboarding screen. ",-1)),e("button",{class:"glass-button text-red-400 border-red-500/30 hover:border-red-500/50",onClick:s[30]||(s[30]=n=>U.value=!0)}," Factory Reset ")]),(i(),D(E,{to:"body"},[U.value?(i(),r("div",pn,[e("div",hn,[s[57]||(s[57]=e("h3",{class:"text-lg font-semibold text-white/90 mb-3"},"Are you sure?",-1)),s[58]||(s[58]=e("p",{class:"text-sm text-white/60 mb-6"}," This will delete all identities, credentials, and settings. This cannot be undone. ",-1)),e("div",bn,[e("button",{class:"glass-button",onClick:s[31]||(s[31]=n=>U.value=!1)},"Cancel"),e("button",{class:"glass-button text-red-400 border-red-500/30",disabled:ke.value,onClick:Oe},l(ke.value?"Resetting...":"Yes, Reset"),9,mn)])])])):h("",!0)]))])}}});export{wn as default}; diff --git a/neode-ui/dist/assets/SystemUpdate-DAjulYB4.js b/neode-ui/dist/assets/SystemUpdate-DAjulYB4.js new file mode 100644 index 0000000..181a5c5 --- /dev/null +++ b/neode-ui/dist/assets/SystemUpdate-DAjulYB4.js @@ -0,0 +1 @@ +import{d as Q,y as X,o as Y,c as o,a as e,D as s,E as a,f,G as m,F as V,P as j,n as Z,h as z,i as L,U as ee,T as te,j as w,r as c,B as _,J as se,b as ae,q as n}from"./index-DnbYEqLr.js";const le={class:"pb-6"},oe={class:"mb-6"},ne={class:"text-3xl font-bold text-white mb-2"},de={class:"text-white/70"},ce={class:"glass-card p-6 mb-6"},ie={class:"text-lg font-semibold text-white mb-4"},ue={class:"grid grid-cols-1 sm:grid-cols-3 gap-4"},re={class:"p-4 bg-white/5 rounded-lg"},pe={class:"text-xs text-white/60 mb-1"},me={class:"text-xl font-bold text-white"},he={class:"p-4 bg-white/5 rounded-lg"},ve={class:"text-xs text-white/60 mb-1"},ye={class:"text-sm font-medium text-white"},_e={class:"p-4 bg-white/5 rounded-lg"},ge={class:"text-xs text-white/60 mb-1"},be={class:"flex items-center gap-2"},xe={key:1,class:"glass-card p-6 mb-6 border border-orange-400/30"},fe={class:"flex items-start justify-between mb-4"},we={class:"text-lg font-semibold text-white"},ke={class:"text-sm text-white/60"},Ue={class:"px-3 py-1 bg-orange-500/20 text-orange-400 text-xs font-medium rounded-full"},Ce={key:0,class:"mb-4"},Se={class:"text-sm font-medium text-white/80 mb-2"},Te={class:"space-y-1"},De={key:1,class:"mb-4 p-3 bg-white/5 rounded-lg"},Fe={class:"text-xs text-white/60"},Me={class:"flex gap-3"},Ae={key:2,class:"glass-card p-6 mb-6"},Be={class:"flex items-center gap-3 mb-4"},Ie={class:"text-lg font-semibold text-white"},Ve={class:"text-sm text-white/60"},je={key:3,class:"glass-card p-6 mb-6"},ze={class:"text-lg font-semibold text-white mb-4"},Le={class:"w-full h-3 bg-white/10 rounded-full overflow-hidden mb-2"},Ne={class:"text-xs text-white/60"},Pe={key:4,class:"glass-card p-6 mb-6"},qe={class:"text-lg font-semibold text-white mb-4"},Ee={class:"flex items-center gap-3"},Oe={class:"text-sm text-white/70"},Re={class:"glass-card p-6 mb-6"},$e={class:"text-lg font-semibold text-white mb-2"},Ge={class:"text-sm text-white/60 mb-4"},Je={class:"space-y-3"},We=["value","checked","onChange"],He={class:"text-sm font-medium text-white"},Ke={class:"text-xs text-white/50"},Qe={class:"glass-card p-6"},Xe={class:"text-lg font-semibold text-white mb-4"},Ye={class:"flex flex-wrap gap-3"},Ze=["disabled"],et={class:"glass-card p-6 max-w-sm w-full mx-4"},tt={class:"text-lg font-semibold text-white mb-3"},st={class:"text-sm text-white/70 mb-6"},at={class:"flex gap-3 justify-end"},nt=Q({__name:"SystemUpdate",setup(lt){const{t}=X(),F=w(()=>[{value:"manual",label:t("systemUpdate.manualOnly"),description:t("systemUpdate.manualOnlyDesc")},{value:"daily_check",label:t("systemUpdate.dailyCheck"),description:t("systemUpdate.dailyCheckDesc")},{value:"auto_apply",label:t("systemUpdate.autoApply"),description:t("systemUpdate.autoApplyDesc")}]),k=c("daily_check"),b=c(!1),v=c(!1),U=c(!1),h=c(!1),i=c(null),T=c("0.0.0"),x=c(null),u=c(null),C=c(!1),S=c(!1),y=c(""),M=c(!1),g=c(0),N=w(()=>{if(!x.value)return t("common.never");try{return new Date(x.value).toLocaleString()}catch{return x.value}}),P=w(()=>h.value?t("systemUpdate.applying"):v.value?t("systemUpdate.downloading"):S.value?t("systemUpdate.applying"):u.value?t("systemUpdate.updateAvailable"):C.value?t("systemUpdate.rollback"):t("systemUpdate.upToDate")),q=w(()=>h.value||v.value?"bg-orange-400 animate-pulse":u.value||S.value?"bg-orange-400":"bg-green-400"),E=w(()=>h.value||v.value||u.value||S.value?"text-orange-400":"text-green-400");function p(l,d=!1){y.value=l,M.value=d,setTimeout(()=>{y.value=""},8e3)}async function D(){try{const l=await _.call({method:"update.status"});T.value=l.current_version,x.value=l.last_check,S.value=l.update_in_progress,C.value=l.rollback_available,l.update_in_progress&&(U.value=!0)}catch{}}async function A(){b.value=!0,y.value="";try{const l=await _.call({method:"update.check"});T.value=l.current_version,x.value=l.last_check,u.value=l.update,l.update_available||p(t("systemUpdate.upToDateMessage"))}catch{p(t("systemUpdate.checkFailed"),!0)}finally{b.value=!1}}async function O(){v.value=!0,g.value=0,y.value="";const l=setInterval(()=>{g.value<90&&(g.value+=Math.random()*15)},500);try{const d=await _.call({method:"update.download"});g.value=100,U.value=!0;const r=(d.downloaded_bytes/1048576).toFixed(1);p(t("systemUpdate.downloadSuccess",{count:d.components_downloaded,size:r}))}catch{p(t("systemUpdate.downloadFailed"),!0)}finally{clearInterval(l),v.value=!1}}function R(){i.value="apply"}function $(){i.value="rollback"}function B(){i.value=null}async function G(){i.value==="apply"?(i.value=null,await J()):i.value==="rollback"&&(i.value=null,await W())}async function J(){h.value=!0,y.value="";try{await _.call({method:"update.apply"}),p(t("systemUpdate.applySuccess")),u.value=null,U.value=!1,await D()}catch{p(t("systemUpdate.applyFailed"),!0)}finally{h.value=!1}}async function W(){try{await _.call({method:"update.rollback"}),p(t("systemUpdate.rollbackSuccess")),C.value=!1,await D()}catch{p(t("systemUpdate.rollbackFailed"),!0)}}async function H(){try{const l=await _.call({method:"update.get-schedule"});k.value=l.schedule}catch{}}async function K(l){k.value=l;try{await _.call({method:"update.set-schedule",params:{schedule:l}}),p(`Schedule set to ${F.value.find(d=>d.value===l)?.label}`)}catch{p("Failed to save schedule",!0)}}return Y(()=>{Promise.all([D(),H(),A()])}),(l,d)=>(n(),o("div",le,[e("div",oe,[e("h1",ne,s(a(t)("systemUpdate.title")),1),e("p",de,s(a(t)("systemUpdate.subtitle")),1)]),y.value?(n(),o("div",{key:0,class:f(["mb-4 p-3 rounded-lg text-sm",M.value?"bg-red-500/20 text-red-300":"bg-green-500/20 text-green-300"])},s(y.value),3)):m("",!0),e("div",ce,[e("h2",ie,s(a(t)("systemUpdate.currentSystem")),1),e("div",ue,[e("div",re,[e("p",pe,s(a(t)("common.version")),1),e("p",me,"v"+s(T.value),1)]),e("div",he,[e("p",ve,s(a(t)("systemUpdate.lastChecked")),1),e("p",ye,s(N.value),1)]),e("div",_e,[e("p",ge,s(a(t)("common.status")),1),e("div",be,[e("div",{class:f(["w-2 h-2 rounded-full",q.value])},null,2),e("p",{class:f(["text-sm font-medium",E.value])},s(P.value),3)])])])]),u.value?(n(),o("div",xe,[e("div",fe,[e("div",null,[e("h2",we,s(a(t)("systemUpdate.updateAvailable")),1),e("p",ke,"Version "+s(u.value.version)+" — "+s(u.value.release_date),1)]),e("span",Ue,s(a(t)("systemUpdate.new")),1)]),u.value.changelog.length?(n(),o("div",Ce,[e("h3",Se,s(a(t)("systemUpdate.changelog")),1),e("ul",Te,[(n(!0),o(V,null,j(u.value.changelog,(r,I)=>(n(),o("li",{key:I,class:"text-sm text-white/60 flex gap-2"},[d[0]||(d[0]=e("span",{class:"text-orange-400 shrink-0"},"•",-1)),e("span",null,s(r),1)]))),128))])])):m("",!0),u.value.components>0?(n(),o("div",De,[e("p",Fe,s(a(t)("systemUpdate.componentsToUpdate",{count:u.value.components})),1)])):m("",!0),e("div",Me,[!v.value&&!h.value?(n(),o("button",{key:0,onClick:O,class:"glass-button rounded-lg px-6 py-2 text-sm font-medium"},s(a(t)("systemUpdate.downloadUpdate")),1)):m("",!0),U.value&&!h.value?(n(),o("button",{key:1,onClick:R,class:"glass-button rounded-lg px-6 py-2 text-sm font-medium bg-orange-500/20 border-orange-400/30"},s(a(t)("systemUpdate.applyUpdate")),1)):m("",!0)])])):b.value?m("",!0):(n(),o("div",Ae,[e("div",Be,[d[1]||(d[1]=e("svg",{class:"w-6 h-6 text-green-400",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M5 13l4 4L19 7"})],-1)),e("h2",Ie,s(a(t)("systemUpdate.upToDate")),1)]),e("p",Ve,s(a(t)("systemUpdate.upToDateMessage")),1)])),v.value?(n(),o("div",je,[e("h2",ze,s(a(t)("systemUpdate.downloading")),1),e("div",Le,[e("div",{class:"h-full bg-orange-400 rounded-full transition-all duration-500",style:Z({width:g.value+"%"})},null,4)]),e("p",Ne,s(a(t)("systemUpdate.percentComplete",{percent:g.value})),1)])):m("",!0),h.value?(n(),o("div",Pe,[e("h2",qe,s(a(t)("systemUpdate.applying")),1),e("div",Ee,[d[2]||(d[2]=e("div",{class:"w-5 h-5 border-2 border-orange-400 border-t-transparent rounded-full animate-spin"},null,-1)),e("p",Oe,s(a(t)("systemUpdate.applyWarning")),1)])])):m("",!0),e("div",Re,[e("h2",$e,s(a(t)("systemUpdate.updateSchedule")),1),e("p",Ge,s(a(t)("systemUpdate.subtitle")),1),e("div",Je,[(n(!0),o(V,null,j(F.value,r=>(n(),o("label",{key:r.value,class:f(["flex items-start gap-3 p-3 bg-white/5 rounded-lg cursor-pointer hover:bg-white/10 transition-colors",{"ring-1 ring-orange-400/50 bg-orange-500/10":k.value===r.value}])},[e("input",{type:"radio",name:"update-schedule",value:r.value,checked:k.value===r.value,onChange:I=>K(r.value),class:"mt-1 accent-orange-400"},null,40,We),e("div",null,[e("p",He,s(r.label),1),e("p",Ke,s(r.description),1)])],2))),128))])]),e("div",Qe,[e("h2",Xe,s(a(t)("systemUpdate.actions")),1),e("div",Ye,[e("button",{onClick:A,disabled:b.value,class:"glass-button rounded-lg px-5 py-2 text-sm font-medium disabled:opacity-40"},s(b.value?a(t)("systemUpdate.checking"):a(t)("systemUpdate.checkForUpdates")),9,Ze),C.value?(n(),o("button",{key:0,onClick:$,class:"glass-button rounded-lg px-5 py-2 text-sm font-medium bg-red-500/10 border-red-400/20"},s(a(t)("systemUpdate.rollback")),1)):m("",!0),z(a(ee),{to:"/dashboard/settings",class:"glass-button rounded-lg px-5 py-2 text-sm font-medium text-center"},{default:L(()=>[se(s(a(t)("systemUpdate.backToSettings")),1)]),_:1})])]),z(te,{name:"fade"},{default:L(()=>[i.value?(n(),o("div",{key:0,class:"fixed inset-0 z-50 flex items-center justify-center bg-black/10 backdrop-blur-md",onClick:ae(B,["self"])},[e("div",et,[e("h3",tt,s(i.value==="apply"?a(t)("systemUpdate.applyTitle"):a(t)("systemUpdate.rollbackTitle")),1),e("p",st,s(i.value==="apply"?a(t)("systemUpdate.applyMessage"):a(t)("systemUpdate.rollbackMessage")),1),e("div",at,[e("button",{onClick:B,class:"glass-button rounded-lg px-4 py-2 text-sm font-medium"},s(a(t)("common.cancel")),1),e("button",{onClick:G,class:f(["glass-button rounded-lg px-4 py-2 text-sm font-medium",i.value==="rollback"?"bg-red-500/20 border-red-400/30":"bg-orange-500/20 border-orange-400/30"])},s(i.value==="apply"?a(t)("systemUpdate.applyNow"):a(t)("systemUpdate.rollbackButton")),3)])])])):m("",!0)]),_:1})]))}});export{nt as default}; diff --git a/neode-ui/dist/assets/Web5-DcuUNKso.js b/neode-ui/dist/assets/Web5-DcuUNKso.js new file mode 100644 index 0000000..3386d75 --- /dev/null +++ b/neode-ui/dist/assets/Web5-DcuUNKso.js @@ -0,0 +1 @@ +import{d as Ml,y as jl,z as Pl,a0 as Dl,o as Tl,X as Fs,O as Rl,w as Bl,B as c,c as a,a as e,D as o,E as r,G as u,f as h,m as M,I as T,b as $,J as k,a1 as V,g as m,a3 as Ws,F as f,P as y,H as b,h as kt,i as ge,T as mo,v as Ct,a2 as po,u as $l,x as Vl,a4 as Sl,r as d,j,a5 as zl,l as Al,n as Os,q as n}from"./index-DnbYEqLr.js";import{u as Il}from"./web5Badge-C9_VaejO.js";import{P as Ul}from"./api-CHkUAu4g.js";const Nl={class:"pb-6"},Ll={class:"glass-card p-6 mb-6"},Hl={class:"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 2xl:grid-cols-6 gap-4 stagger-grid"},El={"data-controller-container":"",tabindex:"0",class:"card-stagger flex flex-col gap-3 p-4 bg-white/5 rounded-lg min-w-0",style:{"--stagger-index":"0"}},Kl={class:"flex items-center gap-3 min-w-0"},Fl={class:"min-w-0"},Wl={class:"text-sm font-medium text-white"},Ol={class:"text-xs text-orange-500 font-medium"},ql={key:0,class:"text-xs text-white/40 space-y-0.5"},Jl={key:0},Ql={key:1},Gl={"data-controller-container":"",tabindex:"0",class:"card-stagger flex flex-col gap-3 p-4 bg-white/5 rounded-lg min-w-0",style:{"--stagger-index":"1"}},Xl={class:"flex items-center gap-3 min-w-0"},Yl={class:"relative shrink-0"},Zl={key:0,class:"absolute inset-0 w-3 h-3 rounded-full bg-green-400 animate-ping opacity-75"},en={class:"min-w-0 flex-1"},tn={class:"text-sm font-medium text-white"},sn=["title"],on={key:1,class:"text-xs text-white/60 capitalize"},ln={key:0,class:"flex gap-2"},nn=["disabled"],an={"data-controller-container":"",tabindex:"0",class:"card-stagger flex flex-col gap-3 p-4 bg-white/5 rounded-lg min-w-0",style:{"--stagger-index":"1.5"}},rn={class:"flex items-center gap-3 min-w-0"},dn={class:"relative shrink-0"},un={class:"min-w-0 flex-1"},cn=["title"],vn={key:1,class:"text-xs text-white/60"},xn={key:0,class:"flex gap-2"},hn=["disabled"],mn=["disabled"],pn={"data-controller-container":"",tabindex:"0",class:"card-stagger flex flex-col gap-3 p-4 bg-white/5 rounded-lg min-w-0",style:{"--stagger-index":"2"}},bn={class:"flex items-center gap-3 min-w-0"},wn={class:"relative shrink-0"},fn={key:0,class:"absolute inset-0 w-3 h-3 rounded-full bg-green-400 animate-ping opacity-75"},gn={class:"min-w-0"},yn={class:"text-sm font-medium text-white"},_n={class:"text-xs text-white/60"},kn=["disabled"],Cn={"data-controller-container":"",tabindex:"0",class:"card-stagger flex flex-col gap-3 p-4 bg-white/5 rounded-lg min-w-0",style:{"--stagger-index":"3"}},Mn={class:"flex items-center gap-3 min-w-0"},jn={class:"relative shrink-0"},Pn={key:0,class:"absolute inset-0 w-3 h-3 rounded-full bg-green-400 animate-ping opacity-75"},Dn={class:"min-w-0"},Tn={class:"text-sm font-medium text-white"},Rn={class:"text-xs text-white/60"},Bn={"data-controller-container":"",tabindex:"0",class:"card-stagger flex flex-col gap-3 p-4 bg-white/5 rounded-lg min-w-0",style:{"--stagger-index":"4"}},$n={class:"flex items-center gap-3 min-w-0"},Vn={class:"relative shrink-0"},Sn={key:0,class:"absolute inset-0 w-3 h-3 rounded-full bg-green-400 animate-pulse opacity-75"},zn={class:"min-w-0 flex-1"},An={class:"text-sm font-medium text-white"},In={class:"text-xs text-white/60"},Un={class:"flex gap-2"},Nn={key:0,class:"mb-6 p-4 bg-orange-500/10 border border-orange-500/20 rounded-xl flex items-center gap-3"},Ln={class:"flex-1 min-w-0"},Hn={class:"text-sm font-medium text-orange-400"},En={class:"text-xs text-white/60"},Kn={class:"glass-card p-6 max-w-2xl w-full max-h-[90vh] overflow-y-auto",role:"dialog","aria-modal":"true","aria-labelledby":"did-doc-title"},Fn={class:"flex items-center justify-between mb-4"},Wn={id:"did-doc-title",class:"text-lg font-semibold text-white"},On={class:"flex items-center gap-2"},qn={key:0,class:"text-xs text-green-400 flex items-center gap-1"},Jn={key:1,class:"text-xs text-red-400"},Qn={key:0,class:"text-white/60 text-sm"},Gn={key:1,class:"text-xs text-white/80 font-mono bg-black/30 rounded-lg p-4 overflow-x-auto whitespace-pre-wrap"},Xn={class:"flex gap-3 mt-4"},Yn={class:"text-lg font-semibold text-white mb-4"},Zn={class:"space-y-4"},ei={class:"block text-sm font-medium text-white/80 mb-2"},ti={value:""},si=["value"],oi={class:"block text-sm font-medium text-white/80 mb-2"},li=["placeholder"],ni={class:"flex gap-3 mt-6"},ii=["disabled"],ai={key:0,class:"mt-3 text-sm text-red-400"},ri={key:1,class:"mt-3 text-sm text-green-400"},di={class:"flex flex-col md:flex-row gap-6 mb-6"},ui={"data-controller-container":"",tabindex:"0",class:"glass-card card-stagger p-6 flex flex-col md:w-1/2",style:{"--stagger-index":"0"}},ci={class:"flex items-start gap-4 mb-4 shrink-0"},vi={class:"flex-1"},xi={class:"text-xl font-semibold text-white mb-2"},hi={class:"text-white/70 text-sm mb-4"},mi={class:"space-y-3 flex-1 min-h-0"},pi={class:"flex items-center justify-between p-3 bg-white/5 rounded-lg"},bi={class:"flex items-center gap-3"},wi={class:"text-white/80 text-sm"},fi={class:"text-white/60 text-sm"},gi={class:"flex items-center justify-between p-3 bg-white/5 rounded-lg"},yi={class:"flex items-center gap-3"},_i={class:"text-white/80 text-sm"},ki={class:"flex items-center justify-between p-3 bg-white/5 rounded-lg"},Ci={class:"flex items-center gap-3"},Mi={class:"text-white/80 text-sm"},ji={class:"text-white/60 text-sm"},Pi={"data-controller-container":"",tabindex:"0",class:"glass-card card-stagger p-6 flex flex-col md:w-1/2",style:{"--stagger-index":"1"}},Di={class:"flex items-start gap-4 mb-4 shrink-0"},Ti={class:"flex-1 min-w-0"},Ri={class:"text-xl font-semibold text-white mb-2"},Bi={class:"text-white/70 text-sm mb-4"},$i={key:0,class:"mb-4 rounded-xl overflow-hidden border border-green-500/20"},Vi={class:"px-4 py-2.5 bg-green-500/10 border-b border-green-500/15 flex items-center justify-between"},Si={class:"divide-y divide-white/5"},zi=["onClick"],Ai={class:"flex items-center gap-3 min-w-0 flex-1"},Ii={class:"min-w-0 flex-1"},Ui={class:"flex items-center gap-2"},Ni={class:"text-sm font-medium text-green-400"},Li={class:"text-[11px] text-white/40 font-mono truncate mt-0.5"},Hi={class:"flex items-center gap-2 shrink-0"},Ei={class:"text-[11px] text-white/40"},Ki={class:"space-y-3 flex-1 min-h-0"},Fi={class:"flex items-center justify-between p-3 bg-white/5 rounded-lg"},Wi={class:"flex items-center gap-3"},Oi={class:"text-white/80 text-sm"},qi={class:"text-orange-500 text-sm font-medium"},Ji={class:"flex items-center justify-between p-3 bg-white/5 rounded-lg"},Qi={class:"flex items-center gap-3"},Gi={class:"text-white/80 text-sm"},Xi={class:"text-yellow-400 text-sm font-medium"},Yi={class:"flex items-center justify-between p-3 bg-white/5 rounded-lg"},Zi={class:"flex items-center gap-3"},ea={class:"text-white/80 text-sm"},ta={class:"text-purple-400 text-sm font-medium"},sa={class:"grid grid-cols-2 gap-2 mt-auto pt-4 shrink-0"},oa=["disabled"],la={class:"flex flex-col md:flex-row gap-6 mb-8"},na={"data-controller-container":"",tabindex:"0",class:"glass-card card-stagger p-6 flex flex-col md:w-1/2",style:{"--stagger-index":"2"}},ia={class:"flex items-start gap-4 mb-4 shrink-0"},aa={class:"flex-1"},ra={class:"text-xl font-semibold text-white mb-2"},da={class:"text-white/70 text-sm mb-4"},ua={class:"space-y-3 flex-1 min-h-0"},ca={class:"flex items-center justify-between p-3 bg-white/5 rounded-lg"},va={class:"flex items-center gap-3"},xa={class:"text-white/80 text-sm"},ha={class:"text-white/60 text-sm"},ma={class:"flex items-center justify-between p-3 bg-white/5 rounded-lg"},pa={class:"flex items-center gap-3"},ba={class:"text-white/80 text-sm"},wa={class:"flex items-center justify-between p-3 bg-white/5 rounded-lg"},fa={class:"flex items-center gap-3"},ga={class:"text-white/80 text-sm"},ya={class:"text-white/60 text-sm"},_a={"data-controller-container":"",tabindex:"0",class:"glass-card card-stagger p-6 flex flex-col md:w-1/2",style:{"--stagger-index":"3"}},ka={class:"flex items-start gap-4 mb-4 shrink-0"},Ca={class:"flex-1"},Ma={class:"text-xl font-semibold text-white mb-2"},ja={class:"text-white/70 text-sm mb-4"},Pa={key:0,class:"shrink-0"},Da={class:"space-y-2 flex-1 min-h-0"},Ta=["onClick","disabled"],Ra={key:0,class:"w-1.5 h-1.5 rounded-full bg-green-400"},Ba={class:"min-w-0 flex-1"},$a={class:"text-sm font-medium"},Va={class:"text-xs text-white/50"},Sa={key:0,class:"mt-4 p-3 bg-white/5 rounded-lg"},za={class:"flex items-center justify-between gap-2"},Aa={class:"min-w-0"},Ia={class:"text-xs text-white/50 mb-1"},Ua=["title"],Na={key:1,class:"mt-3 text-xs text-amber-400/80"},La={class:"hidden md:flex items-start gap-4 mb-4"},Ha={class:"flex-1"},Ea={class:"text-xl font-semibold text-white mb-2"},Ka={class:"text-white/70 text-sm mb-4"},Fa={class:"flex gap-2 shrink-0"},Wa={class:"md:hidden mb-4"},Oa={class:"flex items-center gap-4 mb-2"},qa={class:"text-xl font-semibold text-white"},Ja={class:"text-white/70 text-sm mb-3"},Qa={class:"grid grid-cols-2 gap-2"},Ga={class:"flex gap-1 mb-4 border-b border-white/10"},Xa={key:0,class:"ml-1.5 text-xs text-white/50"},Ya={key:1,class:"w-2 h-2 rounded-full bg-orange-500 animate-pulse"},Za={key:0,class:"ml-1.5 text-xs text-orange-400"},er={key:1,class:"w-2 h-2 rounded-full bg-orange-500 animate-pulse"},tr={class:"space-y-2 max-h-48 overflow-y-auto"},sr={key:0,class:"p-4 text-center text-white/60 text-sm"},or={class:"flex items-center gap-3 min-w-0"},lr={class:"min-w-0"},nr={class:"text-sm font-mono text-white/90 truncate"},ir={class:"text-xs text-white/50 truncate"},ar=["onClick"],rr={class:"space-y-2 max-h-64 overflow-y-auto"},dr={key:0,class:"p-4 text-center text-white/60 text-sm"},ur={key:1,class:"p-4 text-center text-white/60 text-sm"},cr={class:"flex items-center justify-between gap-2 mb-1"},vr=["title"],xr={class:"text-xs text-white/40 shrink-0"},hr={class:"text-sm text-white/90 break-words"},mr={class:"space-y-2 max-h-64 overflow-y-auto"},pr={key:0,class:"p-4 text-center text-white/60 text-sm"},br={key:1,class:"p-4 text-center text-white/60 text-sm"},wr={class:"flex items-start justify-between gap-3"},fr={class:"min-w-0 flex-1"},gr=["title"],yr={key:0,class:"text-sm text-white/80 mt-1 break-words"},_r={class:"text-xs text-white/40 mt-1"},kr={class:"flex items-center gap-2 shrink-0"},Cr=["onClick","disabled"],Mr=["onClick","disabled"],jr=["disabled"],Pr=["disabled"],Dr=["disabled"],Tr={class:"glass-card p-6 mb-8"},Rr={class:"hidden md:flex items-center justify-between mb-4"},Br={class:"flex items-center gap-3"},$r={class:"text-lg font-semibold text-white"},Vr={class:"text-xs text-white/60"},Sr={key:0,class:"flex items-center gap-2"},zr=["disabled"],Ar={class:"md:hidden mb-4"},Ir={class:"flex items-center gap-3 mb-2"},Ur={class:"text-lg font-semibold text-white"},Nr={class:"text-xs text-white/60 mb-3"},Lr={key:0,class:"grid grid-cols-2 gap-2"},Hr=["disabled"],Er={class:"flex gap-1 mb-4 border-b border-white/10"},Kr={key:0,class:"ml-1.5 text-xs text-white/50"},Fr={key:0,class:"py-4 text-center"},Wr={class:"text-white/50 text-sm"},Or={key:1,class:"py-6 text-center"},qr={class:"text-white/60 text-sm mb-1"},Jr={class:"text-white/40 text-xs"},Qr={key:2,class:"space-y-3"},Gr={class:"flex items-start justify-between gap-3 mb-3"},Xr={class:"min-w-0 flex-1"},Yr={class:"text-sm font-medium text-white truncate"},Zr={key:0,class:"text-xs text-white/50 mt-0.5"},ed={class:"text-xs text-white/40 mt-0.5"},td=["onClick","disabled"],sd={class:"flex flex-wrap items-center gap-2 mb-2"},od=["onClick","disabled"],ld={key:0,class:"flex items-center gap-3 mt-2"},nd={class:"flex items-center gap-2 flex-1"},id=["value","onChange"],ad={class:"text-xs text-orange-400/80"},rd={key:1,class:"text-xs text-green-400/70 mt-1"},dd={key:2,class:"text-xs text-blue-400/70 mt-1"},ud={class:"mb-4"},cd={class:"flex items-center gap-3"},vd={value:""},xd=["value"],hd=["disabled"],md={key:0,class:"text-xs text-red-400 mt-2"},pd={key:0,class:"py-4 text-center"},bd={class:"text-white/50 text-sm"},wd={key:1,class:"py-6 text-center"},fd={class:"text-white/60 text-sm mb-1"},gd={class:"text-white/40 text-xs"},yd={key:2,class:"py-6 text-center"},_d={class:"text-white/60 text-sm"},kd={key:3,class:"space-y-2"},Cd={class:"w-8 h-8 rounded-lg bg-white/10 flex items-center justify-center shrink-0"},Md={key:0,class:"w-4 h-4 text-orange-400",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},jd={key:1,class:"w-4 h-4 text-white/60",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},Pd={class:"flex-1 min-w-0"},Dd={class:"text-sm font-medium text-white truncate"},Td={key:0,class:"text-xs text-white/50 truncate"},Rd={class:"flex items-center gap-2 mt-0.5"},Bd={class:"text-xs text-white/40"},$d={class:"text-xs text-white/40"},Vd={key:0,class:"text-xs text-orange-400 ml-1"},Sd={key:1,class:"text-xs text-green-400/70 ml-1"},zd=["onClick"],Ad=["onClick"],Id={class:"glass-card p-0 w-full max-w-2xl overflow-hidden",role:"dialog","aria-modal":"true"},Ud={class:"flex items-center justify-between px-4 py-3 border-b border-white/10"},Nd={class:"min-w-0 flex-1"},Ld={class:"text-sm font-medium text-white truncate"},Hd={class:"text-xs text-white/50"},Ed={class:"flex items-center gap-3 shrink-0"},Kd={key:0,class:"flex items-center gap-1 px-2 py-1 rounded bg-orange-500/20"},Fd={class:"text-xs text-orange-400 font-medium"},Wd={class:"p-4"},Od={key:0},qd=["src"],Jd={key:1},Qd=["src"],Gd={key:2,class:"mt-3 p-3 bg-red-500/10 border border-red-500/20 rounded-lg"},Xd={class:"text-red-400 text-sm"},Yd={class:"flex items-center justify-between mt-3"},Zd={class:"text-xs text-white/40"},eu={key:0},tu={class:"glass-card p-6 w-full max-w-2xl mx-4 max-h-[90vh] overflow-y-auto",role:"dialog","aria-modal":"true","aria-labelledby":"add-content-title"},su={id:"add-content-title",class:"text-lg font-bold text-white mb-4"},ou={class:"space-y-4"},lu={class:"flex gap-2"},nu=["onClick"],iu={key:0},au={key:0,class:"text-xs text-orange-400/80 mt-1"},ru={key:0,class:"mt-3 p-2 bg-red-500/20 border border-red-500/30 rounded-lg"},du={class:"text-red-300 text-xs"},uu={class:"flex gap-3 mt-6"},cu=["disabled"],vu={class:"glass-card p-6 mb-8"},xu={class:"hidden md:flex items-center justify-between mb-4"},hu={class:"flex items-center gap-3"},mu={class:"text-lg font-semibold text-white"},pu={class:"text-xs text-white/60"},bu={class:"md:hidden mb-4"},wu={class:"flex items-center gap-3 mb-2"},fu={class:"text-lg font-semibold text-white"},gu={class:"text-xs text-white/60 mb-3"},yu={key:0,class:"py-6 text-center"},_u={class:"text-white/50 text-sm"},ku={key:1,class:"py-6 text-center"},Cu={class:"text-white/60 text-sm mb-1"},Mu={class:"text-white/40 text-xs"},ju={key:2,class:"space-y-3"},Pu=["onClick"],Du=["src"],Tu={class:"flex-1 min-w-0"},Ru={class:"flex items-center gap-2"},Bu={class:"text-white font-medium text-sm"},$u={key:0,class:"text-yellow-400 text-xs",title:"Default identity"},Vu={class:"flex items-center gap-1 mt-0.5"},Su=["title"],zu=["onClick"],Au={key:0,class:"flex items-center gap-1 mt-0.5"},Iu=["title"],Uu=["onClick"],Nu={class:"flex items-center gap-1 shrink-0"},Lu=["onClick"],Hu=["onClick"],Eu=["onClick"],Ku={class:"glass-card p-6 w-full max-w-2xl mx-4 max-h-[90vh] overflow-y-auto",role:"dialog","aria-modal":"true","aria-labelledby":"create-identity-title"},Fu={id:"create-identity-title",class:"text-lg font-bold text-white mb-4"},Wu={class:"space-y-4"},Ou={class:"grid grid-cols-3 gap-2"},qu=["onClick"],Ju={key:0,class:"mt-3 p-2 bg-red-500/20 border border-red-500/30 rounded-lg"},Qu={class:"text-red-300 text-xs"},Gu={class:"flex gap-3 mt-6"},Xu=["disabled"],Yu={class:"glass-card p-6 w-full max-w-2xl mx-4 max-h-[90vh] overflow-y-auto",role:"dialog","aria-modal":"true","aria-labelledby":"delete-identity-title"},Zu={id:"delete-identity-title",class:"text-lg font-bold text-white mb-2"},ec={class:"text-white/60 text-sm mb-4"},tc={class:"flex gap-3"},sc=["disabled"],oc={class:"glass-card p-6 w-full max-w-2xl mx-4 max-h-[90vh] overflow-y-auto",role:"dialog","aria-modal":"true","aria-labelledby":"key-viewer-title"},lc={class:"flex items-center gap-3 mb-5"},nc={id:"key-viewer-title",class:"text-lg font-bold text-white"},ic={class:"text-xs text-white/50 capitalize"},ac={class:"space-y-3 mb-5"},rc={class:"space-y-2"},dc={class:"bg-black/30 rounded-lg p-3"},uc={class:"flex items-center justify-between mb-1"},cc={class:"text-xs font-mono text-white/70 break-all"},vc={class:"bg-black/30 rounded-lg p-3"},xc={class:"flex items-center justify-between mb-1"},hc={class:"text-xs font-mono text-white/70 break-all"},mc={key:0,class:"bg-black/30 rounded-lg p-3"},pc={class:"flex items-center justify-between mb-1"},bc={class:"text-xs font-mono text-white/70 break-all"},wc={key:1,class:"bg-black/30 rounded-lg p-3"},fc={class:"flex items-center justify-between mb-1"},gc={class:"text-xs font-mono text-white/70 break-all"},yc={class:"border-t border-white/10 pt-5"},_c={key:0},kc={class:"flex gap-2"},Cc=["disabled"],Mc={key:0,class:"text-red-400 text-xs mt-2"},jc={key:1,class:"space-y-2"},Pc={class:"bg-red-500/5 border border-red-500/10 rounded-lg p-3"},Dc={class:"flex items-center justify-between mb-1"},Tc={class:"text-xs font-mono text-red-200/70 break-all"},Rc={key:0,class:"bg-red-500/5 border border-red-500/10 rounded-lg p-3"},Bc={class:"flex items-center justify-between mb-1"},$c={class:"text-xs font-mono text-red-200/70 break-all"},Vc={key:1,class:"bg-red-500/5 border border-red-500/10 rounded-lg p-3"},Sc={class:"flex items-center justify-between mb-1"},zc={class:"text-xs font-mono text-red-200/70 break-all"},Ac={class:"glass-card p-6 w-full max-w-2xl mx-4 max-h-[90vh] overflow-y-auto",role:"dialog","aria-modal":"true","aria-labelledby":"profile-editor-title"},Ic={class:"flex items-center gap-3 mb-5"},Uc={class:"relative w-16 h-16 rounded-full overflow-hidden bg-white/10 shrink-0"},Nc=["src"],Lc={key:1,class:"w-full h-full flex items-center justify-center"},Hc={class:"text-2xl font-bold text-white/40"},Ec={class:"text-xs text-white/50"},Kc={class:"space-y-3"},Fc=["placeholder"],Wc={class:"grid grid-cols-2 gap-3"},Oc={key:0,class:"mt-3 p-2 bg-red-500/20 border border-red-500/30 rounded-lg"},qc={class:"text-red-300 text-xs"},Jc={key:1,class:"mt-3 p-2 bg-green-500/20 border border-green-500/30 rounded-lg"},Qc={class:"text-green-300 text-xs"},Gc={class:"flex gap-3 mt-5"},Xc=["disabled"],Yc=["disabled"],Zc={class:"glass-card p-6 w-full max-w-2xl mx-4 max-h-[90vh] overflow-y-auto",role:"dialog","aria-modal":"true","aria-labelledby":"send-bitcoin-title"},e0={id:"send-bitcoin-title",class:"text-lg font-bold text-white mb-4"},t0={class:"flex gap-1 mb-4 p-1 bg-white/5 rounded-lg"},s0=["onClick"],o0={key:0,class:"mb-3 p-2 bg-white/5 rounded-lg"},l0={class:"mb-3"},n0={key:1,class:"mb-3"},i0={class:"text-white/60 text-sm block mb-1"},a0=["placeholder"],r0={key:2,class:"mb-3 p-2 bg-white/5 rounded-lg"},d0={class:"text-xs font-mono text-white/80 break-all"},u0={key:3,class:"mb-3 flex items-center gap-3 p-3 bg-white/5 rounded-lg"},c0={class:"relative inline-flex items-center cursor-pointer"},v0={class:"text-sm text-white"},x0={class:"text-xs text-white/40"},h0={key:4,class:"mb-3 space-y-2"},m0={class:"p-3 bg-white/5 rounded-lg"},p0=["value"],b0={class:"p-3 bg-white/5 rounded-lg"},w0={class:"flex gap-2 mt-2"},f0={class:"text-xs text-orange-400 hover:text-orange-300 cursor-pointer"},g0={key:5,class:"mb-3 p-2 bg-green-500/10 border border-green-500/20 rounded-lg"},y0={class:"text-green-400 text-xs"},_0={key:6,class:"mb-3 p-2 bg-green-500/10 border border-green-500/20 rounded-lg"},k0={class:"text-green-400 text-xs"},C0={key:7,class:"mb-3 text-xs text-red-400"},M0={class:"flex gap-3"},j0=["disabled"],P0=["disabled"],D0={class:"glass-card p-6 w-full max-w-2xl mx-4 max-h-[90vh] overflow-y-auto",role:"dialog","aria-modal":"true","aria-labelledby":"receive-bitcoin-title"},T0={id:"receive-bitcoin-title",class:"text-lg font-bold text-white mb-4"},R0={class:"flex gap-1 mb-4 p-1 bg-white/5 rounded-lg"},B0=["onClick"],$0={key:0},V0={class:"mb-3"},S0={class:"mb-3"},z0={key:0,class:"mb-3 p-2 bg-white/5 rounded-lg"},A0={class:"text-xs font-mono text-white/80 break-all"},I0={key:1},U0={key:0,class:"mb-3 p-3 bg-white/5 rounded-lg text-center"},N0={class:"text-sm font-mono text-white/90 break-all"},L0={key:1,class:"mb-3 text-center"},H0={class:"text-white/50 text-sm mb-2"},E0={key:2},K0={class:"mb-3"},F0={key:0,class:"mb-3 text-xs text-green-400"},W0={key:3,class:"mb-3 text-xs text-red-400"},O0={class:"flex gap-3"},q0=["disabled"],J0={class:"glass-card p-6 mb-8"},Q0={class:"flex items-center justify-between mb-4"},G0={class:"flex items-center gap-3"},X0={class:"text-lg font-semibold text-white"},Y0={class:"text-xs text-white/60"},Z0={key:0,class:"py-6 text-center"},e1={class:"text-white/60 text-sm mb-4"},t1={class:"grid grid-cols-2 md:grid-cols-4 gap-3 mb-4"},s1={class:"bg-white/5 rounded-lg p-3"},o1={class:"text-xs text-white/50 mb-1"},l1={class:"flex items-center gap-2"},n1={class:"text-sm text-white font-medium"},i1={class:"bg-white/5 rounded-lg p-3"},a1={class:"flex items-center gap-2"},r1={class:"text-sm text-white font-medium capitalize"},d1={class:"bg-white/5 rounded-lg p-3"},u1={class:"text-sm text-white font-medium"},c1={class:"bg-white/5 rounded-lg p-3"},v1={class:"text-sm text-white font-medium"},x1={class:"mb-4"},h1={class:"flex items-center justify-between mb-2"},m1={class:"text-xs text-white/50"},p1={key:0,class:"bg-white/5 rounded-lg p-3 mb-3"},b1={class:"flex gap-2 items-end"},w1={class:"flex-1"},f1={class:"flex items-center gap-1.5 text-xs text-white/60 cursor-pointer whitespace-nowrap pb-1.5"},g1=["disabled"],y1={key:1,class:"flex flex-wrap gap-2"},_1={key:0,class:"text-green-400/60",title:"Published"},k1=["onClick","disabled"],C1={key:2,class:"text-xs text-white/30 italic"},M1={key:0,class:"mb-4"},j1={class:"space-y-1"},P1={class:"truncate font-mono"},D1={class:"mb-4"},T1={class:"flex items-center justify-between mb-2"},R1={key:0},B1={key:0,class:"text-xs text-white/40 py-4 text-center"},$1={key:1,class:"text-xs text-white/30 italic py-2"},V1={key:2,class:"space-y-2 max-h-64 overflow-y-auto"},S1={class:"flex items-center justify-between mb-1"},z1=["title"],A1={class:"text-xs text-white/40"},I1={class:"flex flex-wrap gap-2 text-xs"},U1={class:"text-white/70"},N1={key:0,class:"text-blue-300/80"},L1={key:1,class:"text-purple-300/80"},H1={key:0,class:"mt-1 text-xs text-white/40 font-mono truncate"},E1={class:"flex items-center justify-between pt-3 border-t border-white/10"},K1={class:"text-xs text-white/40"},F1=["disabled"],W1={class:"glass-card p-6 mb-8"},O1={class:"hidden md:flex items-center justify-between mb-4"},q1={class:"flex items-center gap-3"},J1={class:"text-lg font-semibold text-white"},Q1={class:"text-xs text-white/60"},G1={class:"md:hidden mb-4"},X1={class:"flex items-center gap-3 mb-2"},Y1={class:"text-lg font-semibold text-white"},Z1={class:"text-xs text-white/60 mb-3"},ev={class:"grid grid-cols-3 gap-3 mb-4"},tv={class:"bg-white/5 rounded-lg p-3"},sv={class:"text-sm text-white font-medium"},ov={class:"bg-white/5 rounded-lg p-3"},lv={class:"text-sm text-green-400 font-medium"},nv={class:"bg-white/5 rounded-lg p-3"},iv={class:"text-sm text-white font-medium"},av={key:0,class:"space-y-2"},rv={class:"min-w-0 flex-1"},dv={class:"text-sm text-white font-medium"},uv={class:"text-xs text-white/50 truncate"},cv={key:1,class:"text-center text-white/40 text-sm py-4"},vv={class:"glass-card p-6 w-full max-w-2xl mx-4 max-h-[90vh] overflow-y-auto",role:"dialog","aria-modal":"true","aria-labelledby":"domains-title"},xv={class:"flex items-center justify-between mb-4"},hv={id:"domains-title",class:"text-lg font-bold text-white"},mv={key:0,class:"space-y-2 mb-4"},pv={class:"text-sm text-white font-medium font-mono"},bv={class:"text-xs text-white/50 truncate max-w-[200px]"},wv={class:"flex items-center gap-2"},fv=["onClick"],gv={key:1,class:"text-center text-white/40 text-sm py-4 mb-4"},yv={class:"border-t border-white/10 pt-4"},_v={class:"text-sm font-semibold text-white mb-3"},kv={class:"grid grid-cols-2 gap-3 mb-3"},Cv={class:"mb-3"},Mv=["value"],jv={key:0,class:"text-xs text-red-400 mb-2"},Pv=["disabled"],Dv={class:"border-t border-white/10 pt-4 mt-4"},Tv={class:"text-sm font-semibold text-white mb-3"},Rv={class:"flex gap-2"},Bv=["disabled"],$v={key:0,class:"mt-2 p-3 bg-white/5 rounded-lg"},Vv={class:"flex items-center gap-2 mb-1"},Sv={class:"text-sm text-white font-medium"},zv={key:0,class:"text-xs text-white/50 font-mono truncate"},Av={class:"glass-card p-6 w-full max-w-2xl mx-4 max-h-[90vh] overflow-y-auto",role:"dialog","aria-modal":"true","aria-labelledby":"relays-title"},Iv={class:"flex items-center justify-between mb-4"},Uv={id:"relays-title",class:"text-lg font-bold text-white"},Nv={key:0,class:"space-y-2 mb-4"},Lv={class:"flex items-center gap-3 min-w-0 flex-1"},Hv={class:"text-sm text-white font-mono truncate"},Ev={class:"flex items-center gap-2 flex-shrink-0"},Kv=["onClick"],Fv=["onClick"],Wv={key:1,class:"text-center text-white/40 text-sm py-4 mb-4"},Ov={class:"border-t border-white/10 pt-4"},qv={class:"text-sm font-semibold text-white mb-3"},Jv={class:"flex gap-2"},Qv=["placeholder"],Gv=["disabled"],Xv={key:0,class:"text-xs text-red-400 mt-2"},Yv={key:0,class:"fixed bottom-24 md:bottom-8 left-1/2 -translate-x-1/2 z-50 px-4 py-2 rounded-lg bg-black/80 backdrop-blur-md border border-white/10 text-white text-sm shadow-lg"},ox=Ml({__name:"Web5",setup(Zv){const qs=$l(),Mt=Vl(),{t:i}=jl(),bo=Sl(),ts=Il(),ss=Pl(),H=d(null),wo=j(()=>{if(!H.value)return"...";const l=H.value.total_sats;return l===0?"0 sats":l<1e5?`${l.toLocaleString()} sats`:`₿${(l/1e8).toFixed(8).replace(/0+$/,"").replace(/\.$/,"")}`});async function fo(){try{const l=await c.call({method:"wallet.networking-profits"});H.value=l}catch{H.value={total_sats:0,content_sales_sats:0,routing_fees_sats:0}}}const X=d([]),Fe=d(!1),ye=d(""),_e=d(""),de=d(""),We=d(""),jt=d(!1),Oe=d(""),Pt=d(!1),Y=d(null),os=j(()=>X.value.filter(l=>l.status==="active").length),Js=j(()=>X.value.filter(l=>l.status==="expired"||l.expires_at).length);async function ls(){try{const l=await c.call({method:"identity.list-names"});X.value=l.names||[]}catch{X.value=[]}}async function go(){if(!(!ye.value.trim()||!_e.value.trim()||!de.value)){jt.value=!0,We.value="";try{const l=we.value.find(t=>t.id===de.value);await c.call({method:"identity.register-name",params:{name:ye.value.trim(),domain:_e.value.trim(),identity_id:de.value,did:l?.did||""}}),ye.value="",_e.value="",de.value="",await ls()}catch(l){We.value=l instanceof Error?l.message:i("web5.registrationFailed")}finally{jt.value=!1}}}async function yo(l){try{await c.call({method:"identity.remove-name",params:{id:l}}),await ls()}catch(t){We.value=t instanceof Error?t.message:i("web5.removeFailed")}}async function _o(){if(Oe.value.trim()){Pt.value=!0,Y.value=null;try{const l=await c.call({method:"identity.resolve-name",params:{identifier:Oe.value.trim()}});Y.value=l}catch{Y.value={name:"",domain:"",nostr_pubkey:null,relays:[],verified:!1}}finally{Pt.value=!1}}}const Z=d([]);async function ko(){try{const l=await c.call({method:"identity.list-credentials"});Z.value=l.credentials||[]}catch{Z.value=[]}}async function Dt(){try{const[l,t]=await Promise.all([c.call({method:"nostr.list-relays"}),c.call({method:"nostr.get-stats"})]);It.value=l.relays||[],K.value=t}catch{It.value=[],K.value=null}}async function Qs(){if(Pe.value.trim()){De.value="";try{await c.call({method:"nostr.add-relay",params:{url:Pe.value.trim()}}),Pe.value="",await Dt()}catch(l){De.value=l instanceof Error?l.message:i("web5.failedToAddRelay")}}}async function Co(l){try{await c.call({method:"nostr.remove-relay",params:{url:l}}),await Dt()}catch(t){De.value=t instanceof Error?t.message:i("web5.failedToRemoveRelay")}}async function Mo(l,t){try{await c.call({method:"nostr.toggle-relay",params:{url:l,enabled:t}}),await Dt()}catch(v){De.value=v instanceof Error?v.message:i("web5.failedToToggleRelay")}}const ke=d(null);try{ke.value=localStorage.getItem("neode_did")||null}catch{}const ee=j(()=>ke.value),ns=j(()=>ee.value?"active":"inactive"),Tt=d(!1),is=d(!1);async function jo(){Tt.value=!0;try{const l=await c.call({method:"identity.create-did"});ke.value=l.did,localStorage.setItem("neode_did",l.did)}catch{if(crypto.subtle){const l=await crypto.subtle.generateKey({name:"ECDSA",namedCurve:"P-256"},!0,["sign","verify"]),t=await crypto.subtle.exportKey("raw",l.publicKey),v=new Uint8Array(t),x=`did:key:z${Array.from(v).map(p=>p.toString(16).padStart(2,"0")).join("")}`;ke.value=x,localStorage.setItem("neode_did",x)}else{const l=new Uint8Array(32);crypto.getRandomValues(l);const v=`did:key:z${Array.from(l).map(s=>s.toString(16).padStart(2,"0")).join("")}`;ke.value=v,localStorage.setItem("neode_did",v)}}finally{Tt.value=!1}}const I=d(null),te=d(!1),as=d(!1);async function Po(){te.value=!0;try{const t=(await c.call({method:"identity.list"})).identities?.find(s=>s.is_default);if(!t)return;const v=await c.call({method:"identity.create-dht-did",params:{identity_id:t.id}});I.value=v.dht_did,localStorage.setItem("neode_dht_did",v.dht_did)}catch{const l=ke.value||localStorage.getItem("neode_did");if(l){const t=l.replace("did:key:","did:dht:");I.value=t,localStorage.setItem("neode_dht_did",t)}}finally{te.value=!1}}async function Do(){te.value=!0;try{const t=(await c.call({method:"identity.list"})).identities?.find(v=>v.is_default);if(!t)return;await c.call({method:"identity.refresh-dht-did",params:{identity_id:t.id}})}catch{}finally{te.value=!1}}async function To(){I.value&&(await z(I.value),as.value=!0,setTimeout(()=>{as.value=!1},2e3))}try{I.value=localStorage.getItem("neode_dht_did")||null}catch{}async function Ro(){ee.value&&(await z(ee.value),is.value=!0,setTimeout(()=>{is.value=!1},2e3))}const qe=d(!1),rs=d(!1),Rt=d(null),Bt=d(null),ds=d(!1),us=j(()=>Rt.value?JSON.stringify(Rt.value,null,2):"");async function Bo(){qe.value=!0,rs.value=!0,Bt.value=null;try{const l=await c.resolveDid();Rt.value=l;const t=await c.call({method:"identity.verify-did-document",params:{document:l}});Bt.value=t.valid}catch{Rt.value=null}finally{rs.value=!1}}async function $o(){us.value&&(await z(us.value),ds.value=!0,setTimeout(()=>{ds.value=!1},2e3))}const R=d(null),U=d("idle"),Je=j(()=>!!ss.packages.dwn),cs=j(()=>ss.packages.dwn?.state===Ul.Running),Qe=d(!1),Ge=d([]),$t=d([]),Xe=d(!1),vs=d(!1),Ye=d(!1),Ce=d(""),Vt=d(!1),Ze=d(!1),xs=d(null),Vo=j(()=>{if(!R.value)return"0 B";const l=R.value.storage_bytes;return l<1024?`${l} B`:l<1024*1024?`${(l/1024).toFixed(1)} KB`:l<1024*1024*1024?`${(l/(1024*1024)).toFixed(1)} MB`:`${(l/(1024*1024*1024)).toFixed(2)} GB`});async function St(){try{const l=await c.call({method:"dwn.status"});R.value=l,U.value=l.sync_status||"idle"}catch{R.value=null,U.value="idle"}}const E=d(!1),zt=d(!1),hs=d(0),ms=d(0),ps=d([]),Me=d(!1),bs=j(()=>ps.value.filter(l=>l.direction==="incoming"&&l.num_confirmations<3)),Gs=j(()=>bs.value.length);async function Xs(){try{const l=await c.call({method:"lnd.gettransactions"});ps.value=l.transactions||[],(l.incoming_pending_count||0)>0&&!Me.value&&(Me.value=!0)}catch{ps.value=[]}}function So(l){if(!l)return"";const t=new Date(l*1e3),s=new Date().getTime()-t.getTime(),x=Math.floor(s/6e4);if(x<1)return"Just now";if(x<60)return`${x}m ago`;const p=Math.floor(x/60);if(p<24)return`${p}h ago`;const Ks=Math.floor(p/24);return Ks<7?`${Ks}d ago`:t.toLocaleDateString()}function zo(l){Mt.push({name:"app-session",params:{appId:"mempool"},query:{path:`/tx/${l}`}})}let At=null;const It=d([]),K=d(null),je=d(!1),Pe=d(""),De=d(""),F=d([]),Ut=d(!1),ws=d({}),Ao=j(()=>({...ss.peerHealth,...ws.value})),fs=j(()=>F.value.length),Nt=d([]);async function Io(){try{const l=await c.detectUsbDevices();Nt.value=l.devices||[]}catch{Nt.value=[]}}const Te=d(!1),Ys=d(null),Zs=d(null);function gs(){Zs.value?.focus?.(),Te.value=!1}Dl(Ys,Te,gs,{restoreFocusRef:Zs});const Re=d(""),Be=d(""),Lt=d(!1),Ht=d(""),et=d(""),Et=d(!1),ys=d(null),P=d("peers"),{receivedMessages:Kt,loadingMessages:_s,unreadCount:eo,loadReceivedMessages:ks,markAsRead:Cs}=bo;function to(l){try{const t=new Date(l),s=new Date().getTime()-t.getTime();return s<6e4?"Just now":s<36e5?`${Math.floor(s/6e4)}m ago`:s<864e5?`${Math.floor(s/36e5)}h ago`:t.toLocaleDateString()}catch{return l}}function Uo(){P.value="messages",Cs()}async function tt(){Ut.value=!0;try{const t=(await c.listPeers()).peers||[];try{const s=(await c.federationListNodes()).nodes||[];for(const x of s)x.onion&&!t.some(p=>p.onion===x.onion||p.pubkey===x.pubkey)&&t.push({onion:x.onion,pubkey:x.pubkey,name:x.name||`Federation: ${x.did?.slice(0,16)||"node"}`})}catch{}F.value=t;for(const v of F.value)try{const s=await c.checkPeerReachable(v.onion);ws.value[v.onion]=s.reachable}catch{ws.value[v.onion]=!1}}catch{}finally{Ut.value=!1}}async function No(){if(!(!Re.value||!Be.value.trim())){Lt.value=!0,Ht.value="",et.value="";try{await c.sendMessageToPeer(Re.value,Be.value.trim()),et.value=i("web5.messageSent"),Be.value="",setTimeout(()=>{Te.value=!1,et.value=""},1500)}catch(l){Ht.value=l instanceof Error?l.message:i("web5.failedToSend")}finally{Lt.value=!1}}}async function Lo(){Et.value=!0;try{const t=(await c.discoverNodes()).nodes||[];for(const v of t)if(v.onion&&v.pubkey)try{await c.addPeer({onion:v.onion,pubkey:v.pubkey})}catch{}await tt()}catch{}finally{Et.value=!1}}const Ft=d(0),so=d(0),oo=d(0),$e=d(""),Ve=d(""),Wt=d(""),Ms=d(!1),st=d("auto"),se=d(0),ue=d(""),S=d(!1),N=d(""),Se=d(""),ot=d(""),Ot=d(!1),W=d(""),lt=d("idle"),O=d(""),js=d(!1),q=d("lightning"),nt=d(0),Ps=d(""),it=d(""),at=d(""),lo=d(null),rt=d(!1),ce=d(""),ve=j(()=>{if(st.value!=="auto")return st.value;const l=se.value||0;return l<=0?"lightning":l<1e3?"ecash":l>5e5?"onchain":"lightning"});async function qt(){try{const l=await c.call({method:"wallet.ecash-balance"});Ft.value=l.balance_sats??0,so.value=l.token_count??0}catch{Ft.value=0,so.value=0}try{const l=await c.call({method:"wallet.ecash-history"});oo.value=l.transactions?.length??0}catch{oo.value=0}}function Ds(){Ms.value=!1,$e.value="",N.value="",Se.value="",ot.value="",W.value="",lt.value="idle",O.value=""}function Ts(){js.value=!1,it.value="",at.value="",Ve.value="",Wt.value="",ce.value=""}async function Ho(){if(!se.value||S.value)return;S.value=!0,N.value="",$e.value="",Se.value="",ot.value="";const l=ve.value;try{if(l==="ecash"){const t=await c.call({method:"wallet.ecash-send",params:{amount_sats:se.value}});$e.value=t.token}else if(l==="lightning"){if(!ue.value.trim()){N.value=i("web5.pasteInvoice");return}const t=await c.call({method:"lnd.payinvoice",params:{payment_request:ue.value.trim()}});ot.value=t.payment_hash}else{if(!ue.value.trim()){N.value=i("web5.enterBitcoinAddress");return}if(Ot.value){const v=await c.createPsbt({outputs:[{address:ue.value.trim(),amount_sats:se.value}]});W.value=v.psbt_base64,lt.value="created",O.value="",S.value=!1;return}const t=await c.call({method:"lnd.sendcoins",params:{addr:ue.value.trim(),amount:se.value}});Se.value=t.txid}await qt(),await _t()}catch(t){N.value=t instanceof Error?t.message:i("web5.sendFailed")}finally{S.value=!1}}async function Eo(){if(!(!O.value.trim()||S.value)){S.value=!0,N.value="";try{await c.finalizePsbt(O.value.trim()),lt.value="idle",W.value="",O.value="",Se.value=i("web5.broadcastViaHwWallet"),await _t()}catch(l){N.value=l instanceof Error?l.message:i("web5.broadcastFailed")}finally{S.value=!1}}}function Ko(){W.value&&(z(W.value),N.value=i("web5.psbtCopied"))}function Fo(){if(!W.value)return;const l=new Blob([W.value],{type:"text/plain"}),t=URL.createObjectURL(l),v=document.createElement("a");v.href=t,v.download="transaction.psbt",v.click(),URL.revokeObjectURL(t)}function Wo(l){const t=l.target,v=t.files?.[0];if(!v)return;const s=new FileReader;s.onload=x=>{O.value=x.target?.result||""},s.readAsText(v),t.value=""}async function Oo(){if(!rt.value){rt.value=!0,ce.value="";try{if(q.value==="lightning"){if(!nt.value||nt.value<1){ce.value=i("web5.enterAmount");return}const l=await c.call({method:"lnd.createinvoice",params:{amount_sats:nt.value,memo:Ps.value}});it.value=l.payment_request}else if(q.value==="onchain"){const l=await c.call({method:"lnd.newaddress"});at.value=l.address,Fs(()=>Jo(l.address,lo.value))}else{if(!Ve.value.trim()){ce.value=i("web5.pasteEcashToken");return}const l=await c.call({method:"wallet.ecash-receive",params:{token:Ve.value.trim()}});Wt.value=`Received ${l.received_sats} sats!`,Ve.value="",await qt()}}catch(l){ce.value=l instanceof Error?l.message:i("web5.receiveFailed")}finally{rt.value=!1}}}function qo(l){z(l),g(i("web5.ecashTokenCopied"))}async function z(l){if(navigator.clipboard?.writeText)await navigator.clipboard.writeText(l);else{const t=document.createElement("textarea");t.value=l,t.style.position="fixed",t.style.opacity="0",document.body.appendChild(t),t.select(),document.execCommand("copy"),document.body.removeChild(t)}}function no(l,t){z(l),g(t)}async function Jo(l,t){if(!(!t||!l))try{await(await zl(()=>import("./browser-rpPU-9HU.js").then(s=>s.b),[])).toCanvas(t,`bitcoin:${l}`,{width:200,margin:2,color:{dark:"#000000",light:"#ffffff"}})}catch{}}const J=d([]),xe=d(!1),he=d(!1),ze=d(""),Jt=d("application/octet-stream"),Qt=d(""),me=d("free"),Ae=d(100),dt=d(!1),ut=d(""),Rs=d(null),ct=d(null),io=[{value:"free",label:"Free"},{value:"peers_only",label:"Peers Only"},{value:"paid",label:"Paid"}];function Gt(l){return typeof l.access=="string"?l.access==="peersonly"||l.access==="peers_only"?"peers_only":l.access==="paid"?"paid":"free":l.access&&typeof l.access=="object"&&"paid"in l.access?"paid":"free"}function Bs(l){return typeof l.access=="object"&&l.access&&"paid"in l.access?l.access.paid.price_sats:0}function $s(l){if(l===0)return"0 B";const t=["B","KB","MB","GB"],v=Math.min(Math.floor(Math.log(l)/Math.log(1024)),t.length-1);return`${(l/Math.pow(1024,v)).toFixed(v===0?0:1)} ${t[v]}`}async function Ie(){xe.value=!0;try{const l=await c.call({method:"content.list-mine"});J.value=l.items||[]}catch{J.value=[]}finally{xe.value=!1}}async function Qo(){if(!(dt.value||!ze.value.trim())){dt.value=!0,ut.value="";try{if(await c.call({method:"content.add",params:{filename:ze.value.trim(),mime_type:Jt.value.trim()||"application/octet-stream",description:Qt.value.trim()}}),me.value!=="free"){const l=(await c.call({method:"content.list-mine"})).items||[],t=l[l.length-1];t&&await c.call({method:"content.set-pricing",params:{id:t.id,access:me.value,...me.value==="paid"?{price_sats:Ae.value||100}:{}}})}he.value=!1,ze.value="",Jt.value="application/octet-stream",Qt.value="",me.value="free",Ae.value=100,await Ie(),g(i("web5.contentAdded"))}catch(l){ut.value=l instanceof Error?l.message:i("web5.failedToAddContent")}finally{dt.value=!1}}}async function Go(l){Rs.value=l;try{await c.call({method:"content.remove",params:{id:l}}),J.value=J.value.filter(t=>t.id!==l),g(i("web5.contentRemoved"))}catch{g(i("web5.failedToRemoveContent"))}finally{Rs.value=null}}async function Xo(l,t){ct.value=l.id;try{const v={id:l.id,access:t};t==="paid"&&(v.price_sats=Bs(l)||100),await c.call({method:"content.set-pricing",params:v}),await Ie()}catch{g(i("web5.failedToUpdatePricing"))}finally{ct.value=null}}async function Yo(l,t){const v=parseInt(t,10);if(!(!v||v<=0)){ct.value=l.id;try{await c.call({method:"content.set-pricing",params:{id:l.id,access:"paid",price_sats:v}}),await Ie()}catch{g(i("web5.failedToUpdatePrice"))}finally{ct.value=null}}}const oe=d("mine"),A=d(""),pe=d(!1),vt=d(""),Ue=d([]);function ao(l){return l.startsWith("audio/")||l.startsWith("video/")}function Vs(l){return typeof l.access=="object"&&l.access&&"paid"in l.access?l.access.paid.price_sats:0}async function Zo(){if(!(!A.value||pe.value)){pe.value=!0,vt.value="",Ue.value=[];try{const l=await c.call({method:"content.browse-peer",params:{onion:A.value}});Ue.value=l.items||[],Ue.value.length===0&&(vt.value="")}catch(l){vt.value=l instanceof Error?l.message:i("web5.failedToConnectPeer")}finally{pe.value=!1}}}const le=d(null),Ne=d(""),Ss=d(0),xt=d(0),ht=d(""),mt=d(null),pt=d(null);function el(l){A.value&&(le.value=l,Ne.value=`http://${A.value}/content/${l.id}`,Ss.value=Vs(l),xt.value=0,ht.value="")}function tl(l){if(!A.value)return;const t=`http://${A.value}/content/${l.id}`;g(i("web5.downloadUrlCopied")),z(t)}function zs(){mt.value&&(mt.value.pause(),mt.value.src=""),pt.value&&(pt.value.pause(),pt.value.src=""),le.value=null,Ne.value="",xt.value=0,ht.value=""}function ro(){const l=mt.value||pt.value;l&&l.duration>0&&(xt.value=l.currentTime/l.duration)}function uo(){ht.value=i("web5.playerError")}function sl(){Ne.value&&(z(Ne.value),g(i("web5.streamUrlCopied")))}const C=d([]),Le=d(!1),He=d(null);async function As(){Le.value=!0;try{const l=await c.call({method:"network.list-requests"});C.value=l.requests||[],ts.pendingRequestCount=C.value.length}catch{C.value=[]}finally{Le.value=!1}}function ol(){P.value="requests",C.value.length===0&&!Le.value&&As()}async function ll(l){He.value=l;try{await c.call({method:"network.accept-request",params:{request_id:l}}),C.value=C.value.filter(t=>t.id!==l),ts.pendingRequestCount=C.value.length,await tt(),g(i("web5.connectionAccepted"))}catch{g(i("web5.failedToAcceptRequest"))}finally{He.value=null}}async function nl(l){He.value=l;try{await c.call({method:"network.reject-request",params:{request_id:l}}),C.value=C.value.filter(t=>t.id!==l),ts.pendingRequestCount=C.value.length,g(i("web5.requestRejected"))}catch{g(i("web5.failedToRejectRequest"))}finally{He.value=null}}const co=d(""),Is=d(!1);let vo;function g(l){co.value=l,Is.value=!0,clearTimeout(vo),vo=setTimeout(()=>{Is.value=!1},2e3)}const Q=d("hidden"),ne=d(null),Us=d(!1),Xt=d(!1),il=[{value:"hidden",label:"Hidden",description:"Your node is not discoverable by others"},{value:"discoverable",label:"Discoverable",description:"Federated peers can find and connect to your node"},{value:"public",label:"Public",description:"Accepting connections from any Archipelago node"}];async function al(){Us.value=!0;try{const l=await c.call({method:"network.get-visibility"});Q.value=l.visibility||"hidden",ne.value=l.onion_address||null}catch{Q.value="hidden"}finally{Us.value=!1}}async function rl(l){if(!(Xt.value||Q.value===l)){Xt.value=!0;try{const t=await c.call({method:"network.set-visibility",params:{visibility:l}});Q.value=t.visibility||l,ne.value=t.onion_address||ne.value,g(i("web5.visibilitySetTo",{level:l}))}catch{g(i("web5.failedToUpdateVisibility"))}finally{Xt.value=!1}}}function dl(){ne.value&&(z(ne.value),g(i("web5.onionAddressCopied")))}const w=d(null),D=d(null),ie=d(""),bt=d(!1),Ee=d(""),G=d(null);function ul(l){w.value=l,D.value=null,ie.value="",Ee.value=""}function Ns(){D.value=null,ie.value="",Ee.value="",w.value=null}async function xo(){if(!(!w.value||!ie.value||bt.value)){bt.value=!0,Ee.value="";try{const l=await c.call({method:"identity.export-keys",params:{id:w.value.id,password:ie.value}});D.value={ed25519_secret_hex:l.ed25519_secret_hex,nostr_secret_hex:l.nostr_secret_hex||"",nostr_nsec:l.nostr_nsec||""},ie.value=""}catch(l){Ee.value=l instanceof Error?l.message:"Failed to unlock keys"}finally{bt.value=!1}}}function be(l,t){z(t),G.value=l,setTimeout(()=>{G.value=null},2e3)}const B=d(null),_=d({}),wt=d(!1),ft=d(!1),ae=d(""),L=d("");function cl(l){B.value=l,_.value={...l.profile},ae.value="",L.value=""}function Ls(){B.value=null,_.value={},ae.value="",L.value=""}async function vl(){if(!(!B.value||wt.value)){wt.value=!0,ae.value="",L.value="";try{await c.call({method:"identity.update-profile",params:{id:B.value.id,..._.value}}),await Ke(),L.value="Profile saved",setTimeout(()=>{L.value=""},3e3)}catch(l){ae.value=l instanceof Error?l.message:"Failed to save"}finally{wt.value=!1}}}async function xl(){if(!(!B.value||ft.value)){ft.value=!0,ae.value="",L.value="";try{await c.call({method:"identity.update-profile",params:{id:B.value.id,..._.value}});const l=await c.call({method:"identity.publish-profile",params:{id:B.value.id}});await Ke(),L.value=`Published to relay (${l.event_id.slice(0,12)}...)`,setTimeout(()=>{L.value=""},5e3)}catch(l){ae.value=l instanceof Error?l.message:"Failed to publish"}finally{ft.value=!1}}}const we=d([]),Hs=d(!1),fe=d(!1),Yt=d("Personal"),Zt=d("personal"),gt=d(!1),es=d(null),re=d(null),yt=d(!1);async function Ke(){Hs.value=!0;try{const l=await c.call({method:"identity.list"});we.value=l.identities||[]}catch{we.value=[]}finally{Hs.value=!1}}async function hl(){if(!gt.value){es.value=null,gt.value=!0;try{await c.call({method:"identity.create",params:{name:Yt.value.trim()||"Personal",purpose:Zt.value}}),fe.value=!1,Yt.value="Personal",Zt.value="personal",await Ke(),g(i("web5.identityCreated"))}catch(l){es.value=l instanceof Error?l.message:i("web5.failedToCreateIdentity")}finally{gt.value=!1}}}function ho(l){z(l),g(i("web5.didCopied"))}async function ml(l){try{await c.call({method:"identity.set-default",params:{id:l}}),await Ke(),g(i("web5.defaultIdentityUpdated"))}catch{g(i("web5.failedToSetDefault"))}}function pl(l){re.value=l}async function bl(){if(!(!re.value||yt.value)){yt.value=!0;try{await c.call({method:"identity.delete",params:{id:re.value.id}}),re.value=null,await Ke(),g(i("web5.identityDeleted"))}catch{g(i("web5.failedToDeleteIdentity"))}finally{yt.value=!1}}}Tl(()=>{tt(),ks(),Ke(),al(),As(),qt(),Ie(),fo(),St(),Es(),ls(),Dt(),ko(),_t(),Xs(),Io(),At=setInterval(()=>{_t(),Xs(),qt()},3e4),qs.query.tab==="messages"&&(P.value="messages",Cs(),Fs(()=>{ys.value?.scrollIntoView({behavior:"smooth",block:"center"})}))}),Rl(()=>{At&&(clearInterval(At),At=null)}),Bl(()=>qs.query.tab,l=>{l==="messages"&&(P.value="messages",Cs(),Fs(()=>{ys.value?.scrollIntoView({behavior:"smooth",block:"center"})}))});async function wl(){Qe.value=!0,U.value="syncing";try{const l=await c.call({method:"dwn.sync"});U.value=l.sync_status||"synced",await St()}catch{U.value="error"}finally{Qe.value=!1}}async function Es(){try{const l=await c.call({method:"dwn.list-protocols"});Ge.value=l.protocols||[]}catch{Ge.value=[]}}async function fl(){if(!(Ze.value||!Ce.value.trim())){Ze.value=!0;try{await c.call({method:"dwn.register-protocol",params:{protocol:Ce.value.trim(),published:Vt.value}}),Ce.value="",Vt.value=!1,Ye.value=!1,await Es(),await St()}catch{}finally{Ze.value=!1}}}async function gl(l){xs.value=l;try{await c.call({method:"dwn.remove-protocol",params:{protocol:l}}),await Es(),await St()}catch{}finally{xs.value=null}}async function yl(){Xe.value=!Xe.value,Xe.value&&await _l()}async function _l(){vs.value=!0;try{const l=await c.call({method:"dwn.query-messages",params:{limit:50}});$t.value=l.messages||[]}catch{$t.value=[]}finally{vs.value=!1}}async function _t(){try{const l=await c.call({method:"lnd.getinfo"});hs.value=l.balance_sats||0,ms.value=l.channel_balance_sats||0,E.value=!0}catch{E.value=!1,hs.value=0,ms.value=0}}async function kl(){E.value?E.value=!1:(zt.value=!0,await _t(),zt.value=!1)}function Cl(){je.value=!0}return(l,t)=>{const v=Al("router-link");return n(),a("div",Nl,[e("div",Ll,[e("div",Hl,[e("div",El,[e("div",Kl,[t[82]||(t[82]=e("div",{class:"relative shrink-0"},[e("span",{class:"text-2xl text-orange-500 font-bold"},"₿")],-1)),e("div",Fl,[e("p",Wl,o(r(i)("web5.networkingProfits")),1),e("p",Ol,o(wo.value),1)])]),H.value?(n(),a("div",ql,[H.value.content_sales_sats>0?(n(),a("p",Jl,"Content: "+o(H.value.content_sales_sats.toLocaleString())+" sats",1)):u("",!0),H.value.routing_fees_sats>0?(n(),a("p",Ql,"Routing: "+o(H.value.routing_fees_sats.toLocaleString())+" sats",1)):u("",!0)])):u("",!0)]),e("div",Gl,[e("div",Xl,[e("div",Yl,[e("div",{class:h(["w-3 h-3 rounded-full",ns.value==="active"?"bg-green-400":"bg-yellow-400"])},null,2),ns.value==="active"?(n(),a("div",Zl)):u("",!0)]),e("div",en,[e("p",tn,o(r(i)("web5.didStatus")),1),ee.value?(n(),a("p",{key:0,class:"text-xs text-white/60 font-mono truncate",title:ee.value},o(ee.value),9,sn)):(n(),a("p",on,o(ns.value),1))])]),ee.value?(n(),a("div",ln,[e("button",{onClick:Ro,class:"px-3 py-1.5 glass-button glass-button-sm rounded text-xs font-medium text-white/90 hover:text-white transition-colors"},o(is.value?r(i)("common.copiedBang"):r(i)("web5.copyDid")),1),e("button",{onClick:Bo,class:"px-3 py-1.5 glass-button glass-button-sm rounded text-xs font-medium text-white/90 hover:text-white transition-colors"},o(r(i)("web5.viewDidDocument")),1)])):(n(),a("button",{key:1,onClick:jo,disabled:Tt.value,class:"w-fit px-3 py-1.5 glass-button glass-button-sm rounded text-xs font-medium text-white/90 hover:text-white transition-colors disabled:opacity-50"},o(Tt.value?r(i)("web5.creatingDid"):r(i)("web5.createDid")),9,nn))]),e("div",an,[e("div",rn,[e("div",dn,[e("div",{class:h(["w-3 h-3 rounded-full",I.value?"bg-blue-400":"bg-gray-500"])},null,2)]),e("div",un,[t[83]||(t[83]=e("p",{class:"text-sm font-medium text-white"},"DHT Identity",-1)),I.value?(n(),a("p",{key:0,class:"text-xs text-white/60 font-mono truncate",title:I.value},o(I.value),9,cn)):(n(),a("p",vn,"Not published"))])]),I.value?(n(),a("div",xn,[e("button",{onClick:To,class:"px-3 py-1.5 glass-button glass-button-sm rounded text-xs font-medium text-white/90 hover:text-white transition-colors"},o(as.value?"Copied!":"Copy"),1),e("button",{onClick:Do,disabled:te.value,class:"px-3 py-1.5 glass-button glass-button-sm rounded text-xs font-medium text-white/90 hover:text-white transition-colors disabled:opacity-50"},o(te.value?"Refreshing...":"Refresh DHT"),9,hn)])):ee.value?(n(),a("button",{key:1,onClick:Po,disabled:te.value,class:"w-fit px-3 py-1.5 glass-button glass-button-sm rounded text-xs font-medium text-white/90 hover:text-white transition-colors disabled:opacity-50"},o(te.value?"Publishing...":"Publish to DHT"),9,mn)):u("",!0)]),e("div",pn,[e("div",bn,[e("div",wn,[e("div",{class:h(["w-3 h-3 rounded-full",E.value?"bg-green-400":"bg-red-400"])},null,2),E.value?(n(),a("div",fn)):u("",!0)]),e("div",gn,[e("p",yn,o(r(i)("web5.wallet")),1),e("p",_n,o(E.value?r(i)("common.connected"):r(i)("common.disconnected")),1)])]),e("button",{onClick:kl,class:"w-fit px-3 py-1.5 glass-button glass-button-sm rounded text-xs font-medium text-white/90 hover:text-white transition-colors disabled:opacity-50",disabled:zt.value},o(zt.value?r(i)("common.connecting"):E.value?r(i)("common.disconnect"):r(i)("common.connect")),9,kn)]),e("div",Cn,[e("div",Mn,[e("div",jn,[e("div",{class:h(["w-3 h-3 rounded-full",(K.value?.connected_count??0)>0?"bg-green-400":"bg-red-400"])},null,2),(K.value?.connected_count??0)>0?(n(),a("div",Pn)):u("",!0)]),e("div",Dn,[e("p",Tn,o(r(i)("web5.nostrRelays")),1),e("p",Rn,o(r(i)("web5.relaysConnected",{count:K.value?.connected_count??0})),1)])]),e("button",{onClick:Cl,class:"w-fit px-3 py-1.5 glass-button glass-button-sm rounded text-xs font-medium text-white/90 hover:text-white transition-colors"},o(r(i)("common.manage")),1)]),e("div",Bn,[e("div",$n,[e("div",Vn,[e("div",{class:h(["w-3 h-3 rounded-full",fs.value>0?"bg-green-400":"bg-amber-400"])},null,2),fs.value>0?(n(),a("div",Sn)):u("",!0)]),e("div",zn,[e("p",An,o(r(i)("web5.connectedNodes")),1),e("p",In,o(r(i)("web5.peersKnown",{count:fs.value})),1)])]),e("div",Un,[e("button",{onClick:t[0]||(t[0]=s=>r(Mt).push("/dashboard/server/federation")),class:"px-3 py-1.5 glass-button glass-button-sm rounded text-xs font-medium text-white/90 hover:text-white transition-colors"},o(r(i)("web5.findNodes")),1),e("button",{onClick:t[1]||(t[1]=s=>Te.value=!0),class:"px-3 py-1.5 glass-button glass-button-sm rounded text-xs font-medium text-white/90 hover:text-white transition-colors"},o(r(i)("web5.sendMessage")),1)])])])]),Nt.value.length>0?(n(),a("div",Nn,[t[84]||(t[84]=e("div",{class:"w-8 h-8 rounded-lg bg-orange-500/20 flex items-center justify-center flex-shrink-0"},[e("svg",{class:"w-5 h-5 text-orange-400",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 15v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2zm10-10V7a4 4 0 00-8 0v4h8z"})])],-1)),e("div",Ln,[e("p",Hn,o(r(i)("web5.hardwareWalletDetected")),1),e("p",En,o(Nt.value.map(s=>`${s.type}${s.product?" ("+s.product+")":""}`).join(", ")),1)])])):u("",!0),(n(),M(V,{to:"body"},[qe.value?(n(),a("div",{key:0,class:"fixed inset-0 z-50 flex items-center justify-center p-4 bg-black/60 backdrop-blur-md",onClick:t[3]||(t[3]=$(s=>qe.value=!1,["self"])),onKeydown:t[4]||(t[4]=T(s=>qe.value=!1,["escape"]))},[e("div",Kn,[e("div",Fn,[e("h3",Wn,o(r(i)("web5.didDocument")),1),e("div",On,[Bt.value===!0?(n(),a("span",qn,[t[85]||(t[85]=e("svg",{class:"w-4 h-4",fill:"currentColor",viewBox:"0 0 20 20"},[e("path",{"fill-rule":"evenodd",d:"M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z","clip-rule":"evenodd"})],-1)),k(" "+o(r(i)("web5.verified")),1)])):Bt.value===!1?(n(),a("span",Jn,o(r(i)("web5.invalid")),1)):u("",!0)])]),rs.value?(n(),a("div",Qn,o(r(i)("common.loading")),1)):(n(),a("pre",Gn,o(us.value),1)),e("div",Xn,[e("button",{onClick:$o,class:"flex-1 px-4 py-2 glass-button rounded-lg text-sm font-medium text-white/90 hover:text-white transition-colors"},o(ds.value?r(i)("common.copiedBang"):r(i)("common.copy")),1),e("button",{onClick:t[2]||(t[2]=s=>qe.value=!1),class:"px-4 py-2 rounded-lg bg-white/10 text-white font-medium hover:bg-white/20 transition-colors"},o(r(i)("common.close")),1)])])],32)):u("",!0)])),(n(),M(V,{to:"body"},[Te.value?(n(),a("div",{key:0,class:"fixed inset-0 z-50 flex items-center justify-center p-4 bg-black/60 backdrop-blur-md",onClick:t[8]||(t[8]=$(s=>gs(),["self"]))},[e("div",{ref_key:"sendMessageModalRef",ref:Ys,class:"glass-card p-6 max-w-2xl w-full max-h-[90vh] overflow-y-auto"},[e("h3",Yn,o(r(i)("web5.sendMessageTitle")),1),t[86]||(t[86]=e("p",{class:"text-white/70 text-sm mb-4"},"Messages are sent over the Tor network to the selected peer.",-1)),e("div",Zn,[e("div",null,[e("label",ei,o(r(i)("web5.to")),1),m(e("select",{"onUpdate:modelValue":t[5]||(t[5]=s=>Re.value=s),class:"w-full px-3 py-2 rounded-lg bg-white/10 text-white border border-white/20 focus:border-orange-500 focus:ring-1 focus:ring-orange-500"},[e("option",ti,o(r(i)("web5.selectPeer")),1),(n(!0),a(f,null,y(F.value,s=>(n(),a("option",{key:s.pubkey,value:s.onion},o(s.name||s.onion||(s.pubkey||"").slice(0,12)+"..."),9,si))),128))],512),[[Ws,Re.value]])]),e("div",null,[e("label",oi,o(r(i)("web5.message")),1),m(e("textarea",{"onUpdate:modelValue":t[6]||(t[6]=s=>Be.value=s),rows:"3",class:"w-full px-3 py-2 rounded-lg bg-white/10 text-white border border-white/20 focus:border-orange-500 focus:ring-1 focus:ring-orange-500",placeholder:r(i)("web5.messagePlaceholder")},null,8,li),[[b,Be.value]])])]),e("div",ni,[e("button",{onClick:No,disabled:!Re.value||!Be.value.trim()||Lt.value,class:"flex-1 px-4 py-2 rounded-lg bg-orange-500 text-white font-medium hover:bg-orange-600 disabled:opacity-50 disabled:cursor-not-allowed transition-colors"},o(Lt.value?r(i)("common.sending"):r(i)("common.send")),9,ii),e("button",{onClick:t[7]||(t[7]=s=>gs()),class:"px-4 py-2 rounded-lg bg-white/10 text-white font-medium hover:bg-white/20 transition-colors"},o(r(i)("common.cancel")),1)]),Ht.value?(n(),a("p",ai,o(Ht.value),1)):u("",!0),et.value?(n(),a("p",ri,o(et.value),1)):u("",!0)],512)])):u("",!0)])),e("div",di,[e("div",ui,[e("div",ci,[t[87]||(t[87]=e("div",{class:"flex-shrink-0 w-12 h-12 rounded-lg bg-white/10 flex items-center justify-center"},[e("svg",{class:"w-6 h-6 text-white/80",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M9 20l-5.447-2.724A1 1 0 013 16.382V5.618a1 1 0 011.447-.894L9 7m0 13l6-3m-6 3V7m6 10l4.553 2.276A1 1 0 0021 18.382V7.618a1 1 0 00-.553-.894L15 4m0 13V4m0 0L9 7"})])],-1)),e("div",vi,[e("h2",xi,o(r(i)("web5.bitcoinDomains")),1),e("p",hi,o(r(i)("web5.domainsSubtitle")),1)])]),e("div",mi,[e("div",pi,[e("div",bi,[t[88]||(t[88]=e("svg",{class:"w-5 h-5 text-white/60",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M9 20l-5.447-2.724A1 1 0 013 16.382V5.618a1 1 0 011.447-.894L9 7m0 13l6-3m-6 3V7m6 10l4.553 2.276A1 1 0 0021 18.382V7.618a1 1 0 00-.553-.894L15 4m0 13V4m0 0L9 7"})],-1)),e("span",wi,o(r(i)("web5.namesRegistered")),1)]),e("span",fi,o(X.value.length)+" "+o(X.value.length===1?"name":"names"),1)]),e("div",gi,[e("div",yi,[t[89]||(t[89]=e("svg",{class:"w-5 h-5 text-white/60",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M9 12l2 2 4-4m5.618-4.016A11.955 11.955 0 0112 2.944a11.955 11.955 0 01-8.618 3.04A12.02 12.02 0 003 9c0 5.591 3.824 10.29 9 11.622 5.176-1.332 9-6.03 9-11.622 0-1.042-.133-2.052-.382-3.016z"})],-1)),e("span",_i,o(r(i)("common.status")),1)]),e("span",{class:h([os.value>0?"text-green-400":"text-white/60","text-sm font-medium"])},o(os.value>0?`${os.value} Active`:"None"),3)]),e("div",ki,[e("div",Ci,[t[90]||(t[90]=e("svg",{class:"w-5 h-5 text-white/60",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z"})],-1)),e("span",Mi,o(r(i)("web5.expiringSoon")),1)]),e("span",ji,o(Js.value)+" "+o(Js.value===1?"name":"names"),1)])]),e("button",{onClick:t[9]||(t[9]=s=>Fe.value=!0),class:"mt-6 w-full px-4 py-2 glass-button rounded-lg text-sm font-medium text-white/90 hover:text-white transition-colors shrink-0"},o(r(i)("web5.manageDomains")),1)]),e("div",Pi,[e("div",Di,[t[93]||(t[93]=e("div",{class:"flex-shrink-0 w-12 h-12 rounded-lg bg-white/10 flex items-center justify-center"},[e("svg",{class:"w-6 h-6 text-white/80",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M17 9V7a2 2 0 00-2-2H5a2 2 0 00-2 2v6a2 2 0 002 2h2m2 4h10a2 2 0 002-2v-6a2 2 0 00-2-2H9a2 2 0 00-2 2v6a2 2 0 002 2zm7-5a2 2 0 11-4 0 2 2 0 014 0z"})])],-1)),e("div",Ti,[e("h2",Ri,o(r(i)("web5.wallet")),1),e("p",Bi,o(r(i)("web5.walletSubtitle")),1)]),Gs.value>0?(n(),a("button",{key:0,onClick:t[10]||(t[10]=s=>Me.value=!Me.value),class:"incoming-tx-badge shrink-0"},[t[91]||(t[91]=e("svg",{class:"w-3.5 h-3.5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M19 14l-7 7m0 0l-7-7m7 7V3"})],-1)),e("span",null,"Incoming "+o(Gs.value),1),t[92]||(t[92]=e("span",{class:"incoming-tx-ping"},null,-1))])):u("",!0)]),kt(mo,{name:"incoming-tx-slide"},{default:ge(()=>[Me.value&&bs.value.length>0?(n(),a("div",$i,[e("div",Vi,[t[95]||(t[95]=e("span",{class:"text-xs font-medium text-green-400 uppercase tracking-wide"},"Incoming Transactions",-1)),e("button",{onClick:t[11]||(t[11]=s=>Me.value=!1),class:"text-white/40 hover:text-white/70 transition-colors"},[...t[94]||(t[94]=[e("svg",{class:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M6 18L18 6M6 6l12 12"})],-1)])])]),e("div",Si,[(n(!0),a(f,null,y(bs.value,s=>(n(),a("div",{key:s.tx_hash,class:"incoming-tx-row",onClick:x=>zo(s.tx_hash)},[e("div",Ai,[e("div",{class:h(["incoming-tx-icon",s.num_confirmations===0?"incoming-tx-icon-pending":"incoming-tx-icon-confirmed"])},[...t[96]||(t[96]=[e("svg",{class:"w-3.5 h-3.5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M19 14l-7 7m0 0l-7-7m7 7V3"})],-1)])],2),e("div",Ii,[e("div",Ui,[e("span",Ni,"+"+o(s.amount_sats.toLocaleString())+" sats",1),e("span",{class:h(["text-[10px] px-1.5 py-0.5 rounded-full font-medium",s.num_confirmations===0?"bg-yellow-500/15 text-yellow-400":"bg-green-500/15 text-green-400"])},o(s.num_confirmations===0?"Unconfirmed":s.num_confirmations+" conf"),3)]),e("p",Li,o(s.tx_hash),1)])]),e("div",Hi,[e("span",Ei,o(So(s.time_stamp)),1),t[97]||(t[97]=e("svg",{class:"w-3.5 h-3.5 text-white/30",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14"})],-1))])],8,zi))),128))])])):u("",!0)]),_:1}),e("div",Ki,[e("div",Fi,[e("div",Wi,[t[98]||(t[98]=e("span",{class:"text-lg text-orange-500 font-bold"},"₿",-1)),e("span",Oi,o(r(i)("web5.onChain")),1)]),e("span",qi,o(hs.value.toLocaleString())+" sats",1)]),e("div",Ji,[e("div",Qi,[t[99]||(t[99]=e("svg",{class:"w-5 h-5 text-yellow-400",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M13 10V3L4 14h7v7l9-11h-7z"})],-1)),e("span",Gi,o(r(i)("web5.lightning")),1)]),e("span",Xi,o(ms.value.toLocaleString())+" sats",1)]),e("div",Yi,[e("div",Zi,[t[100]||(t[100]=e("svg",{class:"w-5 h-5 text-purple-400",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 8c-1.657 0-3 .895-3 2s1.343 2 3 2 3 .895 3 2-1.343 2-3 2m0-8c1.11 0 2.08.402 2.599 1M12 8V7m0 1v8m0 0v1m0-1c-1.11 0-2.08-.402-2.599-1M21 12a9 9 0 11-18 0 9 9 0 0118 0z"})],-1)),e("span",ea,o(r(i)("web5.ecash")),1)]),e("span",ta,o(Ft.value.toLocaleString())+" sats",1)])]),e("div",sa,[e("button",{onClick:t[12]||(t[12]=s=>Ms.value=!0),disabled:!E.value&&Ft.value<=0,class:"px-3 py-2 glass-button rounded-lg text-xs font-medium text-white/90 hover:text-white transition-colors disabled:opacity-50"},o(r(i)("common.send")),9,oa),e("button",{onClick:t[13]||(t[13]=s=>js.value=!0),class:"px-3 py-2 glass-button rounded-lg text-xs font-medium text-white/90 hover:text-white transition-colors"},o(r(i)("web5.receiveBitcoin")),1)])])]),e("div",la,[e("div",na,[e("div",ia,[t[101]||(t[101]=e("div",{class:"flex-shrink-0 w-12 h-12 rounded-lg bg-white/10 flex items-center justify-center"},[e("svg",{class:"w-6 h-6 text-white/80",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M8.111 16.404a5.5 5.5 0 017.778 0M12 20h.01m-7.08-7.071c3.904-3.905 10.236-3.905 14.141 0M1.394 9.393c5.857-5.857 15.355-5.857 21.213 0"})])],-1)),e("div",aa,[e("h2",ra,o(r(i)("web5.nostrRelays")),1),e("p",da,o(r(i)("web5.nostrRelaysDesc")),1)])]),e("div",ua,[e("div",ca,[e("div",va,[t[102]||(t[102]=e("svg",{class:"w-5 h-5 text-white/60",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M5 12h14M5 12a2 2 0 01-2-2V6a2 2 0 012-2h14a2 2 0 012 2v4a2 2 0 01-2 2M5 12a2 2 0 00-2 2v4a2 2 0 002 2h14a2 2 0 002-2v-4a2 2 0 00-2-2m-2-4h.01M17 16h.01"})],-1)),e("span",xa,o(r(i)("web5.relaysConnectedLabel")),1)]),e("span",ha,o(K.value?.connected_count??0)+" active",1)]),e("div",ma,[e("div",pa,[t[103]||(t[103]=e("svg",{class:"w-5 h-5 text-white/60",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M9 12l2 2 4-4m5.618-4.016A11.955 11.955 0 0112 2.944a11.955 11.955 0 01-8.618 3.04A12.02 12.02 0 003 9c0 5.591 3.824 10.29 9 11.622 5.176-1.332 9-6.03 9-11.622 0-1.042-.133-2.052-.382-3.016z"})],-1)),e("span",ba,o(r(i)("web5.totalRelays")),1)]),e("span",{class:h([(K.value?.total_relays??0)>0?"text-green-400":"text-white/60","text-sm font-medium"])},o(K.value?.total_relays??0)+" configured ",3)]),e("div",wa,[e("div",fa,[t[104]||(t[104]=e("svg",{class:"w-5 h-5 text-white/60",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M13 10V3L4 14h7v7l9-11h-7z"})],-1)),e("span",ga,o(r(i)("common.enabled")),1)]),e("span",ya,o(K.value?.enabled_count??0)+" relays",1)])]),e("button",{onClick:t[14]||(t[14]=s=>je.value=!0),class:"mt-6 w-full px-4 py-2 glass-button rounded-lg text-sm font-medium text-white/90 hover:text-white transition-colors shrink-0"},o(r(i)("web5.relays")),1)]),e("div",_a,[e("div",ka,[t[106]||(t[106]=e("div",{class:"flex-shrink-0 w-12 h-12 rounded-lg bg-white/10 flex items-center justify-center"},[e("svg",{class:"w-6 h-6 text-white/80",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M15 12a3 3 0 11-6 0 3 3 0 016 0z"}),e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M2.458 12C3.732 7.943 7.523 5 12 5c4.478 0 8.268 2.943 9.542 7-1.274 4.057-5.064 7-9.542 7-4.477 0-8.268-2.943-9.542-7z"})])],-1)),e("div",Ca,[e("h2",Ma,o(r(i)("web5.nodeVisibility")),1),e("p",ja,o(r(i)("web5.nodeVisibilityDesc")),1)]),Us.value?(n(),a("div",Pa,[...t[105]||(t[105]=[e("svg",{class:"animate-spin h-5 w-5 text-white/40",fill:"none",viewBox:"0 0 24 24"},[e("circle",{class:"opacity-25",cx:"12",cy:"12",r:"10",stroke:"currentColor","stroke-width":"4"}),e("path",{class:"opacity-75",fill:"currentColor",d:"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"})],-1)])])):u("",!0)]),e("div",Da,[(n(),a(f,null,y(il,s=>e("button",{key:s.value,onClick:x=>rl(s.value),disabled:Xt.value,class:h(["w-full flex items-center gap-3 p-3 rounded-lg border transition-colors text-left",Q.value===s.value?"bg-white/10 border-white/25 text-white":"bg-white/5 border-white/10 text-white/60 hover:bg-white/8 hover:text-white/80"])},[e("div",{class:h(["w-3 h-3 rounded-full shrink-0 border-2 flex items-center justify-center",Q.value===s.value?"border-green-400":"border-white/30"])},[Q.value===s.value?(n(),a("div",Ra)):u("",!0)],2),e("div",Ba,[e("p",$a,o(s.label),1),e("p",Va,o(s.description),1)])],10,Ta)),64))]),Q.value!=="hidden"&&ne.value?(n(),a("div",Sa,[e("div",za,[e("div",Aa,[e("p",Ia,o(r(i)("web5.yourTorAddress")),1),e("p",{class:"text-xs font-mono text-white/80 truncate",title:ne.value},o(ne.value),9,Ua)]),e("button",{onClick:dl,class:"shrink-0 p-2 rounded-lg text-white/50 hover:text-white hover:bg-white/10 transition-colors",title:"Copy"},[...t[107]||(t[107]=[e("svg",{class:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M8 5H6a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2v-1M8 5a2 2 0 002 2h2a2 2 0 002-2M8 5a2 2 0 012-2h2a2 2 0 012 2m0 0h2a2 2 0 012 2v3m2 4H10m0 0l3-3m-3 3l3 3"})],-1)])])])])):u("",!0),Q.value!=="hidden"?(n(),a("p",Na,o(r(i)("web5.discoverableWarning")),1)):u("",!0)])]),e("div",{ref_key:"nodesContainerRef",ref:ys,"data-controller-container":"",tabindex:"0",class:"glass-card p-6 mb-8 scroll-mt-24"},[e("div",La,[t[108]||(t[108]=e("div",{class:"flex-shrink-0 w-12 h-12 rounded-lg bg-white/10 flex items-center justify-center"},[e("svg",{class:"w-6 h-6 text-white/80",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M17 20h5v-2a3 3 0 00-5.356-1.857M17 20H7m10 0v-2c0-.656-.126-1.283-.356-1.857M7 20H2v-2a3 3 0 015.356-1.857M7 20v-2c0-.656.126-1.283.356-1.857m0 0a5.002 5.002 0 019.288 0M15 7a3 3 0 11-6 0 3 3 0 016 0zm6 3a2 2 0 11-4 0 2 2 0 014 0zM7 10a2 2 0 11-4 0 2 2 0 014 0z"})])],-1)),e("div",Ha,[e("h2",Ea,o(r(i)("web5.connectedNodes")),1),e("p",Ka,o(r(i)("web5.peerNodesDescription")),1)]),e("div",Fa,[e("button",{onClick:t[15]||(t[15]=s=>r(Mt).push("/dashboard/server/federation")),class:"px-3 py-1.5 glass-button glass-button-sm rounded text-xs font-medium text-white/90 hover:text-white transition-colors"},o(r(i)("web5.findNodes")),1),e("button",{onClick:tt,class:"px-3 py-1.5 glass-button glass-button-sm rounded text-xs font-medium text-white/90 hover:text-white transition-colors"},o(Ut.value?"...":r(i)("common.refresh")),1)])]),e("div",Wa,[e("div",Oa,[t[109]||(t[109]=e("div",{class:"flex-shrink-0 w-12 h-12 rounded-lg bg-white/10 flex items-center justify-center"},[e("svg",{class:"w-6 h-6 text-white/80",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M17 20h5v-2a3 3 0 00-5.356-1.857M17 20H7m10 0v-2c0-.656-.126-1.283-.356-1.857M7 20H2v-2a3 3 0 015.356-1.857M7 20v-2c0-.656.126-1.283.356-1.857m0 0a5.002 5.002 0 019.288 0M15 7a3 3 0 11-6 0 3 3 0 016 0zm6 3a2 2 0 11-4 0 2 2 0 014 0zM7 10a2 2 0 11-4 0 2 2 0 014 0z"})])],-1)),e("h2",qa,o(r(i)("web5.connectedNodes")),1)]),e("p",Ja,o(r(i)("web5.peerNodesDescription")),1),e("div",Qa,[e("button",{onClick:t[16]||(t[16]=s=>r(Mt).push("/dashboard/server/federation")),class:"min-h-[44px] glass-button rounded-lg text-sm font-medium text-white/90 hover:text-white transition-colors flex items-center justify-center"},o(r(i)("web5.findNodes")),1),e("button",{onClick:tt,class:"min-h-[44px] glass-button rounded-lg text-sm font-medium text-white/90 hover:text-white transition-colors flex items-center justify-center"},o(Ut.value?"...":r(i)("common.refresh")),1)])]),e("div",Ga,[e("button",{onClick:t[17]||(t[17]=s=>P.value="peers"),class:h(["px-4 py-2 text-sm font-medium rounded-t-lg transition-colors",P.value==="peers"?"bg-white/10 text-white":"text-white/60 hover:text-white/80 hover:bg-white/5"])},[k(o(r(i)("web5.peers"))+" ",1),F.value.length>0?(n(),a("span",Xa,"("+o(F.value.length)+")",1)):u("",!0)],2),e("button",{onClick:Uo,class:h(["px-4 py-2 text-sm font-medium rounded-t-lg transition-colors flex items-center gap-1.5",P.value==="messages"?"bg-white/10 text-white":"text-white/60 hover:text-white/80 hover:bg-white/5"])},[k(o(r(i)("web5.messages"))+" ",1),r(Kt).length>0?(n(),a("span",{key:0,class:h(["ml-1.5 text-xs",r(eo)>0?"text-orange-400":"text-white/50"])},"("+o(r(Kt).length)+")",3)):u("",!0),r(eo)>0?(n(),a("span",Ya)):u("",!0)],2),e("button",{onClick:ol,class:h(["px-4 py-2 text-sm font-medium rounded-t-lg transition-colors flex items-center gap-1.5",P.value==="requests"?"bg-white/10 text-white":"text-white/60 hover:text-white/80 hover:bg-white/5"])},[k(o(r(i)("web5.requests"))+" ",1),C.value.length>0?(n(),a("span",Za,"("+o(C.value.length)+")",1)):u("",!0),C.value.length>0?(n(),a("span",er)):u("",!0)],2)]),m(e("div",tr,[F.value.length===0?(n(),a("div",sr,o(r(i)("web5.noPeers")),1)):u("",!0),(n(!0),a(f,null,y(F.value,s=>(n(),a("div",{key:s.pubkey,class:"flex items-center justify-between p-3 bg-white/5 rounded-lg"},[e("div",or,[e("div",{class:h(["w-2 h-2 rounded-full shrink-0",Ao.value[s.onion]?"bg-green-400":"bg-amber-400"])},null,2),e("div",lr,[e("p",nr,o(s.name||s.onion||(s.pubkey||"").slice(0,16)+"..."),1),e("p",ir,o(s.onion),1)])]),e("button",{onClick:x=>{Te.value=!0,Re.value=s.onion},class:"px-2 py-1 text-xs rounded bg-orange-500/20 text-orange-400 hover:bg-orange-500/30 transition-colors shrink-0"},o(r(i)("web5.message")),9,ar)]))),128))],512),[[Ct,P.value==="peers"]]),m(e("div",rr,[r(_s)?(n(),a("div",dr,o(r(i)("common.loading")),1)):r(Kt).length===0?(n(),a("div",ur,o(r(i)("web5.noMessages")),1)):u("",!0),(n(!0),a(f,null,y(r(Kt),(s,x)=>(n(),a("div",{key:x,class:"p-3 bg-white/5 rounded-lg border-l-2 border-orange-500/50"},[e("div",cr,[e("p",{class:"text-xs font-mono text-white/60 truncate",title:s.from_pubkey},o((s.from_pubkey||"").slice(0,16))+"...",9,vr),e("span",xr,o(to(s.timestamp)),1)]),e("p",hr,o(s.message),1)]))),128))],512),[[Ct,P.value==="messages"]]),m(e("div",mr,[Le.value?(n(),a("div",pr,o(r(i)("common.loading")),1)):C.value.length===0?(n(),a("div",br,o(r(i)("web5.noRequests")),1)):u("",!0),(n(!0),a(f,null,y(C.value,s=>(n(),a("div",{key:s.id,class:"p-3 bg-white/5 rounded-lg border-l-2 border-blue-500/50"},[e("div",wr,[e("div",fr,[e("p",{class:"text-xs font-mono text-white/70 truncate",title:s.from_did},o(s.from_did),9,gr),s.message?(n(),a("p",yr,o(s.message),1)):u("",!0),e("p",_r,o(to(s.created_at)),1)]),e("div",kr,[e("button",{onClick:x=>ll(s.id),disabled:He.value===s.id,class:"px-3 py-1.5 text-xs rounded-lg bg-green-500/20 text-green-400 hover:bg-green-500/30 transition-colors disabled:opacity-50"},o(r(i)("web5.accept")),9,Cr),e("button",{onClick:x=>nl(s.id),disabled:He.value===s.id,class:"px-3 py-1.5 text-xs rounded-lg bg-red-500/20 text-red-400 hover:bg-red-500/30 transition-colors disabled:opacity-50"},o(r(i)("web5.reject")),9,Mr)])])]))),128))],512),[[Ct,P.value==="requests"]]),P.value==="peers"?(n(),a("button",{key:0,onClick:Lo,disabled:Et.value,class:"mt-4 w-full px-4 py-2 glass-button rounded-lg text-sm font-medium text-white/90 hover:text-white transition-colors disabled:opacity-50"},o(Et.value?r(i)("web5.discovering"):r(i)("web5.discoverNodes")),9,jr)):P.value==="messages"?(n(),a("button",{key:1,onClick:t[18]||(t[18]=(...s)=>r(ks)&&r(ks)(...s)),disabled:r(_s),class:"mt-4 w-full px-4 py-2 glass-button rounded-lg text-sm font-medium text-white/90 hover:text-white transition-colors disabled:opacity-50"},o(r(_s)?r(i)("common.loading"):r(i)("web5.refreshMessages")),9,Pr)):(n(),a("button",{key:2,onClick:As,disabled:Le.value,class:"mt-4 w-full px-4 py-2 glass-button rounded-lg text-sm font-medium text-white/90 hover:text-white transition-colors disabled:opacity-50"},o(Le.value?r(i)("common.loading"):r(i)("web5.refreshRequests")),9,Dr))],512),e("div",Tr,[e("div",Rr,[e("div",Br,[t[110]||(t[110]=e("div",{class:"flex-shrink-0 w-10 h-10 rounded-lg bg-white/10 flex items-center justify-center"},[e("svg",{class:"w-5 h-5 text-white/80",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M7 4v16M17 4v16M3 8h4m10 0h4M3 12h18M3 16h4m10 0h4M4 20h16a1 1 0 001-1V5a1 1 0 00-1-1H4a1 1 0 00-1 1v14a1 1 0 001 1z"})])],-1)),e("div",null,[e("h2",$r,o(r(i)("web5.content")),1),e("p",Vr,o(r(i)("web5.contentDesc")),1)])]),oe.value==="mine"?(n(),a("div",Sr,[e("button",{onClick:Ie,disabled:xe.value,class:"glass-button glass-button-sm px-3 rounded-lg text-sm font-medium"},o(xe.value?"...":"Refresh"),9,zr),e("button",{onClick:t[19]||(t[19]=s=>he.value=!0),class:"glass-button glass-button-sm px-3 rounded-lg text-sm font-medium flex items-center gap-2"},[...t[111]||(t[111]=[e("svg",{class:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 4v16m8-8H4"})],-1),k(" Add ",-1)])])])):u("",!0)]),e("div",Ar,[e("div",Ir,[t[112]||(t[112]=e("div",{class:"flex-shrink-0 w-10 h-10 rounded-lg bg-white/10 flex items-center justify-center"},[e("svg",{class:"w-5 h-5 text-white/80",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M7 4v16M17 4v16M3 8h4m10 0h4M3 12h18M3 16h4m10 0h4M4 20h16a1 1 0 001-1V5a1 1 0 00-1-1H4a1 1 0 00-1 1v14a1 1 0 001 1z"})])],-1)),e("h2",Ur,o(r(i)("web5.content")),1)]),e("p",Nr,o(r(i)("web5.contentDesc")),1),oe.value==="mine"?(n(),a("div",Lr,[e("button",{onClick:Ie,disabled:xe.value,class:"glass-button min-h-[44px] rounded-lg text-sm font-medium flex items-center justify-center"},o(xe.value?"...":"Refresh"),9,Hr),e("button",{onClick:t[20]||(t[20]=s=>he.value=!0),class:"glass-button min-h-[44px] rounded-lg text-sm font-medium flex items-center justify-center gap-2"},[...t[113]||(t[113]=[e("svg",{class:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 4v16m8-8H4"})],-1),k(" Add ",-1)])])])):u("",!0)]),e("div",Er,[e("button",{onClick:t[21]||(t[21]=s=>oe.value="mine"),class:h(["px-4 py-2 text-sm font-medium rounded-t-lg transition-colors",oe.value==="mine"?"bg-white/10 text-white":"text-white/60 hover:text-white/80 hover:bg-white/5"])},[k(o(r(i)("web5.myContent"))+" ",1),J.value.length>0?(n(),a("span",Kr,"("+o(J.value.length)+")",1)):u("",!0)],2),e("button",{onClick:t[22]||(t[22]=s=>oe.value="browse"),class:h(["px-4 py-2 text-sm font-medium rounded-t-lg transition-colors",oe.value==="browse"?"bg-white/10 text-white":"text-white/60 hover:text-white/80 hover:bg-white/5"])},o(r(i)("web5.browsePeers")),3)]),m(e("div",null,[xe.value&&J.value.length===0?(n(),a("div",Fr,[t[114]||(t[114]=e("svg",{class:"animate-spin h-6 w-6 text-blue-400 mx-auto mb-2",fill:"none",viewBox:"0 0 24 24"},[e("circle",{class:"opacity-25",cx:"12",cy:"12",r:"10",stroke:"currentColor","stroke-width":"4"}),e("path",{class:"opacity-75",fill:"currentColor",d:"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"})],-1)),e("p",Wr,o(r(i)("common.loading")),1)])):J.value.length===0?(n(),a("div",Or,[t[115]||(t[115]=e("svg",{class:"w-12 h-12 text-white/20 mx-auto mb-3",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M7 4v16M17 4v16M3 8h4m10 0h4M3 12h18M3 16h4m10 0h4M4 20h16a1 1 0 001-1V5a1 1 0 00-1-1H4a1 1 0 00-1 1v14a1 1 0 001 1z"})],-1)),e("p",qr,o(r(i)("web5.noSharedContent")),1),e("p",Jr,o(r(i)("web5.addFilesToShare")),1)])):(n(),a("div",Qr,[(n(!0),a(f,null,y(J.value,(s,x)=>(n(),a("div",{key:s.id,class:"card-stagger p-4 bg-white/5 rounded-lg",style:Os({"--stagger-index":x})},[e("div",Gr,[e("div",Xr,[e("p",Yr,o(s.filename),1),s.description?(n(),a("p",Zr,o(s.description),1)):u("",!0),e("p",ed,o(s.mime_type)+" · "+o($s(s.size_bytes)),1)]),e("button",{onClick:p=>Go(s.id),disabled:Rs.value===s.id,class:"p-2 rounded-lg text-white/40 hover:text-red-400 hover:bg-white/10 transition-colors shrink-0",title:"Remove"},[...t[116]||(t[116]=[e("svg",{class:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16"})],-1)])],8,td)]),e("div",sd,[(n(),a(f,null,y(io,p=>e("button",{key:p.value,onClick:Ks=>Xo(s,p.value),disabled:ct.value===s.id,class:h(["px-3 py-1 text-xs rounded-lg border transition-colors",Gt(s)===p.value?"bg-white/15 border-white/30 text-white":"bg-white/5 border-white/10 text-white/50 hover:bg-white/10 hover:text-white/70"])},o(p.label),11,od)),64))]),Gt(s)==="paid"?(n(),a("div",ld,[e("div",nd,[e("input",{value:Bs(s),onChange:p=>Yo(s,p.target.value),type:"number",min:"1",placeholder:"100",class:"w-24 px-2 py-1 text-xs rounded-lg bg-white/5 border border-white/10 text-white focus:outline-none focus:border-white/30"},null,40,id),t[117]||(t[117]=e("span",{class:"text-xs text-white/50"},"sats",-1))]),e("p",ad,"Peers will pay "+o(Bs(s)||0)+" sats to access this",1)])):Gt(s)==="free"?(n(),a("p",rd,o(r(i)("web5.freeAccessDesc")),1)):Gt(s)==="peers_only"?(n(),a("p",dd,o(r(i)("web5.peersOnlyAccessDesc")),1)):u("",!0)],4))),128))]))],512),[[Ct,oe.value==="mine"]]),m(e("div",null,[e("div",ud,[e("div",cd,[m(e("select",{"onUpdate:modelValue":t[23]||(t[23]=s=>A.value=s),class:"flex-1 px-3 py-2 rounded-lg bg-white/10 text-white text-sm border border-white/20 focus:border-orange-500 focus:ring-1 focus:ring-orange-500"},[e("option",vd,o(r(i)("web5.selectPeer")),1),(n(!0),a(f,null,y(F.value,s=>(n(),a("option",{key:s.pubkey,value:s.onion},o(s.name||s.onion||(s.pubkey||"").slice(0,12)+"..."),9,xd))),128))],512),[[Ws,A.value]]),e("button",{onClick:Zo,disabled:!A.value||pe.value,class:"glass-button glass-button-sm px-4 py-2 rounded-lg text-sm font-medium disabled:opacity-50"},o(pe.value?r(i)("common.loading"):r(i)("web5.browse")),9,hd)]),vt.value?(n(),a("p",md,o(vt.value),1)):u("",!0)]),pe.value?(n(),a("div",pd,[t[118]||(t[118]=e("svg",{class:"animate-spin h-6 w-6 text-blue-400 mx-auto mb-2",fill:"none",viewBox:"0 0 24 24"},[e("circle",{class:"opacity-25",cx:"12",cy:"12",r:"10",stroke:"currentColor","stroke-width":"4"}),e("path",{class:"opacity-75",fill:"currentColor",d:"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"})],-1)),e("p",bd,o(r(i)("web5.connectingToPeer")),1)])):!A.value&&Ue.value.length===0?(n(),a("div",wd,[t[119]||(t[119]=e("svg",{class:"w-12 h-12 text-white/20 mx-auto mb-3",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z"})],-1)),e("p",fd,o(r(i)("web5.selectPeerToBrowse")),1),e("p",gd,o(r(i)("web5.choosePeerDesc")),1)])):Ue.value.length===0&&A.value&&!pe.value?(n(),a("div",yd,[e("p",_d,o(r(i)("web5.peerNoContent")),1)])):(n(),a("div",kd,[(n(!0),a(f,null,y(Ue.value,(s,x)=>(n(),a("div",{key:s.id,class:"card-stagger flex items-center gap-4 p-3 bg-white/5 rounded-lg",style:Os({"--stagger-index":x})},[e("div",Cd,[ao(s.mime_type)?(n(),a("svg",Md,[...t[120]||(t[120]=[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M14.752 11.168l-3.197-2.132A1 1 0 0010 9.87v4.263a1 1 0 001.555.832l3.197-2.132a1 1 0 000-1.664z"},null,-1),e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M21 12a9 9 0 11-18 0 9 9 0 0118 0z"},null,-1)])])):(n(),a("svg",jd,[...t[121]||(t[121]=[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"},null,-1)])]))]),e("div",Pd,[e("p",Dd,o(s.filename),1),s.description?(n(),a("p",Td,o(s.description),1)):u("",!0),e("div",Rd,[e("span",Bd,o(s.mime_type),1),t[122]||(t[122]=e("span",{class:"text-xs text-white/30"},"·",-1)),e("span",$d,o($s(s.size_bytes)),1),Vs(s)>0?(n(),a("span",Vd,o(Vs(s))+" sats",1)):(n(),a("span",Sd,"Free"))])]),ao(s.mime_type)?(n(),a("button",{key:0,onClick:p=>el(s),class:"px-3 py-1.5 text-xs rounded-lg bg-orange-500/20 text-orange-400 hover:bg-orange-500/30 transition-colors shrink-0"},o(r(i)("web5.stream")),9,zd)):(n(),a("button",{key:1,onClick:p=>tl(s),class:"px-3 py-1.5 text-xs rounded-lg bg-blue-500/20 text-blue-400 hover:bg-blue-500/30 transition-colors shrink-0"},o(r(i)("web5.download")),9,Ad))],4))),128))]))],512),[[Ct,oe.value==="browse"]])]),(n(),M(V,{to:"body"},[le.value?(n(),a("div",{key:0,class:"fixed inset-0 z-50 flex items-center justify-center p-4 bg-black/60 backdrop-blur-md",onClick:$(zs,["self"]),onKeydown:T(zs,["escape"])},[e("div",Id,[e("div",Ud,[e("div",Nd,[e("p",Ld,o(le.value.filename),1),e("p",Hd,o(le.value.mime_type),1)]),e("div",Ed,[Ss.value>0?(n(),a("div",Kd,[e("span",Fd,o(Ss.value)+" sats",1)])):u("",!0),e("button",{onClick:zs,class:"p-2 rounded-lg text-white/50 hover:text-white hover:bg-white/10 transition-colors"},[...t[123]||(t[123]=[e("svg",{class:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M6 18L18 6M6 6l12 12"})],-1)])])])]),e("div",Wd,[le.value.mime_type.startsWith("audio/")?(n(),a("div",Od,[e("audio",{ref_key:"audioPlayerRef",ref:mt,src:Ne.value,controls:"",class:"w-full",onTimeupdate:ro,onError:uo},null,40,qd)])):le.value.mime_type.startsWith("video/")?(n(),a("div",Jd,[e("video",{ref_key:"videoPlayerRef",ref:pt,src:Ne.value,controls:"",class:"w-full rounded-lg max-h-[60vh]",onTimeupdate:ro,onError:uo},null,40,Qd)])):u("",!0),ht.value?(n(),a("div",Gd,[e("p",Xd,o(ht.value),1),t[124]||(t[124]=e("p",{class:"text-white/50 text-xs mt-1"},"This may be a Tor-only resource. Copy the URL to use with a Tor-enabled media player.",-1))])):u("",!0),e("div",Yd,[e("div",Zd,[k(o($s(le.value.size_bytes))+" ",1),xt.value>0?(n(),a("span",eu," · "+o(Math.round(xt.value*100))+"% streamed",1)):u("",!0)]),e("button",{onClick:sl,class:"text-xs text-white/50 hover:text-white transition-colors"}," Copy URL ")])])])],32)):u("",!0)])),(n(),M(V,{to:"body"},[he.value?(n(),a("div",{key:0,class:"fixed inset-0 z-50 flex items-center justify-center bg-black/60 backdrop-blur-md",onClick:t[29]||(t[29]=$(s=>he.value=!1,["self"])),onKeydown:t[30]||(t[30]=T(s=>he.value=!1,["escape"]))},[e("div",tu,[e("h2",su,o(r(i)("web5.addContentTitle")),1),e("div",ou,[e("div",null,[t[125]||(t[125]=e("label",{class:"text-white/60 text-sm block mb-1"},"Filename",-1)),m(e("input",{"onUpdate:modelValue":t[24]||(t[24]=s=>ze.value=s),type:"text",placeholder:"my-file.mp3",class:"w-full bg-white/5 border border-white/10 rounded-lg px-3 py-2 text-white text-sm focus:outline-none focus:border-white/30"},null,512),[[b,ze.value]])]),e("div",null,[t[126]||(t[126]=e("label",{class:"text-white/60 text-sm block mb-1"},"MIME Type",-1)),m(e("input",{"onUpdate:modelValue":t[25]||(t[25]=s=>Jt.value=s),type:"text",placeholder:"audio/mpeg",class:"w-full bg-white/5 border border-white/10 rounded-lg px-3 py-2 text-white text-sm focus:outline-none focus:border-white/30"},null,512),[[b,Jt.value]])]),e("div",null,[t[127]||(t[127]=e("label",{class:"text-white/60 text-sm block mb-1"},"Description (optional)",-1)),m(e("input",{"onUpdate:modelValue":t[26]||(t[26]=s=>Qt.value=s),type:"text",placeholder:"A short description",class:"w-full bg-white/5 border border-white/10 rounded-lg px-3 py-2 text-white text-sm focus:outline-none focus:border-white/30"},null,512),[[b,Qt.value]])]),e("div",null,[t[128]||(t[128]=e("label",{class:"text-white/60 text-sm block mb-2"},"Access",-1)),e("div",lu,[(n(),a(f,null,y(io,s=>e("button",{key:s.value,onClick:x=>me.value=s.value,class:h(["px-3 py-1.5 text-xs rounded-lg border transition-colors",me.value===s.value?"bg-white/15 border-white/30 text-white":"bg-white/5 border-white/10 text-white/50 hover:bg-white/10"])},o(s.label),11,nu)),64))])]),me.value==="paid"?(n(),a("div",iu,[t[129]||(t[129]=e("label",{class:"text-white/60 text-sm block mb-1"},"Price (sats)",-1)),m(e("input",{"onUpdate:modelValue":t[27]||(t[27]=s=>Ae.value=s),type:"number",min:"1",placeholder:"100",class:"w-full bg-white/5 border border-white/10 rounded-lg px-3 py-2 text-white text-sm focus:outline-none focus:border-white/30"},null,512),[[b,Ae.value,void 0,{number:!0}]]),Ae.value>0?(n(),a("p",au,"Peers will pay "+o(Ae.value)+" sats to access this",1)):u("",!0)])):u("",!0)]),ut.value?(n(),a("div",ru,[e("p",du,o(ut.value),1)])):u("",!0),e("div",uu,[e("button",{onClick:t[28]||(t[28]=s=>{he.value=!1,ut.value=""}),class:"flex-1 glass-button px-4 py-2 rounded-lg text-sm"},o(r(i)("common.cancel")),1),e("button",{onClick:Qo,disabled:dt.value||!ze.value.trim(),class:"flex-1 glass-button px-4 py-2 rounded-lg text-sm font-medium bg-orange-500/20 border-orange-500/30 disabled:opacity-50"},o(dt.value?"Adding...":"Add"),9,cu)])])],32)):u("",!0)])),e("div",vu,[e("div",xu,[e("div",hu,[t[130]||(t[130]=e("div",{class:"flex-shrink-0 w-10 h-10 rounded-lg bg-white/10 flex items-center justify-center"},[e("svg",{class:"w-5 h-5 text-white/80",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M10 6H5a2 2 0 00-2 2v9a2 2 0 002 2h14a2 2 0 002-2V8a2 2 0 00-2-2h-5m-4 0V5a2 2 0 114 0v1m-4 0a2 2 0 104 0m-5 8a2 2 0 100-4 2 2 0 000 4zm0 0c1.306 0 2.417.835 2.83 2M9 14a3.001 3.001 0 00-2.83 2M15 11h3m-3 4h2"})])],-1)),e("div",null,[e("h2",mu,o(r(i)("web5.identities")),1),e("p",pu,o(r(i)("web5.identitiesDesc")),1)])]),e("button",{onClick:t[31]||(t[31]=s=>fe.value=!0),class:"glass-button glass-button-sm px-3 rounded-lg text-sm font-medium flex items-center gap-2"},[...t[131]||(t[131]=[e("svg",{class:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 4v16m8-8H4"})],-1),k(" Create ",-1)])])]),e("div",bu,[e("div",wu,[t[132]||(t[132]=e("div",{class:"flex-shrink-0 w-10 h-10 rounded-lg bg-white/10 flex items-center justify-center"},[e("svg",{class:"w-5 h-5 text-white/80",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M10 6H5a2 2 0 00-2 2v9a2 2 0 002 2h14a2 2 0 002-2V8a2 2 0 00-2-2h-5m-4 0V5a2 2 0 114 0v1m-4 0a2 2 0 104 0m-5 8a2 2 0 100-4 2 2 0 000 4zm0 0c1.306 0 2.417.835 2.83 2M9 14a3.001 3.001 0 00-2.83 2M15 11h3m-3 4h2"})])],-1)),e("h2",fu,o(r(i)("web5.identities")),1)]),e("p",gu,o(r(i)("web5.identitiesDesc")),1),e("button",{onClick:t[32]||(t[32]=s=>fe.value=!0),class:"w-full min-h-[44px] glass-button rounded-lg text-sm font-medium flex items-center justify-center gap-2"},[...t[133]||(t[133]=[e("svg",{class:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 4v16m8-8H4"})],-1),k(" Create ",-1)])])]),Hs.value?(n(),a("div",yu,[t[134]||(t[134]=e("svg",{class:"animate-spin h-6 w-6 text-blue-400 mx-auto mb-2",xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24"},[e("circle",{class:"opacity-25",cx:"12",cy:"12",r:"10",stroke:"currentColor","stroke-width":"4"}),e("path",{class:"opacity-75",fill:"currentColor",d:"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"})],-1)),e("p",_u,o(r(i)("common.loading")),1)])):we.value.length===0?(n(),a("div",ku,[t[135]||(t[135]=e("svg",{class:"w-12 h-12 text-white/20 mx-auto mb-3",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M16 7a4 4 0 11-8 0 4 4 0 018 0zM12 14a7 7 0 00-7 7h14a7 7 0 00-7-7z"})],-1)),e("p",Cu,o(r(i)("web5.noIdentities")),1),e("p",Mu,o(r(i)("web5.createFirstIdentity")),1)])):(n(),a("div",ju,[(n(!0),a(f,null,y(we.value,(s,x)=>(n(),a("div",{key:s.id,class:"card-stagger flex items-center gap-4 p-4 bg-white/5 rounded-lg",style:Os({"--stagger-index":x})},[e("button",{onClick:p=>cl(s),class:"relative flex-shrink-0 w-10 h-10 rounded-full overflow-hidden group",title:"Edit profile"},[s.profile?.picture?(n(),a("img",{key:0,src:s.profile.picture,class:"w-full h-full object-cover",onError:t[33]||(t[33]=p=>p.target.style.display="none")},null,40,Du)):u("",!0),s.profile?.picture?u("",!0):(n(),a("div",{key:1,class:h(["w-full h-full flex items-center justify-center",{"bg-blue-500/20":s.purpose==="personal","bg-orange-500/20":s.purpose==="business","bg-purple-500/20":s.purpose==="anonymous"}])},[e("span",{class:h(["text-sm font-bold",{"text-blue-400":s.purpose==="personal","text-orange-400":s.purpose==="business","text-purple-400":s.purpose==="anonymous"}])},o(s.name.charAt(0).toUpperCase()),3)],2)),t[136]||(t[136]=e("div",{class:"absolute inset-0 bg-black/50 opacity-0 group-hover:opacity-100 transition-opacity flex items-center justify-center"},[e("svg",{class:"w-4 h-4 text-white",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M15.232 5.232l3.536 3.536m-2.036-5.036a2.5 2.5 0 113.536 3.536L6.5 21.036H3v-3.572L16.732 3.732z"})])],-1))],8,Pu),e("div",Tu,[e("div",Ru,[e("span",Bu,o(s.name),1),s.is_default?(n(),a("span",$u,"★")):u("",!0),e("span",{class:h(["text-xs px-2 py-0.5 rounded-full capitalize",{"bg-blue-500/20 text-blue-300":s.purpose==="personal","bg-orange-500/20 text-orange-300":s.purpose==="business","bg-purple-500/20 text-purple-300":s.purpose==="anonymous"}])},o(s.purpose),3)]),e("div",Vu,[e("p",{class:"text-white/50 text-xs font-mono truncate",title:s.did},o(s.did),9,Su),e("button",{onClick:p=>ho(s.did),class:"shrink-0 p-0.5 rounded text-white/30 hover:text-white/70 transition-colors",title:"Copy DID"},[...t[137]||(t[137]=[e("svg",{class:"w-3 h-3",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z"})],-1)])],8,zu)]),s.nostr_npub?(n(),a("div",Au,[e("p",{class:"text-white/40 text-xs font-mono truncate",title:s.nostr_npub},o(s.nostr_npub),9,Iu),e("button",{onClick:p=>ho(s.nostr_npub||""),class:"shrink-0 p-0.5 rounded text-white/30 hover:text-white/70 transition-colors",title:"Copy npub"},[...t[138]||(t[138]=[e("svg",{class:"w-3 h-3",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z"})],-1)])],8,Uu)])):u("",!0)]),e("div",Nu,[e("button",{onClick:p=>ul(s),class:"p-2 rounded-lg text-white/50 hover:text-white hover:bg-white/10 transition-colors",title:"View keys"},[...t[139]||(t[139]=[e("svg",{class:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M15 7a2 2 0 012 2m4 0a6 6 0 01-7.743 5.743L11 17H9v2H7v2H4a1 1 0 01-1-1v-2.586a1 1 0 01.293-.707l5.964-5.964A6 6 0 1121 9z"})],-1)])],8,Lu),s.is_default?u("",!0):(n(),a("button",{key:0,onClick:p=>ml(s.id),class:"p-2 rounded-lg text-white/50 hover:text-yellow-400 hover:bg-white/10 transition-colors",title:"Set as default"},[...t[140]||(t[140]=[e("svg",{class:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M11.049 2.927c.3-.921 1.603-.921 1.902 0l1.519 4.674a1 1 0 00.95.69h4.915c.969 0 1.371 1.24.588 1.81l-3.976 2.888a1 1 0 00-.363 1.118l1.518 4.674c.3.922-.755 1.688-1.538 1.118l-3.976-2.888a1 1 0 00-1.176 0l-3.976 2.888c-.783.57-1.838-.197-1.538-1.118l1.518-4.674a1 1 0 00-.363-1.118l-3.976-2.888c-.784-.57-.38-1.81.588-1.81h4.914a1 1 0 00.951-.69l1.519-4.674z"})],-1)])],8,Hu)),e("button",{onClick:p=>pl(s),class:"p-2 rounded-lg text-white/50 hover:text-red-400 hover:bg-white/10 transition-colors",title:"Delete"},[...t[141]||(t[141]=[e("svg",{class:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16"})],-1)])],8,Eu)])],4))),128))]))]),(n(),M(V,{to:"body"},[fe.value?(n(),a("div",{key:0,class:"fixed inset-0 z-50 flex items-center justify-center bg-black/60 backdrop-blur-md",onClick:t[36]||(t[36]=$(s=>fe.value=!1,["self"])),onKeydown:t[37]||(t[37]=T(s=>fe.value=!1,["escape"]))},[e("div",Ku,[e("h2",Fu,o(r(i)("web5.createIdentityTitle")),1),e("div",Wu,[e("div",null,[t[142]||(t[142]=e("label",{class:"text-white/60 text-sm block mb-1"},"Name",-1)),m(e("input",{"onUpdate:modelValue":t[34]||(t[34]=s=>Yt.value=s),type:"text",placeholder:"Personal",class:"w-full bg-white/5 border border-white/10 rounded-lg px-3 py-2 text-white text-sm focus:outline-none focus:border-white/30"},null,512),[[b,Yt.value]])]),e("div",null,[t[143]||(t[143]=e("label",{class:"text-white/60 text-sm block mb-1"},"Purpose",-1)),e("div",Ou,[(n(),a(f,null,y(["personal","business","anonymous"],s=>e("button",{key:s,onClick:x=>Zt.value=s,class:h(["px-3 py-2 rounded-lg text-sm capitalize transition-colors border",Zt.value===s?"bg-white/15 border-white/30 text-white":"bg-white/5 border-white/10 text-white/60 hover:bg-white/10"])},o(s),11,qu)),64))])])]),es.value?(n(),a("div",Ju,[e("p",Qu,o(es.value),1)])):u("",!0),e("div",Gu,[e("button",{onClick:t[35]||(t[35]=s=>fe.value=!1),class:"flex-1 glass-button px-4 py-2 rounded-lg text-sm"},o(r(i)("common.cancel")),1),e("button",{onClick:hl,disabled:gt.value,class:"flex-1 glass-button px-4 py-2 rounded-lg text-sm font-medium bg-blue-500/20 border-blue-500/30"},o(gt.value?r(i)("web5.creatingDid"):r(i)("web5.createIdentity")),9,Xu)])])],32)):u("",!0)])),(n(),M(V,{to:"body"},[re.value?(n(),a("div",{key:0,class:"fixed inset-0 z-50 flex items-center justify-center bg-black/60 backdrop-blur-md",onClick:t[39]||(t[39]=$(s=>re.value=null,["self"])),onKeydown:t[40]||(t[40]=T(s=>re.value=null,["escape"]))},[e("div",Yu,[e("h2",Zu,o(r(i)("web5.deleteIdentityTitle")),1),e("p",ec,o(r(i)("web5.deleteIdentityConfirm")),1),e("div",tc,[e("button",{onClick:t[38]||(t[38]=s=>re.value=null),class:"flex-1 glass-button px-4 py-2 rounded-lg text-sm"},o(r(i)("common.cancel")),1),e("button",{onClick:bl,disabled:yt.value,class:"flex-1 glass-button px-4 py-2 rounded-lg text-sm font-medium bg-red-500/20 border-red-500/30"},o(yt.value?r(i)("web5.deleting"):r(i)("common.delete")),9,sc)])])],32)):u("",!0)])),(n(),M(V,{to:"body"},[w.value?(n(),a("div",{key:0,class:"fixed inset-0 z-50 flex items-center justify-center bg-black/60 backdrop-blur-md",onClick:$(Ns,["self"]),onKeydown:T(Ns,["escape"])},[e("div",oc,[e("div",lc,[e("div",{class:h(["w-10 h-10 rounded-full flex items-center justify-center",{"bg-blue-500/20":w.value.purpose==="personal","bg-orange-500/20":w.value.purpose==="business","bg-purple-500/20":w.value.purpose==="anonymous"}])},[(n(),a("svg",{class:h(["w-5 h-5",{"text-blue-400":w.value.purpose==="personal","text-orange-400":w.value.purpose==="business","text-purple-400":w.value.purpose==="anonymous"}]),fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[...t[144]||(t[144]=[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M15 7a2 2 0 012 2m4 0a6 6 0 01-7.743 5.743L11 17H9v2H7v2H4a1 1 0 01-1-1v-2.586a1 1 0 01.293-.707l5.964-5.964A6 6 0 1121 9z"},null,-1)])],2))],2),e("div",null,[e("h2",nc,o(w.value.name),1),e("p",ic,o(w.value.purpose)+" identity",1)])]),e("div",ac,[t[149]||(t[149]=e("h3",{class:"text-sm font-semibold text-white/80 flex items-center gap-2"},[e("svg",{class:"w-4 h-4 text-green-400",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M9 12l2 2 4-4m5.618-4.016A11.955 11.955 0 0112 2.944a11.955 11.955 0 01-8.618 3.04A12.02 12.02 0 003 9c0 5.591 3.824 10.29 9 11.622 5.176-1.332 9-6.03 9-11.622 0-1.042-.133-2.052-.382-3.016z"})]),k(" Public Keys ")],-1)),e("div",rc,[e("div",dc,[e("div",uc,[t[145]||(t[145]=e("span",{class:"text-xs text-white/50"},"DID (Ed25519)",-1)),e("button",{onClick:t[41]||(t[41]=s=>be("did",w.value.did)),class:"text-xs text-white/40 hover:text-white/80 transition-colors flex items-center gap-1"},o(G.value==="did"?"Copied!":"Copy"),1)]),e("p",cc,o(w.value.did),1)]),e("div",vc,[e("div",xc,[t[146]||(t[146]=e("span",{class:"text-xs text-white/50"},"Ed25519 Public Key (hex)",-1)),e("button",{onClick:t[42]||(t[42]=s=>be("pubkey",w.value.pubkey)),class:"text-xs text-white/40 hover:text-white/80 transition-colors flex items-center gap-1"},o(G.value==="pubkey"?"Copied!":"Copy"),1)]),e("p",hc,o(w.value.pubkey),1)]),w.value.nostr_npub?(n(),a("div",mc,[e("div",pc,[t[147]||(t[147]=e("span",{class:"text-xs text-white/50"},"Nostr npub (NIP-19)",-1)),e("button",{onClick:t[43]||(t[43]=s=>be("npub",w.value.nostr_npub)),class:"text-xs text-white/40 hover:text-white/80 transition-colors flex items-center gap-1"},o(G.value==="npub"?"Copied!":"Copy"),1)]),e("p",bc,o(w.value.nostr_npub),1)])):u("",!0),w.value.nostr_pubkey?(n(),a("div",wc,[e("div",fc,[t[148]||(t[148]=e("span",{class:"text-xs text-white/50"},"Nostr Public Key (hex)",-1)),e("button",{onClick:t[44]||(t[44]=s=>be("nostr_hex",w.value.nostr_pubkey)),class:"text-xs text-white/40 hover:text-white/80 transition-colors flex items-center gap-1"},o(G.value==="nostr_hex"?"Copied!":"Copy"),1)]),e("p",gc,o(w.value.nostr_pubkey),1)])):u("",!0)])]),e("div",yc,[t[154]||(t[154]=e("h3",{class:"text-sm font-semibold text-red-300/80 flex items-center gap-2 mb-3"},[e("svg",{class:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 15v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2zm10-10V7a4 4 0 00-8 0v4h8z"})]),k(" Private Keys ")],-1)),D.value?(n(),a("div",jc,[e("div",Pc,[e("div",Dc,[t[151]||(t[151]=e("span",{class:"text-xs text-red-300/60"},"Ed25519 Secret Key (hex)",-1)),e("button",{onClick:t[46]||(t[46]=s=>be("ed25519_secret",D.value.ed25519_secret_hex)),class:"text-xs text-red-300/40 hover:text-red-300/80 transition-colors"},o(G.value==="ed25519_secret"?"Copied!":"Copy"),1)]),e("p",Tc,o(D.value.ed25519_secret_hex),1)]),D.value.nostr_nsec?(n(),a("div",Rc,[e("div",Bc,[t[152]||(t[152]=e("span",{class:"text-xs text-red-300/60"},"Nostr nsec (NIP-19)",-1)),e("button",{onClick:t[47]||(t[47]=s=>be("nsec",D.value.nostr_nsec)),class:"text-xs text-red-300/40 hover:text-red-300/80 transition-colors"},o(G.value==="nsec"?"Copied!":"Copy"),1)]),e("p",$c,o(D.value.nostr_nsec),1)])):u("",!0),D.value.nostr_secret_hex?(n(),a("div",Vc,[e("div",Sc,[t[153]||(t[153]=e("span",{class:"text-xs text-red-300/60"},"Nostr Secret Key (hex)",-1)),e("button",{onClick:t[48]||(t[48]=s=>be("nostr_secret",D.value.nostr_secret_hex)),class:"text-xs text-red-300/40 hover:text-red-300/80 transition-colors"},o(G.value==="nostr_secret"?"Copied!":"Copy"),1)]),e("p",zc,o(D.value.nostr_secret_hex),1)])):u("",!0),e("button",{onClick:t[49]||(t[49]=s=>D.value=null),class:"mt-2 text-xs text-white/40 hover:text-white/60 transition-colors"}," Lock private keys ")])):(n(),a("div",_c,[t[150]||(t[150]=e("p",{class:"text-xs text-white/40 mb-3"},"Enter your login password to reveal private keys. Never share these with anyone.",-1)),e("div",kc,[m(e("input",{"onUpdate:modelValue":t[45]||(t[45]=s=>ie.value=s),type:"password",placeholder:"Password",class:"flex-1 bg-white/5 border border-white/10 rounded-lg px-3 py-2 text-white text-sm focus:outline-none focus:border-white/30",onKeydown:T(xo,["enter"])},null,544),[[b,ie.value]]),e("button",{onClick:xo,disabled:!ie.value||bt.value,class:"glass-button px-4 py-2 rounded-lg text-sm font-medium bg-red-500/10 border-red-500/20 hover:bg-red-500/20 disabled:opacity-50"},o(bt.value?"Verifying...":"Unlock"),9,Cc)]),Ee.value?(n(),a("p",Mc,o(Ee.value),1)):u("",!0)]))]),e("div",{class:"flex justify-end mt-5"},[e("button",{onClick:Ns,class:"glass-button px-6 py-2 rounded-lg text-sm"},"Close")])])],32)):u("",!0)])),(n(),M(V,{to:"body"},[B.value?(n(),a("div",{key:0,class:"fixed inset-0 z-50 flex items-center justify-center bg-black/60 backdrop-blur-md",onClick:$(Ls,["self"]),onKeydown:T(Ls,["escape"])},[e("div",Ac,[e("div",Ic,[e("div",Uc,[_.value.picture?(n(),a("img",{key:0,src:_.value.picture,class:"w-full h-full object-cover",onError:t[50]||(t[50]=s=>s.target.style.display="none")},null,40,Nc)):(n(),a("div",Lc,[e("span",Hc,o(B.value.name.charAt(0).toUpperCase()),1)]))]),e("div",null,[t[155]||(t[155]=e("h2",{id:"profile-editor-title",class:"text-lg font-bold text-white"},"Edit Profile",-1)),e("p",Ec,o(B.value.name)+" · "+o(B.value.purpose),1)])]),e("div",Kc,[e("div",null,[t[156]||(t[156]=e("label",{class:"text-white/60 text-xs block mb-1"},"Display Name",-1)),m(e("input",{"onUpdate:modelValue":t[51]||(t[51]=s=>_.value.display_name=s),type:"text",placeholder:B.value.name,class:"w-full bg-white/5 border border-white/10 rounded-lg px-3 py-2 text-white text-sm focus:outline-none focus:border-white/30"},null,8,Fc),[[b,_.value.display_name]])]),e("div",null,[t[157]||(t[157]=e("label",{class:"text-white/60 text-xs block mb-1"},"About / Bio",-1)),m(e("textarea",{"onUpdate:modelValue":t[52]||(t[52]=s=>_.value.about=s),rows:"3",placeholder:"A short bio...",class:"w-full bg-white/5 border border-white/10 rounded-lg px-3 py-2 text-white text-sm focus:outline-none focus:border-white/30 resize-none"},null,512),[[b,_.value.about]])]),e("div",null,[t[158]||(t[158]=e("label",{class:"text-white/60 text-xs block mb-1"},"Profile Picture URL",-1)),m(e("input",{"onUpdate:modelValue":t[53]||(t[53]=s=>_.value.picture=s),type:"url",placeholder:"https://...",class:"w-full bg-white/5 border border-white/10 rounded-lg px-3 py-2 text-white text-sm focus:outline-none focus:border-white/30"},null,512),[[b,_.value.picture]])]),e("div",null,[t[159]||(t[159]=e("label",{class:"text-white/60 text-xs block mb-1"},"Banner Image URL",-1)),m(e("input",{"onUpdate:modelValue":t[54]||(t[54]=s=>_.value.banner=s),type:"url",placeholder:"https://...",class:"w-full bg-white/5 border border-white/10 rounded-lg px-3 py-2 text-white text-sm focus:outline-none focus:border-white/30"},null,512),[[b,_.value.banner]])]),e("div",null,[t[160]||(t[160]=e("label",{class:"text-white/60 text-xs block mb-1"},"Website",-1)),m(e("input",{"onUpdate:modelValue":t[55]||(t[55]=s=>_.value.website=s),type:"url",placeholder:"https://...",class:"w-full bg-white/5 border border-white/10 rounded-lg px-3 py-2 text-white text-sm focus:outline-none focus:border-white/30"},null,512),[[b,_.value.website]])]),e("div",Wc,[e("div",null,[t[161]||(t[161]=e("label",{class:"text-white/60 text-xs block mb-1"},"NIP-05 (Nostr address)",-1)),m(e("input",{"onUpdate:modelValue":t[56]||(t[56]=s=>_.value.nip05=s),type:"text",placeholder:"you@domain.com",class:"w-full bg-white/5 border border-white/10 rounded-lg px-3 py-2 text-white text-sm focus:outline-none focus:border-white/30"},null,512),[[b,_.value.nip05]])]),e("div",null,[t[162]||(t[162]=e("label",{class:"text-white/60 text-xs block mb-1"},"Lightning Address (LUD-16)",-1)),m(e("input",{"onUpdate:modelValue":t[57]||(t[57]=s=>_.value.lud16=s),type:"text",placeholder:"you@getalby.com",class:"w-full bg-white/5 border border-white/10 rounded-lg px-3 py-2 text-white text-sm focus:outline-none focus:border-white/30"},null,512),[[b,_.value.lud16]])])])]),ae.value?(n(),a("div",Oc,[e("p",qc,o(ae.value),1)])):u("",!0),L.value?(n(),a("div",Jc,[e("p",Qc,o(L.value),1)])):u("",!0),e("div",Gc,[e("button",{onClick:Ls,class:"flex-1 glass-button px-4 py-2 rounded-lg text-sm"},"Cancel"),e("button",{onClick:vl,disabled:wt.value,class:"flex-1 glass-button px-4 py-2 rounded-lg text-sm font-medium"},o(wt.value?"Saving...":"Save"),9,Xc),e("button",{onClick:xl,disabled:ft.value,class:"flex-1 glass-button px-4 py-2 rounded-lg text-sm font-medium bg-orange-500/20 border-orange-500/30"},o(ft.value?"Publishing...":"Save & Publish"),9,Yc)])])],32)):u("",!0)])),(n(),M(V,{to:"body"},[Ms.value?(n(),a("div",{key:0,class:"fixed inset-0 z-50 flex items-center justify-center bg-black/60 backdrop-blur-md",onClick:$(Ds,["self"]),onKeydown:T(Ds,["escape"])},[e("div",Zc,[e("h2",e0,o(r(i)("web5.sendBitcoinTitle")),1),e("div",t0,[(n(),a(f,null,y(["auto","lightning","onchain","ecash"],s=>e("button",{key:s,onClick:x=>st.value=s,class:h(["flex-1 px-2 py-1.5 rounded text-xs font-medium capitalize transition-colors",st.value===s?"bg-white/15 text-white":"text-white/50 hover:text-white/80"])},o(s==="onchain"?"On-chain":s),11,s0)),64))]),st.value==="auto"?(n(),a("div",o0,[...t[163]||(t[163]=[e("p",{class:"text-xs text-white/50"},"Auto-selects method based on amount: ecash < 1k sats, Lightning 1k–500k, on-chain > 500k",-1)])])):u("",!0),e("div",l0,[t[164]||(t[164]=e("label",{class:"text-white/60 text-sm block mb-1"},"Amount (sats)",-1)),m(e("input",{"onUpdate:modelValue":t[58]||(t[58]=s=>se.value=s),type:"number",min:"1",placeholder:"1000",class:"w-full bg-white/5 border border-white/10 rounded-lg px-3 py-2 text-white text-sm focus:outline-none focus:border-white/30"},null,512),[[b,se.value,void 0,{number:!0}]])]),ve.value!=="ecash"?(n(),a("div",n0,[e("label",i0,o(ve.value==="lightning"?"Lightning Invoice (BOLT11)":"Bitcoin Address"),1),m(e("textarea",{"onUpdate:modelValue":t[59]||(t[59]=s=>ue.value=s),rows:"2",placeholder:ve.value==="lightning"?"lnbc...":"bc1...",class:"w-full bg-white/5 border border-white/10 rounded-lg px-3 py-2 text-white text-sm font-mono focus:outline-none focus:border-white/30"},null,8,a0),[[b,ue.value]])])):u("",!0),$e.value&&ve.value==="ecash"?(n(),a("div",r0,[t[165]||(t[165]=e("p",{class:"text-white/50 text-xs mb-1"},"Token (share with recipient):",-1)),e("p",d0,o($e.value),1),e("button",{onClick:t[60]||(t[60]=s=>qo($e.value)),class:"mt-2 text-xs text-orange-400 hover:text-orange-300"},"Copy")])):u("",!0),ve.value==="onchain"?(n(),a("div",u0,[e("label",c0,[m(e("input",{type:"checkbox","onUpdate:modelValue":t[61]||(t[61]=s=>Ot.value=s),class:"sr-only peer"},null,512),[[po,Ot.value]]),t[166]||(t[166]=e("div",{class:"w-9 h-5 bg-white/10 peer-focus:outline-none rounded-full peer peer-checked:bg-orange-500/40 transition-colors after:content-[''] after:absolute after:top-0.5 after:left-[2px] after:bg-white after:rounded-full after:h-4 after:w-4 after:transition-all peer-checked:after:translate-x-full"},null,-1))]),e("div",null,[e("p",v0,o(r(i)("web5.signWithHwWallet")),1),e("p",x0,o(r(i)("web5.createsPsbt")),1)])])):u("",!0),lt.value==="created"&&W.value?(n(),a("div",h0,[e("div",m0,[t[167]||(t[167]=e("p",{class:"text-xs text-white/50 mb-1"},"Unsigned PSBT (copy or download):",-1)),e("textarea",{readonly:"",value:W.value,rows:"3",class:"w-full bg-black/20 border border-white/10 rounded px-2 py-1 text-xs font-mono text-white/80 focus:outline-none"},null,8,p0),e("div",{class:"flex gap-2 mt-2"},[e("button",{onClick:Ko,class:"text-xs text-orange-400 hover:text-orange-300"},"Copy PSBT"),e("button",{onClick:Fo,class:"text-xs text-orange-400 hover:text-orange-300"},"Download .psbt")])]),e("div",b0,[t[169]||(t[169]=e("p",{class:"text-xs text-white/50 mb-1"},"Paste signed PSBT or upload file:",-1)),m(e("textarea",{"onUpdate:modelValue":t[62]||(t[62]=s=>O.value=s),rows:"3",placeholder:"Paste signed PSBT base64 here...",class:"w-full bg-black/20 border border-white/10 rounded px-2 py-1 text-xs font-mono text-white/80 focus:outline-none focus:border-white/30"},null,512),[[b,O.value]]),e("div",w0,[e("label",f0,[t[168]||(t[168]=k(" Upload .psbt ",-1)),e("input",{type:"file",accept:".psbt,.txt",class:"hidden",onChange:Wo},null,32)])])])])):u("",!0),Se.value?(n(),a("div",g0,[e("p",y0,"Sent! TX: "+o(Se.value),1)])):u("",!0),ot.value?(n(),a("div",_0,[e("p",k0,"Paid! Hash: "+o(ot.value),1)])):u("",!0),N.value?(n(),a("div",C0,o(N.value),1)):u("",!0),e("div",M0,[e("button",{onClick:Ds,class:"flex-1 glass-button px-4 py-2 rounded-lg text-sm"},o(r(i)("common.close")),1),lt.value==="created"?(n(),a("button",{key:0,onClick:Eo,disabled:S.value||!O.value.trim(),class:"flex-1 glass-button px-4 py-2 rounded-lg text-sm font-medium bg-orange-500/20 border-orange-500/30 disabled:opacity-50"},o(S.value?"Broadcasting...":"Broadcast"),9,j0)):(n(),a("button",{key:1,onClick:Ho,disabled:S.value||!se.value,class:"flex-1 glass-button px-4 py-2 rounded-lg text-sm font-medium bg-orange-500/20 border-orange-500/30 disabled:opacity-50"},o(S.value?"Sending...":Ot.value&&ve.value==="onchain"?"Create PSBT":"Send"),9,P0))])])],32)):u("",!0)])),(n(),M(V,{to:"body"},[js.value?(n(),a("div",{key:0,class:"fixed inset-0 z-50 flex items-center justify-center bg-black/60 backdrop-blur-md",onClick:$(Ts,["self"]),onKeydown:T(Ts,["escape"])},[e("div",D0,[e("h2",T0,o(r(i)("web5.receiveBitcoinTitle")),1),e("div",R0,[(n(),a(f,null,y(["lightning","onchain","ecash"],s=>e("button",{key:s,onClick:x=>q.value=s,class:h(["flex-1 px-2 py-1.5 rounded text-xs font-medium capitalize transition-colors",q.value===s?"bg-white/15 text-white":"text-white/50 hover:text-white/80"])},o(s==="onchain"?"On-chain":s),11,B0)),64))]),q.value==="lightning"?(n(),a("div",$0,[e("div",V0,[t[170]||(t[170]=e("label",{class:"text-white/60 text-sm block mb-1"},"Amount (sats)",-1)),m(e("input",{"onUpdate:modelValue":t[63]||(t[63]=s=>nt.value=s),type:"number",min:"1",placeholder:"1000",class:"w-full bg-white/5 border border-white/10 rounded-lg px-3 py-2 text-white text-sm focus:outline-none focus:border-white/30"},null,512),[[b,nt.value,void 0,{number:!0}]])]),e("div",S0,[t[171]||(t[171]=e("label",{class:"text-white/60 text-sm block mb-1"},"Memo (optional)",-1)),m(e("input",{"onUpdate:modelValue":t[64]||(t[64]=s=>Ps.value=s),type:"text",placeholder:"Payment for...",class:"w-full bg-white/5 border border-white/10 rounded-lg px-3 py-2 text-white text-sm focus:outline-none focus:border-white/30"},null,512),[[b,Ps.value]])]),it.value?(n(),a("div",z0,[t[172]||(t[172]=e("p",{class:"text-white/50 text-xs mb-1"},"Invoice (share with sender):",-1)),e("p",A0,o(it.value),1),e("button",{onClick:t[65]||(t[65]=s=>no(it.value,"Invoice copied")),class:"mt-2 text-xs text-orange-400 hover:text-orange-300"},"Copy")])):u("",!0)])):u("",!0),q.value==="onchain"?(n(),a("div",I0,[at.value?(n(),a("div",U0,[e("canvas",{ref_key:"onchainQrCanvas",ref:lo,class:"mx-auto mb-3 rounded-lg",style:{"image-rendering":"pixelated"}},null,512),t[173]||(t[173]=e("p",{class:"text-white/50 text-xs mb-2"},"Your Bitcoin address:",-1)),e("p",N0,o(at.value),1),e("button",{onClick:t[66]||(t[66]=s=>no(at.value,"Address copied")),class:"mt-2 text-xs text-orange-400 hover:text-orange-300"},"Copy")])):(n(),a("div",L0,[e("p",H0,o(r(i)("web5.generateFreshAddress")),1)]))])):u("",!0),q.value==="ecash"?(n(),a("div",E0,[e("div",K0,[t[174]||(t[174]=e("label",{class:"text-white/60 text-sm block mb-1"},"Paste ecash token",-1)),m(e("textarea",{"onUpdate:modelValue":t[67]||(t[67]=s=>Ve.value=s),rows:"3",placeholder:"cashuSend_...",class:"w-full bg-white/5 border border-white/10 rounded-lg px-3 py-2 text-white text-sm focus:outline-none focus:border-white/30"},null,512),[[b,Ve.value]])]),Wt.value?(n(),a("div",F0,o(Wt.value),1)):u("",!0)])):u("",!0),ce.value?(n(),a("div",W0,o(ce.value),1)):u("",!0),e("div",O0,[e("button",{onClick:Ts,class:"flex-1 glass-button px-4 py-2 rounded-lg text-sm"},o(r(i)("common.close")),1),e("button",{onClick:Oo,disabled:rt.value,class:"flex-1 glass-button px-4 py-2 rounded-lg text-sm font-medium bg-green-500/20 border-green-500/30 disabled:opacity-50"},o(rt.value?"Processing...":q.value==="onchain"?"Generate Address":q.value==="lightning"?"Create Invoice":"Receive"),9,q0)])])],32)):u("",!0)])),e("div",J0,[e("div",Q0,[e("div",G0,[t[175]||(t[175]=e("div",{class:"flex-shrink-0 w-10 h-10 rounded-lg bg-white/10 flex items-center justify-center"},[e("svg",{class:"w-5 h-5 text-white/80",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M4 7v10c0 2.21 3.582 4 8 4s8-1.79 8-4V7M4 7c0 2.21 3.582 4 8 4s8-1.79 8-4M4 7c0-2.21 3.582-4 8-4s8 1.79 8 4m0 5c0 2.21-3.582 4-8 4s-8-1.79-8-4"})])],-1)),e("div",null,[e("h2",X0,o(r(i)("web5.decentralizedWebNode")),1),e("p",Y0,o(r(i)("web5.dwnDescription")),1)])]),Je.value&&cs.value?(n(),M(v,{key:0,to:"/apps/dwn",class:"glass-button glass-button-sm px-3 rounded-lg text-sm font-medium inline-flex items-center gap-2 no-underline"},{default:ge(()=>[k(o(r(i)("web5.manageDwn")),1)]),_:1})):u("",!0)]),!Je.value||!cs.value?(n(),a("div",Z0,[e("p",e1,o(Je.value?"The DWN container is not running.":"The DWN container is not installed.")+" "+o(Je.value?"Start it from the App Store to enable decentralized data storage and sync.":"Install it from the App Store to enable decentralized data storage and sync."),1),kt(v,{to:"/dashboard/marketplace",class:"glass-button px-4 py-2 rounded-lg text-sm font-medium inline-flex items-center gap-2 no-underline"},{default:ge(()=>[...t[176]||(t[176]=[e("svg",{class:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M3 3h2l.4 2M7 13h10l4-8H5.4M7 13L5.4 5M7 13l-2.293 2.293c-.63.63-.184 1.707.707 1.707H17m0 0a2 2 0 100 4 2 2 0 000-4zm-8 2a2 2 0 100 4 2 2 0 000-4z"})],-1),k(" Open App Store ",-1)])]),_:1})])):u("",!0),Je.value&&cs.value?(n(),a(f,{key:1},[e("div",t1,[e("div",s1,[e("div",o1,o(r(i)("common.status")),1),e("div",l1,[e("div",{class:h(["w-2 h-2 rounded-full",R.value?.running?"bg-green-400":"bg-red-400"])},null,2),e("span",n1,o(R.value?.running?r(i)("common.running"):r(i)("common.stopped")),1)])]),e("div",i1,[t[177]||(t[177]=e("div",{class:"text-xs text-white/50 mb-1"},"Sync",-1)),e("div",a1,[e("div",{class:h(["w-2 h-2 rounded-full",{"bg-green-400":U.value==="synced","bg-yellow-400 animate-pulse":U.value==="syncing","bg-red-400":U.value==="error","bg-white/30":U.value==="idle"}])},null,2),e("span",r1,o(U.value),1)])]),e("div",d1,[t[178]||(t[178]=e("div",{class:"text-xs text-white/50 mb-1"},"Storage",-1)),e("span",u1,o(Vo.value),1)]),e("div",c1,[t[179]||(t[179]=e("div",{class:"text-xs text-white/50 mb-1"},"Messages",-1)),e("span",v1,o(R.value?.message_count??0),1)])]),e("div",x1,[e("div",h1,[e("div",m1,"Registered Protocols ("+o(Ge.value.length)+")",1),e("button",{onClick:t[68]||(t[68]=s=>Ye.value=!Ye.value),class:"text-xs text-blue-400 hover:text-blue-300 transition-colors"},o(Ye.value?"Cancel":"+ Register"),1)]),Ye.value?(n(),a("div",p1,[e("div",b1,[e("div",w1,[t[180]||(t[180]=e("label",{class:"text-xs text-white/50 block mb-1"},"Protocol URI",-1)),m(e("input",{"onUpdate:modelValue":t[69]||(t[69]=s=>Ce.value=s),type:"text",placeholder:"https://example.com/protocol",class:"w-full bg-black/30 border border-white/10 rounded-lg px-3 py-1.5 text-sm text-white placeholder-white/30 focus:outline-none focus:border-blue-500/50"},null,512),[[b,Ce.value]])]),e("label",f1,[m(e("input",{"onUpdate:modelValue":t[70]||(t[70]=s=>Vt.value=s),type:"checkbox",class:"rounded bg-black/30 border-white/20"},null,512),[[po,Vt.value]]),t[181]||(t[181]=k(" Published ",-1))]),e("button",{onClick:fl,disabled:Ze.value||!Ce.value.trim(),class:"glass-button glass-button-sm px-3 rounded-lg text-xs font-medium disabled:opacity-50 whitespace-nowrap"},o(Ze.value?"Registering...":"Register"),9,g1)])])):u("",!0),Ge.value.length?(n(),a("div",y1,[(n(!0),a(f,null,y(Ge.value,s=>(n(),a("div",{key:s.protocol,class:"flex items-center gap-1.5 px-2 py-1 rounded-md bg-blue-500/15 border border-blue-500/20 text-xs text-blue-300 group"},[e("span",null,o(s.protocol),1),s.published?(n(),a("span",_1,"•")):u("",!0),e("button",{onClick:x=>gl(s.protocol),disabled:xs.value===s.protocol,class:"opacity-0 group-hover:opacity-100 text-red-400/60 hover:text-red-400 transition-all ml-1",title:"Remove"}," × ",8,k1)]))),128))])):(n(),a("div",C1,"No protocols registered"))]),R.value?.peer_sync_targets?.length?(n(),a("div",M1,[t[183]||(t[183]=e("div",{class:"text-xs text-white/50 mb-2"},"Peer Sync Targets",-1)),e("div",j1,[(n(!0),a(f,null,y(R.value.peer_sync_targets,s=>(n(),a("div",{key:s,class:"flex items-center gap-2 text-xs text-white/70 bg-white/5 rounded-lg px-3 py-2"},[t[182]||(t[182]=e("svg",{class:"w-3 h-3 text-green-400 flex-shrink-0",fill:"currentColor",viewBox:"0 0 24 24"},[e("circle",{cx:"12",cy:"12",r:"4"})],-1)),e("span",P1,o(s),1)]))),128))])])):u("",!0),e("div",D1,[e("div",T1,[t[184]||(t[184]=e("div",{class:"text-xs text-white/50"},"Messages",-1)),e("button",{onClick:yl,class:"text-xs text-blue-400 hover:text-blue-300 transition-colors"},o(Xe.value?"Hide":"Browse"),1)]),Xe.value?(n(),a("div",R1,[vs.value?(n(),a("div",B1,"Loading messages...")):$t.value.length===0?(n(),a("div",$1,"No messages stored")):(n(),a("div",V1,[(n(!0),a(f,null,y($t.value,s=>(n(),a("div",{key:s.record_id,class:"bg-white/5 rounded-lg p-3"},[e("div",S1,[e("span",{class:"text-xs font-mono text-white/50 truncate max-w-[200px]",title:s.record_id},o((s.record_id||"").slice(0,8))+"...",9,z1),e("span",A1,o(new Date(s.date_created).toLocaleString()),1)]),e("div",I1,[e("span",U1,o(s.author),1),s.descriptor.protocol?(n(),a("span",N1,o(s.descriptor.protocol),1)):u("",!0),s.descriptor.schema?(n(),a("span",L1,o(s.descriptor.schema),1)):u("",!0)]),s.data?(n(),a("div",H1,o(JSON.stringify(s.data).slice(0,120)),1)):u("",!0)]))),128))]))])):u("",!0)]),e("div",E1,[e("div",K1,o(R.value?.last_sync?`Last sync: ${new Date(R.value.last_sync).toLocaleString()}`:"Never synced"),1),e("button",{onClick:wl,disabled:Qe.value||!R.value?.running,class:"glass-button glass-button-sm px-3 rounded-lg text-sm font-medium flex items-center gap-2 disabled:opacity-50"},[(n(),a("svg",{class:h(["w-4 h-4",{"animate-spin":Qe.value}]),fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[...t[185]||(t[185]=[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15"},null,-1)])],2)),k(" "+o(Qe.value?r(i)("web5.syncing"):r(i)("web5.syncNow")),1)],8,F1)])],64)):u("",!0)]),e("div",W1,[e("div",O1,[e("div",q1,[t[186]||(t[186]=e("div",{class:"flex-shrink-0 w-10 h-10 rounded-lg bg-white/10 flex items-center justify-center"},[e("svg",{class:"w-5 h-5 text-white/80",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M9 12l2 2 4-4m5.618-4.016A11.955 11.955 0 0112 2.944a11.955 11.955 0 01-8.618 3.04A12.02 12.02 0 003 9c0 5.591 3.824 10.29 9 11.622 5.176-1.332 9-6.03 9-11.622 0-1.042-.133-2.052-.382-3.016z"})])],-1)),e("div",null,[e("h2",J1,o(r(i)("web5.verifiableCredentials")),1),e("p",Q1,o(r(i)("web5.verifiableCredentialsDesc")),1)])]),kt(v,{to:"/dashboard/web5/credentials",class:"glass-button glass-button-sm px-3 rounded-lg text-sm font-medium flex items-center gap-2"},{default:ge(()=>[...t[187]||(t[187]=[k(" Manage → ",-1)])]),_:1})]),e("div",G1,[e("div",X1,[t[188]||(t[188]=e("div",{class:"flex-shrink-0 w-10 h-10 rounded-lg bg-white/10 flex items-center justify-center"},[e("svg",{class:"w-5 h-5 text-white/80",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M9 12l2 2 4-4m5.618-4.016A11.955 11.955 0 0112 2.944a11.955 11.955 0 01-8.618 3.04A12.02 12.02 0 003 9c0 5.591 3.824 10.29 9 11.622 5.176-1.332 9-6.03 9-11.622 0-1.042-.133-2.052-.382-3.016z"})])],-1)),e("h2",Y1,o(r(i)("web5.verifiableCredentials")),1)]),e("p",Z1,o(r(i)("web5.verifiableCredentialsDesc")),1),kt(v,{to:"/dashboard/web5/credentials",class:"w-full min-h-[44px] glass-button rounded-lg text-sm font-medium flex items-center justify-center gap-2"},{default:ge(()=>[...t[189]||(t[189]=[k(" Manage → ",-1)])]),_:1})]),e("div",ev,[e("div",tv,[t[190]||(t[190]=e("div",{class:"text-xs text-white/50 mb-1"},"Total",-1)),e("span",sv,o(Z.value.length),1)]),e("div",ov,[t[191]||(t[191]=e("div",{class:"text-xs text-white/50 mb-1"},"Active",-1)),e("span",lv,o(Z.value.filter(s=>s.status==="active").length),1)]),e("div",nv,[t[192]||(t[192]=e("div",{class:"text-xs text-white/50 mb-1"},"Identities",-1)),e("span",iv,o(we.value.length),1)])]),Z.value.length?(n(),a("div",av,[(n(!0),a(f,null,y(Z.value.slice(0,3),s=>(n(),a("div",{key:s.id,class:"flex items-center justify-between p-3 bg-white/5 rounded-lg"},[e("div",rv,[e("div",dv,o(s.type),1),e("div",uv,"To: "+o((s.subject||"").slice(0,30))+"...",1)]),e("span",{class:h([{"text-green-400":s.status==="active","text-red-400":s.status==="revoked","text-yellow-400":s.status==="expired"},"text-xs font-medium capitalize"])},o(s.status),3)]))),128)),Z.value.length>3?(n(),M(v,{key:0,to:"/dashboard/web5/credentials",class:"block text-center text-xs text-white/50 hover:text-white/70 py-2 transition-colors"},{default:ge(()=>[k(" View all "+o(Z.value.length)+" credentials → ",1)]),_:1})):u("",!0)])):(n(),a("div",cv,o(r(i)("web5.noCredentials")),1))]),(n(),M(V,{to:"body"},[Fe.value?(n(),a("div",{key:0,class:"fixed inset-0 z-50 flex items-center justify-center bg-black/60 backdrop-blur-md",onClick:t[76]||(t[76]=$(s=>Fe.value=!1,["self"])),onKeydown:t[77]||(t[77]=T(s=>Fe.value=!1,["escape"]))},[e("div",vv,[e("div",xv,[e("h2",hv,o(r(i)("web5.domainsTitle")),1),e("button",{onClick:t[71]||(t[71]=s=>Fe.value=!1),class:"text-white/40 hover:text-white/80 transition-colors"},[...t[193]||(t[193]=[e("svg",{class:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M6 18L18 6M6 6l12 12"})],-1)])])]),X.value.length?(n(),a("div",mv,[(n(!0),a(f,null,y(X.value,s=>(n(),a("div",{key:s.id,class:"flex items-center justify-between p-3 bg-white/5 rounded-lg"},[e("div",null,[e("div",pv,o(s.nip05),1),e("div",bv,"DID: "+o(s.did),1)]),e("div",wv,[e("span",{class:h([{"text-green-400":s.status==="active","text-yellow-400":s.status==="pending","text-red-400":s.status==="expired"||s.status==="failed"},"text-xs font-medium capitalize"])},o(s.status),3),e("button",{onClick:x=>yo(s.id),class:"text-white/30 hover:text-red-400 transition-colors p-1"},[...t[194]||(t[194]=[e("svg",{class:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16"})],-1)])],8,fv)])]))),128))])):(n(),a("div",gv,o(r(i)("web5.noDomains")),1)),e("div",yv,[e("h3",_v,o(r(i)("web5.registerNewName")),1),e("div",kv,[e("div",null,[t[195]||(t[195]=e("label",{class:"text-white/60 text-xs block mb-1"},"Username",-1)),m(e("input",{"onUpdate:modelValue":t[72]||(t[72]=s=>ye.value=s),type:"text",placeholder:"satoshi",class:"w-full bg-white/5 border border-white/10 rounded-lg px-3 py-2 text-white text-sm focus:outline-none focus:border-white/30"},null,512),[[b,ye.value]])]),e("div",null,[t[196]||(t[196]=e("label",{class:"text-white/60 text-xs block mb-1"},"Domain",-1)),m(e("input",{"onUpdate:modelValue":t[73]||(t[73]=s=>_e.value=s),type:"text",placeholder:"example.com",class:"w-full bg-white/5 border border-white/10 rounded-lg px-3 py-2 text-white text-sm focus:outline-none focus:border-white/30"},null,512),[[b,_e.value]])])]),e("div",Cv,[t[198]||(t[198]=e("label",{class:"text-white/60 text-xs block mb-1"},"Link to Identity",-1)),m(e("select",{"onUpdate:modelValue":t[74]||(t[74]=s=>de.value=s),class:"w-full bg-white/5 border border-white/10 rounded-lg px-3 py-2 text-white text-sm focus:outline-none focus:border-white/30"},[t[197]||(t[197]=e("option",{value:"",disabled:""},"Select identity...",-1)),(n(!0),a(f,null,y(we.value,s=>(n(),a("option",{key:s.id,value:s.id},o(s.name)+" ("+o((s.did||"").slice(0,24))+"...)",9,Mv))),128))],512),[[Ws,de.value]])]),We.value?(n(),a("div",jv,o(We.value),1)):u("",!0),e("button",{onClick:go,disabled:jt.value||!ye.value.trim()||!_e.value.trim()||!de.value,class:"w-full glass-button px-4 py-2 rounded-lg text-sm font-medium disabled:opacity-50"},o(jt.value?"Registering...":"Register Name"),9,Pv)]),e("div",Dv,[e("h3",Tv,o(r(i)("web5.verifyNip05")),1),e("div",Rv,[m(e("input",{"onUpdate:modelValue":t[75]||(t[75]=s=>Oe.value=s),type:"text",placeholder:"user@domain.com",class:"flex-1 bg-white/5 border border-white/10 rounded-lg px-3 py-2 text-white text-sm focus:outline-none focus:border-white/30"},null,512),[[b,Oe.value]]),e("button",{onClick:_o,disabled:Pt.value||!Oe.value.trim(),class:"glass-button px-4 py-2 rounded-lg text-sm font-medium disabled:opacity-50"},o(Pt.value?"...":"Verify"),9,Bv)]),Y.value?(n(),a("div",$v,[e("div",Vv,[e("div",{class:h(["w-2 h-2 rounded-full",Y.value.verified?"bg-green-400":"bg-red-400"])},null,2),e("span",Sv,o(Y.value.verified?"Verified":"Not Found"),1)]),Y.value.nostr_pubkey?(n(),a("div",zv,"Pubkey: "+o(Y.value.nostr_pubkey),1)):u("",!0)])):u("",!0)])])],32)):u("",!0)])),(n(),M(V,{to:"body"},[je.value?(n(),a("div",{key:0,class:"fixed inset-0 z-50 flex items-center justify-center bg-black/60 backdrop-blur-md",onClick:t[80]||(t[80]=$(s=>je.value=!1,["self"])),onKeydown:t[81]||(t[81]=T(s=>je.value=!1,["escape"]))},[e("div",Av,[e("div",Iv,[e("h2",Uv,o(r(i)("web5.nostrRelays")),1),e("button",{onClick:t[78]||(t[78]=s=>je.value=!1),class:"text-white/40 hover:text-white/80 transition-colors"},[...t[199]||(t[199]=[e("svg",{class:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M6 18L18 6M6 6l12 12"})],-1)])])]),It.value.length?(n(),a("div",Nv,[(n(!0),a(f,null,y(It.value,s=>(n(),a("div",{key:s.url,class:"flex items-center justify-between p-3 bg-white/5 rounded-lg"},[e("div",Lv,[e("div",{class:h(["w-2 h-2 rounded-full flex-shrink-0",s.connected?"bg-green-400":"bg-white/30"])},null,2),e("span",Hv,o(s.url),1)]),e("div",Ev,[e("button",{onClick:x=>Mo(s.url,!s.enabled),class:h(["text-xs px-2 py-1 rounded",s.enabled?"bg-green-500/20 text-green-400":"bg-white/5 text-white/40"])},o(s.enabled?"On":"Off"),11,Kv),e("button",{onClick:x=>Co(s.url),class:"text-white/30 hover:text-red-400 transition-colors p-1"},[...t[200]||(t[200]=[e("svg",{class:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M6 18L18 6M6 6l12 12"})],-1)])],8,Fv)])]))),128))])):(n(),a("div",Wv,o(r(i)("web5.noRelays")),1)),e("div",Ov,[e("h3",qv,o(r(i)("web5.addRelay")),1),e("div",Jv,[m(e("input",{"onUpdate:modelValue":t[79]||(t[79]=s=>Pe.value=s),type:"text",placeholder:r(i)("web5.relayUrlPlaceholder"),class:"flex-1 bg-white/5 border border-white/10 rounded-lg px-3 py-2 text-white text-sm focus:outline-none focus:border-white/30",onKeyup:T(Qs,["enter"])},null,40,Qv),[[b,Pe.value]]),e("button",{onClick:Qs,disabled:!Pe.value.trim(),class:"glass-button px-4 py-2 rounded-lg text-sm font-medium disabled:opacity-50"}," Add ",8,Gv)]),De.value?(n(),a("div",Xv,o(De.value),1)):u("",!0)])])],32)):u("",!0)])),kt(mo,{name:"content-fade"},{default:ge(()=>[Is.value?(n(),a("div",Yv,o(co.value),1)):u("",!0)]),_:1})])}}});export{ox as default}; diff --git a/neode-ui/dist/assets/aiPermissions-sblnS_DK.js b/neode-ui/dist/assets/aiPermissions-sblnS_DK.js new file mode 100644 index 0000000..54f1ca5 --- /dev/null +++ b/neode-ui/dist/assets/aiPermissions-sblnS_DK.js @@ -0,0 +1 @@ +import{$ as b,r as S,j as o}from"./index-DnbYEqLr.js";const n="archipelago-ai-permissions",s=[{id:"apps",label:"Installed Apps",description:"App names, status, and health — no credentials or config details",icon:"M4 6a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2H6a2 2 0 01-2-2V6zM14 6a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2h-2a2 2 0 01-2-2V6zM4 16a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2H6a2 2 0 01-2-2v-2zM14 16a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2h-2a2 2 0 01-2-2v-2z",group:"Node Data"},{id:"system",label:"System Stats",description:"CPU, RAM, disk usage — no file paths or IP addresses",icon:"M9 3v2m6-2v2M9 19v2m6-2v2M5 9H3m2 6H3m18-6h-2m2 6h-2M7 19h10a2 2 0 002-2V7a2 2 0 00-2-2H7a2 2 0 00-2 2v10a2 2 0 002 2zM9 9h6v6H9V9z",group:"Node Data"},{id:"network",label:"Network Status",description:"Connection status, peer count — no IP addresses or keys",icon:"M5 12h14M5 12a2 2 0 01-2-2V6a2 2 0 012-2h14a2 2 0 012 2v4a2 2 0 01-2 2M5 12a2 2 0 00-2 2v4a2 2 0 002 2h14a2 2 0 002-2v-4a2 2 0 00-2-2m-2-4h.01M17 16h.01",group:"Node Data"},{id:"bitcoin",label:"Bitcoin Node",description:"Block height, sync progress, mempool stats — no wallet keys",icon:"M12 8c-1.657 0-3 .895-3 2s1.343 2 3 2 3 .895 3 2-1.343 2-3 2m0-8c1.11 0 2.08.402 2.599 1M12 8V7m0 1v8m0 0v1m0-1c-1.11 0-2.08-.402-2.599-1M21 12a9 9 0 11-18 0 9 9 0 0118 0z",group:"Node Data"},{id:"media",label:"Media Libraries",description:"Local media libraries — film, music, podcast titles and metadata, no file paths",icon:"M7 4v16M17 4v16M3 8h4m10 0h4M3 12h18M3 16h4m10 0h4M4 20h16a1 1 0 001-1V5a1 1 0 00-1-1H4a1 1 0 00-1 1v14a1 1 0 001 1z",group:"Media & Files"},{id:"files",label:"File Names",description:"Folder and file names in Cloud — no file contents",icon:"M3 7v10a2 2 0 002 2h14a2 2 0 002-2V9a2 2 0 00-2-2h-6l-2-2H5a2 2 0 00-2 2z",group:"Media & Files"},{id:"notes",label:"Documents & Notes",description:"Document and note titles — no contents",icon:"M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z",group:"Media & Files"},{id:"search",label:"Web Search",description:"Web search via your private SearXNG instance",icon:"M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z",group:"AI & Search"},{id:"ai-local",label:"Local AI Models",description:"Local AI models via Ollama — model names and availability",icon:"M9.75 17L9 20l-1 1h8l-1-1-.75-3M3 13h18M5 17h14a2 2 0 002-2V5a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z",group:"AI & Search"},{id:"wallet",label:"Wallet Overview",description:"Balance, channel count — no private keys, seeds, or addresses",icon:"M17 9V7a2 2 0 00-2-2H5a2 2 0 00-2 2v6a2 2 0 002 2h2m2 4h10a2 2 0 002-2v-6a2 2 0 00-2-2H9a2 2 0 00-2 2v6a2 2 0 002 2zm7-5a2 2 0 11-4 0 2 2 0 014 0z",group:"Financial"}],f=b("aiPermissions",()=>{const a=S(t());function t(){try{const e=localStorage.getItem(n);if(e){const v=JSON.parse(e);return new Set(v.filter(p=>s.some(M=>M.id===p)))}}catch{}return new Set}function i(){localStorage.setItem(n,JSON.stringify([...a.value]))}function l(e){return a.value.has(e)}function r(e){a.value.has(e)?a.value.delete(e):a.value.add(e),a.value=new Set(a.value),i()}function c(){a.value=new Set(s.map(e=>e.id)),i()}function d(){a.value=new Set,i()}const h=o(()=>[...a.value]),m=o(()=>a.value.size===s.length),u=o(()=>a.value.size===0);return{enabled:a,isEnabled:l,toggle:r,enableAll:c,disableAll:d,enabledCategories:h,allEnabled:m,noneEnabled:u}});export{s as A,f as u}; diff --git a/neode-ui/dist/assets/api-CHkUAu4g.js b/neode-ui/dist/assets/api-CHkUAu4g.js new file mode 100644 index 0000000..ecaa224 --- /dev/null +++ b/neode-ui/dist/assets/api-CHkUAu4g.js @@ -0,0 +1 @@ +const n={Installing:"installing",Stopping:"stopping",Stopped:"stopped",Starting:"starting",Running:"running",Restarting:"restarting"},t={Stopped:"stopped",Running:"running"};export{n as P,t as S}; diff --git a/neode-ui/dist/assets/audio/README-welcome-speech.md b/neode-ui/dist/assets/audio/README-welcome-speech.md new file mode 100644 index 0000000..1b27016 --- /dev/null +++ b/neode-ui/dist/assets/audio/README-welcome-speech.md @@ -0,0 +1,23 @@ +# Welcome Noderunner Speech + +The intro plays a sci-fi female voice saying "Welcome Noderunner" as the text types in. + +## Generate the audio (ElevenLabs) + +1. Get a free API key at [elevenlabs.io](https://elevenlabs.io) (free tier: 10k chars/month) +2. Run: + ```bash + cd neode-ui + ELEVENLABS_API_KEY=your_key npm run generate-welcome-speech + ``` +3. Commit `welcome-noderunner.mp3` to the repo + +## Custom sci-fi voice + +Browse [ElevenLabs Voice Library](https://elevenlabs.io/voice-library) and search for "sci-fi", "AI", "robot", or "character". Copy the voice ID from the URL or voice settings, then: + +```bash +ELEVENLABS_API_KEY=your_key ELEVENLABS_VOICE_ID=voice_id npm run generate-welcome-speech +``` + +Recommended: "The Digital Oracle", "The Friendly AI Assistant", or similar character voices from the Synthetic/Character categories. diff --git a/neode-ui/dist/assets/audio/arrows.mp3 b/neode-ui/dist/assets/audio/arrows.mp3 new file mode 100644 index 0000000..d8c6ae7 Binary files /dev/null and b/neode-ui/dist/assets/audio/arrows.mp3 differ diff --git a/neode-ui/dist/assets/audio/cosmic-updrift.mp3 b/neode-ui/dist/assets/audio/cosmic-updrift.mp3 new file mode 100644 index 0000000..e8cbb0c Binary files /dev/null and b/neode-ui/dist/assets/audio/cosmic-updrift.mp3 differ diff --git a/neode-ui/dist/assets/audio/enter-to-exit.mp3 b/neode-ui/dist/assets/audio/enter-to-exit.mp3 new file mode 100644 index 0000000..afab1a4 Binary files /dev/null and b/neode-ui/dist/assets/audio/enter-to-exit.mp3 differ diff --git a/neode-ui/dist/assets/audio/enter.mp3 b/neode-ui/dist/assets/audio/enter.mp3 new file mode 100644 index 0000000..93240f7 Binary files /dev/null and b/neode-ui/dist/assets/audio/enter.mp3 differ diff --git a/neode-ui/dist/assets/audio/intro-typing.mp3 b/neode-ui/dist/assets/audio/intro-typing.mp3 new file mode 100644 index 0000000..f34a328 Binary files /dev/null and b/neode-ui/dist/assets/audio/intro-typing.mp3 differ diff --git a/neode-ui/dist/assets/audio/loop-start.mp3 b/neode-ui/dist/assets/audio/loop-start.mp3 new file mode 100644 index 0000000..88eb71d Binary files /dev/null and b/neode-ui/dist/assets/audio/loop-start.mp3 differ diff --git a/neode-ui/dist/assets/audio/pop.mp3 b/neode-ui/dist/assets/audio/pop.mp3 new file mode 100644 index 0000000..2f6f543 Binary files /dev/null and b/neode-ui/dist/assets/audio/pop.mp3 differ diff --git a/neode-ui/dist/assets/audio/typing.mp3 b/neode-ui/dist/assets/audio/typing.mp3 new file mode 100644 index 0000000..f34a328 Binary files /dev/null and b/neode-ui/dist/assets/audio/typing.mp3 differ diff --git a/neode-ui/dist/assets/audio/welcome-noderunner.mp3 b/neode-ui/dist/assets/audio/welcome-noderunner.mp3 new file mode 100644 index 0000000..bffaabe Binary files /dev/null and b/neode-ui/dist/assets/audio/welcome-noderunner.mp3 differ diff --git a/neode-ui/dist/assets/audio/winning-is-invisible.mp3 b/neode-ui/dist/assets/audio/winning-is-invisible.mp3 new file mode 100644 index 0000000..bd5fdf1 Binary files /dev/null and b/neode-ui/dist/assets/audio/winning-is-invisible.mp3 differ diff --git a/neode-ui/dist/assets/audio/woosh.mp3 b/neode-ui/dist/assets/audio/woosh.mp3 new file mode 100644 index 0000000..d17218e Binary files /dev/null and b/neode-ui/dist/assets/audio/woosh.mp3 differ diff --git a/neode-ui/dist/assets/browser-rpPU-9HU.js b/neode-ui/dist/assets/browser-rpPU-9HU.js new file mode 100644 index 0000000..264397f --- /dev/null +++ b/neode-ui/dist/assets/browser-rpPU-9HU.js @@ -0,0 +1,8 @@ +function re(r,o){for(var i=0;ie[t]})}}}return Object.freeze(Object.defineProperty(r,Symbol.toStringTag,{value:"Module"}))}function oe(r){return r&&r.__esModule&&Object.prototype.hasOwnProperty.call(r,"default")?r.default:r}var z={},Q,Bt;function ie(){return Bt||(Bt=1,Q=function(){return typeof Promise=="function"&&Promise.prototype&&Promise.prototype.then}),Q}var W={},_={},At;function U(){if(At)return _;At=1;let r;const o=[0,26,44,70,100,134,172,196,242,292,346,404,466,532,581,655,733,815,901,991,1085,1156,1258,1364,1474,1588,1706,1828,1921,2051,2185,2323,2465,2611,2761,2876,3034,3196,3362,3532,3706];return _.getSymbolSize=function(e){if(!e)throw new Error('"version" cannot be null or undefined');if(e<1||e>40)throw new Error('"version" should be in range from 1 to 40');return e*4+17},_.getSymbolTotalCodewords=function(e){return o[e]},_.getBCHDigit=function(i){let e=0;for(;i!==0;)e++,i>>>=1;return e},_.setToSJISFunction=function(e){if(typeof e!="function")throw new Error('"toSJISFunc" is not a valid function.');r=e},_.isKanjiModeEnabled=function(){return typeof r<"u"},_.toSJIS=function(e){return r(e)},_}var Z={},Rt;function yt(){return Rt||(Rt=1,(function(r){r.L={bit:1},r.M={bit:0},r.Q={bit:3},r.H={bit:2};function o(i){if(typeof i!="string")throw new Error("Param is not a string");switch(i.toLowerCase()){case"l":case"low":return r.L;case"m":case"medium":return r.M;case"q":case"quartile":return r.Q;case"h":case"high":return r.H;default:throw new Error("Unknown EC Level: "+i)}}r.isValid=function(e){return e&&typeof e.bit<"u"&&e.bit>=0&&e.bit<4},r.from=function(e,t){if(r.isValid(e))return e;try{return o(e)}catch{return t}}})(Z)),Z}var X,Tt;function ue(){if(Tt)return X;Tt=1;function r(){this.buffer=[],this.length=0}return r.prototype={get:function(o){const i=Math.floor(o/8);return(this.buffer[i]>>>7-o%8&1)===1},put:function(o,i){for(let e=0;e>>i-e-1&1)===1)},getLengthInBits:function(){return this.length},putBit:function(o){const i=Math.floor(this.length/8);this.buffer.length<=i&&this.buffer.push(0),o&&(this.buffer[i]|=128>>>this.length%8),this.length++}},X=r,X}var x,Pt;function se(){if(Pt)return x;Pt=1;function r(o){if(!o||o<1)throw new Error("BitMatrix size must be defined and greater than 0");this.size=o,this.data=new Uint8Array(o*o),this.reservedBit=new Uint8Array(o*o)}return r.prototype.set=function(o,i,e,t){const n=o*this.size+i;this.data[n]=e,t&&(this.reservedBit[n]=!0)},r.prototype.get=function(o,i){return this.data[o*this.size+i]},r.prototype.xor=function(o,i,e){this.data[o*this.size+i]^=e},r.prototype.isReserved=function(o,i){return this.reservedBit[o*this.size+i]},x=r,x}var $={},It;function ae(){return It||(It=1,(function(r){const o=U().getSymbolSize;r.getRowColCoords=function(e){if(e===1)return[];const t=Math.floor(e/7)+2,n=o(e),u=n===145?26:Math.ceil((n-13)/(2*t-2))*2,a=[n-7];for(let s=1;s=0&&t<=7},r.from=function(t){return r.isValid(t)?parseInt(t,10):void 0},r.getPenaltyN1=function(t){const n=t.size;let u=0,a=0,s=0,c=null,d=null;for(let p=0;p=5&&(u+=o.N1+(a-5)),c=f,a=1),f=t.get(h,p),f===d?s++:(s>=5&&(u+=o.N1+(s-5)),d=f,s=1)}a>=5&&(u+=o.N1+(a-5)),s>=5&&(u+=o.N1+(s-5))}return u},r.getPenaltyN2=function(t){const n=t.size;let u=0;for(let a=0;a=10&&(a===1488||a===93)&&u++,s=s<<1&2047|t.get(d,c),d>=10&&(s===1488||s===93)&&u++}return u*o.N3},r.getPenaltyN4=function(t){let n=0;const u=t.data.length;for(let s=0;s=0;){const u=n[0];for(let s=0;s0){const a=new Uint8Array(this.degree);return a.set(n,u),a}return n},rt=o,rt}var ot={},it={},ut={},qt;function Zt(){return qt||(qt=1,ut.isValid=function(o){return!isNaN(o)&&o>=1&&o<=40}),ut}var L={},vt;function Xt(){if(vt)return L;vt=1;const r="[0-9]+",o="[A-Z $%*+\\-./:]+";let i="(?:[u3000-u303F]|[u3040-u309F]|[u30A0-u30FF]|[uFF00-uFFEF]|[u4E00-u9FAF]|[u2605-u2606]|[u2190-u2195]|u203B|[u2010u2015u2018u2019u2025u2026u201Cu201Du2225u2260]|[u0391-u0451]|[u00A7u00A8u00B1u00B4u00D7u00F7])+";i=i.replace(/u/g,"\\u");const e="(?:(?![A-Z0-9 $%*+\\-./:]|"+i+`)(?:.|[\r +]))+`;L.KANJI=new RegExp(i,"g"),L.BYTE_KANJI=new RegExp("[^A-Z0-9 $%*+\\-./:]+","g"),L.BYTE=new RegExp(e,"g"),L.NUMERIC=new RegExp(r,"g"),L.ALPHANUMERIC=new RegExp(o,"g");const t=new RegExp("^"+i+"$"),n=new RegExp("^"+r+"$"),u=new RegExp("^[A-Z0-9 $%*+\\-./:]+$");return L.testKanji=function(s){return t.test(s)},L.testNumeric=function(s){return n.test(s)},L.testAlphanumeric=function(s){return u.test(s)},L}var _t;function F(){return _t||(_t=1,(function(r){const o=Zt(),i=Xt();r.NUMERIC={id:"Numeric",bit:1,ccBits:[10,12,14]},r.ALPHANUMERIC={id:"Alphanumeric",bit:2,ccBits:[9,11,13]},r.BYTE={id:"Byte",bit:4,ccBits:[8,16,16]},r.KANJI={id:"Kanji",bit:8,ccBits:[8,10,12]},r.MIXED={bit:-1},r.getCharCountIndicator=function(n,u){if(!n.ccBits)throw new Error("Invalid mode: "+n);if(!o.isValid(u))throw new Error("Invalid version: "+u);return u>=1&&u<10?n.ccBits[0]:u<27?n.ccBits[1]:n.ccBits[2]},r.getBestModeForData=function(n){return i.testNumeric(n)?r.NUMERIC:i.testAlphanumeric(n)?r.ALPHANUMERIC:i.testKanji(n)?r.KANJI:r.BYTE},r.toString=function(n){if(n&&n.id)return n.id;throw new Error("Invalid mode")},r.isValid=function(n){return n&&n.bit&&n.ccBits};function e(t){if(typeof t!="string")throw new Error("Param is not a string");switch(t.toLowerCase()){case"numeric":return r.NUMERIC;case"alphanumeric":return r.ALPHANUMERIC;case"kanji":return r.KANJI;case"byte":return r.BYTE;default:throw new Error("Unknown mode: "+t)}}r.from=function(n,u){if(r.isValid(n))return n;try{return e(n)}catch{return u}}})(it)),it}var Ut;function he(){return Ut||(Ut=1,(function(r){const o=U(),i=Wt(),e=yt(),t=F(),n=Zt(),u=7973,a=o.getBCHDigit(u);function s(h,f,I){for(let N=1;N<=40;N++)if(f<=r.getCapacity(N,I,h))return N}function c(h,f){return t.getCharCountIndicator(h,f)+4}function d(h,f){let I=0;return h.forEach(function(N){const b=c(N.mode,f);I+=b+N.getBitsLength()}),I}function p(h,f){for(let I=1;I<=40;I++)if(d(h,I)<=r.getCapacity(I,f,t.MIXED))return I}r.from=function(f,I){return n.isValid(f)?parseInt(f,10):I},r.getCapacity=function(f,I,N){if(!n.isValid(f))throw new Error("Invalid QR Code version");typeof N>"u"&&(N=t.BYTE);const b=o.getSymbolTotalCodewords(f),R=i.getTotalCodewordsCount(f,I),M=(b-R)*8;if(N===t.MIXED)return M;const T=M-c(N,f);switch(N){case t.NUMERIC:return Math.floor(T/10*3);case t.ALPHANUMERIC:return Math.floor(T/11*2);case t.KANJI:return Math.floor(T/13);case t.BYTE:default:return Math.floor(T/8)}},r.getBestVersionForData=function(f,I){let N;const b=e.from(I,e.M);if(Array.isArray(f)){if(f.length>1)return p(f,b);if(f.length===0)return 1;N=f[0]}else N=f;return s(N.mode,N.getLength(),b)},r.getEncodedBits=function(f){if(!n.isValid(f)||f<7)throw new Error("Invalid QR Code version");let I=f<<12;for(;o.getBCHDigit(I)-a>=0;)I^=u<=0;)s^=o<0&&(n=this.data.substr(t),u=parseInt(n,10),e.put(u,a*3+1))},ct=o,ct}var ft,zt;function ye(){if(zt)return ft;zt=1;const r=F(),o=["0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"," ","$","%","*","+","-",".","/",":"];function i(e){this.mode=r.ALPHANUMERIC,this.data=e}return i.getBitsLength=function(t){return 11*Math.floor(t/2)+6*(t%2)},i.prototype.getLength=function(){return this.data.length},i.prototype.getBitsLength=function(){return i.getBitsLength(this.data.length)},i.prototype.write=function(t){let n;for(n=0;n+2<=this.data.length;n+=2){let u=o.indexOf(this.data[n])*45;u+=o.indexOf(this.data[n+1]),t.put(u,11)}this.data.length%2&&t.put(o.indexOf(this.data[n]),6)},ft=i,ft}var lt,Vt;function Ce(){if(Vt)return lt;Vt=1;const r=F();function o(i){this.mode=r.BYTE,typeof i=="string"?this.data=new TextEncoder().encode(i):this.data=new Uint8Array(i)}return o.getBitsLength=function(e){return e*8},o.prototype.getLength=function(){return this.data.length},o.prototype.getBitsLength=function(){return o.getBitsLength(this.data.length)},o.prototype.write=function(i){for(let e=0,t=this.data.length;e=33088&&n<=40956)n-=33088;else if(n>=57408&&n<=60351)n-=49472;else throw new Error("Invalid SJIS character: "+this.data[t]+` +Make sure your charset is UTF-8`);n=(n>>>8&255)*192+(n&255),e.put(n,13)}},dt=i,dt}var gt={exports:{}},Ht;function pe(){return Ht||(Ht=1,(function(r){var o={single_source_shortest_paths:function(i,e,t){var n={},u={};u[e]=0;var a=o.PriorityQueue.make();a.push(e,0);for(var s,c,d,p,h,f,I,N,b;!a.empty();){s=a.pop(),c=s.value,p=s.cost,h=i[c]||{};for(d in h)h.hasOwnProperty(d)&&(f=h[d],I=p+f,N=u[d],b=typeof u[d]>"u",(b||N>I)&&(u[d]=I,a.push(d,I),n[d]=c))}if(typeof t<"u"&&typeof u[t]>"u"){var R=["Could not find a path from ",e," to ",t,"."].join("");throw new Error(R)}return n},extract_shortest_path_from_predecessor_list:function(i,e){for(var t=[],n=e;n;)t.push(n),i[n],n=i[n];return t.reverse(),t},find_path:function(i,e,t){var n=o.single_source_shortest_paths(i,e,t);return o.extract_shortest_path_from_predecessor_list(n,t)},PriorityQueue:{make:function(i){var e=o.PriorityQueue,t={},n;i=i||{};for(n in e)e.hasOwnProperty(n)&&(t[n]=e[n]);return t.queue=[],t.sorter=i.sorter||e.default_sorter,t},default_sorter:function(i,e){return i.cost-e.cost},push:function(i,e){var t={value:i,cost:e};this.queue.push(t),this.queue.sort(this.sorter)},pop:function(){return this.queue.shift()},empty:function(){return this.queue.length===0}}};r.exports=o})(gt)),gt.exports}var Ot;function Be(){return Ot||(Ot=1,(function(r){const o=F(),i=we(),e=ye(),t=Ce(),n=Ee(),u=Xt(),a=U(),s=pe();function c(R){return unescape(encodeURIComponent(R)).length}function d(R,M,T){const B=[];let S;for(;(S=R.exec(T))!==null;)B.push({data:S[0],index:S.index,mode:M,length:S[0].length});return B}function p(R){const M=d(u.NUMERIC,o.NUMERIC,R),T=d(u.ALPHANUMERIC,o.ALPHANUMERIC,R);let B,S;return a.isKanjiModeEnabled()?(B=d(u.BYTE,o.BYTE,R),S=d(u.KANJI,o.KANJI,R)):(B=d(u.BYTE_KANJI,o.BYTE,R),S=[]),M.concat(T,B,S).sort(function(C,y){return C.index-y.index}).map(function(C){return{data:C.data,mode:C.mode,length:C.length}})}function h(R,M){switch(M){case o.NUMERIC:return i.getBitsLength(R);case o.ALPHANUMERIC:return e.getBitsLength(R);case o.KANJI:return n.getBitsLength(R);case o.BYTE:return t.getBitsLength(R)}}function f(R){return R.reduce(function(M,T){const B=M.length-1>=0?M[M.length-1]:null;return B&&B.mode===T.mode?(M[M.length-1].data+=T.data,M):(M.push(T),M)},[])}function I(R){const M=[];for(let T=0;T=0&&w<=6&&(P===0||P===6)||P>=0&&P<=6&&(w===0||w===6)||w>=2&&w<=4&&P>=2&&P<=4?g.set(m+w,E+P,!0,!0):g.set(m+w,E+P,!1,!0))}}function I(g){const C=g.size;for(let y=8;y>w&1)===1,g.set(A,m,E,!0),g.set(m,A,E,!0)}function R(g,C,y){const l=g.size,A=d.getEncodedBits(C,y);let m,E;for(m=0;m<15;m++)E=(A>>m&1)===1,m<6?g.set(m,8,E,!0):m<8?g.set(m+1,8,E,!0):g.set(l-15+m,8,E,!0),m<8?g.set(8,l-m-1,E,!0):m<9?g.set(8,15-m-1+1,E,!0):g.set(8,15-m-1,E,!0);g.set(l-8,8,1,!0)}function M(g,C){const y=g.size;let l=-1,A=y-1,m=7,E=0;for(let w=y-1;w>0;w-=2)for(w===6&&w--;;){for(let P=0;P<2;P++)if(!g.isReserved(A,w-P)){let v=!1;E>>m&1)===1),g.set(A,w-P,v),m--,m===-1&&(E++,m=7)}if(A+=l,A<0||y<=A){A-=l,l=-l;break}}}function T(g,C,y){const l=new i;y.forEach(function(P){l.put(P.mode.bit,4),l.put(P.getLength(),p.getCharCountIndicator(P.mode,g)),P.write(l)});const A=r.getSymbolTotalCodewords(g),m=a.getTotalCodewordsCount(g,C),E=(A-m)*8;for(l.getLengthInBits()+4<=E&&l.put(0,4);l.getLengthInBits()%8!==0;)l.putBit(0);const w=(E-l.getLengthInBits())/8;for(let P=0;P=7&&b(P,C),M(P,E),isNaN(l)&&(l=u.getBestMask(P,R.bind(null,P,y))),u.applyMask(l,P),R(P,y,l),{modules:P,version:C,errorCorrectionLevel:y,maskPattern:l,segments:A}}return W.create=function(C,y){if(typeof C>"u"||C==="")throw new Error("No input text");let l=o.M,A,m;return typeof y<"u"&&(l=o.from(y.errorCorrectionLevel,o.M),A=c.from(y.version),m=u.from(y.maskPattern),y.toSJISFunc&&r.setToSJISFunction(y.toSJISFunc)),S(C,A,l,m)},W}var ht={},mt={},Jt;function xt(){return Jt||(Jt=1,(function(r){function o(i){if(typeof i=="number"&&(i=i.toString()),typeof i!="string")throw new Error("Color should be defined as hex string");let e=i.slice().replace("#","").split("");if(e.length<3||e.length===5||e.length>8)throw new Error("Invalid hex color: "+i);(e.length===3||e.length===4)&&(e=Array.prototype.concat.apply([],e.map(function(n){return[n,n]}))),e.length===6&&e.push("F","F");const t=parseInt(e.join(""),16);return{r:t>>24&255,g:t>>16&255,b:t>>8&255,a:t&255,hex:"#"+e.slice(0,6).join("")}}r.getOptions=function(e){e||(e={}),e.color||(e.color={});const t=typeof e.margin>"u"||e.margin===null||e.margin<0?4:e.margin,n=e.width&&e.width>=21?e.width:void 0,u=e.scale||4;return{width:n,scale:n?4:u,margin:t,color:{dark:o(e.color.dark||"#000000ff"),light:o(e.color.light||"#ffffffff")},type:e.type,rendererOpts:e.rendererOpts||{}}},r.getScale=function(e,t){return t.width&&t.width>=e+t.margin*2?t.width/(e+t.margin*2):t.scale},r.getImageWidth=function(e,t){const n=r.getScale(e,t);return Math.floor((e+t.margin*2)*n)},r.qrToImageData=function(e,t,n){const u=t.modules.size,a=t.modules.data,s=r.getScale(u,n),c=Math.floor((u+n.margin*2)*s),d=n.margin*s,p=[n.color.light,n.color.dark];for(let h=0;h=d&&f>=d&&h"u"&&(!u||!u.getContext)&&(s=u,u=void 0),u||(c=e()),s=o.getOptions(s);const d=o.getImageWidth(n.modules.size,s),p=c.getContext("2d"),h=p.createImageData(d,d);return o.qrToImageData(h.data,n,s),i(p,c,d),p.putImageData(h,0,0),c},r.renderToDataURL=function(n,u,a){let s=a;typeof s>"u"&&(!u||!u.getContext)&&(s=u,u=void 0),s||(s={});const c=r.render(n,u,s),d=s.type||"image/png",p=s.rendererOpts||{};return c.toDataURL(d,p.quality)}})(ht)),ht}var wt={},Gt;function Te(){if(Gt)return wt;Gt=1;const r=xt();function o(t,n){const u=t.a/255,a=n+'="'+t.hex+'"';return u<1?a+" "+n+'-opacity="'+u.toFixed(2).slice(1)+'"':a}function i(t,n,u){let a=t+n;return typeof u<"u"&&(a+=" "+u),a}function e(t,n,u){let a="",s=0,c=!1,d=0;for(let p=0;p0&&h>0&&t[p-1]||(a+=c?i("M",h+u,.5+f+u):i("m",s,0),s=0,c=!1),h+1':"",f="',I='viewBox="0 0 '+p+" "+p+'"',b=''+h+f+` +`;return typeof a=="function"&&a(null,b),b},wt}var Qt;function Pe(){if(Qt)return z;Qt=1;const r=ie(),o=Ae(),i=Re(),e=Te();function t(n,u,a,s,c){const d=[].slice.call(arguments,1),p=d.length,h=typeof d[p-1]=="function";if(!h&&!r())throw new Error("Callback required as last argument");if(h){if(p<2)throw new Error("Too few arguments provided");p===2?(c=a,a=u,u=s=void 0):p===3&&(u.getContext&&typeof c>"u"?(c=s,s=void 0):(c=s,s=a,a=u,u=void 0))}else{if(p<1)throw new Error("Too few arguments provided");return p===1?(a=u,u=s=void 0):p===2&&!u.getContext&&(s=a,a=u,u=void 0),new Promise(function(f,I){try{const N=o.create(a,s);f(n(N,u,s))}catch(N){I(N)}})}try{const f=o.create(a,s);c(null,n(f,u,s))}catch(f){c(f)}}return z.create=o.create,z.toCanvas=t.bind(null,i.render),z.toDataURL=t.bind(null,i.renderToDataURL),z.toString=t.bind(null,function(n,u,a){return e.render(n,a)}),z}var $t=Pe();const Ie=oe($t),Ne=re({__proto__:null,default:Ie},[$t]);export{Ne as b}; diff --git a/neode-ui/dist/assets/es-BeSu-8Qq.js b/neode-ui/dist/assets/es-BeSu-8Qq.js new file mode 100644 index 0000000..81eec24 --- /dev/null +++ b/neode-ui/dist/assets/es-BeSu-8Qq.js @@ -0,0 +1 @@ +const e={cancel:"Cancelar",save:"Guardar",close:"Cerrar",copy:"Copiar",copied:"Copiado",copiedBang:"¡Copiado!",loading:"Cargando...",retry:"Reintentar",refresh:"Actualizar",install:"Instalar",installing:"Instalando...",uninstall:"Desinstalar",uninstalling:"Desinstalando...",start:"Iniciar",stop:"Detener",restart:"Reiniciar",launch:"Abrir",starting:"Iniciando...",stopping:"Deteniendo...",send:"Enviar",sending:"Enviando...",back:"Volver",done:"Listo",manage:"Administrar",connect:"Conectar",connecting:"Conectando...",disconnect:"Desconectar",running:"en ejecución",stopped:"detenido",exited:"finalizado",healthy:"Saludable",elevated:"Elevado",critical:"Crítico",connected:"Conectado",disconnected:"Desconectado",active:"Activo",inactive:"Inactivo",synced:"Sincronizado",enabled:"Habilitado",disabled:"Deshabilitado",dismiss:"Descartar",apply:"Aplicar",configure:"Configurar",export:"Exportar",delete:"Eliminar",remove:"Quitar",error:"Error",version:"Versión",status:"Estado",category:"Categoría",developer:"Desarrollador",license:"Licencia",never:"Nunca",notAvailable:"No disponible",goBack:"Regresar",skipToContent:"Ir al contenido principal",continue:"Continuar",verify:"Verificar",create:"Crear",restore:"Restaurar",disabling:"Deshabilitando...",creating:"Creando...",restoring:"Restaurando...",manageUpdates:"Administrar actualizaciones",enableAll:"Habilitar todo",networkDiagnostics:"Diagnósticos de red",network:"Red",saveConfiguration:"Guardar configuración",sendTest:"Enviar prueba"},a={title:"Bienvenido a Archipelago",setupTitle:"Configure su nodo",twoFactorTitle:"Autenticación de dos factores",password:"Contraseña",confirmPassword:"Confirmar contraseña",enterPasswordPlaceholder:"Ingrese su contraseña",enterPasswordSetup:"Ingrese una contraseña (mín. 8 caracteres)",confirmPasswordPlaceholder:"Confirme su contraseña",setupButton:"Configurar nodo",settingUp:"Configurando...",loginButton:"Iniciar sesión",loggingIn:"Iniciando sesión...",verifyButton:"Verificar",verifying:"Verificando...",useAuthCode:"Usar código de autenticador",useBackupCode:"Usar un código de respaldo",totpInstruction:"Ingrese el código de 6 dígitos de su aplicación de autenticación",totpPlaceholder:"000000",backupCodePlaceholder:"XXXX-XXXX",serverStarting:"El servidor está iniciando...",replayIntro:"Repetir introducción",onboarding:"Configuración inicial",resetting:"Restableciendo...",recoveryNote:"La recuperación de contraseña requiere acceso SSH al servidor.",errorMinLength:"La contraseña debe tener al menos 8 caracteres",errorMismatch:"Las contraseñas no coinciden",errorServerStarting:"El servidor está iniciando. Intente de nuevo en un momento.",errorSetupFailed:"La configuración falló. Intente de nuevo.",errorLoginFailed:"Inicio de sesión fallido. Verifique su contraseña.",errorInvalidCode:"Código inválido. Intente de nuevo.",totpLabel:"Código de autenticación de dos factores"},o={title:"Bienvenido Noderunner",subtitle:"Un resumen de su vida soberana",dashboardTab:"Panel",setupTab:"Configuración",myApps:"Mis aplicaciones",myAppsDesc:"Administre sus aplicaciones instaladas",cloud:"Nube",cloudDesc:"Servicios en la nube y almacenamiento",network:"Red",networkDesc:"Infraestructura de red y servicios Web3",web5:"Web5",web5Desc:"Identidad descentralizada y protocolos de datos",system:"Sistema",quickStartGoals:"Objetivos de inicio rápido",quickStartDesc:"¿No sabe por dónde empezar? Pruebe la configuración guiada.",installed:"Instaladas",runningLabel:"En ejecución",storageUsed:"Almacenamiento usado",folders:"Carpetas",servicesStatus:"Estado de servicios",connectivity:"Conectividad",runningApps:"Aplicaciones activas",didStatus:"Estado de DID",dwnSync:"Sincronización DWN",credentials:"Credenciales",cpu:"CPU",ram:"RAM",disk:"Disco",browseStore:"Explorar tienda",manageApps:"Administrar aplicaciones",viewFolders:"Ver carpetas",uploadFiles:"Subir archivos",manageNetwork:"Administrar red",manageWeb5:"Administrar Web5",openAI:"Abrir asistente de IA",noApps:"Sin aplicaciones",allRunning:"Todas activas",systemMonitoring:"Monitoreo del sistema",updateAvailable:"Actualización disponible: v{version}",updateNow:"Actualizar ahora",goToApps:"Ir a aplicaciones",goToCloud:"Ir a la nube",goToNetwork:"Ir a la red",goToWeb5:"Ir a Web5",goToSettings:"Ir a configuración"},i={title:"Mis aplicaciones",subtitle:"Administre sus aplicaciones instaladas",searchPlaceholder:"Buscar aplicaciones instaladas...",noAppsTitle:"No hay aplicaciones instaladas",noAppsMessage:"Comience explorando la tienda de aplicaciones",browseAppStore:"Explorar tienda de aplicaciones",noResults:'No se encontraron aplicaciones para "{query}"',uninstallTitle:"¿Desinstalar aplicación?",uninstallConfirm:"¿Está seguro de que desea desinstalar {name}? Esto eliminará la aplicación y detendrá su contenedor.",dismissError:"Descartar error",searchLabel:"Buscar aplicaciones instaladas"},n={title:"Configuración",subtitle:"Configure su experiencia en Archipelago",account:"Cuenta",interfaceMode:"Modo de interfaz",claudeAuth:"Autenticación de Claude",aiDataAccess:"Acceso a datos de IA",serverName:"Nombre del servidor",sessionStatus:"Estado de la sesión",yourDid:"Su DID",onionAddress:"Dirección .onion del nodo",loggedIn:"Sesión iniciada actualmente",didHelper:"Identificador descentralizado para autenticación sin contraseña",onionHelper:"Dirección onion para la interfaz del nodo y descubrimiento de pares a través de Tor",changePassword:"Cambiar contraseña",enable2fa:"Habilitar 2FA",disable2fa:"Deshabilitar 2FA",logout:"Cerrar sesión",loggingOut:"Cerrando sesión...",twoFactorAuth:"Autenticación de dos factores",twoFaProtect:"Proteja su cuenta con una aplicación de autenticación",changePasswordTitle:"Cambiar contraseña",changePasswordDesc:"Actualiza tanto el inicio de sesión web como el acceso SSH. Use una contraseña segura (12+ caracteres, mayúsculas, minúsculas, dígitos, caracteres especiales).",currentPassword:"Contraseña actual",newPassword:"Nueva contraseña",confirmNewPassword:"Confirmar nueva contraseña",passwordPlaceholder:"12+ caracteres, mayúsculas, minúsculas, dígitos, especiales",updateSshCheckbox:"También actualizar contraseña SSH (recomendado)",updatePassword:"Actualizar contraseña",updatingPassword:"Actualizando...",setup2faTitle:"Autenticación de dos factores",setup2faPasswordPrompt:"Ingrese su contraseña para comenzar la configuración.",scanQrCode:"Escanear código QR",scanQrInstruction:"Escanee este código QR con su aplicación de autenticación (Google Authenticator, Authy, etc.), luego ingrese el código de 6 dígitos.",manualEntryKey:"Clave de ingreso manual:",verifyAndEnable:"Verificar y habilitar",saveBackupCodes:"Guarde sus códigos de respaldo",backupCodesInstruction:"Almacene estos códigos de forma segura. Cada uno puede usarse una vez si pierde acceso a su aplicación de autenticación.",copyAllCodes:"Copiar todos los códigos",disable2faTitle:"Deshabilitar autenticación de dos factores",disable2faDesc:"Ingrese su contraseña y un código TOTP actual para deshabilitar 2FA.",authenticatorCode:"Código de autenticador",webhooks:"Webhooks",webhooksDesc:"Reciba notificaciones cuando ocurran eventos importantes en su nodo",webhookUrl:"URL del webhook",webhookUrlPlaceholder:"https://ejemplo.com/webhook",webhookSecret:"Secreto (para firma HMAC)",webhookSecretPlaceholder:"Secreto compartido opcional",webhookEvents:"Eventos",containerCrash:"Fallo de contenedor",updateAvailableEvent:"Actualización disponible",diskWarning:"Advertencia de disco",backupComplete:"Respaldo completado",saveWebhook:"Guardar",savingWebhook:"Guardando...",testWebhook:"Probar",testingWebhook:"Probando...",webhookSaved:"Configuración de webhook guardada",webhookTestSent:"Webhook de prueba enviado exitosamente",systemUpdates:"Actualizaciones del sistema",backup:"Respaldo y restauración",backupDesc:"Respalde los datos de su nodo en almacenamiento externo",createBackup:"Crear respaldo",creatingBackup:"Creando...",restoreBackup:"Restaurar respaldo",deleteBackup:"Eliminar respaldo",backupCreated:"Respaldo creado exitosamente",sendMessage:"Enviar mensaje",sendMessageTitle:"Enviar mensaje de difusión",messagePlaceholder:"Escriba su mensaje...",messageSent:"Mensaje enviado",claudeConnected:"Conectado a Claude",claudeDisconnected:"No conectado",claudeApiKey:"Clave API",claudeApiKeyPlaceholder:"Ingrese su clave API de Anthropic",claudeSave:"Guardar clave",advancedMode:"Modo avanzado",beginnerMode:"Modo principiante",advancedModeDesc:"Mostrar todos los controles del sistema y herramientas de desarrollo",beginnerModeDesc:"Interfaz simplificada con experiencia guiada",networkSettings:"Configuración de red",torEnabled:"Tor habilitado",torAddress:"Dirección Tor",interfaceModeDesc:"Elija cómo desea interactuar con su nodo.",claudeAuthDesc:"Conecte su cuenta de Claude Max para habilitar las funciones de chat con IA.",connectionStatus:"Estado de conexión",notConnected:"No conectado",reAuthenticate:"Reautenticar",loginWithClaude:"Iniciar sesión con Claude",aiDataAccessDesc:"Controle a qué datos puede acceder el asistente de IA. Todas las categorías están desactivadas por defecto.",enableAllDesc:"Otorgar acceso a todas las categorías de datos a la vez",systemUpdatesDesc:"Buscar e instalar actualizaciones de software",webhookNotifications:"Notificaciones por webhook",webhookNotificationsDesc:"Reciba notificaciones push para eventos críticos a través de webhook",enableWebhooks:"Habilitar webhooks",disableWebhooks:"Deshabilitar webhooks",webhookUrlLabel:"URL del webhook",webhookSecretLabel:"Secreto (opcional, para firma HMAC-SHA256)",eventsToNotify:"Eventos a notificar",containerCrashDesc:"Un contenedor en ejecución se detiene inesperadamente",updateAvailableDesc:"Una nueva actualización del sistema o aplicación está lista",diskWarningDesc:"El uso de disco supera el umbral de advertencia",backupCompleteDesc:"Un respaldo programado o manual ha finalizado",backupRestoreDesc:"Respaldos cifrados de su identidad, configuración y datos",loadingBackups:"Cargando respaldos...",noBackups:"Aún no hay respaldos. Cree uno para proteger los datos de su nodo.",systemBackup:"Respaldo del sistema",createEncryptedBackup:"Crear respaldo cifrado",encryptionPassphrase:"Frase de cifrado",enterPassphrase:"Ingrese una frase segura",descriptionOptional:"Descripción (opcional)",descriptionPlaceholder:"Ej. Antes de actualizar",restoreBackupTitle:"Restaurar respaldo",restoreWarning:"Esto sobrescribirá los datos actuales del nodo. Asegúrese de tener la frase de cifrado correcta.",enterBackupPassphrase:"Ingrese la frase de cifrado del respaldo",networkDesc:"Conectividad de red, UPnP y diagnósticos",webhookSecretPlaceholderFull:"Secreto compartido para firma de carga útil",backupCreatedSuccess:"Respaldo creado exitosamente",backupCreateFailed:"Error al crear el respaldo",backupVerifiedOk:"Respaldo verificado — integridad correcta",backupVerifyFailed:"La verificación falló: {error}",backupVerifyRequestFailed:"La solicitud de verificación falló",backupRestored:"Respaldo restaurado. Puede ser necesario reiniciar.",backupRestoreFailed:"La restauración falló — verifique la frase de cifrado",backupDeleted:"Respaldo eliminado",backupDeleteFailed:"Error al eliminar el respaldo",noUsbDrives:"No se encontraron unidades USB montadas. Inserte y monte una unidad USB primero.",backupCopiedToUsb:"Respaldo copiado a {path}",backupUsbFailed:"Error al copiar el respaldo a USB",deleteBackupConfirm:"¿Eliminar este respaldo permanentemente?",verifyPassphrasePrompt:"Ingrese la frase de cifrado del respaldo para verificar:",webhookSaveFailed:"Error al guardar la configuración del webhook",webhookTestFailed:"La prueba falló: el webhook no se envió",webhookSendFailed:"Error al enviar el webhook de prueba",passwordAllFieldsRequired:"Todos los campos son obligatorios",passwordMismatch:"Las nuevas contraseñas no coinciden",passwordUpdatedSuccess:"Contraseña actualizada exitosamente. Use la nueva contraseña para iniciar sesión y SSH.",passwordChangeFailed:"Error al cambiar la contraseña",passwordMinLength:"La contraseña debe tener al menos 12 caracteres",passwordNeedUppercase:"La contraseña debe contener al menos una letra mayúscula",passwordNeedLowercase:"La contraseña debe contener al menos una letra minúscula",passwordNeedDigit:"La contraseña debe contener al menos un dígito",passwordNeedSpecial:"La contraseña debe contener al menos un carácter especial (!@#$%^&* etc.)",setupFailed:"La configuración falló",verificationFailed:"La verificación falló",disableFailed:"Error al deshabilitar 2FA",copyToUsb:"Copiar a USB",diskSpaceWarning:"Advertencia de espacio en disco",modeEasy:"Fácil",modeEasyDesc:"Interfaz basada en objetivos. Elija lo que desea hacer y el sistema se encarga del resto.",modePro:"Pro",modeProDesc:"Control total sobre todos los servicios. Configure todo manualmente con todos los detalles técnicos.",modeChat:"AIUI",modeChatDesc:"Interfaz de IA conversacional. Administre su nodo mediante lenguaje natural. Próximamente."},r={title:"Tienda de aplicaciones",subtitle:"Descubra e instale aplicaciones para su nueva vida soberana",curatedTab:"Seleccionadas",communityTab:"Comunidad",nostrCommunityTab:"Comunidad Nostr",filterByCategory:"Filtrar por categoría",searchPlaceholder:"Buscar aplicaciones...",downloading:"Descargando...",alreadyInstalled:"Ya instalada",queryingRelays:"Consultando relays de Nostr en busca de aplicaciones...",noCommunityApps:"Aún no se han descubierto aplicaciones de la comunidad.",noResults:'No se encontraron aplicaciones en {category} que coincidan con "{query}"',noResultsCategory:"No se encontraron aplicaciones en {category}",noResultsSearch:'No se encontraron aplicaciones para "{query}"',all:"Todas",community:"Comunidad",commerce:"Comercio",money:"Dinero",data:"Datos",homeCategory:"Hogar",auto:"Automatización",networking:"Redes",other:"Otras",searchApps:"Buscar aplicaciones",percentComplete:"{percent}% completado"},s={mainNav:"Navegación principal",mobileNav:"Navegación móvil"},t={close:"Cerrar",aiuiConnected:"AIUI conectado",closeAssistant:"Cerrar asistente de IA",loadingAssistant:"Cargando asistente de IA...",aiAssistant:"Asistente de IA",notConfigured:"El asistente de IA necesita ser habilitado antes de usarse.",deployCta:"Vaya a Configuración para configurar su clave API del proveedor de IA, luego regrese aquí para comenzar a chatear."},c={title:"Web5",subtitle:"Identidad descentralizada y protocolos de datos",profitsHelper:"Obtenga ganancias de red al alojar servicios descentralizados",networkingProfits:"Ganancias de red",didStatus:"Estado de DID",walletConnection:"Conexión de billetera",wallet:"Billetera",walletSubtitle:"On-chain, Lightning y Ecash",nostrRelays:"Relays de Nostr",connectedNodes:"Nodos conectados",bitcoinDomains:"Nombres de dominio Bitcoin",domainsSubtitle:"Identidades verificadas NIP-05",copyDid:"Copiar",viewDidDocument:"Ver",createDid:"Crear DID",creatingDid:"Creando...",manageDomains:"Administrar dominios",relaysConnected:"{count} conectados",peersKnown:"{count} par(es) conocido(s)",findNodes:"Buscar nodos",sendMessage:"Enviar mensaje",sendMessageTitle:"Enviar mensaje (a través de Tor)",to:"Para",selectPeer:"Seleccione un par...",message:"Mensaje",messagePlaceholder:"Escriba su mensaje...",didDocument:"Documento DID",addContent:"Agregar contenido",addContentTitle:"Agregar contenido",createIdentity:"Crear identidad",createIdentityTitle:"Crear identidad",deleteIdentity:"Eliminar identidad",deleteIdentityTitle:"Eliminar identidad",sendBitcoin:"Enviar Bitcoin",sendBitcoinTitle:"Enviar Bitcoin",receiveBitcoin:"Recibir Bitcoin",receiveBitcoinTitle:"Recibir Bitcoin",domains:"Dominios",domainsTitle:"Dominios",relays:"Relays",relaysTitle:"Relays",totalEarned:"Total ganado",monthlyAvg:"Promedio mensual",ecashBalance:"Saldo Ecash",onChain:"On-chain",lightning:"Lightning",ecash:"Ecash",identityName:"Nombre de identidad",identityNamePlaceholder:"Ingrese el nombre de identidad",contentTitle:"Título",contentTitlePlaceholder:"Ingrese el título del contenido",amount:"Monto",amountPlaceholder:"Ingrese el monto en sats",address:"Dirección",addressPlaceholder:"Ingrese la dirección Bitcoin",deleteIdentityConfirm:"¿Está seguro de que desea eliminar esta identidad? Esta acción no se puede deshacer.",confirm:"Confirmar",noRelays:"No hay relays conectados",noDomains:"No hay dominios configurados",addRelay:"Agregar relay",addDomain:"Agregar dominio",relayUrl:"URL del relay",relayUrlPlaceholder:"wss://relay.ejemplo.com",domainName:"Nombre de dominio",domainNamePlaceholder:"usuario{'@'}ejemplo.com",peerNodesDescription:"Nodos pares descubiertos vía Nostr. Los mensajes se envían a través de Tor.",nodeVisibility:"Visibilidad del nodo",nodeVisibilityDesc:"Controle cómo otros nodos pueden descubrirle",yourTorAddress:"Su dirección Tor",discoverableWarning:"Hacer su nodo descubrible permite que otros usuarios de Archipelago le encuentren y se conecten con usted.",noPeers:"Aún no hay pares. Agregue un par manualmente o use Descubrir para encontrar nodos en Nostr.",noMessages:"Aún no hay mensajes. Los mensajes de pares aparecerán aquí.",noRequests:"No hay solicitudes de conexión pendientes.",accept:"Aceptar",reject:"Rechazar",discovering:"Descubriendo...",discoverNodes:"Descubrir nodos en Nostr",refreshMessages:"Actualizar mensajes",refreshRequests:"Actualizar solicitudes",torServices:"Servicios Tor",torServicesDesc:"Servicios ocultos que exponen sus aplicaciones a través de Tor",noTorServices:"No hay servicios ocultos Tor configurados.",content:"Contenido",contentDesc:"Comparta y explore contenido con pares a través de Tor",noSharedContent:"Sin contenido compartido",addFilesToShare:"Agregue archivos para compartir con pares conectados.",browse:"Explorar",connectingToPeer:"Conectando al par a través de Tor...",selectPeerToBrowse:"Seleccione un par para explorar",choosePeerDesc:"Elija un par conectado para ver su contenido compartido.",peerNoContent:"Este par no tiene contenido compartido.",identities:"Identidades",identitiesDesc:"Identidades digitales soberanas (DID:key)",noIdentities:"Aún no hay identidades",createFirstIdentity:"Cree su primera identidad digital soberana.",deleting:"Eliminando...",decentralizedWebNode:"Nodo web descentralizado",dwnDescription:"Almacén de datos personal con control de acceso basado en DID",manageDwn:"Administrar DWN",syncing:"Sincronizando...",syncNow:"Sincronizar ahora",verifiableCredentials:"Credenciales verificables",verifiableCredentialsDesc:"Emita y administre credenciales verificables W3C",noCredentials:"Aún no se han emitido credenciales",messageSent:"¡Mensaje enviado a través de Tor!",failedToSend:"Error al enviar",pasteInvoice:"Pegue una factura Lightning (BOLT11)",enterBitcoinAddress:"Ingrese una dirección Bitcoin",sendFailed:"Error al enviar",broadcastViaHwWallet:"Transmitir vía billetera de hardware",broadcastFailed:"Error en la transmisión",psbtCopied:"¡PSBT copiado!",enterAmount:"Ingrese un monto",pasteEcashToken:"Pegue un token Ecash",receiveFailed:"Error al recibir",ecashTokenCopied:"Token Ecash copiado",contentAdded:"Contenido agregado",failedToAddContent:"Error al agregar contenido",contentRemoved:"Contenido eliminado",failedToRemoveContent:"Error al eliminar contenido",failedToUpdatePricing:"Error al actualizar precios",failedToUpdatePrice:"Error al actualizar precio",failedToConnectPeer:"Error al conectar con el par",onionAddressCopied:"Dirección onion copiada",streamUrlCopied:"URL de transmisión copiada",playerError:"No se pudo cargar el contenido multimedia. Es posible que solo sea accesible a través de Tor.",connectionAccepted:"Conexión aceptada",failedToAcceptRequest:"Error al aceptar la solicitud",requestRejected:"Solicitud rechazada",failedToRejectRequest:"Error al rechazar la solicitud",visibilitySetTo:"Visibilidad establecida en {level}",failedToUpdateVisibility:"Error al actualizar la visibilidad",didCopied:"DID copiado al portapapeles",defaultIdentityUpdated:"Identidad predeterminada actualizada",failedToSetDefault:"Error al establecer como predeterminada",identityCreated:"Identidad creada",failedToCreateIdentity:"Error al crear identidad",identityDeleted:"Identidad eliminada",failedToDeleteIdentity:"Error al eliminar identidad",registrationFailed:"Error en el registro",removeFailed:"Error al eliminar",failedToAddRelay:"Error al agregar relay",failedToRemoveRelay:"Error al eliminar relay",failedToToggleRelay:"Error al cambiar estado del relay",downloadUrlCopied:"URL de descarga copiada",hardwareWalletDetected:"Billetera de hardware detectada",namesRegistered:"Nombres registrados",expiringSoon:"Próximos a vencer",nostrRelaysDesc:"Relays de redes sociales descentralizadas",relaysConnectedLabel:"Relays conectados",totalRelays:"Total de relays",freeAccessDesc:"Disponible para todos los pares de forma gratuita",peersOnlyAccessDesc:"Disponible solo para pares conectados",signWithHwWallet:"Firmar con billetera de hardware",createsPsbt:"Crea un PSBT para firma externa",generateFreshAddress:"Generar una nueva dirección Bitcoin",registerNewName:"Registrar nuevo nombre",verifyNip05:"Verificar NIP-05",peers:"Pares",messages:"Mensajes",requests:"Solicitudes",myContent:"Mi contenido",browsePeers:"Explorar pares",verified:"Verificado",invalid:"Inválido",stream:"Transmitir",download:"Descargar"},d={backToApps:"Volver a mis aplicaciones",backToStore:"Volver a la tienda",screenshots:"Capturas de pantalla",screenshotPlaceholder:"Capturas de pantalla de ejemplo — imágenes disponibles pronto",about:"Acerca de {name}",features:"Características",information:"Información",requirements:"Requisitos",ram:"RAM",ramDesc:"Mínimo 512MB",storage:"Almacenamiento",storageDesc:"~100MB",links:"Enlaces",website:"Sitio web",sourceCode:"Código fuente",documentation:"Documentación",services:"Servicios",guardian:"Guardián",gateway:"Gateway",access:"Acceso",lan:"LAN",tor:"Tor",requiresTor:"Requiere Tor Browser",channels:"Canales",uninstallTitle:"¿Desinstalar aplicación?",uninstallConfirm:"¿Está seguro de que desea desinstalar {name}? Esto eliminará la aplicación y detendrá su contenedor.",notFoundTitle:"Aplicación no encontrada",notFoundMessage:"No se pudo encontrar la aplicación solicitada",installed:"Instalada",noLaunchUrl:"Aún no hay URL de acceso disponible para esta aplicación"},l={back:"Volver",subtitle:"Detalles y administración del contenedor",containerInfo:"Información del contenedor",actions:"Acciones",logs:"Registros",containerId:"ID del contenedor",image:"Imagen",state:"Estado",created:"Creado",startContainer:"Iniciar contenedor",stopContainer:"Detener contenedor",loadingLogs:"Cargando registros...",noLogs:"No hay registros disponibles"},u={backToStore:"Volver a la tienda",screenshots:"Capturas de pantalla",screenshotPlaceholder:"Capturas de pantalla de ejemplo — imágenes disponibles pronto",about:"Acerca de {name}",features:"Características",information:"Información",requirements:"Requisitos",noRequirements:"No se requieren dependencias adicionales",installRequirements:"Instalar requisitos",links:"Enlaces",downloadPackage:"Descargar paquete",installed:"Instalada",notInstalled:"No instalada",open:"Abrir",loadingDetails:"Cargando detalles de la aplicación...",notFoundTitle:"Aplicación no encontrada",notFoundMessage:"No se pudo encontrar la aplicación solicitada en la tienda",installFailed:"La instalación falló",depRunning:"En ejecución",depStopped:"Instalada pero detenida",depNotInstalled:"No instalada"},p={backToGoals:"Volver a objetivos",notFound:"Objetivo no encontrado.",stepOf:"Paso {current} de {total}",notStarted:"No iniciado",inProgress:"En progreso",completed:"Completado",syncTitle:"La soberanía requiere un poco de paciencia",syncMessage:"Su nodo Bitcoin está sincronizando toda la cadena de bloques para que no tenga que confiar en nadie más. Esto toma 2–3 días en la primera ejecución. Mientras tanto, puede explorar su nodo, configurar su identidad o respaldar sus claves.",installApp:"Instalar {name}",openAndConfigure:"Abrir y configurar",iveDoneThis:"Ya lo hice",complete:"Completar",allSet:"¡Todo listo!",goalReady:"{title} está listo para usar.",viewMyServices:"Ver mis servicios"},m={title:"Monitoreo",subtitle:"Métricas del sistema en tiempo real y uso de recursos de contenedores",cpuUsage:"Uso de CPU (%)",memoryUsage:"Uso de memoria (%)",networkIo:"E/S de red (bytes)",rpcLatency:"Latencia RPC (ms)",alertHistory:"Historial de alertas",hideConfig:"Ocultar configuración",noAlerts:"No se han disparado alertas",containerResources:"Recursos de contenedores",noContainerMetrics:"No hay métricas de contenedores disponibles",systemHealth:"Salud del sistema",load:"Carga:",exportCsv:"Exportar CSV",exportJson:"Exportar JSON",diskUsage:"Uso de disco",ramUsage:"Uso de RAM",containerCrash:"Fallo de contenedor",rpcLatencySpike:"Pico de latencia RPC",sslCertExpiry:"Vencimiento de certificado SSL",refreshFooter:"Actualizando cada 5 segundos",wsConnections:"Conexiones WS: {count}",cpu:"CPU",memory:"Memoria",network:"Red"},g={title:"Actualización del sistema",subtitle:"Administre las actualizaciones de software de su nodo Archipelago",currentSystem:"Sistema actual",updateAvailable:"Actualización disponible",upToDate:"El sistema está actualizado",downloading:"Descargando actualización...",applying:"Aplicando actualización...",updateSchedule:"Programa de actualizaciones",actions:"Acciones",lastChecked:"Última verificación",new:"Nuevo",changelog:"Registro de cambios",componentsToUpdate:"{count} componente(s) para actualizar",manualOnly:"Solo manual",manualOnlyDesc:"Nunca verificar automáticamente. Usted controla cuándo buscar e instalar actualizaciones.",dailyCheck:"Verificación diaria",dailyCheckDesc:"Buscar actualizaciones una vez al día. Usted decide cuándo instalar.",autoApply:"Aplicación automática",autoApplyDesc:"Buscar diariamente y aplicar actualizaciones automáticamente a las 3 AM. Los servicios se reinician según sea necesario.",downloadUpdate:"Descargar actualización",applyUpdate:"Aplicar actualización",checkForUpdates:"Buscar actualizaciones",checking:"Verificando...",rollback:"Revertir a la versión anterior",backToSettings:"Volver a configuración",percentComplete:"{percent}% completado",applyWarning:"Instalando componentes y reiniciando servicios. No apague el equipo.",applyTitle:"¿Aplicar actualización?",applyMessage:"El servicio del backend se reiniciará. Esto puede tomar un momento.",rollbackTitle:"¿Revertir versión?",rollbackMessage:"Esto restaurará la versión anterior. El servicio del backend se reiniciará.",applyNow:"Aplicar ahora",rollbackButton:"Revertir",upToDateMessage:"Su sistema está actualizado. No hay actualizaciones disponibles. Su sistema está ejecutando la última versión.",checkFailed:"Error al buscar actualizaciones. Verifique su conexión a internet.",downloadSuccess:"Se descargaron {count} componente(s) ({size}MB)",downloadFailed:"La descarga falló. Intente de nuevo.",applySuccess:"Actualización aplicada. El servicio se reiniciará en un momento.",applyFailed:"Error al aplicar la actualización. Puede intentar de nuevo o revertir.",rollbackSuccess:"Se revirtió a la versión anterior. El servicio se reiniciará.",rollbackFailed:"Error al revertir."},b={pressEsc:"Presione ESC para salir",online:"En línea",offline:"Sin conexión",escHint:"Presione ESC para salir de las aplicaciones",navHint:"Use las teclas de flecha para navegar"},v={title:"Recuperación de Archipelago",subtitle:"Modo de recuperación del kiosco — no requiere autenticación",serverAddress:"Dirección del servidor",webUi:"Interfaz web: http://{address}",scanForMobile:"Escanee para acceso móvil",backend:"Backend",unreachable:"Inaccesible",containers:"Contenedores",goToLogin:"Ir a inicio de sesión",lastChecked:"Última verificación: {time}"},h={common:e,login:a,home:o,apps:i,settings:n,marketplace:r,dashboard:s,chat:t,web5:c,appDetails:d,containerDetails:l,marketplaceDetails:u,goalDetail:p,monitoring:m,systemUpdate:g,kiosk:b,kioskRecovery:v};export{d as appDetails,i as apps,t as chat,e as common,l as containerDetails,s as dashboard,h as default,p as goalDetail,o as home,b as kiosk,v as kioskRecovery,a as login,r as marketplace,u as marketplaceDetails,m as monitoring,n as settings,g as systemUpdate,c as web5}; diff --git a/neode-ui/dist/assets/filebrowser-client-DRXM9PC4.js b/neode-ui/dist/assets/filebrowser-client-DRXM9PC4.js new file mode 100644 index 0000000..3c6af6e --- /dev/null +++ b/neode-ui/dist/assets/filebrowser-client-DRXM9PC4.js @@ -0,0 +1 @@ +function n(h){const t=h.split("/").filter(Boolean),s=[];for(const e of t)e!=="."&&(e===".."?s.pop():s.push(e));return"/"+s.join("/")}class c{token=null;baseUrl;constructor(){this.baseUrl=`${window.location.origin}/app/filebrowser`}get isAuthenticated(){return this.token!==null}async login(t="admin",s="admin"){try{const e=await fetch(`${this.baseUrl}/api/login`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({username:t,password:s})});if(!e.ok)return!1;const o=await e.text();return this.token=o.replace(/^"|"$/g,""),document.cookie=`auth=${this.token}; path=/app/filebrowser; SameSite=Strict`,!0}catch{return!1}}headers(){const t={};return this.token&&(t["X-Auth"]=this.token),t}async listDirectory(t){const s=n(t),e=await fetch(`${this.baseUrl}/api/resources${s}`,{headers:this.headers()});if(!e.ok)throw new Error(`Failed to list directory: ${e.status}`);return((await e.json()).items||[]).map(a=>({...a,extension:a.name.includes(".")?a.name.split(".").pop().toLowerCase():""}))}downloadUrl(t){const s=n(t);return`${this.baseUrl}/api/raw${s}`}async fetchBlobUrl(t){const s=n(t),e=await fetch(`${this.baseUrl}/api/raw${s}`,{headers:this.headers()});if(!e.ok)throw new Error(`Failed to fetch file: ${e.status}`);const o=await e.blob();return URL.createObjectURL(o)}async downloadFile(t){const s=await this.fetchBlobUrl(t),e=t.split("/").pop()||"download",o=document.createElement("a");o.href=s,o.download=e,document.body.appendChild(o),o.click(),document.body.removeChild(o),URL.revokeObjectURL(s)}async upload(t,s){const e=n(t),o=e.endsWith("/")?e:`${e}/`,a=encodeURIComponent(s.name),i=await fetch(`${this.baseUrl}/api/resources${o}${a}?override=true`,{method:"POST",headers:this.headers(),body:s});if(!i.ok){const r=await i.text().catch(()=>"");throw new Error(`Upload failed (${i.status}): ${r}`)}}async createFolder(t,s){const e=n(t),o=e.endsWith("/")?e:`${e}/`,a=s.replace(/\.\./g,"").replace(/\//g,""),i=await fetch(`${this.baseUrl}/api/resources${o}${a}/`,{method:"POST",headers:this.headers()});if(!i.ok)throw new Error(`Create folder failed: ${i.status}`)}async deleteItem(t){const s=n(t),e=await fetch(`${this.baseUrl}/api/resources${s}`,{method:"DELETE",headers:this.headers()});if(!e.ok)throw new Error(`Delete failed: ${e.status}`)}async getUsage(){if(!this.isAuthenticated&&!await this.login())return{totalSize:0,folderCount:0,fileCount:0};const t=await fetch(`${this.baseUrl}/api/resources/`,{headers:this.headers()});if(!t.ok)return{totalSize:0,folderCount:0,fileCount:0};const e=(await t.json()).items||[],o=e.filter(r=>r.isDir).length,a=e.filter(r=>!r.isDir).length;return{totalSize:e.reduce((r,l)=>r+(l.size||0),0),folderCount:o,fileCount:a}}static TEXT_EXTENSIONS=new Set(["txt","md","json","csv","log","conf","yaml","yml","toml","xml","html","css","js","ts","py","sh","bash","env","ini","cfg","sql","rs","go","java","c","h","cpp","hpp","rb","php","dockerfile","makefile","gitignore","editorconfig"]);isTextFile(t){const s=t.includes(".")?t.split(".").pop().toLowerCase():"",e=t.split("/").pop()?.toLowerCase()||"";return c.TEXT_EXTENSIONS.has(s)||c.TEXT_EXTENSIONS.has(e)}async readFileAsText(t,s=102400){if(!this.isAuthenticated&&!await this.login())throw new Error("FileBrowser authentication failed");if(!this.isTextFile(t))throw new Error(`Cannot read binary file: ${t}`);const e=n(t),o=await fetch(`${this.baseUrl}/api/raw${e}`,{headers:this.headers()});if(!o.ok)throw new Error(`Failed to read file: ${o.status}`);const a=await o.blob(),i=a.size,r=i>s;return{content:await(r?a.slice(0,s):a).text(),truncated:r,size:i}}async rename(t,s){const e=n(t),o=e.substring(0,e.lastIndexOf("/")+1),a=s.replace(/\.\./g,"").replace(/\//g,""),i=await fetch(`${this.baseUrl}/api/resources${e}`,{method:"PATCH",headers:{...this.headers(),"Content-Type":"application/json"},body:JSON.stringify({destination:`${o}${a}`})});if(!i.ok)throw new Error(`Rename failed: ${i.status}`)}}const u=new c;export{u as f}; diff --git a/neode-ui/dist/assets/fonts/Benton_Sans/BentonSans-Regular.otf b/neode-ui/dist/assets/fonts/Benton_Sans/BentonSans-Regular.otf new file mode 100644 index 0000000..68c3394 Binary files /dev/null and b/neode-ui/dist/assets/fonts/Benton_Sans/BentonSans-Regular.otf differ diff --git a/neode-ui/dist/assets/fonts/Courier_New/CourierNew-Bold.ttf b/neode-ui/dist/assets/fonts/Courier_New/CourierNew-Bold.ttf new file mode 100644 index 0000000..19f7429 Binary files /dev/null and b/neode-ui/dist/assets/fonts/Courier_New/CourierNew-Bold.ttf differ diff --git a/neode-ui/dist/assets/fonts/Courier_New/CourierNew-Regular.ttf b/neode-ui/dist/assets/fonts/Courier_New/CourierNew-Regular.ttf new file mode 100644 index 0000000..ebb3361 Binary files /dev/null and b/neode-ui/dist/assets/fonts/Courier_New/CourierNew-Regular.ttf differ diff --git a/neode-ui/dist/assets/fonts/Montserrat/Montserrat-Black.ttf b/neode-ui/dist/assets/fonts/Montserrat/Montserrat-Black.ttf new file mode 100644 index 0000000..437b115 Binary files /dev/null and b/neode-ui/dist/assets/fonts/Montserrat/Montserrat-Black.ttf differ diff --git a/neode-ui/dist/assets/fonts/Montserrat/Montserrat-BlackItalic.ttf b/neode-ui/dist/assets/fonts/Montserrat/Montserrat-BlackItalic.ttf new file mode 100644 index 0000000..5234835 Binary files /dev/null and b/neode-ui/dist/assets/fonts/Montserrat/Montserrat-BlackItalic.ttf differ diff --git a/neode-ui/dist/assets/fonts/Montserrat/Montserrat-Bold.ttf b/neode-ui/dist/assets/fonts/Montserrat/Montserrat-Bold.ttf new file mode 100644 index 0000000..221819b Binary files /dev/null and b/neode-ui/dist/assets/fonts/Montserrat/Montserrat-Bold.ttf differ diff --git a/neode-ui/dist/assets/fonts/Montserrat/Montserrat-BoldItalic.ttf b/neode-ui/dist/assets/fonts/Montserrat/Montserrat-BoldItalic.ttf new file mode 100644 index 0000000..9ae2bd2 Binary files /dev/null and b/neode-ui/dist/assets/fonts/Montserrat/Montserrat-BoldItalic.ttf differ diff --git a/neode-ui/dist/assets/fonts/Montserrat/Montserrat-ExtraBold.ttf b/neode-ui/dist/assets/fonts/Montserrat/Montserrat-ExtraBold.ttf new file mode 100644 index 0000000..80ea806 Binary files /dev/null and b/neode-ui/dist/assets/fonts/Montserrat/Montserrat-ExtraBold.ttf differ diff --git a/neode-ui/dist/assets/fonts/Montserrat/Montserrat-ExtraBoldItalic.ttf b/neode-ui/dist/assets/fonts/Montserrat/Montserrat-ExtraBoldItalic.ttf new file mode 100644 index 0000000..6c961e1 Binary files /dev/null and b/neode-ui/dist/assets/fonts/Montserrat/Montserrat-ExtraBoldItalic.ttf differ diff --git a/neode-ui/dist/assets/fonts/Montserrat/Montserrat-ExtraLight.ttf b/neode-ui/dist/assets/fonts/Montserrat/Montserrat-ExtraLight.ttf new file mode 100644 index 0000000..ca0bbb6 Binary files /dev/null and b/neode-ui/dist/assets/fonts/Montserrat/Montserrat-ExtraLight.ttf differ diff --git a/neode-ui/dist/assets/fonts/Montserrat/Montserrat-ExtraLightItalic.ttf b/neode-ui/dist/assets/fonts/Montserrat/Montserrat-ExtraLightItalic.ttf new file mode 100644 index 0000000..f3c1559 Binary files /dev/null and b/neode-ui/dist/assets/fonts/Montserrat/Montserrat-ExtraLightItalic.ttf differ diff --git a/neode-ui/dist/assets/fonts/Montserrat/Montserrat-Italic.ttf b/neode-ui/dist/assets/fonts/Montserrat/Montserrat-Italic.ttf new file mode 100644 index 0000000..eb4232a Binary files /dev/null and b/neode-ui/dist/assets/fonts/Montserrat/Montserrat-Italic.ttf differ diff --git a/neode-ui/dist/assets/fonts/Montserrat/Montserrat-Light.ttf b/neode-ui/dist/assets/fonts/Montserrat/Montserrat-Light.ttf new file mode 100644 index 0000000..990857d Binary files /dev/null and b/neode-ui/dist/assets/fonts/Montserrat/Montserrat-Light.ttf differ diff --git a/neode-ui/dist/assets/fonts/Montserrat/Montserrat-LightItalic.ttf b/neode-ui/dist/assets/fonts/Montserrat/Montserrat-LightItalic.ttf new file mode 100644 index 0000000..2096040 Binary files /dev/null and b/neode-ui/dist/assets/fonts/Montserrat/Montserrat-LightItalic.ttf differ diff --git a/neode-ui/dist/assets/fonts/Montserrat/Montserrat-Medium.ttf b/neode-ui/dist/assets/fonts/Montserrat/Montserrat-Medium.ttf new file mode 100644 index 0000000..6e079f6 Binary files /dev/null and b/neode-ui/dist/assets/fonts/Montserrat/Montserrat-Medium.ttf differ diff --git a/neode-ui/dist/assets/fonts/Montserrat/Montserrat-MediumItalic.ttf b/neode-ui/dist/assets/fonts/Montserrat/Montserrat-MediumItalic.ttf new file mode 100644 index 0000000..0dc3ac9 Binary files /dev/null and b/neode-ui/dist/assets/fonts/Montserrat/Montserrat-MediumItalic.ttf differ diff --git a/neode-ui/dist/assets/fonts/Montserrat/Montserrat-Regular.ttf b/neode-ui/dist/assets/fonts/Montserrat/Montserrat-Regular.ttf new file mode 100644 index 0000000..8d443d5 Binary files /dev/null and b/neode-ui/dist/assets/fonts/Montserrat/Montserrat-Regular.ttf differ diff --git a/neode-ui/dist/assets/fonts/Montserrat/Montserrat-SemiBold.ttf b/neode-ui/dist/assets/fonts/Montserrat/Montserrat-SemiBold.ttf new file mode 100644 index 0000000..f8a43f2 Binary files /dev/null and b/neode-ui/dist/assets/fonts/Montserrat/Montserrat-SemiBold.ttf differ diff --git a/neode-ui/dist/assets/fonts/Montserrat/Montserrat-SemiBoldItalic.ttf b/neode-ui/dist/assets/fonts/Montserrat/Montserrat-SemiBoldItalic.ttf new file mode 100644 index 0000000..336c56e Binary files /dev/null and b/neode-ui/dist/assets/fonts/Montserrat/Montserrat-SemiBoldItalic.ttf differ diff --git a/neode-ui/dist/assets/fonts/Montserrat/Montserrat-Thin.ttf b/neode-ui/dist/assets/fonts/Montserrat/Montserrat-Thin.ttf new file mode 100644 index 0000000..b985875 Binary files /dev/null and b/neode-ui/dist/assets/fonts/Montserrat/Montserrat-Thin.ttf differ diff --git a/neode-ui/dist/assets/fonts/Montserrat/Montserrat-ThinItalic.ttf b/neode-ui/dist/assets/fonts/Montserrat/Montserrat-ThinItalic.ttf new file mode 100644 index 0000000..e488998 Binary files /dev/null and b/neode-ui/dist/assets/fonts/Montserrat/Montserrat-ThinItalic.ttf differ diff --git a/neode-ui/dist/assets/fonts/Montserrat/OFL.txt b/neode-ui/dist/assets/fonts/Montserrat/OFL.txt new file mode 100644 index 0000000..f435ed8 --- /dev/null +++ b/neode-ui/dist/assets/fonts/Montserrat/OFL.txt @@ -0,0 +1,93 @@ +Copyright 2011 The Montserrat Project Authors (https://github.com/JulietaUla/Montserrat) + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/neode-ui/dist/assets/fonts/Open_Sans/LICENSE.txt b/neode-ui/dist/assets/fonts/Open_Sans/LICENSE.txt new file mode 100644 index 0000000..d645695 --- /dev/null +++ b/neode-ui/dist/assets/fonts/Open_Sans/LICENSE.txt @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/neode-ui/dist/assets/fonts/Open_Sans/OpenSans-Bold.ttf b/neode-ui/dist/assets/fonts/Open_Sans/OpenSans-Bold.ttf new file mode 100644 index 0000000..efdd5e8 Binary files /dev/null and b/neode-ui/dist/assets/fonts/Open_Sans/OpenSans-Bold.ttf differ diff --git a/neode-ui/dist/assets/fonts/Open_Sans/OpenSans-BoldItalic.ttf b/neode-ui/dist/assets/fonts/Open_Sans/OpenSans-BoldItalic.ttf new file mode 100644 index 0000000..9bf9b4e Binary files /dev/null and b/neode-ui/dist/assets/fonts/Open_Sans/OpenSans-BoldItalic.ttf differ diff --git a/neode-ui/dist/assets/fonts/Open_Sans/OpenSans-ExtraBold.ttf b/neode-ui/dist/assets/fonts/Open_Sans/OpenSans-ExtraBold.ttf new file mode 100644 index 0000000..67fcf0f Binary files /dev/null and b/neode-ui/dist/assets/fonts/Open_Sans/OpenSans-ExtraBold.ttf differ diff --git a/neode-ui/dist/assets/fonts/Open_Sans/OpenSans-ExtraBoldItalic.ttf b/neode-ui/dist/assets/fonts/Open_Sans/OpenSans-ExtraBoldItalic.ttf new file mode 100644 index 0000000..0867228 Binary files /dev/null and b/neode-ui/dist/assets/fonts/Open_Sans/OpenSans-ExtraBoldItalic.ttf differ diff --git a/neode-ui/dist/assets/fonts/Open_Sans/OpenSans-Italic.ttf b/neode-ui/dist/assets/fonts/Open_Sans/OpenSans-Italic.ttf new file mode 100644 index 0000000..1178567 Binary files /dev/null and b/neode-ui/dist/assets/fonts/Open_Sans/OpenSans-Italic.ttf differ diff --git a/neode-ui/dist/assets/fonts/Open_Sans/OpenSans-Light.ttf b/neode-ui/dist/assets/fonts/Open_Sans/OpenSans-Light.ttf new file mode 100644 index 0000000..6580d3a Binary files /dev/null and b/neode-ui/dist/assets/fonts/Open_Sans/OpenSans-Light.ttf differ diff --git a/neode-ui/dist/assets/fonts/Open_Sans/OpenSans-LightItalic.ttf b/neode-ui/dist/assets/fonts/Open_Sans/OpenSans-LightItalic.ttf new file mode 100644 index 0000000..1e0c331 Binary files /dev/null and b/neode-ui/dist/assets/fonts/Open_Sans/OpenSans-LightItalic.ttf differ diff --git a/neode-ui/dist/assets/fonts/Open_Sans/OpenSans-Regular.ttf b/neode-ui/dist/assets/fonts/Open_Sans/OpenSans-Regular.ttf new file mode 100644 index 0000000..29bfd35 Binary files /dev/null and b/neode-ui/dist/assets/fonts/Open_Sans/OpenSans-Regular.ttf differ diff --git a/neode-ui/dist/assets/fonts/Open_Sans/OpenSans-SemiBold.ttf b/neode-ui/dist/assets/fonts/Open_Sans/OpenSans-SemiBold.ttf new file mode 100644 index 0000000..54e7059 Binary files /dev/null and b/neode-ui/dist/assets/fonts/Open_Sans/OpenSans-SemiBold.ttf differ diff --git a/neode-ui/dist/assets/fonts/Open_Sans/OpenSans-SemiBoldItalic.ttf b/neode-ui/dist/assets/fonts/Open_Sans/OpenSans-SemiBoldItalic.ttf new file mode 100644 index 0000000..aebcf14 Binary files /dev/null and b/neode-ui/dist/assets/fonts/Open_Sans/OpenSans-SemiBoldItalic.ttf differ diff --git a/neode-ui/dist/assets/fonts/Redacted/redacted.regular.ttf b/neode-ui/dist/assets/fonts/Redacted/redacted.regular.ttf new file mode 100644 index 0000000..3bc1fe3 Binary files /dev/null and b/neode-ui/dist/assets/fonts/Redacted/redacted.regular.ttf differ diff --git a/neode-ui/dist/assets/goals-f4yPn45c.js b/neode-ui/dist/assets/goals-f4yPn45c.js new file mode 100644 index 0000000..508f491 --- /dev/null +++ b/neode-ui/dist/assets/goals-f4yPn45c.js @@ -0,0 +1 @@ +import{$ as v,r as A,z as k,j as S}from"./index-DnbYEqLr.js";const d=[{id:"open-a-shop",title:"Open a Shop",subtitle:"Accept Bitcoin payments with your own online store",icon:"shop",category:"commerce",requiredApps:["bitcoin-knots","lnd","btcpay-server"],steps:[{id:"install-bitcoin",title:"Install Bitcoin Node",description:"Bitcoin Knots validates transactions and maintains the blockchain on your hardware. This is the foundation of your sovereign payment stack.",appId:"bitcoin-knots",action:"install",isAutomatic:!0},{id:"install-lnd",title:"Install Lightning Network",description:"LND enables instant, low-fee Bitcoin payments through payment channels. Your customers can pay in seconds.",appId:"lnd",action:"install",isAutomatic:!0},{id:"install-btcpay",title:"Install BTCPay Server",description:"BTCPay Server is your self-hosted payment processor. Create invoices, manage your store, and accept payments — all without middlemen.",appId:"btcpay-server",action:"install",isAutomatic:!0},{id:"configure-store",title:"Set Up Your Store",description:"Create your store, set your currency, and customize your payment page. BTCPay will open so you can configure everything.",action:"configure",isAutomatic:!1}],estimatedTime:"~45 min + sync time",difficulty:"beginner"},{id:"accept-payments",title:"Accept Payments",subtitle:"Receive Bitcoin and Lightning payments directly",icon:"payments",category:"payments",requiredApps:["bitcoin-knots","lnd"],steps:[{id:"install-bitcoin",title:"Install Bitcoin Node",description:"Your own Bitcoin node verifies every transaction independently. No trust required.",appId:"bitcoin-knots",action:"install",isAutomatic:!0},{id:"install-lnd",title:"Install Lightning Network",description:"Lightning enables instant payments with tiny fees. Perfect for everyday transactions.",appId:"lnd",action:"install",isAutomatic:!0},{id:"open-channel",title:"Open a Lightning Channel",description:"Open your first payment channel to start sending and receiving Lightning payments. LND will guide you through it.",action:"configure",isAutomatic:!1}],estimatedTime:"~30 min + sync time",difficulty:"beginner"},{id:"store-photos",title:"Store My Photos",subtitle:"Private photo backup and gallery on your own hardware",icon:"photos",category:"storage",requiredApps:["immich"],steps:[{id:"install-immich",title:"Install Immich",description:"Immich is a self-hosted photo and video management solution. It looks and feels like Google Photos, but your data stays on your server.",appId:"immich",action:"install",isAutomatic:!0},{id:"configure-immich",title:"Create Your Account",description:"Set up your Immich account and configure your photo library. Quick and simple.",action:"configure",isAutomatic:!1},{id:"mobile-sync",title:"Connect Your Phone",description:"Download the Immich app on your phone and scan the QR code to start automatic photo backup.",action:"info",isAutomatic:!1}],estimatedTime:"~15 min",difficulty:"beginner"},{id:"store-files",title:"Store My Files",subtitle:"Personal cloud storage and file sync",icon:"files",category:"storage",requiredApps:["nextcloud"],steps:[{id:"install-nextcloud",title:"Install Cloud Storage",description:"Nextcloud gives you a full cloud storage platform — files, calendars, contacts, and more. Like Dropbox, but sovereign.",appId:"nextcloud",action:"install",isAutomatic:!0},{id:"configure-nextcloud",title:"Set Up Your Cloud",description:"Create your admin account and configure storage. Nextcloud will open for you to complete setup.",action:"configure",isAutomatic:!1},{id:"sync-setup",title:"Sync Your Devices",description:"Install the Nextcloud app on your phone and computer to keep your files in sync across all devices.",action:"info",isAutomatic:!1}],estimatedTime:"~20 min",difficulty:"beginner"},{id:"run-lightning-node",title:"Run a Lightning Node",subtitle:"Route payments and earn sats on the Lightning Network",icon:"lightning",category:"network",requiredApps:["bitcoin-knots","lnd"],steps:[{id:"install-bitcoin",title:"Install Bitcoin Node",description:"The Bitcoin blockchain is the settlement layer. Your node needs to sync the full chain before Lightning can start.",appId:"bitcoin-knots",action:"install",isAutomatic:!0},{id:"install-lnd",title:"Install LND",description:"LND is a full Lightning Network node. You can route payments for others and earn routing fees.",appId:"lnd",action:"install",isAutomatic:!0},{id:"open-channels",title:"Open Payment Channels",description:"Open channels with well-connected nodes to start routing payments. More channels means more routing opportunities.",action:"configure",isAutomatic:!1},{id:"verify-routing",title:"Verify Node is Routing",description:"Check that your node is visible on the network and ready to route payments.",action:"verify",isAutomatic:!0}],estimatedTime:"~40 min + sync time",difficulty:"intermediate"},{id:"setup-fedimint",title:"Create a Community",subtitle:"Start a Fedimint federation for private, scalable Bitcoin",icon:"community",category:"community",requiredApps:["bitcoin-knots","fedimint"],steps:[{id:"install-bitcoin",title:"Install Bitcoin Node",description:"Bitcoin Knots provides the base layer that Fedimint connects to for on-chain transactions and consensus.",appId:"bitcoin-knots",action:"install",isAutomatic:!0},{id:"install-fedimint",title:"Install Fedimint",description:"Fedimint is a federated Bitcoin mint. Guardians collectively manage funds using threshold signatures — no single point of failure.",appId:"fedimint",action:"install",isAutomatic:!0},{id:"configure-guardian",title:"Set Up Guardian UI",description:"Open the Guardian UI (port 8175) to configure your federation name, set the guardian threshold, and initialize the mint.",action:"configure",isAutomatic:!1},{id:"share-invite",title:"Share Invite Code",description:"Generate and share your federation invite code with community members so they can join and start using ecash.",action:"info",isAutomatic:!1}],estimatedTime:"~30 min + sync time",difficulty:"intermediate"},{id:"create-identity",title:"Create My Identity",subtitle:"Sovereign digital identity with DID and Nostr",icon:"identity",category:"identity",requiredApps:[],steps:[{id:"generate-did",title:"Generate Your Identity",description:"Your server creates a cryptographic identity (DID) that you own and control. No company can revoke it.",action:"verify",isAutomatic:!0},{id:"setup-nostr",title:"Set Up Nostr Profile",description:"Publish your identity to the Nostr network. This lets you sign into Nostr-compatible apps directly from your server.",action:"configure",isAutomatic:!1},{id:"export-identity",title:"Export Your Identity",description:"Save your identity credentials for backup. This is your portable sovereign identity — take it anywhere.",action:"info",isAutomatic:!1}],estimatedTime:"~5 min",difficulty:"beginner"},{id:"back-up-everything",title:"Back Up Everything",subtitle:"Encrypted backup of your entire node",icon:"backup",category:"backup",requiredApps:[],steps:[{id:"create-passphrase",title:"Create a Passphrase",description:"Choose a strong passphrase to encrypt your backup. Without this passphrase, nobody can access your data — not even us.",action:"configure",isAutomatic:!1},{id:"create-backup",title:"Create Encrypted Backup",description:"Your server will create a complete encrypted backup of all your data, keys, and configuration.",action:"verify",isAutomatic:!0},{id:"save-backup",title:"Save Your Backup",description:"Download your encrypted backup file and store it somewhere safe. Consider keeping a copy on a USB drive and in the cloud.",action:"info",isAutomatic:!1}],estimatedTime:"~10 min",difficulty:"beginner"}];function C(e){return d.find(r=>r.id===e)}const y="archipelago-goal-progress",I={immich:["immich-server","immich-app","immich_server"],nextcloud:["nextcloud-aio","nextcloud-server"],"bitcoin-knots":["bitcoin","bitcoin-core"]};function p(e,r){if(e===r)return!0;const s=I[r];return s?s.includes(e):!1}const x=v("goals",()=>{const e=A({});function r(){try{const t=localStorage.getItem(y);t&&(e.value=JSON.parse(t))}catch{}}function s(){localStorage.setItem(y,JSON.stringify(e.value))}function m(t){const i=d.find(n=>n.id===t);if(!i)return"not-started";if(i.requiredApps.length===0)return e.value[t]?.status||"not-started";const a=k().packages;let c=!1;for(const n of i.steps)n.appId&&n.action==="install"&&Object.keys(a).some(u=>p(u,n.appId))&&(e.value[t]||(e.value[t]={goalId:t,status:"in-progress",currentStepIndex:0,completedSteps:[],startedAt:Date.now()},c=!0),e.value[t].completedSteps.includes(n.id)||(e.value[t].completedSteps.push(n.id),c=!0));return c&&s(),i.requiredApps.every(n=>Object.entries(a).some(([l,u])=>p(l,n)&&u.state==="running"))?"completed":i.requiredApps.some(n=>Object.keys(a).some(l=>p(l,n)))||e.value[t]?"in-progress":"not-started"}const f=S(()=>{const t={};for(const i of d)t[i.id]=m(i.id);return t});function h(t){e.value[t]={goalId:t,status:"in-progress",currentStepIndex:0,completedSteps:[],startedAt:Date.now()},s()}function g(t,i){const o=e.value[t];if(!o)return;o.completedSteps.includes(i)||o.completedSteps.push(i);const a=d.find(c=>c.id===t);a&&o.completedSteps.length>=a.steps.length?o.status="completed":o.currentStepIndex=Math.min(o.currentStepIndex+1,(a?.steps.length??1)-1),s()}function b(t){delete e.value[t],s()}return r(),{progress:e,goalStatuses:f,getGoalStatus:m,startGoal:h,completeStep:g,resetGoal:b}});export{d as G,C as g,x as u}; diff --git a/neode-ui/dist/assets/icon/apple-touch-icon-180x180-v2.png b/neode-ui/dist/assets/icon/apple-touch-icon-180x180-v2.png new file mode 100644 index 0000000..a9040bb Binary files /dev/null and b/neode-ui/dist/assets/icon/apple-touch-icon-180x180-v2.png differ diff --git a/neode-ui/dist/assets/icon/favico-black-v2.svg b/neode-ui/dist/assets/icon/favico-black-v2.svg new file mode 100644 index 0000000..098675b --- /dev/null +++ b/neode-ui/dist/assets/icon/favico-black-v2.svg @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/neode-ui/dist/assets/icon/maskable-icon-512x512-v2.png b/neode-ui/dist/assets/icon/maskable-icon-512x512-v2.png new file mode 100644 index 0000000..1087cdb Binary files /dev/null and b/neode-ui/dist/assets/icon/maskable-icon-512x512-v2.png differ diff --git a/neode-ui/dist/assets/icon/pwa-192x192-v2.png b/neode-ui/dist/assets/icon/pwa-192x192-v2.png new file mode 100644 index 0000000..b3d24cd Binary files /dev/null and b/neode-ui/dist/assets/icon/pwa-192x192-v2.png differ diff --git a/neode-ui/dist/assets/icon/pwa-512x512-v2.png b/neode-ui/dist/assets/icon/pwa-512x512-v2.png new file mode 100644 index 0000000..062c9be Binary files /dev/null and b/neode-ui/dist/assets/icon/pwa-512x512-v2.png differ diff --git a/neode-ui/dist/assets/icon/pwa-64x64-v2.png b/neode-ui/dist/assets/icon/pwa-64x64-v2.png new file mode 100644 index 0000000..b6a935d Binary files /dev/null and b/neode-ui/dist/assets/icon/pwa-64x64-v2.png differ diff --git a/neode-ui/dist/assets/img/.DS_Store b/neode-ui/dist/assets/img/.DS_Store new file mode 100644 index 0000000..5eb2e77 Binary files /dev/null and b/neode-ui/dist/assets/img/.DS_Store differ diff --git a/neode-ui/dist/assets/img/app-icons/.DS_Store b/neode-ui/dist/assets/img/app-icons/.DS_Store new file mode 100644 index 0000000..ff3a074 Binary files /dev/null and b/neode-ui/dist/assets/img/app-icons/.DS_Store differ diff --git a/neode-ui/dist/assets/img/app-icons/484-kitchen.png b/neode-ui/dist/assets/img/app-icons/484-kitchen.png new file mode 100644 index 0000000..11b881e Binary files /dev/null and b/neode-ui/dist/assets/img/app-icons/484-kitchen.png differ diff --git a/neode-ui/dist/assets/img/app-icons/README.md b/neode-ui/dist/assets/img/app-icons/README.md new file mode 100644 index 0000000..7585dbf --- /dev/null +++ b/neode-ui/dist/assets/img/app-icons/README.md @@ -0,0 +1,11 @@ +# App Icons – Canonical Source + +**This is the single source of truth for all app icons.** + +- **Path**: `neode-ui/public/assets/img/app-icons/` +- **Naming**: `{app-id}.{ext}` (e.g. `fedimint.png`, `mempool.webp`, `lnd.svg`) +- **Formats**: PNG, WebP, or SVG (prefer WebP for size, SVG for scalability) + +All references in the codebase use `/assets/img/app-icons/{filename}`. Build outputs (web/dist, image-recipe) copy from here. + +To add an icon: place the file here with the app-id as the filename. Run `npm run build` to update deployed assets. diff --git a/neode-ui/dist/assets/img/app-icons/arch-presentation.png b/neode-ui/dist/assets/img/app-icons/arch-presentation.png new file mode 100644 index 0000000..ab22130 Binary files /dev/null and b/neode-ui/dist/assets/img/app-icons/arch-presentation.png differ diff --git a/neode-ui/dist/assets/img/app-icons/bg-appstore.jpg b/neode-ui/dist/assets/img/app-icons/bg-appstore.jpg new file mode 100644 index 0000000..4b56d21 Binary files /dev/null and b/neode-ui/dist/assets/img/app-icons/bg-appstore.jpg differ diff --git a/neode-ui/dist/assets/img/app-icons/bitcoin-core.png b/neode-ui/dist/assets/img/app-icons/bitcoin-core.png new file mode 100644 index 0000000..7340442 Binary files /dev/null and b/neode-ui/dist/assets/img/app-icons/bitcoin-core.png differ diff --git a/neode-ui/dist/assets/img/app-icons/bitcoin-knots.webp b/neode-ui/dist/assets/img/app-icons/bitcoin-knots.webp new file mode 100644 index 0000000..3441e3d Binary files /dev/null and b/neode-ui/dist/assets/img/app-icons/bitcoin-knots.webp differ diff --git a/neode-ui/dist/assets/img/app-icons/botfights.svg b/neode-ui/dist/assets/img/app-icons/botfights.svg new file mode 100644 index 0000000..e92fdbb --- /dev/null +++ b/neode-ui/dist/assets/img/app-icons/botfights.svg @@ -0,0 +1,97 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 01101 + 10010 + 11001 + 01010 + 10110 + 01101 + 11010 + 10101 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $_ + run + + + + + + + + + diff --git a/neode-ui/dist/assets/img/app-icons/btcpay-server.png b/neode-ui/dist/assets/img/app-icons/btcpay-server.png new file mode 100644 index 0000000..c9ca50f Binary files /dev/null and b/neode-ui/dist/assets/img/app-icons/btcpay-server.png differ diff --git a/neode-ui/dist/assets/img/app-icons/call-the-operator.png b/neode-ui/dist/assets/img/app-icons/call-the-operator.png new file mode 100644 index 0000000..7c1d10c Binary files /dev/null and b/neode-ui/dist/assets/img/app-icons/call-the-operator.png differ diff --git a/neode-ui/dist/assets/img/app-icons/dwn.svg b/neode-ui/dist/assets/img/app-icons/dwn.svg new file mode 100644 index 0000000..5ec6fa0 --- /dev/null +++ b/neode-ui/dist/assets/img/app-icons/dwn.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/neode-ui/dist/assets/img/app-icons/electrs.svg b/neode-ui/dist/assets/img/app-icons/electrs.svg new file mode 100644 index 0000000..ee5454e --- /dev/null +++ b/neode-ui/dist/assets/img/app-icons/electrs.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/neode-ui/dist/assets/img/app-icons/electrumx.webp b/neode-ui/dist/assets/img/app-icons/electrumx.webp new file mode 100644 index 0000000..4d05b2d Binary files /dev/null and b/neode-ui/dist/assets/img/app-icons/electrumx.webp differ diff --git a/neode-ui/dist/assets/img/app-icons/endurain.png b/neode-ui/dist/assets/img/app-icons/endurain.png new file mode 100644 index 0000000..7270ab1 Binary files /dev/null and b/neode-ui/dist/assets/img/app-icons/endurain.png differ diff --git a/neode-ui/dist/assets/img/app-icons/fedimint.png b/neode-ui/dist/assets/img/app-icons/fedimint.png new file mode 100644 index 0000000..4a759c5 Binary files /dev/null and b/neode-ui/dist/assets/img/app-icons/fedimint.png differ diff --git a/neode-ui/dist/assets/img/app-icons/file-browser.webp b/neode-ui/dist/assets/img/app-icons/file-browser.webp new file mode 100644 index 0000000..e618322 Binary files /dev/null and b/neode-ui/dist/assets/img/app-icons/file-browser.webp differ diff --git a/neode-ui/dist/assets/img/app-icons/grafana.png b/neode-ui/dist/assets/img/app-icons/grafana.png new file mode 100644 index 0000000..af2a317 Binary files /dev/null and b/neode-ui/dist/assets/img/app-icons/grafana.png differ diff --git a/neode-ui/dist/assets/img/app-icons/homeassistant.png b/neode-ui/dist/assets/img/app-icons/homeassistant.png new file mode 100644 index 0000000..fceb2df Binary files /dev/null and b/neode-ui/dist/assets/img/app-icons/homeassistant.png differ diff --git a/neode-ui/dist/assets/img/app-icons/immich.png b/neode-ui/dist/assets/img/app-icons/immich.png new file mode 100644 index 0000000..cbdc20b Binary files /dev/null and b/neode-ui/dist/assets/img/app-icons/immich.png differ diff --git a/neode-ui/dist/assets/img/app-icons/indeedhub.png b/neode-ui/dist/assets/img/app-icons/indeedhub.png new file mode 100644 index 0000000..1e56b49 Binary files /dev/null and b/neode-ui/dist/assets/img/app-icons/indeedhub.png differ diff --git a/neode-ui/dist/assets/img/app-icons/jellyfin.webp b/neode-ui/dist/assets/img/app-icons/jellyfin.webp new file mode 100644 index 0000000..1a76d80 Binary files /dev/null and b/neode-ui/dist/assets/img/app-icons/jellyfin.webp differ diff --git a/neode-ui/dist/assets/img/app-icons/lnd.svg b/neode-ui/dist/assets/img/app-icons/lnd.svg new file mode 100644 index 0000000..05df934 --- /dev/null +++ b/neode-ui/dist/assets/img/app-icons/lnd.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/neode-ui/dist/assets/img/app-icons/lorabell.png b/neode-ui/dist/assets/img/app-icons/lorabell.png new file mode 100644 index 0000000..c8d9f8b Binary files /dev/null and b/neode-ui/dist/assets/img/app-icons/lorabell.png differ diff --git a/neode-ui/dist/assets/img/app-icons/mempool.webp b/neode-ui/dist/assets/img/app-icons/mempool.webp new file mode 100644 index 0000000..1028b7d Binary files /dev/null and b/neode-ui/dist/assets/img/app-icons/mempool.webp differ diff --git a/neode-ui/dist/assets/img/app-icons/morphos.png b/neode-ui/dist/assets/img/app-icons/morphos.png new file mode 100644 index 0000000..7008144 Binary files /dev/null and b/neode-ui/dist/assets/img/app-icons/morphos.png differ diff --git a/neode-ui/dist/assets/img/app-icons/nextcloud.webp b/neode-ui/dist/assets/img/app-icons/nextcloud.webp new file mode 100644 index 0000000..40d4ac7 Binary files /dev/null and b/neode-ui/dist/assets/img/app-icons/nextcloud.webp differ diff --git a/neode-ui/dist/assets/img/app-icons/nginx.svg b/neode-ui/dist/assets/img/app-icons/nginx.svg new file mode 100644 index 0000000..04be0e7 --- /dev/null +++ b/neode-ui/dist/assets/img/app-icons/nginx.svg @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/neode-ui/dist/assets/img/app-icons/nostr-rs-relay.svg b/neode-ui/dist/assets/img/app-icons/nostr-rs-relay.svg new file mode 100644 index 0000000..ec2cabd --- /dev/null +++ b/neode-ui/dist/assets/img/app-icons/nostr-rs-relay.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/neode-ui/dist/assets/img/app-icons/nostrudel.svg b/neode-ui/dist/assets/img/app-icons/nostrudel.svg new file mode 100644 index 0000000..c4063c0 --- /dev/null +++ b/neode-ui/dist/assets/img/app-icons/nostrudel.svg @@ -0,0 +1,4 @@ + + + nS + diff --git a/neode-ui/dist/assets/img/app-icons/nwnn.png b/neode-ui/dist/assets/img/app-icons/nwnn.png new file mode 100644 index 0000000..45a8951 Binary files /dev/null and b/neode-ui/dist/assets/img/app-icons/nwnn.png differ diff --git a/neode-ui/dist/assets/img/app-icons/ollama.png b/neode-ui/dist/assets/img/app-icons/ollama.png new file mode 100644 index 0000000..3b2dce7 Binary files /dev/null and b/neode-ui/dist/assets/img/app-icons/ollama.png differ diff --git a/neode-ui/dist/assets/img/app-icons/onlyoffice.webp b/neode-ui/dist/assets/img/app-icons/onlyoffice.webp new file mode 100644 index 0000000..b2c8856 Binary files /dev/null and b/neode-ui/dist/assets/img/app-icons/onlyoffice.webp differ diff --git a/neode-ui/dist/assets/img/app-icons/penpot.webp b/neode-ui/dist/assets/img/app-icons/penpot.webp new file mode 100644 index 0000000..196a54f Binary files /dev/null and b/neode-ui/dist/assets/img/app-icons/penpot.webp differ diff --git a/neode-ui/dist/assets/img/app-icons/photoprism.svg b/neode-ui/dist/assets/img/app-icons/photoprism.svg new file mode 100644 index 0000000..c4e7d7f --- /dev/null +++ b/neode-ui/dist/assets/img/app-icons/photoprism.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/neode-ui/dist/assets/img/app-icons/portainer.webp b/neode-ui/dist/assets/img/app-icons/portainer.webp new file mode 100644 index 0000000..56c1366 Binary files /dev/null and b/neode-ui/dist/assets/img/app-icons/portainer.webp differ diff --git a/neode-ui/dist/assets/img/app-icons/searxng.png b/neode-ui/dist/assets/img/app-icons/searxng.png new file mode 100644 index 0000000..1ad0ab0 Binary files /dev/null and b/neode-ui/dist/assets/img/app-icons/searxng.png differ diff --git a/neode-ui/dist/assets/img/app-icons/syntropy-institute.png b/neode-ui/dist/assets/img/app-icons/syntropy-institute.png new file mode 100644 index 0000000..34d5739 Binary files /dev/null and b/neode-ui/dist/assets/img/app-icons/syntropy-institute.png differ diff --git a/neode-ui/dist/assets/img/app-icons/t-zero.png b/neode-ui/dist/assets/img/app-icons/t-zero.png new file mode 100644 index 0000000..24295b1 Binary files /dev/null and b/neode-ui/dist/assets/img/app-icons/t-zero.png differ diff --git a/neode-ui/dist/assets/img/app-icons/tailscale.webp b/neode-ui/dist/assets/img/app-icons/tailscale.webp new file mode 100644 index 0000000..a0a8630 Binary files /dev/null and b/neode-ui/dist/assets/img/app-icons/tailscale.webp differ diff --git a/neode-ui/dist/assets/img/app-icons/tor.svg b/neode-ui/dist/assets/img/app-icons/tor.svg new file mode 100644 index 0000000..43e6a18 --- /dev/null +++ b/neode-ui/dist/assets/img/app-icons/tor.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/neode-ui/dist/assets/img/app-icons/uptime-kuma.webp b/neode-ui/dist/assets/img/app-icons/uptime-kuma.webp new file mode 100644 index 0000000..ed49a77 Binary files /dev/null and b/neode-ui/dist/assets/img/app-icons/uptime-kuma.webp differ diff --git a/neode-ui/dist/assets/img/app-icons/vaultwarden.webp b/neode-ui/dist/assets/img/app-icons/vaultwarden.webp new file mode 100644 index 0000000..0c01c86 Binary files /dev/null and b/neode-ui/dist/assets/img/app-icons/vaultwarden.webp differ diff --git a/neode-ui/dist/assets/img/bg-appstore.jpg b/neode-ui/dist/assets/img/bg-appstore.jpg new file mode 100644 index 0000000..54c0d2e Binary files /dev/null and b/neode-ui/dist/assets/img/bg-appstore.jpg differ diff --git a/neode-ui/dist/assets/img/bg-cloud.jpg b/neode-ui/dist/assets/img/bg-cloud.jpg new file mode 100644 index 0000000..2a72ee5 Binary files /dev/null and b/neode-ui/dist/assets/img/bg-cloud.jpg differ diff --git a/neode-ui/dist/assets/img/bg-home.jpg b/neode-ui/dist/assets/img/bg-home.jpg new file mode 100644 index 0000000..b948e0a Binary files /dev/null and b/neode-ui/dist/assets/img/bg-home.jpg differ diff --git a/neode-ui/dist/assets/img/bg-intro-1.jpg b/neode-ui/dist/assets/img/bg-intro-1.jpg new file mode 100644 index 0000000..2a72ee5 Binary files /dev/null and b/neode-ui/dist/assets/img/bg-intro-1.jpg differ diff --git a/neode-ui/dist/assets/img/bg-intro-2.jpg b/neode-ui/dist/assets/img/bg-intro-2.jpg new file mode 100644 index 0000000..f474fa1 Binary files /dev/null and b/neode-ui/dist/assets/img/bg-intro-2.jpg differ diff --git a/neode-ui/dist/assets/img/bg-intro-3.jpg b/neode-ui/dist/assets/img/bg-intro-3.jpg new file mode 100644 index 0000000..b6cbf4f Binary files /dev/null and b/neode-ui/dist/assets/img/bg-intro-3.jpg differ diff --git a/neode-ui/dist/assets/img/bg-intro-4.jpg b/neode-ui/dist/assets/img/bg-intro-4.jpg new file mode 100644 index 0000000..a55d28f Binary files /dev/null and b/neode-ui/dist/assets/img/bg-intro-4.jpg differ diff --git a/neode-ui/dist/assets/img/bg-intro-5.jpg b/neode-ui/dist/assets/img/bg-intro-5.jpg new file mode 100644 index 0000000..5482336 Binary files /dev/null and b/neode-ui/dist/assets/img/bg-intro-5.jpg differ diff --git a/neode-ui/dist/assets/img/bg-intro-6.jpg b/neode-ui/dist/assets/img/bg-intro-6.jpg new file mode 100644 index 0000000..fa9f4bc Binary files /dev/null and b/neode-ui/dist/assets/img/bg-intro-6.jpg differ diff --git a/neode-ui/dist/assets/img/bg-intro.jpg b/neode-ui/dist/assets/img/bg-intro.jpg new file mode 100644 index 0000000..b6cbf4f Binary files /dev/null and b/neode-ui/dist/assets/img/bg-intro.jpg differ diff --git a/neode-ui/dist/assets/img/bg-mesh.jpg b/neode-ui/dist/assets/img/bg-mesh.jpg new file mode 100644 index 0000000..aeed89d Binary files /dev/null and b/neode-ui/dist/assets/img/bg-mesh.jpg differ diff --git a/neode-ui/dist/assets/img/bg-myapps.jpg b/neode-ui/dist/assets/img/bg-myapps.jpg new file mode 100644 index 0000000..54c0d2e Binary files /dev/null and b/neode-ui/dist/assets/img/bg-myapps.jpg differ diff --git a/neode-ui/dist/assets/img/bg-network.jpg b/neode-ui/dist/assets/img/bg-network.jpg new file mode 100644 index 0000000..f474fa1 Binary files /dev/null and b/neode-ui/dist/assets/img/bg-network.jpg differ diff --git a/neode-ui/dist/assets/img/bg-settings.jpg b/neode-ui/dist/assets/img/bg-settings.jpg new file mode 100644 index 0000000..68017a4 Binary files /dev/null and b/neode-ui/dist/assets/img/bg-settings.jpg differ diff --git a/neode-ui/dist/assets/img/bg-web5.jpg b/neode-ui/dist/assets/img/bg-web5.jpg new file mode 100644 index 0000000..0603f56 Binary files /dev/null and b/neode-ui/dist/assets/img/bg-web5.jpg differ diff --git a/neode-ui/dist/assets/img/bg.jpg b/neode-ui/dist/assets/img/bg.jpg new file mode 100644 index 0000000..eed5fda Binary files /dev/null and b/neode-ui/dist/assets/img/bg.jpg differ diff --git a/neode-ui/dist/assets/img/bitcoin.svg b/neode-ui/dist/assets/img/bitcoin.svg new file mode 100644 index 0000000..ca5d37f --- /dev/null +++ b/neode-ui/dist/assets/img/bitcoin.svg @@ -0,0 +1,95 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + diff --git a/neode-ui/dist/assets/img/grafana.png b/neode-ui/dist/assets/img/grafana.png new file mode 100644 index 0000000..fdb3ad1 Binary files /dev/null and b/neode-ui/dist/assets/img/grafana.png differ diff --git a/neode-ui/dist/assets/img/icons/bitcoin-symbol.svg b/neode-ui/dist/assets/img/icons/bitcoin-symbol.svg new file mode 100644 index 0000000..ba471b2 --- /dev/null +++ b/neode-ui/dist/assets/img/icons/bitcoin-symbol.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/neode-ui/dist/assets/img/icons/bitcoin.svg b/neode-ui/dist/assets/img/icons/bitcoin.svg new file mode 100644 index 0000000..ca5d37f --- /dev/null +++ b/neode-ui/dist/assets/img/icons/bitcoin.svg @@ -0,0 +1,95 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + diff --git a/neode-ui/dist/assets/img/icons/snek.png b/neode-ui/dist/assets/img/icons/snek.png new file mode 100644 index 0000000..0094e2b Binary files /dev/null and b/neode-ui/dist/assets/img/icons/snek.png differ diff --git a/neode-ui/dist/assets/img/icons/wifi-0.png b/neode-ui/dist/assets/img/icons/wifi-0.png new file mode 100644 index 0000000..01c6766 Binary files /dev/null and b/neode-ui/dist/assets/img/icons/wifi-0.png differ diff --git a/neode-ui/dist/assets/img/icons/wifi-1.png b/neode-ui/dist/assets/img/icons/wifi-1.png new file mode 100644 index 0000000..5dcda6f Binary files /dev/null and b/neode-ui/dist/assets/img/icons/wifi-1.png differ diff --git a/neode-ui/dist/assets/img/icons/wifi-2.png b/neode-ui/dist/assets/img/icons/wifi-2.png new file mode 100644 index 0000000..de09d3c Binary files /dev/null and b/neode-ui/dist/assets/img/icons/wifi-2.png differ diff --git a/neode-ui/dist/assets/img/icons/wifi-3.png b/neode-ui/dist/assets/img/icons/wifi-3.png new file mode 100644 index 0000000..a173d1b Binary files /dev/null and b/neode-ui/dist/assets/img/icons/wifi-3.png differ diff --git a/neode-ui/dist/assets/img/logo-archipelago.svg b/neode-ui/dist/assets/img/logo-archipelago.svg new file mode 100644 index 0000000..3d7fab2 --- /dev/null +++ b/neode-ui/dist/assets/img/logo-archipelago.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/neode-ui/dist/assets/img/logo-large.svg b/neode-ui/dist/assets/img/logo-large.svg new file mode 100644 index 0000000..87b3715 --- /dev/null +++ b/neode-ui/dist/assets/img/logo-large.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/neode-ui/dist/assets/img/logo-neode.png b/neode-ui/dist/assets/img/logo-neode.png new file mode 100644 index 0000000..da780bb Binary files /dev/null and b/neode-ui/dist/assets/img/logo-neode.png differ diff --git a/neode-ui/dist/assets/img/neode-logo.png b/neode-ui/dist/assets/img/neode-logo.png new file mode 100644 index 0000000..c879039 Binary files /dev/null and b/neode-ui/dist/assets/img/neode-logo.png differ diff --git a/neode-ui/dist/assets/img/service-icons/bitcoind.svg b/neode-ui/dist/assets/img/service-icons/bitcoind.svg new file mode 100644 index 0000000..af6a314 --- /dev/null +++ b/neode-ui/dist/assets/img/service-icons/bitcoind.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/neode-ui/dist/assets/img/service-icons/btc-rpc-proxy.png b/neode-ui/dist/assets/img/service-icons/btc-rpc-proxy.png new file mode 100644 index 0000000..fadb7f1 Binary files /dev/null and b/neode-ui/dist/assets/img/service-icons/btc-rpc-proxy.png differ diff --git a/neode-ui/dist/assets/img/service-icons/lnd.png b/neode-ui/dist/assets/img/service-icons/lnd.png new file mode 100644 index 0000000..37a0ffc Binary files /dev/null and b/neode-ui/dist/assets/img/service-icons/lnd.png differ diff --git a/neode-ui/dist/assets/index-Ba9RnVeg.css b/neode-ui/dist/assets/index-Ba9RnVeg.css new file mode 100644 index 0000000..efe6fb4 --- /dev/null +++ b/neode-ui/dist/assets/index-Ba9RnVeg.css @@ -0,0 +1 @@ +*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:Avenir Next,system-ui,sans-serif;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}.\!container{width:100%!important}.container{width:100%}@media(min-width:640px){.\!container{max-width:640px!important}.container{max-width:640px}}@media(min-width:768px){.\!container{max-width:768px!important}.container{max-width:768px}}@media(min-width:1024px){.\!container{max-width:1024px!important}.container{max-width:1024px}}@media(min-width:1280px){.\!container{max-width:1280px!important}.container{max-width:1280px}}@media(min-width:1536px){.\!container{max-width:1536px!important}.container{max-width:1536px}}.glass{background-color:#00000059;backdrop-filter:blur(18px);-webkit-backdrop-filter:blur(18px);border:1px solid rgba(255,255,255,.18);box-shadow:0 8px 24px #00000073}.glass-card{background-color:#000000a6;backdrop-filter:blur(18px);-webkit-backdrop-filter:blur(18px);border:1px solid rgba(255,255,255,.18);box-shadow:0 8px 24px #00000073;border-radius:1rem;overflow-x:hidden;overflow-y:visible}.mode-switcher{display:inline-flex;gap:2px;padding:3px;border-radius:.5rem;background:#ffffff0f;border:1px solid rgba(255,255,255,.08)}.mode-switcher-full{display:flex;width:100%}.mode-switcher-btn{flex:1 1 0%;padding:.375rem .75rem;border-radius:.375rem;white-space:nowrap;font-size:.75rem;font-weight:500;color:#ffffff73;transition:color .2s ease,background-color .2s ease;cursor:pointer;text-align:center;border:none;background:transparent}@media(max-width:767px){.mode-switcher-btn{min-height:44px;font-size:.875rem;padding:.625rem 1rem}}.mode-switcher-btn:hover{color:#ffffffbf}.mode-switcher-btn-active{background:#ffffff26;color:#fffffff2;box-shadow:0 1px 4px #0000004d}.chat-launcher-btn{background:#ffffff0f;border:1px solid rgba(255,255,255,.1);color:#fffc;margin-top:.25rem}.chat-launcher-btn:hover{background:#fb923c26;border-color:#fb923c4d;color:#fb923c;transform:translateY(-1px)}.chat-launcher-btn-mobile{color:#ffffffb3}.chat-launcher-btn-mobile:hover{color:#fb923c}.chat-close-btn{display:flex;align-items:center;gap:.5rem;padding:.5rem .75rem;border-radius:.75rem;background:#00000080;backdrop-filter:blur(18px);-webkit-backdrop-filter:blur(18px);border:1px solid rgba(255,255,255,.12);color:#fffc;cursor:pointer;transition:transform .3s cubic-bezier(.4,0,.2,1),background-color .2s ease,border-color .2s ease,color .2s ease;-webkit-user-select:none;-moz-user-select:none;user-select:none}.chat-close-btn:hover{background:#000000a6;border-color:#fff3;color:#fff;transform:translateY(-1px)}.chat-fullscreen{width:100%;height:100%;display:flex;flex-direction:column;background:transparent;position:relative}.chat-mode-pill{display:none;position:absolute;top:2.25rem;right:1.25rem;z-index:10}@media(min-width:768px){.chat-mode-pill{display:flex}}.chat-iframe{flex:1;width:100%;height:100%;border:none;background:transparent}@media(max-width:767px){.chat-iframe-mobile{height:calc(100% - var(--mobile-tab-bar-height, 72px))!important;flex:none}}.chat-placeholder{flex:1;display:flex;align-items:center;justify-content:center}.chat-placeholder-inner{text-align:center;max-width:28rem;padding:3rem;border-radius:1rem;background:#ffffff0d;backdrop-filter:blur(18px);-webkit-backdrop-filter:blur(18px);border:1px solid rgba(255,255,255,.1)}.chat-placeholder-icon{width:4rem;height:4rem;margin:0 auto 1.5rem;border-radius:9999px;background:#ffffff1a;display:flex;align-items:center;justify-content:center}.goal-card{cursor:pointer;transition:transform .3s cubic-bezier(.4,0,.2,1),box-shadow .3s ease}.goal-card:hover{transform:translateY(-2px)}.goal-card:active{transform:translateY(1px)}.goal-status-badge{display:inline-flex;align-items:center;gap:.375rem;padding:.25rem .625rem;border-radius:9999px;font-size:.75rem;font-weight:500}.goal-status-badge-not-started{background:#ffffff14;color:#ffffff80}.goal-status-badge-in-progress{background:#fb923c26;color:#fb923c}.goal-status-badge-completed{background:#4ade8026;color:#4ade80}.goal-step{padding:1rem 1.25rem;border-left:3px solid rgba(255,255,255,.1);transition:border-color .3s ease,background-color .3s ease}.goal-step-active{border-left-color:#fb923c;background:#fb923c0d}.goal-step-completed{border-left-color:#4ade80}.goal-step-pending{opacity:.5}.glass-button{position:relative;display:inline-flex;align-items:center;justify-content:center;padding-inline:1.25rem;min-height:44px;background:#0009;backdrop-filter:blur(24px);-webkit-backdrop-filter:blur(24px);box-shadow:0 8px 24px #00000073,inset 0 1px #ffffff38;border-radius:.75rem;border:none;color:#ffffffe6;transition:transform .3s cubic-bezier(.4,0,.2,1),background-color .2s ease,box-shadow .3s ease}.glass-button:active{transform:translateY(1px)}.glass-button:before{content:"";position:absolute;inset:0;border-radius:inherit;padding:2px;background:linear-gradient(135deg,rgba(0,0,0,.8),transparent);-webkit-mask:linear-gradient(#fff 0 0) content-box,linear-gradient(#fff 0 0);-webkit-mask-composite:xor;mask-composite:exclude;pointer-events:none}.glass-button:hover{transform:translateY(-2px);background:#00000059;box-shadow:0 12px 32px #0009,inset 0 1px #ffffff40}.glass-button:hover:before{background:linear-gradient(135deg,rgba(255,255,255,.3),transparent)}.tier-badge{font-size:.625rem;padding:1px 6px;border-radius:9999px;font-weight:600;text-transform:uppercase;letter-spacing:.05em;vertical-align:middle;margin-left:6px}.tier-badge-core{background:#fb923c33;color:#fb923c}.tier-badge-recommended{background:#3b82f633;color:#60a5fa}.glass-button-sm{padding-block:.375rem;padding-inline:.75rem;font-size:.875rem;min-height:36px}.toast-glass{background-color:#000000a6;backdrop-filter:blur(18px);-webkit-backdrop-filter:blur(18px);border:1px solid rgba(255,255,255,.18);box-shadow:0 8px 24px #00000073;border-radius:.75rem}.incoming-tx-badge{display:flex;align-items:center;gap:.375rem;padding:.375rem .75rem;background:#22c55e1f;border:1px solid rgba(34,197,94,.25);border-radius:9999px;font-size:.75rem;font-weight:600;color:#4ade80;cursor:pointer;transition:all .3s ease;position:relative;white-space:nowrap}.incoming-tx-badge:hover{background:#22c55e33;border-color:#22c55e66;transform:translateY(-1px)}.incoming-tx-ping{position:absolute;top:-2px;right:-2px;width:8px;height:8px;background:#4ade80;border-radius:9999px;animation:incoming-pulse 2s ease-in-out infinite}@keyframes incoming-pulse{0%,to{opacity:1;transform:scale(1)}50%{opacity:.5;transform:scale(1.5)}}.incoming-tx-row{display:flex;align-items:center;justify-content:space-between;gap:.75rem;padding:.75rem 1rem;background:#0003;cursor:pointer;transition:all .2s ease}.incoming-tx-row:hover{background:#22c55e14}.incoming-tx-icon{width:1.75rem;height:1.75rem;border-radius:.5rem;display:flex;align-items:center;justify-content:center;flex-shrink:0}.incoming-tx-icon-pending{background:#eab30826;color:#facc15}.incoming-tx-icon-confirmed{background:#22c55e26;color:#4ade80}.logo-gradient-border{position:relative;border-radius:9999px;padding:3px;background:linear-gradient(135deg,#fff9,#000c);box-shadow:0 8px 24px #00000080}.logo-gradient-border:after{content:"";position:absolute;inset:3px;border-radius:9999px;background:#000;z-index:0}.logo-gradient-border img,.logo-gradient-border svg{border-radius:9999px;display:block;position:relative;z-index:1}.path-glass-container{width:calc(100% - 48px);max-width:1200px;margin:40px auto;padding:32px;background:#000000a6;backdrop-filter:blur(40px);-webkit-backdrop-filter:blur(40px);border-radius:24px;border:1px solid rgba(255,255,255,.06);box-shadow:0 20px 60px #0000004d,inset 0 1px #ffffff1a;display:flex;flex-direction:column;gap:16px;overflow-x:hidden}.onb-scroll-container{max-height:calc(100dvh - 2rem);overflow-y:auto;overflow-x:hidden;-webkit-overflow-scrolling:touch}@media(max-width:639px){.path-glass-container{width:calc(100% - 24px);margin:12px auto;padding:12px;border-radius:20px;gap:8px}.onb-scroll-container{max-height:calc(100dvh - 1.5rem)}}.path-option-card{position:relative;background:#0009;backdrop-filter:blur(24px);-webkit-backdrop-filter:blur(24px);box-shadow:0 8px 24px #00000073,inset 0 1px #ffffff38;border-radius:16px;padding:12px 10px;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center;cursor:pointer;transition:transform .3s cubic-bezier(.4,0,.2,1),background-color .2s ease,box-shadow .3s ease;border:none}.path-option-card:active{transform:translateY(1px)}.path-option-card:before{content:"";position:absolute;inset:0;border-radius:inherit;padding:2px;background:linear-gradient(135deg,rgba(0,0,0,.8),transparent);-webkit-mask:linear-gradient(#fff 0 0) content-box,linear-gradient(#fff 0 0);-webkit-mask-composite:xor;mask-composite:exclude;pointer-events:none}.path-option-card svg{color:#ffffffd9;transition:color .2s ease,filter .3s ease;filter:drop-shadow(0 1px 1px rgba(255,255,255,.3)) drop-shadow(0 2px 4px rgba(0,0,0,.8)) drop-shadow(0 -1px 2px rgba(0,0,0,.6));stroke-width:2.5}.path-option-card:hover{transform:translateY(-2px);background:#00000059;box-shadow:0 12px 32px #0009,inset 0 1px #ffffff40}.path-option-card:hover:before{background:linear-gradient(135deg,rgba(255,255,255,.3),transparent)}.path-option-card:hover svg{color:#fff;filter:drop-shadow(0 1px 2px rgba(255,255,255,.5)) drop-shadow(0 3px 6px rgba(0,0,0,.9)) drop-shadow(0 -1px 3px rgba(0,0,0,.7))}.path-option-card--selected{background:#ffffff1f;box-shadow:0 12px 32px #0009,0 0 30px #fff3,inset 0 1px #ffffff59;transform:translateY(-2px)}.path-option-card--selected:before{background:linear-gradient(135deg,rgba(255,255,255,.6),transparent)}.path-option-card--selected svg{color:#fff;filter:drop-shadow(0 1px 2px rgba(255,255,255,.6)) drop-shadow(0 3px 8px rgba(0,0,0,1)) drop-shadow(0 0 12px rgba(255,255,255,.3))}.path-option-card--selected h3{color:#fff}.path-action-button{font-size:18px;font-weight:500;line-height:1.4;border-radius:16px;background:#00000040;color:#fffffff5;box-shadow:0 8px 24px #00000073,inset 0 1px #ffffff38;backdrop-filter:blur(24px);-webkit-backdrop-filter:blur(24px);border:none;position:relative;cursor:pointer;transition:transform .3s cubic-bezier(.4,0,.2,1),background-color .2s ease,box-shadow .3s ease;min-width:0;white-space:nowrap;letter-spacing:.02em}.path-action-button:active{transform:translateY(1px)}.path-action-button--skip{padding:12px 40px;font-size:16px}.path-action-button--skip:before{display:none}.path-action-button--continue{padding:16px 40px;font-size:18px;font-weight:600}@media(max-width:639px){.path-action-button{font-size:15px;border-radius:14px}.path-action-button--skip{padding:10px 24px;font-size:14px}.path-action-button--continue{padding:12px 28px;font-size:15px}}.path-action-button:before{content:"";position:absolute;inset:0;border-radius:inherit;padding:2px;background:linear-gradient(135deg,rgba(0,0,0,.8),transparent);-webkit-mask:linear-gradient(#fff 0 0) content-box,linear-gradient(#fff 0 0);-webkit-mask-composite:xor;mask-composite:exclude;pointer-events:none}.path-action-button:hover{transform:translateY(-2px);background:#00000059;box-shadow:0 12px 32px #0009,inset 0 1px #ffffff40}.path-action-button:hover:before{background:linear-gradient(135deg,rgba(255,255,255,.3),transparent)}.path-action-button:active{background:#0000008c;transform:translateY(1px)}.nav-tab-active{position:relative;background:#00000059!important;box-shadow:0 6px 16px #0009,inset 0 1px #ffffff40!important;color:#fff!important;font-weight:600!important}.nav-tab-active:before{content:"";position:absolute;inset:0;border-radius:inherit;padding:2px;background:linear-gradient(135deg,rgba(255,255,255,.3),transparent);-webkit-mask:linear-gradient(#fff 0 0) content-box,linear-gradient(#fff 0 0);-webkit-mask-composite:xor;mask-composite:exclude;pointer-events:none}.sidebar-nav-item{transition:transform .2s ease,box-shadow .2s ease}.sidebar-nav-item:focus-visible{transform:scale(1.02)!important;box-shadow:0 0 24px #78b4ff26,0 0 48px #64a0ff14,inset 0 0 24px #ffffff08!important}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.pointer-events-none{pointer-events:none}.pointer-events-auto{pointer-events:auto}.visible{visibility:visible}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{inset:0}.inset-\[3px\]{inset:3px}.inset-y-0{top:0;bottom:0}.-top-10{top:-2.5rem}.-top-8{top:-32px}.bottom-0{bottom:0}.bottom-2{bottom:8px}.bottom-20{bottom:5rem}.bottom-24{bottom:6rem}.bottom-4{bottom:16px}.bottom-8{bottom:32px}.bottom-\[80px\]{bottom:80px}.left-0{left:0}.left-1\/2{left:50%}.left-4{left:16px}.right-0{right:0}.right-4{right:16px}.right-8{right:32px}.top-0{top:0}.top-1{top:4px}.top-2{top:8px}.top-20{top:5rem}.top-4{top:16px}.top-full{top:100%}.z-10{z-index:10}.z-20{z-index:20}.z-40{z-index:40}.z-50{z-index:50}.z-\[100\]{z-index:100}.z-\[15\]{z-index:15}.z-\[2000\]{z-index:2000}.z-\[200\]{z-index:200}.z-\[2400\]{z-index:2400}.z-\[2500\]{z-index:2500}.z-\[3000\]{z-index:3000}.z-\[3100\]{z-index:3100}.z-\[9998\]{z-index:9998}.z-\[9999\]{z-index:9999}.z-\[99\]{z-index:99}.col-span-2{grid-column:span 2 / span 2}.m-5{margin:20px}.mx-1{margin-left:4px;margin-right:4px}.mx-4{margin-left:16px;margin-right:16px}.mx-6{margin-left:24px;margin-right:24px}.mx-auto{margin-left:auto;margin-right:auto}.-mr-1{margin-right:-4px}.-mt-1{margin-top:-4px}.mb-0\.5{margin-bottom:.125rem}.mb-1{margin-bottom:4px}.mb-1\.5{margin-bottom:.375rem}.mb-2{margin-bottom:8px}.mb-3{margin-bottom:12px}.mb-4{margin-bottom:16px}.mb-5{margin-bottom:20px}.mb-6{margin-bottom:24px}.mb-8{margin-bottom:32px}.ml-1{margin-left:4px}.ml-1\.5{margin-left:.375rem}.ml-2{margin-left:8px}.ml-3{margin-left:12px}.ml-7{margin-left:28px}.ml-auto{margin-left:auto}.mr-1{margin-right:4px}.mr-1\.5{margin-right:.375rem}.mr-2{margin-right:8px}.mr-3{margin-right:12px}.mt-0\.5{margin-top:.125rem}.mt-1{margin-top:4px}.mt-1\.5{margin-top:.375rem}.mt-2{margin-top:8px}.mt-3{margin-top:12px}.mt-4{margin-top:16px}.mt-5{margin-top:20px}.mt-6{margin-top:24px}.mt-8{margin-top:32px}.mt-auto{margin-top:auto}.line-clamp-2{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2}.line-clamp-3{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:3}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.grid{display:grid}.contents{display:contents}.hidden{display:none}.aspect-\[4\/3\]{aspect-ratio:4/3}.aspect-square{aspect-ratio:1 / 1}.aspect-video{aspect-ratio:16 / 9}.h-1\.5{height:.375rem}.h-10{height:2.5rem}.h-12{height:3rem}.h-14{height:3.5rem}.h-16{height:4rem}.h-2{height:8px}.h-2\.5{height:.625rem}.h-20{height:5rem}.h-24{height:6rem}.h-3{height:12px}.h-3\.5{height:.875rem}.h-32{height:8rem}.h-4{height:16px}.h-48{height:12rem}.h-5{height:20px}.h-6{height:24px}.h-7{height:28px}.h-8{height:32px}.h-9{height:2.25rem}.h-auto{height:auto}.h-full{height:100%}.max-h-48{max-height:12rem}.max-h-64{max-height:16rem}.max-h-72{max-height:18rem}.max-h-96{max-height:24rem}.max-h-\[50vh\]{max-height:50vh}.max-h-\[60vh\]{max-height:60vh}.max-h-\[80vh\]{max-height:80vh}.max-h-\[90vh\]{max-height:90vh}.max-h-full{max-height:100%}.min-h-0{min-height:0px}.min-h-\[200px\]{min-height:200px}.min-h-\[4\.5rem\]{min-height:4.5rem}.min-h-\[40vh\]{min-height:40vh}.min-h-\[44px\]{min-height:44px}.min-h-full{min-height:100%}.min-h-screen{min-height:100vh}.w-1{width:4px}.w-1\.5{width:.375rem}.w-1\/2{width:50%}.w-1\/3{width:33.333333%}.w-10{width:2.5rem}.w-12{width:3rem}.w-14{width:3.5rem}.w-16{width:4rem}.w-2{width:8px}.w-2\.5{width:.625rem}.w-2\/3{width:66.666667%}.w-20{width:5rem}.w-24{width:6rem}.w-3{width:12px}.w-3\.5{width:.875rem}.w-3\/4{width:75%}.w-32{width:8rem}.w-4{width:16px}.w-48{width:12rem}.w-5{width:20px}.w-6{width:24px}.w-7{width:28px}.w-8{width:32px}.w-9{width:2.25rem}.w-\[256px\]{width:256px}.w-\[min\(80vw\,900px\)\]{width:min(80vw,900px)}.w-auto{width:auto}.w-fit{width:-moz-fit-content;width:fit-content}.w-full{width:100%}.min-w-0{min-width:0px}.min-w-\[160px\]{min-width:160px}.max-w-2xl{max-width:42rem}.max-w-\[100px\]{max-width:100px}.max-w-\[1200px\]{max-width:1200px}.max-w-\[200px\]{max-width:200px}.max-w-\[600px\]{max-width:600px}.max-w-\[700px\]{max-width:700px}.max-w-\[800px\]{max-width:800px}.max-w-\[90vw\]{max-width:90vw}.max-w-\[95vw\]{max-width:95vw}.max-w-full{max-width:100%}.max-w-lg{max-width:32rem}.max-w-md{max-width:28rem}.max-w-none{max-width:none}.max-w-sm{max-width:24rem}.flex-1{flex:1 1 0%}.flex-none{flex:none}.flex-shrink{flex-shrink:1}.flex-shrink-0,.shrink-0{flex-shrink:0}.grow{flex-grow:1}.-translate-x-1\/2{--tw-translate-x: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-1{--tw-translate-x: 4px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-5{--tw-translate-x: 20px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-7{--tw-translate-x: 28px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rotate-180{--tw-rotate: 180deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.scale-110{--tw-scale-x: 1.1;--tw-scale-y: 1.1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes ping{75%,to{transform:scale(2);opacity:0}}.animate-ping{animation:ping 1s cubic-bezier(0,0,.2,1) infinite}@keyframes pulse{50%{opacity:.5}}.animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}@keyframes spin{to{transform:rotate(360deg)}}.animate-spin{animation:spin 1s linear infinite}.cursor-default{cursor:default}.cursor-grab{cursor:grab}.cursor-grabbing{cursor:grabbing}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.select-all{-webkit-user-select:all;-moz-user-select:all;user-select:all}.resize-none{resize:none}.resize{resize:both}.scroll-mt-24{scroll-margin-top:6rem}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-\[80px_1fr\]{grid-template-columns:80px 1fr}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.justify-around{justify-content:space-around}.gap-0\.5{gap:.125rem}.gap-1{gap:4px}.gap-1\.5{gap:.375rem}.gap-2{gap:8px}.gap-3{gap:12px}.gap-4{gap:16px}.gap-5{gap:20px}.gap-6{gap:24px}.space-y-0\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.125rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.125rem * var(--tw-space-y-reverse))}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(4px * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(4px * var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(8px * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(8px * var(--tw-space-y-reverse))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(12px * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(12px * var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(16px * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(16px * var(--tw-space-y-reverse))}.space-y-5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(20px * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(20px * var(--tw-space-y-reverse))}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(24px * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(24px * var(--tw-space-y-reverse))}.divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse: 0;border-top-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(1px * var(--tw-divide-y-reverse))}.divide-white\/5>:not([hidden])~:not([hidden]){border-color:#ffffff0d}.overflow-hidden{overflow:hidden}.overflow-visible{overflow:visible}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-line{white-space:pre-line}.whitespace-pre-wrap{white-space:pre-wrap}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:1rem}.rounded-\[10px\]{border-radius:10px}.rounded-\[6px\]{border-radius:6px}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.rounded-none{border-radius:0}.rounded-sm{border-radius:.125rem}.rounded-xl{border-radius:.75rem}.rounded-b-lg{border-bottom-right-radius:.5rem;border-bottom-left-radius:.5rem}.rounded-t-3xl{border-top-left-radius:1.5rem;border-top-right-radius:1.5rem}.rounded-t-lg{border-top-left-radius:.5rem;border-top-right-radius:.5rem}.border{border-width:1px}.border-0{border-width:0px}.border-2{border-width:2px}.border-b{border-bottom-width:1px}.border-b-2{border-bottom-width:2px}.border-l{border-left-width:1px}.border-l-2{border-left-width:2px}.border-l-4{border-left-width:4px}.border-t{border-top-width:1px}.border-none{border-style:none}.border-blue-500{--tw-border-opacity: 1;border-color:rgb(59 130 246 / var(--tw-border-opacity, 1))}.border-blue-500\/20{border-color:#3b82f633}.border-blue-500\/30{border-color:#3b82f64d}.border-blue-500\/50{border-color:#3b82f680}.border-glass-border{border-color:#ffffff2e}.border-gray-500\/30{border-color:#6b72804d}.border-green-400{--tw-border-opacity: 1;border-color:rgb(74 222 128 / var(--tw-border-opacity, 1))}.border-green-500{--tw-border-opacity: 1;border-color:rgb(34 197 94 / var(--tw-border-opacity, 1))}.border-green-500\/15{border-color:#22c55e26}.border-green-500\/20{border-color:#22c55e33}.border-green-500\/30{border-color:#22c55e4d}.border-green-500\/40{border-color:#22c55e66}.border-orange-400{--tw-border-opacity: 1;border-color:rgb(251 146 60 / var(--tw-border-opacity, 1))}.border-orange-400\/30{border-color:#fb923c4d}.border-orange-500{--tw-border-opacity: 1;border-color:rgb(249 115 22 / var(--tw-border-opacity, 1))}.border-orange-500\/20{border-color:#f9731633}.border-orange-500\/30{border-color:#f973164d}.border-orange-500\/40{border-color:#f9731666}.border-orange-500\/50{border-color:#f9731680}.border-red-400\/20{border-color:#f8717133}.border-red-400\/30{border-color:#f871714d}.border-red-500{--tw-border-opacity: 1;border-color:rgb(239 68 68 / var(--tw-border-opacity, 1))}.border-red-500\/10{border-color:#ef44441a}.border-red-500\/20{border-color:#ef444433}.border-red-500\/30{border-color:#ef44444d}.border-red-500\/40{border-color:#ef444466}.border-red-500\/50{border-color:#ef444480}.border-red-600\/40{border-color:#dc262666}.border-transparent{border-color:transparent}.border-white\/10{border-color:#ffffff1a}.border-white\/15{border-color:#ffffff26}.border-white\/20{border-color:#fff3}.border-white\/25{border-color:#ffffff40}.border-white\/30{border-color:#ffffff4d}.border-white\/40{border-color:#fff6}.border-white\/60{border-color:#fff9}.border-yellow-500{--tw-border-opacity: 1;border-color:rgb(234 179 8 / var(--tw-border-opacity, 1))}.border-yellow-500\/30{border-color:#eab3084d}.border-yellow-500\/40{border-color:#eab30866}.border-t-orange-400{--tw-border-opacity: 1;border-top-color:rgb(251 146 60 / var(--tw-border-opacity, 1))}.border-t-transparent{border-top-color:transparent}.border-t-white\/80{border-top-color:#fffc}.bg-amber-400{--tw-bg-opacity: 1;background-color:rgb(251 191 36 / var(--tw-bg-opacity, 1))}.bg-amber-500\/10{background-color:#f59e0b1a}.bg-amber-500\/15{background-color:#f59e0b26}.bg-amber-500\/20{background-color:#f59e0b33}.bg-black{--tw-bg-opacity: 1;background-color:rgb(0 0 0 / var(--tw-bg-opacity, 1))}.bg-black\/10{background-color:#0000001a}.bg-black\/20{background-color:#0003}.bg-black\/30{background-color:#0000004d}.bg-black\/40{background-color:#0006}.bg-black\/50{background-color:#00000080}.bg-black\/60{background-color:#0009}.bg-black\/70{background-color:#000000b3}.bg-black\/80{background-color:#000c}.bg-black\/90{background-color:#000000e6}.bg-blue-400{--tw-bg-opacity: 1;background-color:rgb(96 165 250 / var(--tw-bg-opacity, 1))}.bg-blue-400\/20{background-color:#60a5fa33}.bg-blue-500\/10{background-color:#3b82f61a}.bg-blue-500\/15{background-color:#3b82f626}.bg-blue-500\/20{background-color:#3b82f633}.bg-blue-500\/30{background-color:#3b82f64d}.bg-blue-600{--tw-bg-opacity: 1;background-color:rgb(37 99 235 / var(--tw-bg-opacity, 1))}.bg-emerald-500\/10{background-color:#10b9811a}.bg-emerald-500\/15{background-color:#10b98126}.bg-gray-400{--tw-bg-opacity: 1;background-color:rgb(156 163 175 / var(--tw-bg-opacity, 1))}.bg-gray-500{--tw-bg-opacity: 1;background-color:rgb(107 114 128 / var(--tw-bg-opacity, 1))}.bg-gray-500\/20{background-color:#6b728033}.bg-green-400{--tw-bg-opacity: 1;background-color:rgb(74 222 128 / var(--tw-bg-opacity, 1))}.bg-green-400\/20{background-color:#4ade8033}.bg-green-400\/30{background-color:#4ade804d}.bg-green-500{--tw-bg-opacity: 1;background-color:rgb(34 197 94 / var(--tw-bg-opacity, 1))}.bg-green-500\/10{background-color:#22c55e1a}.bg-green-500\/15{background-color:#22c55e26}.bg-green-500\/20{background-color:#22c55e33}.bg-green-500\/90{background-color:#22c55ee6}.bg-green-600{--tw-bg-opacity: 1;background-color:rgb(22 163 74 / var(--tw-bg-opacity, 1))}.bg-orange-400{--tw-bg-opacity: 1;background-color:rgb(251 146 60 / var(--tw-bg-opacity, 1))}.bg-orange-400\/20{background-color:#fb923c33}.bg-orange-400\/40{background-color:#fb923c66}.bg-orange-500{--tw-bg-opacity: 1;background-color:rgb(249 115 22 / var(--tw-bg-opacity, 1))}.bg-orange-500\/10{background-color:#f973161a}.bg-orange-500\/15{background-color:#f9731626}.bg-orange-500\/20{background-color:#f9731633}.bg-orange-500\/30{background-color:#f973164d}.bg-pink-500\/15{background-color:#ec489926}.bg-purple-400{--tw-bg-opacity: 1;background-color:rgb(192 132 252 / var(--tw-bg-opacity, 1))}.bg-purple-500\/10{background-color:#a855f71a}.bg-purple-500\/15{background-color:#a855f726}.bg-purple-500\/20{background-color:#a855f733}.bg-purple-500\/30{background-color:#a855f74d}.bg-red-400{--tw-bg-opacity: 1;background-color:rgb(248 113 113 / var(--tw-bg-opacity, 1))}.bg-red-400\/10{background-color:#f871711a}.bg-red-400\/20{background-color:#f8717133}.bg-red-400\/60{background-color:#f8717199}.bg-red-500{--tw-bg-opacity: 1;background-color:rgb(239 68 68 / var(--tw-bg-opacity, 1))}.bg-red-500\/10{background-color:#ef44441a}.bg-red-500\/15{background-color:#ef444426}.bg-red-500\/20{background-color:#ef444433}.bg-red-500\/5{background-color:#ef44440d}.bg-red-500\/90{background-color:#ef4444e6}.bg-red-600\/20{background-color:#dc262633}.bg-red-600\/80{background-color:#dc2626cc}.bg-transparent{background-color:transparent}.bg-white{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.bg-white\/10{background-color:#ffffff1a}.bg-white\/15{background-color:#ffffff26}.bg-white\/20{background-color:#fff3}.bg-white\/30{background-color:#ffffff4d}.bg-white\/40{background-color:#fff6}.bg-white\/5{background-color:#ffffff0d}.bg-white\/70{background-color:#ffffffb3}.bg-white\/80{background-color:#fffc}.bg-white\/\[0\.03\]{background-color:#ffffff08}.bg-yellow-400{--tw-bg-opacity: 1;background-color:rgb(250 204 21 / var(--tw-bg-opacity, 1))}.bg-yellow-400\/20{background-color:#facc1533}.bg-yellow-500\/10{background-color:#eab3081a}.bg-yellow-500\/15{background-color:#eab30826}.bg-yellow-500\/20{background-color:#eab30833}.bg-gradient-to-r{background-image:linear-gradient(to right,var(--tw-gradient-stops))}.from-blue-500{--tw-gradient-from: #3b82f6 var(--tw-gradient-from-position);--tw-gradient-to: rgb(59 130 246 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.from-green-500{--tw-gradient-from: #22c55e var(--tw-gradient-from-position);--tw-gradient-to: rgb(34 197 94 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.from-orange-500{--tw-gradient-from: #f97316 var(--tw-gradient-from-position);--tw-gradient-to: rgb(249 115 22 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.from-red-500{--tw-gradient-from: #ef4444 var(--tw-gradient-from-position);--tw-gradient-to: rgb(239 68 68 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.to-blue-400{--tw-gradient-to: #60a5fa var(--tw-gradient-to-position)}.to-green-400{--tw-gradient-to: #4ade80 var(--tw-gradient-to-position)}.to-orange-400{--tw-gradient-to: #fb923c var(--tw-gradient-to-position)}.to-red-400{--tw-gradient-to: #f87171 var(--tw-gradient-to-position)}.object-contain{-o-object-fit:contain;object-fit:contain}.object-cover{-o-object-fit:cover;object-fit:cover}.p-0{padding:0}.p-0\.5{padding:.125rem}.p-1{padding:4px}.p-1\.5{padding:.375rem}.p-12{padding:3rem}.p-2{padding:8px}.p-3{padding:12px}.p-4{padding:16px}.p-5{padding:20px}.p-6{padding:24px}.p-8{padding:32px}.px-1{padding-left:4px;padding-right:4px}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.px-2{padding-left:8px;padding-right:8px}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.px-3{padding-left:12px;padding-right:12px}.px-4{padding-left:16px;padding-right:16px}.px-5{padding-left:20px;padding-right:20px}.px-6{padding-left:24px;padding-right:24px}.px-8{padding-left:32px;padding-right:32px}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:4px;padding-bottom:4px}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-10{padding-top:2.5rem;padding-bottom:2.5rem}.py-12{padding-top:3rem;padding-bottom:3rem}.py-16{padding-top:4rem;padding-bottom:4rem}.py-2{padding-top:8px;padding-bottom:8px}.py-2\.5{padding-top:.625rem;padding-bottom:.625rem}.py-3{padding-top:12px;padding-bottom:12px}.py-4{padding-top:16px;padding-bottom:16px}.py-6{padding-top:24px;padding-bottom:24px}.py-8{padding-top:32px;padding-bottom:32px}.pb-0{padding-bottom:0}.pb-1\.5{padding-bottom:.375rem}.pb-16{padding-bottom:4rem}.pb-2{padding-bottom:8px}.pb-4{padding-bottom:16px}.pb-6{padding-bottom:24px}.pb-8{padding-bottom:32px}.pl-1{padding-left:4px}.pl-12{padding-left:3rem}.pl-4{padding-left:16px}.pt-16{padding-top:4rem}.pt-2{padding-top:8px}.pt-20{padding-top:5rem}.pt-3{padding-top:12px}.pt-4{padding-top:16px}.pt-5{padding-top:20px}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.font-archipelago{font-family:Montserrat,sans-serif}.font-mono{font-family:Courier New,monospace}.text-2xl{font-size:1.5rem;line-height:2rem}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-6xl{font-size:3.75rem;line-height:1}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[15px\]{font-size:15px}.text-\[20px\]{font-size:20px}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-extrabold{font-weight:800}.font-medium{font-weight:500}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.capitalize{text-transform:capitalize}.italic{font-style:italic}.tabular-nums{--tw-numeric-spacing: tabular-nums;font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)}.leading-relaxed{line-height:1.625}.leading-snug{line-height:1.375}.leading-tight{line-height:1.25}.tracking-\[0\.5em\]{letter-spacing:.5em}.tracking-wide{letter-spacing:.025em}.tracking-wider{letter-spacing:.05em}.tracking-widest{letter-spacing:.1em}.text-\[\#fbbf24\]{--tw-text-opacity: 1;color:rgb(251 191 36 / var(--tw-text-opacity, 1))}.text-amber-200{--tw-text-opacity: 1;color:rgb(253 230 138 / var(--tw-text-opacity, 1))}.text-amber-300\/80{color:#fcd34dcc}.text-amber-300\/90{color:#fcd34de6}.text-amber-400{--tw-text-opacity: 1;color:rgb(251 191 36 / var(--tw-text-opacity, 1))}.text-amber-400\/70{color:#fbbf24b3}.text-amber-400\/80{color:#fbbf24cc}.text-amber-400\/90{color:#fbbf24e6}.text-black{--tw-text-opacity: 1;color:rgb(0 0 0 / var(--tw-text-opacity, 1))}.text-blue-200{--tw-text-opacity: 1;color:rgb(191 219 254 / var(--tw-text-opacity, 1))}.text-blue-300{--tw-text-opacity: 1;color:rgb(147 197 253 / var(--tw-text-opacity, 1))}.text-blue-300\/80{color:#93c5fdcc}.text-blue-400{--tw-text-opacity: 1;color:rgb(96 165 250 / var(--tw-text-opacity, 1))}.text-blue-400\/70{color:#60a5fab3}.text-emerald-400{--tw-text-opacity: 1;color:rgb(52 211 153 / var(--tw-text-opacity, 1))}.text-emerald-400\/70{color:#34d399b3}.text-gray-200{--tw-text-opacity: 1;color:rgb(229 231 235 / var(--tw-text-opacity, 1))}.text-gray-400{--tw-text-opacity: 1;color:rgb(156 163 175 / var(--tw-text-opacity, 1))}.text-green-200{--tw-text-opacity: 1;color:rgb(187 247 208 / var(--tw-text-opacity, 1))}.text-green-300{--tw-text-opacity: 1;color:rgb(134 239 172 / var(--tw-text-opacity, 1))}.text-green-400{--tw-text-opacity: 1;color:rgb(74 222 128 / var(--tw-text-opacity, 1))}.text-green-400\/60{color:#4ade8099}.text-green-400\/70{color:#4ade80b3}.text-green-400\/90{color:#4ade80e6}.text-orange-300{--tw-text-opacity: 1;color:rgb(253 186 116 / var(--tw-text-opacity, 1))}.text-orange-400{--tw-text-opacity: 1;color:rgb(251 146 60 / var(--tw-text-opacity, 1))}.text-orange-400\/70{color:#fb923cb3}.text-orange-400\/80{color:#fb923ccc}.text-orange-500{--tw-text-opacity: 1;color:rgb(249 115 22 / var(--tw-text-opacity, 1))}.text-pink-400{--tw-text-opacity: 1;color:rgb(244 114 182 / var(--tw-text-opacity, 1))}.text-purple-300{--tw-text-opacity: 1;color:rgb(216 180 254 / var(--tw-text-opacity, 1))}.text-purple-300\/80{color:#d8b4fecc}.text-purple-400{--tw-text-opacity: 1;color:rgb(192 132 252 / var(--tw-text-opacity, 1))}.text-purple-400\/70{color:#c084fcb3}.text-red-200{--tw-text-opacity: 1;color:rgb(254 202 202 / var(--tw-text-opacity, 1))}.text-red-200\/70{color:#fecacab3}.text-red-300{--tw-text-opacity: 1;color:rgb(252 165 165 / var(--tw-text-opacity, 1))}.text-red-300\/40{color:#fca5a566}.text-red-300\/60{color:#fca5a599}.text-red-300\/80{color:#fca5a5cc}.text-red-400{--tw-text-opacity: 1;color:rgb(248 113 113 / var(--tw-text-opacity, 1))}.text-red-400\/60{color:#f8717199}.text-red-400\/70{color:#f87171b3}.text-red-400\/80{color:#f87171cc}.text-red-400\/90{color:#f87171e6}.text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.text-white\/10{color:#ffffff1a}.text-white\/15{color:#ffffff26}.text-white\/20{color:#fff3}.text-white\/25{color:#ffffff40}.text-white\/30{color:#ffffff4d}.text-white\/35{color:#ffffff59}.text-white\/40{color:#fff6}.text-white\/50{color:#ffffff80}.text-white\/55{color:#ffffff8c}.text-white\/60{color:#fff9}.text-white\/70{color:#ffffffb3}.text-white\/75{color:#ffffffbf}.text-white\/80{color:#fffc}.text-white\/90{color:#ffffffe6}.text-white\/95{color:#fffffff2}.text-yellow-200{--tw-text-opacity: 1;color:rgb(254 240 138 / var(--tw-text-opacity, 1))}.text-yellow-300{--tw-text-opacity: 1;color:rgb(253 224 71 / var(--tw-text-opacity, 1))}.text-yellow-400{--tw-text-opacity: 1;color:rgb(250 204 21 / var(--tw-text-opacity, 1))}.text-yellow-400\/70{color:#facc15b3}.underline{text-decoration-line:underline}.no-underline{text-decoration-line:none}.underline-offset-2{text-underline-offset:2px}.placeholder-white\/30::-moz-placeholder{color:#ffffff4d}.placeholder-white\/30::placeholder{color:#ffffff4d}.placeholder-white\/40::-moz-placeholder{color:#fff6}.placeholder-white\/40::placeholder{color:#fff6}.placeholder-white\/50::-moz-placeholder{color:#ffffff80}.placeholder-white\/50::placeholder{color:#ffffff80}.accent-orange-400{accent-color:#fb923c}.opacity-0{opacity:0}.opacity-100{opacity:1}.opacity-25{opacity:.25}.opacity-40{opacity:.4}.opacity-50{opacity:.5}.opacity-75{opacity:.75}.opacity-90{opacity:.9}.shadow{--tw-shadow: 0 1px 3px 0 rgb(0 0 0 / .1), 0 1px 2px -1px rgb(0 0 0 / .1);--tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-2xl{--tw-shadow: 0 25px 50px -12px rgb(0 0 0 / .25);--tw-shadow-colored: 0 25px 50px -12px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-glass{--tw-shadow: 0 8px 24px rgba(0, 0, 0, .45);--tw-shadow-colored: 0 8px 24px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-lg{--tw-shadow: 0 10px 15px -3px rgb(0 0 0 / .1), 0 4px 6px -4px rgb(0 0 0 / .1);--tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-xl{--tw-shadow: 0 20px 25px -5px rgb(0 0 0 / .1), 0 8px 10px -6px rgb(0 0 0 / .1);--tw-shadow-colored: 0 20px 25px -5px var(--tw-shadow-color), 0 8px 10px -6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.outline-none{outline:2px solid transparent;outline-offset:2px}.outline{outline-style:solid}.ring{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.ring-1{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.ring-2{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.ring-orange-400\/50{--tw-ring-color: rgb(251 146 60 / .5)}.ring-orange-400\/60{--tw-ring-color: rgb(251 146 60 / .6)}.ring-white\/20{--tw-ring-color: rgb(255 255 255 / .2)}.blur{--tw-blur: blur(8px);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.drop-shadow{--tw-drop-shadow: drop-shadow(0 1px 2px rgb(0 0 0 / .1)) drop-shadow(0 1px 1px rgb(0 0 0 / .06));filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.drop-shadow-\[0_2px_6px_rgba\(0\,0\,0\,0\.4\)\]{--tw-drop-shadow: drop-shadow(0 2px 6px rgba(0,0,0,.4));filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.drop-shadow-\[0_2px_8px_rgba\(0\,0\,0\,0\.6\)\]{--tw-drop-shadow: drop-shadow(0 2px 8px rgba(0,0,0,.6));filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.drop-shadow-\[0_6px_24px_rgba\(0\,0\,0\,0\.35\)\]{--tw-drop-shadow: drop-shadow(0 6px 24px rgba(0,0,0,.35));filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.backdrop-blur-2xl{--tw-backdrop-blur: blur(40px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.backdrop-blur-\[10px\]{--tw-backdrop-blur: blur(10px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.backdrop-blur-lg{--tw-backdrop-blur: blur(16px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.backdrop-blur-md{--tw-backdrop-blur: blur(12px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.backdrop-blur-sm{--tw-backdrop-blur: blur(4px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.backdrop-blur-xl{--tw-backdrop-blur: blur(24px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.backdrop-filter{-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-200{transition-duration:.2s}.duration-300{transition-duration:.3s}.duration-500{transition-duration:.5s}.ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}.ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)}@font-face{font-family:Montserrat;src:url(/assets/fonts/Montserrat/Montserrat-Bold.ttf) format("truetype");font-weight:700;font-style:normal}@font-face{font-family:Montserrat;src:url(/assets/fonts/Montserrat/Montserrat-ExtraBold.ttf) format("truetype");font-weight:800;font-style:normal}.skip-to-content{position:absolute;left:-9999px;top:auto;width:1px;height:1px;overflow:hidden;z-index:9999}.skip-to-content:focus{position:fixed;top:12px;left:50%;transform:translate(-50%);width:auto;height:auto;overflow:visible;padding:8px 24px;background:#000000d9;color:#fff;border:1px solid rgba(255,255,255,.3);border-radius:8px;font-size:14px;font-weight:500;text-decoration:none;-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px)}*:focus-visible{outline:none;box-shadow:0 0 16px #78b4ff33,0 0 32px #64a0ff1a;transition:box-shadow .2s ease}@media(max-width:767px){button:not(.mode-switcher-btn):not(.sidebar-nav-item):not([class*=w-9]):not([class*=w-8]):not([class*=w-7]){min-height:44px}}.mobile-scroll-pad,.mobile-scroll-pad-back{padding-bottom:6rem}@media(max-width:767px){.mobile-scroll-pad{padding-bottom:calc(var(--mobile-tab-bar-height, 88px) + env(safe-area-inset-bottom,0px) + 16px)}.mobile-scroll-pad-back{padding-bottom:calc(var(--mobile-tab-bar-height, 88px) + env(safe-area-inset-bottom,0px) + 64px)}}button:active:not(:disabled),[role=button]:active,a.glass-card:active,a.goal-card:active,.info-card-button:active,.path-action-button:active{transform:scale(.97)!important;transition:transform .1s ease!important}input[type=checkbox]:active+*,input[type=radio]:active+*{transform:scale(.95);transition:transform .1s ease}[data-controller-container]{transition:transform .2s ease,box-shadow .2s ease}[data-controller-container]:focus-visible{transform:scale(1.02);box-shadow:0 0 24px #78b4ff26,0 0 48px #64a0ff14,inset 0 0 24px #ffffff08}body{margin:0;font-family:Avenir Next,system-ui,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;background:#000;color:#fff;min-height:100vh;min-height:100dvh}#app{min-height:100vh;min-height:100dvh}.custom-scrollbar::-webkit-scrollbar{width:10px}.custom-scrollbar::-webkit-scrollbar-track{background:#0003;border-radius:10px}.custom-scrollbar::-webkit-scrollbar-thumb{background:linear-gradient(180deg,#ffffff4d,#ffffff1a);border-radius:10px;border:2px solid rgba(0,0,0,.2)}.custom-scrollbar::-webkit-scrollbar-thumb:hover{background:linear-gradient(180deg,#fff6,#fff3)}.scrollbar-hide,.overflow-y-auto,.overflow-auto,.overflow-y-scroll,.iframe-scrollbar-hide{-ms-overflow-style:none;scrollbar-width:none}.scrollbar-hide::-webkit-scrollbar,.overflow-y-auto::-webkit-scrollbar,.overflow-auto::-webkit-scrollbar,.overflow-y-scroll::-webkit-scrollbar,.iframe-scrollbar-hide::-webkit-scrollbar{display:none}iframe.iframe-scrollbar-hide{-ms-overflow-style:none;scrollbar-width:none}@keyframes fadeUpIn{0%{opacity:0;transform:translateY(28px)}to{opacity:1;transform:translateY(0)}}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}@keyframes fadeOut{0%{opacity:1}to{opacity:0}}@keyframes caretBlink{0%,to{border-right-color:#0ff}50%{border-right-color:transparent}}.animate-fade-up{animation:fadeUpIn .9s cubic-bezier(.22,1,.36,1) .12s both}.animate-fade-in{animation:fadeIn .5s ease forwards}.animate-fade-out{animation:fadeOut .8s ease forwards}.typing-text{display:inline-block;overflow:hidden;white-space:nowrap;max-width:0;border-right:4px solid #fbbf24;animation:typing 2s steps(30,end) forwards,caretBlink .5s step-end 3 2.6s}@keyframes typing{0%{max-width:0}to{max-width:100%}}@keyframes caretBlink{0%,to{border-right-color:#fbbf24}50%{border-right-color:transparent}}.splash-complete .login-card{animation:fadeUpIn .9s cubic-bezier(.22,1,.36,1) .12s both}body:before,body:after,html:before{content:"";position:fixed;inset:0;pointer-events:none;z-index:0;opacity:0}body:before{background-image:url(/assets/img/bg.jpg);background-size:auto 100vh;background-position:center top;background-attachment:fixed;mix-blend-mode:multiply;filter:brightness(.4) contrast(1.2);will-change:transform,clip-path,opacity;animation:bg-glitch-shift-repeat 5s steps(10,end) infinite;animation-delay:1.5s;animation-fill-mode:backwards}html:before{background-image:url(/assets/img/bg.jpg);background-size:auto 100vh;background-position:center top;background-attachment:fixed;mix-blend-mode:multiply;filter:brightness(.3) contrast(1.3);will-change:transform,clip-path,opacity;animation:bg-glitch-shift-2-repeat 5s steps(9,end) infinite;animation-delay:1.6s;animation-fill-mode:backwards}body:after{background:linear-gradient(180deg,#00000014,#0000 60%),repeating-linear-gradient(180deg,#00000005 0 2px,#0000 2px 4px),radial-gradient(ellipse at center,#0000 40%,#00000026);will-change:transform,opacity;animation:bg-glitch-scan-repeat 5s ease-out infinite;animation-delay:1.5s;animation-fill-mode:backwards}body.dashboard-active{overflow-x:hidden;width:100%}body.dashboard-active .dashboard-view .bg-perspective-container{left:0!important;right:0!important;width:100%!important;min-width:100%!important}.dashboard-view~body:before,.dashboard-view~body:after,.dashboard-view~html:before{animation:none!important;opacity:0!important}body:has(.dashboard-view):before,body:has(.dashboard-view):after,html:has(.dashboard-view):before{animation:none!important;opacity:0!important}body.video-background-active:before,body.video-background-active:after,html:has(body.video-background-active):before{animation:none!important;opacity:0!important;display:none!important}@keyframes bg-glitch-shift-repeat{0%,82%{transform:translate(0);clip-path:inset(0% 0 0 0);opacity:0}82.1%{opacity:.08}84%{transform:translate(3px,-1px);clip-path:inset(8% 0 70% 0)}86%{transform:translate(-3px,1px);clip-path:inset(42% 0 40% 0)}88%{transform:translate(2px);clip-path:inset(68% 0 10% 0)}91%{transform:translate(-2px,2px);clip-path:inset(18% 0 60% 0)}93%{transform:translate(3px,-2px);clip-path:inset(55% 0 20% 0)}95%{transform:translate(-2px,1px);clip-path:inset(10% 0 80% 0)}to{transform:translate(0);clip-path:inset(0% 0 0 0);opacity:0}}@keyframes bg-glitch-scan-repeat{0%,82%{opacity:0;transform:translateY(-20%)}84%{opacity:.15}90%{opacity:.1}to{opacity:0;transform:translateY(115%)}}@keyframes bg-glitch-shift-2-repeat{0%,82%{transform:translate(0);clip-path:inset(0% 0 0 0);opacity:0}82.1%{opacity:.06}84%{transform:translate(-3px,1px);clip-path:inset(12% 0 65% 0)}86%{transform:translate(3px,-1px) skew(.3deg);clip-path:inset(36% 0 42% 0)}89%{transform:translate(-2px,1px);clip-path:inset(72% 0 8% 0)}92%{transform:translate(2px,-2px);clip-path:inset(22% 0 58% 0)}95%{transform:translate(-2px,1px);clip-path:inset(50% 0 26% 0)}to{transform:translate(0);clip-path:inset(0% 0 0 0);opacity:0}}.cloud-file-list{display:flex;flex-direction:column;gap:.125rem;padding-bottom:1rem}.cloud-file-item{display:flex;gap:.75rem;padding:.5rem;border-radius:.75rem;transition:background-color .2s ease;text-align:left;width:100%;cursor:pointer;background:none;border:none;color:inherit;align-items:center}.cloud-file-item:hover{background:#ffffff0d}.cloud-file-item:active{background:#ffffff1a}.cloud-file-item:focus-visible{box-shadow:0 0 16px #78b4ff33,0 0 32px #64a0ff1a}.cloud-file-item-thumb{flex-shrink:0;width:3rem;height:3rem;border-radius:.5rem;overflow:hidden}.cloud-file-item-actions{display:flex;align-items:center;gap:.25rem;opacity:0;transition:opacity .15s ease;flex-shrink:0}.cloud-file-item:hover .cloud-file-item-actions,.cloud-file-item:focus-within .cloud-file-item-actions{opacity:1}.cloud-file-action-btn{display:flex;align-items:center;justify-content:center;width:1.75rem;height:1.75rem;border-radius:.375rem;background:#ffffff14;color:#fff9;border:none;cursor:pointer;transition:background-color .15s ease,color .15s ease,opacity .15s ease;text-decoration:none}.cloud-file-action-btn:hover{background:#ffffff26;color:#fff}.cloud-file-action-delete:hover{background:#ef444433;color:#ef4444}.cloud-file-badge{display:inline-flex;font-size:.6875rem;font-weight:500;padding:.125rem .375rem;border-radius:.25rem}.cloud-file-item-skeleton{pointer-events:none}.cloud-toolbar{display:flex;align-items:center;justify-content:space-between;gap:.75rem;margin-bottom:1rem}.cloud-breadcrumbs{display:flex;align-items:center;flex-wrap:wrap;gap:0;min-width:0}.cloud-breadcrumb-item{display:inline-flex;align-items:center;gap:.125rem;padding:.25rem .375rem;font-size:.8125rem;color:#ffffff80;background:none;border:none;cursor:pointer;border-radius:.25rem;transition:background-color .15s ease,color .15s ease,opacity .15s ease;white-space:nowrap}.cloud-breadcrumb-item:hover:not(.cloud-breadcrumb-active){color:#fff;background:#ffffff14}.cloud-breadcrumb-active{color:#ffffffe6;font-weight:500;cursor:default}.cloud-toolbar-btn{display:inline-flex;align-items:center;gap:.375rem;padding:.375rem .625rem;font-size:.8125rem;border-radius:.5rem}.cloud-view-toggle{display:flex;border-radius:.5rem;overflow:hidden;border:1px solid rgba(255,255,255,.1)}.cloud-view-toggle-btn{display:flex;align-items:center;justify-content:center;width:2rem;height:2rem;border:none;cursor:pointer;background:transparent;color:#ffffff59;transition:background-color .15s ease,color .15s ease,opacity .15s ease}.cloud-view-toggle-btn:hover{color:#ffffffb3;background:#ffffff0d}.cloud-view-toggle-active{background:#ffffff1a;color:#ffffffe6}.cloud-card-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:1rem;padding-bottom:1rem}@media(min-width:640px){.cloud-card-grid{grid-template-columns:repeat(3,1fr)}}@media(min-width:1024px){.cloud-card-grid{grid-template-columns:repeat(4,1fr)}}.cloud-grid-card{display:flex;flex-direction:column;text-align:left;width:100%;border:none;cursor:pointer;background:#ffffff0a;border-radius:.75rem;overflow:hidden;transition:background-color .2s ease,box-shadow .2s ease;color:inherit;padding:0}.cloud-grid-card:hover{background:#ffffff14;transform:translateY(-2px)}.cloud-grid-card:active{transform:translateY(0)}.cloud-grid-card:focus-visible{box-shadow:0 0 16px #78b4ff33,0 0 32px #64a0ff1a}.cloud-grid-card-cover{position:relative;width:100%;overflow:hidden;border-radius:.625rem}.cloud-grid-card-gradient{position:absolute;inset:0;background:linear-gradient(to top,rgba(0,0,0,.6),transparent 60%);pointer-events:none}.cloud-grid-card-info{position:absolute;bottom:0;left:0;right:0;padding:.5rem;z-index:1}.cloud-grid-card-badges{position:absolute;top:.375rem;right:.375rem;display:flex;gap:.25rem;z-index:1}.cloud-grid-card-badge{font-size:.625rem;font-weight:500;padding:.125rem .375rem;border-radius:.25rem;background:#0009;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);color:#ffffffb3}.cloud-grid-card-play{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;z-index:2;-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px);background:#0000004d;opacity:0;transition:opacity .2s ease}.cloud-grid-card:hover .cloud-grid-card-play{opacity:1}.cloud-grid-card-play-btn{width:3.5rem;height:3.5rem;border-radius:50%;display:flex;align-items:center;justify-content:center;background:#00000080;border:1px solid rgba(255,255,255,.2);-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);transition:transform .15s ease}.cloud-grid-card:hover .cloud-grid-card-play-btn{transform:scale(1.1)}.cloud-grid-card-actions{position:absolute;top:.375rem;left:.375rem;display:flex;gap:.25rem;z-index:3;opacity:0;transition:opacity .15s ease}.cloud-grid-card:hover .cloud-grid-card-actions{opacity:1}.cloud-grid-card-skeleton{border-radius:.75rem;overflow:hidden}.cloud-grid-card-play-active{opacity:1!important;background:#0006}.mobile-back-btn{position:fixed;left:1rem;right:1rem;bottom:calc(var(--mobile-tab-bar-height, 72px) + 8px);z-index:40;filter:drop-shadow(0 10px 25px rgba(0,0,0,.5))}.cloud-audio-player{display:flex;align-items:center;gap:.75rem;padding:.75rem 1rem;margin-top:.5rem;background:#000000a6;backdrop-filter:blur(18px);-webkit-backdrop-filter:blur(18px);border:1px solid rgba(255,255,255,.12);border-radius:.75rem;flex-shrink:0}.cloud-audio-player-btn{display:flex;align-items:center;justify-content:center;width:2.75rem;height:2.75rem;min-width:2.75rem;border-radius:50%;background:#ffffff1a;border:none;color:#fff;cursor:pointer;flex-shrink:0;transition:background-color .15s ease,color .15s ease,opacity .15s ease;padding:0}.cloud-audio-player-btn:hover{background:#fff3}.cloud-audio-progress{height:3px;background:#ffffff1a;border-radius:2px;margin-top:.375rem;overflow:hidden}.cloud-audio-progress-bar{height:100%;background:#fb923c;border-radius:2px;transition:width .3s linear}.cloud-drop-overlay{position:absolute;inset:0;z-index:30;display:flex;align-items:center;justify-content:center;background:#0009;backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);border-radius:.75rem;border:2px dashed rgba(251,146,60,.6);animation:drop-overlay-in .2s ease-out}.cloud-drop-overlay-inner{display:flex;flex-direction:column;align-items:center;text-align:center;padding:2rem}@keyframes drop-overlay-in{0%{opacity:0}to{opacity:1}}.share-modal-backdrop{position:fixed;inset:0;z-index:9999;display:flex;align-items:center;justify-content:center;background:#0009;backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);animation:share-modal-fade-in .2s ease-out}@keyframes share-modal-fade-in{0%{opacity:0}to{opacity:1}}.share-modal{width:100%;max-width:28rem;margin:1rem;padding:1.5rem;animation:share-modal-slide-in .25s ease-out}@keyframes share-modal-slide-in{0%{opacity:0;transform:translateY(12px) scale(.97)}to{opacity:1;transform:translateY(0) scale(1)}}.share-modal-close{display:flex;align-items:center;justify-content:center;width:2rem;height:2rem;border-radius:.5rem;border:none;background:#ffffff14;color:#ffffff80;cursor:pointer;transition:background-color .15s ease,color .15s ease}.share-modal-close:hover{background:#ffffff26;color:#fff}.share-modal-row{display:flex;align-items:center;gap:1rem;padding:.75rem 1rem;border-radius:.75rem;background:#ffffff0d;border:1px solid rgba(255,255,255,.08)}.share-toggle{position:relative;display:inline-flex;width:2.75rem;height:1.5rem;flex-shrink:0;cursor:pointer}.share-toggle input{position:absolute;opacity:0;width:0;height:0}.share-toggle-slider{position:absolute;inset:0;border-radius:9999px;background:#ffffff26;transition:background-color .2s ease}.share-toggle-slider:before{content:"";position:absolute;width:1.125rem;height:1.125rem;left:.1875rem;bottom:.1875rem;border-radius:9999px;background:#fff;transition:transform .2s ease}.share-toggle input:checked+.share-toggle-slider{background:#fb923c}.share-toggle input:checked+.share-toggle-slider:before{transform:translate(1.25rem)}.share-access-options{display:grid;grid-template-columns:repeat(3,1fr);gap:.5rem}.share-access-option{display:flex;flex-direction:column;align-items:center;gap:.375rem;padding:.75rem .5rem;border-radius:.75rem;border:1px solid rgba(255,255,255,.08);background:#ffffff0a;color:#fff9;cursor:pointer;transition:all .2s ease}.share-access-option:hover{background:#ffffff14;border-color:#ffffff26;color:#ffffffe6}.share-access-option-active{background:#fb923c1a;border-color:#fb923c66;color:#fb923c}.share-access-option-active:hover{background:#fb923c26;border-color:#fb923c80;color:#fb923c}.share-price-input-wrap{display:flex;align-items:center;gap:0;border-radius:.75rem;border:1px solid rgba(255,255,255,.1);background:#ffffff0d;overflow:hidden;margin-top:.5rem}.share-price-icon{display:flex;align-items:center;justify-content:center;padding:0 .75rem;flex-shrink:0}.share-price-input{flex:1;min-width:0;padding:.625rem 0;background:transparent;border:none;outline:none;color:#fff;font-size:.875rem;font-family:inherit}.share-price-input::-moz-placeholder{color:#ffffff4d}.share-price-input::placeholder{color:#ffffff4d}.share-price-unit{padding:0 .75rem;font-size:.75rem;font-weight:500;color:#fff6;flex-shrink:0}.share-modal-status{display:flex;align-items:center;gap:.5rem;padding:.5rem .75rem;border-radius:.5rem;background:#ffffff0d}.share-modal-error{display:flex;align-items:center;gap:.5rem;padding:.5rem .75rem;border-radius:.5rem;background:#ef44441a;border:1px solid rgba(239,68,68,.2)}.share-modal-success{display:flex;align-items:center;gap:.5rem;padding:.5rem .75rem;border-radius:.5rem;background:#4ade801a;border:1px solid rgba(74,222,128,.2)}.share-modal-save{background:#fb923c26;border-color:#fb923c4d}.share-modal-save:hover:not(:disabled){background:#fb923c40}.share-modal-save:disabled{opacity:.4;cursor:not-allowed}.cloud-file-action-share:hover{background:#fb923c33;color:#fb923c}.content-fade-enter-active,.content-fade-leave-active{transition:opacity .2s ease,transform .2s ease}.content-fade-enter-from{opacity:0;transform:translateY(6px)}.content-fade-leave-to{opacity:0}.card-stagger{opacity:0;animation:card-stagger-in .4s cubic-bezier(.25,.46,.45,.94) forwards;animation-delay:calc(var(--stagger-index, 0) * 50ms)}@keyframes card-stagger-in{0%{opacity:0;transform:translateY(12px)}to{opacity:1;transform:translateY(0)}}.monitoring-stat-card{background:#0000004d;border:1px solid rgba(255,255,255,.08);border-radius:.75rem;padding:1rem}.monitoring-chart{width:100%;height:auto;display:block}.monitoring-bar-container{width:80px;height:6px;background:#ffffff14;border-radius:3px;overflow:hidden;flex-shrink:0}.monitoring-bar-fill{height:100%;border-radius:3px;transition:width .3s ease}.monitoring-bar-ok{background:#4ade80}.monitoring-bar-warn{background:#f59e0b}.monitoring-bar-danger{background:#ef4444}.monitoring-alert-toggle{position:relative;display:inline-block;width:36px;height:20px;flex-shrink:0}.monitoring-alert-toggle input{opacity:0;width:0;height:0}.monitoring-alert-toggle-slider{position:absolute;cursor:pointer;inset:0;background:#ffffff1a;border-radius:10px;transition:background .2s ease}.monitoring-alert-toggle-slider:before{content:"";position:absolute;height:14px;width:14px;left:3px;bottom:3px;background:#fff9;border-radius:50%;transition:transform .2s ease}.monitoring-alert-toggle input:checked+.monitoring-alert-toggle-slider{background:#4ade8066}.monitoring-alert-toggle input:checked+.monitoring-alert-toggle-slider:before{transform:translate(16px);background:#4ade80}.monitoring-threshold-input{width:60px;padding:4px 8px;background:#ffffff14;border:1px solid rgba(255,255,255,.12);border-radius:6px;color:#fff;font-size:.75rem;text-align:right}.tor-toggle-label{position:relative;display:inline-block;width:36px;height:20px;cursor:pointer}.tor-toggle-input{opacity:0;width:0;height:0;position:absolute}.tor-toggle-slider{position:absolute;inset:0;background:#ffffff1a;border-radius:10px;transition:background .3s ease}.tor-toggle-slider:before{content:"";position:absolute;width:16px;height:16px;left:2px;top:2px;background:#fff9;border-radius:50%;transition:transform .3s ease,background .3s ease}.tor-toggle-input:checked+.tor-toggle-slider{background:#fb923c66}.tor-toggle-input:checked+.tor-toggle-slider:before{transform:translate(16px);background:#fb923c}.file\:mr-4::file-selector-button{margin-right:16px}.file\:rounded::file-selector-button{border-radius:.25rem}.file\:border-0::file-selector-button{border-width:0px}.file\:bg-white\/10::file-selector-button{background-color:#ffffff1a}.file\:px-4::file-selector-button{padding-left:16px;padding-right:16px}.file\:py-2::file-selector-button{padding-top:8px;padding-bottom:8px}.file\:text-sm::file-selector-button{font-size:.875rem;line-height:1.25rem}.file\:text-white\/80::file-selector-button{color:#fffc}.after\:absolute:after{content:var(--tw-content);position:absolute}.after\:left-\[2px\]:after{content:var(--tw-content);left:2px}.after\:top-0\.5:after{content:var(--tw-content);top:.125rem}.after\:h-4:after{content:var(--tw-content);height:16px}.after\:w-4:after{content:var(--tw-content);width:16px}.after\:rounded-full:after{content:var(--tw-content);border-radius:9999px}.after\:bg-white:after{content:var(--tw-content);--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.after\:transition-all:after{content:var(--tw-content);transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.after\:content-\[\'\'\]:after{--tw-content: "";content:var(--tw-content)}.hover\:-translate-y-0\.5:hover{--tw-translate-y: -.125rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.hover\:-translate-y-1:hover{--tw-translate-y: -4px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.hover\:border-red-500\/50:hover{border-color:#ef444480}.hover\:border-white\/20:hover{border-color:#fff3}.hover\:border-white\/30:hover{border-color:#ffffff4d}.hover\:border-white\/50:hover{border-color:#ffffff80}.hover\:bg-black\/70:hover{background-color:#000000b3}.hover\:bg-black\/80:hover{background-color:#000c}.hover\:bg-blue-500:hover{--tw-bg-opacity: 1;background-color:rgb(59 130 246 / var(--tw-bg-opacity, 1))}.hover\:bg-blue-500\/30:hover{background-color:#3b82f64d}.hover\:bg-green-500:hover{--tw-bg-opacity: 1;background-color:rgb(34 197 94 / var(--tw-bg-opacity, 1))}.hover\:bg-green-500\/30:hover{background-color:#22c55e4d}.hover\:bg-orange-500\/10:hover{background-color:#f973161a}.hover\:bg-orange-500\/30:hover{background-color:#f973164d}.hover\:bg-orange-600:hover{--tw-bg-opacity: 1;background-color:rgb(234 88 12 / var(--tw-bg-opacity, 1))}.hover\:bg-red-400\/10:hover{background-color:#f871711a}.hover\:bg-red-500\/10:hover{background-color:#ef44441a}.hover\:bg-red-500\/20:hover{background-color:#ef444433}.hover\:bg-red-500\/30:hover{background-color:#ef44444d}.hover\:bg-red-600:hover{--tw-bg-opacity: 1;background-color:rgb(220 38 38 / var(--tw-bg-opacity, 1))}.hover\:bg-red-600\/30:hover{background-color:#dc26264d}.hover\:bg-white\/10:hover{background-color:#ffffff1a}.hover\:bg-white\/15:hover{background-color:#ffffff26}.hover\:bg-white\/20:hover{background-color:#fff3}.hover\:bg-white\/5:hover{background-color:#ffffff0d}.hover\:bg-white\/\[0\.06\]:hover{background-color:#ffffff0f}.hover\:bg-yellow-500\/30:hover{background-color:#eab3084d}.hover\:text-blue-300:hover{--tw-text-opacity: 1;color:rgb(147 197 253 / var(--tw-text-opacity, 1))}.hover\:text-orange-300:hover{--tw-text-opacity: 1;color:rgb(253 186 116 / var(--tw-text-opacity, 1))}.hover\:text-red-300:hover{--tw-text-opacity: 1;color:rgb(252 165 165 / var(--tw-text-opacity, 1))}.hover\:text-red-300\/80:hover{color:#fca5a5cc}.hover\:text-red-400:hover{--tw-text-opacity: 1;color:rgb(248 113 113 / var(--tw-text-opacity, 1))}.hover\:text-white:hover{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.hover\:text-white\/60:hover{color:#fff9}.hover\:text-white\/70:hover{color:#ffffffb3}.hover\:text-white\/80:hover{color:#fffc}.hover\:text-white\/90:hover{color:#ffffffe6}.hover\:text-yellow-400:hover{--tw-text-opacity: 1;color:rgb(250 204 21 / var(--tw-text-opacity, 1))}.hover\:underline:hover{text-decoration-line:underline}.hover\:shadow-2xl:hover{--tw-shadow: 0 25px 50px -12px rgb(0 0 0 / .25);--tw-shadow-colored: 0 25px 50px -12px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.hover\:file\:bg-white\/20::file-selector-button:hover{background-color:#fff3}.focus\:border-blue-500\/50:focus{border-color:#3b82f680}.focus\:border-orange-400\/50:focus{border-color:#fb923c80}.focus\:border-orange-400\/60:focus{border-color:#fb923c99}.focus\:border-orange-500:focus{--tw-border-opacity: 1;border-color:rgb(249 115 22 / var(--tw-border-opacity, 1))}.focus\:border-orange-500\/50:focus{border-color:#f9731680}.focus\:border-white\/30:focus{border-color:#ffffff4d}.focus\:border-white\/40:focus{border-color:#fff6}.focus\:bg-black\/50:focus{background-color:#00000080}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-1:focus{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus\:ring-orange-400\/30:focus{--tw-ring-color: rgb(251 146 60 / .3)}.focus\:ring-orange-400\/50:focus{--tw-ring-color: rgb(251 146 60 / .5)}.focus\:ring-orange-500:focus{--tw-ring-opacity: 1;--tw-ring-color: rgb(249 115 22 / var(--tw-ring-opacity, 1))}.focus\:ring-white\/20:focus{--tw-ring-color: rgb(255 255 255 / .2)}.active\:translate-y-0:active{--tw-translate-y: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:bg-green-800:disabled{--tw-bg-opacity: 1;background-color:rgb(22 101 52 / var(--tw-bg-opacity, 1))}.disabled\:opacity-30:disabled{opacity:.3}.disabled\:opacity-40:disabled{opacity:.4}.disabled\:opacity-50:disabled{opacity:.5}.disabled\:opacity-70:disabled{opacity:.7}.group:hover .group-hover\:-translate-y-1{--tw-translate-y: -4px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.group:hover .group-hover\:scale-105{--tw-scale-x: 1.05;--tw-scale-y: 1.05;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.group:hover .group-hover\:scale-110{--tw-scale-x: 1.1;--tw-scale-y: 1.1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.group:hover .group-hover\:border-white\/25{border-color:#ffffff40}.group:hover .group-hover\:text-white\/60{color:#fff9}.group:hover .group-hover\:opacity-100{opacity:1}.group:hover .group-hover\:shadow-lg{--tw-shadow: 0 10px 15px -3px rgb(0 0 0 / .1), 0 4px 6px -4px rgb(0 0 0 / .1);--tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.peer:checked~.peer-checked\:bg-orange-500\/40{background-color:#f9731666}.peer:checked~.peer-checked\:after\:translate-x-full:after{content:var(--tw-content);--tw-translate-x: 100%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.peer:focus~.peer-focus\:outline-none{outline:2px solid transparent;outline-offset:2px}@media(min-width:640px){.sm\:-top-10{top:-2.5rem}.sm\:mb-12{margin-bottom:3rem}.sm\:mb-2{margin-bottom:8px}.sm\:mb-3{margin-bottom:12px}.sm\:mb-4{margin-bottom:16px}.sm\:mb-6{margin-bottom:24px}.sm\:mb-8{margin-bottom:32px}.sm\:mr-6{margin-right:24px}.sm\:mt-3{margin-top:12px}.sm\:mt-8{margin-top:32px}.sm\:inline{display:inline}.sm\:inline-flex{display:inline-flex}.sm\:h-16{height:4rem}.sm\:h-20{height:5rem}.sm\:h-48{height:12rem}.sm\:h-64{height:16rem}.sm\:h-8{height:32px}.sm\:w-16{width:4rem}.sm\:w-20{width:5rem}.sm\:w-48{width:12rem}.sm\:w-64{width:16rem}.sm\:w-8{width:32px}.sm\:max-w-\[120px\]{max-width:120px}.sm\:max-w-\[90vw\]{max-width:90vw}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.sm\:flex-row{flex-direction:row}.sm\:items-center{align-items:center}.sm\:justify-between{justify-content:space-between}.sm\:gap-4{gap:16px}.sm\:gap-6{gap:24px}.sm\:space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(24px * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(24px * var(--tw-space-y-reverse))}.sm\:p-12{padding:3rem}.sm\:p-4{padding:16px}.sm\:p-6{padding:24px}.sm\:px-4{padding-left:16px;padding-right:16px}.sm\:px-5{padding-left:20px;padding-right:20px}.sm\:px-6{padding-left:24px;padding-right:24px}.sm\:px-8{padding-left:32px;padding-right:32px}.sm\:py-4{padding-top:16px;padding-bottom:16px}.sm\:py-6{padding-top:24px;padding-bottom:24px}.sm\:pb-6{padding-bottom:24px}.sm\:pt-20{padding-top:5rem}.sm\:pt-6{padding-top:24px}.sm\:text-2xl{font-size:1.5rem;line-height:2rem}.sm\:text-4xl{font-size:2.25rem;line-height:2.5rem}.sm\:text-7xl{font-size:4.5rem;line-height:1}.sm\:text-base{font-size:1rem;line-height:1.5rem}.sm\:text-lg{font-size:1.125rem;line-height:1.75rem}.sm\:text-sm{font-size:.875rem;line-height:1.25rem}.sm\:text-xl{font-size:1.25rem;line-height:1.75rem}}@media(min-width:768px){.md\:bottom-6{bottom:24px}.md\:bottom-8{bottom:32px}.md\:left-auto{left:auto}.md\:right-6{right:24px}.md\:right-8{right:32px}.md\:top-6{top:24px}.md\:col-span-2{grid-column:span 2 / span 2}.md\:mb-6{margin-bottom:24px}.md\:mb-8{margin-bottom:32px}.md\:block{display:block}.md\:inline{display:inline}.md\:flex{display:flex}.md\:hidden{display:none}.md\:h-12{height:3rem}.md\:h-80{height:20rem}.md\:max-h-\[calc\(100vh-5rem\)\]{max-height:calc(100vh - 5rem)}.md\:w-1\/2{width:50%}.md\:w-80{width:20rem}.md\:w-auto{width:auto}.md\:max-w-\[1200px\]{max-width:1200px}.md\:max-w-\[calc\(100vw-5rem\)\]{max-width:calc(100vw - 5rem)}.md\:max-w-md{max-width:28rem}.md\:max-w-sm{max-width:24rem}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.md\:flex-row{flex-direction:row}.md\:justify-end{justify-content:flex-end}.md\:gap-4{gap:16px}.md\:rounded-2xl{border-radius:1rem}.md\:bg-transparent{background-color:transparent}.md\:p-10{padding:2.5rem}.md\:p-6{padding:24px}.md\:p-8{padding:32px}.md\:px-8{padding-left:32px;padding-right:32px}.md\:py-2{padding-top:8px;padding-bottom:8px}.md\:pb-16{padding-bottom:4rem}.md\:pb-4{padding-bottom:16px}.md\:pt-8{padding-top:32px}.md\:text-5xl{font-size:3rem;line-height:1}.md\:text-8xl{font-size:6rem;line-height:1}.md\:text-\[20px\]{font-size:20px}.md\:text-\[24px\]{font-size:24px}.md\:text-\[26px\]{font-size:26px}.md\:text-base{font-size:1rem;line-height:1.5rem}.md\:text-sm{font-size:.875rem;line-height:1.25rem}.md\:backdrop-blur-none{--tw-backdrop-blur: ;-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}}@media(min-width:1024px){.lg\:col-span-2{grid-column:span 2 / span 2}.lg\:flex{display:flex}.lg\:hidden{display:none}.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.lg\:text-9xl{font-size:8rem;line-height:1}}@media(min-width:1536px){.\32xl\:grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}}.logo-svg[data-v-13794b4c]{will-change:auto}.logo-square[data-v-13794b4c]{opacity:0;animation:logo-square-in-13794b4c 3s ease-out infinite;animation-delay:var(--delay, 0ms);animation-fill-mode:both}@keyframes logo-square-in-13794b4c{0%{opacity:0}15%{opacity:1}to{opacity:1}}.screensaver-logo-squares[data-v-d3543a5f]{opacity:1;position:relative;z-index:1}.splash-fade-enter-active[data-v-a2a8c942]{transition:opacity .5s ease}.splash-fade-leave-active[data-v-a2a8c942]{transition:opacity 1s ease-out,transform 1s ease-out}.splash-fade-enter-from[data-v-a2a8c942],.splash-fade-leave-to[data-v-a2a8c942]{opacity:0}.splash-fade-leave-to[data-v-a2a8c942]{transform:scale(1.1)}.splash-fade-leave-active .logo-container[data-v-a2a8c942]{transition:transform 1s cubic-bezier(.25,.46,.45,.94);transform-origin:center center}.splash-fade-leave-to .logo-container[data-v-a2a8c942]{transform:scale(1.4)}.fade-enter-active[data-v-a2a8c942],.fade-leave-active[data-v-a2a8c942]{transition:opacity .5s ease}.fade-enter-from[data-v-a2a8c942],.fade-leave-to[data-v-a2a8c942]{opacity:0}.welcome-fade-enter-active[data-v-a2a8c942]{transition:opacity .8s ease-out}.welcome-fade-leave-active[data-v-a2a8c942]{transition:opacity .6s ease-in}.welcome-fade-enter-from[data-v-a2a8c942],.welcome-fade-leave-to[data-v-a2a8c942]{opacity:0}.welcome-fade-out[data-v-a2a8c942]{opacity:0;transition:opacity .6s ease-in}.logo-zoom-enter-active[data-v-a2a8c942]{transition:all 1s cubic-bezier(.25,.46,.45,.94)}.logo-zoom-leave-active[data-v-a2a8c942]{transition:opacity .5s ease-out,transform .5s ease-out}.logo-zoom-enter-from[data-v-a2a8c942]{opacity:0;transform:scale(.7)}.logo-zoom-enter-to[data-v-a2a8c942],.logo-zoom-leave-from[data-v-a2a8c942]{opacity:1;transform:scale(1)}.logo-zoom-leave-to[data-v-a2a8c942]{opacity:0;transform:scale(1.05)}.logo-zoom-bounce[data-v-a2a8c942]{animation:logoZoomBounce-a2a8c942 1.2s cubic-bezier(.25,.46,.45,.94) forwards}@keyframes logoZoomBounce-a2a8c942{0%{transform:scale(.85);opacity:0}50%{transform:scale(1.02);opacity:.9}75%{transform:scale(.98);opacity:.95}to{transform:scale(1);opacity:1}}.typing-container[data-v-a2a8c942]{display:flex;justify-content:center;align-items:center;min-width:0}.intro-typing-caret[data-v-a2a8c942]{display:inline-block;width:4px;min-width:4px;height:1.2em;background:#fbbf24;margin-left:2px;vertical-align:text-bottom;animation:intro-caret-blink-a2a8c942 .5s step-end infinite}@keyframes intro-caret-blink-a2a8c942{0%,to{opacity:1}50%{opacity:0}}.font-mono[data-v-a2a8c942]{word-wrap:break-word;overflow-wrap:break-word;-webkit-hyphens:auto;hyphens:auto}@media(max-width:640px){.font-mono span[data-v-a2a8c942]{display:inline-block;max-width:100%}}.bg-zoom-transition[data-v-a2a8c942]{transition:transform 1.5s cubic-bezier(.4,0,.2,1),opacity 1.2s ease-out;transform:scale(1);transform-origin:center center;will-change:transform,opacity}.bg-zoom-transition.bg-zoom-in[data-v-a2a8c942]{transform:scale(1.15)}.tap-overlay-zoom-out[data-v-a2a8c942]{background-color:#0006;transition:background-color .6s cubic-bezier(.4,0,.2,1);animation:tap-overlay-fade-a2a8c942 1s ease-out forwards}@keyframes tap-overlay-fade-a2a8c942{0%{background-color:#0006}30%{background-color:#00000059}to{background-color:#0000}}.perspective-1000[data-v-a2a8c942]{perspective:1000px}.tap-logo-launch[data-v-a2a8c942]{animation:tap-logo-launch-a2a8c942 1s cubic-bezier(.22,1,.36,1) forwards;transform-origin:center center;will-change:transform,opacity}@keyframes tap-logo-launch-a2a8c942{0%{transform:scale(1);opacity:1}15%{transform:scale(1.2);opacity:1}25%{transform:scale(1.15);opacity:1}to{transform:scale(0);opacity:0}}.tap-to-start-content[data-v-a2a8c942]{min-height:12rem}.tap-to-start-text[data-v-a2a8c942]{position:absolute;z-index:0;pointer-events:none;background:linear-gradient(90deg,#00000059 0% 38%,#00000059 40%,#ffffff80 48%,#ffffffb3,#ffffff80 52%,#00000059 60% 100%);background-size:250% 100%;background-position:0% 0;-webkit-background-clip:text;background-clip:text;color:transparent;animation:tap-to-start-flare-wipe-a2a8c942 14s ease-in-out infinite}@keyframes tap-to-start-flare-wipe-a2a8c942{0%,82%,to{background-position:0% 0}88%{background-position:100% 0}}.tap-to-start-logo[data-v-a2a8c942]{position:relative;z-index:1;filter:drop-shadow(0 0 40px rgba(255,255,255,.15));overflow:visible}.intro-logo-viz-ring[data-v-a2a8c942]{position:absolute;left:50%;top:50%;width:1px;height:1px;transform:translate(-50%,-50%);z-index:0;pointer-events:none;opacity:0;transition:opacity .35s ease;--viz-radius: 7rem}.intro-logo-viz-ring.intro-logo-viz-visible[data-v-a2a8c942]{opacity:1}.intro-logo-viz-segment[data-v-a2a8c942]{position:absolute;left:50%;top:50%;width:4px;height:24px;margin-left:-2px;margin-top:-12px;background:linear-gradient(to bottom,#fff9,#ffffff26);border-radius:2px;transform-origin:center center;transform:rotate(var(--segment-deg)) translateY(calc(-1 * var(--viz-radius)));animation:intro-viz-pulse-a2a8c942 2.5s ease-in-out infinite;animation-delay:calc(var(--segment-index, 0) * .02s)}@keyframes intro-viz-pulse-a2a8c942{0%,to{opacity:.4;transform:rotate(var(--segment-deg)) translateY(calc(-1 * var(--viz-radius))) scaleY(.5)}50%{opacity:1;transform:rotate(var(--segment-deg)) translateY(calc(-1 * var(--viz-radius))) scaleY(1)}}@media(min-width:640px){.intro-logo-viz-ring[data-v-a2a8c942]{--viz-radius: 8rem}.intro-logo-viz-segment[data-v-a2a8c942]{height:26px;margin-top:-13px}}@media(min-width:768px){.intro-logo-viz-ring[data-v-a2a8c942]{--viz-radius: 9rem}.intro-logo-viz-segment[data-v-a2a8c942]{height:28px;margin-top:-14px}}.tap-to-start-logo[data-v-a2a8c942] .logo-gradient-border{width:12rem;height:12rem;position:relative;z-index:1}@media(min-width:640px){.tap-to-start-content[data-v-a2a8c942]{min-height:14rem}.tap-to-start-logo[data-v-a2a8c942] .logo-gradient-border{width:14rem;height:14rem}}@media(min-width:768px){.tap-to-start-content[data-v-a2a8c942]{min-height:16rem}.tap-to-start-logo[data-v-a2a8c942] .logo-gradient-border{width:16rem;height:16rem}}.fade-enter-active[data-v-f40ced58],.fade-leave-active[data-v-f40ced58]{transition:opacity .2s ease}.fade-enter-from[data-v-f40ced58],.fade-leave-to[data-v-f40ced58]{opacity:0}.spotlight-enter-active[data-v-48971291],.spotlight-leave-active[data-v-48971291]{transition:opacity .2s ease}.spotlight-enter-from[data-v-48971291],.spotlight-leave-to[data-v-48971291]{opacity:0}.cli-popup-enter-active[data-v-bbd51259],.cli-popup-leave-active[data-v-bbd51259]{transition:opacity .2s ease}.cli-popup-enter-from[data-v-bbd51259],.cli-popup-leave-to[data-v-bbd51259]{opacity:0}.modal-enter-active[data-v-a101a920],.modal-leave-active[data-v-a101a920]{transition:opacity .3s ease}.modal-enter-from[data-v-a101a920],.modal-leave-to[data-v-a101a920]{opacity:0}.modal-enter-active .glass-card[data-v-a101a920],.modal-leave-active .glass-card[data-v-a101a920]{transition:transform .3s ease}.modal-enter-from .glass-card[data-v-a101a920],.modal-leave-to .glass-card[data-v-a101a920]{transform:scale(.95)}.nostr-hero[data-v-c00f5290]{position:relative;width:148px;height:148px}.nostr-viz-ring[data-v-c00f5290]{position:absolute;inset:0;width:100%;height:100%;pointer-events:none}.nostr-viz-segment[data-v-c00f5290]{position:absolute;left:50%;top:50%;width:2.5px;height:14px;margin-left:-1.25px;margin-top:-7px;background:linear-gradient(to bottom,#fafafa66,#fafafa0f);border-radius:1.5px;transform-origin:center center;transform:rotate(var(--seg-deg)) translateY(-60px);animation:seg-pulse-c00f5290 14s ease-in-out infinite;animation-delay:calc(var(--seg-i) * .02s)}@keyframes seg-pulse-c00f5290{0%{opacity:.15;transform:rotate(var(--seg-deg)) translateY(-60px) scaleY(.4)}7.1%{opacity:.7;transform:rotate(var(--seg-deg)) translateY(-60px) scaleY(1)}14.3%{opacity:.15;transform:rotate(var(--seg-deg)) translateY(-60px) scaleY(.4)}21.4%{opacity:.7;transform:rotate(var(--seg-deg)) translateY(-60px) scaleY(1)}28.6%{opacity:.15;transform:rotate(var(--seg-deg)) translateY(-60px) scaleY(.4)}35.7%{opacity:.7;transform:rotate(var(--seg-deg)) translateY(-60px) scaleY(1)}42.9%{opacity:.15;transform:rotate(var(--seg-deg)) translateY(-60px) scaleY(.4)}50%{opacity:.7;transform:rotate(var(--seg-deg)) translateY(-60px) scaleY(1)}57.1%{opacity:.15;transform:rotate(var(--seg-deg)) translateY(-60px) scaleY(.4)}64.3%{opacity:.7;transform:rotate(var(--seg-deg)) translateY(-60px) scaleY(1)}71.4%{opacity:.15;transform:rotate(var(--seg-deg)) translateY(-60px) scaleY(.4)}78.6%{opacity:1;transform:rotate(var(--seg-deg)) translateY(-60px) scaleY(1.5)}85.7%{opacity:1;transform:rotate(var(--seg-deg)) translateY(-60px) scaleY(1.5)}92.9%{opacity:.15;transform:rotate(var(--seg-deg)) translateY(-60px) scaleY(.4)}to{opacity:.15;transform:rotate(var(--seg-deg)) translateY(-60px) scaleY(.4)}}.nostr-glass-border[data-v-c00f5290]{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);width:104px;height:104px;border-radius:9999px;padding:3px;background:linear-gradient(135deg,#fff9,#000c);box-shadow:0 8px 24px #00000080;filter:drop-shadow(0 0 24px rgba(255,255,255,.08))}.nostr-glass-inner[data-v-c00f5290]{width:100%;height:100%;border-radius:9999px;background:#000;display:flex;align-items:center;justify-content:center}.nostr-cinema-svg[data-v-c00f5290]{position:relative;z-index:1;filter:drop-shadow(0 0 12px rgba(250,250,250,.12));animation:cinema-breathe-c00f5290 4s ease-in-out infinite}@keyframes cinema-breathe-c00f5290{0%,to{opacity:.7;transform:scale(1);filter:drop-shadow(0 0 8px rgba(250,250,250,.08))}50%{opacity:1;transform:scale(1.08);filter:drop-shadow(0 0 20px rgba(250,250,250,.22))}}.identity-picker-enter-active[data-v-c00f5290],.identity-picker-leave-active[data-v-c00f5290]{transition:opacity .4s ease}.identity-picker-enter-active>.relative[data-v-c00f5290]{transition:transform .5s cubic-bezier(.22,1,.36,1),opacity .4s ease}.identity-picker-leave-active>.relative[data-v-c00f5290]{transition:transform .25s ease,opacity .2s ease}.identity-picker-enter-from[data-v-c00f5290]{opacity:0}.identity-picker-enter-from>.relative[data-v-c00f5290]{transform:translateY(24px) scale(.94);opacity:0}.identity-picker-leave-to[data-v-c00f5290]{opacity:0}.identity-picker-leave-to>.relative[data-v-c00f5290]{transform:translateY(10px) scale(.98);opacity:0}.app-launcher-panel[data-v-f9ce16c6]{will-change:transform,opacity}.app-launcher-enter-active[data-v-f9ce16c6],.app-launcher-leave-active[data-v-f9ce16c6]{transition:opacity .3s ease}.app-launcher-enter-active .app-launcher-backdrop[data-v-f9ce16c6]{transition:opacity .3s ease,backdrop-filter .3s ease}.app-launcher-leave-active .app-launcher-backdrop[data-v-f9ce16c6]{transition:opacity .2s ease,backdrop-filter .2s ease}.app-launcher-enter-active .app-launcher-panel[data-v-f9ce16c6]{transition:transform .35s cubic-bezier(.22,1,.36,1),opacity .3s ease}.app-launcher-leave-active .app-launcher-panel[data-v-f9ce16c6]{transition:transform .25s cubic-bezier(.55,0,1,.45),opacity .2s ease}.app-launcher-enter-from[data-v-f9ce16c6]{opacity:0}.app-launcher-enter-from .app-launcher-backdrop[data-v-f9ce16c6]{opacity:0;-webkit-backdrop-filter:blur(0);backdrop-filter:blur(0)}.app-launcher-enter-from .app-launcher-panel[data-v-f9ce16c6]{transform:translateY(40px);opacity:0}.app-launcher-leave-to[data-v-f9ce16c6]{opacity:0}.app-launcher-leave-to .app-launcher-backdrop[data-v-f9ce16c6]{opacity:0;-webkit-backdrop-filter:blur(0);backdrop-filter:blur(0)}.app-launcher-leave-to .app-launcher-panel[data-v-f9ce16c6]{transform:translateY(30px);opacity:0}.toast-stack-enter-active[data-v-57c85976]{transition:opacity .3s ease,transform .3s cubic-bezier(.4,0,.2,1)}.toast-stack-leave-active[data-v-57c85976]{transition:opacity .2s ease,transform .2s ease}.toast-stack-enter-from[data-v-57c85976]{opacity:0;transform:translate(100%)}.toast-stack-leave-to[data-v-57c85976]{opacity:0;transform:translate(50%)}.toast-stack-move[data-v-57c85976]{transition:transform .3s ease}.screensaver-enter-active[data-v-c0a3e6df],.screensaver-leave-active[data-v-c0a3e6df]{transition:opacity .5s ease}.screensaver-enter-from[data-v-c0a3e6df],.screensaver-leave-to[data-v-c0a3e6df]{opacity:0}.screensaver-container[data-v-c0a3e6df]{position:fixed;inset:0;display:grid;place-items:center}.screensaver-content[data-v-c0a3e6df]{position:relative;width:280px;height:280px;flex-shrink:0}@media(min-width:640px){.screensaver-content[data-v-c0a3e6df]{width:360px;height:360px}}@media(min-width:768px){.screensaver-content[data-v-c0a3e6df]{width:400px;height:400px}}.screensaver-viz-ring[data-v-c0a3e6df]{position:absolute;inset:0;width:100%;height:100%;z-index:0;pointer-events:none;--viz-radius: 140px}@media(min-width:640px){.screensaver-viz-ring[data-v-c0a3e6df]{--viz-radius: 180px}}@media(min-width:768px){.screensaver-viz-ring[data-v-c0a3e6df]{--viz-radius: 200px}}.screensaver-viz-segment[data-v-c0a3e6df]{position:absolute;left:50%;top:50%;width:4px;height:24px;margin-left:-2px;margin-top:-12px;background:linear-gradient(to bottom,#fff6,#ffffff1a);border-radius:2px;transform-origin:center center;transform:rotate(var(--segment-deg)) translateY(calc(-1 * var(--viz-radius)));animation:segment-pulse-c0a3e6df 14s ease-in-out infinite;animation-delay:calc(var(--segment-index) * .02s)}@media(min-width:768px){.screensaver-viz-segment[data-v-c0a3e6df]{height:28px;margin-top:-14px}}@keyframes segment-pulse-c0a3e6df{0%{opacity:.3;transform:rotate(var(--segment-deg)) translateY(calc(-1 * var(--viz-radius))) scaleY(.4)}7.1%{opacity:.9;transform:rotate(var(--segment-deg)) translateY(calc(-1 * var(--viz-radius))) scaleY(1)}14.3%{opacity:.3;transform:rotate(var(--segment-deg)) translateY(calc(-1 * var(--viz-radius))) scaleY(.4)}21.4%{opacity:.9;transform:rotate(var(--segment-deg)) translateY(calc(-1 * var(--viz-radius))) scaleY(1)}28.6%{opacity:.3;transform:rotate(var(--segment-deg)) translateY(calc(-1 * var(--viz-radius))) scaleY(.4)}35.7%{opacity:.9;transform:rotate(var(--segment-deg)) translateY(calc(-1 * var(--viz-radius))) scaleY(1)}42.9%{opacity:.3;transform:rotate(var(--segment-deg)) translateY(calc(-1 * var(--viz-radius))) scaleY(.4)}50%{opacity:.9;transform:rotate(var(--segment-deg)) translateY(calc(-1 * var(--viz-radius))) scaleY(1)}57.1%{opacity:.3;transform:rotate(var(--segment-deg)) translateY(calc(-1 * var(--viz-radius))) scaleY(.4)}64.3%{opacity:.9;transform:rotate(var(--segment-deg)) translateY(calc(-1 * var(--viz-radius))) scaleY(1)}71.4%{opacity:.3;transform:rotate(var(--segment-deg)) translateY(calc(-1 * var(--viz-radius))) scaleY(.4)}78.6%{opacity:1;transform:rotate(var(--segment-deg)) translateY(calc(-1 * var(--viz-radius))) scaleY(1.5)}85.7%{opacity:1;transform:rotate(var(--segment-deg)) translateY(calc(-1 * var(--viz-radius))) scaleY(1.5)}92.9%{opacity:.3;transform:rotate(var(--segment-deg)) translateY(calc(-1 * var(--viz-radius))) scaleY(.4)}to{opacity:.3;transform:rotate(var(--segment-deg)) translateY(calc(-1 * var(--viz-radius))) scaleY(.4)}}.screensaver-logo-wrapper[data-v-c0a3e6df]{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);z-index:10;filter:drop-shadow(0 0 40px rgba(255,255,255,.15))} diff --git a/neode-ui/dist/assets/index-DnbYEqLr.js b/neode-ui/dist/assets/index-DnbYEqLr.js new file mode 100644 index 0000000..e5b367b --- /dev/null +++ b/neode-ui/dist/assets/index-DnbYEqLr.js @@ -0,0 +1,40 @@ +const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/OnboardingWrapper-BsOJSH8d.js","assets/OnboardingWrapper-BHmgMze2.css","assets/RootRedirect-_cfWJoe8.js","assets/useOnboarding-BgpIyX9l.js","assets/RootRedirect-DU0Atc8N.css","assets/Login-CJkTG_B-.js","assets/loginTransition-Bm4PAghQ.js","assets/Login-DRIS0ldM.css","assets/OnboardingIntro-CsYM21xo.js","assets/OnboardingIntro-CuS0o5GQ.css","assets/OnboardingOptions-BEL4MhY9.js","assets/OnboardingDid-Cr_ec55a.js","assets/OnboardingDid-BxUaq9s9.css","assets/OnboardingVerify-P3nJC3Zw.js","assets/Kiosk-CEZdJvXG.js","assets/Kiosk-3Tm3M7Cs.css","assets/Dashboard-Byxe5sIJ.js","assets/AppSession-Cw_auYBr.js","assets/AppSession-DK48XcUX.css","assets/ControllerIndicator.vue_vue_type_script_setup_true_lang-DH-pMX35.js","assets/web5Badge-C9_VaejO.js","assets/mesh-DgF5cqYW.js","assets/Dashboard-C4e6Zldy.css","assets/Home-BM_tfGHm.js","assets/api-CHkUAu4g.js","assets/goals-f4yPn45c.js","assets/filebrowser-client-DRXM9PC4.js","assets/Home-DFbCs8LP.css","assets/Apps-JbZuzA3H.js","assets/Apps-NkvfRZrs.css","assets/AppDetails-DfPGLgac.js","assets/AppDetails-DjlSPTt1.css","assets/Marketplace-dnuGfUDf.js","assets/useMarketplaceApp-BxXpq2aX.js","assets/Marketplace-BasZfUkN.css","assets/MarketplaceAppDetails-DhlIl2UT.js","assets/Cloud-BkxOai3U.js","assets/CloudFolder-8jSNyq3F.js","assets/Federation-BIPGM17A.js","assets/transport-B_E2RH1i.js","assets/Federation-gSEt_uL4.css","assets/Mesh-CPUFszgS.js","assets/Mesh-Dr5A9OgS.css","assets/Web5-DcuUNKso.js","assets/Credentials-DP_VdhTb.js","assets/Credentials-BgvGHu_K.css","assets/Settings-a5XTzOeo.js","assets/aiPermissions-sblnS_DK.js","assets/GoalDetail-BDM8F7F1.js","assets/GoalDetail-gx_165AC.css","assets/Chat-BLEXivD6.js","assets/Chat-_Y5LN8Cp.css"])))=>i.map(i=>d[i]); +(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const r of document.querySelectorAll('link[rel="modulepreload"]'))s(r);new MutationObserver(r=>{for(const o of r)if(o.type==="childList")for(const i of o.addedNodes)i.tagName==="LINK"&&i.rel==="modulepreload"&&s(i)}).observe(document,{childList:!0,subtree:!0});function n(r){const o={};return r.integrity&&(o.integrity=r.integrity),r.referrerPolicy&&(o.referrerPolicy=r.referrerPolicy),r.crossOrigin==="use-credentials"?o.credentials="include":r.crossOrigin==="anonymous"?o.credentials="omit":o.credentials="same-origin",o}function s(r){if(r.ep)return;r.ep=!0;const o=n(r);fetch(r.href,o)}})();function Di(e){const t=Object.create(null);for(const n of e.split(","))t[n]=1;return n=>n in t}const Me={},as=[],zt=()=>{},Cc=()=>!1,Jr=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&(e.charCodeAt(2)>122||e.charCodeAt(2)<97),Mi=e=>e.startsWith("onUpdate:"),Xe=Object.assign,Fi=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},Cd=Object.prototype.hasOwnProperty,Re=(e,t)=>Cd.call(e,t),le=Array.isArray,ls=e=>rr(e)==="[object Map]",vs=e=>rr(e)==="[object Set]",ba=e=>rr(e)==="[object Date]",me=e=>typeof e=="function",We=e=>typeof e=="string",Jt=e=>typeof e=="symbol",Le=e=>e!==null&&typeof e=="object",kc=e=>(Le(e)||me(e))&&me(e.then)&&me(e.catch),xc=Object.prototype.toString,rr=e=>xc.call(e),kd=e=>rr(e).slice(8,-1),Tc=e=>rr(e)==="[object Object]",Qr=e=>We(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,Ns=Di(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),Zr=e=>{const t=Object.create(null);return(n=>t[n]||(t[n]=e(n)))},xd=/-\w/g,ft=Zr(e=>e.replace(xd,t=>t.slice(1).toUpperCase())),Td=/\B([A-Z])/g,In=Zr(e=>e.replace(Td,"-$1").toLowerCase()),eo=Zr(e=>e.charAt(0).toUpperCase()+e.slice(1)),wo=Zr(e=>e?`on${eo(e)}`:""),Kt=(e,t)=>!Object.is(e,t),wr=(e,...t)=>{for(let n=0;n{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,writable:s,value:n})},to=e=>{const t=parseFloat(e);return isNaN(t)?e:t},Id=e=>{const t=We(e)?Number(e):NaN;return isNaN(t)?e:t};let wa;const no=()=>wa||(wa=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});function Tt(e){if(le(e)){const t={};for(let n=0;n{if(n){const s=n.split(Pd);s.length>1&&(t[s[0].trim()]=s[1].trim())}}),t}function $e(e){let t="";if(We(e))t=e;else if(le(e))for(let n=0;nys(n,t))}const Pc=e=>!!(e&&e.__v_isRef===!0),Se=e=>We(e)?e:e==null?"":le(e)||Le(e)&&(e.toString===xc||!me(e.toString))?Pc(e)?Se(e.value):JSON.stringify(e,Lc,2):String(e),Lc=(e,t)=>Pc(t)?Lc(e,t.value):ls(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((n,[s,r],o)=>(n[Eo(s,o)+" =>"]=r,n),{})}:vs(t)?{[`Set(${t.size})`]:[...t.values()].map(n=>Eo(n))}:Jt(t)?Eo(t):Le(t)&&!le(t)&&!Tc(t)?String(t):t,Eo=(e,t="")=>{var n;return Jt(e)?`Symbol(${(n=e.description)!=null?n:t})`:e};let rt;class Nc{constructor(t=!1){this.detached=t,this._active=!0,this._on=0,this.effects=[],this.cleanups=[],this._isPaused=!1,this.__v_skip=!0,this.parent=rt,!t&&rt&&(this.index=(rt.scopes||(rt.scopes=[])).push(this)-1)}get active(){return this._active}pause(){if(this._active){this._isPaused=!0;let t,n;if(this.scopes)for(t=0,n=this.scopes.length;t0&&--this._on===0&&(rt=this.prevScope,this.prevScope=void 0)}stop(t){if(this._active){this._active=!1;let n,s;for(n=0,s=this.effects.length;n0)return;if(Ds){let t=Ds;for(Ds=void 0;t;){const n=t.next;t.next=void 0,t.flags&=-9,t=n}}let e;for(;Os;){let t=Os;for(Os=void 0;t;){const n=t.next;if(t.next=void 0,t.flags&=-9,t.flags&1)try{t.trigger()}catch(s){e||(e=s)}t=n}}if(e)throw e}function $c(e){for(let t=e.deps;t;t=t.nextDep)t.version=-1,t.prevActiveLink=t.dep.activeLink,t.dep.activeLink=t}function Bc(e){let t,n=e.depsTail,s=n;for(;s;){const r=s.prevDep;s.version===-1?(s===n&&(n=r),Wi(s),$d(s)):t=s,s.dep.activeLink=s.prevActiveLink,s.prevActiveLink=void 0,s=r}e.deps=t,e.depsTail=n}function zo(e){for(let t=e.deps;t;t=t.nextDep)if(t.dep.version!==t.version||t.dep.computed&&(Uc(t.dep.computed)||t.dep.version!==t.version))return!0;return!!e._dirty}function Uc(e){if(e.flags&4&&!(e.flags&16)||(e.flags&=-17,e.globalVersion===Hs)||(e.globalVersion=Hs,!e.isSSR&&e.flags&128&&(!e.deps&&!e._dirty||!zo(e))))return;e.flags|=2;const t=e.dep,n=Fe,s=It;Fe=e,It=!0;try{$c(e);const r=e.fn(e._value);(t.version===0||Kt(r,e._value))&&(e.flags|=128,e._value=r,t.version++)}catch(r){throw t.version++,r}finally{Fe=n,It=s,Bc(e),e.flags&=-3}}function Wi(e,t=!1){const{dep:n,prevSub:s,nextSub:r}=e;if(s&&(s.nextSub=r,e.prevSub=void 0),r&&(r.prevSub=s,e.nextSub=void 0),n.subs===e&&(n.subs=s,!s&&n.computed)){n.computed.flags&=-5;for(let o=n.computed.deps;o;o=o.nextDep)Wi(o,!0)}!t&&!--n.sc&&n.map&&n.map.delete(n.key)}function $d(e){const{prevDep:t,nextDep:n}=e;t&&(t.nextDep=n,e.prevDep=void 0),n&&(n.prevDep=t,e.nextDep=void 0)}let It=!0;const Vc=[];function un(){Vc.push(It),It=!1}function fn(){const e=Vc.pop();It=e===void 0?!0:e}function Ea(e){const{cleanup:t}=e;if(e.cleanup=void 0,t){const n=Fe;Fe=void 0;try{t()}finally{Fe=n}}}let Hs=0;class Bd{constructor(t,n){this.sub=t,this.dep=n,this.version=n.version,this.nextDep=this.prevDep=this.nextSub=this.prevSub=this.prevActiveLink=void 0}}class Hi{constructor(t){this.computed=t,this.version=0,this.activeLink=void 0,this.subs=void 0,this.map=void 0,this.key=void 0,this.sc=0,this.__v_skip=!0}track(t){if(!Fe||!It||Fe===this.computed)return;let n=this.activeLink;if(n===void 0||n.sub!==Fe)n=this.activeLink=new Bd(Fe,this),Fe.deps?(n.prevDep=Fe.depsTail,Fe.depsTail.nextDep=n,Fe.depsTail=n):Fe.deps=Fe.depsTail=n,Wc(n);else if(n.version===-1&&(n.version=this.version,n.nextDep)){const s=n.nextDep;s.prevDep=n.prevDep,n.prevDep&&(n.prevDep.nextDep=s),n.prevDep=Fe.depsTail,n.nextDep=void 0,Fe.depsTail.nextDep=n,Fe.depsTail=n,Fe.deps===n&&(Fe.deps=s)}return n}trigger(t){this.version++,Hs++,this.notify(t)}notify(t){Ui();try{for(let n=this.subs;n;n=n.prevSub)n.sub.notify()&&n.sub.dep.notify()}finally{Vi()}}}function Wc(e){if(e.dep.sc++,e.sub.flags&4){const t=e.dep.computed;if(t&&!e.dep.subs){t.flags|=20;for(let s=t.deps;s;s=s.nextDep)Wc(s)}const n=e.dep.subs;n!==e&&(e.prevSub=n,n&&(n.nextSub=e)),e.dep.subs=e}}const Rr=new WeakMap,Kn=Symbol(""),Xo=Symbol(""),js=Symbol("");function ot(e,t,n){if(It&&Fe){let s=Rr.get(e);s||Rr.set(e,s=new Map);let r=s.get(n);r||(s.set(n,r=new Hi),r.map=s,r.key=n),r.track()}}function sn(e,t,n,s,r,o){const i=Rr.get(e);if(!i){Hs++;return}const a=l=>{l&&l.trigger()};if(Ui(),t==="clear")i.forEach(a);else{const l=le(e),c=l&&Qr(n);if(l&&n==="length"){const u=Number(s);i.forEach((f,d)=>{(d==="length"||d===js||!Jt(d)&&d>=u)&&a(f)})}else switch((n!==void 0||i.has(void 0))&&a(i.get(n)),c&&a(i.get(js)),t){case"add":l?c&&a(i.get("length")):(a(i.get(Kn)),ls(e)&&a(i.get(Xo)));break;case"delete":l||(a(i.get(Kn)),ls(e)&&a(i.get(Xo)));break;case"set":ls(e)&&a(i.get(Kn));break}}Vi()}function Ud(e,t){const n=Rr.get(e);return n&&n.get(t)}function Zn(e){const t=Ce(e);return t===e?t:(ot(t,"iterate",js),bt(e)?t:t.map(Rt))}function so(e){return ot(e=Ce(e),"iterate",js),e}function Ht(e,t){return dn(e)?us(ln(e)?Rt(t):t):Rt(t)}const Vd={__proto__:null,[Symbol.iterator](){return So(this,Symbol.iterator,e=>Ht(this,e))},concat(...e){return Zn(this).concat(...e.map(t=>le(t)?Zn(t):t))},entries(){return So(this,"entries",e=>(e[1]=Ht(this,e[1]),e))},every(e,t){return Qt(this,"every",e,t,void 0,arguments)},filter(e,t){return Qt(this,"filter",e,t,n=>n.map(s=>Ht(this,s)),arguments)},find(e,t){return Qt(this,"find",e,t,n=>Ht(this,n),arguments)},findIndex(e,t){return Qt(this,"findIndex",e,t,void 0,arguments)},findLast(e,t){return Qt(this,"findLast",e,t,n=>Ht(this,n),arguments)},findLastIndex(e,t){return Qt(this,"findLastIndex",e,t,void 0,arguments)},forEach(e,t){return Qt(this,"forEach",e,t,void 0,arguments)},includes(...e){return Co(this,"includes",e)},indexOf(...e){return Co(this,"indexOf",e)},join(e){return Zn(this).join(e)},lastIndexOf(...e){return Co(this,"lastIndexOf",e)},map(e,t){return Qt(this,"map",e,t,void 0,arguments)},pop(){return Es(this,"pop")},push(...e){return Es(this,"push",e)},reduce(e,...t){return Aa(this,"reduce",e,t)},reduceRight(e,...t){return Aa(this,"reduceRight",e,t)},shift(){return Es(this,"shift")},some(e,t){return Qt(this,"some",e,t,void 0,arguments)},splice(...e){return Es(this,"splice",e)},toReversed(){return Zn(this).toReversed()},toSorted(e){return Zn(this).toSorted(e)},toSpliced(...e){return Zn(this).toSpliced(...e)},unshift(...e){return Es(this,"unshift",e)},values(){return So(this,"values",e=>Ht(this,e))}};function So(e,t,n){const s=so(e),r=s[t]();return s!==e&&!bt(e)&&(r._next=r.next,r.next=()=>{const o=r._next();return o.done||(o.value=n(o.value)),o}),r}const Wd=Array.prototype;function Qt(e,t,n,s,r,o){const i=so(e),a=i!==e&&!bt(e),l=i[t];if(l!==Wd[t]){const f=l.apply(e,o);return a?Rt(f):f}let c=n;i!==e&&(a?c=function(f,d){return n.call(this,Ht(e,f),d,e)}:n.length>2&&(c=function(f,d){return n.call(this,f,d,e)}));const u=l.call(i,c,s);return a&&r?r(u):u}function Aa(e,t,n,s){const r=so(e),o=r!==e&&!bt(e);let i=n,a=!1;r!==e&&(o?(a=s.length===0,i=function(c,u,f){return a&&(a=!1,c=Ht(e,c)),n.call(this,c,Ht(e,u),f,e)}):n.length>3&&(i=function(c,u,f){return n.call(this,c,u,f,e)}));const l=r[t](i,...s);return a?Ht(e,l):l}function Co(e,t,n){const s=Ce(e);ot(s,"iterate",js);const r=s[t](...n);return(r===-1||r===!1)&&ro(n[0])?(n[0]=Ce(n[0]),s[t](...n)):r}function Es(e,t,n=[]){un(),Ui();const s=Ce(e)[t].apply(e,n);return Vi(),fn(),s}const Hd=Di("__proto__,__v_isRef,__isVue"),Hc=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(Jt));function jd(e){Jt(e)||(e=String(e));const t=Ce(this);return ot(t,"has",e),t.hasOwnProperty(e)}class jc{constructor(t=!1,n=!1){this._isReadonly=t,this._isShallow=n}get(t,n,s){if(n==="__v_skip")return t.__v_skip;const r=this._isReadonly,o=this._isShallow;if(n==="__v_isReactive")return!r;if(n==="__v_isReadonly")return r;if(n==="__v_isShallow")return o;if(n==="__v_raw")return s===(r?o?ep:Yc:o?qc:Gc).get(t)||Object.getPrototypeOf(t)===Object.getPrototypeOf(s)?t:void 0;const i=le(t);if(!r){let l;if(i&&(l=Vd[n]))return l;if(n==="hasOwnProperty")return jd}const a=Reflect.get(t,n,Ve(t)?t:s);if((Jt(n)?Hc.has(n):Hd(n))||(r||ot(t,"get",n),o))return a;if(Ve(a)){const l=i&&Qr(n)?a:a.value;return r&&Le(l)?Pr(l):l}return Le(a)?r?Pr(a):_s(a):a}}class Kc extends jc{constructor(t=!1){super(!1,t)}set(t,n,s,r){let o=t[n];const i=le(t)&&Qr(n);if(!this._isShallow){const c=dn(o);if(!bt(s)&&!dn(s)&&(o=Ce(o),s=Ce(s)),!i&&Ve(o)&&!Ve(s))return c||(o.value=s),!0}const a=i?Number(n)e,fr=e=>Reflect.getPrototypeOf(e);function zd(e,t,n){return function(...s){const r=this.__v_raw,o=Ce(r),i=ls(o),a=e==="entries"||e===Symbol.iterator&&i,l=e==="keys"&&i,c=r[e](...s),u=n?Jo:t?us:Rt;return!t&&ot(o,"iterate",l?Xo:Kn),Xe(Object.create(c),{next(){const{value:f,done:d}=c.next();return d?{value:f,done:d}:{value:a?[u(f[0]),u(f[1])]:u(f),done:d}}})}}function dr(e){return function(...t){return e==="delete"?!1:e==="clear"?void 0:this}}function Xd(e,t){const n={get(r){const o=this.__v_raw,i=Ce(o),a=Ce(r);e||(Kt(r,a)&&ot(i,"get",r),ot(i,"get",a));const{has:l}=fr(i),c=t?Jo:e?us:Rt;if(l.call(i,r))return c(o.get(r));if(l.call(i,a))return c(o.get(a));o!==i&&o.get(r)},get size(){const r=this.__v_raw;return!e&&ot(Ce(r),"iterate",Kn),r.size},has(r){const o=this.__v_raw,i=Ce(o),a=Ce(r);return e||(Kt(r,a)&&ot(i,"has",r),ot(i,"has",a)),r===a?o.has(r):o.has(r)||o.has(a)},forEach(r,o){const i=this,a=i.__v_raw,l=Ce(a),c=t?Jo:e?us:Rt;return!e&&ot(l,"iterate",Kn),a.forEach((u,f)=>r.call(o,c(u),c(f),i))}};return Xe(n,e?{add:dr("add"),set:dr("set"),delete:dr("delete"),clear:dr("clear")}:{add(r){const o=Ce(this),i=fr(o),a=Ce(r),l=!t&&!bt(r)&&!dn(r)?a:r;return i.has.call(o,l)||Kt(r,l)&&i.has.call(o,r)||Kt(a,l)&&i.has.call(o,a)||(o.add(l),sn(o,"add",l,l)),this},set(r,o){!t&&!bt(o)&&!dn(o)&&(o=Ce(o));const i=Ce(this),{has:a,get:l}=fr(i);let c=a.call(i,r);c||(r=Ce(r),c=a.call(i,r));const u=l.call(i,r);return i.set(r,o),c?Kt(o,u)&&sn(i,"set",r,o):sn(i,"add",r,o),this},delete(r){const o=Ce(this),{has:i,get:a}=fr(o);let l=i.call(o,r);l||(r=Ce(r),l=i.call(o,r)),a&&a.call(o,r);const c=o.delete(r);return l&&sn(o,"delete",r,void 0),c},clear(){const r=Ce(this),o=r.size!==0,i=r.clear();return o&&sn(r,"clear",void 0,void 0),i}}),["keys","values","entries",Symbol.iterator].forEach(r=>{n[r]=zd(r,e,t)}),n}function ji(e,t){const n=Xd(e,t);return(s,r,o)=>r==="__v_isReactive"?!e:r==="__v_isReadonly"?e:r==="__v_raw"?s:Reflect.get(Re(n,r)&&r in s?n:s,r,o)}const Jd={get:ji(!1,!1)},Qd={get:ji(!1,!0)},Zd={get:ji(!0,!1)};const Gc=new WeakMap,qc=new WeakMap,Yc=new WeakMap,ep=new WeakMap;function tp(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function np(e){return e.__v_skip||!Object.isExtensible(e)?0:tp(kd(e))}function _s(e){return dn(e)?e:Ki(e,!1,Gd,Jd,Gc)}function zc(e){return Ki(e,!1,Yd,Qd,qc)}function Pr(e){return Ki(e,!0,qd,Zd,Yc)}function Ki(e,t,n,s,r){if(!Le(e)||e.__v_raw&&!(t&&e.__v_isReactive))return e;const o=np(e);if(o===0)return e;const i=r.get(e);if(i)return i;const a=new Proxy(e,o===2?s:n);return r.set(e,a),a}function ln(e){return dn(e)?ln(e.__v_raw):!!(e&&e.__v_isReactive)}function dn(e){return!!(e&&e.__v_isReadonly)}function bt(e){return!!(e&&e.__v_isShallow)}function ro(e){return e?!!e.__v_raw:!1}function Ce(e){const t=e&&e.__v_raw;return t?Ce(t):e}function Gi(e){return!Re(e,"__v_skip")&&Object.isExtensible(e)&&Ic(e,"__v_skip",!0),e}const Rt=e=>Le(e)?_s(e):e,us=e=>Le(e)?Pr(e):e;function Ve(e){return e?e.__v_isRef===!0:!1}function G(e){return Jc(e,!1)}function Xc(e){return Jc(e,!0)}function Jc(e,t){return Ve(e)?e:new sp(e,t)}class sp{constructor(t,n){this.dep=new Hi,this.__v_isRef=!0,this.__v_isShallow=!1,this._rawValue=n?t:Ce(t),this._value=n?t:Rt(t),this.__v_isShallow=n}get value(){return this.dep.track(),this._value}set value(t){const n=this._rawValue,s=this.__v_isShallow||bt(t)||dn(t);t=s?t:Ce(t),Kt(t,n)&&(this._rawValue=t,this._value=s?t:Rt(t),this.dep.trigger())}}function he(e){return Ve(e)?e.value:e}const rp={get:(e,t,n)=>t==="__v_raw"?e:he(Reflect.get(e,t,n)),set:(e,t,n,s)=>{const r=e[t];return Ve(r)&&!Ve(n)?(r.value=n,!0):Reflect.set(e,t,n,s)}};function Qc(e){return ln(e)?e:new Proxy(e,rp)}function op(e){const t=le(e)?new Array(e.length):{};for(const n in e)t[n]=ap(e,n);return t}class ip{constructor(t,n,s){this._object=t,this._key=n,this._defaultValue=s,this.__v_isRef=!0,this._value=void 0,this._raw=Ce(t);let r=!0,o=t;if(!le(t)||!Qr(String(n)))do r=!ro(o)||bt(o);while(r&&(o=o.__v_raw));this._shallow=r}get value(){let t=this._object[this._key];return this._shallow&&(t=he(t)),this._value=t===void 0?this._defaultValue:t}set value(t){if(this._shallow&&Ve(this._raw[this._key])){const n=this._object[this._key];if(Ve(n)){n.value=t;return}}this._object[this._key]=t}get dep(){return Ud(this._raw,this._key)}}function ap(e,t,n){return new ip(e,t,n)}class lp{constructor(t,n,s){this.fn=t,this.setter=n,this._value=void 0,this.dep=new Hi(this),this.__v_isRef=!0,this.deps=void 0,this.depsTail=void 0,this.flags=16,this.globalVersion=Hs-1,this.next=void 0,this.effect=this,this.__v_isReadonly=!n,this.isSSR=s}notify(){if(this.flags|=16,!(this.flags&8)&&Fe!==this)return Fc(this,!0),!0}get value(){const t=this.dep.track();return Uc(this),t&&(t.version=this.dep.version),this._value}set value(t){this.setter&&this.setter(t)}}function cp(e,t,n=!1){let s,r;return me(e)?s=e:(s=e.get,r=e.set),new lp(s,r,n)}const pr={},Lr=new WeakMap;let $n;function up(e,t=!1,n=$n){if(n){let s=Lr.get(n);s||Lr.set(n,s=[]),s.push(e)}}function fp(e,t,n=Me){const{immediate:s,deep:r,once:o,scheduler:i,augmentJob:a,call:l}=n,c=S=>r?S:bt(S)||r===!1||r===0?rn(S,1):rn(S);let u,f,d,p,b=!1,h=!1;if(Ve(e)?(f=()=>e.value,b=bt(e)):ln(e)?(f=()=>c(e),b=!0):le(e)?(h=!0,b=e.some(S=>ln(S)||bt(S)),f=()=>e.map(S=>{if(Ve(S))return S.value;if(ln(S))return c(S);if(me(S))return l?l(S,2):S()})):me(e)?t?f=l?()=>l(e,2):e:f=()=>{if(d){un();try{d()}finally{fn()}}const S=$n;$n=u;try{return l?l(e,3,[p]):e(p)}finally{$n=S}}:f=zt,t&&r){const S=f,O=r===!0?1/0:r;f=()=>rn(S(),O)}const E=Oc(),v=()=>{u.stop(),E&&E.active&&Fi(E.effects,u)};if(o&&t){const S=t;t=(...O)=>{S(...O),v()}}let w=h?new Array(e.length).fill(pr):pr;const C=S=>{if(!(!(u.flags&1)||!u.dirty&&!S))if(t){const O=u.run();if(r||b||(h?O.some((D,k)=>Kt(D,w[k])):Kt(O,w))){d&&d();const D=$n;$n=u;try{const k=[O,w===pr?void 0:h&&w[0]===pr?[]:w,p];w=O,l?l(t,3,k):t(...k)}finally{$n=D}}}else u.run()};return a&&a(C),u=new Dc(f),u.scheduler=i?()=>i(C,!1):C,p=S=>up(S,!1,u),d=u.onStop=()=>{const S=Lr.get(u);if(S){if(l)l(S,4);else for(const O of S)O();Lr.delete(u)}},t?s?C(!0):w=u.run():i?i(C.bind(null,!0),!0):u.run(),v.pause=u.pause.bind(u),v.resume=u.resume.bind(u),v.stop=v,v}function rn(e,t=1/0,n){if(t<=0||!Le(e)||e.__v_skip||(n=n||new Map,(n.get(e)||0)>=t))return e;if(n.set(e,t),t--,Ve(e))rn(e.value,t,n);else if(le(e))for(let s=0;s{rn(s,t,n)});else if(Tc(e)){for(const s in e)rn(e[s],t,n);for(const s of Object.getOwnPropertySymbols(e))Object.prototype.propertyIsEnumerable.call(e,s)&&rn(e[s],t,n)}return e}function or(e,t,n,s){try{return s?e(...s):e()}catch(r){oo(r,t,n)}}function Pt(e,t,n,s){if(me(e)){const r=or(e,t,n,s);return r&&kc(r)&&r.catch(o=>{oo(o,t,n)}),r}if(le(e)){const r=[];for(let o=0;o>>1,r=ct[s],o=Ks(r);o=Ks(n)?ct.push(e):ct.splice(pp(t),0,e),e.flags|=1,eu()}}function eu(){Nr||(Nr=Zc.then(nu))}function hp(e){le(e)?cs.push(...e):wn&&e.id===-1?wn.splice(ns+1,0,e):e.flags&1||(cs.push(e),e.flags|=1),eu()}function Sa(e,t,n=Vt+1){for(;nKs(n)-Ks(s));if(cs.length=0,wn){wn.push(...t);return}for(wn=t,ns=0;nse.id==null?e.flags&2?-1:1/0:e.id;function nu(e){try{for(Vt=0;Vt{s._d&&Fr(-1);const o=Or(t);let i;try{i=e(...r)}finally{Or(o),s._d&&Fr(1)}return i};return s._n=!0,s._c=!0,s._d=!0,s}function Yi(e,t){if(vt===null)return e;const n=co(vt),s=e.dirs||(e.dirs=[]);for(let r=0;r1)return n&&me(t)?t.call(s&&s.proxy):t}}function mp(){return!!(ar()||Gn)}const gp=Symbol.for("v-scx"),vp=()=>wt(gp);function qe(e,t,n){return ru(e,t,n)}function ru(e,t,n=Me){const{immediate:s,deep:r,flush:o,once:i}=n,a=Xe({},n),l=t&&s||!t&&o!=="post";let c;if(Ys){if(o==="sync"){const p=vp();c=p.__watcherHandles||(p.__watcherHandles=[])}else if(!l){const p=()=>{};return p.stop=zt,p.resume=zt,p.pause=zt,p}}const u=it;a.call=(p,b,h)=>Pt(p,u,b,h);let f=!1;o==="post"?a.scheduler=p=>{st(p,u&&u.suspense)}:o!=="sync"&&(f=!0,a.scheduler=(p,b)=>{b?p():qi(p)}),a.augmentJob=p=>{t&&(p.flags|=4),f&&(p.flags|=2,u&&(p.id=u.uid,p.i=u))};const d=fp(e,t,a);return Ys&&(c?c.push(d):l&&d()),d}function yp(e,t,n){const s=this.proxy,r=We(e)?e.includes(".")?ou(s,e):()=>s[e]:e.bind(s,s);let o;me(t)?o=t:(o=t.handler,n=t);const i=lr(this),a=ru(r,o.bind(s),n);return i(),a}function ou(e,t){const n=t.split(".");return()=>{let s=e;for(let r=0;re.__isTeleport,Ms=e=>e&&(e.disabled||e.disabled===""),Ca=e=>e&&(e.defer||e.defer===""),ka=e=>typeof SVGElement<"u"&&e instanceof SVGElement,xa=e=>typeof MathMLElement=="function"&&e instanceof MathMLElement,Qo=(e,t)=>{const n=e&&e.to;return We(n)?t?t(n):null:n},lu={name:"Teleport",__isTeleport:!0,process(e,t,n,s,r,o,i,a,l,c){const{mc:u,pc:f,pbc:d,o:{insert:p,querySelector:b,createText:h,createComment:E}}=c,v=Ms(t.props);let{shapeFlag:w,children:C,dynamicChildren:S}=t;if(e==null){const O=t.el=h(""),D=t.anchor=h("");p(O,n,s),p(D,n,s);const k=(P,q)=>{w&16&&u(C,P,q,r,o,i,a,l)},I=()=>{const P=t.target=Qo(t.props,b),q=Zo(P,t,h,p);P&&(i!=="svg"&&ka(P)?i="svg":i!=="mathml"&&xa(P)&&(i="mathml"),r&&r.isCE&&(r.ce._teleportTargets||(r.ce._teleportTargets=new Set)).add(P),v||(k(P,q),Ar(t,!1)))};v&&(k(n,D),Ar(t,!0)),Ca(t.props)?(t.el.__isMounted=!1,st(()=>{I(),delete t.el.__isMounted},o)):I()}else{if(Ca(t.props)&&e.el.__isMounted===!1){st(()=>{lu.process(e,t,n,s,r,o,i,a,l,c)},o);return}t.el=e.el,t.targetStart=e.targetStart;const O=t.anchor=e.anchor,D=t.target=e.target,k=t.targetAnchor=e.targetAnchor,I=Ms(e.props),P=I?n:D,q=I?O:k;if(i==="svg"||ka(D)?i="svg":(i==="mathml"||xa(D))&&(i="mathml"),S?(d(e.dynamicChildren,S,P,r,o,i,a),Zi(e,t,!0)):l||f(e,t,P,q,r,o,i,a,!1),v)I?t.props&&e.props&&t.props.to!==e.props.to&&(t.props.to=e.props.to):hr(t,n,O,c,1);else if((t.props&&t.props.to)!==(e.props&&e.props.to)){const Y=t.target=Qo(t.props,b);Y&&hr(t,Y,null,c,0)}else I&&hr(t,D,k,c,1);Ar(t,v)}},remove(e,t,n,{um:s,o:{remove:r}},o){const{shapeFlag:i,children:a,anchor:l,targetStart:c,targetAnchor:u,target:f,props:d}=e;if(f&&(r(c),r(u)),o&&r(l),i&16){const p=o||!Ms(d);for(let b=0;b{e.isMounted=!0}),Ot(()=>{e.isUnmounting=!0}),e}const St=[Function,Array],uu={mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:St,onEnter:St,onAfterEnter:St,onEnterCancelled:St,onBeforeLeave:St,onLeave:St,onAfterLeave:St,onLeaveCancelled:St,onBeforeAppear:St,onAppear:St,onAfterAppear:St,onAppearCancelled:St},fu=e=>{const t=e.subTree;return t.component?fu(t.component):t},bp={name:"BaseTransition",props:uu,setup(e,{slots:t}){const n=ar(),s=cu();return()=>{const r=t.default&&zi(t.default(),!0);if(!r||!r.length)return;const o=du(r),i=Ce(e),{mode:a}=i;if(s.isLeaving)return ko(o);const l=Ta(o);if(!l)return ko(o);let c=Gs(l,i,s,n,f=>c=f);l.type!==ut&&Xn(l,c);let u=n.subTree&&Ta(n.subTree);if(u&&u.type!==ut&&!Un(u,l)&&fu(n).type!==ut){let f=Gs(u,i,s,n);if(Xn(u,f),a==="out-in"&&l.type!==ut)return s.isLeaving=!0,f.afterLeave=()=>{s.isLeaving=!1,n.job.flags&8||n.update(),delete f.afterLeave,u=void 0},ko(o);a==="in-out"&&l.type!==ut?f.delayLeave=(d,p,b)=>{const h=pu(s,u);h[String(u.key)]=u,d[Wt]=()=>{p(),d[Wt]=void 0,delete c.delayedLeave,u=void 0},c.delayedLeave=()=>{b(),delete c.delayedLeave,u=void 0}}:u=void 0}else u&&(u=void 0);return o}}};function du(e){let t=e[0];if(e.length>1){for(const n of e)if(n.type!==ut){t=n;break}}return t}const wp=bp;function pu(e,t){const{leavingVNodes:n}=e;let s=n.get(t.type);return s||(s=Object.create(null),n.set(t.type,s)),s}function Gs(e,t,n,s,r){const{appear:o,mode:i,persisted:a=!1,onBeforeEnter:l,onEnter:c,onAfterEnter:u,onEnterCancelled:f,onBeforeLeave:d,onLeave:p,onAfterLeave:b,onLeaveCancelled:h,onBeforeAppear:E,onAppear:v,onAfterAppear:w,onAppearCancelled:C}=t,S=String(e.key),O=pu(n,e),D=(P,q)=>{P&&Pt(P,s,9,q)},k=(P,q)=>{const Y=q[1];D(P,q),le(P)?P.every(B=>B.length<=1)&&Y():P.length<=1&&Y()},I={mode:i,persisted:a,beforeEnter(P){let q=l;if(!n.isMounted)if(o)q=E||l;else return;P[Wt]&&P[Wt](!0);const Y=O[S];Y&&Un(e,Y)&&Y.el[Wt]&&Y.el[Wt](),D(q,[P])},enter(P){if(O[S]===e)return;let q=c,Y=u,B=f;if(!n.isMounted)if(o)q=v||c,Y=w||u,B=C||f;else return;let ae=!1;P[As]=ve=>{ae||(ae=!0,ve?D(B,[P]):D(Y,[P]),I.delayedLeave&&I.delayedLeave(),P[As]=void 0)};const re=P[As].bind(null,!1);q?k(q,[P,re]):re()},leave(P,q){const Y=String(e.key);if(P[As]&&P[As](!0),n.isUnmounting)return q();D(d,[P]);let B=!1;P[Wt]=re=>{B||(B=!0,q(),re?D(h,[P]):D(b,[P]),P[Wt]=void 0,O[Y]===e&&delete O[Y])};const ae=P[Wt].bind(null,!1);O[Y]=e,p?k(p,[P,ae]):ae()},clone(P){const q=Gs(P,t,n,s,r);return r&&r(q),q}};return I}function ko(e){if(io(e))return e=xn(e),e.children=null,e}function Ta(e){if(!io(e))return au(e.type)&&e.children?du(e.children):e;if(e.component)return e.component.subTree;const{shapeFlag:t,children:n}=e;if(n){if(t&16)return n[0];if(t&32&&me(n.default))return n.default()}}function Xn(e,t){e.shapeFlag&6&&e.component?(e.transition=t,Xn(e.component.subTree,t)):e.shapeFlag&128?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function zi(e,t=!1,n){let s=[],r=0;for(let o=0;o1)for(let o=0;oFs(h,t&&(le(t)?t[E]:t),n,s,r));return}if($s(s)&&!r){s.shapeFlag&512&&s.type.__asyncResolved&&s.component.subTree.component&&Fs(e,t,n,s.component.subTree);return}const o=s.shapeFlag&4?co(s.component):s.el,i=r?null:o,{i:a,r:l}=e,c=t&&t.r,u=a.refs===Me?a.refs={}:a.refs,f=a.setupState,d=Ce(f),p=f===Me?Cc:h=>Ia(u,h)?!1:Re(d,h),b=(h,E)=>!(E&&Ia(u,E));if(c!=null&&c!==l){if(Ra(t),We(c))u[c]=null,p(c)&&(f[c]=null);else if(Ve(c)){const h=t;b(c,h.k)&&(c.value=null),h.k&&(u[h.k]=null)}}if(me(l))or(l,a,12,[i,u]);else{const h=We(l),E=Ve(l);if(h||E){const v=()=>{if(e.f){const w=h?p(l)?f[l]:u[l]:b()||!e.k?l.value:u[e.k];if(r)le(w)&&Fi(w,o);else if(le(w))w.includes(o)||w.push(o);else if(h)u[l]=[o],p(l)&&(f[l]=u[l]);else{const C=[o];b(l,e.k)&&(l.value=C),e.k&&(u[e.k]=C)}}else h?(u[l]=i,p(l)&&(f[l]=i)):E&&(b(l,e.k)&&(l.value=i),e.k&&(u[e.k]=i))};if(i){const w=()=>{v(),Dr.delete(e)};w.id=-1,Dr.set(e,w),st(w,n)}else Ra(e),v()}}}function Ra(e){const t=Dr.get(e);t&&(t.flags|=8,Dr.delete(e))}no().requestIdleCallback;no().cancelIdleCallback;const $s=e=>!!e.type.__asyncLoader,io=e=>e.type.__isKeepAlive;function Ep(e,t){mu(e,"a",t)}function Ap(e,t){mu(e,"da",t)}function mu(e,t,n=it){const s=e.__wdc||(e.__wdc=()=>{let r=n;for(;r;){if(r.isDeactivated)return;r=r.parent}return e()});if(ao(t,s,n),n){let r=n.parent;for(;r&&r.parent;)io(r.parent.vnode)&&Sp(s,t,n,r),r=r.parent}}function Sp(e,t,n,s){const r=ao(t,e,s,!0);Xi(()=>{Fi(s[t],r)},n)}function ao(e,t,n=it,s=!1){if(n){const r=n[e]||(n[e]=[]),o=t.__weh||(t.__weh=(...i)=>{un();const a=lr(n),l=Pt(t,n,e,i);return a(),fn(),l});return s?r.unshift(o):r.push(o),o}}const hn=e=>(t,n=it)=>{(!Ys||e==="sp")&&ao(e,(...s)=>t(...s),n)},Cp=hn("bm"),ht=hn("m"),kp=hn("bu"),gu=hn("u"),Ot=hn("bum"),Xi=hn("um"),xp=hn("sp"),Tp=hn("rtg"),Ip=hn("rtc");function Rp(e,t=it){ao("ec",e,t)}const vu="components";function yu(e,t){return bu(vu,e,!0,t)||e}const _u=Symbol.for("v-ndc");function $w(e){return We(e)?bu(vu,e,!1)||e:e||_u}function bu(e,t,n=!0,s=!1){const r=vt||it;if(r){const o=r.type;{const a=hh(o,!1);if(a&&(a===t||a===ft(t)||a===eo(ft(t))))return o}const i=Pa(r[e]||o[e],t)||Pa(r.appContext[e],t);return!i&&s?o:i}}function Pa(e,t){return e&&(e[t]||e[ft(t)]||e[eo(ft(t))])}function Gt(e,t,n,s){let r;const o=n&&n[s],i=le(e);if(i||We(e)){const a=i&&ln(e);let l=!1,c=!1;a&&(l=!bt(e),c=dn(e),e=so(e)),r=new Array(e.length);for(let u=0,f=e.length;ut(a,l,void 0,o&&o[l]));else{const a=Object.keys(e);r=new Array(a.length);for(let l=0,c=a.length;le?Bu(e)?co(e):ei(e.parent):null,Bs=Xe(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>ei(e.parent),$root:e=>ei(e.root),$host:e=>e.ce,$emit:e=>e.emit,$options:e=>Eu(e),$forceUpdate:e=>e.f||(e.f=()=>{qi(e.update)}),$nextTick:e=>e.n||(e.n=Jn.bind(e.proxy)),$watch:e=>yp.bind(e)}),xo=(e,t)=>e!==Me&&!e.__isScriptSetup&&Re(e,t),Pp={get({_:e},t){if(t==="__v_skip")return!0;const{ctx:n,setupState:s,data:r,props:o,accessCache:i,type:a,appContext:l}=e;if(t[0]!=="$"){const d=i[t];if(d!==void 0)switch(d){case 1:return s[t];case 2:return r[t];case 4:return n[t];case 3:return o[t]}else{if(xo(s,t))return i[t]=1,s[t];if(r!==Me&&Re(r,t))return i[t]=2,r[t];if(Re(o,t))return i[t]=3,o[t];if(n!==Me&&Re(n,t))return i[t]=4,n[t];ti&&(i[t]=0)}}const c=Bs[t];let u,f;if(c)return t==="$attrs"&&ot(e.attrs,"get",""),c(e);if((u=a.__cssModules)&&(u=u[t]))return u;if(n!==Me&&Re(n,t))return i[t]=4,n[t];if(f=l.config.globalProperties,Re(f,t))return f[t]},set({_:e},t,n){const{data:s,setupState:r,ctx:o}=e;return xo(r,t)?(r[t]=n,!0):s!==Me&&Re(s,t)?(s[t]=n,!0):Re(e.props,t)||t[0]==="$"&&t.slice(1)in e?!1:(o[t]=n,!0)},has({_:{data:e,setupState:t,accessCache:n,ctx:s,appContext:r,props:o,type:i}},a){let l;return!!(n[a]||e!==Me&&a[0]!=="$"&&Re(e,a)||xo(t,a)||Re(o,a)||Re(s,a)||Re(Bs,a)||Re(r.config.globalProperties,a)||(l=i.__cssModules)&&l[a])},defineProperty(e,t,n){return n.get!=null?e._.accessCache[t]=0:Re(n,"value")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}};function La(e){return le(e)?e.reduce((t,n)=>(t[n]=null,t),{}):e}let ti=!0;function Lp(e){const t=Eu(e),n=e.proxy,s=e.ctx;ti=!1,t.beforeCreate&&Na(t.beforeCreate,e,"bc");const{data:r,computed:o,methods:i,watch:a,provide:l,inject:c,created:u,beforeMount:f,mounted:d,beforeUpdate:p,updated:b,activated:h,deactivated:E,beforeDestroy:v,beforeUnmount:w,destroyed:C,unmounted:S,render:O,renderTracked:D,renderTriggered:k,errorCaptured:I,serverPrefetch:P,expose:q,inheritAttrs:Y,components:B,directives:ae,filters:re}=t;if(c&&Np(c,s,null),i)for(const N in i){const W=i[N];me(W)&&(s[N]=W.bind(n))}if(r){const N=r.call(n,n);Le(N)&&(e.data=_s(N))}if(ti=!0,o)for(const N in o){const W=o[N],X=me(W)?W.bind(n,n):me(W.get)?W.get.bind(n,n):zt,ge=!me(W)&&me(W.set)?W.set.bind(n):zt,j=pe({get:X,set:ge});Object.defineProperty(s,N,{enumerable:!0,configurable:!0,get:()=>j.value,set:K=>j.value=K})}if(a)for(const N in a)wu(a[N],s,n,N);if(l){const N=me(l)?l.call(n):l;Reflect.ownKeys(N).forEach(W=>{Er(W,N[W])})}u&&Na(u,e,"c");function ce(N,W){le(W)?W.forEach(X=>N(X.bind(n))):W&&N(W.bind(n))}if(ce(Cp,f),ce(ht,d),ce(kp,p),ce(gu,b),ce(Ep,h),ce(Ap,E),ce(Rp,I),ce(Ip,D),ce(Tp,k),ce(Ot,w),ce(Xi,S),ce(xp,P),le(q))if(q.length){const N=e.exposed||(e.exposed={});q.forEach(W=>{Object.defineProperty(N,W,{get:()=>n[W],set:X=>n[W]=X,enumerable:!0})})}else e.exposed||(e.exposed={});O&&e.render===zt&&(e.render=O),Y!=null&&(e.inheritAttrs=Y),B&&(e.components=B),ae&&(e.directives=ae),P&&hu(e)}function Np(e,t,n=zt){le(e)&&(e=ni(e));for(const s in e){const r=e[s];let o;Le(r)?"default"in r?o=wt(r.from||s,r.default,!0):o=wt(r.from||s):o=wt(r),Ve(o)?Object.defineProperty(t,s,{enumerable:!0,configurable:!0,get:()=>o.value,set:i=>o.value=i}):t[s]=o}}function Na(e,t,n){Pt(le(e)?e.map(s=>s.bind(t.proxy)):e.bind(t.proxy),t,n)}function wu(e,t,n,s){let r=s.includes(".")?ou(n,s):()=>n[s];if(We(e)){const o=t[e];me(o)&&qe(r,o)}else if(me(e))qe(r,e.bind(n));else if(Le(e))if(le(e))e.forEach(o=>wu(o,t,n,s));else{const o=me(e.handler)?e.handler.bind(n):t[e.handler];me(o)&&qe(r,o,e)}}function Eu(e){const t=e.type,{mixins:n,extends:s}=t,{mixins:r,optionsCache:o,config:{optionMergeStrategies:i}}=e.appContext,a=o.get(t);let l;return a?l=a:!r.length&&!n&&!s?l=t:(l={},r.length&&r.forEach(c=>Mr(l,c,i,!0)),Mr(l,t,i)),Le(t)&&o.set(t,l),l}function Mr(e,t,n,s=!1){const{mixins:r,extends:o}=t;o&&Mr(e,o,n,!0),r&&r.forEach(i=>Mr(e,i,n,!0));for(const i in t)if(!(s&&i==="expose")){const a=Op[i]||n&&n[i];e[i]=a?a(e[i],t[i]):t[i]}return e}const Op={data:Oa,props:Da,emits:Da,methods:Rs,computed:Rs,beforeCreate:at,created:at,beforeMount:at,mounted:at,beforeUpdate:at,updated:at,beforeDestroy:at,beforeUnmount:at,destroyed:at,unmounted:at,activated:at,deactivated:at,errorCaptured:at,serverPrefetch:at,components:Rs,directives:Rs,watch:Mp,provide:Oa,inject:Dp};function Oa(e,t){return t?e?function(){return Xe(me(e)?e.call(this,this):e,me(t)?t.call(this,this):t)}:t:e}function Dp(e,t){return Rs(ni(e),ni(t))}function ni(e){if(le(e)){const t={};for(let n=0;nt==="modelValue"||t==="model-value"?e.modelModifiers:e[`${t}Modifiers`]||e[`${ft(t)}Modifiers`]||e[`${In(t)}Modifiers`];function Up(e,t,...n){if(e.isUnmounted)return;const s=e.vnode.props||Me;let r=n;const o=t.startsWith("update:"),i=o&&Bp(s,t.slice(7));i&&(i.trim&&(r=n.map(u=>We(u)?u.trim():u)),i.number&&(r=n.map(to)));let a,l=s[a=wo(t)]||s[a=wo(ft(t))];!l&&o&&(l=s[a=wo(In(t))]),l&&Pt(l,e,6,r);const c=s[a+"Once"];if(c){if(!e.emitted)e.emitted={};else if(e.emitted[a])return;e.emitted[a]=!0,Pt(c,e,6,r)}}const Vp=new WeakMap;function Su(e,t,n=!1){const s=n?Vp:t.emitsCache,r=s.get(e);if(r!==void 0)return r;const o=e.emits;let i={},a=!1;if(!me(e)){const l=c=>{const u=Su(c,t,!0);u&&(a=!0,Xe(i,u))};!n&&t.mixins.length&&t.mixins.forEach(l),e.extends&&l(e.extends),e.mixins&&e.mixins.forEach(l)}return!o&&!a?(Le(e)&&s.set(e,null),null):(le(o)?o.forEach(l=>i[l]=null):Xe(i,o),Le(e)&&s.set(e,i),i)}function lo(e,t){return!e||!Jr(t)?!1:(t=t.slice(2).replace(/Once$/,""),Re(e,t[0].toLowerCase()+t.slice(1))||Re(e,In(t))||Re(e,t))}function Ma(e){const{type:t,vnode:n,proxy:s,withProxy:r,propsOptions:[o],slots:i,attrs:a,emit:l,render:c,renderCache:u,props:f,data:d,setupState:p,ctx:b,inheritAttrs:h}=e,E=Or(e);let v,w;try{if(n.shapeFlag&4){const S=r||s,O=S;v=jt(c.call(O,S,u,f,p,d,b)),w=a}else{const S=t;v=jt(S.length>1?S(f,{attrs:a,slots:i,emit:l}):S(f,null)),w=t.props?a:Wp(a)}}catch(S){Us.length=0,oo(S,e,1),v=de(ut)}let C=v;if(w&&h!==!1){const S=Object.keys(w),{shapeFlag:O}=C;S.length&&O&7&&(o&&S.some(Mi)&&(w=Hp(w,o)),C=xn(C,w,!1,!0))}return n.dirs&&(C=xn(C,null,!1,!0),C.dirs=C.dirs?C.dirs.concat(n.dirs):n.dirs),n.transition&&Xn(C,n.transition),v=C,Or(E),v}const Wp=e=>{let t;for(const n in e)(n==="class"||n==="style"||Jr(n))&&((t||(t={}))[n]=e[n]);return t},Hp=(e,t)=>{const n={};for(const s in e)(!Mi(s)||!(s.slice(9)in t))&&(n[s]=e[s]);return n};function jp(e,t,n){const{props:s,children:r,component:o}=e,{props:i,children:a,patchFlag:l}=t,c=o.emitsOptions;if(t.dirs||t.transition)return!0;if(n&&l>=0){if(l&1024)return!0;if(l&16)return s?Fa(s,i,c):!!i;if(l&8){const u=t.dynamicProps;for(let f=0;fObject.create(ku),Tu=e=>Object.getPrototypeOf(e)===ku;function Gp(e,t,n,s=!1){const r={},o=xu();e.propsDefaults=Object.create(null),Iu(e,t,r,o);for(const i in e.propsOptions[0])i in r||(r[i]=void 0);n?e.props=s?r:zc(r):e.type.props?e.props=r:e.props=o,e.attrs=o}function qp(e,t,n,s){const{props:r,attrs:o,vnode:{patchFlag:i}}=e,a=Ce(r),[l]=e.propsOptions;let c=!1;if((s||i>0)&&!(i&16)){if(i&8){const u=e.vnode.dynamicProps;for(let f=0;f{l=!0;const[d,p]=Ru(f,t,!0);Xe(i,d),p&&a.push(...p)};!n&&t.mixins.length&&t.mixins.forEach(u),e.extends&&u(e.extends),e.mixins&&e.mixins.forEach(u)}if(!o&&!l)return Le(e)&&s.set(e,as),as;if(le(o))for(let u=0;ue==="_"||e==="_ctx"||e==="$stable",Qi=e=>le(e)?e.map(jt):[jt(e)],zp=(e,t,n)=>{if(t._n)return t;const s=Ye((...r)=>Qi(t(...r)),n);return s._c=!1,s},Pu=(e,t,n)=>{const s=e._ctx;for(const r in e){if(Ji(r))continue;const o=e[r];if(me(o))t[r]=zp(r,o,s);else if(o!=null){const i=Qi(o);t[r]=()=>i}}},Lu=(e,t)=>{const n=Qi(t);e.slots.default=()=>n},Nu=(e,t,n)=>{for(const s in t)(n||!Ji(s))&&(e[s]=t[s])},Xp=(e,t,n)=>{const s=e.slots=xu();if(e.vnode.shapeFlag&32){const r=t._;r?(Nu(s,t,n),n&&Ic(s,"_",r,!0)):Pu(t,s)}else t&&Lu(e,t)},Jp=(e,t,n)=>{const{vnode:s,slots:r}=e;let o=!0,i=Me;if(s.shapeFlag&32){const a=t._;a?n&&a===1?o=!1:Nu(r,t,n):(o=!t.$stable,Pu(t,r)),i=t}else t&&(Lu(e,t),i={default:1});if(o)for(const a in r)!Ji(a)&&i[a]==null&&delete r[a]},st=nh;function Qp(e){return Zp(e)}function Zp(e,t){const n=no();n.__VUE__=!0;const{insert:s,remove:r,patchProp:o,createElement:i,createText:a,createComment:l,setText:c,setElementText:u,parentNode:f,nextSibling:d,setScopeId:p=zt,insertStaticContent:b}=e,h=(y,A,R,$=null,V=null,U=null,m=void 0,g=null,x=!!A.dynamicChildren)=>{if(y===A)return;y&&!Un(y,A)&&($=M(y),K(y,V,U,!0),y=null),A.patchFlag===-2&&(x=!1,A.dynamicChildren=null);const{type:L,ref:Q,shapeFlag:H}=A;switch(L){case ir:E(y,A,R,$);break;case ut:v(y,A,R,$);break;case Sr:y==null&&w(A,R,$,m);break;case Be:B(y,A,R,$,V,U,m,g,x);break;default:H&1?O(y,A,R,$,V,U,m,g,x):H&6?ae(y,A,R,$,V,U,m,g,x):(H&64||H&128)&&L.process(y,A,R,$,V,U,m,g,x,se)}Q!=null&&V?Fs(Q,y&&y.ref,U,A||y,!A):Q==null&&y&&y.ref!=null&&Fs(y.ref,null,U,y,!0)},E=(y,A,R,$)=>{if(y==null)s(A.el=a(A.children),R,$);else{const V=A.el=y.el;A.children!==y.children&&c(V,A.children)}},v=(y,A,R,$)=>{y==null?s(A.el=l(A.children||""),R,$):A.el=y.el},w=(y,A,R,$)=>{[y.el,y.anchor]=b(y.children,A,R,$,y.el,y.anchor)},C=({el:y,anchor:A},R,$)=>{let V;for(;y&&y!==A;)V=d(y),s(y,R,$),y=V;s(A,R,$)},S=({el:y,anchor:A})=>{let R;for(;y&&y!==A;)R=d(y),r(y),y=R;r(A)},O=(y,A,R,$,V,U,m,g,x)=>{if(A.type==="svg"?m="svg":A.type==="math"&&(m="mathml"),y==null)D(A,R,$,V,U,m,g,x);else{const L=y.el&&y.el._isVueCE?y.el:null;try{L&&L._beginPatch(),P(y,A,V,U,m,g,x)}finally{L&&L._endPatch()}}},D=(y,A,R,$,V,U,m,g)=>{let x,L;const{props:Q,shapeFlag:H,transition:T,dirs:F}=y;if(x=y.el=i(y.type,U,Q&&Q.is,Q),H&8?u(x,y.children):H&16&&I(y.children,x,null,$,V,To(y,U),m,g),F&&On(y,null,$,"created"),k(x,y,y.scopeId,m,$),Q){for(const ue in Q)ue!=="value"&&!Ns(ue)&&o(x,ue,null,Q[ue],U,$);"value"in Q&&o(x,"value",null,Q.value,U),(L=Q.onVnodeBeforeMount)&&Ft(L,$,y)}F&&On(y,null,$,"beforeMount");const ne=eh(V,T);ne&&T.beforeEnter(x),s(x,A,R),((L=Q&&Q.onVnodeMounted)||ne||F)&&st(()=>{L&&Ft(L,$,y),ne&&T.enter(x),F&&On(y,null,$,"mounted")},V)},k=(y,A,R,$,V)=>{if(R&&p(y,R),$)for(let U=0;U<$.length;U++)p(y,$[U]);if(V){let U=V.subTree;if(A===U||Mu(U.type)&&(U.ssContent===A||U.ssFallback===A)){const m=V.vnode;k(y,m,m.scopeId,m.slotScopeIds,V.parent)}}},I=(y,A,R,$,V,U,m,g,x=0)=>{for(let L=x;L{const g=A.el=y.el;let{patchFlag:x,dynamicChildren:L,dirs:Q}=A;x|=y.patchFlag&16;const H=y.props||Me,T=A.props||Me;let F;if(R&&Dn(R,!1),(F=T.onVnodeBeforeUpdate)&&Ft(F,R,A,y),Q&&On(A,y,R,"beforeUpdate"),R&&Dn(R,!0),(H.innerHTML&&T.innerHTML==null||H.textContent&&T.textContent==null)&&u(g,""),L?q(y.dynamicChildren,L,g,R,$,To(A,V),U):m||W(y,A,g,null,R,$,To(A,V),U,!1),x>0){if(x&16)Y(g,H,T,R,V);else if(x&2&&H.class!==T.class&&o(g,"class",null,T.class,V),x&4&&o(g,"style",H.style,T.style,V),x&8){const ne=A.dynamicProps;for(let ue=0;ue{F&&Ft(F,R,A,y),Q&&On(A,y,R,"updated")},$)},q=(y,A,R,$,V,U,m)=>{for(let g=0;g{if(A!==R){if(A!==Me)for(const U in A)!Ns(U)&&!(U in R)&&o(y,U,A[U],null,V,$);for(const U in R){if(Ns(U))continue;const m=R[U],g=A[U];m!==g&&U!=="value"&&o(y,U,g,m,V,$)}"value"in R&&o(y,"value",A.value,R.value,V)}},B=(y,A,R,$,V,U,m,g,x)=>{const L=A.el=y?y.el:a(""),Q=A.anchor=y?y.anchor:a("");let{patchFlag:H,dynamicChildren:T,slotScopeIds:F}=A;F&&(g=g?g.concat(F):F),y==null?(s(L,R,$),s(Q,R,$),I(A.children||[],R,Q,V,U,m,g,x)):H>0&&H&64&&T&&y.dynamicChildren&&y.dynamicChildren.length===T.length?(q(y.dynamicChildren,T,R,V,U,m,g),(A.key!=null||V&&A===V.subTree)&&Zi(y,A,!0)):W(y,A,R,Q,V,U,m,g,x)},ae=(y,A,R,$,V,U,m,g,x)=>{A.slotScopeIds=g,y==null?A.shapeFlag&512?V.ctx.activate(A,R,$,m,x):re(A,R,$,V,U,m,x):ve(y,A,x)},re=(y,A,R,$,V,U,m)=>{const g=y.component=ch(y,$,V);if(io(y)&&(g.ctx.renderer=se),uh(g,!1,m),g.asyncDep){if(V&&V.registerDep(g,ce,m),!y.el){const x=g.subTree=de(ut);v(null,x,A,R),y.placeholder=x.el}}else ce(g,y,A,R,V,U,m)},ve=(y,A,R)=>{const $=A.component=y.component;if(jp(y,A,R))if($.asyncDep&&!$.asyncResolved){N($,A,R);return}else $.next=A,$.update();else A.el=y.el,$.vnode=A},ce=(y,A,R,$,V,U,m)=>{const g=()=>{if(y.isMounted){let{next:H,bu:T,u:F,parent:ne,vnode:ue}=y;{const xt=Ou(y);if(xt){H&&(H.el=ue.el,N(y,H,m)),xt.asyncDep.then(()=>{st(()=>{y.isUnmounted||L()},V)});return}}let Ee=H,He;Dn(y,!1),H?(H.el=ue.el,N(y,H,m)):H=ue,T&&wr(T),(He=H.props&&H.props.onVnodeBeforeUpdate)&&Ft(He,ne,H,ue),Dn(y,!0);const De=Ma(y),At=y.subTree;y.subTree=De,h(At,De,f(At.el),M(At),y,V,U),H.el=De.el,Ee===null&&Kp(y,De.el),F&&st(F,V),(He=H.props&&H.props.onVnodeUpdated)&&st(()=>Ft(He,ne,H,ue),V)}else{let H;const{el:T,props:F}=A,{bm:ne,m:ue,parent:Ee,root:He,type:De}=y,At=$s(A);Dn(y,!1),ne&&wr(ne),!At&&(H=F&&F.onVnodeBeforeMount)&&Ft(H,Ee,A),Dn(y,!0);{He.ce&&He.ce._hasShadowRoot()&&He.ce._injectChildStyle(De,y.parent?y.parent.type:void 0);const xt=y.subTree=Ma(y);h(null,xt,R,$,y,V,U),A.el=xt.el}if(ue&&st(ue,V),!At&&(H=F&&F.onVnodeMounted)){const xt=A;st(()=>Ft(H,Ee,xt),V)}(A.shapeFlag&256||Ee&&$s(Ee.vnode)&&Ee.vnode.shapeFlag&256)&&y.a&&st(y.a,V),y.isMounted=!0,A=R=$=null}};y.scope.on();const x=y.effect=new Dc(g);y.scope.off();const L=y.update=x.run.bind(x),Q=y.job=x.runIfDirty.bind(x);Q.i=y,Q.id=y.uid,x.scheduler=()=>qi(Q),Dn(y,!0),L()},N=(y,A,R)=>{A.component=y;const $=y.vnode.props;y.vnode=A,y.next=null,qp(y,A.props,$,R),Jp(y,A.children,R),un(),Sa(y),fn()},W=(y,A,R,$,V,U,m,g,x=!1)=>{const L=y&&y.children,Q=y?y.shapeFlag:0,H=A.children,{patchFlag:T,shapeFlag:F}=A;if(T>0){if(T&128){ge(L,H,R,$,V,U,m,g,x);return}else if(T&256){X(L,H,R,$,V,U,m,g,x);return}}F&8?(Q&16&&oe(L,V,U),H!==L&&u(R,H)):Q&16?F&16?ge(L,H,R,$,V,U,m,g,x):oe(L,V,U,!0):(Q&8&&u(R,""),F&16&&I(H,R,$,V,U,m,g,x))},X=(y,A,R,$,V,U,m,g,x)=>{y=y||as,A=A||as;const L=y.length,Q=A.length,H=Math.min(L,Q);let T;for(T=0;TQ?oe(y,V,U,!0,!1,H):I(A,R,$,V,U,m,g,x,H)},ge=(y,A,R,$,V,U,m,g,x)=>{let L=0;const Q=A.length;let H=y.length-1,T=Q-1;for(;L<=H&&L<=T;){const F=y[L],ne=A[L]=x?nn(A[L]):jt(A[L]);if(Un(F,ne))h(F,ne,R,null,V,U,m,g,x);else break;L++}for(;L<=H&&L<=T;){const F=y[H],ne=A[T]=x?nn(A[T]):jt(A[T]);if(Un(F,ne))h(F,ne,R,null,V,U,m,g,x);else break;H--,T--}if(L>H){if(L<=T){const F=T+1,ne=FT)for(;L<=H;)K(y[L],V,U,!0),L++;else{const F=L,ne=L,ue=new Map;for(L=ne;L<=T;L++){const mt=A[L]=x?nn(A[L]):jt(A[L]);mt.key!=null&&ue.set(mt.key,L)}let Ee,He=0;const De=T-ne+1;let At=!1,xt=0;const ws=new Array(De);for(L=0;L=De){K(mt,V,U,!0);continue}let Mt;if(mt.key!=null)Mt=ue.get(mt.key);else for(Ee=ne;Ee<=T;Ee++)if(ws[Ee-ne]===0&&Un(mt,A[Ee])){Mt=Ee;break}Mt===void 0?K(mt,V,U,!0):(ws[Mt-ne]=L+1,Mt>=xt?xt=Mt:At=!0,h(mt,A[Mt],R,null,V,U,m,g,x),He++)}const va=At?th(ws):as;for(Ee=va.length-1,L=De-1;L>=0;L--){const mt=ne+L,Mt=A[mt],ya=A[mt+1],_a=mt+1{const{el:U,type:m,transition:g,children:x,shapeFlag:L}=y;if(L&6){j(y.component.subTree,A,R,$);return}if(L&128){y.suspense.move(A,R,$);return}if(L&64){m.move(y,A,R,se);return}if(m===Be){s(U,A,R);for(let H=0;Hg.enter(U),V);else{const{leave:H,delayLeave:T,afterLeave:F}=g,ne=()=>{y.ctx.isUnmounted?r(U):s(U,A,R)},ue=()=>{U._isLeaving&&U[Wt](!0),H(U,()=>{ne(),F&&F()})};T?T(U,ne,ue):ue()}else s(U,A,R)},K=(y,A,R,$=!1,V=!1)=>{const{type:U,props:m,ref:g,children:x,dynamicChildren:L,shapeFlag:Q,patchFlag:H,dirs:T,cacheIndex:F}=y;if(H===-2&&(V=!1),g!=null&&(un(),Fs(g,null,R,y,!0),fn()),F!=null&&(A.renderCache[F]=void 0),Q&256){A.ctx.deactivate(y);return}const ne=Q&1&&T,ue=!$s(y);let Ee;if(ue&&(Ee=m&&m.onVnodeBeforeUnmount)&&Ft(Ee,A,y),Q&6)we(y.component,R,$);else{if(Q&128){y.suspense.unmount(R,$);return}ne&&On(y,null,A,"beforeUnmount"),Q&64?y.type.remove(y,A,R,se,$):L&&!L.hasOnce&&(U!==Be||H>0&&H&64)?oe(L,A,R,!1,!0):(U===Be&&H&384||!V&&Q&16)&&oe(x,A,R),$&&ie(y)}(ue&&(Ee=m&&m.onVnodeUnmounted)||ne)&&st(()=>{Ee&&Ft(Ee,A,y),ne&&On(y,null,A,"unmounted")},R)},ie=y=>{const{type:A,el:R,anchor:$,transition:V}=y;if(A===Be){Ae(R,$);return}if(A===Sr){S(y);return}const U=()=>{r(R),V&&!V.persisted&&V.afterLeave&&V.afterLeave()};if(y.shapeFlag&1&&V&&!V.persisted){const{leave:m,delayLeave:g}=V,x=()=>m(R,U);g?g(y.el,U,x):x()}else U()},Ae=(y,A)=>{let R;for(;y!==A;)R=d(y),r(y),y=R;r(A)},we=(y,A,R)=>{const{bum:$,scope:V,job:U,subTree:m,um:g,m:x,a:L}=y;Ba(x),Ba(L),$&&wr($),V.stop(),U&&(U.flags|=8,K(m,y,A,R)),g&&st(g,A),st(()=>{y.isUnmounted=!0},A)},oe=(y,A,R,$=!1,V=!1,U=0)=>{for(let m=U;m{if(y.shapeFlag&6)return M(y.component.subTree);if(y.shapeFlag&128)return y.suspense.next();const A=d(y.anchor||y.el),R=A&&A[iu];return R?d(R):A};let ee=!1;const J=(y,A,R)=>{let $;y==null?A._vnode&&(K(A._vnode,null,null,!0),$=A._vnode.component):h(A._vnode||null,y,A,null,null,null,R),A._vnode=y,ee||(ee=!0,Sa($),tu(),ee=!1)},se={p:h,um:K,m:j,r:ie,mt:re,mc:I,pc:W,pbc:q,n:M,o:e};return{render:J,hydrate:void 0,createApp:$p(J)}}function To({type:e,props:t},n){return n==="svg"&&e==="foreignObject"||n==="mathml"&&e==="annotation-xml"&&t&&t.encoding&&t.encoding.includes("html")?void 0:n}function Dn({effect:e,job:t},n){n?(e.flags|=32,t.flags|=4):(e.flags&=-33,t.flags&=-5)}function eh(e,t){return(!e||e&&!e.pendingBranch)&&t&&!t.persisted}function Zi(e,t,n=!1){const s=e.children,r=t.children;if(le(s)&&le(r))for(let o=0;o>1,e[n[a]]0&&(t[s]=n[o-1]),n[o]=s)}}for(o=n.length,i=n[o-1];o-- >0;)n[o]=i,i=t[i];return n}function Ou(e){const t=e.subTree.component;if(t)return t.asyncDep&&!t.asyncResolved?t:Ou(t)}function Ba(e){if(e)for(let t=0;te.__isSuspense;function nh(e,t){t&&t.pendingBranch?le(e)?t.effects.push(...e):t.effects.push(e):hp(e)}const Be=Symbol.for("v-fgt"),ir=Symbol.for("v-txt"),ut=Symbol.for("v-cmt"),Sr=Symbol.for("v-stc"),Us=[];let yt=null;function z(e=!1){Us.push(yt=e?null:[])}function sh(){Us.pop(),yt=Us[Us.length-1]||null}let qs=1;function Fr(e,t=!1){qs+=e,e<0&&yt&&t&&(yt.hasOnce=!0)}function Fu(e){return e.dynamicChildren=qs>0?yt||as:null,sh(),qs>0&&yt&&yt.push(e),e}function Z(e,t,n,s,r,o){return Fu(_(e,t,n,s,r,o,!0))}function dt(e,t,n,s,r){return Fu(de(e,t,n,s,r,!0))}function $r(e){return e?e.__v_isVNode===!0:!1}function Un(e,t){return e.type===t.type&&e.key===t.key}const $u=({key:e})=>e??null,Cr=({ref:e,ref_key:t,ref_for:n})=>(typeof e=="number"&&(e=""+e),e!=null?We(e)||Ve(e)||me(e)?{i:vt,r:e,k:t,f:!!n}:e:null);function _(e,t=null,n=null,s=0,r=null,o=e===Be?0:1,i=!1,a=!1){const l={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&$u(t),ref:t&&Cr(t),scopeId:su,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetStart:null,targetAnchor:null,staticCount:0,shapeFlag:o,patchFlag:s,dynamicProps:r,dynamicChildren:null,appContext:null,ctx:vt};return a?(ea(l,n),o&128&&e.normalize(l)):n&&(l.shapeFlag|=We(n)?8:16),qs>0&&!i&&yt&&(l.patchFlag>0||o&6)&&l.patchFlag!==32&&yt.push(l),l}const de=rh;function rh(e,t=null,n=null,s=0,r=null,o=!1){if((!e||e===_u)&&(e=ut),$r(e)){const a=xn(e,t,!0);return n&&ea(a,n),qs>0&&!o&&yt&&(a.shapeFlag&6?yt[yt.indexOf(e)]=a:yt.push(a)),a.patchFlag=-2,a}if(mh(e)&&(e=e.__vccOpts),t){t=oh(t);let{class:a,style:l}=t;a&&!We(a)&&(t.class=$e(a)),Le(l)&&(ro(l)&&!le(l)&&(l=Xe({},l)),t.style=Tt(l))}const i=We(e)?1:Mu(e)?128:au(e)?64:Le(e)?4:me(e)?2:0;return _(e,t,n,s,r,i,o,!0)}function oh(e){return e?ro(e)||Tu(e)?Xe({},e):e:null}function xn(e,t,n=!1,s=!1){const{props:r,ref:o,patchFlag:i,children:a,transition:l}=e,c=t?ih(r||{},t):r,u={__v_isVNode:!0,__v_skip:!0,type:e.type,props:c,key:c&&$u(c),ref:t&&t.ref?n&&o?le(o)?o.concat(Cr(t)):[o,Cr(t)]:Cr(t):o,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:a,target:e.target,targetStart:e.targetStart,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==Be?i===-1?16:i|16:i,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:l,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&xn(e.ssContent),ssFallback:e.ssFallback&&xn(e.ssFallback),placeholder:e.placeholder,el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce};return l&&s&&Xn(u,l.clone(u)),u}function kn(e=" ",t=0){return de(ir,null,e,t)}function Bw(e,t){const n=de(Sr,null,e);return n.staticCount=t,n}function be(e="",t=!1){return t?(z(),dt(ut,null,e)):de(ut,null,e)}function jt(e){return e==null||typeof e=="boolean"?de(ut):le(e)?de(Be,null,e.slice()):$r(e)?nn(e):de(ir,null,String(e))}function nn(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:xn(e)}function ea(e,t){let n=0;const{shapeFlag:s}=e;if(t==null)t=null;else if(le(t))n=16;else if(typeof t=="object")if(s&65){const r=t.default;r&&(r._c&&(r._d=!1),ea(e,r()),r._c&&(r._d=!0));return}else{n=32;const r=t._;!r&&!Tu(t)?t._ctx=vt:r===3&&vt&&(vt.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else me(t)?(t={default:t,_ctx:vt},n=32):(t=String(t),s&64?(n=16,t=[kn(t)]):n=8);e.children=t,e.shapeFlag|=n}function ih(...e){const t={};for(let n=0;nit||vt;let Br,ri;{const e=no(),t=(n,s)=>{let r;return(r=e[n])||(r=e[n]=[]),r.push(s),o=>{r.length>1?r.forEach(i=>i(o)):r[0](o)}};Br=t("__VUE_INSTANCE_SETTERS__",n=>it=n),ri=t("__VUE_SSR_SETTERS__",n=>Ys=n)}const lr=e=>{const t=it;return Br(e),e.scope.on(),()=>{e.scope.off(),Br(t)}},Ua=()=>{it&&it.scope.off(),Br(null)};function Bu(e){return e.vnode.shapeFlag&4}let Ys=!1;function uh(e,t=!1,n=!1){t&&ri(t);const{props:s,children:r}=e.vnode,o=Bu(e);Gp(e,s,o,t),Xp(e,r,n||t);const i=o?fh(e,t):void 0;return t&&ri(!1),i}function fh(e,t){const n=e.type;e.accessCache=Object.create(null),e.proxy=new Proxy(e.ctx,Pp);const{setup:s}=n;if(s){un();const r=e.setupContext=s.length>1?ph(e):null,o=lr(e),i=or(s,e,0,[e.props,r]),a=kc(i);if(fn(),o(),(a||e.sp)&&!$s(e)&&hu(e),a){if(i.then(Ua,Ua),t)return i.then(l=>{Va(e,l)}).catch(l=>{oo(l,e,0)});e.asyncDep=i}else Va(e,i)}else Uu(e)}function Va(e,t,n){me(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:Le(t)&&(e.setupState=Qc(t)),Uu(e)}function Uu(e,t,n){const s=e.type;e.render||(e.render=s.render||zt);{const r=lr(e);un();try{Lp(e)}finally{fn(),r()}}}const dh={get(e,t){return ot(e,"get",""),e[t]}};function ph(e){const t=n=>{e.exposed=n||{}};return{attrs:new Proxy(e.attrs,dh),slots:e.slots,emit:e.emit,expose:t}}function co(e){return e.exposed?e.exposeProxy||(e.exposeProxy=new Proxy(Qc(Gi(e.exposed)),{get(t,n){if(n in t)return t[n];if(n in Bs)return Bs[n](e)},has(t,n){return n in t||n in Bs}})):e.proxy}function hh(e,t=!0){return me(e)?e.displayName||e.name:e.name||t&&e.__name}function mh(e){return me(e)&&"__vccOpts"in e}const pe=(e,t)=>cp(e,t,Ys);function cr(e,t,n){try{Fr(-1);const s=arguments.length;return s===2?Le(t)&&!le(t)?$r(t)?de(e,null,[t]):de(e,t):de(e,null,t):(s>3?n=Array.prototype.slice.call(arguments,2):s===3&&$r(n)&&(n=[n]),de(e,t,n))}finally{Fr(1)}}const gh="3.5.30";let oi;const Wa=typeof window<"u"&&window.trustedTypes;if(Wa)try{oi=Wa.createPolicy("vue",{createHTML:e=>e})}catch{}const Vu=oi?e=>oi.createHTML(e):e=>e,vh="http://www.w3.org/2000/svg",yh="http://www.w3.org/1998/Math/MathML",tn=typeof document<"u"?document:null,Ha=tn&&tn.createElement("template"),_h={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,s)=>{const r=t==="svg"?tn.createElementNS(vh,e):t==="mathml"?tn.createElementNS(yh,e):n?tn.createElement(e,{is:n}):tn.createElement(e);return e==="select"&&s&&s.multiple!=null&&r.setAttribute("multiple",s.multiple),r},createText:e=>tn.createTextNode(e),createComment:e=>tn.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>tn.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,s,r,o){const i=n?n.previousSibling:t.lastChild;if(r&&(r===o||r.nextSibling))for(;t.insertBefore(r.cloneNode(!0),n),!(r===o||!(r=r.nextSibling)););else{Ha.innerHTML=Vu(s==="svg"?`${e}`:s==="mathml"?`${e}`:e);const a=Ha.content;if(s==="svg"||s==="mathml"){const l=a.firstChild;for(;l.firstChild;)a.appendChild(l.firstChild);a.removeChild(l)}t.insertBefore(a,n)}return[i?i.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},mn="transition",Ss="animation",fs=Symbol("_vtc"),Wu={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String},Hu=Xe({},uu,Wu),bh=e=>(e.displayName="Transition",e.props=Hu,e),tt=bh((e,{slots:t})=>cr(wp,ju(e),t)),Mn=(e,t=[])=>{le(e)?e.forEach(n=>n(...t)):e&&e(...t)},ja=e=>e?le(e)?e.some(t=>t.length>1):e.length>1:!1;function ju(e){const t={};for(const B in e)B in Wu||(t[B]=e[B]);if(e.css===!1)return t;const{name:n="v",type:s,duration:r,enterFromClass:o=`${n}-enter-from`,enterActiveClass:i=`${n}-enter-active`,enterToClass:a=`${n}-enter-to`,appearFromClass:l=o,appearActiveClass:c=i,appearToClass:u=a,leaveFromClass:f=`${n}-leave-from`,leaveActiveClass:d=`${n}-leave-active`,leaveToClass:p=`${n}-leave-to`}=e,b=wh(r),h=b&&b[0],E=b&&b[1],{onBeforeEnter:v,onEnter:w,onEnterCancelled:C,onLeave:S,onLeaveCancelled:O,onBeforeAppear:D=v,onAppear:k=w,onAppearCancelled:I=C}=t,P=(B,ae,re,ve)=>{B._enterCancelled=ve,_n(B,ae?u:a),_n(B,ae?c:i),re&&re()},q=(B,ae)=>{B._isLeaving=!1,_n(B,f),_n(B,p),_n(B,d),ae&&ae()},Y=B=>(ae,re)=>{const ve=B?k:w,ce=()=>P(ae,B,re);Mn(ve,[ae,ce]),Ka(()=>{_n(ae,B?l:o),Ut(ae,B?u:a),ja(ve)||Ga(ae,s,h,ce)})};return Xe(t,{onBeforeEnter(B){Mn(v,[B]),Ut(B,o),Ut(B,i)},onBeforeAppear(B){Mn(D,[B]),Ut(B,l),Ut(B,c)},onEnter:Y(!1),onAppear:Y(!0),onLeave(B,ae){B._isLeaving=!0;const re=()=>q(B,ae);Ut(B,f),B._enterCancelled?(Ut(B,d),ii(B)):(ii(B),Ut(B,d)),Ka(()=>{B._isLeaving&&(_n(B,f),Ut(B,p),ja(S)||Ga(B,s,E,re))}),Mn(S,[B,re])},onEnterCancelled(B){P(B,!1,void 0,!0),Mn(C,[B])},onAppearCancelled(B){P(B,!0,void 0,!0),Mn(I,[B])},onLeaveCancelled(B){q(B),Mn(O,[B])}})}function wh(e){if(e==null)return null;if(Le(e))return[Io(e.enter),Io(e.leave)];{const t=Io(e);return[t,t]}}function Io(e){return Id(e)}function Ut(e,t){t.split(/\s+/).forEach(n=>n&&e.classList.add(n)),(e[fs]||(e[fs]=new Set)).add(t)}function _n(e,t){t.split(/\s+/).forEach(s=>s&&e.classList.remove(s));const n=e[fs];n&&(n.delete(t),n.size||(e[fs]=void 0))}function Ka(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let Eh=0;function Ga(e,t,n,s){const r=e._endId=++Eh,o=()=>{r===e._endId&&s()};if(n!=null)return setTimeout(o,n);const{type:i,timeout:a,propCount:l}=Ku(e,t);if(!i)return s();const c=i+"end";let u=0;const f=()=>{e.removeEventListener(c,d),o()},d=p=>{p.target===e&&++u>=l&&f()};setTimeout(()=>{u(n[b]||"").split(", "),r=s(`${mn}Delay`),o=s(`${mn}Duration`),i=qa(r,o),a=s(`${Ss}Delay`),l=s(`${Ss}Duration`),c=qa(a,l);let u=null,f=0,d=0;t===mn?i>0&&(u=mn,f=i,d=o.length):t===Ss?c>0&&(u=Ss,f=c,d=l.length):(f=Math.max(i,c),u=f>0?i>c?mn:Ss:null,d=u?u===mn?o.length:l.length:0);const p=u===mn&&/\b(?:transform|all)(?:,|$)/.test(s(`${mn}Property`).toString());return{type:u,timeout:f,propCount:d,hasTransform:p}}function qa(e,t){for(;e.lengthYa(n)+Ya(e[s])))}function Ya(e){return e==="auto"?0:Number(e.slice(0,-1).replace(",","."))*1e3}function ii(e){return(e?e.ownerDocument:document).body.offsetHeight}function Ah(e,t,n){const s=e[fs];s&&(t=(t?[t,...s]:[...s]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}const Ur=Symbol("_vod"),Gu=Symbol("_vsh"),Uw={name:"show",beforeMount(e,{value:t},{transition:n}){e[Ur]=e.style.display==="none"?"":e.style.display,n&&t?n.beforeEnter(e):Cs(e,t)},mounted(e,{value:t},{transition:n}){n&&t&&n.enter(e)},updated(e,{value:t,oldValue:n},{transition:s}){!t!=!n&&(s?t?(s.beforeEnter(e),Cs(e,!0),s.enter(e)):s.leave(e,()=>{Cs(e,!1)}):Cs(e,t))},beforeUnmount(e,{value:t}){Cs(e,t)}};function Cs(e,t){e.style.display=t?e[Ur]:"none",e[Gu]=!t}const Sh=Symbol(""),Ch=/(?:^|;)\s*display\s*:/;function kh(e,t,n){const s=e.style,r=We(n);let o=!1;if(n&&!r){if(t)if(We(t))for(const i of t.split(";")){const a=i.slice(0,i.indexOf(":")).trim();n[a]==null&&kr(s,a,"")}else for(const i in t)n[i]==null&&kr(s,i,"");for(const i in n)i==="display"&&(o=!0),kr(s,i,n[i])}else if(r){if(t!==n){const i=s[Sh];i&&(n+=";"+i),s.cssText=n,o=Ch.test(n)}}else t&&e.removeAttribute("style");Ur in e&&(e[Ur]=o?s.display:"",e[Gu]&&(s.display="none"))}const za=/\s*!important$/;function kr(e,t,n){if(le(n))n.forEach(s=>kr(e,t,s));else if(n==null&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const s=xh(e,t);za.test(n)?e.setProperty(In(s),n.replace(za,""),"important"):e[s]=n}}const Xa=["Webkit","Moz","ms"],Ro={};function xh(e,t){const n=Ro[t];if(n)return n;let s=ft(t);if(s!=="filter"&&s in e)return Ro[t]=s;s=eo(s);for(let r=0;rPo||(Ph.then(()=>Po=0),Po=Date.now());function Nh(e,t){const n=s=>{if(!s._vts)s._vts=Date.now();else if(s._vts<=n.attached)return;Pt(Oh(s,n.value),t,5,[s])};return n.value=e,n.attached=Lh(),n}function Oh(e,t){if(le(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map(s=>r=>!r._stopped&&s&&s(r))}else return t}const nl=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,Dh=(e,t,n,s,r,o)=>{const i=r==="svg";t==="class"?Ah(e,s,i):t==="style"?kh(e,n,s):Jr(t)?Mi(t)||Ih(e,t,n,s,o):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):Mh(e,t,s,i))?(Za(e,t,s),!e.tagName.includes("-")&&(t==="value"||t==="checked"||t==="selected")&&Qa(e,t,s,i,o,t!=="value")):e._isVueCE&&(Fh(e,t)||e._def.__asyncLoader&&(/[A-Z]/.test(t)||!We(s)))?Za(e,ft(t),s,o,t):(t==="true-value"?e._trueValue=s:t==="false-value"&&(e._falseValue=s),Qa(e,t,s,i))};function Mh(e,t,n,s){if(s)return!!(t==="innerHTML"||t==="textContent"||t in e&&nl(t)&&me(n));if(t==="spellcheck"||t==="draggable"||t==="translate"||t==="autocorrect"||t==="sandbox"&&e.tagName==="IFRAME"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA")return!1;if(t==="width"||t==="height"){const r=e.tagName;if(r==="IMG"||r==="VIDEO"||r==="CANVAS"||r==="SOURCE")return!1}return nl(t)&&We(n)?!1:t in e}function Fh(e,t){const n=e._def.props;if(!n)return!1;const s=ft(t);return Array.isArray(n)?n.some(r=>ft(r)===s):Object.keys(n).some(r=>ft(r)===s)}const qu=new WeakMap,Yu=new WeakMap,Vr=Symbol("_moveCb"),sl=Symbol("_enterCb"),$h=e=>(delete e.props.mode,e),Bh=$h({name:"TransitionGroup",props:Xe({},Hu,{tag:String,moveClass:String}),setup(e,{slots:t}){const n=ar(),s=cu();let r,o;return gu(()=>{if(!r.length)return;const i=e.moveClass||`${e.name||"v"}-move`;if(!jh(r[0].el,n.vnode.el,i)){r=[];return}r.forEach(Vh),r.forEach(Wh);const a=r.filter(Hh);ii(n.vnode.el),a.forEach(l=>{const c=l.el,u=c.style;Ut(c,i),u.transform=u.webkitTransform=u.transitionDuration="";const f=c[Vr]=d=>{d&&d.target!==c||(!d||d.propertyName.endsWith("transform"))&&(c.removeEventListener("transitionend",f),c[Vr]=null,_n(c,i))};c.addEventListener("transitionend",f)}),r=[]}),()=>{const i=Ce(e),a=ju(i);let l=i.tag||Be;if(r=[],o)for(let c=0;c{a.split(/\s+/).forEach(l=>l&&s.classList.remove(l))}),n.split(/\s+/).forEach(a=>a&&s.classList.add(a)),s.style.display="none";const o=t.nodeType===1?t:t.parentNode;o.appendChild(s);const{hasTransform:i}=Ku(s);return o.removeChild(s),i}const ds=e=>{const t=e.props["onUpdate:modelValue"]||!1;return le(t)?n=>wr(t,n):t};function Kh(e){e.target.composing=!0}function rl(e){const t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event("input")))}const cn=Symbol("_assign");function ol(e,t,n){return t&&(e=e.trim()),n&&(e=to(e)),e}const Xu={created(e,{modifiers:{lazy:t,trim:n,number:s}},r){e[cn]=ds(r);const o=s||r.props&&r.props.type==="number";An(e,t?"change":"input",i=>{i.target.composing||e[cn](ol(e.value,n,o))}),(n||o)&&An(e,"change",()=>{e.value=ol(e.value,n,o)}),t||(An(e,"compositionstart",Kh),An(e,"compositionend",rl),An(e,"change",rl))},mounted(e,{value:t}){e.value=t??""},beforeUpdate(e,{value:t,oldValue:n,modifiers:{lazy:s,trim:r,number:o}},i){if(e[cn]=ds(i),e.composing)return;const a=(o||e.type==="number")&&!/^0\d/.test(e.value)?to(e.value):e.value,l=t??"";a!==l&&(document.activeElement===e&&e.type!=="range"&&(s&&t===n||r&&e.value.trim()===l)||(e.value=l))}},Gh={deep:!0,created(e,t,n){e[cn]=ds(n),An(e,"change",()=>{const s=e._modelValue,r=zs(e),o=e.checked,i=e[cn];if(le(s)){const a=$i(s,r),l=a!==-1;if(o&&!l)i(s.concat(r));else if(!o&&l){const c=[...s];c.splice(a,1),i(c)}}else if(vs(s)){const a=new Set(s);o?a.add(r):a.delete(r),i(a)}else i(Ju(e,o))})},mounted:il,beforeUpdate(e,t,n){e[cn]=ds(n),il(e,t,n)}};function il(e,{value:t,oldValue:n},s){e._modelValue=t;let r;if(le(t))r=$i(t,s.props.value)>-1;else if(vs(t))r=t.has(s.props.value);else{if(t===n)return;r=ys(t,Ju(e,!0))}e.checked!==r&&(e.checked=r)}const Vw={deep:!0,created(e,{value:t,modifiers:{number:n}},s){const r=vs(t);An(e,"change",()=>{const o=Array.prototype.filter.call(e.options,i=>i.selected).map(i=>n?to(zs(i)):zs(i));e[cn](e.multiple?r?new Set(o):o:o[0]),e._assigning=!0,Jn(()=>{e._assigning=!1})}),e[cn]=ds(s)},mounted(e,{value:t}){al(e,t)},beforeUpdate(e,t,n){e[cn]=ds(n)},updated(e,{value:t}){e._assigning||al(e,t)}};function al(e,t){const n=e.multiple,s=le(t);if(!(n&&!s&&!vs(t))){for(let r=0,o=e.options.length;rString(c)===String(a)):i.selected=$i(t,a)>-1}else i.selected=t.has(a);else if(ys(zs(i),t)){e.selectedIndex!==r&&(e.selectedIndex=r);return}}!n&&e.selectedIndex!==-1&&(e.selectedIndex=-1)}}function zs(e){return"_value"in e?e._value:e.value}function Ju(e,t){const n=t?"_trueValue":"_falseValue";return n in e?e[n]:t}const qh=["ctrl","shift","alt","meta"],Yh={stop:e=>e.stopPropagation(),prevent:e=>e.preventDefault(),self:e=>e.target!==e.currentTarget,ctrl:e=>!e.ctrlKey,shift:e=>!e.shiftKey,alt:e=>!e.altKey,meta:e=>!e.metaKey,left:e=>"button"in e&&e.button!==0,middle:e=>"button"in e&&e.button!==1,right:e=>"button"in e&&e.button!==2,exact:(e,t)=>qh.some(n=>e[`${n}Key`]&&!t.includes(n))},Tn=(e,t)=>{if(!e)return e;const n=e._withMods||(e._withMods={}),s=t.join(".");return n[s]||(n[s]=((r,...o)=>{for(let i=0;i{const n=e._withKeys||(e._withKeys={}),s=t.join(".");return n[s]||(n[s]=(r=>{if(!("key"in r))return;const o=In(r.key);if(t.some(i=>i===o||zh[i]===o))return e(r)}))},Xh=Xe({patchProp:Dh},_h);let ll;function Jh(){return ll||(ll=Qp(Xh))}const Qh=((...e)=>{const t=Jh().createApp(...e),{mount:n}=t;return t.mount=s=>{const r=em(s);if(!r)return;const o=t._component;!me(o)&&!o.render&&!o.template&&(o.template=r.innerHTML),r.nodeType===1&&(r.textContent="");const i=n(r,!1,Zh(r));return r instanceof Element&&(r.removeAttribute("v-cloak"),r.setAttribute("data-v-app","")),i},t});function Zh(e){if(e instanceof SVGElement)return"svg";if(typeof MathMLElement=="function"&&e instanceof MathMLElement)return"mathml"}function em(e){return We(e)?document.querySelector(e):e}let Zu;const uo=e=>Zu=e,ef=Symbol();function ai(e){return e&&typeof e=="object"&&Object.prototype.toString.call(e)==="[object Object]"&&typeof e.toJSON!="function"}var Vs;(function(e){e.direct="direct",e.patchObject="patch object",e.patchFunction="patch function"})(Vs||(Vs={}));function tm(){const e=Bi(!0),t=e.run(()=>G({}));let n=[],s=[];const r=Gi({install(o){uo(r),r._a=o,o.provide(ef,r),o.config.globalProperties.$pinia=r,s.forEach(i=>n.push(i)),s=[]},use(o){return this._a?n.push(o):s.push(o),this},_p:n,_a:null,_e:e,_s:new Map,state:t});return r}const tf=()=>{};function cl(e,t,n,s=tf){e.add(t);const r=()=>{e.delete(t)&&s()};return!n&&Oc()&&Fd(r),r}function es(e,...t){e.forEach(n=>{n(...t)})}const nm=e=>e(),ul=Symbol(),Lo=Symbol();function li(e,t){e instanceof Map&&t instanceof Map?t.forEach((n,s)=>e.set(s,n)):e instanceof Set&&t instanceof Set&&t.forEach(e.add,e);for(const n in t){if(!t.hasOwnProperty(n))continue;const s=t[n],r=e[n];ai(r)&&ai(s)&&e.hasOwnProperty(n)&&!Ve(s)&&!ln(s)?e[n]=li(r,s):e[n]=s}return e}const sm=Symbol();function rm(e){return!ai(e)||!Object.prototype.hasOwnProperty.call(e,sm)}const{assign:bn}=Object;function om(e){return!!(Ve(e)&&e.effect)}function im(e,t,n,s){const{state:r,actions:o,getters:i}=t,a=n.state.value[e];let l;function c(){a||(n.state.value[e]=r?r():{});const u=op(n.state.value[e]);return bn(u,o,Object.keys(i||{}).reduce((f,d)=>(f[d]=Gi(pe(()=>{uo(n);const p=n._s.get(e);return i[d].call(p,p)})),f),{}))}return l=nf(e,c,t,n,s,!0),l}function nf(e,t,n={},s,r,o){let i;const a=bn({actions:{}},n),l={deep:!0};let c,u,f=new Set,d=new Set,p;const b=s.state.value[e];!o&&!b&&(s.state.value[e]={});let h;function E(I){let P;c=u=!1,typeof I=="function"?(I(s.state.value[e]),P={type:Vs.patchFunction,storeId:e,events:p}):(li(s.state.value[e],I),P={type:Vs.patchObject,payload:I,storeId:e,events:p});const q=h=Symbol();Jn().then(()=>{h===q&&(c=!0)}),u=!0,es(f,P,s.state.value[e])}const v=o?function(){const{state:P}=n,q=P?P():{};this.$patch(Y=>{bn(Y,q)})}:tf;function w(){i.stop(),f.clear(),d.clear(),s._s.delete(e)}const C=(I,P="")=>{if(ul in I)return I[Lo]=P,I;const q=function(){uo(s);const Y=Array.from(arguments),B=new Set,ae=new Set;function re(N){B.add(N)}function ve(N){ae.add(N)}es(d,{args:Y,name:q[Lo],store:O,after:re,onError:ve});let ce;try{ce=I.apply(this&&this.$id===e?this:O,Y)}catch(N){throw es(ae,N),N}return ce instanceof Promise?ce.then(N=>(es(B,N),N)).catch(N=>(es(ae,N),Promise.reject(N))):(es(B,ce),ce)};return q[ul]=!0,q[Lo]=P,q},S={_p:s,$id:e,$onAction:cl.bind(null,d),$patch:E,$reset:v,$subscribe(I,P={}){const q=cl(f,I,P.detached,()=>Y()),Y=i.run(()=>qe(()=>s.state.value[e],B=>{(P.flush==="sync"?u:c)&&I({storeId:e,type:Vs.direct,events:p},B)},bn({},l,P)));return q},$dispose:w},O=_s(S);s._s.set(e,O);const k=(s._a&&s._a.runWithContext||nm)(()=>s._e.run(()=>(i=Bi()).run(()=>t({action:C}))));for(const I in k){const P=k[I];if(Ve(P)&&!om(P)||ln(P))o||(b&&rm(P)&&(Ve(P)?P.value=b[I]:li(P,b[I])),s.state.value[e][I]=P);else if(typeof P=="function"){const q=C(P,I);k[I]=q,a.actions[I]=P}}return bn(O,k),bn(Ce(O),k),Object.defineProperty(O,"$state",{get:()=>s.state.value[e],set:I=>{E(P=>{bn(P,I)})}}),s._p.forEach(I=>{bn(O,i.run(()=>I({store:O,app:s._a,pinia:s,options:a})))}),b&&o&&n.hydrate&&n.hydrate(O.$state,b),c=!0,u=!0,O}function Qn(e,t,n){let s;const r=typeof t=="function";s=r?n:t;function o(i,a){const l=mp();return i=i||(l?wt(ef,null):null),i&&uo(i),i=Zu,i._s.has(e)||(r?nf(e,t,s,i):im(e,s,i)),i._s.get(e)}return o.$id=e,o}const am="modulepreload",lm=function(e){return"/"+e},fl={},_e=function(t,n,s){let r=Promise.resolve();if(n&&n.length>0){let l=function(c){return Promise.all(c.map(u=>Promise.resolve(u).then(f=>({status:"fulfilled",value:f}),f=>({status:"rejected",reason:f}))))};document.getElementsByTagName("link");const i=document.querySelector("meta[property=csp-nonce]"),a=i?.nonce||i?.getAttribute("nonce");r=l(n.map(c=>{if(c=lm(c),c in fl)return;fl[c]=!0;const u=c.endsWith(".css"),f=u?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${c}"]${f}`))return;const d=document.createElement("link");if(d.rel=u?"stylesheet":am,u||(d.as="script"),d.crossOrigin="",d.href=c,a&&d.setAttribute("nonce",a),document.head.appendChild(d),u)return new Promise((p,b)=>{d.addEventListener("load",p),d.addEventListener("error",()=>b(new Error(`Unable to preload CSS for ${c}`)))})}))}function o(i){const a=new Event("vite:preloadError",{cancelable:!0});if(a.payload=i,window.dispatchEvent(a),!a.defaultPrevented)throw i}return r.then(i=>{for(const a of i||[])a.status==="rejected"&&o(a.reason);return t().catch(o)})};const ss=typeof document<"u";function sf(e){return typeof e=="object"||"displayName"in e||"props"in e||"__vccOpts"in e}function cm(e){return e.__esModule||e[Symbol.toStringTag]==="Module"||e.default&&sf(e.default)}const Te=Object.assign;function No(e,t){const n={};for(const s in t){const r=t[s];n[s]=Lt(r)?r.map(e):e(r)}return n}const Ws=()=>{},Lt=Array.isArray;function dl(e,t){const n={};for(const s in e)n[s]=s in t?t[s]:e[s];return n}const rf=/#/g,um=/&/g,fm=/\//g,dm=/=/g,pm=/\?/g,of=/\+/g,hm=/%5B/g,mm=/%5D/g,af=/%5E/g,gm=/%60/g,lf=/%7B/g,vm=/%7C/g,cf=/%7D/g,ym=/%20/g;function ta(e){return e==null?"":encodeURI(""+e).replace(vm,"|").replace(hm,"[").replace(mm,"]")}function _m(e){return ta(e).replace(lf,"{").replace(cf,"}").replace(af,"^")}function ci(e){return ta(e).replace(of,"%2B").replace(ym,"+").replace(rf,"%23").replace(um,"%26").replace(gm,"`").replace(lf,"{").replace(cf,"}").replace(af,"^")}function bm(e){return ci(e).replace(dm,"%3D")}function wm(e){return ta(e).replace(rf,"%23").replace(pm,"%3F")}function Em(e){return wm(e).replace(fm,"%2F")}function Xs(e){if(e==null)return null;try{return decodeURIComponent(""+e)}catch{}return""+e}const Am=/\/$/,Sm=e=>e.replace(Am,"");function Oo(e,t,n="/"){let s,r={},o="",i="";const a=t.indexOf("#");let l=t.indexOf("?");return l=a>=0&&l>a?-1:l,l>=0&&(s=t.slice(0,l),o=t.slice(l,a>0?a:t.length),r=e(o.slice(1))),a>=0&&(s=s||t.slice(0,a),i=t.slice(a,t.length)),s=Tm(s??t,n),{fullPath:s+o+i,path:s,query:r,hash:Xs(i)}}function Cm(e,t){const n=t.query?e(t.query):"";return t.path+(n&&"?")+n+(t.hash||"")}function pl(e,t){return!t||!e.toLowerCase().startsWith(t.toLowerCase())?e:e.slice(t.length)||"/"}function km(e,t,n){const s=t.matched.length-1,r=n.matched.length-1;return s>-1&&s===r&&ps(t.matched[s],n.matched[r])&&uf(t.params,n.params)&&e(t.query)===e(n.query)&&t.hash===n.hash}function ps(e,t){return(e.aliasOf||e)===(t.aliasOf||t)}function uf(e,t){if(Object.keys(e).length!==Object.keys(t).length)return!1;for(var n in e)if(!xm(e[n],t[n]))return!1;return!0}function xm(e,t){return Lt(e)?hl(e,t):Lt(t)?hl(t,e):e?.valueOf()===t?.valueOf()}function hl(e,t){return Lt(t)?e.length===t.length&&e.every((n,s)=>n===t[s]):e.length===1&&e[0]===t}function Tm(e,t){if(e.startsWith("/"))return e;if(!e)return t;const n=t.split("/"),s=e.split("/"),r=s[s.length-1];(r===".."||r===".")&&s.push("");let o=n.length-1,i,a;for(i=0;i1&&o--;else break;return n.slice(0,o).join("/")+"/"+s.slice(i).join("/")}const gn={path:"/",name:void 0,params:{},query:{},hash:"",fullPath:"/",matched:[],meta:{},redirectedFrom:void 0};let ui=(function(e){return e.pop="pop",e.push="push",e})({}),Do=(function(e){return e.back="back",e.forward="forward",e.unknown="",e})({});function Im(e){if(!e)if(ss){const t=document.querySelector("base");e=t&&t.getAttribute("href")||"/",e=e.replace(/^\w+:\/\/[^\/]+/,"")}else e="/";return e[0]!=="/"&&e[0]!=="#"&&(e="/"+e),Sm(e)}const Rm=/^[^#]+#/;function Pm(e,t){return e.replace(Rm,"#")+t}function Lm(e,t){const n=document.documentElement.getBoundingClientRect(),s=e.getBoundingClientRect();return{behavior:t.behavior,left:s.left-n.left-(t.left||0),top:s.top-n.top-(t.top||0)}}const fo=()=>({left:window.scrollX,top:window.scrollY});function Nm(e){let t;if("el"in e){const n=e.el,s=typeof n=="string"&&n.startsWith("#"),r=typeof n=="string"?s?document.getElementById(n.slice(1)):document.querySelector(n):n;if(!r)return;t=Lm(r,e)}else t=e;"scrollBehavior"in document.documentElement.style?window.scrollTo(t):window.scrollTo(t.left!=null?t.left:window.scrollX,t.top!=null?t.top:window.scrollY)}function ml(e,t){return(history.state?history.state.position-t:-1)+e}const fi=new Map;function Om(e,t){fi.set(e,t)}function Dm(e){const t=fi.get(e);return fi.delete(e),t}function Mm(e){return typeof e=="string"||e&&typeof e=="object"}function ff(e){return typeof e=="string"||typeof e=="symbol"}let je=(function(e){return e[e.MATCHER_NOT_FOUND=1]="MATCHER_NOT_FOUND",e[e.NAVIGATION_GUARD_REDIRECT=2]="NAVIGATION_GUARD_REDIRECT",e[e.NAVIGATION_ABORTED=4]="NAVIGATION_ABORTED",e[e.NAVIGATION_CANCELLED=8]="NAVIGATION_CANCELLED",e[e.NAVIGATION_DUPLICATED=16]="NAVIGATION_DUPLICATED",e})({});const df=Symbol("");je.MATCHER_NOT_FOUND+"",je.NAVIGATION_GUARD_REDIRECT+"",je.NAVIGATION_ABORTED+"",je.NAVIGATION_CANCELLED+"",je.NAVIGATION_DUPLICATED+"";function hs(e,t){return Te(new Error,{type:e,[df]:!0},t)}function Zt(e,t){return e instanceof Error&&df in e&&(t==null||!!(e.type&t))}const Fm=["params","query","hash"];function $m(e){if(typeof e=="string")return e;if(e.path!=null)return e.path;const t={};for(const n of Fm)n in e&&(t[n]=e[n]);return JSON.stringify(t,null,2)}function Bm(e){const t={};if(e===""||e==="?")return t;const n=(e[0]==="?"?e.slice(1):e).split("&");for(let s=0;sr&&ci(r)):[s&&ci(s)]).forEach(r=>{r!==void 0&&(t+=(t.length?"&":"")+n,r!=null&&(t+="="+r))})}return t}function Um(e){const t={};for(const n in e){const s=e[n];s!==void 0&&(t[n]=Lt(s)?s.map(r=>r==null?null:""+r):s==null?s:""+s)}return t}const Vm=Symbol(""),vl=Symbol(""),po=Symbol(""),na=Symbol(""),di=Symbol("");function ks(){let e=[];function t(s){return e.push(s),()=>{const r=e.indexOf(s);r>-1&&e.splice(r,1)}}function n(){e=[]}return{add:t,list:()=>e.slice(),reset:n}}function En(e,t,n,s,r,o=i=>i()){const i=s&&(s.enterCallbacks[r]=s.enterCallbacks[r]||[]);return()=>new Promise((a,l)=>{const c=d=>{d===!1?l(hs(je.NAVIGATION_ABORTED,{from:n,to:t})):d instanceof Error?l(d):Mm(d)?l(hs(je.NAVIGATION_GUARD_REDIRECT,{from:t,to:d})):(i&&s.enterCallbacks[r]===i&&typeof d=="function"&&i.push(d),a())},u=o(()=>e.call(s&&s.instances[r],t,n,c));let f=Promise.resolve(u);e.length<3&&(f=f.then(c)),f.catch(d=>l(d))})}function Mo(e,t,n,s,r=o=>o()){const o=[];for(const i of e)for(const a in i.components){let l=i.components[a];if(!(t!=="beforeRouteEnter"&&!i.instances[a]))if(sf(l)){const c=(l.__vccOpts||l)[t];c&&o.push(En(c,n,s,i,a,r))}else{let c=l();o.push(()=>c.then(u=>{if(!u)throw new Error(`Couldn't resolve component "${a}" at "${i.path}"`);const f=cm(u)?u.default:u;i.mods[a]=u,i.components[a]=f;const d=(f.__vccOpts||f)[t];return d&&En(d,n,s,i,a,r)()}))}}return o}function Wm(e,t){const n=[],s=[],r=[],o=Math.max(t.matched.length,e.matched.length);for(let i=0;ips(c,a))?s.push(a):n.push(a));const l=e.matched[i];l&&(t.matched.find(c=>ps(c,l))||r.push(l))}return[n,s,r]}let Hm=()=>location.protocol+"//"+location.host;function pf(e,t){const{pathname:n,search:s,hash:r}=t,o=e.indexOf("#");if(o>-1){let i=r.includes(e.slice(o))?e.slice(o).length:1,a=r.slice(i);return a[0]!=="/"&&(a="/"+a),pl(a,"")}return pl(n,e)+s+r}function jm(e,t,n,s){let r=[],o=[],i=null;const a=({state:d})=>{const p=pf(e,location),b=n.value,h=t.value;let E=0;if(d){if(n.value=p,t.value=d,i&&i===b){i=null;return}E=h?d.position-h.position:0}else s(p);r.forEach(v=>{v(n.value,b,{delta:E,type:ui.pop,direction:E?E>0?Do.forward:Do.back:Do.unknown})})};function l(){i=n.value}function c(d){r.push(d);const p=()=>{const b=r.indexOf(d);b>-1&&r.splice(b,1)};return o.push(p),p}function u(){if(document.visibilityState==="hidden"){const{history:d}=window;if(!d.state)return;d.replaceState(Te({},d.state,{scroll:fo()}),"")}}function f(){for(const d of o)d();o=[],window.removeEventListener("popstate",a),window.removeEventListener("pagehide",u),document.removeEventListener("visibilitychange",u)}return window.addEventListener("popstate",a),window.addEventListener("pagehide",u),document.addEventListener("visibilitychange",u),{pauseListeners:l,listen:c,destroy:f}}function yl(e,t,n,s=!1,r=!1){return{back:e,current:t,forward:n,replaced:s,position:window.history.length,scroll:r?fo():null}}function Km(e){const{history:t,location:n}=window,s={value:pf(e,n)},r={value:t.state};r.value||o(s.value,{back:null,current:s.value,forward:null,position:t.length-1,replaced:!0,scroll:null},!0);function o(l,c,u){const f=e.indexOf("#"),d=f>-1?(n.host&&document.querySelector("base")?e:e.slice(f))+l:Hm()+e+l;try{t[u?"replaceState":"pushState"](c,"",d),r.value=c}catch(p){console.error(p),n[u?"replace":"assign"](d)}}function i(l,c){o(l,Te({},t.state,yl(r.value.back,l,r.value.forward,!0),c,{position:r.value.position}),!0),s.value=l}function a(l,c){const u=Te({},r.value,t.state,{forward:l,scroll:fo()});o(u.current,u,!0),o(l,Te({},yl(s.value,l,null),{position:u.position+1},c),!1),s.value=l}return{location:s,state:r,push:a,replace:i}}function Gm(e){e=Im(e);const t=Km(e),n=jm(e,t.state,t.location,t.replace);function s(o,i=!0){i||n.pauseListeners(),history.go(o)}const r=Te({location:"",base:e,go:s,createHref:Pm.bind(null,e)},t,n);return Object.defineProperty(r,"location",{enumerable:!0,get:()=>t.location.value}),Object.defineProperty(r,"state",{enumerable:!0,get:()=>t.state.value}),r}let Hn=(function(e){return e[e.Static=0]="Static",e[e.Param=1]="Param",e[e.Group=2]="Group",e})({});var Je=(function(e){return e[e.Static=0]="Static",e[e.Param=1]="Param",e[e.ParamRegExp=2]="ParamRegExp",e[e.ParamRegExpEnd=3]="ParamRegExpEnd",e[e.EscapeNext=4]="EscapeNext",e})(Je||{});const qm={type:Hn.Static,value:""},Ym=/[a-zA-Z0-9_]/;function zm(e){if(!e)return[[]];if(e==="/")return[[qm]];if(!e.startsWith("/"))throw new Error(`Invalid path "${e}"`);function t(p){throw new Error(`ERR (${n})/"${c}": ${p}`)}let n=Je.Static,s=n;const r=[];let o;function i(){o&&r.push(o),o=[]}let a=0,l,c="",u="";function f(){c&&(n===Je.Static?o.push({type:Hn.Static,value:c}):n===Je.Param||n===Je.ParamRegExp||n===Je.ParamRegExpEnd?(o.length>1&&(l==="*"||l==="+")&&t(`A repeatable param (${c}) must be alone in its segment. eg: '/:ids+.`),o.push({type:Hn.Param,value:c,regexp:u,repeatable:l==="*"||l==="+",optional:l==="*"||l==="?"})):t("Invalid state to consume buffer"),c="")}function d(){c+=l}for(;at.length?t.length===1&&t[0]===lt.Static+lt.Segment?1:-1:0}function hf(e,t){let n=0;const s=e.score,r=t.score;for(;n0&&t[t.length-1]<0}const eg={strict:!1,end:!0,sensitive:!1};function tg(e,t,n){const s=Qm(zm(e.path),n),r=Te(s,{record:e,parent:t,children:[],alias:[]});return t&&!r.record.aliasOf==!t.record.aliasOf&&t.children.push(r),r}function ng(e,t){const n=[],s=new Map;t=dl(eg,t);function r(f){return s.get(f)}function o(f,d,p){const b=!p,h=El(f);h.aliasOf=p&&p.record;const E=dl(t,f),v=[h];if("alias"in f){const S=typeof f.alias=="string"?[f.alias]:f.alias;for(const O of S)v.push(El(Te({},h,{components:p?p.record.components:h.components,path:O,aliasOf:p?p.record:h})))}let w,C;for(const S of v){const{path:O}=S;if(d&&O[0]!=="/"){const D=d.record.path,k=D[D.length-1]==="/"?"":"/";S.path=d.record.path+(O&&k+O)}if(w=tg(S,d,E),p?p.alias.push(w):(C=C||w,C!==w&&C.alias.push(w),b&&f.name&&!Al(w)&&i(f.name)),mf(w)&&l(w),h.children){const D=h.children;for(let k=0;k{i(C)}:Ws}function i(f){if(ff(f)){const d=s.get(f);d&&(s.delete(f),n.splice(n.indexOf(d),1),d.children.forEach(i),d.alias.forEach(i))}else{const d=n.indexOf(f);d>-1&&(n.splice(d,1),f.record.name&&s.delete(f.record.name),f.children.forEach(i),f.alias.forEach(i))}}function a(){return n}function l(f){const d=og(f,n);n.splice(d,0,f),f.record.name&&!Al(f)&&s.set(f.record.name,f)}function c(f,d){let p,b={},h,E;if("name"in f&&f.name){if(p=s.get(f.name),!p)throw hs(je.MATCHER_NOT_FOUND,{location:f});E=p.record.name,b=Te(wl(d.params,p.keys.filter(C=>!C.optional).concat(p.parent?p.parent.keys.filter(C=>C.optional):[]).map(C=>C.name)),f.params&&wl(f.params,p.keys.map(C=>C.name))),h=p.stringify(b)}else if(f.path!=null)h=f.path,p=n.find(C=>C.re.test(h)),p&&(b=p.parse(h),E=p.record.name);else{if(p=d.name?s.get(d.name):n.find(C=>C.re.test(d.path)),!p)throw hs(je.MATCHER_NOT_FOUND,{location:f,currentLocation:d});E=p.record.name,b=Te({},d.params,f.params),h=p.stringify(b)}const v=[];let w=p;for(;w;)v.unshift(w.record),w=w.parent;return{name:E,path:h,params:b,matched:v,meta:rg(v)}}e.forEach(f=>o(f));function u(){n.length=0,s.clear()}return{addRoute:o,resolve:c,removeRoute:i,clearRoutes:u,getRoutes:a,getRecordMatcher:r}}function wl(e,t){const n={};for(const s of t)s in e&&(n[s]=e[s]);return n}function El(e){const t={path:e.path,redirect:e.redirect,name:e.name,meta:e.meta||{},aliasOf:e.aliasOf,beforeEnter:e.beforeEnter,props:sg(e),children:e.children||[],instances:{},leaveGuards:new Set,updateGuards:new Set,enterCallbacks:{},components:"components"in e?e.components||null:e.component&&{default:e.component}};return Object.defineProperty(t,"mods",{value:{}}),t}function sg(e){const t={},n=e.props||!1;if("component"in e)t.default=n;else for(const s in e.components)t[s]=typeof n=="object"?n[s]:n;return t}function Al(e){for(;e;){if(e.record.aliasOf)return!0;e=e.parent}return!1}function rg(e){return e.reduce((t,n)=>Te(t,n.meta),{})}function og(e,t){let n=0,s=t.length;for(;n!==s;){const o=n+s>>1;hf(e,t[o])<0?s=o:n=o+1}const r=ig(e);return r&&(s=t.lastIndexOf(r,s-1)),s}function ig(e){let t=e;for(;t=t.parent;)if(mf(t)&&hf(e,t)===0)return t}function mf({record:e}){return!!(e.name||e.components&&Object.keys(e.components).length||e.redirect)}function Sl(e){const t=wt(po),n=wt(na),s=pe(()=>{const l=he(e.to);return t.resolve(l)}),r=pe(()=>{const{matched:l}=s.value,{length:c}=l,u=l[c-1],f=n.matched;if(!u||!f.length)return-1;const d=f.findIndex(ps.bind(null,u));if(d>-1)return d;const p=Cl(l[c-2]);return c>1&&Cl(u)===p&&f[f.length-1].path!==p?f.findIndex(ps.bind(null,l[c-2])):d}),o=pe(()=>r.value>-1&&fg(n.params,s.value.params)),i=pe(()=>r.value>-1&&r.value===n.matched.length-1&&uf(n.params,s.value.params));function a(l={}){if(ug(l)){const c=t[he(e.replace)?"replace":"push"](he(e.to)).catch(Ws);return e.viewTransition&&typeof document<"u"&&"startViewTransition"in document&&document.startViewTransition(()=>c),c}return Promise.resolve()}return{route:s,href:pe(()=>s.value.href),isActive:o,isExactActive:i,navigate:a}}function ag(e){return e.length===1?e[0]:e}const lg=Ze({name:"RouterLink",compatConfig:{MODE:3},props:{to:{type:[String,Object],required:!0},replace:Boolean,activeClass:String,exactActiveClass:String,custom:Boolean,ariaCurrentValue:{type:String,default:"page"},viewTransition:Boolean},useLink:Sl,setup(e,{slots:t}){const n=_s(Sl(e)),{options:s}=wt(po),r=pe(()=>({[kl(e.activeClass,s.linkActiveClass,"router-link-active")]:n.isActive,[kl(e.exactActiveClass,s.linkExactActiveClass,"router-link-exact-active")]:n.isExactActive}));return()=>{const o=t.default&&ag(t.default(n));return e.custom?o:cr("a",{"aria-current":n.isExactActive?e.ariaCurrentValue:null,href:n.href,onClick:n.navigate,class:r.value},o)}}}),cg=lg;function ug(e){if(!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)&&!e.defaultPrevented&&!(e.button!==void 0&&e.button!==0)){if(e.currentTarget&&e.currentTarget.getAttribute){const t=e.currentTarget.getAttribute("target");if(/\b_blank\b/i.test(t))return}return e.preventDefault&&e.preventDefault(),!0}}function fg(e,t){for(const n in t){const s=t[n],r=e[n];if(typeof s=="string"){if(s!==r)return!1}else if(!Lt(r)||r.length!==s.length||s.some((o,i)=>o.valueOf()!==r[i].valueOf()))return!1}return!0}function Cl(e){return e?e.aliasOf?e.aliasOf.path:e.path:""}const kl=(e,t,n)=>e??t??n,dg=Ze({name:"RouterView",inheritAttrs:!1,props:{name:{type:String,default:"default"},route:Object},compatConfig:{MODE:3},setup(e,{attrs:t,slots:n}){const s=wt(di),r=pe(()=>e.route||s.value),o=wt(vl,0),i=pe(()=>{let c=he(o);const{matched:u}=r.value;let f;for(;(f=u[c])&&!f.components;)c++;return c}),a=pe(()=>r.value.matched[i.value]);Er(vl,pe(()=>i.value+1)),Er(Vm,a),Er(di,r);const l=G();return qe(()=>[l.value,a.value,e.name],([c,u,f],[d,p,b])=>{u&&(u.instances[f]=c,p&&p!==u&&c&&c===d&&(u.leaveGuards.size||(u.leaveGuards=p.leaveGuards),u.updateGuards.size||(u.updateGuards=p.updateGuards))),c&&u&&(!p||!ps(u,p)||!d)&&(u.enterCallbacks[f]||[]).forEach(h=>h(c))},{flush:"post"}),()=>{const c=r.value,u=e.name,f=a.value,d=f&&f.components[u];if(!d)return xl(n.default,{Component:d,route:c});const p=f.props[u],b=p?p===!0?c.params:typeof p=="function"?p(c):p:null,E=cr(d,Te({},b,t,{onVnodeUnmounted:v=>{v.component.isUnmounted&&(f.instances[u]=null)},ref:l}));return xl(n.default,{Component:E,route:c})||E}}});function xl(e,t){if(!e)return null;const n=e(t);return n.length===1?n[0]:n}const pg=dg;function hg(e){const t=ng(e.routes,e),n=e.parseQuery||Bm,s=e.stringifyQuery||gl,r=e.history,o=ks(),i=ks(),a=ks(),l=Xc(gn);let c=gn;ss&&e.scrollBehavior&&"scrollRestoration"in history&&(history.scrollRestoration="manual");const u=No.bind(null,M=>""+M),f=No.bind(null,Em),d=No.bind(null,Xs);function p(M,ee){let J,se;return ff(M)?(J=t.getRecordMatcher(M),se=ee):se=M,t.addRoute(se,J)}function b(M){const ee=t.getRecordMatcher(M);ee&&t.removeRoute(ee)}function h(){return t.getRoutes().map(M=>M.record)}function E(M){return!!t.getRecordMatcher(M)}function v(M,ee){if(ee=Te({},ee||l.value),typeof M=="string"){const R=Oo(n,M,ee.path),$=t.resolve({path:R.path},ee),V=r.createHref(R.fullPath);return Te(R,$,{params:d($.params),hash:Xs(R.hash),redirectedFrom:void 0,href:V})}let J;if(M.path!=null)J=Te({},M,{path:Oo(n,M.path,ee.path).path});else{const R=Te({},M.params);for(const $ in R)R[$]==null&&delete R[$];J=Te({},M,{params:f(R)}),ee.params=f(ee.params)}const se=t.resolve(J,ee),ye=M.hash||"";se.params=u(d(se.params));const y=Cm(s,Te({},M,{hash:_m(ye),path:se.path})),A=r.createHref(y);return Te({fullPath:y,hash:ye,query:s===gl?Um(M.query):M.query||{}},se,{redirectedFrom:void 0,href:A})}function w(M){return typeof M=="string"?Oo(n,M,l.value.path):Te({},M)}function C(M,ee){if(c!==M)return hs(je.NAVIGATION_CANCELLED,{from:ee,to:M})}function S(M){return k(M)}function O(M){return S(Te(w(M),{replace:!0}))}function D(M,ee){const J=M.matched[M.matched.length-1];if(J&&J.redirect){const{redirect:se}=J;let ye=typeof se=="function"?se(M,ee):se;return typeof ye=="string"&&(ye=ye.includes("?")||ye.includes("#")?ye=w(ye):{path:ye},ye.params={}),Te({query:M.query,hash:M.hash,params:ye.path!=null?{}:M.params},ye)}}function k(M,ee){const J=c=v(M),se=l.value,ye=M.state,y=M.force,A=M.replace===!0,R=D(J,se);if(R)return k(Te(w(R),{state:typeof R=="object"?Te({},ye,R.state):ye,force:y,replace:A}),ee||J);const $=J;$.redirectedFrom=ee;let V;return!y&&km(s,se,J)&&(V=hs(je.NAVIGATION_DUPLICATED,{to:$,from:se}),j(se,se,!0,!1)),(V?Promise.resolve(V):q($,se)).catch(U=>Zt(U)?Zt(U,je.NAVIGATION_GUARD_REDIRECT)?U:ge(U):W(U,$,se)).then(U=>{if(U){if(Zt(U,je.NAVIGATION_GUARD_REDIRECT))return k(Te({replace:A},w(U.to),{state:typeof U.to=="object"?Te({},ye,U.to.state):ye,force:y}),ee||$)}else U=B($,se,!0,A,ye);return Y($,se,U),U})}function I(M,ee){const J=C(M,ee);return J?Promise.reject(J):Promise.resolve()}function P(M){const ee=Ae.values().next().value;return ee&&typeof ee.runWithContext=="function"?ee.runWithContext(M):M()}function q(M,ee){let J;const[se,ye,y]=Wm(M,ee);J=Mo(se.reverse(),"beforeRouteLeave",M,ee);for(const R of se)R.leaveGuards.forEach($=>{J.push(En($,M,ee))});const A=I.bind(null,M,ee);return J.push(A),oe(J).then(()=>{J=[];for(const R of o.list())J.push(En(R,M,ee));return J.push(A),oe(J)}).then(()=>{J=Mo(ye,"beforeRouteUpdate",M,ee);for(const R of ye)R.updateGuards.forEach($=>{J.push(En($,M,ee))});return J.push(A),oe(J)}).then(()=>{J=[];for(const R of y)if(R.beforeEnter)if(Lt(R.beforeEnter))for(const $ of R.beforeEnter)J.push(En($,M,ee));else J.push(En(R.beforeEnter,M,ee));return J.push(A),oe(J)}).then(()=>(M.matched.forEach(R=>R.enterCallbacks={}),J=Mo(y,"beforeRouteEnter",M,ee,P),J.push(A),oe(J))).then(()=>{J=[];for(const R of i.list())J.push(En(R,M,ee));return J.push(A),oe(J)}).catch(R=>Zt(R,je.NAVIGATION_CANCELLED)?R:Promise.reject(R))}function Y(M,ee,J){a.list().forEach(se=>P(()=>se(M,ee,J)))}function B(M,ee,J,se,ye){const y=C(M,ee);if(y)return y;const A=ee===gn,R=ss?history.state:{};J&&(se||A?r.replace(M.fullPath,Te({scroll:A&&R&&R.scroll},ye)):r.push(M.fullPath,ye)),l.value=M,j(M,ee,J,A),ge()}let ae;function re(){ae||(ae=r.listen((M,ee,J)=>{if(!we.listening)return;const se=v(M),ye=D(se,we.currentRoute.value);if(ye){k(Te(ye,{replace:!0,force:!0}),se).catch(Ws);return}c=se;const y=l.value;ss&&Om(ml(y.fullPath,J.delta),fo()),q(se,y).catch(A=>Zt(A,je.NAVIGATION_ABORTED|je.NAVIGATION_CANCELLED)?A:Zt(A,je.NAVIGATION_GUARD_REDIRECT)?(k(Te(w(A.to),{force:!0}),se).then(R=>{Zt(R,je.NAVIGATION_ABORTED|je.NAVIGATION_DUPLICATED)&&!J.delta&&J.type===ui.pop&&r.go(-1,!1)}).catch(Ws),Promise.reject()):(J.delta&&r.go(-J.delta,!1),W(A,se,y))).then(A=>{A=A||B(se,y,!1),A&&(J.delta&&!Zt(A,je.NAVIGATION_CANCELLED)?r.go(-J.delta,!1):J.type===ui.pop&&Zt(A,je.NAVIGATION_ABORTED|je.NAVIGATION_DUPLICATED)&&r.go(-1,!1)),Y(se,y,A)}).catch(Ws)}))}let ve=ks(),ce=ks(),N;function W(M,ee,J){ge(M);const se=ce.list();return se.length?se.forEach(ye=>ye(M,ee,J)):console.error(M),Promise.reject(M)}function X(){return N&&l.value!==gn?Promise.resolve():new Promise((M,ee)=>{ve.add([M,ee])})}function ge(M){return N||(N=!M,re(),ve.list().forEach(([ee,J])=>M?J(M):ee()),ve.reset()),M}function j(M,ee,J,se){const{scrollBehavior:ye}=e;if(!ss||!ye)return Promise.resolve();const y=!J&&Dm(ml(M.fullPath,0))||(se||!J)&&history.state&&history.state.scroll||null;return Jn().then(()=>ye(M,ee,y)).then(A=>A&&Nm(A)).catch(A=>W(A,M,ee))}const K=M=>r.go(M);let ie;const Ae=new Set,we={currentRoute:l,listening:!0,addRoute:p,removeRoute:b,clearRoutes:t.clearRoutes,hasRoute:E,getRoutes:h,resolve:v,options:e,push:S,replace:O,go:K,back:()=>K(-1),forward:()=>K(1),beforeEach:o.add,beforeResolve:i.add,afterEach:a.add,onError:ce.add,isReady:X,install(M){M.component("RouterLink",cg),M.component("RouterView",pg),M.config.globalProperties.$router=we,Object.defineProperty(M.config.globalProperties,"$route",{enumerable:!0,get:()=>he(l)}),ss&&!ie&&l.value===gn&&(ie=!0,S(r.location).catch(se=>{}));const ee={};for(const se in gn)Object.defineProperty(ee,se,{get:()=>l.value[se],enumerable:!0});M.provide(po,we),M.provide(na,zc(ee)),M.provide(di,l);const J=M.unmount;Ae.add(M),M.unmount=function(){Ae.delete(M),Ae.size<1&&(c=gn,ae&&ae(),ae=null,l.value=gn,ie=!1,N=!1),J()}}};function oe(M){return M.reduce((ee,J)=>ee.then(()=>P(J)),Promise.resolve())}return we}function ho(){return wt(po)}function gf(e){return wt(na)}const mg="/assets/img/bg-intro.jpg",gg="/assets/video/video-intro.mp4?v=7",vg="/assets/img/logo-archipelago.svg",yg={class:"block w-full h-full logo-svg",viewBox:"0 0 1024 1024",fill:"none",xmlns:"http://www.w3.org/2000/svg","aria-label":"Neode"},_g=["x","y","width","height"],bg=Ze({__name:"AnimatedLogo",props:{size:{default:"sm"},noBorder:{type:Boolean,default:!1},fit:{type:Boolean,default:!1}},setup(e){const t=e,n=t.fit?"w-full h-full max-w-full max-h-full":t.size==="xl"?"w-48 h-48 sm:w-64 sm:h-64 md:w-80 md:h-80":t.size==="lg"?"w-32 h-32 sm:w-48 sm:h-48":"w-14 h-14",s=[{x:357.614,y:318,w:71.007,h:70.936},{x:436.152,y:318,w:72.082,h:70.936},{x:515.766,y:318,w:72.082,h:70.936},{x:595.379,y:318,w:71.007,h:70.936},{x:595.379,y:396.46,w:71.007,h:72.011},{x:673.917,y:396.46,w:72.083,h:72.011},{x:278,y:475.994,w:72.083,h:72.012},{x:357.614,y:475.994,w:71.007,h:72.012},{x:436.152,y:475.994,w:72.082,h:72.012},{x:515.766,y:475.994,w:72.082,h:72.012},{x:595.379,y:475.994,w:71.007,h:72.012},{x:673.917,y:475.994,w:72.083,h:72.012},{x:278,y:555.529,w:72.083,h:70.936},{x:357.614,y:555.529,w:71.007,h:70.936},{x:595.379,y:555.529,w:71.007,h:70.936},{x:673.917,y:555.529,w:72.083,h:70.936},{x:357.614,y:633.989,w:71.007,h:72.011},{x:436.152,y:633.989,w:72.082,h:72.011},{x:515.766,y:633.989,w:72.082,h:72.011},{x:595.379,y:633.989,w:71.007,h:72.011}],r=[0,100,200,300,400,500,600,700,800,900,1e3,1100,1200,1300,1400,1500,1600,1700,1800,1900];return(o,i)=>(z(),Z("div",{class:$e(["flex-shrink-0 inline-block overflow-hidden",[he(n),!e.noBorder&&"logo-gradient-border"]])},[(z(),Z("svg",yg,[i[0]||(i[0]=_("rect",{width:"1024",height:"1024",fill:"#030202"},null,-1)),(z(),Z(Be,null,Gt(s,(a,l)=>_("rect",{key:l,x:a.x,y:a.y,width:a.w,height:a.h,fill:"white",class:"logo-square",style:Tt({"--delay":r[l]+"ms"})},null,12,_g)),64))]))],2))}}),Dt=(e,t)=>{const n=e.__vccOpts||e;for(const[s,r]of t)n[s]=r;return n},wg=Dt(bg,[["__scopeId","data-v-13794b4c"]]),Eg={class:"logo-gradient-border screensaver-logo-cycle relative w-48 h-48 sm:w-64 sm:h-64 md:w-80 md:h-80 flex items-center justify-center overflow-hidden"},Ag={class:"screensaver-logo-squares absolute inset-[3px] flex items-center justify-center"},Sg=Ze({__name:"ScreensaverLogo",setup(e){return(t,n)=>(z(),Z("div",Eg,[_("div",Ag,[de(wg,{size:"xl","no-border":"",fit:""})])]))}}),vf=Dt(Sg,[["__scopeId","data-v-d3543a5f"]]);let qt=null,qn=null,Vn=null;function mo(){return qt}function Cg(){if(qt)return qt;try{const e=window.AudioContext||window.webkitAudioContext;return e?(qt=new e,qt):null}catch{return null}}const kg="/assets/audio/cosmic-updrift.mp3",xg="/assets/audio/loop-start.mp3";function Tl(){const e=mo();if(e){try{e.state==="suspended"&&e.resume()}catch{return}fetch(xg).then(t=>t.arrayBuffer()).then(t=>e.decodeAudioData(t)).then(t=>{const n=e.createBufferSource();n.buffer=t;const s=e.createGain();s.gain.value=.5,n.connect(s),s.connect(e.destination),n.start(0)}).catch(()=>{})}}function Il(){const e=Cg();e?.state==="suspended"&&e.resume().catch(()=>{})}function Rl(){const e=mo();if(!e)return;try{e.state==="suspended"&&e.resume().catch(()=>{})}catch{return}Tg();const t=new Audio(kg);t.loop=!0;const n=e,s=n.createMediaElementSource(t),r=n.createGain();r.gain.value=.25,s.connect(r),r.connect(n.destination),Vn=r,qn=t,t.play().catch(()=>{})}function Tg(){if(qn){if(Vn&&qt){const e=qt.currentTime;Vn.gain.setValueAtTime(Vn.gain.value,e),Vn.gain.linearRampToValueAtTime(.001,e+.2)}setTimeout(()=>{qn?.pause(),qn=null,Vn=null},220)}}function Ig(){qn&&(qn.pause(),qn=null,Vn=null),os(),qt&&(qt.close().catch(()=>{}),qt=null)}function Rg(){const e=new Audio("/assets/audio/pop.mp3");e.volume=.6,e.play().catch(()=>{})}function Ww(){const e=new Audio("/assets/audio/woosh.mp3");e.volume=.5,e.play().catch(()=>{})}function Hw(){const e=new Audio("/assets/audio/typing.mp3");e.volume=.6,e.play().catch(()=>{})}let Sn=null;const Pg="/assets/audio/intro-typing.mp3";function Lg(){os(),Sn=new Audio(Pg),Sn.volume=.5,Sn.loop=!0,Sn.play().catch(()=>{})}function os(){Sn&&(Sn.pause(),Sn.currentTime=0,Sn=null)}const Ng="/assets/audio/welcome-noderunner.mp3";function Pl(){const e=new Audio(Ng);e.volume=.9,e.play().catch(()=>{})}function yf(){const e=mo();if(!e)return;try{e.state==="suspended"&&e.resume()}catch{return}const t=e.currentTime,n=e.createOscillator(),s=e.createGain();n.type="sine",n.frequency.setValueAtTime(1200,t),s.gain.setValueAtTime(0,t),s.gain.linearRampToValueAtTime(.06,t+.002),s.gain.exponentialRampToValueAtTime(.001,t+.04),n.connect(s),s.connect(e.destination),n.start(t),n.stop(t+.04)}function jw(){const e=mo();if(!e)return;try{e.state==="suspended"&&e.resume()}catch{return}const t=e.currentTime,n=[{freq:55,dur:.35,gain:.4,attack:.02},{freq:82,dur:.28,gain:.25,attack:.03},{freq:110,dur:.22,gain:.15,attack:.04},{freq:165,dur:.18,gain:.1,attack:.05}];for(let s=0;s{(we||oe)&&Y.value?(Y.value.paused&&Y.value.play().catch(M=>{}),ve||(ve=()=>{(f.value||b.value)&&Y.value&&Y.value.play().catch(()=>{})},Y.value.addEventListener("pause",ve))):ve&&Y.value&&(Y.value.removeEventListener("pause",ve),ve=null)}),qe(f,we=>{we&&Y.value&&Y.value.play().catch(oe=>{})}),qe(r,we=>{if(!we&&Y.value){const oe=Y.value.currentTime,M=!Y.value.paused;sessionStorage.setItem("video_intro_currentTime",oe.toString()),sessionStorage.setItem("video_intro_wasPlaying",M.toString()),sessionStorage.setItem("video_intro_playbackRate",Y.value.playbackRate.toString())}});let ce=null;qe([f,b],([we,oe])=>{(we||oe)&&Y.value?ce=window.setInterval(()=>{Y.value&&!Y.value.paused&&(sessionStorage.setItem("video_intro_currentTime",Y.value.currentTime.toString()),sessionStorage.setItem("video_intro_wasPlaying","true"),sessionStorage.setItem("video_intro_playbackRate",Y.value.playbackRate.toString()))},50):ce&&(clearInterval(ce),ce=null)});const N=localStorage.getItem("neode_intro_seen")==="1",W=window.location.pathname.startsWith("/dashboard"),X=N||W;!N&&W&&localStorage.setItem("neode_intro_seen","1");function ge(){a.value=!0,i.value||yf()}function j(){!o.value||i.value||(Il(),Rg(),i.value=!0,setTimeout(()=>{o.value=!1,i.value=!1,Ae()},1e3))}function K(){Il(),ie()}function ie(){B&&(clearTimeout(B),B=null),c.value=!0,u.value=!0,f.value=!0,p.value=!0,os(),Tl(),Rl(),Pl(),os(),k.value=!1,I.value=!1,P.value=!1,q.value=!1,re(()=>{l.value=.3},0),re(()=>{d.value=!0,p.value=!1},4850),re(()=>{b.value=!0},5500),re(()=>{f.value=!1},6e3),re(()=>{l.value=1},9e3),re(()=>{re(()=>{r.value=!1,document.body.classList.add("splash-complete"),localStorage.setItem("neode_intro_seen","1"),n("complete")},500)},9500)}function Ae(){function we(ye,y,A,R){const $=s[ye];let V=0;y.value="",A.value=!0;function U(){V===0&&Lg(),V<$.length?(y.value=$.slice(0,V+1),V++,B=setTimeout(U,qg)):(os(),A.value=!1,B=setTimeout(R,Yg))}U()}function oe(){h.value=!0,we(0,C,k,M)}function M(){E.value=!0,we(1,S,I,ee)}function ee(){v.value=!0,we(2,O,P,J)}function J(){w.value=!0,we(3,D,q,()=>{q.value=!1,u.value=!0,B=setTimeout(se,800)})}function se(){c.value=!0,f.value=!0,p.value=!0,os(),Tl(),Rl(),Pl(),Y.value&&Y.value.play().catch(ye=>{}),l.value=.3,re(()=>{d.value=!0,p.value=!1},4850),re(()=>{b.value=!0},5500),re(()=>{f.value=!1},6e3),re(()=>{l.value=1},9e3),re(()=>{Y.value&&!Y.value.paused&&(sessionStorage.setItem("video_intro_currentTime",Y.value.currentTime.toString()),sessionStorage.setItem("video_intro_wasPlaying","true")),r.value=!1,document.body.classList.add("splash-complete"),localStorage.setItem("neode_intro_seen","1"),n("complete")},9500)}B=setTimeout(oe,500)}return ht(()=>{X&&(r.value=!1,document.body.classList.add("splash-complete"),n("complete"))}),Ot(()=>{B&&(clearTimeout(B),B=null);for(const we of ae)clearTimeout(we);ae.length=0,ce&&(clearInterval(ce),ce=null)}),(we,oe)=>(z(),dt(tt,{name:"splash-fade"},{default:Ye(()=>[r.value?(z(),Z("div",Og,[f.value||b.value?(z(),Z("video",{key:0,ref_key:"videoElement",ref:Y,class:"absolute inset-0 w-full h-full object-cover",style:Tt({opacity:l.value,transform:"scale(1)",transition:"opacity 1.2s ease-out"}),autoplay:"",loop:"",muted:"",playsinline:"",preload:"auto",poster:mg},[...oe[1]||(oe[1]=[_("source",{src:gg,type:"video/mp4"},null,-1),_("div",{class:"absolute inset-0",style:{backgroundImage:"url(/assets/img/bg-intro.jpg)",backgroundSize:"auto 100vh",backgroundPosition:"center top",backgroundRepeat:"no-repeat"}},null,-1)])],4)):(z(),Z("div",{key:1,class:"absolute inset-0",style:Tt({backgroundImage:"url(/assets/img/bg-intro.jpg)",backgroundSize:"auto 100vh",backgroundPosition:"center top",backgroundRepeat:"no-repeat",opacity:l.value,transform:"scale(1)",transition:"opacity 1.2s ease-out"})},null,4)),de(tt,{name:"fade"},{default:Ye(()=>[c.value?be("",!0):(z(),Z("div",{key:0,class:$e(["absolute inset-0 z-10 flex items-center justify-center transition-opacity duration-800",{"opacity-0":u.value}])},[_("div",Dg,[h.value?(z(),Z("div",{key:0,class:$e(["flex items-start mb-4 sm:mb-6 opacity-0",{"opacity-100":h.value}])},[oe[2]||(oe[2]=_("span",{class:"text-[#fbbf24] mr-3 sm:mr-6 flex-shrink-0"},">",-1)),_("span",Mg,Se(C.value),1),k.value?(z(),Z("span",Fg)):be("",!0)],2)):be("",!0),E.value?(z(),Z("div",{key:1,class:$e(["flex items-start mb-4 sm:mb-6 opacity-0",{"opacity-100":E.value}])},[oe[3]||(oe[3]=_("span",{class:"text-[#fbbf24] mr-3 sm:mr-6 flex-shrink-0"},">",-1)),_("span",$g,Se(S.value),1),I.value?(z(),Z("span",Bg)):be("",!0)],2)):be("",!0),v.value?(z(),Z("div",{key:2,class:$e(["flex items-start mb-4 sm:mb-6 opacity-0",{"opacity-100":v.value}])},[oe[4]||(oe[4]=_("span",{class:"text-[#fbbf24] mr-3 sm:mr-6 flex-shrink-0"},">",-1)),_("span",Ug,Se(O.value),1),P.value?(z(),Z("span",Vg)):be("",!0)],2)):be("",!0),w.value?(z(),Z("div",{key:3,class:$e(["flex items-start mb-8 sm:mb-12 opacity-0",{"opacity-100":w.value}])},[oe[5]||(oe[5]=_("span",{class:"text-[#fbbf24] mr-3 sm:mr-6 flex-shrink-0"},">",-1)),_("span",Wg,Se(D.value),1),q.value?(z(),Z("span",Hg)):be("",!0)],2)):be("",!0)])],2))]),_:1}),de(tt,{name:"welcome-fade"},{default:Ye(()=>[f.value?(z(),Z("div",{key:0,class:$e(["absolute inset-0 z-[15] flex items-center justify-center font-mono text-3xl sm:text-4xl md:text-5xl px-4",{"welcome-fade-out":d.value}])},[_("div",jg,[_("span",{class:$e(["text-white",{"typing-text":p.value}])}," Welcome Noderunner ",2)])],2)):be("",!0)]),_:1}),de(tt,{name:"logo-zoom"},{default:Ye(()=>[b.value?(z(),Z("div",Kg,[...oe[6]||(oe[6]=[_("img",{src:vg,alt:"Archipelago",class:"w-[min(80vw,900px)] max-w-[90vw] h-auto filter drop-shadow-[0_6px_24px_rgba(0,0,0,0.35)] m-5 object-contain logo-zoom-bounce"},null,-1)])])):be("",!0)]),_:1}),o.value?(z(),Z("div",{key:2,class:$e(["absolute inset-0 z-[100] flex items-center justify-center cursor-pointer overflow-hidden",i.value?"tap-overlay-zoom-out":"bg-black/40"]),onClick:j},[_("div",Gg,[_("span",{class:$e(["tap-to-start-text font-archipelago font-extrabold text-6xl sm:text-7xl md:text-8xl lg:text-9xl tracking-widest uppercase whitespace-nowrap select-none transition-opacity duration-300",{"opacity-0":i.value}])}," Enter to Exit ",2),_("div",{class:$e(["tap-to-start-logo absolute transition-transform duration-300 ease-out",[{"tap-logo-launch":i.value},{"scale-110":a.value&&!i.value}]]),onMouseenter:ge,onMouseleave:oe[0]||(oe[0]=M=>a.value=!1)},[_("div",{class:$e(["intro-logo-viz-ring",{"intro-logo-viz-visible":a.value&&!i.value}])},[(z(),Z(Be,null,Gt(48,M=>_("div",{key:M-1,class:"intro-logo-viz-segment",style:Tt({"--segment-deg":`${(M-1)/48*360}deg`,"--segment-index":M-1})},null,4)),64))],2),de(vf)],34)])],2)):be("",!0),!c.value&&!o.value?(z(),Z("button",{key:3,onClick:K,class:"absolute bottom-8 right-8 z-20 bg-black/60 border border-white/30 text-white/70 font-mono text-xs px-4 py-2 rounded backdrop-blur-[10px] hover:bg-black/80 hover:text-white/90 hover:border-white/50 hover:-translate-y-0.5 active:translate-y-0 transition-all duration-300"}," Skip Intro ")):be("",!0)])):be("",!0)]),_:1}))}}),Xg=Dt(zg,[["__scopeId","data-v-a2a8c942"]]),Jg='button:not([disabled]), [href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex="-1"])';function ur(e,t,n,s){const r=s?.restoreFocusRef;qe(t,a=>{a&&r&&(r.value=document.activeElement)});function o(){const a=e.value;return a?Array.from(a.querySelectorAll(Jg)).filter(l=>l.offsetParent!==null):[]}function i(a){if(t.value){if(a.key==="Escape"){r?.value?.focus?.(),n(),a.preventDefault(),a.stopPropagation();return}if(["ArrowUp","ArrowDown","ArrowLeft","ArrowRight"].includes(a.key)){const l=o();if(l.length===0)return;const c=document.activeElement,u=c?l.indexOf(c):-1;let f;a.key==="ArrowDown"||a.key==="ArrowRight"?f=u0?u-1:l.length-1,l[f]?.focus(),a.preventDefault(),a.stopPropagation()}}}ht(()=>{window.addEventListener("keydown",i,!0)}),Ot(()=>{window.removeEventListener("keydown",i,!0)})}const Qg=Ze({__name:"PWAUpdatePrompt",setup(e){const t=G(!1);let n=null;const s=G(null);ht(()=>{if("serviceWorker"in navigator){navigator.serviceWorker.addEventListener("controllerchange",()=>{window.location.reload()});const i=async()=>{const a=await navigator.serviceWorker.getRegistration();a&&await a.update()};setInterval(i,300*1e3),document.addEventListener("visibilitychange",()=>{document.visibilityState==="visible"&&i()}),navigator.serviceWorker.getRegistration().then(a=>{a&&a.addEventListener("updatefound",()=>{const l=a.installing;l&&l.addEventListener("statechange",()=>{l.state==="installed"&&navigator.serviceWorker.controller&&(t.value=!0,n=async()=>{l.state==="installed"&&a.waiting&&a.waiting.postMessage({type:"SKIP_WAITING"})})})})})}}),ur(s,t,r);function r(){t.value=!1}async function o(){n&&await n()}return(i,a)=>(z(),dt(Nt,{to:"body"},[de(tt,{name:"modal"},{default:Ye(()=>[t.value?(z(),Z("div",{key:0,class:"fixed inset-0 z-[9999] flex items-center justify-center p-4",onClick:Tn(r,["self"])},[a[4]||(a[4]=_("div",{class:"absolute inset-0 bg-black/60 backdrop-blur-sm"},null,-1)),_("div",{ref_key:"modalRef",ref:s,class:"glass-card p-6 max-w-md w-full relative z-10",onClick:a[0]||(a[0]=Tn(()=>{},["stop"]))},[_("div",{class:"flex items-start justify-between gap-4 mb-4"},[a[2]||(a[2]=_("h3",{class:"text-xl font-semibold text-white"},"Update Available",-1)),_("button",{onClick:r,class:"p-2 rounded-lg hover:bg-white/10 text-white/70 hover:text-white transition-colors","aria-label":"Dismiss"},[...a[1]||(a[1]=[_("svg",{xmlns:"http://www.w3.org/2000/svg",class:"h-5 w-5",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor"},[_("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M6 18L18 6M6 6l12 12"})],-1)])])]),a[3]||(a[3]=_("p",{class:"text-white/80 mb-6"}," A new version of Archipelago is available. Update now to get the latest features and fixes. ",-1)),_("div",{class:"flex gap-3 justify-end"},[_("button",{onClick:r,class:"px-4 py-2 glass-button rounded-lg text-sm font-medium"}," Later "),_("button",{onClick:o,class:"px-4 py-2 glass-button glass-button-sm rounded-lg text-sm font-medium"}," Update Now ")])],512)])):be("",!0)]),_:1})]))}}),Zg="/assets/icon/pwa-192x192-v2.png",ev={key:0,class:"fixed bottom-4 left-4 right-4 md:left-auto md:right-6 md:bottom-6 md:max-w-sm z-[9998]"},Fo="archipelago_pwa_install_dismissed",tv=Ze({__name:"PWAInstallPrompt",setup(e){const t=G(!1);let n=null;ht(()=>{if(sessionStorage.getItem(Fo)==="1"||window.matchMedia("(display-mode: standalone)").matches||window.navigator.standalone)return;const o=i=>{i.preventDefault(),n=i,t.value=!0};window.addEventListener("beforeinstallprompt",o),window.__beforeinstallpromptHandler=o}),Ot(()=>{window.removeEventListener("beforeinstallprompt",window.__beforeinstallpromptHandler)});function s(){t.value=!1,sessionStorage.setItem(Fo,"1")}async function r(){if(!n)return;const i=(await n.prompt())?.outcome??"dismissed";t.value=!1,n=null,i==="accepted"&&sessionStorage.removeItem(Fo)}return(o,i)=>(z(),dt(Nt,{to:"body"},[de(tt,{name:"fade"},{default:Ye(()=>[t.value?(z(),Z("div",ev,[_("div",{class:"glass-card p-4 flex items-center gap-4 shadow-xl"},[i[0]||(i[0]=_("img",{src:Zg,alt:"Archipelago",class:"w-14 h-14 rounded-xl shrink-0"},null,-1)),i[1]||(i[1]=_("div",{class:"flex-1 min-w-0"},[_("p",{class:"text-white font-medium"},"Install Archipelago"),_("p",{class:"text-white/70 text-sm"},"Add to your home screen for quick access")],-1)),_("div",{class:"flex gap-2 shrink-0"},[_("button",{onClick:s,class:"px-3 py-2 text-sm text-white/70 hover:text-white transition-colors"}," Not now "),_("button",{onClick:r,class:"px-4 py-2 glass-button glass-button-sm rounded-lg text-sm font-medium"}," Install ")])])])):be("",!0)]),_:1})]))}}),nv=Dt(tv,[["__scopeId","data-v-f40ced58"]]);function pn(e){return Array.isArray?Array.isArray(e):wf(e)==="[object Array]"}function sv(e){if(typeof e=="string")return e;let t=e+"";return t=="0"&&1/e==-1/0?"-0":t}function rv(e){return e==null?"":sv(e)}function Yt(e){return typeof e=="string"}function _f(e){return typeof e=="number"}function ov(e){return e===!0||e===!1||iv(e)&&wf(e)=="[object Boolean]"}function bf(e){return typeof e=="object"}function iv(e){return bf(e)&&e!==null}function gt(e){return e!=null}function $o(e){return!e.trim().length}function wf(e){return e==null?e===void 0?"[object Undefined]":"[object Null]":Object.prototype.toString.call(e)}const av="Incorrect 'index' type",lv=e=>`Invalid value for key ${e}`,cv=e=>`Pattern length exceeds max of ${e}.`,uv=e=>`Missing ${e} property in key`,fv=e=>`Property 'weight' in key '${e}' must be a positive integer`,Ll=Object.prototype.hasOwnProperty;class dv{constructor(t){this._keys=[],this._keyMap={};let n=0;t.forEach(s=>{let r=Ef(s);this._keys.push(r),this._keyMap[r.id]=r,n+=r.weight}),this._keys.forEach(s=>{s.weight/=n})}get(t){return this._keyMap[t]}keys(){return this._keys}toJSON(){return JSON.stringify(this._keys)}}function Ef(e){let t=null,n=null,s=null,r=1,o=null;if(Yt(e)||pn(e))s=e,t=Nl(e),n=pi(e);else{if(!Ll.call(e,"name"))throw new Error(uv("name"));const i=e.name;if(s=i,Ll.call(e,"weight")&&(r=e.weight,r<=0))throw new Error(fv(i));t=Nl(i),n=pi(i),o=e.getFn}return{path:t,id:n,weight:r,src:s,getFn:o}}function Nl(e){return pn(e)?e:e.split(".")}function pi(e){return pn(e)?e.join("."):e}function pv(e,t){let n=[],s=!1;const r=(o,i,a)=>{if(gt(o))if(!i[a])n.push(o);else{let l=i[a];const c=o[l];if(!gt(c))return;if(a===i.length-1&&(Yt(c)||_f(c)||ov(c)))n.push(rv(c));else if(pn(c)){s=!0;for(let u=0,f=c.length;ue.score===t.score?e.idx{this._keysMap[n.id]=s})}create(){this.isCreated||!this.docs.length||(this.isCreated=!0,Yt(this.docs[0])?this.docs.forEach((t,n)=>{this._addString(t,n)}):this.docs.forEach((t,n)=>{this._addObject(t,n)}),this.norm.clear())}add(t){const n=this.size();Yt(t)?this._addString(t,n):this._addObject(t,n)}removeAt(t){this.records.splice(t,1);for(let n=t,s=this.size();n{let i=r.getFn?r.getFn(t):this.getFn(t,r.path);if(gt(i)){if(pn(i)){let a=[];const l=[{nestedArrIndex:-1,value:i}];for(;l.length;){const{nestedArrIndex:c,value:u}=l.pop();if(gt(u))if(Yt(u)&&!$o(u)){let f={v:u,i:c,n:this.norm.get(u)};a.push(f)}else pn(u)&&u.forEach((f,d)=>{l.push({nestedArrIndex:d,value:f})})}s.$[o]=a}else if(Yt(i)&&!$o(i)){let a={v:i,n:this.norm.get(i)};s.$[o]=a}}}),this.records.push(s)}toJSON(){return{keys:this.keys,records:this.records}}}function Af(e,t,{getFn:n=fe.getFn,fieldNormWeight:s=fe.fieldNormWeight}={}){const r=new sa({getFn:n,fieldNormWeight:s});return r.setKeys(e.map(Ef)),r.setSources(t),r.create(),r}function bv(e,{getFn:t=fe.getFn,fieldNormWeight:n=fe.fieldNormWeight}={}){const{keys:s,records:r}=e,o=new sa({getFn:t,fieldNormWeight:n});return o.setKeys(s),o.setIndexRecords(r),o}function mr(e,{errors:t=0,currentLocation:n=0,expectedLocation:s=0,distance:r=fe.distance,ignoreLocation:o=fe.ignoreLocation}={}){const i=t/e.length;if(o)return i;const a=Math.abs(s-n);return r?i+a/r:a?1:i}function wv(e=[],t=fe.minMatchCharLength){let n=[],s=-1,r=-1,o=0;for(let i=e.length;o=t&&n.push([s,r]),s=-1)}return e[o-1]&&o-s>=t&&n.push([s,o-1]),n}const Wn=32;function Ev(e,t,n,{location:s=fe.location,distance:r=fe.distance,threshold:o=fe.threshold,findAllMatches:i=fe.findAllMatches,minMatchCharLength:a=fe.minMatchCharLength,includeMatches:l=fe.includeMatches,ignoreLocation:c=fe.ignoreLocation}={}){if(t.length>Wn)throw new Error(cv(Wn));const u=t.length,f=e.length,d=Math.max(0,Math.min(s,f));let p=o,b=d;const h=a>1||l,E=h?Array(f):[];let v;for(;(v=e.indexOf(t,b))>-1;){let k=mr(t,{currentLocation:v,expectedLocation:d,distance:r,ignoreLocation:c});if(p=Math.min(k,p),b=v+u,h){let I=0;for(;I=q;re-=1){let ve=re-1,ce=n[e.charAt(ve)];if(h&&(E[ve]=+!!ce),B[re]=(B[re+1]<<1|1)&ce,k&&(B[re]|=(w[re+1]|w[re])<<1|1|w[re+1]),B[re]&O&&(C=mr(t,{errors:k,currentLocation:ve,expectedLocation:d,distance:r,ignoreLocation:c}),C<=p)){if(p=C,b=ve,b<=d)break;q=Math.max(1,2*d-b)}}if(mr(t,{errors:k+1,currentLocation:d,expectedLocation:d,distance:r,ignoreLocation:c})>p)break;w=B}const D={isMatch:b>=0,score:Math.max(.001,C)};if(h){const k=wv(E,a);k.length?l&&(D.indices=k):D.isMatch=!1}return D}function Av(e){let t={};for(let n=0,s=e.length;ne.normalize("NFD").replace(/[\u0300-\u036F\u0483-\u0489\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u0610-\u061A\u064B-\u065F\u0670\u06D6-\u06DC\u06DF-\u06E4\u06E7\u06E8\u06EA-\u06ED\u0711\u0730-\u074A\u07A6-\u07B0\u07EB-\u07F3\u07FD\u0816-\u0819\u081B-\u0823\u0825-\u0827\u0829-\u082D\u0859-\u085B\u08D3-\u08E1\u08E3-\u0903\u093A-\u093C\u093E-\u094F\u0951-\u0957\u0962\u0963\u0981-\u0983\u09BC\u09BE-\u09C4\u09C7\u09C8\u09CB-\u09CD\u09D7\u09E2\u09E3\u09FE\u0A01-\u0A03\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A70\u0A71\u0A75\u0A81-\u0A83\u0ABC\u0ABE-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AE2\u0AE3\u0AFA-\u0AFF\u0B01-\u0B03\u0B3C\u0B3E-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B62\u0B63\u0B82\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD7\u0C00-\u0C04\u0C3E-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C62\u0C63\u0C81-\u0C83\u0CBC\u0CBE-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CE2\u0CE3\u0D00-\u0D03\u0D3B\u0D3C\u0D3E-\u0D44\u0D46-\u0D48\u0D4A-\u0D4D\u0D57\u0D62\u0D63\u0D82\u0D83\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DF2\u0DF3\u0E31\u0E34-\u0E3A\u0E47-\u0E4E\u0EB1\u0EB4-\u0EB9\u0EBB\u0EBC\u0EC8-\u0ECD\u0F18\u0F19\u0F35\u0F37\u0F39\u0F3E\u0F3F\u0F71-\u0F84\u0F86\u0F87\u0F8D-\u0F97\u0F99-\u0FBC\u0FC6\u102B-\u103E\u1056-\u1059\u105E-\u1060\u1062-\u1064\u1067-\u106D\u1071-\u1074\u1082-\u108D\u108F\u109A-\u109D\u135D-\u135F\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17B4-\u17D3\u17DD\u180B-\u180D\u1885\u1886\u18A9\u1920-\u192B\u1930-\u193B\u1A17-\u1A1B\u1A55-\u1A5E\u1A60-\u1A7C\u1A7F\u1AB0-\u1ABE\u1B00-\u1B04\u1B34-\u1B44\u1B6B-\u1B73\u1B80-\u1B82\u1BA1-\u1BAD\u1BE6-\u1BF3\u1C24-\u1C37\u1CD0-\u1CD2\u1CD4-\u1CE8\u1CED\u1CF2-\u1CF4\u1CF7-\u1CF9\u1DC0-\u1DF9\u1DFB-\u1DFF\u20D0-\u20F0\u2CEF-\u2CF1\u2D7F\u2DE0-\u2DFF\u302A-\u302F\u3099\u309A\uA66F-\uA672\uA674-\uA67D\uA69E\uA69F\uA6F0\uA6F1\uA802\uA806\uA80B\uA823-\uA827\uA880\uA881\uA8B4-\uA8C5\uA8E0-\uA8F1\uA8FF\uA926-\uA92D\uA947-\uA953\uA980-\uA983\uA9B3-\uA9C0\uA9E5\uAA29-\uAA36\uAA43\uAA4C\uAA4D\uAA7B-\uAA7D\uAAB0\uAAB2-\uAAB4\uAAB7\uAAB8\uAABE\uAABF\uAAC1\uAAEB-\uAAEF\uAAF5\uAAF6\uABE3-\uABEA\uABEC\uABED\uFB1E\uFE00-\uFE0F\uFE20-\uFE2F]/g,"")):(e=>e);class Sf{constructor(t,{location:n=fe.location,threshold:s=fe.threshold,distance:r=fe.distance,includeMatches:o=fe.includeMatches,findAllMatches:i=fe.findAllMatches,minMatchCharLength:a=fe.minMatchCharLength,isCaseSensitive:l=fe.isCaseSensitive,ignoreDiacritics:c=fe.ignoreDiacritics,ignoreLocation:u=fe.ignoreLocation}={}){if(this.options={location:n,threshold:s,distance:r,includeMatches:o,findAllMatches:i,minMatchCharLength:a,isCaseSensitive:l,ignoreDiacritics:c,ignoreLocation:u},t=l?t:t.toLowerCase(),t=c?Wr(t):t,this.pattern=t,this.chunks=[],!this.pattern.length)return;const f=(p,b)=>{this.chunks.push({pattern:p,alphabet:Av(p),startIndex:b})},d=this.pattern.length;if(d>Wn){let p=0;const b=d%Wn,h=d-b;for(;p{const{isMatch:w,score:C,indices:S}=Ev(t,h,E,{location:o+v,distance:i,threshold:a,findAllMatches:l,minMatchCharLength:c,includeMatches:r,ignoreLocation:u});w&&(p=!0),d+=C,w&&S&&(f=[...f,...S])});let b={isMatch:p,score:p?d/this.chunks.length:1};return p&&r&&(b.indices=f),b}}class Rn{constructor(t){this.pattern=t}static isMultiMatch(t){return Ol(t,this.multiRegex)}static isSingleMatch(t){return Ol(t,this.singleRegex)}search(){}}function Ol(e,t){const n=e.match(t);return n?n[1]:null}class Sv extends Rn{constructor(t){super(t)}static get type(){return"exact"}static get multiRegex(){return/^="(.*)"$/}static get singleRegex(){return/^=(.*)$/}search(t){const n=t===this.pattern;return{isMatch:n,score:n?0:1,indices:[0,this.pattern.length-1]}}}class Cv extends Rn{constructor(t){super(t)}static get type(){return"inverse-exact"}static get multiRegex(){return/^!"(.*)"$/}static get singleRegex(){return/^!(.*)$/}search(t){const s=t.indexOf(this.pattern)===-1;return{isMatch:s,score:s?0:1,indices:[0,t.length-1]}}}class kv extends Rn{constructor(t){super(t)}static get type(){return"prefix-exact"}static get multiRegex(){return/^\^"(.*)"$/}static get singleRegex(){return/^\^(.*)$/}search(t){const n=t.startsWith(this.pattern);return{isMatch:n,score:n?0:1,indices:[0,this.pattern.length-1]}}}class xv extends Rn{constructor(t){super(t)}static get type(){return"inverse-prefix-exact"}static get multiRegex(){return/^!\^"(.*)"$/}static get singleRegex(){return/^!\^(.*)$/}search(t){const n=!t.startsWith(this.pattern);return{isMatch:n,score:n?0:1,indices:[0,t.length-1]}}}class Tv extends Rn{constructor(t){super(t)}static get type(){return"suffix-exact"}static get multiRegex(){return/^"(.*)"\$$/}static get singleRegex(){return/^(.*)\$$/}search(t){const n=t.endsWith(this.pattern);return{isMatch:n,score:n?0:1,indices:[t.length-this.pattern.length,t.length-1]}}}class Iv extends Rn{constructor(t){super(t)}static get type(){return"inverse-suffix-exact"}static get multiRegex(){return/^!"(.*)"\$$/}static get singleRegex(){return/^!(.*)\$$/}search(t){const n=!t.endsWith(this.pattern);return{isMatch:n,score:n?0:1,indices:[0,t.length-1]}}}class Cf extends Rn{constructor(t,{location:n=fe.location,threshold:s=fe.threshold,distance:r=fe.distance,includeMatches:o=fe.includeMatches,findAllMatches:i=fe.findAllMatches,minMatchCharLength:a=fe.minMatchCharLength,isCaseSensitive:l=fe.isCaseSensitive,ignoreDiacritics:c=fe.ignoreDiacritics,ignoreLocation:u=fe.ignoreLocation}={}){super(t),this._bitapSearch=new Sf(t,{location:n,threshold:s,distance:r,includeMatches:o,findAllMatches:i,minMatchCharLength:a,isCaseSensitive:l,ignoreDiacritics:c,ignoreLocation:u})}static get type(){return"fuzzy"}static get multiRegex(){return/^"(.*)"$/}static get singleRegex(){return/^(.*)$/}search(t){return this._bitapSearch.searchIn(t)}}class kf extends Rn{constructor(t){super(t)}static get type(){return"include"}static get multiRegex(){return/^'"(.*)"$/}static get singleRegex(){return/^'(.*)$/}search(t){let n=0,s;const r=[],o=this.pattern.length;for(;(s=t.indexOf(this.pattern,n))>-1;)n=s+o,r.push([s,n-1]);const i=!!r.length;return{isMatch:i,score:i?0:1,indices:r}}}const hi=[Sv,kf,kv,xv,Iv,Tv,Cv,Cf],Dl=hi.length,Rv=/ +(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)/,Pv="|";function Lv(e,t={}){return e.split(Pv).map(n=>{let s=n.trim().split(Rv).filter(o=>o&&!!o.trim()),r=[];for(let o=0,i=s.length;o!!(e[Hr.AND]||e[Hr.OR]),Mv=e=>!!e[vi.PATH],Fv=e=>!pn(e)&&bf(e)&&!yi(e),Ml=e=>({[Hr.AND]:Object.keys(e).map(t=>({[t]:e[t]}))});function xf(e,t,{auto:n=!0}={}){const s=r=>{let o=Object.keys(r);const i=Mv(r);if(!i&&o.length>1&&!yi(r))return s(Ml(r));if(Fv(r)){const l=i?r[vi.PATH]:o[0],c=i?r[vi.PATTERN]:r[l];if(!Yt(c))throw new Error(lv(l));const u={keyId:pi(l),pattern:c};return n&&(u.searcher=gi(c,t)),u}let a={children:[],operator:o[0]};return o.forEach(l=>{const c=r[l];pn(c)&&c.forEach(u=>{a.children.push(s(u))})}),a};return yi(e)||(e=Ml(e)),s(e)}function $v(e,{ignoreFieldNorm:t=fe.ignoreFieldNorm}){e.forEach(n=>{let s=1;n.matches.forEach(({key:r,norm:o,score:i})=>{const a=r?r.weight:null;s*=Math.pow(i===0&&a?Number.EPSILON:i,(a||1)*(t?1:o))}),n.score=s})}function Bv(e,t){const n=e.matches;t.matches=[],gt(n)&&n.forEach(s=>{if(!gt(s.indices)||!s.indices.length)return;const{indices:r,value:o}=s;let i={indices:r,value:o};s.key&&(i.key=s.key.src),s.idx>-1&&(i.refIndex=s.idx),t.matches.push(i)})}function Uv(e,t){t.score=e.score}function Vv(e,t,{includeMatches:n=fe.includeMatches,includeScore:s=fe.includeScore}={}){const r=[];return n&&r.push(Bv),s&&r.push(Uv),e.map(o=>{const{idx:i}=o,a={item:t[i],refIndex:i};return r.length&&r.forEach(l=>{l(o,a)}),a})}class bs{constructor(t,n={},s){this.options={...fe,...n},this.options.useExtendedSearch,this._keyStore=new dv(this.options.keys),this.setCollection(t,s)}setCollection(t,n){if(this._docs=t,n&&!(n instanceof sa))throw new Error(av);this._myIndex=n||Af(this.options.keys,this._docs,{getFn:this.options.getFn,fieldNormWeight:this.options.fieldNormWeight})}add(t){gt(t)&&(this._docs.push(t),this._myIndex.add(t))}remove(t=()=>!1){const n=[];for(let s=0,r=this._docs.length;s-1&&(l=l.slice(0,n)),Vv(l,this._docs,{includeMatches:s,includeScore:r})}_searchStringList(t){const n=gi(t,this.options),{records:s}=this._myIndex,r=[];return s.forEach(({v:o,i,n:a})=>{if(!gt(o))return;const{isMatch:l,score:c,indices:u}=n.searchIn(o);l&&r.push({item:o,idx:i,matches:[{score:c,value:o,norm:a,indices:u}]})}),r}_searchLogical(t){const n=xf(t,this.options),s=(a,l,c)=>{if(!a.children){const{keyId:f,searcher:d}=a,p=this._findMatches({key:this._keyStore.get(f),value:this._myIndex.getValueForItemAtKeyId(l,f),searcher:d});return p&&p.length?[{idx:c,item:l,matches:p}]:[]}const u=[];for(let f=0,d=a.children.length;f{if(gt(a)){let c=s(n,a,l);c.length&&(o[l]||(o[l]={idx:l,item:a,matches:[]},i.push(o[l])),c.forEach(({matches:u})=>{o[l].matches.push(...u)}))}}),i}_searchObjectList(t){const n=gi(t,this.options),{keys:s,records:r}=this._myIndex,o=[];return r.forEach(({$:i,i:a})=>{if(!gt(i))return;let l=[];s.forEach((c,u)=>{l.push(...this._findMatches({key:c,value:i[u],searcher:n}))}),l.length&&o.push({idx:a,item:i,matches:l})}),o}_findMatches({key:t,value:n,searcher:s}){if(!gt(n))return[];let r=[];if(pn(n))n.forEach(({v:o,i,n:a})=>{if(!gt(o))return;const{isMatch:l,score:c,indices:u}=s.searchIn(o);l&&r.push({score:c,key:t,value:o,idx:i,norm:a,indices:u})});else{const{v:o,n:i}=n,{isMatch:a,score:l,indices:c}=s.searchIn(o);a&&r.push({score:l,key:t,value:o,norm:i,indices:c})}return r}}bs.version="7.1.0";bs.createIndex=Af;bs.parseIndex=bv;bs.config=fe;bs.parseQuery=xf;Dv(Ov);let gr=null;function Wv(){if(gr)return gr;try{return gr=new(window.AudioContext||window.webkitAudioContext),gr}catch{return null}}function Bo(e,t,n,s,r="sine",o=0){const i=e.createOscillator(),a=e.createGain();i.connect(a),a.connect(e.destination),a.gain.setValueAtTime(0,e.currentTime),a.gain.linearRampToValueAtTime(s,e.currentTime+.01),a.gain.exponentialRampToValueAtTime(.001,e.currentTime+n),i.frequency.value=t,i.type=r,i.start(e.currentTime+o),i.stop(e.currentTime+o+n)}function et(e="move"){if(e==="move"){const n=new Audio("/assets/audio/arrows.mp3");n.volume=.5,n.play().catch(()=>{});return}if(e==="select"||e==="action"){const n=new Audio("/assets/audio/enter.mp3");n.volume=.5,n.play().catch(()=>{});return}const t=Wv();if(t){try{t.state==="suspended"&&t.resume()}catch{return}e==="back"&&(Bo(t,440,.06,.08,"sine"),Bo(t,330,.08,.05,"sine",.03),Bo(t,220,.1,.04,"triangle",.05))}}const Fl="archipelago-spotlight-recent",$l=8,jr=Qn("spotlight",()=>{const e=G(!1),t=G(0),n=G([]);function s(){try{const p=localStorage.getItem(Fl);if(p){const b=JSON.parse(p);n.value=b.slice(0,$l)}else n.value=[]}catch{n.value=[]}}function r(p){const b={...p,timestamp:Date.now()},h=n.value.filter(E=>!(E.id===p.id&&E.type===p.type));n.value=[b,...h].slice(0,$l);try{localStorage.setItem(Fl,JSON.stringify(n.value))}catch{}}function o(){e.value=!0,t.value=0,s(),et("action")}function i(){e.value=!1,t.value=0}function a(){e.value?i():o()}function l(p){t.value=p}const c=_s({show:!1,title:"",content:"",relatedPath:void 0}),u=G(null);function f(p){u.value=document.activeElement,c.show=!0,c.title=p.title,c.content=p.content,c.relatedPath=p.relatedPath}function d(){u.value?.focus?.(),u.value=null,c.show=!1}return{isOpen:e,selectedIndex:t,recentItems:n,open:o,close:i,toggle:a,setSelectedIndex:l,addRecentItem:r,loadRecentItems:s,helpModal:c,showHelpModal:f,closeHelpModal:d}}),Js=Qn("cli",()=>{const e=G(!1);function t(){e.value=!0,et("action")}function n(){e.value=!1}function s(){const r=e.value;e.value=!r,r||et("action")}return{isOpen:e,open:t,close:n,toggle:s}});var Hv=(function(){var e=function(t,n){return e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(s,r){s.__proto__=r}||function(s,r){for(var o in r)r.hasOwnProperty(o)&&(s[o]=r[o])},e(t,n)};return function(t,n){e(t,n);function s(){this.constructor=t}t.prototype=n===null?Object.create(n):(s.prototype=n.prototype,new s)}})(),jv=Object.prototype.hasOwnProperty;function _i(e,t){return jv.call(e,t)}function bi(e){if(Array.isArray(e)){for(var t=new Array(e.length),n=0;n=48&&s<=57){t++;continue}return!1}return!0}function Bn(e){return e.indexOf("/")===-1&&e.indexOf("~")===-1?e:e.replace(/~/g,"~0").replace(/\//g,"~1")}function Tf(e){return e.replace(/~1/g,"/").replace(/~0/g,"~")}function Ei(e){if(e===void 0)return!0;if(e){if(Array.isArray(e)){for(var t=0,n=e.length;t0&&l[u-1]=="constructor"))throw new TypeError("JSON-Patch: modifying `__proto__` or `constructor/prototype` prop is banned for security reasons, if this was on purpose, please set `banPrototypeModifications` flag false and pass it to this function. More info in fast-json-patch README");if(n&&d===void 0&&(c[p]===void 0?d=l.slice(0,u).join("/"):u==f-1&&(d=t.path),d!==void 0&&b(t,0,e,d)),u++,Array.isArray(c)){if(p==="-")p=c.length;else{if(n&&!wi(p))throw new Ke("Expected an unsigned base-10 integer value, making the new referenced value the array element with the zero-based index","OPERATION_PATH_ILLEGAL_ARRAY_INDEX",o,t,e);wi(p)&&(p=~~p)}if(u>=f){if(n&&t.op==="add"&&p>c.length)throw new Ke("The specified index MUST NOT be greater than the number of elements in the array","OPERATION_VALUE_OUT_OF_BOUNDS",o,t,e);var i=Gv[t.op].call(t,c,p,e);if(i.test===!1)throw new Ke("Test operation failed","TEST_OPERATION_FAILED",o,t,e);return i}}else if(u>=f){var i=is[t.op].call(t,c,p,e);if(i.test===!1)throw new Ke("Test operation failed","TEST_OPERATION_FAILED",o,t,e);return i}if(c=c[p],n&&u0)throw new Ke('Operation `path` property must start with "/"',"OPERATION_PATH_INVALID",t,e,n);if((e.op==="move"||e.op==="copy")&&typeof e.from!="string")throw new Ke("Operation `from` property is not present (applicable in `move` and `copy` operations)","OPERATION_FROM_REQUIRED",t,e,n);if((e.op==="add"||e.op==="replace"||e.op==="test")&&e.value===void 0)throw new Ke("Operation `value` property is not present (applicable in `add`, `replace` and `test` operations)","OPERATION_VALUE_REQUIRED",t,e,n);if((e.op==="add"||e.op==="replace"||e.op==="test")&&Ei(e.value))throw new Ke("Operation `value` property is not present (applicable in `add`, `replace` and `test` operations)","OPERATION_VALUE_CANNOT_CONTAIN_UNDEFINED",t,e,n);if(n){if(e.op=="add"){var r=e.path.split("/").length,o=s.split("/").length;if(r!==o+1&&r!==o)throw new Ke("Cannot perform an `add` operation at the desired path","OPERATION_PATH_CANNOT_ADD",t,e,n)}else if(e.op==="replace"||e.op==="remove"||e.op==="_get"){if(e.path!==s)throw new Ke("Cannot perform the operation at a path that does not exist","OPERATION_PATH_UNRESOLVABLE",t,e,n)}else if(e.op==="move"||e.op==="copy"){var i={op:"_get",path:e.from,value:void 0},a=Rf([i],n);if(a&&a.name==="OPERATION_PATH_UNRESOLVABLE")throw new Ke("Cannot perform the operation from a path that does not exist","OPERATION_FROM_UNRESOLVABLE",t,e,n)}}}else throw new Ke("Operation `op` property is not one of operations defined in RFC-6902","OPERATION_OP_INVALID",t,e,n)}function Rf(e,t,n){try{if(!Array.isArray(e))throw new Ke("Patch sequence must be an array","SEQUENCE_NOT_AN_ARRAY");if(t)go(_t(t),_t(e),n||!0);else{n=n||Gr;for(var s=0;s0&&(e.patches=[],e.callback&&e.callback(s)),s}function oa(e,t,n,s,r){if(t!==e){typeof t.toJSON=="function"&&(t=t.toJSON());for(var o=bi(t),i=bi(e),a=!1,l=i.length-1;l>=0;l--){var c=i[l],u=e[c];if(_i(t,c)&&!(t[c]===void 0&&u!==void 0&&Array.isArray(t)===!1)){var f=t[c];typeof u=="object"&&u!=null&&typeof f=="object"&&f!=null&&Array.isArray(u)===Array.isArray(f)?oa(u,f,n,s+"/"+Bn(c),r):u!==f&&(r&&n.push({op:"test",path:s+"/"+Bn(c),value:_t(u)}),n.push({op:"replace",path:s+"/"+Bn(c),value:_t(f)}))}else Array.isArray(e)===Array.isArray(t)?(r&&n.push({op:"test",path:s+"/"+Bn(c),value:_t(u)}),n.push({op:"remove",path:s+"/"+Bn(c)}),a=!0):(r&&n.push({op:"test",path:s,value:e}),n.push({op:"replace",path:s,value:t}))}if(!(!a&&o.length==i.length))for(var l=0;l"u"||(this.visibilityChangeHandler=()=>{document.visibilityState==="visible"&&this.shouldReconnect&&(!this.ws||this.ws.readyState!==WebSocket.OPEN)&&(this.reconnectAttempts=0,this.connect().catch(t=>{}))},document.addEventListener("visibilitychange",this.visibilityChangeHandler),this.onlineHandler=()=>{this.shouldReconnect&&(!this.ws||this.ws.readyState!==WebSocket.OPEN)&&(this.reconnectAttempts=0,this.connect().catch(t=>{}))},window.addEventListener("online",this.onlineHandler))}connect(){return new Promise((t,n)=>{if(this.ws&&this.ws.readyState===WebSocket.OPEN){t();return}if(this.ws&&this.ws.readyState===WebSocket.CONNECTING){const a=setInterval(()=>{this.ws?this.ws.readyState===WebSocket.OPEN?(clearInterval(a),t()):(this.ws.readyState===WebSocket.CLOSED||this.ws.readyState===WebSocket.CLOSING)&&(clearInterval(a),n(new Error("Connection closed during connect"))):(clearInterval(a),n(new Error("WebSocket was cleared")))},100);setTimeout(()=>{clearInterval(a),this.ws&&this.ws.readyState!==WebSocket.OPEN&&n(new Error("Connection timeout"))},5e3);return}if(this.ws&&(this.ws.readyState===WebSocket.CLOSING||this.ws.readyState===WebSocket.CLOSED)&&(this.ws=null),this.ws){t();return}this.shouldReconnect!==!1&&(this.shouldReconnect=!0);const s=window.location.protocol==="https:"?"wss:":"ws:",r=window.location.host,o=`${s}//${r}${this.url}`;this.setConnectionState("connecting"),this.ws=new WebSocket(o);const i=setTimeout(()=>{this.ws&&this.ws.readyState===WebSocket.CONNECTING&&(this.ws.close(),n(new Error("Connection timeout")))},3e3);this.ws.onopen=()=>{clearTimeout(i),this.reconnectAttempts=0,this.lastMessageTime=Date.now(),this.setConnectionState("connected"),this.startHeartbeat(),t()},this.ws.onerror=a=>{clearTimeout(i)},this.ws.onmessage=a=>{this.lastMessageTime=Date.now();try{const l=JSON.parse(a.data);this.callbacks.forEach(c=>c(l))}catch{}},this.ws.onclose=a=>{if(clearTimeout(i),this.stopHeartbeat(),this.setConnectionState("disconnected"),this.ws=null,!!this.shouldReconnect)if(this.reconnectAttempts{this.shouldReconnect&&(!l&&!c&&this.reconnectAttempts++,this.connect().catch(b=>{}))};d===0?p():this.reconnectTimer=setTimeout(()=>{this.reconnectTimer=null,p()},d)}else this.shouldReconnect=!1}})}subscribe(t){return this.callbacks.add(t),()=>{this.callbacks.delete(t)}}get state(){return this._state}onConnectionStateChange(t){return this.connectionStateCallbacks.add(t),()=>{this.connectionStateCallbacks.delete(t)}}setConnectionState(t){this._state=t,this.connectionStateCallbacks.forEach(n=>n(t))}startHeartbeat(){this.stopHeartbeat(),this.pingTimer=setInterval(()=>{if(this.ws&&this.ws.readyState===WebSocket.OPEN)try{this.ws.send(JSON.stringify({type:"ping"}))}catch{}},this.pingInterval),this.heartbeatTimer=setInterval(()=>{if(!this.ws||this.ws.readyState!==WebSocket.OPEN){this.stopHeartbeat();return}if(Date.now()-this.lastMessageTime>3e5){this.ws.close();return}},this.heartbeatInterval)}stopHeartbeat(){this.heartbeatTimer&&(clearInterval(this.heartbeatTimer),this.heartbeatTimer=null),this.pingTimer&&(clearInterval(this.pingTimer),this.pingTimer=null)}disconnect(){if(this.shouldReconnect=!1,this.reconnectAttempts=0,this.setConnectionState("disconnecting"),this.stopHeartbeat(),this.reconnectTimer&&(clearTimeout(this.reconnectTimer),this.reconnectTimer=null),this.ws){this.ws.onclose=null,this.ws.onerror=null;try{this.ws.close()}catch{}this.ws=null}}reset(){this.disconnect(),this.callbacks.clear(),this.visibilityChangeHandler&&(document.removeEventListener("visibilitychange",this.visibilityChangeHandler),this.visibilityChangeHandler=null),this.onlineHandler&&(window.removeEventListener("online",this.onlineHandler),this.onlineHandler=null)}isConnected(){return this.ws?.readyState===WebSocket.OPEN}}let vn=null;function ry(){if(typeof window>"u")return vn||(vn=new xr),vn;const e=window.__archipelago_ws_client;return e&&e instanceof xr&&e.isConnected()?(vn=e,e):(vn||(vn=new xr,typeof window<"u"&&(window.__archipelago_ws_client=vn)),vn)}let ts=null;const Fn=(()=>{if(ts)return ts;try{return ts=ry(),ts}catch{return ts=new xr,ts}})();function oy(e,t){if(!Array.isArray(t)||t.length===0)return e;try{return go(e,t,!1,!1).newDocument}catch{return e}}function iy(){const e=document.cookie.match(/(?:^|;\s*)csrf_token=([^;]+)/);return e?e[1]:null}class ay{baseUrl;constructor(t="/rpc/v1"){this.baseUrl=t}async call(t){const{method:n,params:s={},timeout:r=3e4}=t,o=3;for(let i=0;ia.abort(),r);try{const c={"Content-Type":"application/json"},u=iy();u&&(c["X-CSRF-Token"]=u);const f=await fetch(this.baseUrl,{method:"POST",credentials:"include",headers:c,body:JSON.stringify({method:n,params:s}),signal:a.signal});if(clearTimeout(l),!f.ok){if(f.status===401&&n!=="auth.login")throw window.location.href="/login",new Error("Session expired");const p=new Error(`HTTP ${f.status}: ${f.statusText}`);if((f.status===502||f.status===503)&&isetTimeout(h,600*(i+1)));continue}throw p}const d=await f.json();if(d.error)throw new Error(d.error.message||"RPC Error");return d.result}catch(c){if(clearTimeout(l),c instanceof Error){if(c.name==="AbortError"){const d=new Error("Request timeout");if(isetTimeout(p,600*(i+1)));continue}throw d}const u=c.message;if(/502|503|Bad Gateway|fetch|network/i.test(u)&&isetTimeout(d,600*(i+1)));continue}throw c}throw new Error("Unknown error occurred")}}throw new Error("Request failed after retries")}async login(t){return this.call({method:"auth.login",params:{password:t}})}async loginTotp(t){return this.call({method:"auth.login.totp",params:{code:t}})}async loginBackup(t){return this.call({method:"auth.login.backup",params:{code:t}})}async totpSetupBegin(t){return this.call({method:"auth.totp.setup.begin",params:{password:t}})}async totpSetupConfirm(t){return this.call({method:"auth.totp.setup.confirm",params:t})}async totpDisable(t,n){return this.call({method:"auth.totp.disable",params:{password:t,code:n}})}async totpStatus(){return this.call({method:"auth.totp.status",params:{}})}async changePassword(t){return this.call({method:"auth.changePassword",params:{currentPassword:t.currentPassword,newPassword:t.newPassword,alsoChangeSsh:t.alsoChangeSsh??!0}})}async logout(){return this.call({method:"auth.logout",params:{}})}async completeOnboarding(){return this.call({method:"auth.onboardingComplete",params:{}})}async isOnboardingComplete(){return this.call({method:"auth.isOnboardingComplete",params:{}})}async resetOnboarding(){return this.call({method:"auth.resetOnboarding",params:{}})}async getNodeDid(){return this.call({method:"node.did",params:{}})}async signChallenge(t){return this.call({method:"node.signChallenge",params:{challenge:t}})}async createBackup(t){return this.call({method:"node.createBackup",params:{passphrase:t}})}async resolveDid(t){return this.call({method:"identity.resolve-did",params:t?{did:t}:{}})}async createPresentation(t){return this.call({method:"identity.create-presentation",params:{holder_id:t.holderId,credential_ids:t.credentialIds}})}async verifyPresentation(t){return this.call({method:"identity.verify-presentation",params:{presentation:t}})}async createPsbt(t){return this.call({method:"lnd.create-psbt",params:{outputs:t.outputs,fee_rate_sat_per_vbyte:t.feeRateSatPerVbyte??10}})}async finalizePsbt(t){return this.call({method:"lnd.finalize-psbt",params:{signed_psbt_base64:t}})}async publishNostrIdentity(){return this.call({method:"node.nostr-publish",params:{}})}async getNostrPubkey(){return this.call({method:"node.nostr-pubkey",params:{}})}async listPeers(){return this.call({method:"node-list-peers",params:{}})}async addPeer(t){return this.call({method:"node-add-peer",params:t})}async removePeer(t){return this.call({method:"node-remove-peer",params:{pubkey:t}})}async sendMessageToPeer(t,n){return this.call({method:"node-send-message",params:{onion:t,message:n},timeout:9e4})}async checkPeerReachable(t){return this.call({method:"node-check-peer",params:{onion:t},timeout:35e3})}async getReceivedMessages(){return this.call({method:"node-messages-received",params:{}})}async discoverNodes(){return this.call({method:"node-nostr-discover",params:{},timeout:2e4})}async getTorAddress(){return this.call({method:"node.tor-address",params:{}})}async torListServices(){return this.call({method:"tor.list-services"})}async torRotateService(t){return this.call({method:"tor.rotate-service",params:{name:t}})}async torToggleApp(t,n){return this.call({method:"tor.toggle-app",params:{app_id:t,enabled:n}})}async torCleanupRotated(){return this.call({method:"tor.cleanup-rotated"})}async verifyNostrRevoked(){return this.call({method:"node-nostr-verify-revoked",params:{},timeout:25e3})}async echo(t){return this.call({method:"server.echo",params:{message:t}})}async getSystemTime(){return this.call({method:"server.time",params:{}})}async getMetrics(){return this.call({method:"server.metrics",params:{}})}async updateServer(t){return this.call({method:"server.update",params:{"marketplace-url":t}})}async detectUsbDevices(){return this.call({method:"system.detect-usb-devices",params:{}})}async restartServer(){return this.call({method:"server.restart",params:{}})}async shutdownServer(){return this.call({method:"server.shutdown",params:{}})}async installPackage(t,n,s){return this.call({method:"package.install",params:{id:t,"marketplace-url":n,version:s}})}async uninstallPackage(t){return this.call({method:"package.uninstall",params:{id:t}})}async startPackage(t){return this.call({method:"package.start",params:{id:t}})}async stopPackage(t){return this.call({method:"package.stop",params:{id:t}})}async restartPackage(t){return this.call({method:"package.restart",params:{id:t}})}async getMarketplace(t){return this.call({method:"marketplace.get",params:{url:t}})}async federationInvite(){return this.call({method:"federation.invite",params:{}})}async federationJoin(t){return this.call({method:"federation.join",params:{code:t}})}async federationListNodes(){return this.call({method:"federation.list-nodes",params:{}})}async federationRemoveNode(t){return this.call({method:"federation.remove-node",params:{did:t}})}async federationSetTrust(t,n){return this.call({method:"federation.set-trust",params:{did:t,trust_level:n}})}async federationSyncState(){return this.call({method:"federation.sync-state",params:{},timeout:12e4})}async federationDeployApp(t){return this.call({method:"federation.deploy-app",params:{did:t.did,app_id:t.appId,version:t.version??"latest",marketplace_url:t.marketplaceUrl??""},timeout:18e4})}async vpnStatus(){return this.call({method:"vpn.status",params:{}})}async vpnConfigure(t){return this.call({method:"vpn.configure",params:t,timeout:6e4})}async vpnDisconnect(){return this.call({method:"vpn.disconnect",params:{}})}async marketplaceDiscover(){return this.call({method:"marketplace.discover",params:{},timeout:3e4})}async dnsStatus(){return this.call({method:"network.dns-status",params:{}})}async configureDns(t){return this.call({method:"network.configure-dns",params:t})}async diskStatus(){return this.call({method:"system.disk-status"})}async diskCleanup(){return this.call({method:"system.disk-cleanup",timeout:6e4})}}const Ne=new ay,ia=Qn("app",()=>{const e=G(null),t=G(localStorage.getItem("neode-auth")==="true"),n=G(!1),s=G(!1),r=G(!1),o=G(null);let i=!1,a=!1;const l=pe(()=>e.value?.["server-info"]),c=pe(()=>e.value?.["package-data"]||{}),u=pe(()=>e.value?.["peer-health"]||{}),f=pe(()=>e.value?.ui),d=pe(()=>l.value?.name||"Archipelago"),p=pe(()=>l.value?.["status-info"]?.restarting||!1),b=pe(()=>l.value?.["status-info"]?.["shutting-down"]||!1),h=pe(()=>!n.value||p.value||b.value);async function E(N){r.value=!0,o.value=null;try{const W=await Ne.login(N);return W&&W.requires_totp?{requires_totp:!0}:(t.value=!0,a=!0,localStorage.setItem("neode-auth","true"),await S(),C().catch(X=>{}),{})}catch(W){throw o.value=W instanceof Error?W.message:"Login failed",W}finally{r.value=!1}}async function v(){t.value=!0,a=!0,localStorage.setItem("neode-auth","true"),await S(),C().catch(N=>{})}async function w(){try{await Ne.logout()}catch{}finally{t.value=!1,a=!1,localStorage.removeItem("neode-auth"),e.value=null,i=!1,Fn.disconnect(),n.value=!1,s.value=!1}}async function C(){try{if(s.value=!0,i||(i=!0,Fn.onConnectionStateChange(N=>{n.value=N==="connected",s.value=N==="connecting"}),Fn.subscribe(N=>{if(N?.type==="initial"&&N?.data)e.value=N.data,n.value=!0,s.value=!1;else if(N?.data&&N?.rev!==void 0)e.value=N.data,n.value=!0,s.value=!1;else if(e.value&&N?.patch)try{e.value=oy(e.value,N.patch),n.value||(n.value=!0,s.value=!1)}catch{}})),Fn.isConnected()){n.value=!0,s.value=!1;return}await Fn.connect(),Fn.isConnected()&&(n.value=!0,s.value=!1)}catch{s.value=!0,n.value=!1}}async function S(){e.value={"server-info":{id:"",version:"",name:null,pubkey:"","status-info":{restarting:!1,"shutting-down":!1,updated:!1,"backup-progress":null,"update-progress":null},"lan-address":null,"tor-address":null,unread:0,"wifi-ssids":[],"zram-enabled":!1},"package-data":{},ui:{name:null,"ack-welcome":"",marketplace:{"selected-hosts":[],"known-hosts":{}},theme:"dark"}}}async function O(){if(!localStorage.getItem("neode-auth"))return!1;try{return await Ne.call({method:"server.echo",params:{message:"ping"}}),t.value=!0,a=!0,await S(),C().catch(N=>{s.value=!0}),!0}catch{return localStorage.removeItem("neode-auth"),t.value=!1,a=!1,i=!1,n.value=!1,s.value=!1,Fn.disconnect(),!1}}function D(){return t.value&&!a}async function k(N,W,X){return Ne.installPackage(N,W,X)}async function I(N){return Ne.uninstallPackage(N)}async function P(N){return Ne.startPackage(N)}async function q(N){return Ne.stopPackage(N)}async function Y(N){return Ne.restartPackage(N)}async function B(N){return Ne.updateServer(N)}async function ae(){return Ne.restartServer()}async function re(){return Ne.shutdownServer()}async function ve(){return Ne.getMetrics()}async function ce(N){return Ne.getMarketplace(N)}return{data:e,isAuthenticated:t,isConnected:n,isReconnecting:s,isLoading:r,error:o,serverInfo:l,packages:c,peerHealth:u,uiData:f,serverName:d,isRestarting:p,isShuttingDown:b,isOffline:h,login:E,completeLoginAfterTotp:v,logout:w,checkSession:O,needsSessionValidation:D,connectWebSocket:C,installPackage:k,uninstallPackage:I,startPackage:P,stopPackage:q,restartPackage:Y,updateServer:B,restartServer:ae,shutdownServer:re,getMetrics:ve,getMarketplace:ce}}),zn=hg({history:Gm(),routes:[{path:"/",component:()=>_e(()=>import("./OnboardingWrapper-BsOJSH8d.js"),__vite__mapDeps([0,1])),meta:{public:!0},children:[{path:"",component:()=>_e(()=>import("./RootRedirect-_cfWJoe8.js"),__vite__mapDeps([2,3,4]))},{path:"login",name:"login",component:()=>_e(()=>import("./Login-CJkTG_B-.js"),__vite__mapDeps([5,6,7]))},{path:"onboarding/intro",name:"onboarding-intro",component:()=>_e(()=>import("./OnboardingIntro-CsYM21xo.js"),__vite__mapDeps([8,9]))},{path:"onboarding/options",name:"onboarding-options",component:()=>_e(()=>import("./OnboardingOptions-BEL4MhY9.js"),__vite__mapDeps([10,3]))},{path:"onboarding/path",name:"onboarding-path",component:()=>_e(()=>import("./OnboardingPath-BE4wazNB.js"),[])},{path:"onboarding/did",name:"onboarding-did",component:()=>_e(()=>import("./OnboardingDid-Cr_ec55a.js"),__vite__mapDeps([11,12]))},{path:"onboarding/identity",name:"onboarding-identity",component:()=>_e(()=>import("./OnboardingIdentity-i_e-4MVD.js"),[])},{path:"onboarding/backup",name:"onboarding-backup",component:()=>_e(()=>import("./OnboardingBackup-DGLHJlqA.js"),[])},{path:"onboarding/verify",name:"onboarding-verify",component:()=>_e(()=>import("./OnboardingVerify-P3nJC3Zw.js"),__vite__mapDeps([13,3]))},{path:"onboarding/done",name:"onboarding-done",component:()=>_e(()=>import("./OnboardingDone-D8gm2WWx.js"),[])}]},{path:"/recovery",name:"recovery",component:()=>_e(()=>import("./KioskRecovery-DsarIru9.js"),[]),meta:{public:!0}},{path:"/kiosk",name:"kiosk",component:()=>_e(()=>import("./Kiosk-CEZdJvXG.js"),__vite__mapDeps([14,15])),meta:{public:!0}},{path:"/dashboard",component:()=>_e(()=>import("./Dashboard-Byxe5sIJ.js"),__vite__mapDeps([16,17,18,6,19,20,21,22])),children:[{path:"",name:"home",component:()=>_e(()=>import("./Home-BM_tfGHm.js"),__vite__mapDeps([23,6,24,25,26,27]))},{path:"apps",name:"apps",component:()=>_e(()=>import("./Apps-JbZuzA3H.js"),__vite__mapDeps([28,24,29]))},{path:"apps/:id",name:"app-details",component:()=>_e(()=>import("./AppDetails-DfPGLgac.js"),__vite__mapDeps([30,24,31]))},{path:"apps/lnd/channels",name:"lightning-channels",component:()=>_e(()=>import("./LightningChannels-BTRz5y8m.js"),[])},{path:"marketplace",name:"marketplace",component:()=>_e(()=>import("./Marketplace-dnuGfUDf.js"),__vite__mapDeps([32,33,34]))},{path:"marketplace/:id",name:"marketplace-app-detail",component:()=>_e(()=>import("./MarketplaceAppDetails-DhlIl2UT.js"),__vite__mapDeps([35,33]))},{path:"cloud",name:"cloud",component:()=>_e(()=>import("./Cloud-BkxOai3U.js"),__vite__mapDeps([36,26]))},{path:"cloud/peers/:peerId?",name:"peer-files",component:()=>_e(()=>import("./PeerFiles-qTLuUhI-.js"),[]),props:!0},{path:"cloud/:folderId",name:"cloud-folder",component:()=>_e(()=>import("./CloudFolder-8jSNyq3F.js"),__vite__mapDeps([37,26]))},{path:"server",name:"server",component:()=>_e(()=>import("./Server-BNJJbUQb.js"),[])},{path:"monitoring",name:"monitoring",component:()=>_e(()=>import("./Monitoring-Bmi1t-3N.js"),[])},{path:"server/federation",name:"federation",component:()=>_e(()=>import("./Federation-BIPGM17A.js"),__vite__mapDeps([38,39,40]))},{path:"mesh",name:"mesh",component:()=>_e(()=>import("./Mesh-CPUFszgS.js"),__vite__mapDeps([41,21,39,42]))},{path:"web5",name:"web5",component:()=>_e(()=>import("./Web5-DcuUNKso.js"),__vite__mapDeps([43,20,24]))},{path:"web5/credentials",name:"credentials",component:()=>_e(()=>import("./Credentials-DP_VdhTb.js"),__vite__mapDeps([44,45]))},{path:"settings",name:"settings",component:()=>_e(()=>import("./Settings-a5XTzOeo.js"),__vite__mapDeps([46,47,19]))},{path:"settings/update",name:"system-update",component:()=>_e(()=>import("./SystemUpdate-DAjulYB4.js"),[])},{path:"goals/:goalId",name:"goal-detail",component:()=>_e(()=>import("./GoalDetail-BDM8F7F1.js"),__vite__mapDeps([48,25,49]))},{path:"chat",name:"chat",component:()=>_e(()=>import("./Chat-BLEXivD6.js"),__vite__mapDeps([50,47,26,51]))},{path:"app-session/:appId",name:"app-session",component:()=>_e(()=>import("./AppSession-Cw_auYBr.js"),__vite__mapDeps([17,18]))},{path:"containers",redirect:()=>({path:"/dashboard/apps"})},{path:"containers/:id",redirect:e=>({path:`/dashboard/apps/${e.params.id}`})}]},{path:"/:pathMatch(.*)*",name:"not-found",component:()=>_e(()=>import("./NotFound-D22kjDbC.js"),[])}]}),ly=8e3;async function Ul(e){try{return await Promise.race([e.checkSession(),new Promise(t=>setTimeout(()=>t(!1),ly))])}catch{return!1}}zn.beforeEach(async(e,t,n)=>{const s=ia();if(e.meta.public){if(e.path==="/login"&&s.isAuthenticated){const o=e.query.redirect||"/dashboard";if(s.needsSessionValidation()){n(),Ul(s).then(i=>{i&&zn.replace(o).catch(()=>{})});return}n(o);return}n();return}if(s.needsSessionValidation()){n(),s.checkSession().then(o=>{o||zn.replace({path:"/login",query:{redirect:e.fullPath}}).catch(()=>{})});return}if(!s.isAuthenticated){if(await Ul(s)){n();return}n({path:"/login",query:{redirect:e.fullPath}});return}!s.isConnected&&!s.isReconnecting&&s.connectWebSocket().catch(o=>{}),n()});zn.afterEach((e,t)=>{e.path.startsWith("/dashboard")&&!t.path.startsWith("/dashboard")&&Ig()});zn.afterEach(e=>{(e.path==="/dashboard"||e.path==="/dashboard/")&&Jn(()=>{setTimeout(()=>{const t=document.querySelector('[data-controller-zone="sidebar"] a[href="/dashboard"], [data-controller-zone="sidebar"] a[href="/dashboard/"]');t&&t.focus()},150)})});const cy=new Set(["23000","3000","2342","8123","8082","8085","3001","9001"]);function uy(e){try{const t=new URL(e);return cy.has(t.port)}catch{return!1}}const fy={81:"nginx-proxy-manager",3e3:"grafana",3001:"uptime-kuma",8080:"endurain",8081:"lnd",8082:"vaultwarden",8083:"filebrowser",8085:"nextcloud",8096:"jellyfin",8123:"homeassistant",8240:"tailscale",8334:"bitcoin-knots",8888:"searxng",9e3:"portainer",9001:"penpot",9980:"onlyoffice",11434:"ollama",2283:"immich",23e3:"btcpay-server",2342:"photoprism",4080:"mempool",8175:"fedimint",8176:"fedimint-gateway",3100:"dwn",18081:"nostr-rs-relay",7777:"indeedhub",50002:"electrumx"},Pf="neode_nostr_approved_origins";function Lf(){try{const e=localStorage.getItem(Pf);return e?new Set(JSON.parse(e)):new Set}catch{return new Set}}function dy(e){const t=Lf();t.add(e),localStorage.setItem(Pf,JSON.stringify([...t]))}const py="archipelago_app_display_mode",qr=Qn("appLauncher",()=>{const e=G(!1),t=G(""),n=G(""),s=G(null),r=G(!1);let o=null;const i=G(null);function a(E){(localStorage.getItem(py)||"panel")==="panel"?i.value=E:(i.value=null,zn.push({name:"app-session",params:{appId:E}}))}function l(){i.value=null}function c(E){const v=u(E.url);if(v){a(v);return}if(E.openInNewTab||uy(E.url)){window.open(E.url,"_blank","noopener,noreferrer");return}o=document.activeElement||null,t.value=E.url,n.value=E.title,e.value=!0}function u(E){try{const v=new URL(E),w=fy[v.port];return w||{"botfights.net":"botfights","nwnn.l484.com":"nwnn","484.kitchen":"484-kitchen","cta.tx1138.com":"call-the-operator","present.l484.com":"arch-presentation","syntropy.institute":"syntropy-institute","teeminuszero.net":"t-zero","nostrudel.ninja":"nostrudel"}[v.hostname]||null}catch{return null}}function f(){const E=o;o=null,e.value=!1,t.value="",n.value="",E&&typeof E.focus=="function"&&requestAnimationFrame(()=>{E.focus()})}function d(E){s.value&&(s.value.resolve(E),s.value=null),r.value=!1}function p(){s.value&&(s.value.reject(),s.value=null),r.value=!1}function b(E,v,w,C){return new Promise((S,O)=>{s.value={appName:E,method:v,eventKind:w,content:C,resolve:S,reject:O},r.value=!0})}async function h(E){if(!E.data||E.data.type!=="nostr-request")return;const{id:v,method:w,params:C}=E.data,S=E.source;if(!S)return;const O=t.value||"unknown",k="archipelago_app_identity_"+(t.value||"").replace(/[^a-z0-9]/gi,"_");let I=null;try{const P=localStorage.getItem(k);P&&(I=JSON.parse(P).id||null)}catch{}try{let P;if(w==="getPublicKey")I?P=(await Ne.call({method:"identity.get",params:{id:I}})).nostr_pubkey:P=(await Ne.call({method:"node.nostr-pubkey"})).nostr_pubkey;else if(w==="signEvent"){if(!Lf().has(O)){const Y=C?.event?.kind,B=C?.event?.content;try{await b(n.value||"App","signEvent",Y,B)&&dy(O)}catch{S.postMessage({type:"nostr-response",id:v,error:"User denied signing request"},"*");return}}I?P=await Ne.call({method:"identity.nostr-sign",params:{id:I,event:C.event}}):P=await Ne.call({method:"node.nostr-sign",params:{event:C.event}})}else if(w==="getRelays")P={};else if(w==="nip04.encrypt")P=(await Ne.call({method:"identity.nostr-encrypt-nip04",params:{id:I||void 0,pubkey:C.pubkey,plaintext:C.plaintext}})).ciphertext;else if(w==="nip04.decrypt")P=(await Ne.call({method:"identity.nostr-decrypt-nip04",params:{id:I||void 0,pubkey:C.pubkey,ciphertext:C.ciphertext}})).plaintext;else if(w==="nip44.encrypt")P=(await Ne.call({method:"identity.nostr-encrypt-nip44",params:{id:I||void 0,pubkey:C.pubkey,plaintext:C.plaintext}})).ciphertext;else if(w==="nip44.decrypt")P=(await Ne.call({method:"identity.nostr-decrypt-nip44",params:{id:I||void 0,pubkey:C.pubkey,ciphertext:C.ciphertext}})).plaintext;else throw new Error(`Unsupported NIP-07 method: ${w}`);S.postMessage({type:"nostr-response",id:v,result:P},"*")}catch(P){const q=P instanceof Error?P.message:"Unknown error";S.postMessage({type:"nostr-response",id:v,error:q},"*")}}return qe(e,E=>{E?window.addEventListener("message",h):window.removeEventListener("message",h)}),{isOpen:e,url:t,title:n,open:c,openSession:a,close:f,closePanel:l,panelAppId:i,showConsent:r,consentRequest:s,approveConsent:d,denyConsent:p}}),Ps=[{id:"navigate",label:"Navigate",items:[{id:"home",label:"Home",path:"/dashboard"},{id:"apps",label:"My Apps",path:"/dashboard/apps"},{id:"marketplace",label:"App Store",path:"/dashboard/marketplace"},{id:"cloud",label:"Cloud",path:"/dashboard/cloud"},{id:"server",label:"Network",path:"/dashboard/server"},{id:"web5",label:"Web5",path:"/dashboard/web5"},{id:"settings",label:"Settings",path:"/dashboard/settings"}]},{id:"learn",label:"Learn",items:[{id:"getting-started",label:"Getting Started",content:"Welcome to Archipelago! To get started: 1) Flash the Archipelago ISO to a USB drive using Balena Etcher or dd. 2) Boot your hardware from the USB. 3) The installer partitions your disk, installs the OS, and reboots automatically. 4) On first boot, open a browser and navigate to your node's IP address. 5) Complete the onboarding wizard — set a password, create your first identity (DID), and choose your setup path. Your node is now ready to install apps, connect to Bitcoin, and join the sovereign web.",relatedPath:"/dashboard"},{id:"bitcoin-basics",label:"Bitcoin Basics",content:"Bitcoin is a decentralized digital currency. Your node validates transactions and maintains the blockchain locally. Install Bitcoin Knots from the App Store to run a full node. Initial sync takes 2-3 days depending on hardware and internet speed. Once synced, your node independently verifies every transaction without trusting any third party.",relatedPath:"/dashboard/server"},{id:"lightning-network",label:"Lightning Network",content:"Lightning enables instant, low-fee payments. Install LND from the App Store (requires Bitcoin Knots). After installation, open channels with other nodes to send and receive payments. Use the Lightning Channels view to manage channels, check inbound/outbound liquidity, and monitor your routing fees. Channels require an on-chain transaction to open and close.",relatedPath:"/dashboard/apps"},{id:"app-store-guide",label:"Installing & Managing Apps",content:"Open the App Store (marketplace icon) to browse available apps. Click Install to download and start an app. Some apps have dependencies — Electrs requires Bitcoin, BTCPay requires LND, Mempool requires both Bitcoin and Electrs. The system handles these automatically. After installation, apps appear in My Apps. Click an app to open it in an overlay or new tab. Use the app detail page to start, stop, restart, or uninstall apps.",relatedPath:"/dashboard/marketplace"},{id:"identity-guide",label:"Your Digital Identity (DIDs)",content:"Archipelago creates a sovereign digital identity (DID) during onboarding. DIDs are cryptographic keypairs that prove your identity without any company in the middle. You can create multiple identities for different purposes — Personal, Business, or Anonymous. Each identity can sign messages, issue verifiable credentials, and authenticate with services like Indeehub. Manage identities in the Web5 view.",relatedPath:"/dashboard/web5"},{id:"networking-guide",label:"Connecting with Peers",content:'Archipelago nodes can discover and connect with each other over Tor. In Web5, set your node visibility to "Discoverable" to let other nodes find you via Nostr. Accept connection requests from peers you trust. Once connected, you can message peers, share content, and exchange ecash payments — all over encrypted Tor connections. Your .onion address is shown in Settings.',relatedPath:"/dashboard/web5"},{id:"content-sharing",label:"Sharing Content",content:"Share files and media with connected peers through the Content section in Web5. Add content from your Cloud storage, set it as free or paid (ecash-gated), and connected peers can browse and access your catalog. For paid content, peers pay with ecash micropayments — the sats appear in your wallet instantly.",relatedPath:"/dashboard/web5"},{id:"self-hosting",label:"Self-Hosting",content:"Archipelago runs your services locally. Your data stays on your hardware, giving you full control and privacy. No cloud subscriptions, no data harvesting, no service shutdowns. You own your node, your data, and your identity. Back up your node regularly using the backup feature in Settings.",relatedPath:"/dashboard"},{id:"troubleshooting",label:"Troubleshooting FAQ",content:"Common issues: 1) App won't start — check disk space in Settings > Server. 2) Bitcoin not syncing — ensure port 8333 is reachable; check network diagnostics. 3) Can't connect to peers — verify Tor is running (Settings > Network). 4) UI is slow — some views load data from multiple sources; check server resources. 5) Lost password — use the backup recovery key created during onboarding. 6) Container errors — try stopping and restarting the app, or uninstall and reinstall.",relatedPath:"/dashboard/settings"}]},{id:"actions",label:"Actions",items:[{id:"open-cli",label:"Open CLI",path:"__cli__"},{id:"install-app",label:"Install an App",path:"/dashboard/marketplace"},{id:"manage-apps",label:"Manage My Apps",path:"/dashboard/apps"},{id:"network-settings",label:"Network Settings",path:"/dashboard/server"},{id:"backup",label:"Backup & Recovery",path:"/dashboard/settings"}]},{id:"goals",label:"Quick Start Goals",items:[{id:"goal-shop",label:"Open a Shop",path:"/dashboard/goals/open-a-shop"},{id:"goal-payments",label:"Accept Payments",path:"/dashboard/goals/accept-payments"},{id:"goal-photos",label:"Store My Photos",path:"/dashboard/goals/store-photos"},{id:"goal-files",label:"Store My Files",path:"/dashboard/goals/store-files"},{id:"goal-lightning",label:"Run a Lightning Node",path:"/dashboard/goals/run-lightning-node"},{id:"goal-identity",label:"Create My Identity",path:"/dashboard/goals/create-identity"},{id:"goal-backup",label:"Back Up Everything",path:"/dashboard/goals/back-up-everything"}]}];function hy(){const e=[];for(const t of Ps){const n=t.id==="navigate"?"navigate":t.id==="learn"?"learn":t.id==="goals"?"goal":"action";for(const s of t.items)e.push({id:s.id,label:s.label,path:s.path,type:n,section:t.label,content:s.content,relatedPath:s.relatedPath})}return e}const my={class:"flex items-center gap-3 px-4 py-3 border-b border-white/10"},gy={class:"flex-1 flex items-center gap-3 min-w-0"},vy={class:"flex-1 overflow-y-auto max-h-[60vh] min-h-[200px]"},yy={key:0,class:"p-2 border-b border-white/10"},_y=["onClick"],by={class:"text-white/90"},wy={class:"text-xs text-white/40"},Ey={key:0,class:"p-2"},Ay=["onClick"],Sy={class:"text-white/90"},Cy={class:"text-xs text-white/40"},ky={key:1,class:"p-8 text-center text-white/50"},xy={class:"px-3 py-2 text-xs font-medium text-white/50 uppercase tracking-wider"},Ty=["onClick"],Iy={class:"text-white/90"},Vl="archipelago-spotlight-position",Ry=Ze({__name:"SpotlightSearch",setup(e){const t=ho(),n=jr(),s=Js(),r=ia(),o=qr(),i=G(null),a=G(null),l=G(null),c=G(""),u=G(!1),f=G(null),d=hy(),p=pe(()=>{const N=r.packages;return Object.entries(N).map(([W,X])=>({id:`app-${W}`,label:X.manifest?.title||W,path:`__launch_app__:${W}`,type:"action",section:"Installed Apps"}))}),b=pe(()=>[...d,...p.value]),h=pe(()=>new bs(b.value,{keys:["label","section"],threshold:.4})),E=pe(()=>{const N=c.value.trim();return N?h.value.search(N).map(X=>X.item):[]}),v=pe(()=>!c.value.trim()&&n.recentItems.length>0?n.recentItems.length:0),w=pe(()=>c.value.trim()?E.value.length:v.value+b.value.length),C=pe(()=>{const N=S.value;return N?{transform:`translate(${N.x}px, ${N.y}px)`,margin:0}:{}}),S=G(null);function O(){try{const N=localStorage.getItem(Vl);if(N){const W=JSON.parse(N);S.value={x:W.x??0,y:W.y??0}}else S.value=null}catch{S.value=null}}function D(N,W){S.value={x:N,y:W};try{localStorage.setItem(Vl,JSON.stringify({x:N,y:W}))}catch{}}function k(N,W){let X=0;for(const ge of Ps){if(ge.id===N)return X+W;X+=ge.items.length}return-1}function I(N){const W=n.selectedIndex;return N===W?"bg-amber-500/20 text-amber-200":"hover:bg-white/10 text-white/90"}function P(N){const W=r.packages[N];if(!W)return;let X=W.installed?.["interface-addresses"]?.main?.["lan-address"];X&&X.includes("localhost")&&(X=X.replace("localhost",window.location.hostname)),X?o.open({url:X,title:W.manifest?.title||N}):t.push(`/dashboard/apps/${N}`).catch(()=>{})}function q(N){n.addRecentItem({id:N.id,label:N.label,path:N.path,type:N.type}),n.close(),N.path?.startsWith("__launch_app__:")?P(N.path.replace("__launch_app__:","")):N.path==="__cli__"?s.open():N.path?t.push(N.path):N.content&&n.showHelpModal({title:N.label,content:N.content,relatedPath:N.relatedPath})}function Y(N,W){const X=N.id==="navigate"?"navigate":N.id==="learn"?"learn":"action";n.addRecentItem({id:W.id,label:W.label,path:W.path,type:X}),n.close(),W.path?.startsWith("__launch_app__:")?P(W.path.replace("__launch_app__:","")):W.path==="__cli__"?s.open():W.path?t.push(W.path):W.content&&n.showHelpModal({title:W.label,content:W.content,relatedPath:W.relatedPath})}function B(N){if(n.close(),N.path?.startsWith("__launch_app__:")){P(N.path.replace("__launch_app__:",""));return}if(N.path==="__cli__"){s.open();return}if(N.path){t.push(N.path);return}if(N.type==="learn")for(const W of Ps){const X=W.items.find(ge=>ge.id===N.id);if(X?.content){n.showHelpModal({title:X.label,content:X.content,relatedPath:X.relatedPath});return}}}function ae(N){if(N.key==="Escape"){n.close(),N.preventDefault(),N.stopPropagation();return}if(N.key==="ArrowDown"){N.preventDefault(),n.setSelectedIndex(Math.min(n.selectedIndex+1,Math.max(0,w.value-1)));return}if(N.key==="ArrowUp"){N.preventDefault(),n.setSelectedIndex(Math.max(n.selectedIndex-1,0));return}if(N.key==="Enter"){N.preventDefault();const W=n.selectedIndex;if(c.value.trim()){const j=E.value[W];j&&q(j);return}if(Wn.isOpen,N=>{N&&(c.value="",O(),Jn(()=>{i.value?.focus(),n.setSelectedIndex(0)}))}),qe([c,E],()=>{n.setSelectedIndex(0)}),ht(()=>{O(),window.addEventListener("mousemove",ve),window.addEventListener("mouseup",ce)}),Ot(()=>{window.removeEventListener("mousemove",ve),window.removeEventListener("mouseup",ce)}),(N,W)=>(z(),dt(Nt,{to:"body"},[de(tt,{name:"spotlight"},{default:Ye(()=>[he(n).isOpen?(z(),Z("div",{key:0,class:"fixed inset-0 z-[2500] flex items-center justify-center p-4",onClick:W[1]||(W[1]=Tn(X=>he(n).close(),["self"]))},[W[7]||(W[7]=_("div",{class:"absolute inset-0 bg-black/60 backdrop-blur-sm"},null,-1)),_("div",{ref_key:"panelRef",ref:a,class:"glass-card w-full max-w-2xl relative z-10 overflow-hidden flex flex-col",style:Tt(C.value),onMousedown:re},[_("div",my,[_("div",{ref_key:"dragHandleRef",ref:l,class:$e(["flex items-center justify-center w-8 h-8 rounded cursor-grab hover:bg-white/10 transition-colors shrink-0",{"cursor-grabbing":u.value}]),title:"Drag to move"},[...W[2]||(W[2]=[_("svg",{class:"w-4 h-4 text-white/50",fill:"currentColor",viewBox:"0 0 24 24"},[_("path",{d:"M8 6h2v2H8V6zm0 5h2v2H8v-2zm0 5h2v2H8v-2zm5-10h2v2h-2V6zm0 5h2v2h-2v-2zm0 5h2v2h-2v-2z"})],-1)])],2),_("div",gy,[W[3]||(W[3]=_("svg",{class:"w-5 h-5 text-white/60 shrink-0",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[_("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z"})],-1)),Yi(_("input",{ref_key:"inputRef",ref:i,"onUpdate:modelValue":W[0]||(W[0]=X=>c.value=X),type:"text",placeholder:"Search or type a command...",class:"flex-1 bg-transparent text-white placeholder-white/50 outline-none text-base",onKeydown:ae},null,544),[[Xu,c.value]])]),W[4]||(W[4]=_("kbd",{class:"hidden sm:inline-flex px-2 py-1 text-xs text-white/50 bg-white/10 rounded"},"Esc",-1))]),_("div",vy,[!c.value.trim()&&he(n).recentItems.length>0?(z(),Z("div",yy,[W[5]||(W[5]=_("div",{class:"px-3 py-2 text-xs font-medium text-white/50 uppercase tracking-wider"},"Recent",-1)),(z(!0),Z(Be,null,Gt(he(n).recentItems,(X,ge)=>(z(),Z("button",{key:`recent-${X.id}-${X.timestamp}`,type:"button",class:$e(["w-full flex items-center gap-3 px-3 py-2.5 rounded-lg text-left transition-colors",I(ge)]),onClick:j=>B(X)},[_("span",by,Se(X.label),1),_("span",wy,Se(X.type),1)],10,_y))),128))])):be("",!0),c.value.trim()?(z(),Z(Be,{key:1},[E.value.length>0?(z(),Z("div",Ey,[(z(!0),Z(Be,null,Gt(E.value,(X,ge)=>(z(),Z("button",{key:X.id+X.section,type:"button",class:$e(["w-full flex items-center justify-between gap-3 px-3 py-2.5 rounded-lg text-left transition-colors",I(ge)]),onClick:j=>q(X)},[_("span",Sy,Se(X.label),1),_("span",Cy,Se(X.section),1)],10,Ay))),128))])):(z(),Z("div",ky,' No results for "'+Se(c.value)+'" ',1))],64)):(z(!0),Z(Be,{key:2},Gt(he(Ps),X=>(z(),Z("div",{key:X.id,class:"p-2"},[_("div",xy,Se(X.label),1),(z(!0),Z(Be,null,Gt(X.items,(ge,j)=>(z(),Z("button",{key:ge.id,type:"button",class:$e(["w-full flex items-center gap-3 px-3 py-2.5 rounded-lg text-left transition-colors",I(v.value+k(X.id,j))]),onClick:K=>Y(X,ge)},[_("span",Iy,Se(ge.label),1)],10,Ty))),128))]))),128)),W[6]||(W[6]=_("div",{class:"p-2 border-t border-white/10"},[_("div",{class:"px-3 py-2 text-xs font-medium text-white/50 uppercase tracking-wider"},"AI Assistant"),_("div",{class:"px-3 py-3 rounded-lg bg-white/5 text-white/50 text-sm"}," Coming soon — ask questions about your node, apps, and Bitcoin. ")],-1))])],36)])):be("",!0)]),_:1})]))}}),Py=Dt(Ry,[["__scopeId","data-v-48971291"]]),Ly={class:"flex items-center gap-3 px-4 py-3 border-b border-white/10"},Ny={class:"flex-1 overflow-hidden flex flex-col min-h-0"},Oy={key:0,class:"flex-1 flex flex-col min-h-0 p-4 bg-black/80 rounded-b-lg font-mono text-sm"},Dy={class:"flex items-center gap-2 shrink-0"},My={key:1,class:"flex-1 overflow-y-auto p-4 space-y-4"},Fy={class:"space-y-3"},$y={class:"p-3 rounded-lg bg-white/5 font-mono text-sm"},By={class:"flex items-center gap-2 flex-wrap"},Uy={class:"text-green-400 break-all"},Vy={class:"p-3 rounded-lg bg-white/5 text-sm space-y-1"},Wy={class:"flex flex-col gap-1.5 text-white/80"},Hy={class:"flex justify-between gap-4"},jy={class:"font-mono text-green-400"},Wl="archipelago-cli-position",Ky=Ze({__name:"CLIPopup",setup(e){const t=Js(),n=G(null),s=G(null),r=G(null),o=G(null),i=G(!1),a=G(""),l=G(` ╔═══════════════════════════════════════════════════════════╗ + ║ 🏝️ ARCHIPELAGO BITCOIN NODE OS ║ + ║ Your sovereign Bitcoin infrastructure ║ + ╚═══════════════════════════════════════════════════════════╝ + + System Status: + ───────────────────────────────────────────────────────────── + Mode: 🟢 Installed + Podman: 🟢 Installed + Bitcoin: 🟢 Running (blocks: syncing) + Lightning: 🟡 Stopped + + Main Menu: + ───────────────────────────────────────────────────────────── + r) Refresh - Update IP/status + w) Open Web UI - Launch graphical interface + 1) Install to Disk - Permanently install Archipelago + 2) Setup Bitcoin Core - Configure Bitcoin full node + 3) Setup Lightning (LND) - Configure Lightning Network + 4) Setup BTCPay Server - Bitcoin payment processor + 5) View Logs - Monitor running services + 6) Network Settings - Configure networking + 7) System Info - View system information + q) Quit + +`),c=G(!1),u=G(null),f=G(null),d=!1,p=pe(()=>window.location.hostname),b=pe(()=>`ssh archipelago@${p.value}`),h=pe(()=>{const k=f.value;return k?{transform:`translate(${k.x}px, ${k.y}px)`,margin:0}:{}});function E(){try{const k=localStorage.getItem(Wl);if(k){const I=JSON.parse(k);f.value={x:I.x??0,y:I.y??0}}else f.value=null}catch{f.value=null}}function v(k,I){f.value={x:k,y:I};try{localStorage.setItem(Wl,JSON.stringify({x:k,y:I}))}catch{}}function w(){const k=a.value.trim();if(!k)return;l.value+=` + archipelago@node ~ $ ${k} +`;const I=k.toLowerCase();I==="r"||I==="refresh"?l.value+=` Status refreshed. +`:I==="w"||I.startsWith("web")?l.value+=` Opening Web UI... (press C to return to CLI) +`:I==="q"||I==="quit"||I==="exit"?(l.value+=` Goodbye! 🏝️ +`,t.close()):I==="help"||I==="?"?l.value+=` Type r, w, 1-7, or q. Press C to switch to Web UI. +`:l.value+=` Unknown command. Type 'help' or 'r' for menu. +`,a.value="",Jn(()=>{r.value?.scrollTo({top:r.value.scrollHeight,behavior:"smooth"})})}async function C(){try{await navigator.clipboard.writeText(b.value),i.value=!0,setTimeout(()=>{i.value=!1},2e3)}catch{const k=document.createElement("textarea");k.value=b.value,document.body.appendChild(k),k.select(),document.execCommand("copy"),document.body.removeChild(k),i.value=!0,setTimeout(()=>{i.value=!1},2e3)}}function S(k){if(!s.value?.contains(k.target)||(c.value=!0,!n.value?.getBoundingClientRect()))return;const P=f.value?.x??0,q=f.value?.y??0;u.value={x:k.clientX,y:k.clientY,panelX:P,panelY:q}}function O(k){if(!u.value)return;const I=k.clientX-u.value.x,P=k.clientY-u.value.y;v(u.value.panelX+I,u.value.panelY+P)}function D(){c.value=!1,u.value=null}return ur(n,pe(()=>t.isOpen),()=>t.close()),qe(()=>t.isOpen,k=>{k&&E()}),ht(()=>{E(),window.addEventListener("mousemove",O),window.addEventListener("mouseup",D)}),Ot(()=>{window.removeEventListener("mousemove",O),window.removeEventListener("mouseup",D)}),(k,I)=>(z(),dt(Nt,{to:"body"},[de(tt,{name:"cli-popup"},{default:Ye(()=>[he(t).isOpen?(z(),Z("div",{key:0,class:"fixed inset-0 z-[2500] flex items-center justify-center p-4",onClick:I[1]||(I[1]=Tn(P=>he(t).close(),["self"]))},[I[16]||(I[16]=_("div",{class:"absolute inset-0 bg-black/60 backdrop-blur-sm"},null,-1)),_("div",{ref_key:"panelRef",ref:n,class:"glass-card w-full max-w-2xl relative z-10 overflow-hidden flex flex-col",style:Tt(h.value),onMousedown:S},[_("div",Ly,[_("div",{ref_key:"dragHandleRef",ref:s,class:$e(["flex items-center justify-center w-8 h-8 rounded cursor-grab hover:bg-white/10 transition-colors shrink-0",{"cursor-grabbing":c.value}]),title:"Drag to move"},[...I[2]||(I[2]=[_("svg",{class:"w-4 h-4 text-white/50",fill:"currentColor",viewBox:"0 0 24 24"},[_("path",{d:"M8 6h2v2H8V6zm0 5h2v2H8v-2zm0 5h2v2H8v-2zm5-10h2v2h-2V6zm0 5h2v2h-2v-2zm0 5h2v2h-2v-2z"})],-1)])],2),I[3]||(I[3]=_("div",{class:"flex items-center gap-3 flex-1 min-w-0"},[_("svg",{class:"w-5 h-5 text-white/60 shrink-0",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[_("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M8 9l3 3-3 3m5 0h3M5 20h14a2 2 0 002-2V6a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"})]),_("span",{class:"text-white font-medium"},"CLI Access")],-1)),I[4]||(I[4]=_("kbd",{class:"hidden sm:inline-flex px-2 py-1 text-xs text-white/50 bg-white/10 rounded"},"Esc",-1))]),_("div",Ny,[he(d)?(z(),Z("div",Oy,[_("div",{ref_key:"outputRef",ref:r,class:"flex-1 overflow-y-auto text-green-400/90 whitespace-pre-wrap break-words mb-2 min-h-0"},Se(l.value),513),_("div",Dy,[I[5]||(I[5]=_("span",{class:"text-amber-400"},"archipelago@node",-1)),I[6]||(I[6]=_("span",{class:"text-white/60"},"~",-1)),I[7]||(I[7]=_("span",{class:"text-white/40"},"$",-1)),Yi(_("input",{ref_key:"cliInputRef",ref:o,"onUpdate:modelValue":I[0]||(I[0]=P=>a.value=P),type:"text",class:"flex-1 bg-transparent text-white outline-none border-none",placeholder:" ",onKeydown:Qu(w,["enter"])},null,544),[[Xu,a.value]])])])):(z(),Z("div",My,[I[15]||(I[15]=_("p",{class:"text-white/80 text-sm"}," Connect to this node via SSH to access the command line. Use the same host as this web interface. ",-1)),_("div",Fy,[_("div",$y,[I[8]||(I[8]=_("div",{class:"text-white/50 text-xs uppercase tracking-wider mb-2"},"SSH Command",-1)),_("div",By,[_("code",Uy,Se(b.value),1),_("button",{type:"button",class:"shrink-0 px-2 py-1 rounded bg-white/10 text-white/80 hover:bg-white/20 hover:text-white text-xs transition-colors",onClick:C},Se(i.value?"Copied!":"Copy"),1)])]),_("div",Vy,[I[12]||(I[12]=_("div",{class:"text-white/50 text-xs uppercase tracking-wider mb-2"},"Connection Details",-1)),_("div",Wy,[_("div",Hy,[I[9]||(I[9]=_("span",{class:"text-white/50"},"Host",-1)),_("span",jy,Se(p.value),1)]),I[10]||(I[10]=_("div",{class:"flex justify-between gap-4"},[_("span",{class:"text-white/50"},"User"),_("span",{class:"font-mono"},"archipelago")],-1)),I[11]||(I[11]=_("div",{class:"flex justify-between gap-4"},[_("span",{class:"text-white/50"},"Password"),_("span",{class:"font-mono"},"archipelago")],-1))])]),I[13]||(I[13]=_("p",{class:"text-white/50 text-xs"}," From the terminal menu you can install to disk, configure Bitcoin, Lightning, view logs, and more. ",-1)),I[14]||(I[14]=_("p",{class:"text-white/40 text-xs"},[kn(" Tip: Press "),_("kbd",{class:"px-1.5 py-0.5 rounded bg-white/10 font-mono text-[10px]"},"F"),kn(" to open this anytime. ")],-1))])]))])],36)])):be("",!0)]),_:1})]))}}),Gy=Dt(Ky,[["__scopeId","data-v-bbd51259"]]),qy={class:"space-y-3 mb-6"},Yy={class:"bg-black/20 rounded-xl border border-white/10 p-3"},zy={class:"text-white text-sm font-medium"},Xy={class:"bg-black/20 rounded-xl border border-white/10 p-3"},Jy={class:"text-white text-sm font-medium"},Qy={key:0,class:"bg-black/20 rounded-xl border border-white/10 p-3"},Zy={class:"text-white/80 text-sm font-mono break-all"},e0={key:1,class:"bg-black/20 rounded-xl border border-white/10 p-3"},t0={class:"text-white text-sm font-medium"},n0={class:"text-white/50"},s0={class:"flex items-center gap-2 mb-4 cursor-pointer"},r0=Ze({__name:"NostrSignConsent",props:{show:{type:Boolean},appName:{},method:{},eventKind:{},content:{}},emits:["approve","deny"],setup(e,{emit:t}){const n={0:"Metadata",1:"Short Text Note",2:"Recommend Relay",3:"Contacts",4:"Encrypted DM",5:"Event Deletion",6:"Repost",7:"Reaction",9734:"Zap Request",9735:"Zap Receipt",10002:"Relay List",30023:"Long-form Content"},s=e,r=t,o=G(null),i=G(!1);ur(o,pe(()=>s.show),()=>r("deny"));const a=pe(()=>s.content?s.content.length>200?s.content.slice(0,200)+"...":s.content:""),l=pe(()=>s.eventKind===void 0?"":n[s.eventKind]??"Unknown");function c(){r("approve",i.value)}function u(){r("deny")}return(f,d)=>(z(),dt(Nt,{to:"body"},[de(tt,{name:"modal"},{default:Ye(()=>[e.show?(z(),Z("div",{key:0,class:"fixed inset-0 z-[3000] flex items-center justify-center p-4",onClick:u},[d[9]||(d[9]=_("div",{class:"absolute inset-0 bg-black/60 backdrop-blur-sm"},null,-1)),_("div",{ref_key:"modalRef",ref:o,onClick:d[1]||(d[1]=Tn(()=>{},["stop"])),class:"glass-card p-6 max-w-md w-full relative z-10"},[_("div",{class:"flex items-start justify-between gap-4 mb-4"},[d[3]||(d[3]=_("h3",{class:"text-xl font-semibold text-white"},"Nostr Signing Request",-1)),_("button",{onClick:u,class:"p-2 rounded-lg hover:bg-white/10 text-white/70 hover:text-white transition-colors","aria-label":"Close"},[...d[2]||(d[2]=[_("svg",{class:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[_("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M6 18L18 6M6 6l12 12"})],-1)])])]),_("div",qy,[_("div",Yy,[d[4]||(d[4]=_("p",{class:"text-white/50 text-xs uppercase tracking-wider mb-1"},"App",-1)),_("p",zy,Se(e.appName),1)]),_("div",Xy,[d[5]||(d[5]=_("p",{class:"text-white/50 text-xs uppercase tracking-wider mb-1"},"Method",-1)),_("p",Jy,Se(e.method),1)]),a.value?(z(),Z("div",Qy,[d[6]||(d[6]=_("p",{class:"text-white/50 text-xs uppercase tracking-wider mb-1"},"Content",-1)),_("p",Zy,Se(a.value),1)])):be("",!0),e.eventKind!==void 0?(z(),Z("div",e0,[d[7]||(d[7]=_("p",{class:"text-white/50 text-xs uppercase tracking-wider mb-1"},"Event Kind",-1)),_("p",t0,[kn(Se(e.eventKind)+" ",1),_("span",n0,"("+Se(l.value)+")",1)])])):be("",!0)]),_("label",s0,[Yi(_("input",{"onUpdate:modelValue":d[0]||(d[0]=p=>i.value=p),type:"checkbox",class:"w-4 h-4 rounded border-white/30 bg-white/10 text-orange-400 focus:ring-orange-400/50"},null,512),[[Gh,i.value]]),d[8]||(d[8]=_("span",{class:"text-white/70 text-sm"},"Remember for this app",-1))]),_("div",{class:"flex gap-3"},[_("button",{onClick:u,class:"glass-button flex-1 py-2.5 rounded-lg text-sm font-medium"}," Deny "),_("button",{onClick:c,class:"glass-button flex-1 py-2.5 rounded-lg text-sm font-medium text-orange-400 border-orange-400/30"}," Approve ")])],512)])):be("",!0)]),_:1})]))}}),o0=Dt(r0,[["__scopeId","data-v-a101a920"]]),i0=["aria-label"],a0={class:"relative mb-6 flex flex-col items-center"},l0={class:"nostr-hero"},c0={class:"nostr-viz-ring"},u0={class:"glass-card p-4 space-y-2 max-h-[50vh] overflow-y-auto",role:"radiogroup","aria-label":"Available identities"},f0={key:0,class:"flex items-center justify-center py-8"},d0={key:1,class:"text-center py-8"},p0=["aria-checked","aria-label","onClick"],h0={class:"flex items-center gap-3"},m0={class:"text-sm font-bold"},g0={class:"flex-1 min-w-0"},v0={class:"flex items-center gap-2"},y0={class:"text-white font-semibold text-sm truncate"},_0={key:0,class:"text-[10px] px-1.5 py-0.5 rounded bg-white/10 text-white/60"},b0={class:"mt-0.5"},w0={key:0,class:"text-white/35 text-xs font-mono truncate"},E0={key:1,class:"text-red-400/60 text-xs"},A0={class:"shrink-0"},S0={key:0,class:"w-5 h-5 rounded-full bg-white/15 flex items-center justify-center"},C0={key:1,class:"w-5 h-5 rounded-full bg-white/5"},k0={class:"flex gap-3 mt-4"},x0=["disabled"],T0=Ze({__name:"NostrIdentityPicker",props:{show:{type:Boolean},appName:{}},emits:["select","cancel"],setup(e,{emit:t}){const n=e,s=t,r=G(null),o=G([]),i=G(null),a=G(!1);ur(r,pe(()=>n.show),()=>s("cancel"));const l=pe(()=>o.value.find(b=>b.id===i.value)?.nostr_pubkey!=null);qe(()=>n.show,async p=>{p&&await c()}),ht(()=>{n.show&&c()});async function c(){a.value=!0;try{const p=await Ne.call({method:"identity.list"});o.value=p.identities||[];const b=o.value.find(h=>h.is_default&&h.nostr_pubkey)||o.value.find(h=>h.nostr_pubkey);b&&(i.value=b.id)}catch{o.value=[]}finally{a.value=!1}}function u(){const p=o.value.find(b=>b.id===i.value);p&&s("select",p)}function f(p){return p.length<=20?p:p.slice(0,12)+"..."+p.slice(-6)}function d(p){switch(p){case"business":return"bg-blue-500/15 text-blue-400";case"anonymous":return"bg-purple-500/15 text-purple-400";default:return"bg-white/10 text-white/80"}}return(p,b)=>(z(),dt(Nt,{to:"body"},[de(tt,{name:"identity-picker"},{default:Ye(()=>[e.show?(z(),Z("div",{key:0,class:"fixed inset-0 z-[3100] flex items-center justify-center p-4",onClick:b[2]||(b[2]=h=>p.$emit("cancel"))},[b[10]||(b[10]=_("div",{class:"absolute inset-0 bg-black/40 backdrop-blur-2xl"},null,-1)),_("div",{ref_key:"modalRef",ref:r,onClick:b[1]||(b[1]=Tn(()=>{},["stop"])),role:"dialog","aria-modal":"true","aria-label":`Select identity for ${e.appName}`,class:"relative z-10 w-full max-w-lg"},[_("div",a0,[_("div",l0,[_("div",c0,[(z(),Z(Be,null,Gt(48,(h,E)=>_("div",{key:E,class:"nostr-viz-segment",style:Tt({"--seg-i":E,"--seg-deg":`${E/48*360}deg`})},null,4)),64))]),b[3]||(b[3]=_("div",{class:"nostr-glass-border"},[_("div",{class:"nostr-glass-inner"},[_("svg",{viewBox:"0 0 122.88 88.39",width:"42",height:"30",xmlns:"http://www.w3.org/2000/svg",class:"nostr-cinema-svg"},[_("path",{fill:"#FAFAFA","fill-rule":"evenodd","clip-rule":"evenodd",d:"M87.51,21.16c5.26,1.45,10.79,1.84,16.58,1.18c1.42-0.16,2.81-0.35,4.16-0.53c6.46-0.84,11.86-1.32,13.78,3.52 c3.39,8.55-4.28,27.07-8.32,34.56c-8.32,15.43-24.9,32.69-44.08,27.57c-2.99-0.8-5.68-2.1-8.08-3.86 c6.3-3.51,11.28-8.9,15.13-15.24l-0.01,0.02c4.77,0.26,9.73,2.78,14.27,5.44c0.33-5.99-5.46-9.97-10.62-12.45 c4.14-9.29,6.33-19.72,7.01-29.03C87.53,29.46,87.64,25.53,87.51,21.16L87.51,21.16z M2.61,6.51c1.56-1.48,3.92-1.87,6.6-1.7 c5.03,0.31,10.23,1.86,15.11,3.18c10.61,2.86,20.99,1.93,31.1-2.74c1.36-0.63,2.69-1.28,3.98-1.9C65.56,0.37,70.8-1.9,74.31,2.3 c6.21,7.42,4.68,28.44,3.13,37.25c-3.2,18.15-14.03,40.87-34.88,42.1c-11.06,0.65-20.49-5.57-28.61-17.32 c-5.17-8-8.9-16.22-11.18-24.67C1.13,33.5-2.46,11.34,2.61,6.51L2.61,6.51z M12.94,34.3c-1.91-0.5-3.01-1.12-3.38-1.85 c-1.47-2.92,10.66-10.29,19.22-3.52C40.95,38.4,17.26,35.58,12.94,34.3L12.94,34.3z M32.63,62.79c-3.23-2.31-4.96-5.16-5.9-9.02 c10.67,5.4,20.66,5.01,29.96-2.42c-0.37,3.29-1.44,6.24-3.28,8.83C47.98,67.83,40.04,68.08,32.63,62.79L32.63,62.79z M67.07,30.06 c1.79-0.84,2.76-1.65,2.99-2.44c0.92-3.14-12.35-8.19-19.54,0.03C40.27,39.18,63.06,32.1,67.07,30.06L67.07,30.06z M90.82,42.07 c5.04-4.04,11.94-3.22,16.74,0.73c1.22,1.01,4.57,3.95,2.64,5.56c-0.53,0.44-1.41,0.69-2.63,0.75c-2.98,0.34-7.32-0.28-10.78-1.71 C94.07,46.3,92.01,44.83,90.82,42.07L90.82,42.07z"})])])],-1))]),b[4]||(b[4]=_("h2",{class:"mt-5 text-lg font-semibold text-white"},"Select Identity",-1)),b[5]||(b[5]=_("p",{class:"mt-1 text-white/25 tracking-widest uppercase",style:{"font-size":"10px"}},"Nostr authentication protocol",-1))]),_("div",u0,[a.value?(z(),Z("div",f0,[...b[6]||(b[6]=[_("svg",{class:"animate-spin h-6 w-6 text-white/40",viewBox:"0 0 24 24",fill:"none"},[_("circle",{class:"opacity-25",cx:"12",cy:"12",r:"10",stroke:"currentColor","stroke-width":"4"}),_("path",{class:"opacity-75",fill:"currentColor",d:"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"})],-1),_("span",{class:"ml-3 text-white/60 text-sm"},"Loading identities...",-1)])])):o.value.length===0?(z(),Z("div",d0,[...b[7]||(b[7]=[_("p",{class:"text-white/50 text-sm"},"No identities found.",-1),_("p",{class:"text-white/30 text-xs mt-1"},"Create one in Settings → Credentials",-1)])])):be("",!0),(z(!0),Z(Be,null,Gt(o.value,h=>(z(),Z("button",{key:h.id,type:"button",role:"radio","aria-checked":i.value===h.id,"aria-label":`Identity: ${h.name}`,class:$e(["w-full text-left p-3 rounded-lg transition-all duration-200",i.value===h.id?"bg-white/10 ring-1 ring-white/20":"bg-white/[0.03] hover:bg-white/[0.06]"]),onClick:E=>i.value=h.id},[_("div",h0,[_("div",{class:$e(["w-9 h-9 rounded-lg flex items-center justify-center shrink-0",d(h.purpose)])},[_("span",m0,Se(h.name.charAt(0).toUpperCase()),1)],2),_("div",g0,[_("div",v0,[_("span",y0,Se(h.name),1),h.is_default?(z(),Z("span",_0,"default")):be("",!0)]),_("div",b0,[h.nostr_npub?(z(),Z("span",w0,Se(f(h.nostr_npub)),1)):(z(),Z("span",E0,"No Nostr key"))])]),_("div",A0,[i.value===h.id?(z(),Z("div",S0,[...b[8]||(b[8]=[_("div",{class:"w-2.5 h-2.5 rounded-full bg-white/70"},null,-1)])])):(z(),Z("div",C0))])])],10,p0))),128))]),_("div",k0,[_("button",{onClick:b[0]||(b[0]=h=>p.$emit("cancel")),class:"glass-button flex-1 py-3 rounded-lg text-sm font-medium text-white/70"}," Cancel "),_("button",{onClick:u,disabled:!i.value||!l.value,class:$e(["flex-1 py-3 rounded-lg text-sm font-semibold transition-all duration-200 disabled:opacity-30 disabled:cursor-not-allowed",i.value&&l.value?"bg-white/10 text-white hover:bg-white/15":"bg-white/[0.03] text-white/40"])}," Authenticate ",10,x0)]),b[9]||(b[9]=_("p",{class:"mt-3 text-center text-[10px] text-white/20 tracking-widest"}," NIP-07 · SECP256K1 · Signed locally ",-1))],8,i0)])):be("",!0)]),_:1})]))}}),I0=Dt(T0,[["__scopeId","data-v-c00f5290"]]),R0={class:"sticky top-0 z-10 flex items-center gap-3 border-b border-white/10 px-4 py-3 bg-black/60 backdrop-blur-md md:bg-transparent md:backdrop-blur-none"},P0={class:"flex-1 truncate text-sm font-medium text-white/90"},L0=["disabled"],N0={class:"relative flex-1 min-h-0 bg-black/40 overflow-hidden"},O0={key:0,class:"absolute inset-0 z-10 flex items-center justify-center bg-black/40"},D0=["src"],M0={key:0,class:"absolute inset-0 z-10 flex flex-col items-center justify-center"},F0={key:0,class:"absolute inset-0 z-20 flex items-center justify-center bg-black/70 backdrop-blur-sm"},$0={class:"bg-black/80 border border-white/15 rounded-2xl p-6 w-full max-w-sm mx-4 shadow-2xl"},B0={class:"flex items-center gap-3 mb-4"},U0={class:"text-white/50 text-xs"},V0={class:"space-y-2 mb-4"},W0={class:"flex justify-between items-center p-3 bg-white/5 rounded-lg"},H0={class:"text-orange-400 font-bold text-lg"},j0={key:0,class:"flex justify-between items-center p-3 bg-white/5 rounded-lg"},K0={class:"text-white/80 text-sm truncate ml-2"},G0={class:"flex justify-between items-center p-3 bg-white/5 rounded-lg"},q0={class:"text-white/80 text-sm capitalize"},Y0={key:0,class:"mb-3 p-2 bg-red-500/15 border border-red-500/20 rounded-lg"},z0={class:"text-red-400 text-xs"},X0={class:"flex gap-3"},J0=["disabled"],Hl="archipelago_app_identity_",Q0=Ze({__name:"AppLauncherOverlay",setup(e){const t=qr(),n=G(null),s=G(null),r=G(0),o=G(!1),i=G(!0),a=G(!1),l=G(!1);function c(j){try{const K=Hl+j.replace(/[^a-z0-9]/gi,"_"),ie=localStorage.getItem(K);return ie?JSON.parse(ie):null}catch{return null}}function u(j,K){try{const ie=Hl+j.replace(/[^a-z0-9]/gi,"_");localStorage.setItem(ie,JSON.stringify(K))}catch{}}function f(j){l.value=!1,t.url&&u(t.url,j),d(j)}async function d(j){try{const K=`archipelago-identity:${Date.now()}`,ie=await Ne.call({method:"identity.sign",params:{id:j.id,message:K}}),Ae=s.value;if(!Ae?.contentWindow)return;Ae.contentWindow.postMessage({type:"archipelago:identity",did:j.did,name:j.name,pubkey:j.pubkey,nostr_pubkey:j.nostr_pubkey||null,nostr_npub:j.nostr_npub||null,challenge:K,signature:ie.signature},"*")}catch{}}let p=null,b=null;function h(){p&&(clearTimeout(p),p=null),b&&(clearTimeout(b),b=null)}const E=G(null),v=G(!1),w=G(""),C=G("");function S(){o.value=!0,i.value=!0,a.value=!1,h(),r.value++,p=setTimeout(()=>{i.value&&(i.value=!1,a.value=!0)},15e3)}function O(){t.url&&window.open(t.url,"_blank","noopener,noreferrer")}function D(){O(),t.close()}function k(){B(),o.value=!1,i.value=!1,Y(),p&&(clearTimeout(p),p=null),b=setTimeout(P,2e3)}function I(){h(),i.value=!1,a.value=!0}function P(){try{const j=s.value;if(!j)return;const K=j.contentDocument;if(!K)return;const ie=K.body;(!ie||ie.children.length===0&&ie.innerText.trim()==="")&&(a.value=!0)}catch{}}function q(j){return j.includes("indeehub")||j.includes("indeedhub")}async function Y(){if(!t.url||!q(t.url))return;const j=c(t.url);if(j){await d(j);return}l.value=!0}function B(){try{const j=s.value?.contentDocument;if(!j)return;const K=j.createElement("style");K.textContent=` + * { -ms-overflow-style: none; scrollbar-width: none; } + *::-webkit-scrollbar { display: none; } + `,j.head.appendChild(K),j.addEventListener("keydown",ie=>{ie.key==="Escape"&&(ie.preventDefault(),window.parent.postMessage({type:"app-launcher-escape"},"*"))})}catch{}}const ae=["glass-card","w-full h-full","md:max-w-[calc(100vw-5rem)] md:max-h-[calc(100vh-5rem)]"];function re(j){j.key==="Escape"&&t.isOpen&&(t.close(),j.preventDefault(),j.stopPropagation())}function ve(j){j.data?.type==="app-launcher-escape"&&t.isOpen&&t.close(),j.data?.type==="archipelago:identity:request"&&t.isOpen&&Y(),j.data?.type==="archipelago:payment-request"&&t.isOpen&&ce(j)}function ce(j){const K=j.data;if(!K.amount_sats||typeof K.amount_sats!="number"||K.amount_sats<=0){N(j.origin,K.request_id,!1,"Invalid amount");return}E.value={request_id:K.request_id||`pay-${Date.now()}`,amount_sats:K.amount_sats,memo:K.memo,method:K.method||"auto",invoice:K.invoice,address:K.address},C.value=j.origin,w.value="",v.value=!1}function N(j,K,ie,Ae,we){const oe=s.value;oe?.contentWindow&&oe.contentWindow.postMessage({type:"archipelago:payment-response",request_id:K,success:ie,error:Ae||null,receipt:we||null},j||"*")}async function W(){if(!E.value||v.value)return;v.value=!0,w.value="";const j=E.value,K=ge(j);try{let ie={};if(K==="ecash"){const Ae=await Ne.call({method:"wallet.ecash-send",params:{amount_sats:j.amount_sats}});ie={method:"ecash",token:Ae.token,amount_sats:Ae.amount_sats}}else if(K==="lightning")if(j.invoice){const Ae=await Ne.call({method:"lnd.payinvoice",params:{payment_request:j.invoice}});ie={method:"lightning",payment_hash:Ae.payment_hash,amount_sats:Ae.amount_sats}}else ie={method:"lightning",payment_request:(await Ne.call({method:"lnd.createinvoice",params:{amount_sats:j.amount_sats,memo:j.memo||""}})).payment_request,amount_sats:j.amount_sats};else{if(!j.address){w.value="No Bitcoin address provided for on-chain payment";return}ie={method:"onchain",txid:(await Ne.call({method:"lnd.sendcoins",params:{addr:j.address,amount:j.amount_sats}})).txid,amount_sats:j.amount_sats}}N(C.value,j.request_id,!0,void 0,ie),E.value=null}catch(ie){const Ae=ie instanceof Error?ie.message:"Payment failed";w.value=Ae}finally{v.value=!1}}function X(){E.value&&(N(C.value,E.value.request_id,!1,"Payment denied by user"),E.value=null)}function ge(j){return j.method&&j.method!=="auto"?j.method:j.invoice?"lightning":j.address?"onchain":j.amount_sats<1e3?"ecash":j.amount_sats>5e5?"onchain":"lightning"}return qe(()=>t.isOpen,j=>{j?(i.value=!0,a.value=!1,h(),p=setTimeout(()=>{i.value&&(i.value=!1,a.value=!0)},15e3),n.value?.focus()):(o.value=!1,i.value=!0,a.value=!1,h(),E.value&&X())}),ht(()=>{window.addEventListener("keydown",re,!0),window.addEventListener("message",ve)}),Ot(()=>{h(),window.removeEventListener("keydown",re,!0),window.removeEventListener("message",ve)}),(j,K)=>(z(),Z(Be,null,[(z(),dt(Nt,{to:"body"},[de(tt,{name:"app-launcher"},{default:Ye(()=>[he(t).isOpen?(z(),Z("div",{key:0,class:"fixed inset-0 z-[2400] flex items-center justify-center p-0 md:p-10",onClick:K[1]||(K[1]=Tn(ie=>he(t).close(),["self"]))},[K[18]||(K[18]=_("div",{class:"app-launcher-backdrop absolute inset-0 bg-black/60 backdrop-blur-md"},null,-1)),_("div",{class:$e(["app-launcher-panel relative z-10 flex flex-col overflow-hidden rounded-none md:rounded-2xl shadow-2xl",ae])},[_("div",R0,[K[6]||(K[6]=_("div",{class:"hidden md:flex items-center justify-center w-8 h-8 shrink-0 rounded cursor-grab hover:bg-white/10 transition-colors"},[_("svg",{class:"w-4 h-4 text-white/50",fill:"currentColor",viewBox:"0 0 24 24"},[_("path",{d:"M8 6h2v2H8V6zm0 5h2v2H8v-2zm0 5h2v2H8v-2zm5-10h2v2h-2V6zm0 5h2v2h-2v-2zm0 5h2v2h-2v-2z"})])],-1)),_("span",P0,Se(he(t).title||"App"),1),_("button",{type:"button",class:"flex items-center justify-center w-9 h-9 rounded-lg hover:bg-white/15 text-white/70 hover:text-white transition-colors disabled:opacity-70","aria-label":"Refresh",disabled:o.value,onClick:S},[(z(),Z("svg",{class:$e(["w-5 h-5 transition-transform duration-300",{"animate-spin":o.value}]),fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[...K[3]||(K[3]=[_("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15"},null,-1)])],2))],8,L0),_("button",{type:"button",class:"flex items-center justify-center w-9 h-9 rounded-lg hover:bg-white/15 text-white/70 hover:text-white transition-colors","aria-label":"Open in new tab",title:"Open in new tab",onClick:O},[...K[4]||(K[4]=[_("svg",{class:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[_("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14"})],-1)])]),_("button",{ref_key:"closeBtnRef",ref:n,type:"button",class:"flex items-center justify-center w-9 h-9 rounded-lg hover:bg-white/15 text-white/70 hover:text-white transition-colors","aria-label":"Close",onClick:K[0]||(K[0]=ie=>he(t).close())},[...K[5]||(K[5]=[_("svg",{class:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[_("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M6 18L18 6M6 6l12 12"})],-1)])],512),K[7]||(K[7]=_("kbd",{class:"hidden sm:inline-flex px-2 py-1 text-xs text-white/50 bg-white/10 rounded"},"Esc",-1))]),_("div",N0,[de(tt,{name:"content-fade"},{default:Ye(()=>[i.value?(z(),Z("div",O0,[...K[8]||(K[8]=[_("svg",{class:"animate-spin h-8 w-8 text-blue-400",xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24"},[_("circle",{class:"opacity-25",cx:"12",cy:"12",r:"10",stroke:"currentColor","stroke-width":"4"}),_("path",{class:"opacity-75",fill:"currentColor",d:"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"})],-1)])])):be("",!0)]),_:1}),he(t).url&&!a.value?(z(),Z("iframe",{ref_key:"iframeRef",ref:s,key:r.value,src:he(t).url,class:"absolute inset-0 w-full h-full border-0 iframe-scrollbar-hide",title:"App content",onLoad:k,onError:I},null,40,D0)):be("",!0),de(tt,{name:"content-fade"},{default:Ye(()=>[a.value&&!i.value?(z(),Z("div",M0,[_("div",{class:"text-center px-8"},[K[10]||(K[10]=_("div",{class:"w-16 h-16 mx-auto mb-4 rounded-2xl bg-white/5 border border-white/10 flex items-center justify-center"},[_("svg",{class:"w-8 h-8 text-white/40",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[_("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"1.5",d:"M3 8V6a2 2 0 012-2h14a2 2 0 012 2v12a2 2 0 01-2 2H5a2 2 0 01-2-2v-2m0-8h18M3 8v8m18-8v8"})])],-1)),K[11]||(K[11]=_("h3",{class:"text-lg font-semibold text-white mb-2"},"Can't display in frame",-1)),K[12]||(K[12]=_("p",{class:"text-white/50 text-sm mb-6"},[kn("This app doesn't support embedded viewing."),_("br"),kn("Please open it in a new tab instead.")],-1)),_("button",{onClick:D,class:"glass-button px-6 py-3 rounded-lg text-sm font-semibold inline-flex items-center gap-2"},[...K[9]||(K[9]=[_("svg",{class:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[_("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14"})],-1),kn(" Open in new tab ",-1)])])])])):be("",!0)]),_:1}),de(tt,{name:"content-fade"},{default:Ye(()=>[E.value?(z(),Z("div",F0,[_("div",$0,[_("div",B0,[K[14]||(K[14]=_("div",{class:"w-10 h-10 rounded-lg bg-orange-500/20 flex items-center justify-center"},[_("svg",{class:"w-5 h-5 text-orange-400",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[_("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M13 10V3L4 14h7v7l9-11h-7z"})])],-1)),_("div",null,[K[13]||(K[13]=_("h3",{class:"text-white font-semibold text-sm"},"Payment Request",-1)),_("p",U0,Se(he(t).title||"App")+" wants to make a payment",1)])]),_("div",V0,[_("div",W0,[K[15]||(K[15]=_("span",{class:"text-white/60 text-sm"},"Amount",-1)),_("span",H0,Se(E.value.amount_sats.toLocaleString())+" sats",1)]),E.value.memo?(z(),Z("div",j0,[K[16]||(K[16]=_("span",{class:"text-white/60 text-sm"},"Memo",-1)),_("span",K0,Se(E.value.memo),1)])):be("",!0),_("div",G0,[K[17]||(K[17]=_("span",{class:"text-white/60 text-sm"},"Method",-1)),_("span",q0,Se(E.value.method||"auto"),1)])]),w.value?(z(),Z("div",Y0,[_("p",z0,Se(w.value),1)])):be("",!0),_("div",X0,[_("button",{onClick:X,class:"flex-1 px-4 py-2.5 bg-white/5 border border-white/10 rounded-lg text-sm text-white/70 hover:bg-white/10 transition-colors"}," Deny "),_("button",{onClick:W,disabled:v.value,class:"flex-1 px-4 py-2.5 bg-orange-500/20 border border-orange-500/30 rounded-lg text-sm font-medium text-orange-300 hover:bg-orange-500/30 transition-colors disabled:opacity-50"},Se(v.value?"Paying...":"Approve"),9,J0)])])])):be("",!0)]),_:1})])])])):be("",!0)]),_:1})])),de(o0,{show:he(t).showConsent,"app-name":he(t).consentRequest?.appName??"",method:he(t).consentRequest?.method??"","event-kind":he(t).consentRequest?.eventKind,content:he(t).consentRequest?.content,onApprove:he(t).approveConsent,onDeny:he(t).denyConsent},null,8,["show","app-name","method","event-kind","content","onApprove","onDeny"]),de(I0,{show:l.value,"app-name":he(t).title||"App",onSelect:f,onCancel:K[2]||(K[2]=ie=>l.value=!1)},null,8,["show","app-name"])],64))}}),Z0=Dt(Q0,[["__scopeId","data-v-f9ce16c6"]]),Cn=G([]);let e_=0;function Uo(e,t="info",n=3e3){const s=e_++;Cn.value.push({id:s,message:e,variant:t,dismissing:!1}),n>0&&setTimeout(()=>Nf(s),n),Cn.value.length>5&&Cn.value.shift()}function Nf(e){const t=Cn.value.findIndex(n=>n.id===e);t!==-1&&(Cn.value[t].dismissing=!0,setTimeout(()=>{Cn.value=Cn.value.filter(n=>n.id!==e)},300))}function t_(){return{toasts:Pr(Cn),success:e=>Uo(e,"success"),error:e=>Uo(e,"error"),info:e=>Uo(e,"info"),dismiss:Nf}}const n_={class:"fixed top-4 right-4 z-[9999] flex flex-col gap-2 pointer-events-none max-w-sm w-full"},s_=["onClick"],r_={class:"w-5 h-5 shrink-0 flex items-center justify-center"},o_={key:0,class:"w-5 h-5 text-green-400",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},i_={key:1,class:"w-5 h-5 text-red-400",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},a_={key:2,class:"w-5 h-5 text-blue-400",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},l_={class:"text-sm text-white/90 flex-1"},c_=Ze({__name:"ToastStack",setup(e){const{toasts:t,dismiss:n}=t_();function s(r){switch(r){case"success":return"bg-black/70 border-green-500/30 backdrop-blur-md";case"error":return"bg-black/70 border-red-500/30 backdrop-blur-md";default:return"bg-black/70 border-blue-500/30 backdrop-blur-md"}}return(r,o)=>(z(),dt(Nt,{to:"body"},[_("div",n_,[de(Uh,{name:"toast-stack"},{default:Ye(()=>[(z(!0),Z(Be,null,Gt(he(t),i=>(z(),Z("div",{key:i.id,class:$e(["toast-stack-item pointer-events-auto flex items-center gap-3 px-4 py-3 rounded-xl border cursor-pointer",s(i.variant)]),onClick:a=>he(n)(i.id)},[_("div",r_,[i.variant==="success"?(z(),Z("svg",o_,[...o[0]||(o[0]=[_("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M5 13l4 4L19 7"},null,-1)])])):i.variant==="error"?(z(),Z("svg",i_,[...o[1]||(o[1]=[_("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M6 18L18 6M6 6l12 12"},null,-1)])])):(z(),Z("svg",a_,[...o[2]||(o[2]=[_("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"},null,-1)])]))]),_("span",l_,Se(i.message),1)],10,s_))),128))]),_:1})])]))}}),u_=Dt(c_,[["__scopeId","data-v-57c85976"]]),f_=180*1e3,Of=Qn("screensaver",()=>{const e=G(!1);let t=null;function n(){e.value=!0,o()}function s(){e.value=!1,r()}function r(){o(),t=setTimeout(()=>{t=null,e.value=!0},f_)}function o(){t&&(clearTimeout(t),t=null)}return{isActive:e,activate:n,deactivate:s,resetInactivityTimer:r,clearInactivityTimer:o}}),d_={class:"screensaver-content"},p_={class:"screensaver-viz-ring"},h_={class:"screensaver-logo-wrapper"},jl=48,m_=Ze({__name:"Screensaver",setup(e){const t=Of();function n(r){const o=r/jl*360;return{"--segment-index":r,"--segment-deg":`${o}deg`}}function s(r){t.isActive&&(t.deactivate(),r.preventDefault())}return ht(()=>{window.addEventListener("keydown",s)}),Ot(()=>{window.removeEventListener("keydown",s)}),(r,o)=>(z(),dt(Nt,{to:"body"},[de(tt,{name:"screensaver"},{default:Ye(()=>[he(t).isActive?(z(),Z("div",{key:0,class:"screensaver-container fixed inset-0 z-[3000] bg-black cursor-pointer",onClick:o[0]||(o[0]=i=>he(t).deactivate()),onKeydown:o[1]||(o[1]=Qu(i=>he(t).deactivate(),["escape"]))},[_("div",d_,[_("div",p_,[(z(),Z(Be,null,Gt(jl,(i,a)=>_("div",{key:a,class:"screensaver-viz-segment",style:Tt(n(a))},null,4)),64))]),_("div",h_,[de(vf)])])],32)):be("",!0)]),_:1})]))}}),g_=Dt(m_,[["__scopeId","data-v-c0a3e6df"]]),v_={class:"flex items-start justify-between gap-4 mb-4"},y_={class:"text-xl font-semibold text-white"},__={class:"text-white/80 prose prose-invert max-w-none"},b_={class:"whitespace-pre-wrap"},w_={key:0,class:"mt-4"},E_=Ze({__name:"HelpGuideModal",props:{show:{type:Boolean},title:{},content:{},relatedPath:{}},emits:["close"],setup(e,{emit:t}){const n=e,s=t,r=G(null);return ur(r,pe(()=>n.show),()=>s("close")),(o,i)=>{const a=yu("router-link");return z(),dt(Nt,{to:"body"},[de(tt,{name:"modal"},{default:Ye(()=>[e.show?(z(),Z("div",{key:0,class:"fixed inset-0 z-[3000] flex items-center justify-center p-4",onClick:i[3]||(i[3]=l=>o.$emit("close"))},[i[6]||(i[6]=_("div",{class:"absolute inset-0 bg-black/60 backdrop-blur-sm"},null,-1)),_("div",{ref_key:"modalRef",ref:r,onClick:i[2]||(i[2]=Tn(()=>{},["stop"])),class:"glass-card p-6 max-w-lg w-full relative z-10 max-h-[80vh] overflow-y-auto"},[_("div",v_,[_("h3",y_,Se(e.title),1),_("button",{onClick:i[0]||(i[0]=l=>o.$emit("close")),class:"p-2 rounded-lg hover:bg-white/10 text-white/70 hover:text-white transition-colors","aria-label":"Close"},[...i[4]||(i[4]=[_("svg",{class:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[_("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M6 18L18 6M6 6l12 12"})],-1)])])]),_("div",__,[_("p",b_,Se(e.content),1)]),e.relatedPath?(z(),Z("div",w_,[de(a,{to:e.relatedPath,class:"inline-flex items-center gap-2 px-4 py-2 glass-button rounded-lg text-sm font-medium",onClick:i[1]||(i[1]=l=>o.$emit("close"))},{default:Ye(()=>[...i[5]||(i[5]=[kn(" Go to related page ",-1),_("svg",{class:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[_("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M9 5l7 7-7 7"})],-1)])]),_:1},8,["to"])])):be("",!0)],512)])):be("",!0)]),_:1})])}}}),A_=Qn("controller",()=>{const e=G(!1),t=G(0);function n(r){e.value=r}function s(r){t.value=r,e.value=r>0}return{isActive:e,gamepadCount:t,setActive:n,setGamepadCount:s}}),S_=["a[href]","button:not([disabled])","input:not([disabled])","select:not([disabled])","textarea:not([disabled])",'[tabindex]:not([tabindex="-1"])',"[data-controller-focus]","[data-controller-container]"].join(", ");function Yr(e=document){return Array.from(e.querySelectorAll(S_)).filter(t=>!t.hasAttribute("disabled")&&t.offsetParent!==null&&!t.hasAttribute("data-controller-ignore")&&!t.closest("[data-controller-ignore]"))}function Vo(e){const t=document.querySelector(`[data-controller-zone="${e}"]`);return t?Yr(t):[]}function xs(e,t){return e?!!e.closest(`[data-controller-zone="${t}"]`):!1}function Kl(e){return Yr(e).filter(t=>t!==e&&!t.hasAttribute("data-controller-container"))}function Gl(e){if(!e)return!1;const t=e.closest("[data-controller-container]");return!!t&&t!==e}function ql(e,t,n){const s=e.getBoundingClientRect(),r=s.left+s.width/2,o=s.top+s.height/2,i=50,a=t.filter(c=>{if(c===e)return!1;const u=c.getBoundingClientRect();switch(n){case"left":return u.right<=s.left+i;case"right":return u.left>=s.right-i;case"up":return u.bottom<=s.top+i;case"down":return u.top>=s.bottom-i;default:return!1}});if(a.length===0)return null;const l=a.map(c=>{const u=c.getBoundingClientRect(),f=u.left+u.width/2,d=u.top+u.height/2;let p,b;switch(n){case"left":case"right":p=Math.max(0,Math.min(s.bottom,u.bottom)-Math.max(s.top,u.top)),b=Math.abs(f-r);break;case"up":case"down":p=Math.max(0,Math.min(s.right,u.right)-Math.max(s.left,u.left)),b=Math.abs(d-o);break;default:p=0,b=1/0}return{el:c,overlap:p,dist:b}});return l.sort((c,u)=>u.overlap!==c.overlap?u.overlap-c.overlap:c.dist-u.dist),l[0]?.el??null}function C_(e){const t=gf(),n=ho(),s=A_(),r=G(!1),o=G(0);qe([r,o],()=>{s.setActive(r.value),s.setGamepadCount(o.value)},{immediate:!0});let i=null,a=null;function l(){const h=navigator.getGamepads?.(),E=h?Array.from(h).filter(v=>v?.connected).length:0;E!==o.value&&(o.value=E,r.value=E>0)}function c(h){if(!["ArrowUp","ArrowDown","ArrowLeft","ArrowRight","Enter","Escape"].includes(h.key))return;const v=h.target;if((v.tagName==="INPUT"||v.tagName==="TEXTAREA")&&h.key!=="Escape")return;const C=Yr(document),S=C.indexOf(document.activeElement),O=document.activeElement;if(h.key==="Escape"){if(qr().isOpen){qr().close(),h.preventDefault(),h.stopPropagation();return}if(jr().isOpen){jr().close(),h.preventDefault(),h.stopPropagation();return}if(Js().isOpen){Js().close(),h.preventDefault(),h.stopPropagation();return}if(Gl(O)){const P=O.closest("[data-controller-container]");if(P&&P.tabIndex>=0){et("back"),P.focus(),P.scrollIntoView({block:"nearest",behavior:"smooth"}),h.preventDefault();return}}if(/\/apps\/[^/]+$|\/marketplace\/[^/]+$|\/cloud\/[^/]+$/.test(t.path)){et("back"),window.history.back(),h.preventDefault();return}const I=Vo("sidebar")[0];if(I&&xs(O,"main")){et("back"),I.focus(),I.scrollIntoView({block:"nearest",behavior:"smooth"}),h.preventDefault();return}et("back"),window.history.back(),h.preventDefault();return}if(h.key==="Enter"){if(S>=0&&C[S]){const D=C[S];if(D.hasAttribute("data-controller-container")){if(D.hasAttribute("data-controller-install")){const P=D.querySelector("[data-controller-install-btn]:not([disabled])");if(P){et("action"),P.click(),h.preventDefault();return}}if(D.hasAttribute("data-controller-launch")){const P=D.querySelector("[data-controller-launch-btn]:not([disabled])");if(P){et("action"),P.click(),h.preventDefault();return}}const I=Kl(D)[0];if(I){et("action"),I.focus(),I.scrollIntoView({block:"nearest",behavior:"smooth"}),h.preventDefault();return}}et("action"),D.click()}h.preventDefault();return}if(["ArrowUp","ArrowDown","ArrowLeft","ArrowRight"].includes(h.key)){r.value=!0,i&&clearTimeout(i),i=setTimeout(()=>{r.value=o.value>0},3e3);const D=Vo("sidebar"),k=Vo("main"),I=D.length>0&&k.length>0,P=document.querySelector('[data-controller-zone="main"]'),q=/^\/dashboard(\/)?$/.test(t.path),Y=/^\/dashboard\/(apps|marketplace)(\/|$)/.test(t.path),B=/^\/dashboard\/cloud(\/|$)/.test(t.path),ae=/^\/dashboard\/server(\/|$)/.test(t.path),re=/^\/dashboard\/web5(\/|$)/.test(t.path),ve=/^\/dashboard\/settings(\/|$)/.test(t.path),ce=P?.querySelector("[data-controller-container]"),N=P?.querySelector("[data-controller-main-entry]"),W=N?Yr(N)[0]:null,X=(q||Y||B||ae||re||ve)&&ce?ce:W??k[0];if(h.key==="ArrowRight"&&I&&xs(O,"sidebar")&&X){et("move"),X.focus(),X.scrollIntoView({block:"nearest",behavior:"smooth"}),h.preventDefault();return}if(I&&xs(O,"main")){const ie=h.key==="ArrowLeft"?"left":h.key==="ArrowRight"?"right":h.key==="ArrowUp"?"up":"down",Ae=ql(O,k,ie);if(Ae){et("move"),Ae.focus(),Ae.scrollIntoView({block:"nearest",behavior:"smooth"}),h.preventDefault();return}if(h.key==="ArrowLeft"&&ie==="left"){const M=document.querySelector('[data-controller-zone="sidebar"]')?.querySelector(".nav-tab-active")??D[0];if(M){et("move"),M.focus(),M.scrollIntoView({block:"nearest",behavior:"smooth"}),h.preventDefault();return}}}if(Gl(O)){const ie=O.closest("[data-controller-container]");if(ie){const Ae=Kl(ie),we=h.key==="ArrowLeft"?"left":h.key==="ArrowRight"?"right":h.key==="ArrowUp"?"up":"down",oe=ql(O,Ae,we);if(oe){et("move"),oe.focus(),oe.scrollIntoView({block:"nearest",behavior:"smooth"}),h.preventDefault();return}}}if(xs(O,"sidebar")){const ie=D.indexOf(O);if(ie>=0){const Ae=h.key==="ArrowDown";let we;Ae?we=ie>=D.length-1?0:ie+1:we=ie<=0?D.length-1:ie-1;const oe=D[we];if(oe&&oe!==O){if(et("move"),oe.focus(),oe.scrollIntoView({block:"nearest",behavior:"smooth"}),oe.tagName==="A"){const M=oe.getAttribute?.("href");M&&M.startsWith("/")&&n.push(M).catch(()=>{})}h.preventDefault();return}}}let ge=S;const j=h.key==="ArrowDown"||h.key==="ArrowRight";if(C.length===0)return;S<0?ge=j?0:C.length-1:(ge=j?S+1:S-1,ge<0&&(ge=C.length-1),ge>=C.length&&(ge=0));const K=C[ge];if(K){if(et("move"),K.focus(),K.scrollIntoView({block:"nearest",behavior:"smooth"}),xs(K,"sidebar")&&(h.key==="ArrowUp"||h.key==="ArrowDown")){const ie=K.getAttribute?.("href");ie&&ie.startsWith("/")&&K.tagName==="A"&&n.push(ie).catch(()=>{})}h.preventDefault()}}}function u(){l()}function f(){const h=navigator.getGamepads?.();o.value=h?Array.from(h).filter(E=>E?.connected).length:1,r.value=!0}function d(){const h=navigator.getGamepads?.();o.value=h?Array.from(h).filter(E=>E?.connected).length:0,r.value=o.value>0}function p(h){let E=h?.parentElement;for(;E;){const w=getComputedStyle(E).overflowY;if((w==="auto"||w==="scroll")&&E.scrollHeight>E.clientHeight)return E;E=E.parentElement}return null}function b(h){const E=document.activeElement;if(!E)return;const v=p(E);v&&(h.deltaY!==0&&(v.scrollTop+=h.deltaY,h.preventDefault()),h.deltaX!==0&&v.scrollWidth>v.clientWidth&&(v.scrollLeft+=h.deltaX,h.preventDefault()))}return ht(()=>{l(),window.addEventListener("keydown",c,!0),window.addEventListener("wheel",b,{passive:!1}),window.addEventListener("gamepadconnected",f),window.addEventListener("gamepaddisconnected",d),a=setInterval(u,500)}),Ot(()=>{window.removeEventListener("keydown",c,!0),window.removeEventListener("wheel",b),window.removeEventListener("gamepadconnected",f),window.removeEventListener("gamepaddisconnected",d),a&&clearInterval(a),i&&clearTimeout(i)}),{isControllerActive:r,gamepadCount:o}}const k_=3e4,vr=G([]),yn=G(0),Wo=G(!1),Ho=G({show:!1,text:""});let Ts=null;function x_(){const e=ho(),t=pe(()=>Math.max(0,vr.value.length-yn.value));async function n(){Wo.value=!0;try{const l=(await Ne.getReceivedMessages()).messages||[];if(vr.value=l,l.length>yn.value&&yn.value>0){const c=l.length-yn.value,u=l[l.length-1];Ho.value={show:!0,text:(c===1?u?.message:null)??`${c} new messages`},yn.value=l.length}else yn.value=l.length}catch(a){if(a instanceof Error&&/401|Unauthorized/i.test(a.message)){r();return}}finally{Wo.value=!1}}function s(){Ts||(n(),Ts=setInterval(n,k_))}function r(){Ts&&(clearInterval(Ts),Ts=null)}function o(){yn.value=vr.value.length}function i(){Ho.value={show:!1,text:""},o(),e.push({path:"/dashboard/web5",query:{tab:"messages"}})}return{receivedMessages:vr,lastMessageCount:yn,loadingMessages:Wo,toastMessage:Ho,unreadCount:t,loadReceivedMessages:n,startPolling:s,stopPolling:r,markAsRead:o,dismissToastAndOpenMessages:i}}const jo="archipelago-ui-mode",T_=Qn("uiMode",()=>{const e=G(t());function t(){const l=localStorage.getItem(jo);return l==="gamer"||l==="easy"||l==="chat"?l:"gamer"}function n(l){l&&["gamer","easy","chat"].includes(l)&&(e.value=l,localStorage.setItem(jo,l))}function s(l){e.value=l,localStorage.setItem(jo,l)}function r(){const l=["easy","gamer"],c=l.indexOf(e.value),u=l[(c>=0?c+1:0)%l.length];return s(u),u}const o=pe(()=>e.value==="gamer"),i=pe(()=>e.value==="easy"),a=pe(()=>e.value==="chat");return{mode:e,setMode:s,cycleMode:r,syncFromBackend:n,isGamer:o,isEasy:i,isChat:a}}),I_={id:"app"},R_={class:"flex items-start gap-3"},P_={class:"min-w-0 flex-1"},L_={class:"mt-0.5 text-sm text-white/70 line-clamp-2"},N_=Ze({__name:"App",setup(e){const t=ho(),n=Of(),s=jr(),r=Js(),o=ia(),i=T_(),a=x_(),l=a.toastMessage;C_(),qe(()=>o.isAuthenticated,h=>{h?(a.startPolling(),n.resetInactivityTimer()):(a.stopPolling(),l.value={show:!1,text:""},n.clearInactivityTimer(),n.deactivate())},{immediate:!0});function c(){o.isAuthenticated&&!n.isActive&&n.resetInactivityTimer()}function u(h){const v=navigator.platform.toUpperCase().includes("MAC")?h.metaKey:h.ctrlKey,w=h.target,C=w.tagName==="INPUT"||w.tagName==="TEXTAREA"||w.isContentEditable;if(v&&h.key==="k"){h.preventDefault(),s.toggle();return}if((h.key==="f"||h.key==="F")&&!C&&!v&&!h.altKey){h.preventDefault(),r.toggle();return}if(v&&!C&&o.isAuthenticated){if(h.key==="1"){h.preventDefault(),i.setMode("easy"),t.push("/dashboard");return}if(h.key==="2"){h.preventDefault(),i.setMode("gamer"),t.push("/dashboard");return}if(h.key==="3"){h.preventDefault(),t.push("/dashboard/chat");return}}if(v&&(h.key==="m"||h.key==="M")&&!C&&o.isAuthenticated){h.preventDefault(),i.cycleMode(),t.push("/dashboard");return}(h.key==="s"||h.key==="S")&&!C&&o.isAuthenticated&&!n.isActive&&(h.preventDefault(),n.activate()),C&&h.key.length===1&&!h.ctrlKey&&!h.metaKey&&!h.altKey&&yf()}const f=gf(),d=G(!0),p=G(!1);ht(async()=>{window.addEventListener("keydown",u,!0),window.addEventListener("mousemove",c),window.addEventListener("mousedown",c),window.addEventListener("keydown",c),window.addEventListener("touchstart",c);const h=localStorage.getItem("neode_intro_seen")==="1",E=f.path!=="/";(h||E)&&(d.value=!1,document.body.classList.add("splash-complete"),await t.isReady(),p.value=!0)}),Ot(()=>{window.removeEventListener("keydown",u,!0),window.removeEventListener("mousemove",c),window.removeEventListener("mousedown",c),window.removeEventListener("keydown",c),window.removeEventListener("touchstart",c)});async function b(){d.value=!1,document.body.classList.add("splash-complete"),p.value=!0,sessionStorage.setItem("archipelago_from_splash","1");try{const{isOnboardingComplete:h}=await _e(async()=>{const{isOnboardingComplete:w}=await import("./useOnboarding-BgpIyX9l.js");return{isOnboardingComplete:w}},[]),v=await h()?"/login":"/onboarding/intro";t.push(v).catch(()=>{})}catch{t.push("/onboarding/intro").catch(()=>{})}}return(h,E)=>{const v=yu("RouterView");return z(),Z("div",I_,[d.value?(z(),dt(Xg,{key:0,onComplete:b})):be("",!0),!d.value&&p.value?(z(),dt(v,{key:1})):be("",!0),de(Py),de(Gy),de(Z0),de(u_),de(g_),de(E_,{show:he(s).helpModal.show,title:he(s).helpModal.title,content:he(s).helpModal.content,"related-path":he(s).helpModal.relatedPath,onClose:E[0]||(E[0]=w=>he(s).closeHelpModal())},null,8,["show","title","content","related-path"]),de(Qg),de(nv),(z(),dt(Nt,{to:"body"},[de(tt,{name:"toast"},{default:Ye(()=>[he(l).show?(z(),Z("div",{key:0,onClick:E[1]||(E[1]=(...w)=>he(a).dismissToastAndOpenMessages&&he(a).dismissToastAndOpenMessages(...w)),class:"fixed top-20 right-4 left-4 z-[100] w-auto max-w-md cursor-pointer rounded-xl p-4 transition-all hover:border-white/30 hover:shadow-2xl md:top-6 md:right-6 md:left-auto md:max-w-md toast-glass"},[_("div",R_,[E[4]||(E[4]=_("div",{class:"flex h-10 w-10 shrink-0 items-center justify-center rounded-full bg-orange-500/20"},[_("svg",{class:"h-5 w-5 text-orange-400",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[_("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M3 8l7.89 5.26a2 2 0 002.22 0L21 8M5 19h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z"})])],-1)),_("div",P_,[E[2]||(E[2]=_("p",{class:"text-sm font-medium text-white"},"New message",-1)),_("p",L_,Se(he(l).text),1),E[3]||(E[3]=_("p",{class:"mt-1 text-xs text-orange-400"},"Click to view",-1))])])])):be("",!0)]),_:1})]))])}}}),O_=(e,t,n)=>{const s=e[t];return s?typeof s=="function"?s():Promise.resolve(s):new Promise((r,o)=>{(typeof queueMicrotask=="function"?queueMicrotask:setTimeout)(o.bind(null,new Error("Unknown variable dynamic import: "+t+(t.split("/").length!==n?". Note that variables only represent file names one level deep.":""))))})};function D_(e,t){typeof console<"u"&&(console.warn("[intlify] "+e),t&&console.warn(t.stack))}const zr=typeof window<"u",Pn=(e,t=!1)=>t?Symbol.for(e):Symbol(e),M_=(e,t,n)=>F_({l:e,k:t,s:n}),F_=e=>JSON.stringify(e).replace(/\u2028/g,"\\u2028").replace(/\u2029/g,"\\u2029").replace(/\u0027/g,"\\u0027"),ze=e=>typeof e=="number"&&isFinite(e),Df=e=>aa(e)==="[object Date]",ms=e=>aa(e)==="[object RegExp]",vo=e=>ke(e)&&Object.keys(e).length===0,Qe=Object.assign,$_=Object.create,Oe=(e=null)=>$_(e);let Yl;const jn=()=>Yl||(Yl=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:Oe());function zl(e){return e.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'").replace(/\//g,"/").replace(/=/g,"=")}function Xl(e){return e.replace(/&(?![a-zA-Z0-9#]{2,6};)/g,"&").replace(/"/g,""").replace(/'/g,"'").replace(//g,">")}function B_(e){return e=e.replace(/(\w+)\s*=\s*"([^"]*)"/g,(s,r,o)=>`${r}="${Xl(o)}"`),e=e.replace(/(\w+)\s*=\s*'([^']*)'/g,(s,r,o)=>`${r}='${Xl(o)}'`),/\s*on\w+\s*=\s*["']?[^"'>]+["']?/gi.test(e)&&(e=e.replace(/(\s+)(on)(\w+\s*=)/gi,"$1on$3")),[/(\s+(?:href|src|action|formaction)\s*=\s*["']?)\s*javascript:/gi,/(style\s*=\s*["'][^"']*url\s*\(\s*)javascript:/gi].forEach(s=>{e=e.replace(s,"$1javascript:")}),e}const U_=Object.prototype.hasOwnProperty;function kt(e,t){return U_.call(e,t)}const Ge=Array.isArray,Ue=e=>typeof e=="function",te=e=>typeof e=="string",xe=e=>typeof e=="boolean",Pe=e=>e!==null&&typeof e=="object",V_=e=>Pe(e)&&Ue(e.then)&&Ue(e.catch),Mf=Object.prototype.toString,aa=e=>Mf.call(e),ke=e=>aa(e)==="[object Object]",W_=e=>e==null?"":Ge(e)||ke(e)&&e.toString===Mf?JSON.stringify(e,null,2):String(e);function la(e,t=""){return e.reduce((n,s,r)=>r===0?n+s:n+t+s,"")}const yr=e=>!Pe(e)||Ge(e);function Tr(e,t){if(yr(e)||yr(t))throw new Error("Invalid value");const n=[{src:e,des:t}];for(;n.length;){const{src:s,des:r}=n.pop();Object.keys(s).forEach(o=>{o!=="__proto__"&&(Pe(s[o])&&!Pe(r[o])&&(r[o]=Array.isArray(s[o])?[]:Oe()),yr(r[o])||yr(s[o])?r[o]=s[o]:n.push({src:s[o],des:r[o]}))})}}function H_(e,t,n){return{line:e,column:t,offset:n}}function Si(e,t,n){return{start:e,end:t}}const Ie={EXPECTED_TOKEN:1,INVALID_TOKEN_IN_PLACEHOLDER:2,UNTERMINATED_SINGLE_QUOTE_IN_PLACEHOLDER:3,UNKNOWN_ESCAPE_SEQUENCE:4,INVALID_UNICODE_ESCAPE_SEQUENCE:5,UNBALANCED_CLOSING_BRACE:6,UNTERMINATED_CLOSING_BRACE:7,EMPTY_PLACEHOLDER:8,NOT_ALLOW_NEST_PLACEHOLDER:9,INVALID_LINKED_FORMAT:10,MUST_HAVE_MESSAGES_IN_PLURAL:11,UNEXPECTED_EMPTY_LINKED_MODIFIER:12,UNEXPECTED_EMPTY_LINKED_KEY:13,UNEXPECTED_LEXICAL_ANALYSIS:14},j_=17;function yo(e,t,n={}){const{domain:s,messages:r,args:o}=n,i=e,a=new SyntaxError(String(i));return a.code=e,t&&(a.location=t),a.domain=s,a}function K_(e){throw e}const $t=" ",G_="\r",nt=` +`,q_="\u2028",Y_="\u2029";function z_(e){const t=e;let n=0,s=1,r=1,o=0;const i=k=>t[k]===G_&&t[k+1]===nt,a=k=>t[k]===nt,l=k=>t[k]===Y_,c=k=>t[k]===q_,u=k=>i(k)||a(k)||l(k)||c(k),f=()=>n,d=()=>s,p=()=>r,b=()=>o,h=k=>i(k)||l(k)||c(k)?nt:t[k],E=()=>h(n),v=()=>h(n+o);function w(){return o=0,u(n)&&(s++,r=0),i(n)&&n++,n++,r++,t[n]}function C(){return i(n+o)&&o++,o++,t[n+o]}function S(){n=0,s=1,r=1,o=0}function O(k=0){o=k}function D(){const k=n+o;for(;k!==n;)w();o=0}return{index:f,line:d,column:p,peekOffset:b,charAt:h,currentChar:E,currentPeek:v,next:w,peek:C,reset:S,resetPeek:O,skipToPeek:D}}const en=void 0,X_=".",Jl="'",J_="tokenizer";function Q_(e,t={}){const n=t.location!==!1,s=z_(e),r=()=>s.index(),o=()=>H_(s.line(),s.column(),s.index()),i=o(),a=r(),l={currentType:13,offset:a,startLoc:i,endLoc:i,lastType:13,lastOffset:a,lastStartLoc:i,lastEndLoc:i,braceNest:0,inLinked:!1,text:""},c=()=>l,{onError:u}=t;function f(m,g,x,...L){const Q=c();if(g.column+=x,g.offset+=x,u){const H=n?Si(Q.startLoc,g):null,T=yo(m,H,{domain:J_,args:L});u(T)}}function d(m,g,x){m.endLoc=o(),m.currentType=g;const L={type:g};return n&&(L.loc=Si(m.startLoc,m.endLoc)),x!=null&&(L.value=x),L}const p=m=>d(m,13);function b(m,g){return m.currentChar()===g?(m.next(),g):(f(Ie.EXPECTED_TOKEN,o(),0,g),"")}function h(m){let g="";for(;m.currentPeek()===$t||m.currentPeek()===nt;)g+=m.currentPeek(),m.peek();return g}function E(m){const g=h(m);return m.skipToPeek(),g}function v(m){if(m===en)return!1;const g=m.charCodeAt(0);return g>=97&&g<=122||g>=65&&g<=90||g===95}function w(m){if(m===en)return!1;const g=m.charCodeAt(0);return g>=48&&g<=57}function C(m,g){const{currentType:x}=g;if(x!==2)return!1;h(m);const L=v(m.currentPeek());return m.resetPeek(),L}function S(m,g){const{currentType:x}=g;if(x!==2)return!1;h(m);const L=m.currentPeek()==="-"?m.peek():m.currentPeek(),Q=w(L);return m.resetPeek(),Q}function O(m,g){const{currentType:x}=g;if(x!==2)return!1;h(m);const L=m.currentPeek()===Jl;return m.resetPeek(),L}function D(m,g){const{currentType:x}=g;if(x!==7)return!1;h(m);const L=m.currentPeek()===".";return m.resetPeek(),L}function k(m,g){const{currentType:x}=g;if(x!==8)return!1;h(m);const L=v(m.currentPeek());return m.resetPeek(),L}function I(m,g){const{currentType:x}=g;if(!(x===7||x===11))return!1;h(m);const L=m.currentPeek()===":";return m.resetPeek(),L}function P(m,g){const{currentType:x}=g;if(x!==9)return!1;const L=()=>{const H=m.currentPeek();return H==="{"?v(m.peek()):H==="@"||H==="|"||H===":"||H==="."||H===$t||!H?!1:H===nt?(m.peek(),L()):Y(m,!1)},Q=L();return m.resetPeek(),Q}function q(m){h(m);const g=m.currentPeek()==="|";return m.resetPeek(),g}function Y(m,g=!0){const x=(Q=!1,H="")=>{const T=m.currentPeek();return T==="{"||T==="@"||!T?Q:T==="|"?!(H===$t||H===nt):T===$t?(m.peek(),x(!0,$t)):T===nt?(m.peek(),x(!0,nt)):!0},L=x();return g&&m.resetPeek(),L}function B(m,g){const x=m.currentChar();return x===en?en:g(x)?(m.next(),x):null}function ae(m){const g=m.charCodeAt(0);return g>=97&&g<=122||g>=65&&g<=90||g>=48&&g<=57||g===95||g===36}function re(m){return B(m,ae)}function ve(m){const g=m.charCodeAt(0);return g>=97&&g<=122||g>=65&&g<=90||g>=48&&g<=57||g===95||g===36||g===45}function ce(m){return B(m,ve)}function N(m){const g=m.charCodeAt(0);return g>=48&&g<=57}function W(m){return B(m,N)}function X(m){const g=m.charCodeAt(0);return g>=48&&g<=57||g>=65&&g<=70||g>=97&&g<=102}function ge(m){return B(m,X)}function j(m){let g="",x="";for(;g=W(m);)x+=g;return x}function K(m){let g="";for(;;){const x=m.currentChar();if(x==="\\"){const L=m.peek();L==="{"||L==="}"||L==="@"||L==="|"||L==="\\"?(g+=x+L,m.next(),m.next()):(m.resetPeek(),g+=x,m.next())}else{if(x==="{"||x==="}"||x==="@"||x==="|"||!x)break;if(x===$t||x===nt)if(Y(m))g+=x,m.next();else{if(q(m))break;g+=x,m.next()}else g+=x,m.next()}}return g}function ie(m){E(m);let g="",x="";for(;g=ce(m);)x+=g;const L=m.currentChar();if(L&&L!=="}"&&L!==en&&L!==$t&&L!==nt&&L!==" "){const Q=se(m);return f(Ie.INVALID_TOKEN_IN_PLACEHOLDER,o(),0,x+Q),x+Q}return m.currentChar()===en&&f(Ie.UNTERMINATED_CLOSING_BRACE,o(),0),x}function Ae(m){E(m);let g="";return m.currentChar()==="-"?(m.next(),g+=`-${j(m)}`):g+=j(m),m.currentChar()===en&&f(Ie.UNTERMINATED_CLOSING_BRACE,o(),0),g}function we(m){return m!==Jl&&m!==nt}function oe(m){E(m),b(m,"'");let g="",x="";for(;g=B(m,we);)g==="\\"?x+=M(m):x+=g;const L=m.currentChar();return L===nt||L===en?(f(Ie.UNTERMINATED_SINGLE_QUOTE_IN_PLACEHOLDER,o(),0),L===nt&&(m.next(),b(m,"'")),x):(b(m,"'"),x)}function M(m){const g=m.currentChar();switch(g){case"\\":case"'":return m.next(),`\\${g}`;case"u":return ee(m,g,4);case"U":return ee(m,g,6);default:return f(Ie.UNKNOWN_ESCAPE_SEQUENCE,o(),0,g),""}}function ee(m,g,x){b(m,g);let L="";for(let Q=0;Q{const L=m.currentChar();return L==="{"||L==="@"||L==="|"||L==="("||L===")"||!L||L===$t?x:(x+=L,m.next(),g(x))};return g("")}function A(m){E(m);const g=b(m,"|");return E(m),g}function R(m,g){let x=null;switch(m.currentChar()){case"{":return g.braceNest>=1&&f(Ie.NOT_ALLOW_NEST_PLACEHOLDER,o(),0),m.next(),x=d(g,2,"{"),E(m),g.braceNest++,x;case"}":return g.braceNest>0&&g.currentType===2&&f(Ie.EMPTY_PLACEHOLDER,o(),0),m.next(),x=d(g,3,"}"),g.braceNest--,g.braceNest>0&&E(m),g.inLinked&&g.braceNest===0&&(g.inLinked=!1),x;case"@":return g.braceNest>0&&f(Ie.UNTERMINATED_CLOSING_BRACE,o(),0),x=$(m,g)||p(g),g.braceNest=0,x;default:{let Q=!0,H=!0,T=!0;if(q(m))return g.braceNest>0&&f(Ie.UNTERMINATED_CLOSING_BRACE,o(),0),x=d(g,1,A(m)),g.braceNest=0,g.inLinked=!1,x;if(g.braceNest>0&&(g.currentType===4||g.currentType===5||g.currentType===6))return f(Ie.UNTERMINATED_CLOSING_BRACE,o(),0),g.braceNest=0,V(m,g);if(Q=C(m,g))return x=d(g,4,ie(m)),E(m),x;if(H=S(m,g))return x=d(g,5,Ae(m)),E(m),x;if(T=O(m,g))return x=d(g,6,oe(m)),E(m),x;if(!Q&&!H&&!T)return x=d(g,12,se(m)),f(Ie.INVALID_TOKEN_IN_PLACEHOLDER,o(),0,x.value),E(m),x;break}}return x}function $(m,g){const{currentType:x}=g;let L=null;const Q=m.currentChar();switch((x===7||x===8||x===11||x===9)&&(Q===nt||Q===$t)&&f(Ie.INVALID_LINKED_FORMAT,o(),0),Q){case"@":return m.next(),L=d(g,7,"@"),g.inLinked=!0,L;case".":return E(m),m.next(),d(g,8,".");case":":return E(m),m.next(),d(g,9,":");default:return q(m)?(L=d(g,1,A(m)),g.braceNest=0,g.inLinked=!1,L):D(m,g)||I(m,g)?(E(m),$(m,g)):k(m,g)?(E(m),d(g,11,ye(m))):P(m,g)?(E(m),Q==="{"?R(m,g)||L:d(g,10,y(m))):(x===7&&f(Ie.INVALID_LINKED_FORMAT,o(),0),g.braceNest=0,g.inLinked=!1,V(m,g))}}function V(m,g){let x={type:13};if(g.braceNest>0)return R(m,g)||p(g);if(g.inLinked)return $(m,g)||p(g);switch(m.currentChar()){case"{":return R(m,g)||p(g);case"}":return f(Ie.UNBALANCED_CLOSING_BRACE,o(),0),m.next(),d(g,3,"}");case"@":return $(m,g)||p(g);default:{if(q(m))return x=d(g,1,A(m)),g.braceNest=0,g.inLinked=!1,x;if(Y(m))return d(g,0,K(m));break}}return x}function U(){const{currentType:m,offset:g,startLoc:x,endLoc:L}=l;return l.lastType=m,l.lastOffset=g,l.lastStartLoc=x,l.lastEndLoc=L,l.offset=r(),l.startLoc=o(),s.currentChar()===en?d(l,13):V(s,l)}return{nextToken:U,currentOffset:r,currentPosition:o,context:c}}const Z_="parser",eb=/(?:\\\\|\\'|\\u([0-9a-fA-F]{4})|\\U([0-9a-fA-F]{6}))/g,tb=/\\([\\@{}|])/g;function nb(e,t){return t}function sb(e,t,n){switch(e){case"\\\\":return"\\";case"\\'":return"'";default:{const s=parseInt(t||n,16);return s<=55295||s>=57344?String.fromCodePoint(s):"�"}}}function rb(e={}){const t=e.location!==!1,{onError:n}=e;function s(v,w,C,S,...O){const D=v.currentPosition();if(D.offset+=S,D.column+=S,n){const k=t?Si(C,D):null,I=yo(w,k,{domain:Z_,args:O});n(I)}}function r(v,w,C){const S={type:v};return t&&(S.start=w,S.end=w,S.loc={start:C,end:C}),S}function o(v,w,C,S){t&&(v.end=w,v.loc&&(v.loc.end=C))}function i(v,w){const C=v.context(),S=r(3,C.offset,C.startLoc);return S.value=w.replace(tb,nb),o(S,v.currentOffset(),v.currentPosition()),S}function a(v,w){const C=v.context(),{lastOffset:S,lastStartLoc:O}=C,D=r(5,S,O);return D.index=parseInt(w,10),v.nextToken(),o(D,v.currentOffset(),v.currentPosition()),D}function l(v,w){const C=v.context(),{lastOffset:S,lastStartLoc:O}=C,D=r(4,S,O);return D.key=w,v.nextToken(),o(D,v.currentOffset(),v.currentPosition()),D}function c(v,w){const C=v.context(),{lastOffset:S,lastStartLoc:O}=C,D=r(9,S,O);return D.value=w.replace(eb,sb),v.nextToken(),o(D,v.currentOffset(),v.currentPosition()),D}function u(v){const w=v.nextToken(),C=v.context(),{lastOffset:S,lastStartLoc:O}=C,D=r(8,S,O);return w.type!==11?(s(v,Ie.UNEXPECTED_EMPTY_LINKED_MODIFIER,C.lastStartLoc,0),D.value="",o(D,S,O),{nextConsumeToken:w,node:D}):(w.value==null&&s(v,Ie.UNEXPECTED_LEXICAL_ANALYSIS,C.lastStartLoc,0,Bt(w)),D.value=w.value||"",o(D,v.currentOffset(),v.currentPosition()),{node:D})}function f(v,w){const C=v.context(),S=r(7,C.offset,C.startLoc);return S.value=w,o(S,v.currentOffset(),v.currentPosition()),S}function d(v){const w=v.context(),C=r(6,w.offset,w.startLoc);let S=v.nextToken();if(S.type===8){const O=u(v);C.modifier=O.node,S=O.nextConsumeToken||v.nextToken()}switch(S.type!==9&&s(v,Ie.UNEXPECTED_LEXICAL_ANALYSIS,w.lastStartLoc,0,Bt(S)),S=v.nextToken(),S.type===2&&(S=v.nextToken()),S.type){case 10:S.value==null&&s(v,Ie.UNEXPECTED_LEXICAL_ANALYSIS,w.lastStartLoc,0,Bt(S)),C.key=f(v,S.value||"");break;case 4:S.value==null&&s(v,Ie.UNEXPECTED_LEXICAL_ANALYSIS,w.lastStartLoc,0,Bt(S)),C.key=l(v,S.value||"");break;case 5:S.value==null&&s(v,Ie.UNEXPECTED_LEXICAL_ANALYSIS,w.lastStartLoc,0,Bt(S)),C.key=a(v,S.value||"");break;case 6:S.value==null&&s(v,Ie.UNEXPECTED_LEXICAL_ANALYSIS,w.lastStartLoc,0,Bt(S)),C.key=c(v,S.value||"");break;default:{s(v,Ie.UNEXPECTED_EMPTY_LINKED_KEY,w.lastStartLoc,0);const O=v.context(),D=r(7,O.offset,O.startLoc);return D.value="",o(D,O.offset,O.startLoc),C.key=D,o(C,O.offset,O.startLoc),{nextConsumeToken:S,node:C}}}return o(C,v.currentOffset(),v.currentPosition()),{node:C}}function p(v){const w=v.context(),C=w.currentType===1?v.currentOffset():w.offset,S=w.currentType===1?w.endLoc:w.startLoc,O=r(2,C,S);O.items=[];let D=null;do{const P=D||v.nextToken();switch(D=null,P.type){case 0:P.value==null&&s(v,Ie.UNEXPECTED_LEXICAL_ANALYSIS,w.lastStartLoc,0,Bt(P)),O.items.push(i(v,P.value||""));break;case 5:P.value==null&&s(v,Ie.UNEXPECTED_LEXICAL_ANALYSIS,w.lastStartLoc,0,Bt(P)),O.items.push(a(v,P.value||""));break;case 4:P.value==null&&s(v,Ie.UNEXPECTED_LEXICAL_ANALYSIS,w.lastStartLoc,0,Bt(P)),O.items.push(l(v,P.value||""));break;case 6:P.value==null&&s(v,Ie.UNEXPECTED_LEXICAL_ANALYSIS,w.lastStartLoc,0,Bt(P)),O.items.push(c(v,P.value||""));break;case 7:{const q=d(v);O.items.push(q.node),D=q.nextConsumeToken||null;break}}}while(w.currentType!==13&&w.currentType!==1);const k=w.currentType===1?w.lastOffset:v.currentOffset(),I=w.currentType===1?w.lastEndLoc:v.currentPosition();return o(O,k,I),O}function b(v,w,C,S){const O=v.context();let D=S.items.length===0;const k=r(1,w,C);k.cases=[],k.cases.push(S);do{const I=p(v);D||(D=I.items.length===0),k.cases.push(I)}while(O.currentType!==13);return D&&s(v,Ie.MUST_HAVE_MESSAGES_IN_PLURAL,C,0),o(k,v.currentOffset(),v.currentPosition()),k}function h(v){const w=v.context(),{offset:C,startLoc:S}=w,O=p(v);return w.currentType===13?O:b(v,C,S,O)}function E(v){const w=Q_(v,Qe({},e)),C=w.context(),S=r(0,C.offset,C.startLoc);return t&&S.loc&&(S.loc.source=v),S.body=h(w),e.onCacheKey&&(S.cacheKey=e.onCacheKey(v)),C.currentType!==13&&s(w,Ie.UNEXPECTED_LEXICAL_ANALYSIS,C.lastStartLoc,0,v[C.offset]||""),o(S,w.currentOffset(),w.currentPosition()),S}return{parse:E}}function Bt(e){if(e.type===13)return"EOF";const t=(e.value||"").replace(/\r?\n/gu,"\\n");return t.length>10?t.slice(0,9)+"…":t}function ob(e,t={}){const n={ast:e,helpers:new Set};return{context:()=>n,helper:o=>(n.helpers.add(o),o)}}function Ql(e,t){for(let n=0;nZl(n)),e}function Zl(e){if(e.items.length===1){const t=e.items[0];(t.type===3||t.type===9)&&(e.static=t.value,delete t.value)}else{const t=[];for(let n=0;ni;function l(h,E){i.code+=h}function c(h,E=!0){const v=E?s:"";l(r?v+" ".repeat(h):v)}function u(h=!0){const E=++i.indentLevel;h&&c(E)}function f(h=!0){const E=--i.indentLevel;h&&c(E)}function d(){c(i.indentLevel)}return{context:a,push:l,indent:u,deindent:f,newline:d,helper:h=>`_${h}`,needIndent:()=>i.needIndent}}function cb(e,t){const{helper:n}=e;e.push(`${n("linked")}(`),gs(e,t.key),t.modifier?(e.push(", "),gs(e,t.modifier),e.push(", _type")):e.push(", undefined, _type"),e.push(")")}function ub(e,t){const{helper:n,needIndent:s}=e;e.push(`${n("normalize")}([`),e.indent(s());const r=t.items.length;for(let o=0;o1){e.push(`${n("plural")}([`),e.indent(s());const r=t.cases.length;for(let o=0;o{const n=te(t.mode)?t.mode:"normal",s=te(t.filename)?t.filename:"message.intl";t.sourceMap;const r=t.breakLineCode!=null?t.breakLineCode:n==="arrow"?";":` +`,o=t.needIndent?t.needIndent:n!=="arrow",i=e.helpers||[],a=lb(e,{filename:s,breakLineCode:r,needIndent:o});a.push(n==="normal"?"function __msg__ (ctx) {":"(ctx) => {"),a.indent(o),i.length>0&&(a.push(`const { ${la(i.map(u=>`${u}: _${u}`),", ")} } = ctx`),a.newline()),a.push("return "),gs(a,e),a.deindent(o),a.push("}"),delete e.helpers;const{code:l,map:c}=a.context();return{ast:e,code:l,map:c?c.toJSON():void 0}};function hb(e,t={}){const n=Qe({},t),s=!!n.jit,r=!!n.minify,o=n.optimize==null?!0:n.optimize,a=rb(n).parse(e);return s?(o&&ab(a),r&&rs(a),{ast:a,code:""}):(ib(a,n),pb(a,n))}function mb(){typeof __INTLIFY_PROD_DEVTOOLS__!="boolean"&&(jn().__INTLIFY_PROD_DEVTOOLS__=!1),typeof __INTLIFY_DROP_MESSAGE_COMPILER__!="boolean"&&(jn().__INTLIFY_DROP_MESSAGE_COMPILER__=!1)}function Xt(e){return Pe(e)&&ua(e)===0&&(kt(e,"b")||kt(e,"body"))}const Ff=["b","body"];function gb(e){return Ln(e,Ff)}const $f=["c","cases"];function vb(e){return Ln(e,$f,[])}const Bf=["s","static"];function yb(e){return Ln(e,Bf)}const Uf=["i","items"];function _b(e){return Ln(e,Uf,[])}const Vf=["t","type"];function ua(e){return Ln(e,Vf)}const Wf=["v","value"];function _r(e,t){const n=Ln(e,Wf);if(n!=null)return n;throw Zs(t)}const Hf=["m","modifier"];function bb(e){return Ln(e,Hf)}const jf=["k","key"];function wb(e){const t=Ln(e,jf);if(t)return t;throw Zs(6)}function Ln(e,t,n){for(let s=0;sEb(n,e)}function Eb(e,t){const n=gb(t);if(n==null)throw Zs(0);if(ua(n)===1){const o=vb(n);return e.plural(o.reduce((i,a)=>[...i,ec(e,a)],[]))}else return ec(e,n)}function ec(e,t){const n=yb(t);if(n!=null)return e.type==="text"?n:e.normalize([n]);{const s=_b(t).reduce((r,o)=>[...r,Ci(e,o)],[]);return e.normalize(s)}}function Ci(e,t){const n=ua(t);switch(n){case 3:return _r(t,n);case 9:return _r(t,n);case 4:{const s=t;if(kt(s,"k")&&s.k)return e.interpolate(e.named(s.k));if(kt(s,"key")&&s.key)return e.interpolate(e.named(s.key));throw Zs(n)}case 5:{const s=t;if(kt(s,"i")&&ze(s.i))return e.interpolate(e.list(s.i));if(kt(s,"index")&&ze(s.index))return e.interpolate(e.list(s.index));throw Zs(n)}case 6:{const s=t,r=bb(s),o=wb(s);return e.linked(Ci(e,o),r?Ci(e,r):void 0,e.type)}case 7:return _r(t,n);case 8:return _r(t,n);default:throw new Error(`unhandled node on format message part: ${n}`)}}const Ab=e=>e;let br=Oe();function Sb(e,t={}){let n=!1;const s=t.onError||K_;return t.onError=r=>{n=!0,s(r)},{...hb(e,t),detectError:n}}function Cb(e,t){if(!__INTLIFY_DROP_MESSAGE_COMPILER__&&te(e)){xe(t.warnHtmlMessage)&&t.warnHtmlMessage;const s=(t.onCacheKey||Ab)(e),r=br[s];if(r)return r;const{ast:o,detectError:i}=Sb(e,{...t,location:!1,jit:!0}),a=Ko(o);return i?a:br[s]=a}else{const n=e.cacheKey;if(n){const s=br[n];return s||(br[n]=Ko(e))}else return Ko(e)}}let er=null;function kb(e){er=e}function xb(e,t,n){er&&er.emit("i18n:init",{timestamp:Date.now(),i18n:e,version:t,meta:n})}const Tb=Ib("function:translate");function Ib(e){return t=>er&&er.emit(e,t)}const on={INVALID_ARGUMENT:j_,INVALID_DATE_ARGUMENT:18,INVALID_ISO_DATE_ARGUMENT:19,NOT_SUPPORT_LOCALE_PROMISE_VALUE:21,NOT_SUPPORT_LOCALE_ASYNC_FUNCTION:22,NOT_SUPPORT_LOCALE_TYPE:23},Rb=24;function an(e){return yo(e,null,void 0)}function fa(e,t){return t.locale!=null?tc(t.locale):tc(e.locale)}let Go;function tc(e){if(te(e))return e;if(Ue(e)){if(e.resolvedOnce&&Go!=null)return Go;if(e.constructor.name==="Function"){const t=e();if(V_(t))throw an(on.NOT_SUPPORT_LOCALE_PROMISE_VALUE);return Go=t}else throw an(on.NOT_SUPPORT_LOCALE_ASYNC_FUNCTION)}else throw an(on.NOT_SUPPORT_LOCALE_TYPE)}function Pb(e,t,n){return[...new Set([n,...Ge(t)?t:Pe(t)?Object.keys(t):te(t)?[t]:[n]])]}function ki(e,t,n){const s=te(n)?n:tr,r=e;r.__localeChainCache||(r.__localeChainCache=new Map);let o=r.__localeChainCache.get(s);if(!o){o=[];let i=[n];for(;Ge(i);)i=nc(o,i,t);const a=Ge(t)||!ke(t)?t:t.default?t.default:null;i=te(a)?[a]:a,Ge(i)&&nc(o,i,!1),r.__localeChainCache.set(s,o)}return o}function nc(e,t,n){let s=!0;for(let r=0;r{i===void 0?i=a:i+=a},d[1]=()=>{i!==void 0&&(t.push(i),i=void 0)},d[2]=()=>{d[0](),r++},d[3]=()=>{if(r>0)r--,s=4,d[0]();else{if(r=0,i===void 0||(i=$b(i),i===!1))return!1;d[1]()}};function p(){const b=e[n+1];if(s===5&&b==="'"||s===6&&b==='"')return n++,a="\\"+b,d[0](),!0}for(;s!==null;)if(n++,o=e[n],!(o==="\\"&&p())){if(l=Fb(o),f=Nn[s],c=f[l]||f.l||8,c===8||(s=c[0],c[1]!==void 0&&(u=d[c[1]],u&&(a=o,u()===!1))))return;if(s===7)return t}}const sc=new Map;function Ub(e,t){return Pe(e)?e[t]:null}function Vb(e,t){if(!Pe(e))return null;let n=sc.get(t);if(n||(n=Bb(t),n&&sc.set(t,n)),!n)return null;const s=n.length;let r=e,o=0;for(;o`${e.charAt(0).toLocaleUpperCase()}${e.substr(1)}`;function Hb(){return{upper:(e,t)=>t==="text"&&te(e)?e.toUpperCase():t==="vnode"&&Pe(e)&&"__v_isVNode"in e?e.children.toUpperCase():e,lower:(e,t)=>t==="text"&&te(e)?e.toLowerCase():t==="vnode"&&Pe(e)&&"__v_isVNode"in e?e.children.toLowerCase():e,capitalize:(e,t)=>t==="text"&&te(e)?rc(e):t==="vnode"&&Pe(e)&&"__v_isVNode"in e?rc(e.children):e}}let Gf;function jb(e){Gf=e}let qf;function Kb(e){qf=e}let Yf;function Gb(e){Yf=e}let zf=null;const qb=e=>{zf=e},Yb=()=>zf;let Xf=null;const oc=e=>{Xf=e},zb=()=>Xf;let ic=0;function Xb(e={}){const t=Ue(e.onWarn)?e.onWarn:D_,n=te(e.version)?e.version:Wb,s=te(e.locale)||Ue(e.locale)?e.locale:tr,r=Ue(s)?tr:s,o=Ge(e.fallbackLocale)||ke(e.fallbackLocale)||te(e.fallbackLocale)||e.fallbackLocale===!1?e.fallbackLocale:r,i=ke(e.messages)?e.messages:qo(r),a=ke(e.datetimeFormats)?e.datetimeFormats:qo(r),l=ke(e.numberFormats)?e.numberFormats:qo(r),c=Qe(Oe(),e.modifiers,Hb()),u=e.pluralRules||Oe(),f=Ue(e.missing)?e.missing:null,d=xe(e.missingWarn)||ms(e.missingWarn)?e.missingWarn:!0,p=xe(e.fallbackWarn)||ms(e.fallbackWarn)?e.fallbackWarn:!0,b=!!e.fallbackFormat,h=!!e.unresolving,E=Ue(e.postTranslation)?e.postTranslation:null,v=ke(e.processor)?e.processor:null,w=xe(e.warnHtmlMessage)?e.warnHtmlMessage:!0,C=!!e.escapeParameter,S=Ue(e.messageCompiler)?e.messageCompiler:Gf,O=Ue(e.messageResolver)?e.messageResolver:qf||Ub,D=Ue(e.localeFallbacker)?e.localeFallbacker:Yf||Pb,k=Pe(e.fallbackContext)?e.fallbackContext:void 0,I=e,P=Pe(I.__datetimeFormatters)?I.__datetimeFormatters:new Map,q=Pe(I.__numberFormatters)?I.__numberFormatters:new Map,Y=Pe(I.__meta)?I.__meta:{};ic++;const B={version:n,cid:ic,locale:s,fallbackLocale:o,messages:i,modifiers:c,pluralRules:u,missing:f,missingWarn:d,fallbackWarn:p,fallbackFormat:b,unresolving:h,postTranslation:E,processor:v,warnHtmlMessage:w,escapeParameter:C,messageCompiler:S,messageResolver:O,localeFallbacker:D,fallbackContext:k,onWarn:t,__meta:Y};return B.datetimeFormats=a,B.numberFormats=l,B.__datetimeFormatters=P,B.__numberFormatters=q,__INTLIFY_PROD_DEVTOOLS__&&xb(B,n,Y),B}const qo=e=>({[e]:Oe()});function da(e,t,n,s,r){const{missing:o,onWarn:i}=e;if(o!==null){const a=o(e,n,t,r);return te(a)?a:t}else return t}function Is(e,t,n){const s=e;s.__localeChainCache=new Map,e.localeFallbacker(e,n,t)}function Jb(e,t){return e===t?!1:e.split("-")[0]===t.split("-")[0]}function Qb(e,t){const n=t.indexOf(e);if(n===-1)return!1;for(let s=n+1;s{Jf.includes(l)?i[l]=n[l]:o[l]=n[l]}),te(s)?o.locale=s:ke(s)&&(i=s),ke(r)&&(i=r),[o.key||"",a,o,i]}function lc(e,t,n){const s=e;for(const r in n){const o=`${t}__${r}`;s.__datetimeFormatters.has(o)&&s.__datetimeFormatters.delete(o)}}function cc(e,...t){const{numberFormats:n,unresolving:s,fallbackLocale:r,onWarn:o,localeFallbacker:i}=e,{__numberFormatters:a}=e;if(!ze(t[0]))return Xr;const[l,c,u,f]=Ti(...t),d=xe(u.missingWarn)?u.missingWarn:e.missingWarn;xe(u.fallbackWarn)?u.fallbackWarn:e.fallbackWarn;const p=!!u.part,b=fa(e,u),h=i(e,r,b);if(!te(l)||l==="")return new Intl.NumberFormat(b.replace(/!/g,""),f).format(c);let E={},v,w=null;const C="number format";for(let D=0;D{Qf.includes(l)?i[l]=n[l]:o[l]=n[l]}),te(s)?o.locale=s:ke(s)&&(i=s),ke(r)&&(i=r),[o.key||"",a,o,i]}function uc(e,t,n){const s=e;for(const r in n){const o=`${t}__${r}`;s.__numberFormatters.has(o)&&s.__numberFormatters.delete(o)}}const Zb=e=>e,ew=e=>"",tw="text",nw=e=>e.length===0?"":la(e),sw=W_;function Yo(e,t){return e=Math.abs(e),t===2?e===1?0:1:Math.min(e,2)}function rw(e){const t=ze(e.pluralIndex)?e.pluralIndex:-1;return ze(e.named?.count)?e.named.count:ze(e.named?.n)?e.named.n:t}function ow(e={}){const t=e.locale,n=rw(e),s=te(t)&&Ue(e.pluralRules?.[t])?e.pluralRules[t]:Yo,r=s===Yo?void 0:Yo,o=v=>v[s(n,v.length,r)],i=e.list||[],a=v=>i[v],l=e.named||Oe();ze(e.pluralIndex)&&(l.count||=e.pluralIndex,l.n||=e.pluralIndex);const c=v=>l[v];function u(v,w){const C=Ue(e.messages)?e.messages(v,!!w):Pe(e.messages)?e.messages[v]:!1;return C||(e.parent?e.parent.message(v):ew)}const f=v=>e.modifiers?e.modifiers[v]:Zb,d=Ue(e.processor?.normalize)?e.processor.normalize:nw,p=Ue(e.processor?.interpolate)?e.processor.interpolate:sw,b=te(e.processor?.type)?e.processor.type:tw,E={list:a,named:c,plural:o,linked:(v,...w)=>{const[C,S]=w;let O="text",D="";w.length===1?Pe(C)?(D=C.modifier||D,O=C.type||O):te(C)&&(D=C||D):w.length===2&&(te(C)&&(D=C||D),te(S)&&(O=S||O));const k=u(v,!0)(E),I=k===""||k===void 0?v:k,P=O==="vnode"&&Ge(I)&&D?I[0]:I;return D?f(D)(P,O):P},message:u,type:b,interpolate:p,normalize:d,values:Qe(Oe(),i,l)};return E}const fc=()=>"",Ct=e=>Ue(e);function dc(e,...t){const{fallbackFormat:n,postTranslation:s,unresolving:r,messageCompiler:o,fallbackLocale:i,messages:a}=e,[l,c]=Ii(...t),u=xe(c.missingWarn)?c.missingWarn:e.missingWarn,f=xe(c.fallbackWarn)?c.fallbackWarn:e.fallbackWarn,d=xe(c.escapeParameter)?c.escapeParameter:e.escapeParameter,p=!!c.resolvedMessage,b=te(c.default)||xe(c.default)?xe(c.default)?o?l:()=>l:c.default:n?o?l:()=>l:null,h=n||b!=null&&(te(b)||Ue(b)),E=fa(e,c);d&&iw(c);let[v,w,C]=p?[l,E,a[E]||Oe()]:Zf(e,l,E,i,f,u),S=v,O=l;if(!p&&!(te(S)||Xt(S)||Ct(S))&&h&&(S=b,O=S),!p&&(!(te(S)||Xt(S)||Ct(S))||!te(w)))return r?_o:l;let D=!1;const k=()=>{D=!0},I=Ct(S)?S:ed(e,l,w,S,O,k);if(D)return S;const P=cw(e,w,C,c),q=ow(P),Y=aw(e,I,q);let B=s?s(Y,l):Y;if(d&&te(B)&&(B=B_(B)),__INTLIFY_PROD_DEVTOOLS__){const ae={timestamp:Date.now(),key:te(l)?l:Ct(S)?S.key:"",locale:w||(Ct(S)?S.locale:""),format:te(S)?S:Ct(S)?S.source:"",message:B};ae.meta=Qe({},e.__meta,Yb()||{}),Tb(ae)}return B}function iw(e){Ge(e.list)?e.list=e.list.map(t=>te(t)?zl(t):t):Pe(e.named)&&Object.keys(e.named).forEach(t=>{te(e.named[t])&&(e.named[t]=zl(e.named[t]))})}function Zf(e,t,n,s,r,o){const{messages:i,onWarn:a,messageResolver:l,localeFallbacker:c}=e,u=c(e,s,n);let f=Oe(),d,p=null;const b="translate";for(let h=0;hs);return c.locale=n,c.key=t,c}const l=i(s,lw(e,n,r,s,a,o));return l.locale=n,l.key=t,l.source=s,l}function aw(e,t,n){return t(n)}function Ii(...e){const[t,n,s]=e,r=Oe();if(!te(t)&&!ze(t)&&!Ct(t)&&!Xt(t))throw an(on.INVALID_ARGUMENT);const o=ze(t)?String(t):(Ct(t),t);return ze(n)?r.plural=n:te(n)?r.default=n:ke(n)&&!vo(n)?r.named=n:Ge(n)&&(r.list=n),ze(s)?r.plural=s:te(s)?r.default=s:ke(s)&&Qe(r,s),[o,r]}function lw(e,t,n,s,r,o){return{locale:t,key:n,warnHtmlMessage:r,onError:i=>{throw o&&o(i),i},onCacheKey:i=>M_(t,n,i)}}function cw(e,t,n,s){const{modifiers:r,pluralRules:o,messageResolver:i,fallbackLocale:a,fallbackWarn:l,missingWarn:c,fallbackContext:u}=e,d={locale:t,modifiers:r,pluralRules:o,messages:(p,b)=>{let h=i(n,p);if(h==null&&(u||b)){const[,,E]=Zf(u||e,p,t,a,l,c);h=i(E,p)}if(te(h)||Xt(h)){let E=!1;const w=ed(e,p,t,h,p,()=>{E=!0});return E?fc:w}else return Ct(h)?h:fc}};return e.processor&&(d.processor=e.processor),s.list&&(d.list=s.list),s.named&&(d.named=s.named),ze(s.plural)&&(d.pluralIndex=s.plural),d}mb();const uw="11.3.0";function fw(){typeof __VUE_I18N_FULL_INSTALL__!="boolean"&&(jn().__VUE_I18N_FULL_INSTALL__=!0),typeof __VUE_I18N_LEGACY_API__!="boolean"&&(jn().__VUE_I18N_LEGACY_API__=!0),typeof __INTLIFY_DROP_MESSAGE_COMPILER__!="boolean"&&(jn().__INTLIFY_DROP_MESSAGE_COMPILER__=!1),typeof __INTLIFY_PROD_DEVTOOLS__!="boolean"&&(jn().__INTLIFY_PROD_DEVTOOLS__=!1)}const pt={UNEXPECTED_RETURN_TYPE:Rb,INVALID_ARGUMENT:25,MUST_BE_CALL_SETUP_TOP:26,NOT_INSTALLED:27,REQUIRED_VALUE:28,INVALID_VALUE:29,NOT_INSTALLED_WITH_PROVIDE:31,UNEXPECTED_ERROR:32};function Et(e,...t){return yo(e,null,void 0)}const Ri=Pn("__translateVNode"),Pi=Pn("__datetimeParts"),Li=Pn("__numberParts"),td=Pn("__setPluralRules"),nd=Pn("__injectWithOption"),Ni=Pn("__dispose");function nr(e){if(!Pe(e)||Xt(e))return e;for(const t in e)if(kt(e,t))if(!t.includes("."))Pe(e[t])&&nr(e[t]);else{const n=t.split("."),s=n.length-1;let r=e,o=!1;for(let i=0;i{if("locale"in a&&"resource"in a){const{locale:l,resource:c}=a;l?(i[l]=i[l]||Oe(),Tr(c,i[l])):Tr(c,i)}else te(a)&&Tr(JSON.parse(a),i)}),r==null&&o)for(const a in i)kt(i,a)&&nr(i[a]);return i}function sd(e){return e.type}function rd(e,t,n){let s=Pe(t.messages)?t.messages:Oe();"__i18nGlobal"in n&&(s=pa(e.locale.value,{messages:s,__i18n:n.__i18nGlobal}));const r=Object.keys(s);r.length&&r.forEach(o=>{e.mergeLocaleMessage(o,s[o])});{if(Pe(t.datetimeFormats)){const o=Object.keys(t.datetimeFormats);o.length&&o.forEach(i=>{e.mergeDateTimeFormat(i,t.datetimeFormats[i])})}if(Pe(t.numberFormats)){const o=Object.keys(t.numberFormats);o.length&&o.forEach(i=>{e.mergeNumberFormat(i,t.numberFormats[i])})}}}function pc(e){return de(ir,null,e,0)}function sr(){return ar()}const hc="__INTLIFY_META__",mc=()=>[],dw=()=>!1;let gc=0;function vc(e){return((t,n,s,r)=>e(n,s,sr()||void 0,r))}const pw=()=>{const e=sr();let t=null;return e&&(t=sd(e)[hc])?{[hc]:t}:null};function ha(e={}){const{__root:t,__injectWithOption:n}=e,s=t===void 0,r=e.flatJson,o=zr?G:Xc;let i=xe(e.inheritLocale)?e.inheritLocale:!0;const a=o(t&&i?t.locale.value:te(e.locale)?e.locale:tr),l=o(t&&i?t.fallbackLocale.value:te(e.fallbackLocale)||Ge(e.fallbackLocale)||ke(e.fallbackLocale)||e.fallbackLocale===!1?e.fallbackLocale:a.value),c=o(pa(a.value,e)),u=o(ke(e.datetimeFormats)?e.datetimeFormats:{[a.value]:{}}),f=o(ke(e.numberFormats)?e.numberFormats:{[a.value]:{}});let d=t?t.missingWarn:xe(e.missingWarn)||ms(e.missingWarn)?e.missingWarn:!0,p=t?t.fallbackWarn:xe(e.fallbackWarn)||ms(e.fallbackWarn)?e.fallbackWarn:!0,b=t?t.fallbackRoot:xe(e.fallbackRoot)?e.fallbackRoot:!0,h=!!e.fallbackFormat,E=Ue(e.missing)?e.missing:null,v=Ue(e.missing)?vc(e.missing):null,w=Ue(e.postTranslation)?e.postTranslation:null,C=t?t.warnHtmlMessage:xe(e.warnHtmlMessage)?e.warnHtmlMessage:!0,S=!!e.escapeParameter;const O=t?t.modifiers:ke(e.modifiers)?e.modifiers:{};let D=e.pluralRules||t&&t.pluralRules,k;k=(()=>{s&&oc(null);const T={version:uw,locale:a.value,fallbackLocale:l.value,messages:c.value,modifiers:O,pluralRules:D,missing:v===null?void 0:v,missingWarn:d,fallbackWarn:p,fallbackFormat:h,unresolving:!0,postTranslation:w===null?void 0:w,warnHtmlMessage:C,escapeParameter:S,messageResolver:e.messageResolver,messageCompiler:e.messageCompiler,__meta:{framework:"vue"}};T.datetimeFormats=u.value,T.numberFormats=f.value,T.__datetimeFormatters=ke(k)?k.__datetimeFormatters:void 0,T.__numberFormatters=ke(k)?k.__numberFormatters:void 0;const F=Xb(T);return s&&oc(F),F})(),Is(k,a.value,l.value);function P(){return[a.value,l.value,c.value,u.value,f.value]}const q=pe({get:()=>a.value,set:T=>{k.locale=T,a.value=T}}),Y=pe({get:()=>l.value,set:T=>{k.fallbackLocale=T,l.value=T,Is(k,a.value,T)}}),B=pe(()=>c.value),ae=pe(()=>u.value),re=pe(()=>f.value);function ve(){return Ue(w)?w:null}function ce(T){w=T,k.postTranslation=T}function N(){return E}function W(T){T!==null&&(v=vc(T)),E=T,k.missing=v}const X=(T,F,ne,ue,Ee,He)=>{P();let De;try{__INTLIFY_PROD_DEVTOOLS__,s||(k.fallbackContext=t?zb():void 0),De=T(k)}finally{__INTLIFY_PROD_DEVTOOLS__,s||(k.fallbackContext=void 0)}if(ne!=="translate exists"&&ze(De)&&De===_o||ne==="translate exists"&&!De){const[At,xt]=F();return t&&b?ue(t):Ee(At)}else{if(He(De))return De;throw Et(pt.UNEXPECTED_RETURN_TYPE)}};function ge(...T){return X(F=>Reflect.apply(dc,null,[F,...T]),()=>Ii(...T),"translate",F=>Reflect.apply(F.t,F,[...T]),F=>F,F=>te(F))}function j(...T){const[F,ne,ue]=T;if(ue&&!Pe(ue))throw Et(pt.INVALID_ARGUMENT);return ge(F,ne,Qe({resolvedMessage:!0},ue||{}))}function K(...T){return X(F=>Reflect.apply(ac,null,[F,...T]),()=>xi(...T),"datetime format",F=>Reflect.apply(F.d,F,[...T]),()=>Xr,F=>te(F)||Ge(F))}function ie(...T){return X(F=>Reflect.apply(cc,null,[F,...T]),()=>Ti(...T),"number format",F=>Reflect.apply(F.n,F,[...T]),()=>Xr,F=>te(F)||Ge(F))}function Ae(T){return T.map(F=>te(F)||ze(F)||xe(F)?pc(String(F)):F)}const oe={normalize:Ae,interpolate:T=>T,type:"vnode"};function M(...T){return X(F=>{let ne;const ue=F;try{ue.processor=oe,ne=Reflect.apply(dc,null,[ue,...T])}finally{ue.processor=null}return ne},()=>Ii(...T),"translate",F=>F[Ri](...T),F=>[pc(F)],F=>Ge(F))}function ee(...T){return X(F=>Reflect.apply(cc,null,[F,...T]),()=>Ti(...T),"number format",F=>F[Li](...T),mc,F=>te(F)||Ge(F))}function J(...T){return X(F=>Reflect.apply(ac,null,[F,...T]),()=>xi(...T),"datetime format",F=>F[Pi](...T),mc,F=>te(F)||Ge(F))}function se(T){D=T,k.pluralRules=D}function ye(T,F){return X(()=>{if(!T)return!1;const ne=te(F)?F:a.value,ue=te(F)?[ne]:ki(k,l.value,ne);for(let Ee=0;Ee[T],"translate exists",ne=>Reflect.apply(ne.te,ne,[T,F]),dw,ne=>xe(ne))}function y(T){let F=null;const ne=ki(k,l.value,a.value);for(let ue=0;ue{i&&(a.value=T,k.locale=T,Is(k,a.value,l.value))}),qe(t.fallbackLocale,T=>{i&&(l.value=T,k.fallbackLocale=T,Is(k,a.value,l.value))}));const H={id:gc,locale:q,fallbackLocale:Y,get inheritLocale(){return i},set inheritLocale(T){i=T,T&&t&&(a.value=t.locale.value,l.value=t.fallbackLocale.value,Is(k,a.value,l.value))},get availableLocales(){return Object.keys(c.value).sort()},messages:B,get modifiers(){return O},get pluralRules(){return D||{}},get isGlobal(){return s},get missingWarn(){return d},set missingWarn(T){d=T,k.missingWarn=d},get fallbackWarn(){return p},set fallbackWarn(T){p=T,k.fallbackWarn=p},get fallbackRoot(){return b},set fallbackRoot(T){b=T},get fallbackFormat(){return h},set fallbackFormat(T){h=T,k.fallbackFormat=h},get warnHtmlMessage(){return C},set warnHtmlMessage(T){C=T,k.warnHtmlMessage=T},get escapeParameter(){return S},set escapeParameter(T){S=T,k.escapeParameter=T},t:ge,getLocaleMessage:R,setLocaleMessage:$,mergeLocaleMessage:V,getPostTranslationHandler:ve,setPostTranslationHandler:ce,getMissingHandler:N,setMissingHandler:W,[td]:se};return H.datetimeFormats=ae,H.numberFormats=re,H.rt=j,H.te=ye,H.tm=A,H.d=K,H.n=ie,H.getDateTimeFormat=U,H.setDateTimeFormat=m,H.mergeDateTimeFormat=g,H.getNumberFormat=x,H.setNumberFormat=L,H.mergeNumberFormat=Q,H[nd]=n,H[Ri]=M,H[Pi]=J,H[Li]=ee,H}function hw(e){const t=te(e.locale)?e.locale:tr,n=te(e.fallbackLocale)||Ge(e.fallbackLocale)||ke(e.fallbackLocale)||e.fallbackLocale===!1?e.fallbackLocale:t,s=Ue(e.missing)?e.missing:void 0,r=xe(e.silentTranslationWarn)||ms(e.silentTranslationWarn)?!e.silentTranslationWarn:!0,o=xe(e.silentFallbackWarn)||ms(e.silentFallbackWarn)?!e.silentFallbackWarn:!0,i=xe(e.fallbackRoot)?e.fallbackRoot:!0,a=!!e.formatFallbackMessages,l=ke(e.modifiers)?e.modifiers:{},c=e.pluralizationRules,u=Ue(e.postTranslation)?e.postTranslation:void 0,f=te(e.warnHtmlInMessage)?e.warnHtmlInMessage!=="off":!0,d=!!e.escapeParameterHtml,p=xe(e.sync)?e.sync:!0;let b=e.messages;if(ke(e.sharedMessages)){const O=e.sharedMessages;b=Object.keys(O).reduce((k,I)=>{const P=k[I]||(k[I]={});return Qe(P,O[I]),k},b||{})}const{__i18n:h,__root:E,__injectWithOption:v}=e,w=e.datetimeFormats,C=e.numberFormats,S=e.flatJson;return{locale:t,fallbackLocale:n,messages:b,flatJson:S,datetimeFormats:w,numberFormats:C,missing:s,missingWarn:r,fallbackWarn:o,fallbackRoot:i,fallbackFormat:a,modifiers:l,pluralRules:c,postTranslation:u,warnHtmlMessage:f,escapeParameter:d,messageResolver:e.messageResolver,inheritLocale:p,__i18n:h,__root:E,__injectWithOption:v}}function Oi(e={}){const t=ha(hw(e)),{__extender:n}=e,s={id:t.id,get locale(){return t.locale.value},set locale(r){t.locale.value=r},get fallbackLocale(){return t.fallbackLocale.value},set fallbackLocale(r){t.fallbackLocale.value=r},get messages(){return t.messages.value},get datetimeFormats(){return t.datetimeFormats.value},get numberFormats(){return t.numberFormats.value},get availableLocales(){return t.availableLocales},get missing(){return t.getMissingHandler()},set missing(r){t.setMissingHandler(r)},get silentTranslationWarn(){return xe(t.missingWarn)?!t.missingWarn:t.missingWarn},set silentTranslationWarn(r){t.missingWarn=xe(r)?!r:r},get silentFallbackWarn(){return xe(t.fallbackWarn)?!t.fallbackWarn:t.fallbackWarn},set silentFallbackWarn(r){t.fallbackWarn=xe(r)?!r:r},get modifiers(){return t.modifiers},get formatFallbackMessages(){return t.fallbackFormat},set formatFallbackMessages(r){t.fallbackFormat=r},get postTranslation(){return t.getPostTranslationHandler()},set postTranslation(r){t.setPostTranslationHandler(r)},get sync(){return t.inheritLocale},set sync(r){t.inheritLocale=r},get warnHtmlInMessage(){return t.warnHtmlMessage?"warn":"off"},set warnHtmlInMessage(r){t.warnHtmlMessage=r!=="off"},get escapeParameterHtml(){return t.escapeParameter},set escapeParameterHtml(r){t.escapeParameter=r},get pluralizationRules(){return t.pluralRules||{}},__composer:t,t(...r){return Reflect.apply(t.t,t,[...r])},rt(...r){return Reflect.apply(t.rt,t,[...r])},te(r,o){return t.te(r,o)},tm(r){return t.tm(r)},getLocaleMessage(r){return t.getLocaleMessage(r)},setLocaleMessage(r,o){t.setLocaleMessage(r,o)},mergeLocaleMessage(r,o){t.mergeLocaleMessage(r,o)},d(...r){return Reflect.apply(t.d,t,[...r])},getDateTimeFormat(r){return t.getDateTimeFormat(r)},setDateTimeFormat(r,o){t.setDateTimeFormat(r,o)},mergeDateTimeFormat(r,o){t.mergeDateTimeFormat(r,o)},n(...r){return Reflect.apply(t.n,t,[...r])},getNumberFormat(r){return t.getNumberFormat(r)},setNumberFormat(r,o){t.setNumberFormat(r,o)},mergeNumberFormat(r,o){t.mergeNumberFormat(r,o)}};return s.__extender=n,s}function mw(e,t,n){return{beforeCreate(){const s=sr();if(!s)throw Et(pt.UNEXPECTED_ERROR);const r=this.$options;if(r.i18n){const o=r.i18n;if(r.__i18n&&(o.__i18n=r.__i18n),o.__root=t,this===this.$root)this.$i18n=yc(e,o);else{o.__injectWithOption=!0,o.__extender=n.__vueI18nExtend,this.$i18n=Oi(o);const i=this.$i18n;i.__extender&&(i.__disposer=i.__extender(this.$i18n))}}else if(r.__i18n)if(this===this.$root)this.$i18n=yc(e,r);else{this.$i18n=Oi({__i18n:r.__i18n,__injectWithOption:!0,__extender:n.__vueI18nExtend,__root:t});const o=this.$i18n;o.__extender&&(o.__disposer=o.__extender(this.$i18n))}else this.$i18n=e;r.__i18nGlobal&&rd(t,r,r),this.$t=(...o)=>this.$i18n.t(...o),this.$rt=(...o)=>this.$i18n.rt(...o),this.$te=(o,i)=>this.$i18n.te(o,i),this.$d=(...o)=>this.$i18n.d(...o),this.$n=(...o)=>this.$i18n.n(...o),this.$tm=o=>this.$i18n.tm(o),n.__setInstance(s,this.$i18n)},mounted(){},unmounted(){const s=sr();if(!s)throw Et(pt.UNEXPECTED_ERROR);const r=this.$i18n;delete this.$t,delete this.$rt,delete this.$te,delete this.$d,delete this.$n,delete this.$tm,r.__disposer&&(r.__disposer(),delete r.__disposer,delete r.__extender),n.__deleteInstance(s),delete this.$i18n}}}function yc(e,t){e.locale=t.locale||e.locale,e.fallbackLocale=t.fallbackLocale||e.fallbackLocale,e.missing=t.missing||e.missing,e.silentTranslationWarn=t.silentTranslationWarn||e.silentFallbackWarn,e.silentFallbackWarn=t.silentFallbackWarn||e.silentFallbackWarn,e.formatFallbackMessages=t.formatFallbackMessages||e.formatFallbackMessages,e.postTranslation=t.postTranslation||e.postTranslation,e.warnHtmlInMessage=t.warnHtmlInMessage||e.warnHtmlInMessage,e.escapeParameterHtml=t.escapeParameterHtml||e.escapeParameterHtml,e.sync=t.sync||e.sync,e.__composer[td](t.pluralizationRules||e.pluralizationRules);const n=pa(e.locale,{messages:t.messages,__i18n:t.__i18n});return Object.keys(n).forEach(s=>e.mergeLocaleMessage(s,n[s])),t.datetimeFormats&&Object.keys(t.datetimeFormats).forEach(s=>e.mergeDateTimeFormat(s,t.datetimeFormats[s])),t.numberFormats&&Object.keys(t.numberFormats).forEach(s=>e.mergeNumberFormat(s,t.numberFormats[s])),e}const ma={tag:{type:[String,Object]},locale:{type:String},scope:{type:String,validator:e=>e==="parent"||e==="global",default:"parent"},i18n:{type:Object}};function gw({slots:e},t){return t.length===1&&t[0]==="default"?(e.default?e.default():[]).reduce((s,r)=>[...s,...r.type===Be?r.children:[r]],[]):t.reduce((n,s)=>{const r=e[s];return r&&(n[s]=r()),n},Oe())}function od(){return Be}const vw=Ze({name:"i18n-t",props:Qe({keypath:{type:String,required:!0},plural:{type:[Number,String],validator:e=>ze(e)||!isNaN(e)}},ma),setup(e,t){const{slots:n,attrs:s}=t,r=e.i18n||ga({useScope:e.scope,__useComponent:!0});return()=>{const o=Object.keys(n).filter(f=>f[0]!=="_"),i=Oe();e.locale&&(i.locale=e.locale),e.plural!==void 0&&(i.plural=te(e.plural)?+e.plural:e.plural);const a=gw(t,o),l=r[Ri](e.keypath,a,i),c=Qe(Oe(),s),u=te(e.tag)||Pe(e.tag)?e.tag:od();return cr(u,c,l)}}}),_c=vw;function yw(e){return Ge(e)&&!te(e[0])}function id(e,t,n,s){const{slots:r,attrs:o}=t;return()=>{const i={part:!0};let a=Oe();e.locale&&(i.locale=e.locale),te(e.format)?i.key=e.format:Pe(e.format)&&(te(e.format.key)&&(i.key=e.format.key),a=Object.keys(e.format).reduce((d,p)=>n.includes(p)?Qe(Oe(),d,{[p]:e.format[p]}):d,Oe()));const l=s(e.value,i,a);let c=[i.key];Ge(l)?c=l.map((d,p)=>{const b=r[d.type],h=b?b({[d.type]:d.value,index:p,parts:l}):[d.value];return yw(h)&&(h[0].key=`${d.type}-${p}`),h}):te(l)&&(c=[l]);const u=Qe(Oe(),o),f=te(e.tag)||Pe(e.tag)?e.tag:od();return cr(f,u,c)}}const _w=Ze({name:"i18n-n",props:Qe({value:{type:Number,required:!0},format:{type:[String,Object]}},ma),setup(e,t){const n=e.i18n||ga({useScope:e.scope,__useComponent:!0});return id(e,t,Qf,(...s)=>n[Li](...s))}}),bc=_w;function bw(e,t){const n=e;if(e.mode==="composition")return n.__getInstance(t)||e.global;{const s=n.__getInstance(t);return s!=null?s.__composer:e.global.__composer}}function ww(e){const t=i=>{const{instance:a,value:l}=i;if(!a||!a.$)throw Et(pt.UNEXPECTED_ERROR);const c=bw(e,a.$),u=wc(l);return[Reflect.apply(c.t,c,[...Ec(u)]),c]};return{created:(i,a)=>{const[l,c]=t(a);zr&&(i.__i18nWatcher=qe(c.locale,()=>{a.instance&&a.instance.$forceUpdate()})),i.__composer=c,i.textContent=l},unmounted:i=>{zr&&i.__i18nWatcher&&(i.__i18nWatcher(),i.__i18nWatcher=void 0,delete i.__i18nWatcher),i.__composer&&(i.__composer=void 0,delete i.__composer)},beforeUpdate:(i,{value:a})=>{if(i.__composer){const l=i.__composer,c=wc(a);i.textContent=Reflect.apply(l.t,l,[...Ec(c)])}},getSSRProps:i=>{const[a]=t(i);return{textContent:a}}}}function wc(e){if(te(e))return{path:e};if(ke(e)){if(!("path"in e))throw Et(pt.REQUIRED_VALUE,"path");return e}else throw Et(pt.INVALID_VALUE)}function Ec(e){const{path:t,locale:n,args:s,choice:r,plural:o}=e,i={},a=s||{};return te(n)&&(i.locale=n),ze(r)&&(i.plural=r),ze(o)&&(i.plural=o),[t,a,i]}function Ew(e,t,...n){const s=ke(n[0])?n[0]:{};(!xe(s.globalInstall)||s.globalInstall)&&([_c.name,"I18nT"].forEach(o=>e.component(o,_c)),[bc.name,"I18nN"].forEach(o=>e.component(o,bc)),[Sc.name,"I18nD"].forEach(o=>e.component(o,Sc))),e.directive("t",ww(t))}const Aw=Pn("global-vue-i18n");function Sw(e={}){const t=__VUE_I18N_LEGACY_API__&&xe(e.legacy)?e.legacy:__VUE_I18N_LEGACY_API__,n=xe(e.globalInjection)?e.globalInjection:!0,s=new Map,[r,o]=Cw(e,t),i=Pn("");function a(f){return s.get(f)||null}function l(f,d){s.set(f,d)}function c(f){s.delete(f)}const u={get mode(){return __VUE_I18N_LEGACY_API__&&t?"legacy":"composition"},async install(f,...d){if(f.__VUE_I18N_SYMBOL__=i,f.provide(f.__VUE_I18N_SYMBOL__,u),ke(d[0])){const h=d[0];u.__composerExtend=h.__composerExtend,u.__vueI18nExtend=h.__vueI18nExtend}let p=null;!t&&n&&(p=Nw(f,u.global)),__VUE_I18N_FULL_INSTALL__&&Ew(f,u,...d),__VUE_I18N_LEGACY_API__&&t&&f.mixin(mw(o,o.__composer,u));const b=f.unmount;f.unmount=()=>{p&&p(),u.dispose(),b()}},get global(){return o},dispose(){r.stop()},__instances:s,__getInstance:a,__setInstance:l,__deleteInstance:c};return u}function ga(e={}){const t=sr();if(t==null)throw Et(pt.MUST_BE_CALL_SETUP_TOP);if(!t.isCE&&t.appContext.app!=null&&!t.appContext.app.__VUE_I18N_SYMBOL__)throw Et(pt.NOT_INSTALLED);const n=kw(t),s=Tw(n),r=sd(t),o=xw(e,r);if(o==="global")return rd(s,e,r),s;if(o==="parent"){let l=Iw(n,t,e.__useComponent);return l==null&&(l=s),l}const i=n;let a=i.__getInstance(t);if(a==null){const l=Qe({},e);"__i18n"in r&&(l.__i18n=r.__i18n),s&&(l.__root=s),a=ha(l),i.__composerExtend&&(a[Ni]=i.__composerExtend(a)),Pw(i,t,a),i.__setInstance(t,a)}return a}function Cw(e,t){const n=Bi(),s=__VUE_I18N_LEGACY_API__&&t?n.run(()=>Oi(e)):n.run(()=>ha(e));if(s==null)throw Et(pt.UNEXPECTED_ERROR);return[n,s]}function kw(e){const t=wt(e.isCE?Aw:e.appContext.app.__VUE_I18N_SYMBOL__);if(!t)throw Et(e.isCE?pt.NOT_INSTALLED_WITH_PROVIDE:pt.UNEXPECTED_ERROR);return t}function xw(e,t){return vo(e)?"__i18n"in t?"local":"global":e.useScope?e.useScope:"local"}function Tw(e){return e.mode==="composition"?e.global:e.global.__composer}function Iw(e,t,n=!1){let s=null;const r=t.root;let o=Rw(t,n);for(;o!=null;){const i=e;if(e.mode==="composition")s=i.__getInstance(o);else if(__VUE_I18N_LEGACY_API__){const a=i.__getInstance(o);a!=null&&(s=a.__composer,n&&s&&!s[nd]&&(s=null))}if(s!=null||r===o)break;o=o.parent}return s}function Rw(e,t=!1){return e==null?null:t&&e.vnode.ctx||e.parent}function Pw(e,t,n){ht(()=>{},t),Xi(()=>{const s=n;e.__deleteInstance(t);const r=s[Ni];r&&(r(),delete s[Ni])},t)}const Lw=["locale","fallbackLocale","availableLocales"],Ac=["t","rt","d","n","tm","te"];function Nw(e,t){const n=Object.create(null);return Lw.forEach(r=>{const o=Object.getOwnPropertyDescriptor(t,r);if(!o)throw Et(pt.UNEXPECTED_ERROR);const i=Ve(o.value)?{get(){return o.value.value},set(a){o.value.value=a}}:{get(){return o.get&&o.get()}};Object.defineProperty(n,r,i)}),e.config.globalProperties.$i18n=n,Ac.forEach(r=>{const o=Object.getOwnPropertyDescriptor(t,r);if(!o||!o.value)throw Et(pt.UNEXPECTED_ERROR);Object.defineProperty(e.config.globalProperties,`$${r}`,o)}),()=>{delete e.config.globalProperties.$i18n,Ac.forEach(r=>{delete e.config.globalProperties[`$${r}`]})}}const Ow=Ze({name:"i18n-d",props:Qe({value:{type:[Number,Date],required:!0},format:{type:[String,Object]}},ma),setup(e,t){const n=e.i18n||ga({useScope:e.scope,__useComponent:!0});return id(e,t,Jf,(...s)=>n[Pi](...s))}}),Sc=Ow;fw();jb(Cb);Kb(Vb);Gb(ki);if(__INTLIFY_PROD_DEVTOOLS__){const e=jn();e.__INTLIFY__=!0,kb(e.__INTLIFY_DEVTOOLS_GLOBAL_HOOK__)}const ad={cancel:"Cancel",save:"Save",close:"Close",copy:"Copy",copied:"Copied",copiedBang:"Copied!",loading:"Loading...",retry:"Retry",refresh:"Refresh",install:"Install",installing:"Installing...",uninstall:"Uninstall",uninstalling:"Uninstalling...",start:"Start",stop:"Stop",restart:"Restart",launch:"Launch",starting:"Starting...",stopping:"Stopping...",send:"Send",sending:"Sending...",back:"Back",done:"Done",manage:"Manage",connect:"Connect",connecting:"Connecting...",disconnect:"Disconnect",running:"running",stopped:"stopped",exited:"exited",healthy:"Healthy",elevated:"Elevated",critical:"Critical",connected:"Connected",disconnected:"Disconnected",active:"Active",inactive:"Inactive",synced:"Synced",enabled:"Enabled",disabled:"Disabled",dismiss:"Dismiss",apply:"Apply",configure:"Configure",export:"Export",delete:"Delete",remove:"Remove",error:"Error",version:"Version",status:"Status",category:"Category",developer:"Developer",license:"License",never:"Never",notAvailable:"Not Available",goBack:"Go back",skipToContent:"Skip to main content",continue:"Continue",verify:"Verify",create:"Create",restore:"Restore",disabling:"Disabling...",creating:"Creating...",restoring:"Restoring...",manageUpdates:"Manage Updates",enableAll:"Enable All",networkDiagnostics:"Network Diagnostics",network:"Network",saveConfiguration:"Save Configuration",sendTest:"Send Test"},ld={title:"Welcome to Archipelago",setupTitle:"Set Up Your Node",twoFactorTitle:"Two-Factor Authentication",password:"Password",confirmPassword:"Confirm Password",enterPasswordPlaceholder:"Enter your password",enterPasswordSetup:"Enter a password (min 8 characters)",confirmPasswordPlaceholder:"Confirm your password",setupButton:"Set Up Node",settingUp:"Setting up...",loginButton:"Login",loggingIn:"Logging in...",verifyButton:"Verify",verifying:"Verifying...",useAuthCode:"Use authenticator code",useBackupCode:"Use a backup code instead",totpInstruction:"Enter the 6-digit code from your authenticator app",totpPlaceholder:"000000",backupCodePlaceholder:"XXXX-XXXX",serverStarting:"Server starting up...",replayIntro:"Replay Intro",onboarding:"Onboarding",resetting:"Resetting...",recoveryNote:"Password recovery requires SSH access to the server.",errorMinLength:"Password must be at least 8 characters",errorMismatch:"Passwords do not match",errorServerStarting:"Server is starting up. Please try again in a moment.",errorSetupFailed:"Setup failed. Please try again.",errorLoginFailed:"Login failed. Please check your password.",errorInvalidCode:"Invalid code. Please try again.",totpLabel:"Two-factor authentication code"},cd={title:"Welcome Noderunner",subtitle:"Here's an overview of your sovereign life",dashboardTab:"Dashboard",setupTab:"Setup",myApps:"My Apps",myAppsDesc:"Manage your installed applications",cloud:"Cloud",cloudDesc:"Cloud services and storage",network:"Network",networkDesc:"Network infrastructure and Web3 services",web5:"Web5",web5Desc:"Decentralized identity and data protocols",system:"System",quickStartGoals:"Quick Start Goals",quickStartDesc:"Not sure where to start? Try a guided setup.",installed:"Installed",runningLabel:"Running",storageUsed:"Storage Used",folders:"Folders",servicesStatus:"Services Status",connectivity:"Connectivity",runningApps:"Running Apps",didStatus:"DID Status",dwnSync:"DWN Sync",credentials:"Credentials",cpu:"CPU",ram:"RAM",disk:"Disk",browseStore:"Browse Store",manageApps:"Manage Apps",viewFolders:"View Folders",uploadFiles:"Upload Files",manageNetwork:"Manage Network",manageWeb5:"Manage Web5",openAI:"Open AI Assistant",noApps:"No Apps",allRunning:"All Running",systemMonitoring:"System monitoring",updateAvailable:"Update Available: v{version}",updateNow:"Update Now",goToApps:"Go to Apps",goToCloud:"Go to Cloud",goToNetwork:"Go to Network",goToWeb5:"Go to Web5",goToSettings:"Go to Settings"},ud={title:"My Apps",subtitle:"Manage your installed applications",searchPlaceholder:"Search installed apps...",noAppsTitle:"No Apps Installed",noAppsMessage:"Get started by browsing the app store",browseAppStore:"Browse App Store",noResults:'No apps matching "{query}"',uninstallTitle:"Uninstall App?",uninstallConfirm:"Are you sure you want to uninstall {name}? This will remove the app and stop its container.",dismissError:"Dismiss error",searchLabel:"Search installed apps"},fd={title:"Settings",subtitle:"Configure your Archipelago experience",account:"Account",interfaceMode:"Interface Mode",claudeAuth:"Claude Authentication",aiDataAccess:"AI Data Access",serverName:"Server Name",sessionStatus:"Session Status",yourDid:"Your DID",onionAddress:"Node .onion Address",loggedIn:"Currently logged in",didHelper:"Decentralized identifier for passwordless auth",onionHelper:"Onion address for node interface and peer discovery over Tor",changePassword:"Change Password",enable2fa:"Enable 2FA",disable2fa:"Disable 2FA",logout:"Logout",loggingOut:"Logging out...",twoFactorAuth:"Two-Factor Authentication",twoFaProtect:"Protect your account with an authenticator app",changePasswordTitle:"Change Password",changePasswordDesc:"Updates both web login and SSH access. Use a strong password (12+ chars, upper, lower, digit, special).",currentPassword:"Current Password",newPassword:"New Password",confirmNewPassword:"Confirm New Password",passwordPlaceholder:"12+ chars, upper, lower, digit, special",updateSshCheckbox:"Also update SSH password (recommended)",updatePassword:"Update Password",updatingPassword:"Updating...",setup2faTitle:"Two-Factor Authentication",setup2faPasswordPrompt:"Enter your password to begin setup.",scanQrCode:"Scan QR Code",scanQrInstruction:"Scan this QR code with your authenticator app (Google Authenticator, Authy, etc.), then enter the 6-digit code.",manualEntryKey:"Manual entry key:",verifyAndEnable:"Verify & Enable",saveBackupCodes:"Save Your Backup Codes",backupCodesInstruction:"Store these codes safely. Each can be used once if you lose access to your authenticator app.",copyAllCodes:"Copy All Codes",disable2faTitle:"Disable Two-Factor Authentication",disable2faDesc:"Enter your password and a current TOTP code to disable 2FA.",authenticatorCode:"Authenticator Code",webhooks:"Webhooks",webhooksDesc:"Get notified when important events happen on your node",webhookUrl:"Webhook URL",webhookUrlPlaceholder:"https://example.com/webhook",webhookSecret:"Secret (for HMAC signing)",webhookSecretPlaceholder:"Optional shared secret",webhookEvents:"Events",containerCrash:"Container Crash",updateAvailableEvent:"Update Available",diskWarning:"Disk Warning",backupComplete:"Backup Complete",saveWebhook:"Save",savingWebhook:"Saving...",testWebhook:"Test",testingWebhook:"Testing...",webhookSaved:"Webhook configuration saved",webhookTestSent:"Test webhook sent successfully",systemUpdates:"System Updates",backup:"Backup & Restore",backupDesc:"Back up your node data to external storage",createBackup:"Create Backup",creatingBackup:"Creating...",restoreBackup:"Restore Backup",deleteBackup:"Delete backup",backupCreated:"Backup created successfully",sendMessage:"Send Message",sendMessageTitle:"Send Broadcast Message",messagePlaceholder:"Enter your message...",messageSent:"Message sent",claudeConnected:"Connected to Claude",claudeDisconnected:"Not connected",claudeApiKey:"API Key",claudeApiKeyPlaceholder:"Enter your Anthropic API key",claudeSave:"Save Key",advancedMode:"Advanced Mode",beginnerMode:"Beginner Mode",advancedModeDesc:"Show all system controls and developer tools",beginnerModeDesc:"Simplified interface with guided experience",networkSettings:"Network Settings",torEnabled:"Tor Enabled",torAddress:"Tor Address",interfaceModeDesc:"Choose how you want to interact with your node.",claudeAuthDesc:"Connect your Claude Max account to enable AI chat features.",connectionStatus:"Connection Status",notConnected:"Not connected",reAuthenticate:"Re-authenticate",loginWithClaude:"Login with Claude",aiDataAccessDesc:"Control what data the AI assistant can see. All categories are off by default.",enableAllDesc:"Grant access to all data categories at once",systemUpdatesDesc:"Check for and install software updates",webhookNotifications:"Webhook Notifications",webhookNotificationsDesc:"Get push notifications for critical events via webhook",enableWebhooks:"Enable webhooks",disableWebhooks:"Disable webhooks",webhookUrlLabel:"Webhook URL",webhookSecretLabel:"Secret (optional, for HMAC-SHA256 signing)",eventsToNotify:"Events to notify",containerCrashDesc:"A running container stops unexpectedly",updateAvailableDesc:"A new system or app update is ready",diskWarningDesc:"Disk usage exceeds warning threshold",backupCompleteDesc:"A scheduled or manual backup finishes",backupRestoreDesc:"Encrypted backups of your identity, settings, and data",loadingBackups:"Loading backups...",noBackups:"No backups yet. Create one to protect your node data.",systemBackup:"System Backup",createEncryptedBackup:"Create Encrypted Backup",encryptionPassphrase:"Encryption Passphrase",enterPassphrase:"Enter a strong passphrase",descriptionOptional:"Description (optional)",descriptionPlaceholder:"e.g. Before update",restoreBackupTitle:"Restore Backup",restoreWarning:"This will overwrite current node data. Make sure you have the correct passphrase.",enterBackupPassphrase:"Enter backup passphrase",networkDesc:"Network connectivity, UPnP, and diagnostics",webhookSecretPlaceholderFull:"Shared secret for payload signing",backupCreatedSuccess:"Backup created successfully",backupCreateFailed:"Failed to create backup",backupVerifiedOk:"Backup verified — integrity OK",backupVerifyFailed:"Verification failed: {error}",backupVerifyRequestFailed:"Verification request failed",backupRestored:"Backup restored. Restart may be needed.",backupRestoreFailed:"Restore failed — check passphrase",backupDeleted:"Backup deleted",backupDeleteFailed:"Failed to delete backup",noUsbDrives:"No mounted USB drives found. Insert and mount a USB drive first.",backupCopiedToUsb:"Backup copied to {path}",backupUsbFailed:"Failed to copy backup to USB",deleteBackupConfirm:"Delete this backup permanently?",verifyPassphrasePrompt:"Enter backup passphrase to verify:",webhookSaveFailed:"Failed to save webhook configuration",webhookTestFailed:"Test failed: webhook not sent",webhookSendFailed:"Failed to send test webhook",passwordAllFieldsRequired:"All fields are required",passwordMismatch:"New passwords do not match",passwordUpdatedSuccess:"Password updated successfully. Use the new password for login and SSH.",passwordChangeFailed:"Failed to change password",passwordMinLength:"Password must be at least 12 characters",passwordNeedUppercase:"Password must contain at least one uppercase letter",passwordNeedLowercase:"Password must contain at least one lowercase letter",passwordNeedDigit:"Password must contain at least one digit",passwordNeedSpecial:"Password must contain at least one special character (!@#$%^&* etc.)",setupFailed:"Setup failed",verificationFailed:"Verification failed",disableFailed:"Failed to disable 2FA",copyToUsb:"Copy to USB",diskSpaceWarning:"Disk Space Warning",modeEasy:"Easy",modeEasyDesc:"Goal-based interface. Choose what you want to do, and the system handles the rest.",modePro:"Pro",modeProDesc:"Full control over all services. Configure everything manually with all technical details.",modeChat:"AIUI",modeChatDesc:"Conversational AI interface. Manage your node through natural language. Coming soon."},dd={title:"App Store",subtitle:"Discover and install apps for your new sovereign life",curatedTab:"Curated",communityTab:"Community",nostrCommunityTab:"Nostr Community",filterByCategory:"Filter by Category",searchPlaceholder:"Search apps...",downloading:"Downloading...",alreadyInstalled:"Already Installed",queryingRelays:"Querying Nostr relays for apps...",noCommunityApps:"No community apps discovered yet.",noResults:'No apps found in {category} matching "{query}"',noResultsCategory:"No apps found in {category}",noResultsSearch:'No apps matching "{query}"',all:"All",community:"Community",commerce:"Commerce",money:"Money",data:"Data",homeCategory:"Home",auto:"Auto",networking:"Networking",other:"Other",searchApps:"Search apps",percentComplete:"{percent}% complete"},pd={mainNav:"Main navigation",mobileNav:"Mobile navigation"},hd={close:"Close",aiuiConnected:"AIUI connected",closeAssistant:"Close AI Assistant",loadingAssistant:"Loading AI assistant...",aiAssistant:"AI Assistant",notConfigured:"AI Assistant needs to be enabled before use.",deployCta:"Go to Settings to configure your AI provider API key, then return here to start chatting."},md={title:"Web5",subtitle:"Decentralized identity and data protocols",profitsHelper:"Earn networking profits by hosting decentralized services",networkingProfits:"Networking Profits",didStatus:"DID Status",walletConnection:"Wallet Connection",wallet:"Wallet",walletSubtitle:"On-chain, Lightning & Ecash",nostrRelays:"Nostr Relays",connectedNodes:"Connected Nodes",bitcoinDomains:"Bitcoin Domain Names",domainsSubtitle:"NIP-05 verified identities",copyDid:"Copy",viewDidDocument:"View",createDid:"Create DID",creatingDid:"Creating...",manageDomains:"Manage Domains",relaysConnected:"{count} connected",peersKnown:"{count} peer(s) known",findNodes:"Find Nodes",sendMessage:"Send Message",sendMessageTitle:"Send Message (over Tor)",to:"To",selectPeer:"Select a peer...",message:"Message",messagePlaceholder:"Type your message...",didDocument:"DID Document",addContent:"Add Content",addContentTitle:"Add Content",createIdentity:"Create Identity",createIdentityTitle:"Create Identity",deleteIdentity:"Delete Identity",deleteIdentityTitle:"Delete Identity",sendBitcoin:"Send Bitcoin",sendBitcoinTitle:"Send Bitcoin",receiveBitcoin:"Receive Bitcoin",receiveBitcoinTitle:"Receive Bitcoin",domains:"Domains",domainsTitle:"Domains",relays:"Relays",relaysTitle:"Relays",totalEarned:"Total Earned",monthlyAvg:"Monthly Avg",ecashBalance:"Ecash Balance",onChain:"On-chain",lightning:"Lightning",ecash:"Ecash",identityName:"Identity Name",identityNamePlaceholder:"Enter identity name",contentTitle:"Title",contentTitlePlaceholder:"Enter content title",amount:"Amount",amountPlaceholder:"Enter amount in sats",address:"Address",addressPlaceholder:"Enter Bitcoin address",deleteIdentityConfirm:"Are you sure you want to delete this identity? This action cannot be undone.",confirm:"Confirm",noRelays:"No relays connected",noDomains:"No domains configured",addRelay:"Add Relay",addDomain:"Add Domain",relayUrl:"Relay URL",relayUrlPlaceholder:"wss://relay.example.com",domainName:"Domain Name",domainNamePlaceholder:"user{'@'}example.com",peerNodesDescription:"Peer nodes discovered via Nostr. Messages sent over Tor.",nodeVisibility:"Node Visibility",nodeVisibilityDesc:"Control how other nodes can discover you",yourTorAddress:"Your Tor address",discoverableWarning:"Making your node discoverable lets other Archipelago users find and connect with you.",noPeers:"No peers yet. Add a peer manually or use Discover to find nodes on Nostr.",noMessages:"No messages yet. Messages from peers will appear here.",noRequests:"No pending connection requests.",accept:"Accept",reject:"Reject",discovering:"Discovering...",discoverNodes:"Discover Nodes on Nostr",refreshMessages:"Refresh Messages",refreshRequests:"Refresh Requests",torServices:"Tor Services",torServicesDesc:"Hidden services exposing your apps over Tor",noTorServices:"No Tor hidden services configured.",content:"Content",contentDesc:"Share and browse content with peers over Tor",noSharedContent:"No shared content",addFilesToShare:"Add files to share with connected peers.",browse:"Browse",connectingToPeer:"Connecting to peer over Tor...",selectPeerToBrowse:"Select a peer to browse",choosePeerDesc:"Choose a connected peer to see their shared content.",peerNoContent:"This peer has no shared content.",identities:"Identities",identitiesDesc:"Sovereign digital identities (DID:key)",noIdentities:"No identities yet",createFirstIdentity:"Create your first sovereign digital identity.",deleting:"Deleting...",decentralizedWebNode:"Decentralized Web Node",dwnDescription:"Personal data store with DID-based access control",manageDwn:"Manage DWN",syncing:"Syncing...",syncNow:"Sync Now",verifiableCredentials:"Verifiable Credentials",verifiableCredentialsDesc:"Issue and manage W3C Verifiable Credentials",noCredentials:"No credentials issued yet",messageSent:"Message sent over Tor!",failedToSend:"Failed to send",pasteInvoice:"Paste a Lightning invoice (BOLT11)",enterBitcoinAddress:"Enter a Bitcoin address",sendFailed:"Send failed",broadcastViaHwWallet:"Broadcast via hardware wallet",broadcastFailed:"Broadcast failed",psbtCopied:"PSBT copied!",enterAmount:"Enter an amount",pasteEcashToken:"Paste an ecash token",receiveFailed:"Receive failed",ecashTokenCopied:"Ecash token copied",contentAdded:"Content added",failedToAddContent:"Failed to add content",contentRemoved:"Content removed",failedToRemoveContent:"Failed to remove content",failedToUpdatePricing:"Failed to update pricing",failedToUpdatePrice:"Failed to update price",failedToConnectPeer:"Failed to connect to peer",onionAddressCopied:"Onion address copied",streamUrlCopied:"Stream URL copied",playerError:"Unable to load media. The content may only be accessible over Tor.",connectionAccepted:"Connection accepted",failedToAcceptRequest:"Failed to accept request",requestRejected:"Request rejected",failedToRejectRequest:"Failed to reject request",visibilitySetTo:"Visibility set to {level}",failedToUpdateVisibility:"Failed to update visibility",didCopied:"DID copied to clipboard",defaultIdentityUpdated:"Default identity updated",failedToSetDefault:"Failed to set default",identityCreated:"Identity created",failedToCreateIdentity:"Failed to create identity",identityDeleted:"Identity deleted",failedToDeleteIdentity:"Failed to delete identity",registrationFailed:"Registration failed",removeFailed:"Remove failed",failedToAddRelay:"Failed to add relay",failedToRemoveRelay:"Failed to remove relay",failedToToggleRelay:"Failed to toggle relay",downloadUrlCopied:"Download URL copied",hardwareWalletDetected:"Hardware Wallet Detected",namesRegistered:"Names Registered",expiringSoon:"Expiring Soon",nostrRelaysDesc:"Decentralized social networking relays",relaysConnectedLabel:"Relays Connected",totalRelays:"Total Relays",freeAccessDesc:"Available to all peers for free",peersOnlyAccessDesc:"Available only to connected peers",signWithHwWallet:"Sign with Hardware Wallet",createsPsbt:"Creates a PSBT for external signing",generateFreshAddress:"Generate a fresh Bitcoin address",registerNewName:"Register New Name",verifyNip05:"Verify NIP-05",peers:"Peers",messages:"Messages",requests:"Requests",myContent:"My Content",browsePeers:"Browse Peers",verified:"Verified",invalid:"Invalid",stream:"Stream",download:"Download"},gd={backToApps:"Back to My Apps",backToStore:"Back to App Store",screenshots:"Screenshots",screenshotPlaceholder:"Screenshot placeholders - images coming soon",about:"About {name}",features:"Features",information:"Information",requirements:"Requirements",ram:"RAM",ramDesc:"Minimum 512MB",storage:"Storage",storageDesc:"~100MB",links:"Links",website:"Website",sourceCode:"Source Code",documentation:"Documentation",services:"Services",guardian:"Guardian",gateway:"Gateway",access:"Access",lan:"LAN",tor:"Tor",requiresTor:"Requires Tor Browser",channels:"Channels",uninstallTitle:"Uninstall App?",uninstallConfirm:"Are you sure you want to uninstall {name}? This will remove the app and stop its container.",notFoundTitle:"App Not Found",notFoundMessage:"The requested application could not be found",installed:"Installed",noLaunchUrl:"No launch URL available for this app yet"},vd={back:"Back",subtitle:"Container details and management",containerInfo:"Container Information",actions:"Actions",logs:"Logs",containerId:"Container ID",image:"Image",state:"State",created:"Created",startContainer:"Start Container",stopContainer:"Stop Container",loadingLogs:"Loading logs...",noLogs:"No logs available"},yd={backToStore:"Back to App Store",screenshots:"Screenshots",screenshotPlaceholder:"Screenshot placeholders - images coming soon",about:"About {name}",features:"Features",information:"Information",requirements:"Requirements",noRequirements:"No additional dependencies required",installRequirements:"Install Requirements",links:"Links",downloadPackage:"Download Package",installed:"Installed",notInstalled:"Not Installed",open:"Open",loadingDetails:"Loading app details...",notFoundTitle:"App Not Found",notFoundMessage:"The requested application could not be found in the marketplace",installFailed:"Installation Failed",depRunning:"Running",depStopped:"Installed but stopped",depNotInstalled:"Not installed"},_d={backToGoals:"Back to Goals",notFound:"Goal not found.",stepOf:"Step {current} of {total}",notStarted:"Not Started",inProgress:"In Progress",completed:"Completed",syncTitle:"Sovereignty takes a little patience",syncMessage:"Your Bitcoin node is syncing the entire blockchain so you don't have to trust anyone else. This takes 2-3 days on first run. Meanwhile, you can explore your node, set up your identity, or back up your keys.",installApp:"Install {name}",openAndConfigure:"Open & Configure",iveDoneThis:"I've Done This",complete:"Complete",allSet:"All Set!",goalReady:"{title} is ready to go.",viewMyServices:"View My Services"},bd={title:"Monitoring",subtitle:"Real-time system metrics and container resource usage",cpuUsage:"CPU Usage (%)",memoryUsage:"Memory Usage (%)",networkIo:"Network I/O (bytes)",rpcLatency:"RPC Latency (ms)",alertHistory:"Alert History",hideConfig:"Hide Config",noAlerts:"No alerts fired",containerResources:"Container Resources",noContainerMetrics:"No container metrics available",systemHealth:"System Health",load:"Load:",exportCsv:"Export CSV",exportJson:"Export JSON",diskUsage:"Disk Usage",ramUsage:"RAM Usage",containerCrash:"Container Crash",rpcLatencySpike:"RPC Latency Spike",sslCertExpiry:"SSL Cert Expiry",refreshFooter:"Refreshing every 5 seconds",wsConnections:"WS connections: {count}",cpu:"CPU",memory:"Memory",network:"Network"},wd={title:"System Update",subtitle:"Manage software updates for your Archipelago node",currentSystem:"Current System",updateAvailable:"Update Available",upToDate:"System is up to date",downloading:"Downloading Update...",applying:"Applying Update...",updateSchedule:"Update Schedule",actions:"Actions",lastChecked:"Last Checked",new:"New",changelog:"Changelog",componentsToUpdate:"{count} component(s) to update",manualOnly:"Manual Only",manualOnlyDesc:"Never check automatically. You control when to check and install updates.",dailyCheck:"Daily Check",dailyCheckDesc:"Check for updates once per day. You decide when to install.",autoApply:"Auto-Apply",autoApplyDesc:"Check daily and automatically install updates at 3 AM. Service restarts as needed.",downloadUpdate:"Download Update",applyUpdate:"Apply Update",checkForUpdates:"Check for Updates",checking:"Checking...",rollback:"Rollback to Previous",backToSettings:"Back to Settings",percentComplete:"{percent}% complete",applyWarning:"Installing components and restarting services. Do not power off.",applyTitle:"Apply Update?",applyMessage:"The backend service will restart. This may take a moment.",rollbackTitle:"Rollback Version?",rollbackMessage:"This will restore the previous version. The backend service will restart.",applyNow:"Apply Now",rollbackButton:"Rollback",upToDateMessage:"Your system is up to date. No updates available. Your system is running the latest version.",checkFailed:"Failed to check for updates. Check your internet connection.",downloadSuccess:"Downloaded {count} component(s) ({size}MB)",downloadFailed:"Download failed. Please try again.",applySuccess:"Update applied. The service will restart momentarily.",applyFailed:"Failed to apply update. You can try again or rollback.",rollbackSuccess:"Rolled back to previous version. Service will restart.",rollbackFailed:"Rollback failed."},Ed={pressEsc:"Press ESC to exit",online:"Online",offline:"Offline",escHint:"Press ESC to exit apps",navHint:"Use arrow keys to navigate"},Ad={title:"Archipelago Recovery",subtitle:"Kiosk failsafe — no authentication required",serverAddress:"Server Address",webUi:"Web UI: http://{address}",scanForMobile:"Scan for mobile access",backend:"Backend",unreachable:"Unreachable",containers:"Containers",goToLogin:"Go to Login",lastChecked:"Last checked: {time}"},Sd={common:ad,login:ld,home:cd,apps:ud,settings:fd,marketplace:dd,dashboard:pd,chat:hd,web5:md,appDetails:gd,containerDetails:vd,marketplaceDetails:yd,goalDetail:_d,monitoring:bd,systemUpdate:wd,kiosk:Ed,kioskRecovery:Ad},Dw=Object.freeze(Object.defineProperty({__proto__:null,appDetails:gd,apps:ud,chat:hd,common:ad,containerDetails:vd,dashboard:pd,default:Sd,goalDetail:_d,home:cd,kiosk:Ed,kioskRecovery:Ad,login:ld,marketplace:dd,marketplaceDetails:yd,monitoring:bd,settings:fd,systemUpdate:wd,web5:md},Symbol.toStringTag,{value:"Module"})),Kw=[{code:"en",name:"English",flag:"🇬🇧"},{code:"es",name:"Español",flag:"🇪🇸"}],Ir=typeof localStorage<"u"?localStorage.getItem("neode_locale"):null,Ls=Sw({legacy:!1,locale:Ir||"en",fallbackLocale:"en",messages:{en:Sd}});async function Mw(e){if(e==="en"){Ls.global.locale="en",localStorage.setItem("neode_locale","en");return}if(!Ls.global.availableLocales.includes(e)){const t=await O_(Object.assign({"./locales/en.json":()=>_e(()=>Promise.resolve().then(()=>Dw),void 0),"./locales/es.json":()=>_e(()=>import("./es-BeSu-8Qq.js"),[])}),`./locales/${e}.json`,3);Ls.global.setLocaleMessage(e,t.default)}Ls.global.locale=e,localStorage.setItem("neode_locale",e)}Ir&&Ir!=="en"&&Mw(Ir);const bo=Qh(N_),Fw=tm();bo.use(Fw);bo.use(zn);bo.use(Ls);bo.mount("#app");export{Qn as $,Ot as A,Ne as B,wg as C,Se as D,he as E,Be as F,be as G,Xu as H,Qu as I,kn as J,Rg as K,Tg as L,Ww as M,Bw as N,Xi as O,Gt as P,qr as Q,Js as R,T_ as S,tt as T,cg as U,pg as V,jw as W,Jn as X,_s as Y,Hw as Z,mg as _,_ as a,ur as a0,Nt as a1,Gh as a2,Vw as a3,x_ as a4,_e as a5,Kw as a6,Mw as a7,A_ as a8,I0 as a9,Tn as b,Z as c,Ze as d,gg as e,$e as f,Yi as g,de as h,Ye as i,pe as j,Il as k,yu as l,dt as m,Tt as n,ht as o,$w as p,z as q,G as r,Rl as s,Dt as t,gf as u,Uw as v,qe as w,ho as x,ga as y,ia as z}; diff --git a/neode-ui/dist/assets/loginTransition-Bm4PAghQ.js b/neode-ui/dist/assets/loginTransition-Bm4PAghQ.js new file mode 100644 index 0000000..0c4e2ad --- /dev/null +++ b/neode-ui/dist/assets/loginTransition-Bm4PAghQ.js @@ -0,0 +1 @@ +import{$ as g,r as n}from"./index-DnbYEqLr.js";const l=g("loginTransition",()=>{const t=n(!1),o=n(!1),s=n(!1);function i(e){t.value=e}function a(e){o.value=e}function r(e){s.value=e}return{justLoggedIn:t,setJustLoggedIn:i,pendingWelcomeTyping:o,setPendingWelcomeTyping:a,startWelcomeTyping:s,setStartWelcomeTyping:r}});export{l as u}; diff --git a/neode-ui/dist/assets/markdown/md-sample.md b/neode-ui/dist/assets/markdown/md-sample.md new file mode 100644 index 0000000..a61ba3a --- /dev/null +++ b/neode-ui/dist/assets/markdown/md-sample.md @@ -0,0 +1,193 @@ +# Size Limit [![Cult Of Martians][cult-img]][cult] + +Size Limit is a performance budget tool for JavaScript. It checks every commit +on CI, calculates the real cost of your JS for end-users and throws an error +if the cost exceeds the limit. + +- **ES modules** and **tree-shaking** support. +- Add Size Limit to **Travis CI**, **Circle CI**, **GitHub Actions** + or another CI system to know if a pull request adds a massive dependency. +- **Modular** to fit different use cases: big JS applications + that use their own bundler or small npm libraries with many files. +- Can calculate **the time** it would take a browser + to download and **execute** your JS. Time is a much more accurate + and understandable metric compared to the size in bytes. +- Calculations include **all dependencies and polyfills** + used in your JS. + +

+ Size Limit CLI +

+ +With **[GitHub action]** Size Limit will post bundle size changes as a comment +in pull request discussion. + +

+Size Limit comment in pull request about bundle size changes +

+ +With `--why`, Size Limit can tell you _why_ your library is of this size +and show the real cost of all your internal dependencies. + +

+ Bundle Analyzer example +

+ +

+ + Sponsored by Evil Martians + +

+ +[github action]: https://github.com/andresz1/size-limit-action +[cult-img]: http://cultofmartians.com/assets/badges/badge.svg +[cult]: http://cultofmartians.com/tasks/size-limit-config.html + +## Who Uses Size Limit + +- [MobX](https://github.com/mobxjs/mobx) +- [Material-UI](https://github.com/callemall/material-ui) +- [Autoprefixer](https://github.com/postcss/autoprefixer) +- [PostCSS](https://github.com/postcss/postcss) reduced + [25% of the size](https://github.com/postcss/postcss/commit/150edaa42f6d7ede73d8c72be9909f0a0f87a70f). +- [Browserslist](https://github.com/ai/browserslist) reduced + [25% of the size](https://github.com/ai/browserslist/commit/640b62fa83a20897cae75298a9f2715642531623). +- [EmojiMart](https://github.com/missive/emoji-mart) reduced + [20% of the size](https://github.com/missive/emoji-mart/pull/111) +- [nanoid](https://github.com/ai/nanoid) reduced + [33% of the size](https://github.com/ai/nanoid/commit/036612e7d6cc5760313a8850a2751a5e95184eab). +- [React Focus Lock](https://github.com/theKashey/react-focus-lock) reduced + [32% of the size](https://github.com/theKashey/react-focus-lock/pull/48). +- [Logux](https://github.com/logux) reduced + [90% of the size](https://github.com/logux/logux-client/commit/62b258e20e1818b23ae39b9c4cd49e2495781e91). + +## How It Works + +1. Size Limit contains a CLI tool, 3 plugins (`file`, `webpack`, `time`) + and 3 plugin presets for popular use cases (`app`, `big-lib`, `small-lib`). + A CLI tool finds plugins in `package.json` and loads the config. +2. If you use the `webpack` plugin, Size Limit will bundle your JS files into + a single file. It is important to track dependencies and webpack polyfills. + It is also useful for small libraries with many small files and without + a bundler. +3. The `webpack` plugin creates an empty webpack project, adds your library + and looks for the bundle size difference. +4. The `time` plugin compares the current machine performance with that of + a low-priced Android devices to calculate the CPU throttling rate. +5. Then the `time` plugin runs headless Chrome (or desktop Chrome if it’s + available) to track the time a browser takes to compile and execute your JS. + Note that these measurements depend on available resources and might + be unstable. [See here](https://github.com/mbalabash/estimo/issues/5) + for more details. + +## Usage + +### JS Applications + +Suitable for applications that have their own bundler and send the JS bundle +directly to a client (without publishing it to npm). Think of a user-facing app +or website, like an email client, a CRM, a landing page or a blog with +interactive elements, using React/Vue/Svelte lib or vanilla JS. + +
Show instructions + +1. Install the preset: + + ```sh + $ npm install --save-dev size-limit @size-limit/preset-app + ``` + +2. Add the `size-limit` section and the `size` script to your `package.json`: + + ```diff + + "size-limit": [ + + { + + "path": "dist/app-*.js" + + } + + ], + "scripts": { + "build": "webpack ./webpack.config.js", + + "size": "npm run build && size-limit", + "test": "jest && eslint ." + } + ``` + +3. Here’s how you can get the size for your current project: + + ```sh + $ npm run size + + Package size: 30.08 KB with all dependencies, minified and gzipped + Loading time: 602 ms on slow 3G + Running time: 214 ms on Snapdragon 410 + Total time: 815 ms + ``` + +4. Now, let’s set the limit. Add 25% to the current total time and use that as + the limit in your `package.json`: + + ```diff + "size-limit": [ + { + + "limit": "1 s", + "path": "dist/app-*.js" + } + ], + ``` + +5. Add the `size` script to your test suite: + + ```diff + "scripts": { + "build": "webpack ./webpack.config.js", + "size": "npm run build && size-limit", + - "test": "jest && eslint ." + + "test": "jest && eslint . && npm run size" + } + ``` + +6. If you don’t have a continuous integration service running, don’t forget + to add one — start with [Travis CI]. + +
+ +## Reports + +Size Limit has a [GitHub action] that comments and rejects pull requests based +on Size Limit output. + +1. Install and configure Size Limit as shown above. +2. Add the following action inside `.github/workflows/size-limit.yml` + +```yaml +name: 'size' +on: + pull_request: + branches: + - master +jobs: + size: + runs-on: ubuntu-latest + env: + CI_JOB_NUMBER: 1 + steps: + - uses: actions/checkout@v1 + - uses: andresz1/size-limit-action@v1.0.0 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} +``` + +## JS API + +```js +const sizeLimit = require('size-limit') +const filePlugin = require('@size-limit/file') +const webpackPlugin = require('@size-limit/webpack') + +sizeLimit([filePlugin, webpackPlugin], [filePath]).then(result => { + result //=> { size: 12480 } +}) +``` diff --git a/neode-ui/dist/assets/mesh-DgF5cqYW.js b/neode-ui/dist/assets/mesh-DgF5cqYW.js new file mode 100644 index 0000000..7bf4fae --- /dev/null +++ b/neode-ui/dist/assets/mesh-DgF5cqYW.js @@ -0,0 +1 @@ +import{$ as I,r as l,j as x,B as r}from"./index-DnbYEqLr.js";const O=I("mesh",()=>{const y=l(null),g=l([]),u=l([]),d=l(!1),t=l(null),c=l(!1),i=l({}),m=l(null),p=x(()=>Object.values(i.value).reduce((e,a)=>e+a,0));async function h(){try{d.value=!0,t.value=null;const e=await r.call({method:"mesh.status"});y.value=e}catch(e){t.value=e instanceof Error?e.message:"Failed to fetch mesh status"}finally{d.value=!1}}async function w(){try{const e=await r.call({method:"mesh.peers"});g.value=e.peers}catch(e){t.value=e instanceof Error?e.message:"Failed to fetch mesh peers"}}async function f(e){try{const a=await r.call({method:"mesh.messages",params:e?{limit:e}:{}}),s=a.messages.filter(n=>n.direction==="received"&&!u.value.some(o=>o.id===n.id));for(const n of s)n.peer_contact_id!==m.value&&(i.value[n.peer_contact_id]=(i.value[n.peer_contact_id]||0)+1);u.value=a.messages}catch(a){t.value=a instanceof Error?a.message:"Failed to fetch mesh messages"}}function _(e){m.value=e,delete i.value[e]}function E(){m.value=null}async function F(e,a){try{c.value=!0,t.value=null;const s=await r.call({method:"mesh.send",params:{contact_id:e,message:a.trim()}});return s.sent&&await f(),s}catch(s){throw t.value=s instanceof Error?s.message:"Failed to send mesh message",s}finally{c.value=!1}}async function C(){try{t.value=null,await r.call({method:"mesh.broadcast"})}catch(e){throw t.value=e instanceof Error?e.message:"Failed to broadcast identity",e}}async function S(e){try{t.value=null,await r.call({method:"mesh.configure",params:e}),await h()}catch(a){throw t.value=a instanceof Error?a.message:"Failed to configure mesh",a}}async function b(e,a,s){try{return c.value=!0,t.value=null,await r.call({method:"mesh.send-invoice",params:{contact_id:e,amount_sats:a,memo:s}})}catch(n){throw t.value=n instanceof Error?n.message:"Failed to send invoice",n}finally{c.value=!1}}async function M(e,a,s,n){try{return c.value=!0,t.value=null,await r.call({method:"mesh.send-coordinate",params:{contact_id:e,lat:a,lng:s,label:n}})}catch(o){throw t.value=o instanceof Error?o.message:"Failed to send coordinate",o}finally{c.value=!1}}async function k(e,a,s=!1,n,o){try{return t.value=null,await r.call({method:"mesh.send-alert",params:{message:e,alert_type:a,broadcast:s,lat:n,lng:o}})}catch(v){throw t.value=v instanceof Error?v.message:"Failed to send alert",v}}async function P(e){return r.call({method:"mesh.session-status",params:{contact_id:e}})}async function j(){return r.call({method:"mesh.rotate-prekeys"})}async function A(){await Promise.all([h(),w(),f()])}return{status:y,peers:g,messages:u,loading:d,error:t,sending:c,unreadCounts:i,totalUnread:p,fetchStatus:h,fetchPeers:w,fetchMessages:f,sendMessage:F,broadcastIdentity:C,configure:S,refreshAll:A,markChatRead:_,clearViewingChat:E,sendInvoice:b,sendCoordinate:M,sendAlert:k,getSessionStatus:P,rotatePrekeys:j}});export{O as u}; diff --git a/neode-ui/dist/assets/transport-B_E2RH1i.js b/neode-ui/dist/assets/transport-B_E2RH1i.js new file mode 100644 index 0000000..30ddac4 --- /dev/null +++ b/neode-ui/dist/assets/transport-B_E2RH1i.js @@ -0,0 +1 @@ +import{$ as y,r as n,j as p,B as o}from"./index-DnbYEqLr.js";const g=y("transport",()=>{const s=n(null),u=n([]),l=n(!1),a=n(null),f=p(()=>s.value?.mesh_only??!1),m=p(()=>(s.value?.transports??[]).filter(e=>e.available).map(e=>e.kind));async function c(){try{l.value=!0,a.value=null;const e=await o.call({method:"transport.status"});s.value=e}catch(e){a.value=e instanceof Error?e.message:"Failed to fetch transport status"}finally{l.value=!1}}async function i(){try{const e=await o.call({method:"transport.peers"});u.value=e.peers}catch(e){a.value=e instanceof Error?e.message:"Failed to fetch transport peers"}}async function h(e,t){try{return a.value=null,await o.call({method:"transport.send",params:{did:e,payload:t}})}catch(r){throw a.value=r instanceof Error?r.message:"Failed to send via transport",r}}async function d(e){try{a.value=null,await o.call({method:"transport.set-mode",params:{mesh_only:e}}),await c()}catch(t){throw a.value=t instanceof Error?t.message:"Failed to set transport mode",t}}async function v(){await Promise.all([c(),i()])}return{status:s,peers:u,loading:l,error:a,meshOnly:f,availableTransports:m,fetchStatus:c,fetchPeers:i,sendMessage:h,setMeshOnly:d,refreshAll:v}});export{g as u}; diff --git a/neode-ui/dist/assets/useMarketplaceApp-BxXpq2aX.js b/neode-ui/dist/assets/useMarketplaceApp-BxXpq2aX.js new file mode 100644 index 0000000..4b49a20 --- /dev/null +++ b/neode-ui/dist/assets/useMarketplaceApp-BxXpq2aX.js @@ -0,0 +1 @@ +import{r as o}from"./index-DnbYEqLr.js";const e=o(null);function i(){function t(r){e.value={id:r.id,title:r.title??"",version:r.version??"",icon:r.icon??"",category:r.category??"",description:r.description??"",author:r.author??"",source:r.source??"",manifestUrl:r.manifestUrl||r.s9pkUrl||r.url||"",url:r.url||r.s9pkUrl||r.manifestUrl||"",repoUrl:r.repoUrl??"",s9pkUrl:r.s9pkUrl??"",dockerImage:r.dockerImage??"",webUrl:r.webUrl}}function l(){return e.value}function n(){e.value=null}return{setCurrentApp:t,getCurrentApp:l,clearCurrentApp:n}}export{i as u}; diff --git a/neode-ui/dist/assets/useOnboarding-BgpIyX9l.js b/neode-ui/dist/assets/useOnboarding-BgpIyX9l.js new file mode 100644 index 0000000..d17f97a --- /dev/null +++ b/neode-ui/dist/assets/useOnboarding-BgpIyX9l.js @@ -0,0 +1 @@ +import{B as r}from"./index-DnbYEqLr.js";async function a(e,n=3){for(let t=0;tsetTimeout(l,800*(t+1)))}return null}async function m(){const e=await a(()=>r.isOnboardingComplete(),2);return e!==null?e:localStorage.getItem("neode_onboarding_complete")==="1"}async function u(){await a(()=>r.completeOnboarding(),3),localStorage.setItem("neode_onboarding_complete","1")}export{u as completeOnboarding,m as isOnboardingComplete}; diff --git a/neode-ui/dist/assets/video/.DS_Store b/neode-ui/dist/assets/video/.DS_Store new file mode 100644 index 0000000..5008ddf Binary files /dev/null and b/neode-ui/dist/assets/video/.DS_Store differ diff --git a/neode-ui/dist/assets/video/Kratter.MP3 b/neode-ui/dist/assets/video/Kratter.MP3 new file mode 100644 index 0000000..3c79dbf Binary files /dev/null and b/neode-ui/dist/assets/video/Kratter.MP3 differ diff --git a/neode-ui/dist/assets/video/video-intro-new.mp4 b/neode-ui/dist/assets/video/video-intro-new.mp4 new file mode 100644 index 0000000..b329c99 Binary files /dev/null and b/neode-ui/dist/assets/video/video-intro-new.mp4 differ diff --git a/neode-ui/dist/assets/video/video-intro-old.mp4 b/neode-ui/dist/assets/video/video-intro-old.mp4 new file mode 100644 index 0000000..7ed4107 Binary files /dev/null and b/neode-ui/dist/assets/video/video-intro-old.mp4 differ diff --git a/neode-ui/dist/assets/video/video-intro.mp4 b/neode-ui/dist/assets/video/video-intro.mp4 new file mode 100644 index 0000000..3cf7151 Binary files /dev/null and b/neode-ui/dist/assets/video/video-intro.mp4 differ diff --git a/neode-ui/dist/assets/web5Badge-C9_VaejO.js b/neode-ui/dist/assets/web5Badge-C9_VaejO.js new file mode 100644 index 0000000..076a983 --- /dev/null +++ b/neode-ui/dist/assets/web5Badge-C9_VaejO.js @@ -0,0 +1 @@ +import{$ as s,r as n,B as a}from"./index-DnbYEqLr.js";const c=s("web5Badge",()=>{const e=n(0);async function r(){try{const t=await a.call({method:"network.list-requests"});e.value=t.requests?.length??0}catch{}}return{pendingRequestCount:e,refresh:r}});export{c as u}; diff --git a/neode-ui/dist/favicon-v2.ico b/neode-ui/dist/favicon-v2.ico new file mode 100644 index 0000000..94b2486 Binary files /dev/null and b/neode-ui/dist/favicon-v2.ico differ diff --git a/neode-ui/dist/index.html b/neode-ui/dist/index.html new file mode 100644 index 0000000..f16e813 --- /dev/null +++ b/neode-ui/dist/index.html @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + Archipelago OS + + + + +
+ + diff --git a/neode-ui/dist/manifest.webmanifest b/neode-ui/dist/manifest.webmanifest new file mode 100644 index 0000000..06d01e2 --- /dev/null +++ b/neode-ui/dist/manifest.webmanifest @@ -0,0 +1 @@ +{"name":"Archipelago","short_name":"Archipelago","description":"Your sovereign personal server","start_url":"/","display":"standalone","background_color":"#000000","theme_color":"#000000","lang":"en","scope":"/","display_override":["standalone","minimal-ui"],"orientation":"any","id":"/","categories":["productivity","utilities"],"prefer_related_applications":false,"icons":[{"src":"/assets/icon/pwa-64x64-v2.png","sizes":"64x64","type":"image/png","purpose":"any"},{"src":"/assets/icon/pwa-192x192-v2.png","sizes":"192x192","type":"image/png","purpose":"any"},{"src":"/assets/icon/pwa-512x512-v2.png","sizes":"512x512","type":"image/png","purpose":"any"},{"src":"/assets/icon/maskable-icon-512x512-v2.png","sizes":"512x512","type":"image/png","purpose":"maskable"}],"shortcuts":[{"name":"Dashboard","short_name":"Dashboard","description":"Open the dashboard","url":"/dashboard","icons":[{"src":"/assets/icon/pwa-192x192-v2.png","sizes":"192x192"}]},{"name":"My Apps","short_name":"Apps","description":"Manage your apps","url":"/dashboard/apps","icons":[{"src":"/assets/icon/pwa-192x192-v2.png","sizes":"192x192"}]},{"name":"App Store","short_name":"Store","description":"Browse and install apps","url":"/dashboard/marketplace","icons":[{"src":"/assets/icon/pwa-192x192-v2.png","sizes":"192x192"}]}]} diff --git a/neode-ui/dist/nostr-provider.js b/neode-ui/dist/nostr-provider.js new file mode 100644 index 0000000..fc124bd --- /dev/null +++ b/neode-ui/dist/nostr-provider.js @@ -0,0 +1,160 @@ +/** + * NIP-07 Nostr Provider Shim — Archipelago + * + * Provides window.nostr (NIP-07) for iframe apps. + * Auto sign-in: does NIP-98 auth directly then reloads so the app + * picks up the valid session. Shows a loading overlay during auth. + */ +(function () { + 'use strict'; + if (window.__archipelagoNostr) return; + window.__archipelagoNostr = true; + if (window === window.top) return; + + var pending = {}, nextId = 1; + + function request(method, params) { + return new Promise(function (resolve, reject) { + var id = nextId++; + pending[id] = { resolve: resolve, reject: reject }; + window.parent.postMessage({ type: 'nostr-request', id: id, method: method, params: params || {} }, '*'); + setTimeout(function () { if (pending[id]) { pending[id].reject(new Error('NIP-07 timeout')); delete pending[id]; } }, 30000); + }); + } + + window.addEventListener('message', function (e) { + if (!e.data || e.data.type !== 'nostr-response') return; + var h = pending[e.data.id]; if (!h) return; delete pending[e.data.id]; + e.data.error ? h.reject(new Error(e.data.error)) : h.resolve(e.data.result); + }); + + window.nostr = { + getPublicKey: function () { return request('getPublicKey'); }, + signEvent: function (ev) { return request('signEvent', { event: ev }); }, + sign: function (ev) { return request('signEvent', { event: ev }); }, + getRelays: function () { return request('getRelays'); }, + nip04: { + encrypt: function (pk, pt) { return request('nip04.encrypt', { pubkey: pk, plaintext: pt }); }, + decrypt: function (pk, ct) { return request('nip04.decrypt', { pubkey: pk, ciphertext: ct }); }, + }, + nip44: { + encrypt: function (pk, pt) { return request('nip44.encrypt', { pubkey: pk, plaintext: pt }); }, + decrypt: function (pk, ct) { return request('nip44.decrypt', { pubkey: pk, ciphertext: ct }); }, + }, + }; + + // --- Loading Overlay --- + var overlay = null; + + function showLoader(message) { + if (overlay) return; + overlay = document.createElement('div'); + overlay.id = 'archipelago-auth-overlay'; + overlay.innerHTML = + '
' + + '' + + '' + + '' + + '' + + '
' + (message || 'Signing in...') + '
' + + '
'; + overlay.style.cssText = 'position:fixed;inset:0;z-index:99999;display:flex;align-items:center;justify-content:center;background:rgba(0,0,0,0.7);backdrop-filter:blur(8px);'; + var style = document.createElement('style'); + style.textContent = '@keyframes archy-spin{to{transform:rotate(360deg)}}'; + document.head.appendChild(style); + document.body.appendChild(overlay); + } + + function updateLoader(message) { + if (!overlay) return; + var txt = overlay.querySelector('div > div'); + if (txt) txt.textContent = message; + } + + function hideLoader() { + if (overlay) { overlay.remove(); overlay = null; } + } + + // --- Direct NIP-98 Auth --- + var authDone = false; + + function doNip98Auth(pubkey) { + if (authDone) return; + authDone = true; + + var apiBase = '/api'; + var healthUrl = window.location.origin + apiBase + '/nostr-auth/health'; + var sessionUrl = window.location.origin + apiBase + '/auth/nostr/session'; + + // 1. Check if API backend is reachable (3s timeout) + var hc = new AbortController(); + var ht = setTimeout(function () { hc.abort(); }, 3000); + + fetch(healthUrl, { signal: hc.signal }).then(function (r) { + clearTimeout(ht); + if (!r.ok) throw new Error('Health ' + r.status); + + // 2. API is up — show loader and do NIP-98 + showLoader('Signing in with Nostr...'); + var now = Math.floor(Date.now() / 1000); + var event = { + kind: 27235, created_at: now, content: '', pubkey: pubkey, + tags: [['u', sessionUrl], ['method', 'POST']] + }; + console.log('[nostr-provider] NIP-98: signing for', sessionUrl); + return window.nostr.signEvent(event); + + }).then(function (signed) { + updateLoader('Creating session...'); + var ac = new AbortController(); + setTimeout(function () { ac.abort(); }, 10000); + return fetch(sessionUrl, { + method: 'POST', + headers: { 'Authorization': 'Nostr ' + btoa(JSON.stringify(signed)) }, + signal: ac.signal + }); + + }).then(function (res) { + console.log('[nostr-provider] NIP-98: response', res.status); + if (!res.ok) throw new Error('Auth failed: ' + res.status); + return res.json(); + + }).then(function (data) { + if (data.accessToken) { + sessionStorage.setItem('nostr_token', data.accessToken); + sessionStorage.setItem('nostr_pubkey', pubkey); + if (data.refreshToken) sessionStorage.setItem('refresh_token', data.refreshToken); + updateLoader('Signed in! Loading...'); + console.log('[nostr-provider] NIP-98: success, reloading...'); + setTimeout(function () { window.location.reload(); }, 400); + } else { + hideLoader(); authDone = false; + } + + }).catch(function (err) { + hideLoader(); authDone = false; + var msg = err.message || String(err); + if (msg.indexOf('abort') > -1) msg = 'API timeout'; + console.warn('[nostr-provider] NIP-98 skipped:', msg); + }); + } + + // Listen for identity from parent Archipelago frame + window.addEventListener('message', function (e) { + if (!e.data || e.data.type !== 'archipelago:identity') return; + var pk = e.data.nostr_pubkey; + console.log('[nostr-provider] Identity received:', pk ? pk.slice(0, 12) + '...' : 'none'); + if (!pk) return; + + // Skip if already signed in with a real token (not mock) + try { + var token = sessionStorage.getItem('nostr_token'); + if (token && token.indexOf('mock-') === -1) { + console.log('[nostr-provider] Already signed in with real token'); + return; + } + } catch (x) {} + + setTimeout(function () { doNip98Auth(pk); }, 1500); + }); +})(); diff --git a/neode-ui/dist/packages/atob.s9pk b/neode-ui/dist/packages/atob.s9pk new file mode 100644 index 0000000..1c2c829 Binary files /dev/null and b/neode-ui/dist/packages/atob.s9pk differ diff --git a/neode-ui/dist/registerSW.js b/neode-ui/dist/registerSW.js new file mode 100644 index 0000000..d42ac9e --- /dev/null +++ b/neode-ui/dist/registerSW.js @@ -0,0 +1 @@ +if('serviceWorker' in navigator) {window.addEventListener('load', () => {navigator.serviceWorker.register('/sw.js', { scope: '/' })})} \ No newline at end of file diff --git a/neode-ui/dist/sw.js b/neode-ui/dist/sw.js new file mode 100644 index 0000000..85ce048 --- /dev/null +++ b/neode-ui/dist/sw.js @@ -0,0 +1 @@ +if(!self.define){let s,i={};const e=(e,n)=>(e=new URL(e+".js",n).href,i[e]||new Promise(i=>{if("document"in self){const s=document.createElement("script");s.src=e,s.onload=i,document.head.appendChild(s)}else s=e,importScripts(e),i()}).then(()=>{let s=i[e];if(!s)throw new Error(`Module ${e} didn’t register its module`);return s}));self.define=(n,l)=>{const r=s||("document"in self?document.currentScript.src:"")||location.href;if(i[r])return;let o={};const a=s=>e(s,r),u={module:{uri:r},exports:o,require:a};i[r]=Promise.all(n.map(s=>u[s]||a(s))).then(s=>(l(...s),o))}}define(["./workbox-58bd4dca"],function(s){"use strict";self.skipWaiting(),s.clientsClaim(),s.precacheAndRoute([{url:"vite.svg",revision:"8e3a10e157f75ada21ab742c022d5430"},{url:"test-aiui.html",revision:"bb3148e6182b802d793f9ba2426a8eb4"},{url:"registerSW.js",revision:"1872c500de691dce40960bb85481de07"},{url:"nostr-provider.js",revision:"1766fd35b50a660c40501ba7b3e67fe6"},{url:"index.html",revision:"eee77b8be536beb88585715fdca9b4a1"},{url:"favicon-v2.ico",revision:"e0dcfffb1f9b8f9d2faf3a281bf07c63"},{url:"assets/web5Badge-C9_VaejO.js",revision:null},{url:"assets/useOnboarding-BgpIyX9l.js",revision:null},{url:"assets/useMarketplaceApp-BxXpq2aX.js",revision:null},{url:"assets/transport-B_E2RH1i.js",revision:null},{url:"assets/mesh-DgF5cqYW.js",revision:null},{url:"assets/loginTransition-Bm4PAghQ.js",revision:null},{url:"assets/index-DnbYEqLr.js",revision:null},{url:"assets/index-Ba9RnVeg.css",revision:null},{url:"assets/goals-f4yPn45c.js",revision:null},{url:"assets/filebrowser-client-DRXM9PC4.js",revision:null},{url:"assets/es-BeSu-8Qq.js",revision:null},{url:"assets/browser-rpPU-9HU.js",revision:null},{url:"assets/api-CHkUAu4g.js",revision:null},{url:"assets/aiPermissions-sblnS_DK.js",revision:null},{url:"assets/Web5-DcuUNKso.js",revision:null},{url:"assets/SystemUpdate-DAjulYB4.js",revision:null},{url:"assets/Settings-a5XTzOeo.js",revision:null},{url:"assets/Server-BNJJbUQb.js",revision:null},{url:"assets/RootRedirect-_cfWJoe8.js",revision:null},{url:"assets/RootRedirect-DU0Atc8N.css",revision:null},{url:"assets/PeerFiles-qTLuUhI-.js",revision:null},{url:"assets/OnboardingWrapper-BsOJSH8d.js",revision:null},{url:"assets/OnboardingWrapper-BHmgMze2.css",revision:null},{url:"assets/OnboardingVerify-P3nJC3Zw.js",revision:null},{url:"assets/OnboardingPath-BE4wazNB.js",revision:null},{url:"assets/OnboardingOptions-BEL4MhY9.js",revision:null},{url:"assets/OnboardingIntro-CuS0o5GQ.css",revision:null},{url:"assets/OnboardingIntro-CsYM21xo.js",revision:null},{url:"assets/OnboardingIdentity-i_e-4MVD.js",revision:null},{url:"assets/OnboardingDone-D8gm2WWx.js",revision:null},{url:"assets/OnboardingDid-Cr_ec55a.js",revision:null},{url:"assets/OnboardingDid-BxUaq9s9.css",revision:null},{url:"assets/OnboardingBackup-DGLHJlqA.js",revision:null},{url:"assets/NotFound-D22kjDbC.js",revision:null},{url:"assets/Monitoring-Bmi1t-3N.js",revision:null},{url:"assets/Mesh-Dr5A9OgS.css",revision:null},{url:"assets/Mesh-CPUFszgS.js",revision:null},{url:"assets/MarketplaceAppDetails-DhlIl2UT.js",revision:null},{url:"assets/Marketplace-dnuGfUDf.js",revision:null},{url:"assets/Marketplace-BasZfUkN.css",revision:null},{url:"assets/Login-DRIS0ldM.css",revision:null},{url:"assets/Login-CJkTG_B-.js",revision:null},{url:"assets/LightningChannels-BTRz5y8m.js",revision:null},{url:"assets/KioskRecovery-DsarIru9.js",revision:null},{url:"assets/Kiosk-CEZdJvXG.js",revision:null},{url:"assets/Kiosk-3Tm3M7Cs.css",revision:null},{url:"assets/Home-DFbCs8LP.css",revision:null},{url:"assets/Home-BM_tfGHm.js",revision:null},{url:"assets/GoalDetail-gx_165AC.css",revision:null},{url:"assets/GoalDetail-BDM8F7F1.js",revision:null},{url:"assets/Federation-gSEt_uL4.css",revision:null},{url:"assets/Federation-BIPGM17A.js",revision:null},{url:"assets/Dashboard-C4e6Zldy.css",revision:null},{url:"assets/Dashboard-Byxe5sIJ.js",revision:null},{url:"assets/Credentials-DP_VdhTb.js",revision:null},{url:"assets/Credentials-BgvGHu_K.css",revision:null},{url:"assets/ControllerIndicator.vue_vue_type_script_setup_true_lang-DH-pMX35.js",revision:null},{url:"assets/CloudFolder-8jSNyq3F.js",revision:null},{url:"assets/Cloud-BkxOai3U.js",revision:null},{url:"assets/Chat-_Y5LN8Cp.css",revision:null},{url:"assets/Chat-BLEXivD6.js",revision:null},{url:"assets/Apps-NkvfRZrs.css",revision:null},{url:"assets/Apps-JbZuzA3H.js",revision:null},{url:"assets/AppSession-DK48XcUX.css",revision:null},{url:"assets/AppSession-Cw_auYBr.js",revision:null},{url:"assets/AppDetails-DjlSPTt1.css",revision:null},{url:"assets/AppDetails-DfPGLgac.js",revision:null},{url:"assets/img/neode-logo.png",revision:null},{url:"assets/img/logo-neode.png",revision:null},{url:"assets/img/logo-large.svg",revision:null},{url:"assets/img/logo-archipelago.svg",revision:null},{url:"assets/img/grafana.png",revision:null},{url:"assets/img/bitcoin.svg",revision:null},{url:"assets/img/bg.jpg",revision:null},{url:"assets/img/bg-web5.jpg",revision:null},{url:"assets/img/bg-settings.jpg",revision:null},{url:"assets/img/bg-network.jpg",revision:null},{url:"assets/img/bg-myapps.jpg",revision:null},{url:"assets/img/bg-mesh.jpg",revision:null},{url:"assets/img/bg-intro.jpg",revision:null},{url:"assets/img/bg-intro-6.jpg",revision:null},{url:"assets/img/bg-intro-5.jpg",revision:null},{url:"assets/img/bg-intro-4.jpg",revision:null},{url:"assets/img/bg-intro-3.jpg",revision:null},{url:"assets/img/bg-intro-2.jpg",revision:null},{url:"assets/img/bg-intro-1.jpg",revision:null},{url:"assets/img/bg-home.jpg",revision:null},{url:"assets/img/bg-cloud.jpg",revision:null},{url:"assets/img/bg-appstore.jpg",revision:null},{url:"assets/img/service-icons/lnd.png",revision:null},{url:"assets/img/service-icons/btc-rpc-proxy.png",revision:null},{url:"assets/img/service-icons/bitcoind.svg",revision:null},{url:"assets/img/icons/wifi-3.png",revision:null},{url:"assets/img/icons/wifi-2.png",revision:null},{url:"assets/img/icons/wifi-1.png",revision:null},{url:"assets/img/icons/wifi-0.png",revision:null},{url:"assets/img/icons/snek.png",revision:null},{url:"assets/img/icons/bitcoin.svg",revision:null},{url:"assets/img/icons/bitcoin-symbol.svg",revision:null},{url:"assets/img/app-icons/vaultwarden.webp",revision:null},{url:"assets/img/app-icons/uptime-kuma.webp",revision:null},{url:"assets/img/app-icons/tor.svg",revision:null},{url:"assets/img/app-icons/tailscale.webp",revision:null},{url:"assets/img/app-icons/t-zero.png",revision:null},{url:"assets/img/app-icons/syntropy-institute.png",revision:null},{url:"assets/img/app-icons/searxng.png",revision:null},{url:"assets/img/app-icons/portainer.webp",revision:null},{url:"assets/img/app-icons/photoprism.svg",revision:null},{url:"assets/img/app-icons/penpot.webp",revision:null},{url:"assets/img/app-icons/onlyoffice.webp",revision:null},{url:"assets/img/app-icons/ollama.png",revision:null},{url:"assets/img/app-icons/nwnn.png",revision:null},{url:"assets/img/app-icons/nostrudel.svg",revision:null},{url:"assets/img/app-icons/nostr-rs-relay.svg",revision:null},{url:"assets/img/app-icons/nginx.svg",revision:null},{url:"assets/img/app-icons/nextcloud.webp",revision:null},{url:"assets/img/app-icons/morphos.png",revision:null},{url:"assets/img/app-icons/mempool.webp",revision:null},{url:"assets/img/app-icons/lorabell.png",revision:null},{url:"assets/img/app-icons/lnd.svg",revision:null},{url:"assets/img/app-icons/jellyfin.webp",revision:null},{url:"assets/img/app-icons/indeedhub.png",revision:null},{url:"assets/img/app-icons/immich.png",revision:null},{url:"assets/img/app-icons/homeassistant.png",revision:null},{url:"assets/img/app-icons/grafana.png",revision:null},{url:"assets/img/app-icons/file-browser.webp",revision:null},{url:"assets/img/app-icons/fedimint.png",revision:null},{url:"assets/img/app-icons/endurain.png",revision:null},{url:"assets/img/app-icons/electrumx.webp",revision:null},{url:"assets/img/app-icons/electrs.svg",revision:null},{url:"assets/img/app-icons/dwn.svg",revision:null},{url:"assets/img/app-icons/call-the-operator.png",revision:null},{url:"assets/img/app-icons/btcpay-server.png",revision:null},{url:"assets/img/app-icons/botfights.svg",revision:null},{url:"assets/img/app-icons/bitcoin-knots.webp",revision:null},{url:"assets/img/app-icons/bitcoin-core.png",revision:null},{url:"assets/img/app-icons/bg-appstore.jpg",revision:null},{url:"assets/img/app-icons/arch-presentation.png",revision:null},{url:"assets/img/app-icons/484-kitchen.png",revision:null},{url:"favicon-v2.ico",revision:"e0dcfffb1f9b8f9d2faf3a281bf07c63"},{url:"assets/icon/apple-touch-icon-180x180-v2.png",revision:"5c8cb889a580eef4ce3e7a05f87f6ab1"},{url:"assets/icon/favico-black-v2.svg",revision:"828a48dab698b2b67299b5e8df37e677"},{url:"assets/icon/maskable-icon-512x512-v2.png",revision:"058d043dc8fe5c77fcfe92f16165e789"},{url:"assets/icon/pwa-192x192-v2.png",revision:"f42fdcc1f08c28c390e9a18d932d4008"},{url:"assets/icon/pwa-512x512-v2.png",revision:"0a2c01f7a0505baabd3816cc32ab16d8"},{url:"assets/icon/pwa-64x64-v2.png",revision:"b626eb0a2dcdb59ddcd91596d3d1c877"},{url:"manifest.webmanifest",revision:"ae07d79d387510a5827baf2cc3ef5a99"}],{}),s.cleanupOutdatedCaches(),s.registerRoute(new s.NavigationRoute(s.createHandlerBoundToURL("index.html"),{denylist:[/^\/app\//,/^\/rpc\//,/^\/ws/,/^\/aiui\//]})),s.registerRoute(/^https:\/\/fonts\.googleapis\.com\/.*/i,new s.CacheFirst({cacheName:"google-fonts-cache",plugins:[new s.ExpirationPlugin({maxEntries:10,maxAgeSeconds:31536e3}),new s.CacheableResponsePlugin({statuses:[0,200]})]}),"GET"),s.registerRoute(/^https:\/\/fonts\.gstatic\.com\/.*/i,new s.CacheFirst({cacheName:"gstatic-fonts-cache",plugins:[new s.ExpirationPlugin({maxEntries:10,maxAgeSeconds:31536e3}),new s.CacheableResponsePlugin({statuses:[0,200]})]}),"GET"),s.registerRoute(/\/rpc\/v1\/.*/i,new s.NetworkFirst({cacheName:"api-cache",networkTimeoutSeconds:10,plugins:[new s.ExpirationPlugin({maxEntries:50,maxAgeSeconds:300})]}),"GET"),s.registerRoute(/\/assets\/.*/i,new s.CacheFirst({cacheName:"assets-cache-v2",plugins:[new s.ExpirationPlugin({maxEntries:100,maxAgeSeconds:2592e3})]}),"GET")}); diff --git a/neode-ui/dist/test-aiui.html b/neode-ui/dist/test-aiui.html new file mode 100644 index 0000000..b0a7d64 --- /dev/null +++ b/neode-ui/dist/test-aiui.html @@ -0,0 +1,159 @@ + + + + + AIUI Integration Test + + + +

AIUI ↔ Archy Integration Test

+

This page simulates AIUI sending postMessage requests to test the ContextBroker.

+ +
+ + + + +
+ +

Results

+
+ + + + diff --git a/neode-ui/dist/vite.svg b/neode-ui/dist/vite.svg new file mode 100644 index 0000000..e7b8dfb --- /dev/null +++ b/neode-ui/dist/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/neode-ui/dist/workbox-58bd4dca.js b/neode-ui/dist/workbox-58bd4dca.js new file mode 100644 index 0000000..d3a94f2 --- /dev/null +++ b/neode-ui/dist/workbox-58bd4dca.js @@ -0,0 +1 @@ +define(["exports"],function(t){"use strict";try{self["workbox:core:7.3.0"]&&_()}catch(t){}const e=(t,...e)=>{let s=t;return e.length>0&&(s+=` :: ${JSON.stringify(e)}`),s};class s extends Error{constructor(t,s){super(e(t,s)),this.name=t,this.details=s}}try{self["workbox:routing:7.3.0"]&&_()}catch(t){}const n=t=>t&&"object"==typeof t?t:{handle:t};class i{constructor(t,e,s="GET"){this.handler=n(e),this.match=t,this.method=s}setCatchHandler(t){this.catchHandler=n(t)}}class r extends i{constructor(t,e,s){super(({url:e})=>{const s=t.exec(e.href);if(s&&(e.origin===location.origin||0===s.index))return s.slice(1)},e,s)}}class a{constructor(){this.t=new Map,this.i=new Map}get routes(){return this.t}addFetchListener(){self.addEventListener("fetch",t=>{const{request:e}=t,s=this.handleRequest({request:e,event:t});s&&t.respondWith(s)})}addCacheListener(){self.addEventListener("message",t=>{if(t.data&&"CACHE_URLS"===t.data.type){const{payload:e}=t.data,s=Promise.all(e.urlsToCache.map(e=>{"string"==typeof e&&(e=[e]);const s=new Request(...e);return this.handleRequest({request:s,event:t})}));t.waitUntil(s),t.ports&&t.ports[0]&&s.then(()=>t.ports[0].postMessage(!0))}})}handleRequest({request:t,event:e}){const s=new URL(t.url,location.href);if(!s.protocol.startsWith("http"))return;const n=s.origin===location.origin,{params:i,route:r}=this.findMatchingRoute({event:e,request:t,sameOrigin:n,url:s});let a=r&&r.handler;const o=t.method;if(!a&&this.i.has(o)&&(a=this.i.get(o)),!a)return;let c;try{c=a.handle({url:s,request:t,event:e,params:i})}catch(t){c=Promise.reject(t)}const h=r&&r.catchHandler;return c instanceof Promise&&(this.o||h)&&(c=c.catch(async n=>{if(h)try{return await h.handle({url:s,request:t,event:e,params:i})}catch(t){t instanceof Error&&(n=t)}if(this.o)return this.o.handle({url:s,request:t,event:e});throw n})),c}findMatchingRoute({url:t,sameOrigin:e,request:s,event:n}){const i=this.t.get(s.method)||[];for(const r of i){let i;const a=r.match({url:t,sameOrigin:e,request:s,event:n});if(a)return i=a,(Array.isArray(i)&&0===i.length||a.constructor===Object&&0===Object.keys(a).length||"boolean"==typeof a)&&(i=void 0),{route:r,params:i}}return{}}setDefaultHandler(t,e="GET"){this.i.set(e,n(t))}setCatchHandler(t){this.o=n(t)}registerRoute(t){this.t.has(t.method)||this.t.set(t.method,[]),this.t.get(t.method).push(t)}unregisterRoute(t){if(!this.t.has(t.method))throw new s("unregister-route-but-not-found-with-method",{method:t.method});const e=this.t.get(t.method).indexOf(t);if(!(e>-1))throw new s("unregister-route-route-not-registered");this.t.get(t.method).splice(e,1)}}let o;const c=()=>(o||(o=new a,o.addFetchListener(),o.addCacheListener()),o);function h(t,e,n){let a;if("string"==typeof t){const s=new URL(t,location.href);a=new i(({url:t})=>t.href===s.href,e,n)}else if(t instanceof RegExp)a=new r(t,e,n);else if("function"==typeof t)a=new i(t,e,n);else{if(!(t instanceof i))throw new s("unsupported-route-type",{moduleName:"workbox-routing",funcName:"registerRoute",paramName:"capture"});a=t}return c().registerRoute(a),a}const u={googleAnalytics:"googleAnalytics",precache:"precache-v2",prefix:"workbox",runtime:"runtime",suffix:"undefined"!=typeof registration?registration.scope:""},l=t=>[u.prefix,t,u.suffix].filter(t=>t&&t.length>0).join("-"),f=t=>t||l(u.precache),w=t=>t||l(u.runtime);function d(t){t.then(()=>{})}const p=new Set;function y(){return y=Object.assign?Object.assign.bind():function(t){for(var e=1;e(t[e]=s,!0),has:(t,e)=>t instanceof IDBTransaction&&("done"===e||"store"===e)||e in t};function x(t){return t!==IDBDatabase.prototype.transaction||"objectStoreNames"in IDBTransaction.prototype?(g||(g=[IDBCursor.prototype.advance,IDBCursor.prototype.continue,IDBCursor.prototype.continuePrimaryKey])).includes(t)?function(...e){return t.apply(E(this),e),L(R.get(this))}:function(...e){return L(t.apply(E(this),e))}:function(e,...s){const n=t.call(E(this),e,...s);return b.set(n,e.sort?e.sort():[e]),L(n)}}function I(t){return"function"==typeof t?x(t):(t instanceof IDBTransaction&&function(t){if(v.has(t))return;const e=new Promise((e,s)=>{const n=()=>{t.removeEventListener("complete",i),t.removeEventListener("error",r),t.removeEventListener("abort",r)},i=()=>{e(),n()},r=()=>{s(t.error||new DOMException("AbortError","AbortError")),n()};t.addEventListener("complete",i),t.addEventListener("error",r),t.addEventListener("abort",r)});v.set(t,e)}(t),e=t,(m||(m=[IDBDatabase,IDBObjectStore,IDBIndex,IDBCursor,IDBTransaction])).some(t=>e instanceof t)?new Proxy(t,U):t);var e}function L(t){if(t instanceof IDBRequest)return function(t){const e=new Promise((e,s)=>{const n=()=>{t.removeEventListener("success",i),t.removeEventListener("error",r)},i=()=>{e(L(t.result)),n()},r=()=>{s(t.error),n()};t.addEventListener("success",i),t.addEventListener("error",r)});return e.then(e=>{e instanceof IDBCursor&&R.set(e,t)}).catch(()=>{}),D.set(e,t),e}(t);if(q.has(t))return q.get(t);const e=I(t);return e!==t&&(q.set(t,e),D.set(e,t)),e}const E=t=>D.get(t);const C=["get","getKey","getAll","getAllKeys","count"],N=["put","add","delete","clear"],O=new Map;function k(t,e){if(!(t instanceof IDBDatabase)||e in t||"string"!=typeof e)return;if(O.get(e))return O.get(e);const s=e.replace(/FromIndex$/,""),n=e!==s,i=N.includes(s);if(!(s in(n?IDBIndex:IDBObjectStore).prototype)||!i&&!C.includes(s))return;const r=async function(t,...e){const r=this.transaction(t,i?"readwrite":"readonly");let a=r.store;return n&&(a=a.index(e.shift())),(await Promise.all([a[s](...e),i&&r.done]))[0]};return O.set(e,r),r}U=(t=>y({},t,{get:(e,s,n)=>k(e,s)||t.get(e,s,n),has:(e,s)=>!!k(e,s)||t.has(e,s)}))(U);try{self["workbox:expiration:7.3.0"]&&_()}catch(t){}const B="cache-entries",T=t=>{const e=new URL(t,location.href);return e.hash="",e.href};class P{constructor(t){this.h=null,this.u=t}l(t){const e=t.createObjectStore(B,{keyPath:"id"});e.createIndex("cacheName","cacheName",{unique:!1}),e.createIndex("timestamp","timestamp",{unique:!1})}p(t){this.l(t),this.u&&function(t,{blocked:e}={}){const s=indexedDB.deleteDatabase(t);e&&s.addEventListener("blocked",t=>e(t.oldVersion,t)),L(s).then(()=>{})}(this.u)}async setTimestamp(t,e){const s={url:t=T(t),timestamp:e,cacheName:this.u,id:this.m(t)},n=(await this.getDb()).transaction(B,"readwrite",{durability:"relaxed"});await n.store.put(s),await n.done}async getTimestamp(t){const e=await this.getDb(),s=await e.get(B,this.m(t));return null==s?void 0:s.timestamp}async expireEntries(t,e){const s=await this.getDb();let n=await s.transaction(B).store.index("timestamp").openCursor(null,"prev");const i=[];let r=0;for(;n;){const s=n.value;s.cacheName===this.u&&(t&&s.timestamp=e?i.push(n.value):r++),n=await n.continue()}const a=[];for(const t of i)await s.delete(B,t.id),a.push(t.url);return a}m(t){return this.u+"|"+T(t)}async getDb(){return this.h||(this.h=await function(t,e,{blocked:s,upgrade:n,blocking:i,terminated:r}={}){const a=indexedDB.open(t,e),o=L(a);return n&&a.addEventListener("upgradeneeded",t=>{n(L(a.result),t.oldVersion,t.newVersion,L(a.transaction),t)}),s&&a.addEventListener("blocked",t=>s(t.oldVersion,t.newVersion,t)),o.then(t=>{r&&t.addEventListener("close",()=>r()),i&&t.addEventListener("versionchange",t=>i(t.oldVersion,t.newVersion,t))}).catch(()=>{}),o}("workbox-expiration",1,{upgrade:this.p.bind(this)})),this.h}}class M{constructor(t,e={}){this.R=!1,this.v=!1,this.q=e.maxEntries,this.D=e.maxAgeSeconds,this.U=e.matchOptions,this.u=t,this._=new P(t)}async expireEntries(){if(this.R)return void(this.v=!0);this.R=!0;const t=this.D?Date.now()-1e3*this.D:0,e=await this._.expireEntries(t,this.q),s=await self.caches.open(this.u);for(const t of e)await s.delete(t,this.U);this.R=!1,this.v&&(this.v=!1,d(this.expireEntries()))}async updateTimestamp(t){await this._.setTimestamp(t,Date.now())}async isURLExpired(t){if(this.D){const e=await this._.getTimestamp(t),s=Date.now()-1e3*this.D;return void 0===e||et.headers.get(e)===this.L[e])),e}}function W(t,e){const s=new URL(t);for(const t of e)s.searchParams.delete(t);return s.href}class S{constructor(){this.promise=new Promise((t,e)=>{this.resolve=t,this.reject=e})}}try{self["workbox:strategies:7.3.0"]&&_()}catch(t){}function K(t){return"string"==typeof t?new Request(t):t}class A{constructor(t,e){this.C={},Object.assign(this,e),this.event=e.event,this.N=t,this.O=new S,this.k=[],this.B=[...t.plugins],this.T=new Map;for(const t of this.B)this.T.set(t,{});this.event.waitUntil(this.O.promise)}async fetch(t){const{event:e}=this;let n=K(t);if("navigate"===n.mode&&e instanceof FetchEvent&&e.preloadResponse){const t=await e.preloadResponse;if(t)return t}const i=this.hasCallback("fetchDidFail")?n.clone():null;try{for(const t of this.iterateCallbacks("requestWillFetch"))n=await t({request:n.clone(),event:e})}catch(t){if(t instanceof Error)throw new s("plugin-error-request-will-fetch",{thrownErrorMessage:t.message})}const r=n.clone();try{let t;t=await fetch(n,"navigate"===n.mode?void 0:this.N.fetchOptions);for(const s of this.iterateCallbacks("fetchDidSucceed"))t=await s({event:e,request:r,response:t});return t}catch(t){throw i&&await this.runCallbacks("fetchDidFail",{error:t,event:e,originalRequest:i.clone(),request:r.clone()}),t}}async fetchAndCachePut(t){const e=await this.fetch(t),s=e.clone();return this.waitUntil(this.cachePut(t,s)),e}async cacheMatch(t){const e=K(t);let s;const{cacheName:n,matchOptions:i}=this.N,r=await this.getCacheKey(e,"read"),a=Object.assign(Object.assign({},i),{cacheName:n});s=await caches.match(r,a);for(const t of this.iterateCallbacks("cachedResponseWillBeUsed"))s=await t({cacheName:n,matchOptions:i,cachedResponse:s,request:r,event:this.event})||void 0;return s}async cachePut(t,e){const n=K(t);var i;await(i=0,new Promise(t=>setTimeout(t,i)));const r=await this.getCacheKey(n,"write");if(!e)throw new s("cache-put-with-no-response",{url:(a=r.url,new URL(String(a),location.href).href.replace(new RegExp(`^${location.origin}`),""))});var a;const o=await this.P(e);if(!o)return!1;const{cacheName:c,matchOptions:h}=this.N,u=await self.caches.open(c),l=this.hasCallback("cacheDidUpdate"),f=l?await async function(t,e,s,n){const i=W(e.url,s);if(e.url===i)return t.match(e,n);const r=Object.assign(Object.assign({},n),{ignoreSearch:!0}),a=await t.keys(e,r);for(const e of a)if(i===W(e.url,s))return t.match(e,n)}(u,r.clone(),["__WB_REVISION__"],h):null;try{await u.put(r,l?o.clone():o)}catch(t){if(t instanceof Error)throw"QuotaExceededError"===t.name&&await async function(){for(const t of p)await t()}(),t}for(const t of this.iterateCallbacks("cacheDidUpdate"))await t({cacheName:c,oldResponse:f,newResponse:o.clone(),request:r,event:this.event});return!0}async getCacheKey(t,e){const s=`${t.url} | ${e}`;if(!this.C[s]){let n=t;for(const t of this.iterateCallbacks("cacheKeyWillBeUsed"))n=K(await t({mode:e,request:n,event:this.event,params:this.params}));this.C[s]=n}return this.C[s]}hasCallback(t){for(const e of this.N.plugins)if(t in e)return!0;return!1}async runCallbacks(t,e){for(const s of this.iterateCallbacks(t))await s(e)}*iterateCallbacks(t){for(const e of this.N.plugins)if("function"==typeof e[t]){const s=this.T.get(e),n=n=>{const i=Object.assign(Object.assign({},n),{state:s});return e[t](i)};yield n}}waitUntil(t){return this.k.push(t),t}async doneWaiting(){for(;this.k.length;){const t=this.k.splice(0),e=(await Promise.allSettled(t)).find(t=>"rejected"===t.status);if(e)throw e.reason}}destroy(){this.O.resolve(null)}async P(t){let e=t,s=!1;for(const t of this.iterateCallbacks("cacheWillUpdate"))if(e=await t({request:this.request,response:e,event:this.event})||void 0,s=!0,!e)break;return s||e&&200!==e.status&&(e=void 0),e}}class F{constructor(t={}){this.cacheName=w(t.cacheName),this.plugins=t.plugins||[],this.fetchOptions=t.fetchOptions,this.matchOptions=t.matchOptions}handle(t){const[e]=this.handleAll(t);return e}handleAll(t){t instanceof FetchEvent&&(t={event:t,request:t.request});const e=t.event,s="string"==typeof t.request?new Request(t.request):t.request,n="params"in t?t.params:void 0,i=new A(this,{event:e,request:s,params:n}),r=this.M(i,s,e);return[r,this.j(r,i,s,e)]}async M(t,e,n){let i;await t.runCallbacks("handlerWillStart",{event:n,request:e});try{if(i=await this.W(e,t),!i||"error"===i.type)throw new s("no-response",{url:e.url})}catch(s){if(s instanceof Error)for(const r of t.iterateCallbacks("handlerDidError"))if(i=await r({error:s,event:n,request:e}),i)break;if(!i)throw s}for(const s of t.iterateCallbacks("handlerWillRespond"))i=await s({event:n,request:e,response:i});return i}async j(t,e,s,n){let i,r;try{i=await t}catch(r){}try{await e.runCallbacks("handlerDidRespond",{event:n,request:s,response:i}),await e.doneWaiting()}catch(t){t instanceof Error&&(r=t)}if(await e.runCallbacks("handlerDidComplete",{event:n,request:s,response:i,error:r}),e.destroy(),r)throw r}}const H={cacheWillUpdate:async({response:t})=>200===t.status||0===t.status?t:null};function $(t,e){const s=e();return t.waitUntil(s),s}try{self["workbox:precaching:7.3.0"]&&_()}catch(t){}function G(t){if(!t)throw new s("add-to-cache-list-unexpected-type",{entry:t});if("string"==typeof t){const e=new URL(t,location.href);return{cacheKey:e.href,url:e.href}}const{revision:e,url:n}=t;if(!n)throw new s("add-to-cache-list-unexpected-type",{entry:t});if(!e){const t=new URL(n,location.href);return{cacheKey:t.href,url:t.href}}const i=new URL(n,location.href),r=new URL(n,location.href);return i.searchParams.set("__WB_REVISION__",e),{cacheKey:i.href,url:r.href}}class V{constructor(){this.updatedURLs=[],this.notUpdatedURLs=[],this.handlerWillStart=async({request:t,state:e})=>{e&&(e.originalRequest=t)},this.cachedResponseWillBeUsed=async({event:t,state:e,cachedResponse:s})=>{if("install"===t.type&&e&&e.originalRequest&&e.originalRequest instanceof Request){const t=e.originalRequest.url;s?this.notUpdatedURLs.push(t):this.updatedURLs.push(t)}return s}}}class J{constructor({precacheController:t}){this.cacheKeyWillBeUsed=async({request:t,params:e})=>{const s=(null==e?void 0:e.cacheKey)||this.S.getCacheKeyForURL(t.url);return s?new Request(s,{headers:t.headers}):t},this.S=t}}let Q,z;async function X(t,e){let n=null;if(t.url){n=new URL(t.url).origin}if(n!==self.location.origin)throw new s("cross-origin-copy-response",{origin:n});const i=t.clone(),r={headers:new Headers(i.headers),status:i.status,statusText:i.statusText},a=e?e(r):r,o=function(){if(void 0===Q){const t=new Response("");if("body"in t)try{new Response(t.body),Q=!0}catch(t){Q=!1}Q=!1}return Q}()?i.body:await i.blob();return new Response(o,a)}class Y extends F{constructor(t={}){t.cacheName=f(t.cacheName),super(t),this.K=!1!==t.fallbackToNetwork,this.plugins.push(Y.copyRedirectedCacheableResponsesPlugin)}async W(t,e){const s=await e.cacheMatch(t);return s||(e.event&&"install"===e.event.type?await this.A(t,e):await this.F(t,e))}async F(t,e){let n;const i=e.params||{};if(!this.K)throw new s("missing-precache-entry",{cacheName:this.cacheName,url:t.url});{const s=i.integrity,r=t.integrity,a=!r||r===s;n=await e.fetch(new Request(t,{integrity:"no-cors"!==t.mode?r||s:void 0})),s&&a&&"no-cors"!==t.mode&&(this.H(),await e.cachePut(t,n.clone()))}return n}async A(t,e){this.H();const n=await e.fetch(t);if(!await e.cachePut(t,n.clone()))throw new s("bad-precaching-response",{url:t.url,status:n.status});return n}H(){let t=null,e=0;for(const[s,n]of this.plugins.entries())n!==Y.copyRedirectedCacheableResponsesPlugin&&(n===Y.defaultPrecacheCacheabilityPlugin&&(t=s),n.cacheWillUpdate&&e++);0===e?this.plugins.push(Y.defaultPrecacheCacheabilityPlugin):e>1&&null!==t&&this.plugins.splice(t,1)}}Y.defaultPrecacheCacheabilityPlugin={cacheWillUpdate:async({response:t})=>!t||t.status>=400?null:t},Y.copyRedirectedCacheableResponsesPlugin={cacheWillUpdate:async({response:t})=>t.redirected?await X(t):t};class Z{constructor({cacheName:t,plugins:e=[],fallbackToNetwork:s=!0}={}){this.$=new Map,this.G=new Map,this.V=new Map,this.N=new Y({cacheName:f(t),plugins:[...e,new J({precacheController:this})],fallbackToNetwork:s}),this.install=this.install.bind(this),this.activate=this.activate.bind(this)}get strategy(){return this.N}precache(t){this.addToCacheList(t),this.J||(self.addEventListener("install",this.install),self.addEventListener("activate",this.activate),this.J=!0)}addToCacheList(t){const e=[];for(const n of t){"string"==typeof n?e.push(n):n&&void 0===n.revision&&e.push(n.url);const{cacheKey:t,url:i}=G(n),r="string"!=typeof n&&n.revision?"reload":"default";if(this.$.has(i)&&this.$.get(i)!==t)throw new s("add-to-cache-list-conflicting-entries",{firstEntry:this.$.get(i),secondEntry:t});if("string"!=typeof n&&n.integrity){if(this.V.has(t)&&this.V.get(t)!==n.integrity)throw new s("add-to-cache-list-conflicting-integrities",{url:i});this.V.set(t,n.integrity)}if(this.$.set(i,t),this.G.set(i,r),e.length>0){const t=`Workbox is precaching URLs without revision info: ${e.join(", ")}\nThis is generally NOT safe. Learn more at https://bit.ly/wb-precache`;console.warn(t)}}}install(t){return $(t,async()=>{const e=new V;this.strategy.plugins.push(e);for(const[e,s]of this.$){const n=this.V.get(s),i=this.G.get(e),r=new Request(e,{integrity:n,cache:i,credentials:"same-origin"});await Promise.all(this.strategy.handleAll({params:{cacheKey:s},request:r,event:t}))}const{updatedURLs:s,notUpdatedURLs:n}=e;return{updatedURLs:s,notUpdatedURLs:n}})}activate(t){return $(t,async()=>{const t=await self.caches.open(this.strategy.cacheName),e=await t.keys(),s=new Set(this.$.values()),n=[];for(const i of e)s.has(i.url)||(await t.delete(i),n.push(i.url));return{deletedURLs:n}})}getURLsToCacheKeys(){return this.$}getCachedURLs(){return[...this.$.keys()]}getCacheKeyForURL(t){const e=new URL(t,location.href);return this.$.get(e.href)}getIntegrityForCacheKey(t){return this.V.get(t)}async matchPrecache(t){const e=t instanceof Request?t.url:t,s=this.getCacheKeyForURL(e);if(s){return(await self.caches.open(this.strategy.cacheName)).match(s)}}createHandlerBoundToURL(t){const e=this.getCacheKeyForURL(t);if(!e)throw new s("non-precached-url",{url:t});return s=>(s.request=new Request(t),s.params=Object.assign({cacheKey:e},s.params),this.strategy.handle(s))}}const tt=()=>(z||(z=new Z),z);class et extends i{constructor(t,e){super(({request:s})=>{const n=t.getURLsToCacheKeys();for(const i of function*(t,{ignoreURLParametersMatching:e=[/^utm_/,/^fbclid$/],directoryIndex:s="index.html",cleanURLs:n=!0,urlManipulation:i}={}){const r=new URL(t,location.href);r.hash="",yield r.href;const a=function(t,e=[]){for(const s of[...t.searchParams.keys()])e.some(t=>t.test(s))&&t.searchParams.delete(s);return t}(r,e);if(yield a.href,s&&a.pathname.endsWith("/")){const t=new URL(a.href);t.pathname+=s,yield t.href}if(n){const t=new URL(a.href);t.pathname+=".html",yield t.href}if(i){const t=i({url:r});for(const e of t)yield e.href}}(s.url,e)){const e=n.get(i);if(e){return{cacheKey:e,integrity:t.getIntegrityForCacheKey(e)}}}},t.strategy)}}t.CacheFirst=class extends F{async W(t,e){let n,i=await e.cacheMatch(t);if(!i)try{i=await e.fetchAndCachePut(t)}catch(t){t instanceof Error&&(n=t)}if(!i)throw new s("no-response",{url:t.url,error:n});return i}},t.CacheableResponsePlugin=class{constructor(t){this.cacheWillUpdate=async({response:t})=>this.X.isResponseCacheable(t)?t:null,this.X=new j(t)}},t.ExpirationPlugin=class{constructor(t={}){this.cachedResponseWillBeUsed=async({event:t,request:e,cacheName:s,cachedResponse:n})=>{if(!n)return null;const i=this.Y(n),r=this.Z(s);d(r.expireEntries());const a=r.updateTimestamp(e.url);if(t)try{t.waitUntil(a)}catch(t){}return i?n:null},this.cacheDidUpdate=async({cacheName:t,request:e})=>{const s=this.Z(t);await s.updateTimestamp(e.url),await s.expireEntries()},this.tt=t,this.D=t.maxAgeSeconds,this.et=new Map,t.purgeOnQuotaError&&function(t){p.add(t)}(()=>this.deleteCacheAndMetadata())}Z(t){if(t===w())throw new s("expire-custom-caches-only");let e=this.et.get(t);return e||(e=new M(t,this.tt),this.et.set(t,e)),e}Y(t){if(!this.D)return!0;const e=this.st(t);if(null===e)return!0;return e>=Date.now()-1e3*this.D}st(t){if(!t.headers.has("date"))return null;const e=t.headers.get("date"),s=new Date(e).getTime();return isNaN(s)?null:s}async deleteCacheAndMetadata(){for(const[t,e]of this.et)await self.caches.delete(t),await e.delete();this.et=new Map}},t.NavigationRoute=class extends i{constructor(t,{allowlist:e=[/./],denylist:s=[]}={}){super(t=>this.nt(t),t),this.it=e,this.rt=s}nt({url:t,request:e}){if(e&&"navigate"!==e.mode)return!1;const s=t.pathname+t.search;for(const t of this.rt)if(t.test(s))return!1;return!!this.it.some(t=>t.test(s))}},t.NetworkFirst=class extends F{constructor(t={}){super(t),this.plugins.some(t=>"cacheWillUpdate"in t)||this.plugins.unshift(H),this.ot=t.networkTimeoutSeconds||0}async W(t,e){const n=[],i=[];let r;if(this.ot){const{id:s,promise:a}=this.ct({request:t,logs:n,handler:e});r=s,i.push(a)}const a=this.ht({timeoutId:r,request:t,logs:n,handler:e});i.push(a);const o=await e.waitUntil((async()=>await e.waitUntil(Promise.race(i))||await a)());if(!o)throw new s("no-response",{url:t.url});return o}ct({request:t,logs:e,handler:s}){let n;return{promise:new Promise(e=>{n=setTimeout(async()=>{e(await s.cacheMatch(t))},1e3*this.ot)}),id:n}}async ht({timeoutId:t,request:e,logs:s,handler:n}){let i,r;try{r=await n.fetchAndCachePut(e)}catch(t){t instanceof Error&&(i=t)}return t&&clearTimeout(t),!i&&r||(r=await n.cacheMatch(e)),r}},t.cleanupOutdatedCaches=function(){self.addEventListener("activate",t=>{const e=f();t.waitUntil((async(t,e="-precache-")=>{const s=(await self.caches.keys()).filter(s=>s.includes(e)&&s.includes(self.registration.scope)&&s!==t);return await Promise.all(s.map(t=>self.caches.delete(t))),s})(e).then(t=>{}))})},t.clientsClaim=function(){self.addEventListener("activate",()=>self.clients.claim())},t.createHandlerBoundToURL=function(t){return tt().createHandlerBoundToURL(t)},t.precacheAndRoute=function(t,e){!function(t){tt().precache(t)}(t),function(t){const e=tt();h(new et(e,t))}(e)},t.registerRoute=h});