2 Commits

Author SHA1 Message Date
谦君
9b9fda0400 feat: 新增NPC与外交逻辑,优化UI组件结构
重构并精简了部分UI组件,移除冗余弹窗与详情组件,新增NPC相关逻辑(npcBehaviorLogic、npcGrowthLogic、npcStore等)及外交逻辑(diplomaticLogic、DiplomacyView)。完善分页、标签、复选框等通用UI组件。优化战报弹窗,调整README下载链接为相对路径,修复部分国际化内容。
2025-12-15 08:23:45 +08:00
谦君
44580909a3 feat: 新增docs静态资源与Electron主进程
添加了docs目录及其静态资源文件,支持前端文档和演示页面部署。新增dist-electron/main.js,实现Electron主进程窗口加载本地docs或开发服务器。更新.gitignore,允许docs目录纳入版本控制。
2025-12-14 15:59:32 +08:00
139 changed files with 18672 additions and 2659 deletions

View File

@@ -77,7 +77,6 @@ jobs:
- name: Build Electron - name: Build Electron
run: | run: |
pnpm install pnpm install
pnpm run build
pnpm run build:electron --${{ matrix.platform }} pnpm run build:electron --${{ matrix.platform }}
env: env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

1
.gitignore vendored
View File

@@ -12,7 +12,6 @@ node_modules
dist dist
dist-ssr dist-ssr
*.local *.local
docs
# Editor directories and files # Editor directories and files
.claude/* .claude/*

View File

@@ -53,23 +53,23 @@ OGame Vue TS is a single-player, browser-based space strategy game inspired by t
#### Server version #### Server version
[Windows](https://github.com/coolxitech/ogame-vue-ts/releases/latest/download/ogame-windows-amd64.exe) [Windows](/releases/latest/download/ogame-windows-amd64.exe)
[Linux amd64](https://github.com/coolxitech/ogame-vue-ts/releases/latest/download/ogame-linux-amd64) [Linux amd64](/releases/latest/download/ogame-linux-amd64)
[Linux arm64](https://github.com/coolxitech/ogame-vue-ts/releases/latest/download/ogame-linux-arm64) [Linux arm64](/releases/latest/download/ogame-linux-arm64)
[MacOS Intel](https://github.com/coolxitech/ogame-vue-ts/releases/latest/download/ogame-macos-amd64) [MacOS Intel](/releases/latest/download/ogame-macos-amd64)
[MacOS](https://github.com/coolxitech/ogame-vue-ts/releases/latest/download/ogame-macos-arm64) [MacOS](/releases/latest/download/ogame-macos-arm64)
#### Desktop version #### Desktop version
[Windows](https://github.com/coolxitech/ogame-vue-ts/releases/latest/download/OGame.Setup.exe) [Windows](/releases/latest/download/OGame.Setup.exe)
[Ubuntu](https://github.com/coolxitech/ogame-vue-ts/releases/latest/download/OGame.AppImage) [Ubuntu](/releases/latest/download/OGame.AppImage)
[MacOS](https://github.com/coolxitech/ogame-vue-ts/releases/latest/download/OGame-mac.dmg) [MacOS](/releases/latest/download/OGame-mac.dmg)
### Prerequisites ### Prerequisites

View File

@@ -53,23 +53,23 @@ OGame Vue TS 是一款受经典 OGame 游戏启发的单机版、基于浏览器
#### 服务端 #### 服务端
[Windows](https://github.com/coolxitech/ogame-vue-ts/releases/latest/download/ogame-windows-amd64.exe) [Windows](/releases/latest/download/ogame-windows-amd64.exe)
[Linux amd64](https://github.com/coolxitech/ogame-vue-ts/releases/latest/download/ogame-linux-amd64) [Linux amd64](/releases/latest/download/ogame-linux-amd64)
[Linux arm64](https://github.com/coolxitech/ogame-vue-ts/releases/latest/download/ogame-linux-arm64) [Linux arm64](/releases/latest/download/ogame-linux-arm64)
[MacOS Intel](https://github.com/coolxitech/ogame-vue-ts/releases/latest/download/ogame-macos-amd64) [MacOS Intel](/releases/latest/download/ogame-macos-amd64)
[MacOS](https://github.com/coolxitech/ogame-vue-ts/releases/latest/download/ogame-macos-arm64) [MacOS](/releases/latest/download/ogame-macos-arm64)
#### 桌面版 #### 桌面版
[Windows](https://github.com/coolxitech/ogame-vue-ts/releases/latest/download/OGame.Setup.exe) [Windows](/releases/latest/download/OGame.Setup.exe)
[Ubuntu](https://github.com/coolxitech/ogame-vue-ts/releases/latest/download/OGame.AppImage) [Ubuntu](/releases/latest/download/OGame.AppImage)
[MacOS](https://github.com/coolxitech/ogame-vue-ts/releases/latest/download/OGame-mac.dmg) [MacOS](/releases/latest/download/OGame-mac.dmg)
### 环境要求 ### 环境要求

12
dist-electron/main.js Normal file
View File

@@ -0,0 +1,12 @@
import { BrowserWindow, app } from "electron";
import path, { dirname } from "node:path";
import { fileURLToPath } from "node:url";
app.whenReady().then(() => {
let i = dirname(fileURLToPath(import.meta.url)), a = new BrowserWindow({
title: "OGame",
icon: path.join(i, "../public/favicon.ico"),
width: 1200,
height: 800
});
a.setMenu(null), process.env.VITE_DEV_SERVER_URL ? a.loadURL(process.env.VITE_DEV_SERVER_URL) : a.loadFile("docs/index.html");
});

1
docs/CNAME Normal file
View File

@@ -0,0 +1 @@
ogame-vue-ts.wenzi.games

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,7 @@
import{$t as e,At as t,Ct as n,Dn as r,En as i,Gn as a,Gt as o,Jt as s,Ln as c,Ot as ee,Qt as l,Vt as te,Xn as u,Xt as d,Yn as ne,Yt as f,Zt as p,_ as m,b as h,en as g,g as re,gn as _,jt as ie,kt as ae,m as oe,mn as v,p as se,qn as y,tn as ce,v as le,y as b}from"./game-logic-Bi1l7y4K.js";import"./vendor-pinia-DqhKuBjp.js";import"./vendor-crypto-CQM8pryk.js";import"./game-i18n-Dr0JspcV.js";import"./vendor-others-DTUzJ7S-.js";import"./vendor-reka-ui-BEHIKScj.js";import"./vendor-utils-BlvnUqQX.js";import"./vendor-vueuse-CJcfYqoW.js";import{B as ue,M as x}from"./vendor-icons-z9V6Jdbh.js";import{t as S}from"./CardDescription-BSLS07AU.js";import{d as C,v as de}from"./game-config-CG6z6nnH.js";import{D as fe,H as pe,K as w,N as T,W as E,_ as D,a as O,b as me,c as he,f as k,h as ge,i as A,l as j,o as M,p as N,q as P,r as F,s as I,u as L,v as _e,y as ve}from"./index-BT5w6et-.js";import{t as ye}from"./useGameConfig-b98LOtBY.js";import{t as be}from"./CardUnlockOverlay-DYfgGY6J.js";var xe={key:0,class:`container mx-auto p-4 sm:p-6`},Se={class:`text-2xl sm:text-3xl font-bold mb-4 sm:mb-6`},Ce={class:`mb-4 sm:mb-6 p-3 sm:p-4 bg-muted/50 rounded-lg border`},we={class:`flex items-center justify-between`},Te={class:`text-sm sm:text-base font-medium flex items-center gap-2`},Ee={class:`text-sm sm:text-base font-bold`},De={class:`mt-2`},Oe={class:`w-full bg-background rounded-full h-2.5 sm:h-3 overflow-hidden`},ke={class:`grid grid-cols-2 lg:grid-cols-3 gap-3 sm:gap-4`},Ae={class:`mb-2`},je={class:`flex flex-col sm:flex-row sm:justify-between sm:items-start gap-2`},Me={class:`space-y-3`},R={class:`text-xs sm:text-sm space-y-1.5 sm:space-y-2`},Ne={class:`text-muted-foreground mb-1 sm:mb-2`},Pe={class:`space-y-1 sm:space-y-1.5`},Fe={class:`text-xs`},Ie={class:`text-xs sm:text-sm space-y-0.5 sm:space-y-1`},Le={class:`flex items-center gap-1.5 text-muted-foreground`},Re={class:`flex items-center gap-1.5 text-muted-foreground`},ze={key:1,class:`text-xs text-muted-foreground`},Be={class:`flex gap-2 flex-wrap`},Ve={key:0},z=ce({__name:`BuildingsView`,setup(ce){let z=P(),He=fe(),{t:B}=w(),{BUILDINGS:V,TECHNOLOGIES:Ue}=ye(),H=s(()=>z.currentPlanet),U=c(!1),W=c(``),G=c(``),K=c(!1),q=c(``),J=c(null),We=[{key:`metal`},{key:`crystal`},{key:`deuterium`},{key:`darkMatter`}],Ge=s(()=>H.value?Object.values(C).filter(e=>{let t=V.value[e];return H.value.isMoon?t.moonOnly===!0:t.moonOnly!==!0}):[]),Ke=e=>{if(!z.currentPlanet||!m(z.currentPlanet,e,z.player.technologies,z.player.officers).valid)return!1;let t=oe(z.currentPlanet,e,z.player.officers);return z.currentPlanet.buildQueue.push(t),!0},Y=e=>ie(e),qe=e=>{if(!Z(e)){W.value=B(`common.requirementsNotMet`),G.value=Ye(e),U.value=!0;return}Ke(e)||(W.value=B(`buildingsView.upgradeFailed`),G.value=B(`buildingsView.upgradeFailedMessage`),U.value=!0)},X=e=>H.value?.buildings[e]||0,Z=e=>{if(!H.value)return!1;let t=V.value[e],n=b(t,X(e)+1);return!n||Object.keys(n).length===0?!0:le(H.value,z.player.technologies,n)},Je=e=>{if(!H.value)return B(`buildingsView.upgrade`);let t=V.value[e],n=X(e);return t.maxLevel!==void 0&&n>=t.maxLevel?B(`buildingsView.maxLevelReached`):H.value.buildQueue.length>0||Z(e)?B(`buildingsView.upgrade`):B(`buildingsView.requirementsNotMet`)},Ye=e=>{let t=V.value[e],n=b(t,X(e)+1);if(!n||!H.value)return``;let r=[];for(let[e,t]of Object.entries(n))if(Object.values(C).includes(e)){let n=e,i=H.value.buildings[n]||0,a=V.value[n]?.name||n,o=i>=t?``:``;r.push(`${o} ${a}: Lv ${t} (${B(`common.current`)}: Lv ${i})`)}else if(Object.values(de).includes(e)){let n=e,i=z.player.technologies[n]||0,a=Ue.value[n]?.name||n,o=i>=t?``:``;r.push(`${o} ${a}: Lv ${t} (${B(`common.current`)}: Lv ${i})`)}return r.join(`
`)},Xe=e=>{if(!H.value)return!1;let t=V.value[e],r=X(e);if(t.maxLevel!==void 0&&r>=t.maxLevel)return!1;let i=n(z.player.officers,Date.now()),a=h(H.value,i.additionalBuildQueue);if(H.value.buildQueue.filter(e=>e.type===`building`||e.type===`demolish`).length>=a||!m(H.value,e,z.player.technologies,z.player.officers).valid)return!1;let o=Q(e,r+1);return H.value.resources.metal>=o.metal&&H.value.resources.crystal>=o.crystal&&H.value.resources.deuterium>=o.deuterium&&H.value.resources.darkMatter>=o.darkMatter},Q=(e,t)=>ee(e,t),Ze=(e,t)=>{if(!H.value)return 0;let r=n(z.player.officers,Date.now()),i=H.value.buildings[C.RoboticsFactory]||0,a=H.value.buildings[C.NaniteFactory]||0;return ae(e,t,r.buildingSpeedBonus,i,a)},Qe=e=>{if(!z.currentPlanet||!re(z.currentPlanet,e,z.player.officers).valid)return!1;let t=se(z.currentPlanet,e,z.player.officers);return z.currentPlanet.buildQueue.push(t),!0},$e=e=>{let t=V.value[e].name,n=$(e);q.value=`${B(`buildingsView.confirmDemolishMessage`)}: ${t}
${B(`buildingsView.demolishRefund`)}:
${B(`resources.metal`)}: ${k(n.metal)}
${B(`resources.crystal`)}: ${k(n.crystal)}
${B(`resources.deuterium`)}: ${k(n.deuterium)}${n.darkMatter>0?`\n${B(`resources.darkMatter`)}: ${k(n.darkMatter)}`:``}`,J.value=e,K.value=!0},et=()=>{J.value&&(Qe(J.value)||(W.value=B(`buildingsView.demolishFailed`),G.value=B(`buildingsView.demolishFailedMessage`),U.value=!0)),K.value=!1,J.value=null},tt=e=>{if(!H.value||X(e)<=0)return!1;let t=n(z.player.officers,Date.now()),r=h(H.value,t.additionalBuildQueue);return!(H.value.buildQueue.filter(e=>e.type===`building`||e.type===`demolish`).length>=r)},$=e=>t(e,X(e));return(t,n)=>H.value?(v(),l(`div`,xe,[f(`h1`,Se,u(a(B)(`buildingsView.title`)),1),f(`div`,Ce,[f(`div`,we,[f(`div`,Te,[g(a(x),{size:16}),e(` `+u(a(B)(`buildingsView.spaceUsage`))+`: `,1)]),f(`div`,Ee,[f(`span`,{class:y(Y(H.value)>H.value.maxSpace?`text-destructive`:`text-primary`)},u(a(k)(Y(H.value))),3),n[2]||=f(`span`,{class:`text-muted-foreground mx-1`},`/`,-1),f(`span`,null,u(a(k)(H.value.maxSpace)),1)])]),f(`div`,De,[f(`div`,Oe,[f(`div`,{class:y([`h-full transition-all duration-300`,Y(H.value)>H.value.maxSpace?`bg-destructive`:`bg-primary`]),style:ne({width:`${Math.min(Y(H.value)/H.value.maxSpace*100,100)}%`})},null,6)])])]),f(`div`,ke,[(v(!0),l(o,null,_(Ge.value,t=>(v(),d(a(me),{key:t,class:`relative`},{default:i(()=>[g(be,{requirements:a(V)[t].requirements,currentLevel:X(t)},null,8,[`requirements`,`currentLevel`]),g(a(_e),null,{default:i(()=>[f(`div`,Ae,[f(`div`,je,[g(a(D),{class:`text-sm sm:text-base lg:text-lg cursor-pointer hover:text-primary transition-colors underline decoration-dotted underline-offset-4 order-2 sm:order-1`,onClick:e=>a(He).openBuilding(t,X(t))},{default:i(()=>[e(u(a(V)[t].name),1)]),_:2},1032,[`onClick`]),g(a(pe),{variant:`secondary`,class:`text-xs whitespace-nowrap self-start order-1 sm:order-2`},{default:i(()=>[e(` Lv `+u(X(t)),1)]),_:2},1024)])]),g(a(S),{class:`text-xs sm:text-sm`},{default:i(()=>[e(u(a(V)[t].description),1)]),_:2},1024)]),_:2},1024),g(a(ve),null,{default:i(()=>[f(`div`,Me,[f(`div`,R,[f(`p`,Ne,u(a(B)(`buildingsView.upgradeCost`))+`:`,1),f(`div`,Pe,[(v(),l(o,null,_(We,e=>r(f(`div`,{key:e.key,class:`flex items-center gap-1.5 sm:gap-2`},[g(T,{type:e.key,size:`sm`},null,8,[`type`]),f(`span`,Fe,u(a(B)(`resources.${e.key}`))+`:`,1),f(`span`,{class:y([`font-medium text-xs sm:text-sm`,a(ge)(H.value.resources[e.key],Q(t,X(t)+1)[e.key])])},u(a(k)(Q(t,X(t)+1)[e.key])),3)]),[[te,e.key!==`darkMatter`||Q(t,X(t)+1).darkMatter>0]])),64))])]),f(`div`,Ie,[f(`div`,Le,[g(a(ue),{size:14,class:`flex-shrink-0`}),f(`span`,null,u(a(N)(Ze(t,X(t)+1))),1)]),f(`div`,Re,[g(a(x),{size:14,class:`flex-shrink-0`}),f(`span`,null,u(a(V)[t].spaceUsage),1)])]),g(a(E),{onClick:e=>qe(t),disabled:!Xe(t),class:`w-full`},{default:i(()=>[e(u(Je(t)),1)]),_:2},1032,[`onClick`,`disabled`]),X(t)>0?(v(),d(a(E),{key:0,onClick:e=>$e(t),disabled:!tt(t),variant:`destructive`,class:`w-full`},{default:i(()=>[e(u(a(B)(`buildingsView.demolish`)),1)]),_:1},8,[`onClick`,`disabled`])):p(``,!0),X(t)>0?(v(),l(`div`,ze,[f(`p`,null,u(a(B)(`buildingsView.demolishRefund`))+`:`,1),f(`div`,Be,[f(`span`,null,u(a(k)($(t).metal))+` `+u(a(B)(`resources.metal`)),1),f(`span`,null,u(a(k)($(t).crystal))+` `+u(a(B)(`resources.crystal`)),1),f(`span`,null,u(a(k)($(t).deuterium))+` `+u(a(B)(`resources.deuterium`)),1),$(t).darkMatter>0?(v(),l(`span`,Ve,u(a(k)($(t).darkMatter))+` `+u(a(B)(`resources.darkMatter`)),1)):p(``,!0)])])):p(``,!0)])]),_:2},1024)]),_:2},1024))),128))]),g(a(L),{open:U.value,"onUpdate:open":n[0]||=e=>U.value=e},{default:i(()=>[g(a(I),null,{default:i(()=>[g(a(A),null,{default:i(()=>[g(a(F),null,{default:i(()=>[e(u(W.value),1)]),_:1}),g(a(M),{class:`whitespace-pre-line`},{default:i(()=>[e(u(G.value),1)]),_:1})]),_:1}),g(a(O),null,{default:i(()=>[g(a(j),null,{default:i(()=>[e(u(a(B)(`common.confirm`)),1)]),_:1})]),_:1})]),_:1})]),_:1},8,[`open`]),g(a(L),{open:K.value,"onUpdate:open":n[1]||=e=>K.value=e},{default:i(()=>[g(a(I),null,{default:i(()=>[g(a(A),null,{default:i(()=>[g(a(F),null,{default:i(()=>[e(u(a(B)(`buildingsView.confirmDemolish`)),1)]),_:1}),g(a(M),{class:`whitespace-pre-line`},{default:i(()=>[e(u(q.value),1)]),_:1})]),_:1}),g(a(O),null,{default:i(()=>[g(a(he),null,{default:i(()=>[e(u(a(B)(`common.cancel`)),1)]),_:1}),g(a(j),{onClick:et},{default:i(()=>[e(u(a(B)(`common.confirm`)),1)]),_:1})]),_:1})]),_:1})]),_:1},8,[`open`])])):p(``,!0)}});export{z as default};

View File

@@ -0,0 +1 @@
import{Gn as e,Qt as t,_n as n,mn as r,qn as i,tn as a}from"./game-logic-Bi1l7y4K.js";import{G as o}from"./index-BT5w6et-.js";var s=a({__name:`CardDescription`,props:{class:{}},setup(a){let s=a;return(a,c)=>(r(),t(`p`,{"data-slot":`card-description`,class:i(e(o)(`text-muted-foreground text-sm`,s.class))},[n(a.$slots,`default`)],2))}});export{s as t};

View File

@@ -0,0 +1,2 @@
import{$t as e,En as t,Gn as n,Jt as r,Ln as i,Qt as a,Xn as o,Yt as s,Zt as c,en as l,mn as u,tn as d,v as f}from"./game-logic-Bi1l7y4K.js";import{D as p}from"./vendor-icons-z9V6Jdbh.js";import{d as m,v as h}from"./game-config-CG6z6nnH.js";import{K as g,W as _,a as v,i as y,l as b,o as x,q as S,r as C,s as w,u as T}from"./index-BT5w6et-.js";import{t as E}from"./useGameConfig-b98LOtBY.js";var D={key:0,class:`absolute inset-0 z-10 bg-background/70 backdrop-blur-[2px] rounded-lg flex items-center justify-center`},O={class:`text-center p-4 space-y-2`},k={class:`flex justify-center`},A={class:`rounded-full bg-muted p-2`},j={class:`text-xs font-medium text-muted-foreground`},M=d({__name:`CardUnlockOverlay`,props:{requirements:{},currentLevel:{}},setup(d){let M=d,N=S(),{t:P}=g(),{BUILDINGS:F,TECHNOLOGIES:I}=E(),L=i(!1),R=i(``),z=i(``),B=r(()=>M.currentLevel!==void 0&&M.currentLevel>0||!M.requirements||!N.currentPlanet?!0:f(N.currentPlanet,N.player.technologies,M.requirements)),V=()=>{if(!M.requirements||!N.currentPlanet)return``;let e=[];for(let[t,n]of Object.entries(M.requirements))if(Object.values(m).includes(t)){let r=t,i=N.currentPlanet.buildings[r]||0,a=F.value[r]?.name||r,o=i>=n?``:``;e.push(`${o} ${a}: Lv ${n} (${P(`common.current`)}: Lv ${i})`)}else if(Object.values(h).includes(t)){let r=t,i=N.player.technologies[r]||0,a=I.value[r]?.name||r,o=i>=n?``:``;e.push(`${o} ${a}: Lv ${n} (${P(`common.current`)}: Lv ${i})`)}return e.join(`
`)},H=()=>{R.value=P(`common.requirementsNotMet`),z.value=V(),L.value=!0};return(r,i)=>B.value?c(``,!0):(u(),a(`div`,D,[s(`div`,O,[s(`div`,k,[s(`div`,A,[l(n(p),{size:20,class:`text-muted-foreground`})])]),s(`p`,j,o(n(P)(`common.locked`)),1),l(n(_),{variant:`outline`,size:`sm`,onClick:H,class:`text-xs`},{default:t(()=>[e(o(n(P)(`common.viewRequirements`)),1)]),_:1})]),l(n(T),{open:L.value,"onUpdate:open":i[0]||=e=>L.value=e},{default:t(()=>[l(n(w),null,{default:t(()=>[l(n(y),null,{default:t(()=>[l(n(C),null,{default:t(()=>[e(o(R.value),1)]),_:1}),l(n(x),{class:`whitespace-pre-line`},{default:t(()=>[e(o(z.value),1)]),_:1})]),_:1}),l(n(v),null,{default:t(()=>[l(n(b),null,{default:t(()=>[e(o(n(P)(`common.confirm`)),1)]),_:1})]),_:1})]),_:1})]),_:1},8,[`open`])]))}});export{M as t};

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,2 @@
import{$t as e,Dn as t,En as n,Gn as r,Gt as i,It as a,Jt as o,Ln as s,Qt as c,S as l,Vt as ee,Xn as u,Xt as te,Yt as d,Zt as ne,d as re,en as f,gn as p,mn as m,qn as ie,tn as ae,u as oe,v as h,y as g}from"./game-logic-Bi1l7y4K.js";import"./vendor-pinia-DqhKuBjp.js";import"./vendor-vue-router-1sDnnIWZ.js";import"./vendor-crypto-CQM8pryk.js";import"./game-i18n-Dr0JspcV.js";import"./vendor-others-DTUzJ7S-.js";import"./vendor-reka-ui-BEHIKScj.js";import"./vendor-utils-BlvnUqQX.js";import"./vendor-vueuse-CJcfYqoW.js";import"./vendor-icons-z9V6Jdbh.js";import{t as se}from"./CardDescription-BSLS07AU.js";import{d as _,v}from"./game-config-CG6z6nnH.js";import{D as ce,H as le,K as ue,N as de,W as y,_ as b,a as x,b as S,f as C,h as w,i as T,l as E,o as D,q as O,r as k,s as A,u as j,v as M,y as N}from"./index-BT5w6et-.js";import{t as P}from"./useGameConfig-b98LOtBY.js";import{t as F}from"./CardUnlockOverlay-DYfgGY6J.js";import{t as I}from"./UnlockRequirement-CoWPiUl8.js";var L={key:0,class:`container mx-auto p-4 sm:p-6`},R={class:`text-2xl sm:text-3xl font-bold mb-4 sm:mb-6`},fe={class:`grid grid-cols-2 lg:grid-cols-3 gap-3 sm:gap-4`},z={class:`mb-2`},B={class:`flex flex-col sm:flex-row sm:justify-between sm:items-start gap-2`},V={class:`space-y-2.5 sm:space-y-3`},pe={class:`text-xs sm:text-sm space-y-1.5 sm:space-y-2`},me={class:`text-muted-foreground mb-1 sm:mb-2`},he={class:`space-y-1 sm:space-y-1.5`},ge={class:`text-xs`},H=ae({__name:`ResearchView`,setup(ae){let H=O(),_e=ce(),{t:U}=ue(),{TECHNOLOGIES:W,BUILDINGS:ve}=P(),G=o(()=>H.currentPlanet),K=o(()=>H.player),q=s(!1),J=s(``),Y=s(``),ye=[{key:`metal`},{key:`crystal`},{key:`deuterium`},{key:`darkMatter`}],X=e=>{if(!H.currentPlanet||!re(H.currentPlanet,e,H.player.technologies,H.player.researchQueue).valid)return!1;let t=H.player.technologies[e]||0,{queueItem:n}=oe(H.currentPlanet,e,t,H.player.officers,H.player.technologies);return H.player.researchQueue.push(n),!0},Z=e=>{if(!G.value)return!1;let t=W.value[e],n=g(t,Q(e)+1);return!n||Object.keys(n).length===0?!0:h(G.value,H.player.technologies,n)},be=e=>{if(!G.value)return U(`researchView.research`);let t=W.value[e],n=Q(e);if(t.maxLevel!==void 0&&n>=t.maxLevel)return U(`researchView.maxLevelReached`);let r=l(H.player.technologies);return K.value.researchQueue.length>=r||Z(e)?U(`researchView.research`):U(`buildingsView.requirementsNotMet`)},xe=e=>{let t=W.value[e],n=g(t,Q(e)+1);if(!n||!G.value)return``;let r=[];for(let[e,t]of Object.entries(n))if(Object.values(_).includes(e)){let n=e,i=G.value.buildings[n]||0,a=ve.value[n]?.name||n,o=i>=t?``:``;r.push(`${o} ${a}: Lv ${t} (${U(`common.current`)}: Lv ${i})`)}else if(Object.values(v).includes(e)){let n=e,i=H.player.technologies[n]||0,a=W.value[n]?.name||n,o=i>=t?``:``;r.push(`${o} ${a}: Lv ${t} (${U(`common.current`)}: Lv ${i})`)}return r.join(`
`)},Se=e=>{if(!Z(e)){J.value=U(`common.requirementsNotMet`),Y.value=xe(e),q.value=!0;return}X(e)||(J.value=U(`researchView.researchFailed`),Y.value=U(`researchView.researchFailedMessage`),q.value=!0)},Q=e=>K.value.technologies[e]||0,Ce=e=>{if(!G.value)return!1;let t=W.value[e],n=Q(e);if(t.maxLevel!==void 0&&n>=t.maxLevel)return!1;let r=l(H.player.technologies);if(K.value.researchQueue.length>=r)return!1;let i=$(e,n+1);return h(G.value,H.player.technologies,t.requirements)&&G.value.resources.metal>=i.metal&&G.value.resources.crystal>=i.crystal&&G.value.resources.deuterium>=i.deuterium&&G.value.resources.darkMatter>=i.darkMatter},$=(e,t)=>a(e,t);return(a,o)=>G.value?(m(),c(`div`,L,[f(I,{"required-building":r(_).ResearchLab,"required-level":1},null,8,[`required-building`]),d(`h1`,R,u(r(U)(`researchView.title`)),1),d(`div`,fe,[(m(!0),c(i,null,p(Object.values(r(v)),a=>(m(),te(r(S),{key:a,class:`relative`},{default:n(()=>[f(F,{requirements:r(W)[a].requirements,currentLevel:Q(a)},null,8,[`requirements`,`currentLevel`]),f(r(M),null,{default:n(()=>[d(`div`,z,[d(`div`,B,[f(r(b),{class:`text-sm sm:text-base lg:text-lg cursor-pointer hover:text-primary transition-colors underline decoration-dotted underline-offset-4 order-2 sm:order-1`,onClick:e=>r(_e).openTechnology(a,Q(a))},{default:n(()=>[e(u(r(W)[a].name),1)]),_:2},1032,[`onClick`]),f(r(le),{variant:`secondary`,class:`text-xs whitespace-nowrap self-start order-1 sm:order-2`},{default:n(()=>[e(` Lv `+u(Q(a)),1)]),_:2},1024)])]),f(r(se),{class:`text-xs sm:text-sm`},{default:n(()=>[e(u(r(W)[a].description),1)]),_:2},1024)]),_:2},1024),f(r(N),null,{default:n(()=>[d(`div`,V,[d(`div`,pe,[d(`p`,me,u(r(U)(`researchView.researchCost`))+`:`,1),d(`div`,he,[(m(),c(i,null,p(ye,e=>t(d(`div`,{key:e.key,class:`flex items-center gap-1.5 sm:gap-2`},[f(de,{type:e.key,size:`sm`},null,8,[`type`]),d(`span`,ge,u(r(U)(`resources.${e.key}`))+`:`,1),d(`span`,{class:ie([`font-medium text-xs sm:text-sm`,r(w)(G.value.resources[e.key],$(a,Q(a)+1)[e.key])])},u(r(C)($(a,Q(a)+1)[e.key])),3)]),[[ee,e.key!==`darkMatter`||$(a,Q(a)+1).darkMatter>0]])),64))])]),f(r(y),{onClick:e=>Se(a),disabled:!Ce(a),class:`w-full`},{default:n(()=>[e(u(be(a)),1)]),_:2},1032,[`onClick`,`disabled`])])]),_:2},1024)]),_:2},1024))),128))]),f(r(j),{open:q.value,"onUpdate:open":o[0]||=e=>q.value=e},{default:n(()=>[f(r(A),null,{default:n(()=>[f(r(T),null,{default:n(()=>[f(r(k),null,{default:n(()=>[e(u(J.value),1)]),_:1}),f(r(D),{class:`whitespace-pre-line`},{default:n(()=>[e(u(Y.value),1)]),_:1})]),_:1}),f(r(x),null,{default:n(()=>[f(r(E),null,{default:n(()=>[e(u(r(U)(`common.confirm`)),1)]),_:1})]),_:1})]),_:1})]),_:1},8,[`open`])])):ne(``,!0)}});export{H as default};

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
import{En as e,Gn as t,Jn as n,Xt as r,_n as i,ln as a,mn as o,rn as s,tn as c}from"./game-logic-Bi1l7y4K.js";import{c as l}from"./vendor-others-DTUzJ7S-.js";import{$ as u,c as d,et as f,l as p,s as m,u as h}from"./vendor-reka-ui-BEHIKScj.js";import{G as g}from"./index-BT5w6et-.js";var _=c({__name:`Tabs`,props:{defaultValue:{},orientation:{},dir:{},activationMode:{},modelValue:{},unmountOnHide:{type:Boolean},asChild:{type:Boolean},as:{},class:{}},emits:[`update:modelValue`],setup(c,{emit:d}){let f=c,p=d,m=u(l(f,`class`),p);return(c,l)=>(o(),r(t(h),a({"data-slot":`tabs`},t(m),{class:t(g)(`flex flex-col gap-2`,f.class)}),{default:e(e=>[i(c.$slots,`default`,n(s(e)))]),_:3},16,[`class`]))}}),v=c({__name:`TabsContent`,props:{value:{},forceMount:{type:Boolean},asChild:{type:Boolean},as:{},class:{}},setup(n){let s=n,c=l(s,`class`);return(n,l)=>(o(),r(t(p),a({"data-slot":`tabs-content`,class:t(g)(`flex-1 outline-none`,s.class)},t(c)),{default:e(()=>[i(n.$slots,`default`)]),_:3},16,[`class`]))}}),y=c({__name:`TabsList`,props:{loop:{type:Boolean},asChild:{type:Boolean},as:{},class:{},tabCount:{}},setup(n){let s=n,c=l(s,`class`,`tabCount`);return(l,u)=>(o(),r(t(d),a({"data-slot":`tabs-list`},t(c),{class:t(g)(`bg-muted text-muted-foreground inline-flex w-fit items-center justify-center rounded-lg p-[3px]`,n.tabCount&&n.tabCount>3?n.tabCount>6?`h-[85px] sm:h-9`:`h-[65px] sm:h-9`:`h-9`,s.class)}),{default:e(()=>[i(l.$slots,`default`)]),_:3},16,[`class`]))}}),b=c({__name:`TabsTrigger`,props:{value:{},disabled:{type:Boolean},asChild:{type:Boolean},as:{},class:{}},setup(n){let s=n,c=f(l(s,`class`));return(n,l)=>(o(),r(t(m),a({"data-slot":`tabs-trigger`,class:t(g)(`inline-flex h-[calc(100%-1px)] flex-1 items-center justify-center gap-1.5 rounded-md border border-transparent px-2 py-1 text-sm font-medium whitespace-nowrap transition-all`,`text-muted-foreground hover:text-foreground`,`data-[state=active]:bg-background data-[state=active]:text-foreground data-[state=active]:shadow-md data-[state=active]:border-border`,`dark:data-[state=active]:bg-background dark:data-[state=active]:text-foreground dark:data-[state=active]:border-border dark:data-[state=active]:shadow-lg`,`focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:outline-ring focus-visible:ring-[3px] focus-visible:outline-1`,`disabled:pointer-events-none disabled:opacity-50`,`[&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4`,s.class)},t(c)),{default:e(()=>[i(n.$slots,`default`)]),_:3},16,[`class`]))}});export{_ as i,y as n,v as r,b as t};

View File

@@ -0,0 +1 @@
import{En as e,Gn as t,Jn as n,Xt as r,_n as i,mn as a,rn as o,tn as s}from"./game-logic-Bi1l7y4K.js";import{a as c}from"./vendor-reka-ui-BEHIKScj.js";var l=s({__name:`TooltipProvider`,props:{delayDuration:{default:0},skipDelayDuration:{},disableHoverableContent:{type:Boolean},disableClosingTrigger:{type:Boolean},disabled:{type:Boolean},ignoreNonKeyboardFocus:{type:Boolean}},setup(s){let l=s;return(s,u)=>(a(),r(t(c),n(o(l)),{default:e(()=>[i(s.$slots,`default`)]),_:3},16))}});export{l as t};

View File

@@ -0,0 +1 @@
import{$t as e,En as t,Gn as n,Jt as r,Qt as i,Xn as a,Yt as o,Zt as s,en as c,mn as l,tn as u}from"./game-logic-Bi1l7y4K.js";import{o as d}from"./vendor-vue-router-1sDnnIWZ.js";import{D as f,J as p}from"./vendor-icons-z9V6Jdbh.js";import{t as m}from"./CardDescription-BSLS07AU.js";import{H as h,K as g,W as _,_ as v,b as y,q as b,v as x,y as S}from"./index-BT5w6et-.js";import{t as C}from"./useGameConfig-b98LOtBY.js";var w={key:0,class:`fixed inset-0 z-50 bg-background/80 backdrop-blur-sm flex items-center justify-center p-4`},T={class:`flex justify-center mb-4`},E={class:`rounded-full bg-muted p-4`},D={class:`p-4 bg-muted rounded-lg space-y-2`},O={class:`text-sm font-medium text-center`},k={class:`flex items-center justify-center gap-2`},A={class:`text-base sm:text-lg font-bold`},j={key:0,class:`text-xs text-center text-muted-foreground`},M={class:`flex gap-2`},N=u({__name:`UnlockRequirement`,props:{requiredBuilding:{},requiredLevel:{}},setup(u){let N=u,P=d(),F=b(),{t:I}=g(),{BUILDINGS:L}=C(),R=r(()=>L.value[N.requiredBuilding]?.name||N.requiredBuilding),z=r(()=>F.currentPlanet&&F.currentPlanet.buildings[N.requiredBuilding]||0),B=r(()=>z.value>=N.requiredLevel),V=()=>{P.push(`/buildings`)};return(r,d)=>B.value?s(``,!0):(l(),i(`div`,w,[c(n(y),{class:`max-w-md w-full`},{default:t(()=>[c(n(x),{class:`text-center`},{default:t(()=>[o(`div`,T,[o(`div`,E,[c(n(f),{size:48,class:`text-muted-foreground`})])]),c(n(v),{class:`text-xl sm:text-2xl`},{default:t(()=>[e(a(n(I)(`common.featureLocked`)),1)]),_:1}),c(n(m),{class:`text-sm sm:text-base`},{default:t(()=>[e(a(n(I)(`common.unlockRequired`)),1)]),_:1})]),_:1}),c(n(S),{class:`space-y-4`},{default:t(()=>[o(`div`,D,[o(`p`,O,a(n(I)(`common.requiredBuilding`))+`:`,1),o(`div`,k,[o(`span`,A,a(R.value),1),c(n(h),{variant:`default`},{default:t(()=>[e(`Lv `+a(u.requiredLevel),1)]),_:1})]),z.value===void 0?s(``,!0):(l(),i(`p`,j,a(n(I)(`common.currentLevel`))+`: Lv `+a(z.value),1))]),o(`div`,M,[c(n(_),{onClick:V,class:`flex-1`},{default:t(()=>[c(n(p),{size:16,class:`mr-2`}),e(` `+a(n(I)(`common.goToBuildings`)),1)]),_:1})])]),_:1})]),_:1})]))}});export{N as t};

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 12 KiB

View File

@@ -0,0 +1 @@
var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),s=e=>{let n={};for(var r in e)t(n,r,{get:e[r],enumerable:!0});return n},c=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},l=(n,r,a)=>(a=n==null?{}:e(i(n)),c(r||!n||!n.__esModule?t(a,`default`,{value:n,enumerable:!0}):a,n)),u=(e=>typeof require<`u`?require:typeof Proxy<`u`?new Proxy(e,{get:(e,t)=>(typeof require<`u`?require:e)[t]}):e)(function(e){if(typeof require<`u`)return require.apply(this,arguments);throw Error('Calling `require` for "'+e+"\" in an environment that doesn't expose the `require` function.")});export{l as i,s as n,u as r,o as t};

View File

@@ -0,0 +1 @@
import{Jt as e}from"./game-logic-Bi1l7y4K.js";import{_ as t,d as n,f as r,h as i,l as a,n as o,r as s,s as c,u as l,v as u}from"./game-config-CG6z6nnH.js";import{K as d}from"./index-BT5w6et-.js";const f=()=>{let{t:f}=d(),p={[n.MetalMine]:`metalMine`,[n.CrystalMine]:`crystalMine`,[n.DeuteriumSynthesizer]:`deuteriumSynthesizer`,[n.SolarPlant]:`solarPlant`,[n.FusionReactor]:`fusionReactor`,[n.RoboticsFactory]:`roboticsFactory`,[n.NaniteFactory]:`naniteFactory`,[n.Shipyard]:`shipyard`,[n.ResearchLab]:`researchLab`,[n.MetalStorage]:`metalStorage`,[n.CrystalStorage]:`crystalStorage`,[n.DeuteriumTank]:`deuteriumTank`,[n.DarkMatterCollector]:`darkMatterCollector`,[n.DarkMatterTank]:`darkMatterTank`,[n.MissileSilo]:`missileSilo`,[n.Terraformer]:`terraformer`,[n.LunarBase]:`lunarBase`,[n.SensorPhalanx]:`sensorPhalanx`,[n.JumpGate]:`jumpGate`,[n.PlanetDestroyerFactory]:`planetDestroyerFactory`},m={[t.LightFighter]:`lightFighter`,[t.HeavyFighter]:`heavyFighter`,[t.Cruiser]:`cruiser`,[t.Battleship]:`battleship`,[t.Battlecruiser]:`battlecruiser`,[t.Bomber]:`bomber`,[t.Destroyer]:`destroyer`,[t.SmallCargo]:`smallCargo`,[t.LargeCargo]:`largeCargo`,[t.ColonyShip]:`colonyShip`,[t.Recycler]:`recycler`,[t.EspionageProbe]:`espionageProbe`,[t.SolarSatellite]:`solarSatellite`,[t.DarkMatterHarvester]:`darkMatterHarvester`,[t.Deathstar]:`deathstar`},h={[r.RocketLauncher]:`rocketLauncher`,[r.LightLaser]:`lightLaser`,[r.HeavyLaser]:`heavyLaser`,[r.GaussCannon]:`gaussCannon`,[r.IonCannon]:`ionCannon`,[r.PlasmaTurret]:`plasmaTurret`,[r.SmallShieldDome]:`smallShieldDome`,[r.LargeShieldDome]:`largeShieldDome`,[r.AntiBallisticMissile]:`antiBallisticMissile`,[r.InterplanetaryMissile]:`interplanetaryMissile`,[r.PlanetaryShield]:`planetaryShield`},g={[u.EnergyTechnology]:`energyTechnology`,[u.LaserTechnology]:`laserTechnology`,[u.IonTechnology]:`ionTechnology`,[u.HyperspaceTechnology]:`hyperspaceTechnology`,[u.PlasmaTechnology]:`plasmaTechnology`,[u.ComputerTechnology]:`computerTechnology`,[u.EspionageTechnology]:`espionageTechnology`,[u.WeaponsTechnology]:`weaponsTechnology`,[u.ShieldingTechnology]:`shieldingTechnology`,[u.ArmourTechnology]:`armourTechnology`,[u.Astrophysics]:`astrophysics`,[u.GravitonTechnology]:`gravitonTechnology`,[u.CombustionDrive]:`combustionDrive`,[u.ImpulseDrive]:`impulseDrive`,[u.HyperspaceDrive]:`hyperspaceDrive`,[u.DarkMatterTechnology]:`darkMatterTechnology`,[u.TerraformingTechnology]:`terraformingTechnology`,[u.PlanetDestructionTech]:`planetDestructionTech`},_={[i.Commander]:`commander`,[i.Admiral]:`admiral`,[i.Engineer]:`engineer`,[i.Geologist]:`geologist`,[i.Technocrat]:`technocrat`,[i.DarkMatterSpecialist]:`darkMatterSpecialist`};return{BUILDINGS:e(()=>{let e={};for(let[t,n]of Object.entries(o)){let r=t,i=p[r];e[r]={...n,name:f(`buildings.${i}`),description:f(`buildingDescriptions.${i}`)}}return e}),SHIPS:e(()=>{let e={};for(let[t,n]of Object.entries(a)){let r=t,i=m[r];e[r]={...n,name:f(`ships.${i}`),description:f(`shipDescriptions.${i}`)}}return e}),DEFENSES:e(()=>{let e={};for(let[t,n]of Object.entries(s)){let r=t,i=h[r];e[r]={...n,name:f(`defenses.${i}`),description:f(`defenseDescriptions.${i}`)}}return e}),TECHNOLOGIES:e(()=>{let e={};for(let[t,n]of Object.entries(l)){let r=t,i=g[r];e[r]={...n,name:f(`technologies.${i}`),description:f(`technologyDescriptions.${i}`)}}return e}),OFFICERS:e(()=>{let e={};for(let[t,n]of Object.entries(c)){let r=t,i=_[r];e[r]={...n,name:f(`officers.${i}`),description:f(`officerDescriptions.${i}`)}}return e})}};export{f as t};

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
import{Bn as e,Cn as t,Gn as n,Jt as r,Ln as i,Wn as a,an as o,fn as s,nn as c,un as l,wn as u}from"./game-logic-Bi1l7y4K.js";import{a as d,i as f,l as p,o as m,r as h,s as g,u as _}from"./vendor-others-DTUzJ7S-.js";var v=f?window:void 0,y=f?window.document:void 0;f&&window.navigator,f&&window.location;function b(e){let t=a(e);return t?.$el??t}function x(...e){let t=(e,t,n,r)=>(e.addEventListener(t,n,r),()=>e.removeEventListener(t,n,r)),i=r(()=>{let t=p(a(e[0])).filter(e=>e!=null);return t.every(e=>typeof e!=`string`)?t:void 0});return _(()=>[i.value?.map(e=>b(e))??[v].filter(e=>e!=null),p(a(i.value?e[1]:e[0])),p(n(i.value?e[2]:e[1])),a(i.value?e[3]:e[2])],([e,n,r,i],a,o)=>{if(!e?.length||!n?.length||!r?.length)return;let s=m(i)?{...i}:i,c=e.flatMap(e=>n.flatMap(n=>r.map(r=>t(e,n,r,s))));o(()=>{c.forEach(e=>e())})},{flush:`post`})}function S(){let t=e(!1),n=c();return n&&s(()=>{t.value=!0},n),t}function C(e){let t=S();return r(()=>(t.value,!!e()))}var w=Symbol(`vueuse-ssr-width`);function T(){let e=o()?h(w,null):null;return typeof e==`number`?e:void 0}function E(t,n={}){let{window:i=v,ssrWidth:o=T()}=n,s=C(()=>i&&`matchMedia`in i&&typeof i.matchMedia==`function`),c=e(typeof o==`number`),l=e(),d=e(!1);return u(()=>{if(c.value){c.value=!s.value,d.value=a(t).split(`,`).some(e=>{let t=e.includes(`not all`),n=e.match(/\(\s*min-width:\s*(-?\d+(?:\.\d*)?[a-z]+\s*)\)/),r=e.match(/\(\s*max-width:\s*(-?\d+(?:\.\d*)?[a-z]+\s*)\)/),i=!!(n||r);return n&&i&&(i=o>=g(n[1])),r&&i&&(i=o<=g(r[1])),t?!i:i});return}s.value&&(l.value=i.matchMedia(a(t)),d.value=l.value.matches)}),x(l,`change`,e=>{d.value=e.matches},{passive:!0}),r(()=>d.value)}function D(e){return JSON.parse(JSON.stringify(e))}function O(e,n,a,o={}){var s,u;let{clone:f=!1,passive:p=!1,eventName:m,deep:h=!1,defaultValue:g,shouldEmit:_}=o,v=c(),y=a||v?.emit||(v==null||(s=v.$emit)==null?void 0:s.bind(v))||(v==null||(u=v.proxy)==null||(u=u.$emit)==null?void 0:u.bind(v?.proxy)),b=m;n||=`modelValue`,b||=`update:${n.toString()}`;let x=e=>f?typeof f==`function`?f(e):D(e):e,S=()=>d(e[n])?x(e[n]):g,C=e=>{_?_(e)&&y(b,e):y(b,e)};if(p){let r=i(S()),a=!1;return t(()=>e[n],e=>{a||(a=!0,r.value=x(e),l(()=>a=!1))}),t(r,t=>{!a&&(t!==e[n]||h)&&C(t)},{deep:h}),r}else return r({get(){return S()},set(e){C(e)}})}export{O as i,x as n,E as r,y as t};

BIN
docs/favicon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 227 KiB

34
docs/index.html Normal file
View File

@@ -0,0 +1,34 @@
<!DOCTYPE html>
<html lang="zh-cmn-Hans">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, viewport-fit=cover" />
<link rel="icon" type="image/svg+xml" href="./logo.svg" />
<title>OGame-Vue-Ts</title>
<script type="module" crossorigin src="./assets/index-BT5w6et-.js"></script>
<link rel="modulepreload" crossorigin href="./assets/game-config-CG6z6nnH.js">
<link rel="modulepreload" crossorigin href="./assets/rolldown-runtime-CIDIeb-o.js">
<link rel="modulepreload" crossorigin href="./assets/game-logic-Bi1l7y4K.js">
<link rel="modulepreload" crossorigin href="./assets/vendor-others-DTUzJ7S-.js">
<link rel="modulepreload" crossorigin href="./assets/vendor-reka-ui-BEHIKScj.js">
<link rel="modulepreload" crossorigin href="./assets/vendor-vueuse-CJcfYqoW.js">
<link rel="modulepreload" crossorigin href="./assets/vendor-crypto-CQM8pryk.js">
<link rel="modulepreload" crossorigin href="./assets/vendor-utils-BlvnUqQX.js">
<link rel="modulepreload" crossorigin href="./assets/vendor-icons-z9V6Jdbh.js">
<link rel="modulepreload" crossorigin href="./assets/vendor-pinia-DqhKuBjp.js">
<link rel="modulepreload" crossorigin href="./assets/vendor-vue-router-1sDnnIWZ.js">
<link rel="modulepreload" crossorigin href="./assets/game-i18n-Dr0JspcV.js">
<link rel="stylesheet" crossorigin href="./assets/vendor-others-BMPyaZWq.css">
<link rel="stylesheet" crossorigin href="./assets/index-D0T1QtIu.css">
</head>
<body>
<div id="app"></div>
<!-- 统计勿删 -->
<script charset="UTF-8" id="LA_COLLECT" src="https://sdk.51.la/js-sdk-pro.min.js"></script>
<script>LA.init({ id: "L298GYqn6JhAO0VU", ck: "L298GYqn6JhAO0VU", autoTrack: true, hashMode: true })</script>
</body>

1
docs/logo.svg Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 12 KiB

View File

@@ -1,26 +1,27 @@
import { app, BrowserWindow } from 'electron' import { app, BrowserWindow } from 'electron'
// @ts-ignore // @ts-ignore
import path from "node:path"; import path from 'node:path'
import { fileURLToPath } from 'node:url' import { fileURLToPath } from 'node:url'
import { dirname } from 'node:path' import { dirname } from 'node:path'
import pkg from '../package.json'
app.whenReady().then(() => { app.whenReady().then(() => {
// @ts-ignore // @ts-ignore
const __filename = fileURLToPath(import.meta.url) const __filename = fileURLToPath(import.meta.url)
const __dirname = dirname(__filename) const __dirname = dirname(__filename)
const win = new BrowserWindow({ const win = new BrowserWindow({
title: 'OGame', title: pkg.title,
icon: path.join(__dirname, '../public/favicon.ico'), icon: path.join(__dirname, '../public/favicon.ico'),
width: 1200, width: 1200,
height: 800, height: 800
}) })
win.setMenu(null); win.setMenu(null)
// You can use `process.env.VITE_DEV_SERVER_URL` when the vite command is called `serve` // You can use `process.env.VITE_DEV_SERVER_URL` when the vite command is called `serve`
if (process.env.VITE_DEV_SERVER_URL) { if (process.env.VITE_DEV_SERVER_URL) {
win.loadURL(process.env.VITE_DEV_SERVER_URL) win.loadURL(process.env.VITE_DEV_SERVER_URL)
} else { } else {
// Load your file // Load your file
win.loadFile('docs/index.html'); win.loadFile('docs/index.html')
} }
}) })

8190
package-lock.json generated Normal file
View File

@@ -0,0 +1,8190 @@
{
"name": "ogame-vue-ts",
"version": "1.1.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "ogame-vue-ts",
"version": "1.1.0",
"dependencies": {
"@tailwindcss/vite": "^4.1.17",
"@tanstack/vue-table": "^8.21.3",
"@vueuse/core": "^14.1.0",
"class-variance-authority": "^0.7.1",
"clsx": "^2.1.1",
"crypto-js": "^4.2.0",
"file-saver": "^2.0.5",
"finalhandler": "^2.1.1",
"lucide-vue-next": "^0.556.0",
"pinia": "^3.0.4",
"pinia-plugin-persistedstate": "^4.7.1",
"reka-ui": "^2.6.1",
"serve-static": "^2.2.0",
"tailwind-merge": "^3.4.0",
"tailwindcss": "^4.1.17",
"vue": "^3.5.24",
"vue-router": "4",
"vue-sonner": "^2.0.9"
},
"devDependencies": {
"@types/crypto-js": "^4.2.2",
"@types/file-saver": "^2.0.7",
"@types/node": "^24.10.2",
"@vitejs/plugin-vue": "^6.0.1",
"@vue/tsconfig": "^0.8.1",
"electron": "^30.0.0",
"electron-builder": "^26.0.12",
"electron-vite": "^5.0.0",
"tw-animate-css": "^1.4.0",
"typescript": "~5.9.3",
"vite": "npm:rolldown-vite@7.2.5",
"vite-plugin-electron": "^0.29.0",
"vite-plugin-electron-renderer": "^0.14.6",
"vue-tsc": "^3.1.4"
}
},
"node_modules/@babel/code-frame": {
"version": "7.27.1",
"resolved": "https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.27.1.tgz",
"integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-validator-identifier": "^7.27.1",
"js-tokens": "^4.0.0",
"picocolors": "^1.1.1"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/compat-data": {
"version": "7.28.5",
"resolved": "https://registry.npmmirror.com/@babel/compat-data/-/compat-data-7.28.5.tgz",
"integrity": "sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/core": {
"version": "7.28.5",
"resolved": "https://registry.npmmirror.com/@babel/core/-/core-7.28.5.tgz",
"integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/code-frame": "^7.27.1",
"@babel/generator": "^7.28.5",
"@babel/helper-compilation-targets": "^7.27.2",
"@babel/helper-module-transforms": "^7.28.3",
"@babel/helpers": "^7.28.4",
"@babel/parser": "^7.28.5",
"@babel/template": "^7.27.2",
"@babel/traverse": "^7.28.5",
"@babel/types": "^7.28.5",
"@jridgewell/remapping": "^2.3.5",
"convert-source-map": "^2.0.0",
"debug": "^4.1.0",
"gensync": "^1.0.0-beta.2",
"json5": "^2.2.3",
"semver": "^6.3.1"
},
"engines": {
"node": ">=6.9.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/babel"
}
},
"node_modules/@babel/generator": {
"version": "7.28.5",
"resolved": "https://registry.npmmirror.com/@babel/generator/-/generator-7.28.5.tgz",
"integrity": "sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/parser": "^7.28.5",
"@babel/types": "^7.28.5",
"@jridgewell/gen-mapping": "^0.3.12",
"@jridgewell/trace-mapping": "^0.3.28",
"jsesc": "^3.0.2"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-compilation-targets": {
"version": "7.27.2",
"resolved": "https://registry.npmmirror.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz",
"integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/compat-data": "^7.27.2",
"@babel/helper-validator-option": "^7.27.1",
"browserslist": "^4.24.0",
"lru-cache": "^5.1.1",
"semver": "^6.3.1"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-globals": {
"version": "7.28.0",
"resolved": "https://registry.npmmirror.com/@babel/helper-globals/-/helper-globals-7.28.0.tgz",
"integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-module-imports": {
"version": "7.27.1",
"resolved": "https://registry.npmmirror.com/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz",
"integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/traverse": "^7.27.1",
"@babel/types": "^7.27.1"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-module-transforms": {
"version": "7.28.3",
"resolved": "https://registry.npmmirror.com/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz",
"integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-module-imports": "^7.27.1",
"@babel/helper-validator-identifier": "^7.27.1",
"@babel/traverse": "^7.28.3"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0"
}
},
"node_modules/@babel/helper-plugin-utils": {
"version": "7.27.1",
"resolved": "https://registry.npmmirror.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz",
"integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-string-parser": {
"version": "7.27.1",
"resolved": "https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz",
"integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==",
"license": "MIT",
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-validator-identifier": {
"version": "7.28.5",
"resolved": "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz",
"integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==",
"license": "MIT",
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-validator-option": {
"version": "7.27.1",
"resolved": "https://registry.npmmirror.com/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz",
"integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helpers": {
"version": "7.28.4",
"resolved": "https://registry.npmmirror.com/@babel/helpers/-/helpers-7.28.4.tgz",
"integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/template": "^7.27.2",
"@babel/types": "^7.28.4"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/parser": {
"version": "7.28.5",
"resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.28.5.tgz",
"integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==",
"license": "MIT",
"dependencies": {
"@babel/types": "^7.28.5"
},
"bin": {
"parser": "bin/babel-parser.js"
},
"engines": {
"node": ">=6.0.0"
}
},
"node_modules/@babel/plugin-transform-arrow-functions": {
"version": "7.27.1",
"resolved": "https://registry.npmmirror.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.27.1.tgz",
"integrity": "sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.27.1"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/template": {
"version": "7.27.2",
"resolved": "https://registry.npmmirror.com/@babel/template/-/template-7.27.2.tgz",
"integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/code-frame": "^7.27.1",
"@babel/parser": "^7.27.2",
"@babel/types": "^7.27.1"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/traverse": {
"version": "7.28.5",
"resolved": "https://registry.npmmirror.com/@babel/traverse/-/traverse-7.28.5.tgz",
"integrity": "sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/code-frame": "^7.27.1",
"@babel/generator": "^7.28.5",
"@babel/helper-globals": "^7.28.0",
"@babel/parser": "^7.28.5",
"@babel/template": "^7.27.2",
"@babel/types": "^7.28.5",
"debug": "^4.3.1"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/types": {
"version": "7.28.5",
"resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.28.5.tgz",
"integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==",
"license": "MIT",
"dependencies": {
"@babel/helper-string-parser": "^7.27.1",
"@babel/helper-validator-identifier": "^7.28.5"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@develar/schema-utils": {
"version": "2.6.5",
"resolved": "https://registry.npmmirror.com/@develar/schema-utils/-/schema-utils-2.6.5.tgz",
"integrity": "sha512-0cp4PsWQ/9avqTVMCtZ+GirikIA36ikvjtHweU4/j8yLtgObI0+JUPhYFScgwlteveGB1rt3Cm8UhN04XayDig==",
"dev": true,
"license": "MIT",
"dependencies": {
"ajv": "^6.12.0",
"ajv-keywords": "^3.4.1"
},
"engines": {
"node": ">= 8.9.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/webpack"
}
},
"node_modules/@electron/asar": {
"version": "3.2.18",
"resolved": "https://registry.npmmirror.com/@electron/asar/-/asar-3.2.18.tgz",
"integrity": "sha512-2XyvMe3N3Nrs8cV39IKELRHTYUWFKrmqqSY1U+GMlc0jvqjIVnoxhNd2H4JolWQncbJi1DCvb5TNxZuI2fEjWg==",
"dev": true,
"license": "MIT",
"dependencies": {
"commander": "^5.0.0",
"glob": "^7.1.6",
"minimatch": "^3.0.4"
},
"bin": {
"asar": "bin/asar.js"
},
"engines": {
"node": ">=10.12.0"
}
},
"node_modules/@electron/asar/node_modules/minimatch": {
"version": "3.1.2",
"resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz",
"integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
"dev": true,
"license": "ISC",
"dependencies": {
"brace-expansion": "^1.1.7"
},
"engines": {
"node": "*"
}
},
"node_modules/@electron/fuses": {
"version": "1.8.0",
"resolved": "https://registry.npmmirror.com/@electron/fuses/-/fuses-1.8.0.tgz",
"integrity": "sha512-zx0EIq78WlY/lBb1uXlziZmDZI4ubcCXIMJ4uGjXzZW0nS19TjSPeXPAjzzTmKQlJUZm0SbmZhPKP7tuQ1SsEw==",
"dev": true,
"license": "MIT",
"dependencies": {
"chalk": "^4.1.1",
"fs-extra": "^9.0.1",
"minimist": "^1.2.5"
},
"bin": {
"electron-fuses": "dist/bin.js"
}
},
"node_modules/@electron/fuses/node_modules/fs-extra": {
"version": "9.1.0",
"resolved": "https://registry.npmmirror.com/fs-extra/-/fs-extra-9.1.0.tgz",
"integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"at-least-node": "^1.0.0",
"graceful-fs": "^4.2.0",
"jsonfile": "^6.0.1",
"universalify": "^2.0.0"
},
"engines": {
"node": ">=10"
}
},
"node_modules/@electron/fuses/node_modules/jsonfile": {
"version": "6.2.0",
"resolved": "https://registry.npmmirror.com/jsonfile/-/jsonfile-6.2.0.tgz",
"integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==",
"dev": true,
"license": "MIT",
"dependencies": {
"universalify": "^2.0.0"
},
"optionalDependencies": {
"graceful-fs": "^4.1.6"
}
},
"node_modules/@electron/fuses/node_modules/universalify": {
"version": "2.0.1",
"resolved": "https://registry.npmmirror.com/universalify/-/universalify-2.0.1.tgz",
"integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 10.0.0"
}
},
"node_modules/@electron/get": {
"version": "2.0.3",
"resolved": "https://registry.npmmirror.com/@electron/get/-/get-2.0.3.tgz",
"integrity": "sha512-Qkzpg2s9GnVV2I2BjRksUi43U5e6+zaQMcjoJy0C+C5oxaKl+fmckGDQFtRpZpZV0NQekuZZ+tGz7EA9TVnQtQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"debug": "^4.1.1",
"env-paths": "^2.2.0",
"fs-extra": "^8.1.0",
"got": "^11.8.5",
"progress": "^2.0.3",
"semver": "^6.2.0",
"sumchecker": "^3.0.1"
},
"engines": {
"node": ">=12"
},
"optionalDependencies": {
"global-agent": "^3.0.0"
}
},
"node_modules/@electron/node-gyp": {
"version": "10.2.0-electron.1",
"resolved": "git+ssh://git@github.com/electron/node-gyp.git#06b29aafb7708acef8b3669835c8a7857ebc92d2",
"integrity": "sha512-4MSBTT8y07YUDqf69/vSh80Hh791epYqGtWHO3zSKhYFwQg+gx9wi1PqbqP6YqC4WMsNxZ5l9oDmnWdK5pfCKQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"env-paths": "^2.2.0",
"exponential-backoff": "^3.1.1",
"glob": "^8.1.0",
"graceful-fs": "^4.2.6",
"make-fetch-happen": "^10.2.1",
"nopt": "^6.0.0",
"proc-log": "^2.0.1",
"semver": "^7.3.5",
"tar": "^6.2.1",
"which": "^2.0.2"
},
"bin": {
"node-gyp": "bin/node-gyp.js"
},
"engines": {
"node": ">=12.13.0"
}
},
"node_modules/@electron/node-gyp/node_modules/brace-expansion": {
"version": "2.0.2",
"resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-2.0.2.tgz",
"integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"balanced-match": "^1.0.0"
}
},
"node_modules/@electron/node-gyp/node_modules/glob": {
"version": "8.1.0",
"resolved": "https://registry.npmmirror.com/glob/-/glob-8.1.0.tgz",
"integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==",
"deprecated": "Glob versions prior to v9 are no longer supported",
"dev": true,
"license": "ISC",
"dependencies": {
"fs.realpath": "^1.0.0",
"inflight": "^1.0.4",
"inherits": "2",
"minimatch": "^5.0.1",
"once": "^1.3.0"
},
"engines": {
"node": ">=12"
},
"funding": {
"url": "https://github.com/sponsors/isaacs"
}
},
"node_modules/@electron/node-gyp/node_modules/minimatch": {
"version": "5.1.6",
"resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-5.1.6.tgz",
"integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
"dev": true,
"license": "ISC",
"dependencies": {
"brace-expansion": "^2.0.1"
},
"engines": {
"node": ">=10"
}
},
"node_modules/@electron/node-gyp/node_modules/semver": {
"version": "7.7.3",
"resolved": "https://registry.npmmirror.com/semver/-/semver-7.7.3.tgz",
"integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==",
"dev": true,
"license": "ISC",
"bin": {
"semver": "bin/semver.js"
},
"engines": {
"node": ">=10"
}
},
"node_modules/@electron/notarize": {
"version": "2.5.0",
"resolved": "https://registry.npmmirror.com/@electron/notarize/-/notarize-2.5.0.tgz",
"integrity": "sha512-jNT8nwH1f9X5GEITXaQ8IF/KdskvIkOFfB2CvwumsveVidzpSc+mvhhTMdAGSYF3O+Nq49lJ7y+ssODRXu06+A==",
"dev": true,
"license": "MIT",
"dependencies": {
"debug": "^4.1.1",
"fs-extra": "^9.0.1",
"promise-retry": "^2.0.1"
},
"engines": {
"node": ">= 10.0.0"
}
},
"node_modules/@electron/notarize/node_modules/fs-extra": {
"version": "9.1.0",
"resolved": "https://registry.npmmirror.com/fs-extra/-/fs-extra-9.1.0.tgz",
"integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"at-least-node": "^1.0.0",
"graceful-fs": "^4.2.0",
"jsonfile": "^6.0.1",
"universalify": "^2.0.0"
},
"engines": {
"node": ">=10"
}
},
"node_modules/@electron/notarize/node_modules/jsonfile": {
"version": "6.2.0",
"resolved": "https://registry.npmmirror.com/jsonfile/-/jsonfile-6.2.0.tgz",
"integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==",
"dev": true,
"license": "MIT",
"dependencies": {
"universalify": "^2.0.0"
},
"optionalDependencies": {
"graceful-fs": "^4.1.6"
}
},
"node_modules/@electron/notarize/node_modules/universalify": {
"version": "2.0.1",
"resolved": "https://registry.npmmirror.com/universalify/-/universalify-2.0.1.tgz",
"integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 10.0.0"
}
},
"node_modules/@electron/osx-sign": {
"version": "1.3.1",
"resolved": "https://registry.npmmirror.com/@electron/osx-sign/-/osx-sign-1.3.1.tgz",
"integrity": "sha512-BAfviURMHpmb1Yb50YbCxnOY0wfwaLXH5KJ4+80zS0gUkzDX3ec23naTlEqKsN+PwYn+a1cCzM7BJ4Wcd3sGzw==",
"dev": true,
"license": "BSD-2-Clause",
"dependencies": {
"compare-version": "^0.1.2",
"debug": "^4.3.4",
"fs-extra": "^10.0.0",
"isbinaryfile": "^4.0.8",
"minimist": "^1.2.6",
"plist": "^3.0.5"
},
"bin": {
"electron-osx-flat": "bin/electron-osx-flat.js",
"electron-osx-sign": "bin/electron-osx-sign.js"
},
"engines": {
"node": ">=12.0.0"
}
},
"node_modules/@electron/osx-sign/node_modules/fs-extra": {
"version": "10.1.0",
"resolved": "https://registry.npmmirror.com/fs-extra/-/fs-extra-10.1.0.tgz",
"integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"graceful-fs": "^4.2.0",
"jsonfile": "^6.0.1",
"universalify": "^2.0.0"
},
"engines": {
"node": ">=12"
}
},
"node_modules/@electron/osx-sign/node_modules/isbinaryfile": {
"version": "4.0.10",
"resolved": "https://registry.npmmirror.com/isbinaryfile/-/isbinaryfile-4.0.10.tgz",
"integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 8.0.0"
},
"funding": {
"url": "https://github.com/sponsors/gjtorikian/"
}
},
"node_modules/@electron/osx-sign/node_modules/jsonfile": {
"version": "6.2.0",
"resolved": "https://registry.npmmirror.com/jsonfile/-/jsonfile-6.2.0.tgz",
"integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==",
"dev": true,
"license": "MIT",
"dependencies": {
"universalify": "^2.0.0"
},
"optionalDependencies": {
"graceful-fs": "^4.1.6"
}
},
"node_modules/@electron/osx-sign/node_modules/universalify": {
"version": "2.0.1",
"resolved": "https://registry.npmmirror.com/universalify/-/universalify-2.0.1.tgz",
"integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 10.0.0"
}
},
"node_modules/@electron/rebuild": {
"version": "3.7.0",
"resolved": "https://registry.npmmirror.com/@electron/rebuild/-/rebuild-3.7.0.tgz",
"integrity": "sha512-VW++CNSlZwMYP7MyXEbrKjpzEwhB5kDNbzGtiPEjwYysqyTCF+YbNJ210Dj3AjWsGSV4iEEwNkmJN9yGZmVvmw==",
"dev": true,
"license": "MIT",
"dependencies": {
"@electron/node-gyp": "git+https://github.com/electron/node-gyp.git#06b29aafb7708acef8b3669835c8a7857ebc92d2",
"@malept/cross-spawn-promise": "^2.0.0",
"chalk": "^4.0.0",
"debug": "^4.1.1",
"detect-libc": "^2.0.1",
"fs-extra": "^10.0.0",
"got": "^11.7.0",
"node-abi": "^3.45.0",
"node-api-version": "^0.2.0",
"ora": "^5.1.0",
"read-binary-file-arch": "^1.0.6",
"semver": "^7.3.5",
"tar": "^6.0.5",
"yargs": "^17.0.1"
},
"bin": {
"electron-rebuild": "lib/cli.js"
},
"engines": {
"node": ">=12.13.0"
}
},
"node_modules/@electron/rebuild/node_modules/fs-extra": {
"version": "10.1.0",
"resolved": "https://registry.npmmirror.com/fs-extra/-/fs-extra-10.1.0.tgz",
"integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"graceful-fs": "^4.2.0",
"jsonfile": "^6.0.1",
"universalify": "^2.0.0"
},
"engines": {
"node": ">=12"
}
},
"node_modules/@electron/rebuild/node_modules/jsonfile": {
"version": "6.2.0",
"resolved": "https://registry.npmmirror.com/jsonfile/-/jsonfile-6.2.0.tgz",
"integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==",
"dev": true,
"license": "MIT",
"dependencies": {
"universalify": "^2.0.0"
},
"optionalDependencies": {
"graceful-fs": "^4.1.6"
}
},
"node_modules/@electron/rebuild/node_modules/semver": {
"version": "7.7.3",
"resolved": "https://registry.npmmirror.com/semver/-/semver-7.7.3.tgz",
"integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==",
"dev": true,
"license": "ISC",
"bin": {
"semver": "bin/semver.js"
},
"engines": {
"node": ">=10"
}
},
"node_modules/@electron/rebuild/node_modules/universalify": {
"version": "2.0.1",
"resolved": "https://registry.npmmirror.com/universalify/-/universalify-2.0.1.tgz",
"integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 10.0.0"
}
},
"node_modules/@electron/universal": {
"version": "2.0.1",
"resolved": "https://registry.npmmirror.com/@electron/universal/-/universal-2.0.1.tgz",
"integrity": "sha512-fKpv9kg4SPmt+hY7SVBnIYULE9QJl8L3sCfcBsnqbJwwBwAeTLokJ9TRt9y7bK0JAzIW2y78TVVjvnQEms/yyA==",
"dev": true,
"license": "MIT",
"dependencies": {
"@electron/asar": "^3.2.7",
"@malept/cross-spawn-promise": "^2.0.0",
"debug": "^4.3.1",
"dir-compare": "^4.2.0",
"fs-extra": "^11.1.1",
"minimatch": "^9.0.3",
"plist": "^3.1.0"
},
"engines": {
"node": ">=16.4"
}
},
"node_modules/@electron/universal/node_modules/brace-expansion": {
"version": "2.0.2",
"resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-2.0.2.tgz",
"integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"balanced-match": "^1.0.0"
}
},
"node_modules/@electron/universal/node_modules/fs-extra": {
"version": "11.3.2",
"resolved": "https://registry.npmmirror.com/fs-extra/-/fs-extra-11.3.2.tgz",
"integrity": "sha512-Xr9F6z6up6Ws+NjzMCZc6WXg2YFRlrLP9NQDO3VQrWrfiojdhS56TzueT88ze0uBdCTwEIhQ3ptnmKeWGFAe0A==",
"dev": true,
"license": "MIT",
"dependencies": {
"graceful-fs": "^4.2.0",
"jsonfile": "^6.0.1",
"universalify": "^2.0.0"
},
"engines": {
"node": ">=14.14"
}
},
"node_modules/@electron/universal/node_modules/jsonfile": {
"version": "6.2.0",
"resolved": "https://registry.npmmirror.com/jsonfile/-/jsonfile-6.2.0.tgz",
"integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==",
"dev": true,
"license": "MIT",
"dependencies": {
"universalify": "^2.0.0"
},
"optionalDependencies": {
"graceful-fs": "^4.1.6"
}
},
"node_modules/@electron/universal/node_modules/minimatch": {
"version": "9.0.5",
"resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-9.0.5.tgz",
"integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
"dev": true,
"license": "ISC",
"dependencies": {
"brace-expansion": "^2.0.1"
},
"engines": {
"node": ">=16 || 14 >=14.17"
},
"funding": {
"url": "https://github.com/sponsors/isaacs"
}
},
"node_modules/@electron/universal/node_modules/universalify": {
"version": "2.0.1",
"resolved": "https://registry.npmmirror.com/universalify/-/universalify-2.0.1.tgz",
"integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 10.0.0"
}
},
"node_modules/@electron/windows-sign": {
"version": "1.2.2",
"resolved": "https://registry.npmmirror.com/@electron/windows-sign/-/windows-sign-1.2.2.tgz",
"integrity": "sha512-dfZeox66AvdPtb2lD8OsIIQh12Tp0GNCRUDfBHIKGpbmopZto2/A8nSpYYLoedPIHpqkeblZ/k8OV0Gy7PYuyQ==",
"dev": true,
"license": "BSD-2-Clause",
"optional": true,
"peer": true,
"dependencies": {
"cross-dirname": "^0.1.0",
"debug": "^4.3.4",
"fs-extra": "^11.1.1",
"minimist": "^1.2.8",
"postject": "^1.0.0-alpha.6"
},
"bin": {
"electron-windows-sign": "bin/electron-windows-sign.js"
},
"engines": {
"node": ">=14.14"
}
},
"node_modules/@electron/windows-sign/node_modules/fs-extra": {
"version": "11.3.2",
"resolved": "https://registry.npmmirror.com/fs-extra/-/fs-extra-11.3.2.tgz",
"integrity": "sha512-Xr9F6z6up6Ws+NjzMCZc6WXg2YFRlrLP9NQDO3VQrWrfiojdhS56TzueT88ze0uBdCTwEIhQ3ptnmKeWGFAe0A==",
"dev": true,
"license": "MIT",
"optional": true,
"peer": true,
"dependencies": {
"graceful-fs": "^4.2.0",
"jsonfile": "^6.0.1",
"universalify": "^2.0.0"
},
"engines": {
"node": ">=14.14"
}
},
"node_modules/@electron/windows-sign/node_modules/jsonfile": {
"version": "6.2.0",
"resolved": "https://registry.npmmirror.com/jsonfile/-/jsonfile-6.2.0.tgz",
"integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==",
"dev": true,
"license": "MIT",
"optional": true,
"peer": true,
"dependencies": {
"universalify": "^2.0.0"
},
"optionalDependencies": {
"graceful-fs": "^4.1.6"
}
},
"node_modules/@electron/windows-sign/node_modules/universalify": {
"version": "2.0.1",
"resolved": "https://registry.npmmirror.com/universalify/-/universalify-2.0.1.tgz",
"integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
"dev": true,
"license": "MIT",
"optional": true,
"peer": true,
"engines": {
"node": ">= 10.0.0"
}
},
"node_modules/@emnapi/core": {
"version": "1.7.1",
"resolved": "https://registry.npmmirror.com/@emnapi/core/-/core-1.7.1.tgz",
"integrity": "sha512-o1uhUASyo921r2XtHYOHy7gdkGLge8ghBEQHMWmyJFoXlpU58kIrhhN3w26lpQb6dspetweapMn2CSNwQ8I4wg==",
"license": "MIT",
"optional": true,
"dependencies": {
"@emnapi/wasi-threads": "1.1.0",
"tslib": "^2.4.0"
}
},
"node_modules/@emnapi/runtime": {
"version": "1.7.1",
"resolved": "https://registry.npmmirror.com/@emnapi/runtime/-/runtime-1.7.1.tgz",
"integrity": "sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA==",
"license": "MIT",
"optional": true,
"dependencies": {
"tslib": "^2.4.0"
}
},
"node_modules/@emnapi/wasi-threads": {
"version": "1.1.0",
"resolved": "https://registry.npmmirror.com/@emnapi/wasi-threads/-/wasi-threads-1.1.0.tgz",
"integrity": "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==",
"license": "MIT",
"optional": true,
"dependencies": {
"tslib": "^2.4.0"
}
},
"node_modules/@esbuild/aix-ppc64": {
"version": "0.25.12",
"resolved": "https://registry.npmmirror.com/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz",
"integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==",
"cpu": [
"ppc64"
],
"license": "MIT",
"optional": true,
"os": [
"aix"
],
"engines": {
"node": ">=18"
}
},
"node_modules/@esbuild/android-arm": {
"version": "0.25.12",
"resolved": "https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.25.12.tgz",
"integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==",
"cpu": [
"arm"
],
"license": "MIT",
"optional": true,
"os": [
"android"
],
"engines": {
"node": ">=18"
}
},
"node_modules/@esbuild/android-arm64": {
"version": "0.25.12",
"resolved": "https://registry.npmmirror.com/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz",
"integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==",
"cpu": [
"arm64"
],
"license": "MIT",
"optional": true,
"os": [
"android"
],
"engines": {
"node": ">=18"
}
},
"node_modules/@esbuild/android-x64": {
"version": "0.25.12",
"resolved": "https://registry.npmmirror.com/@esbuild/android-x64/-/android-x64-0.25.12.tgz",
"integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==",
"cpu": [
"x64"
],
"license": "MIT",
"optional": true,
"os": [
"android"
],
"engines": {
"node": ">=18"
}
},
"node_modules/@esbuild/darwin-arm64": {
"version": "0.25.12",
"resolved": "https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz",
"integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==",
"cpu": [
"arm64"
],
"license": "MIT",
"optional": true,
"os": [
"darwin"
],
"engines": {
"node": ">=18"
}
},
"node_modules/@esbuild/darwin-x64": {
"version": "0.25.12",
"resolved": "https://registry.npmmirror.com/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz",
"integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==",
"cpu": [
"x64"
],
"license": "MIT",
"optional": true,
"os": [
"darwin"
],
"engines": {
"node": ">=18"
}
},
"node_modules/@esbuild/freebsd-arm64": {
"version": "0.25.12",
"resolved": "https://registry.npmmirror.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz",
"integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==",
"cpu": [
"arm64"
],
"license": "MIT",
"optional": true,
"os": [
"freebsd"
],
"engines": {
"node": ">=18"
}
},
"node_modules/@esbuild/freebsd-x64": {
"version": "0.25.12",
"resolved": "https://registry.npmmirror.com/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz",
"integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==",
"cpu": [
"x64"
],
"license": "MIT",
"optional": true,
"os": [
"freebsd"
],
"engines": {
"node": ">=18"
}
},
"node_modules/@esbuild/linux-arm": {
"version": "0.25.12",
"resolved": "https://registry.npmmirror.com/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz",
"integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==",
"cpu": [
"arm"
],
"license": "MIT",
"optional": true,
"os": [
"linux"
],
"engines": {
"node": ">=18"
}
},
"node_modules/@esbuild/linux-arm64": {
"version": "0.25.12",
"resolved": "https://registry.npmmirror.com/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz",
"integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==",
"cpu": [
"arm64"
],
"license": "MIT",
"optional": true,
"os": [
"linux"
],
"engines": {
"node": ">=18"
}
},
"node_modules/@esbuild/linux-ia32": {
"version": "0.25.12",
"resolved": "https://registry.npmmirror.com/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz",
"integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==",
"cpu": [
"ia32"
],
"license": "MIT",
"optional": true,
"os": [
"linux"
],
"engines": {
"node": ">=18"
}
},
"node_modules/@esbuild/linux-loong64": {
"version": "0.25.12",
"resolved": "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz",
"integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==",
"cpu": [
"loong64"
],
"license": "MIT",
"optional": true,
"os": [
"linux"
],
"engines": {
"node": ">=18"
}
},
"node_modules/@esbuild/linux-mips64el": {
"version": "0.25.12",
"resolved": "https://registry.npmmirror.com/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz",
"integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==",
"cpu": [
"mips64el"
],
"license": "MIT",
"optional": true,
"os": [
"linux"
],
"engines": {
"node": ">=18"
}
},
"node_modules/@esbuild/linux-ppc64": {
"version": "0.25.12",
"resolved": "https://registry.npmmirror.com/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz",
"integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==",
"cpu": [
"ppc64"
],
"license": "MIT",
"optional": true,
"os": [
"linux"
],
"engines": {
"node": ">=18"
}
},
"node_modules/@esbuild/linux-riscv64": {
"version": "0.25.12",
"resolved": "https://registry.npmmirror.com/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz",
"integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==",
"cpu": [
"riscv64"
],
"license": "MIT",
"optional": true,
"os": [
"linux"
],
"engines": {
"node": ">=18"
}
},
"node_modules/@esbuild/linux-s390x": {
"version": "0.25.12",
"resolved": "https://registry.npmmirror.com/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz",
"integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==",
"cpu": [
"s390x"
],
"license": "MIT",
"optional": true,
"os": [
"linux"
],
"engines": {
"node": ">=18"
}
},
"node_modules/@esbuild/linux-x64": {
"version": "0.25.12",
"resolved": "https://registry.npmmirror.com/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz",
"integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==",
"cpu": [
"x64"
],
"license": "MIT",
"optional": true,
"os": [
"linux"
],
"engines": {
"node": ">=18"
}
},
"node_modules/@esbuild/netbsd-arm64": {
"version": "0.25.12",
"resolved": "https://registry.npmmirror.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz",
"integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==",
"cpu": [
"arm64"
],
"license": "MIT",
"optional": true,
"os": [
"netbsd"
],
"engines": {
"node": ">=18"
}
},
"node_modules/@esbuild/netbsd-x64": {
"version": "0.25.12",
"resolved": "https://registry.npmmirror.com/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz",
"integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==",
"cpu": [
"x64"
],
"license": "MIT",
"optional": true,
"os": [
"netbsd"
],
"engines": {
"node": ">=18"
}
},
"node_modules/@esbuild/openbsd-arm64": {
"version": "0.25.12",
"resolved": "https://registry.npmmirror.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz",
"integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==",
"cpu": [
"arm64"
],
"license": "MIT",
"optional": true,
"os": [
"openbsd"
],
"engines": {
"node": ">=18"
}
},
"node_modules/@esbuild/openbsd-x64": {
"version": "0.25.12",
"resolved": "https://registry.npmmirror.com/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz",
"integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==",
"cpu": [
"x64"
],
"license": "MIT",
"optional": true,
"os": [
"openbsd"
],
"engines": {
"node": ">=18"
}
},
"node_modules/@esbuild/openharmony-arm64": {
"version": "0.25.12",
"resolved": "https://registry.npmmirror.com/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz",
"integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==",
"cpu": [
"arm64"
],
"license": "MIT",
"optional": true,
"os": [
"openharmony"
],
"engines": {
"node": ">=18"
}
},
"node_modules/@esbuild/sunos-x64": {
"version": "0.25.12",
"resolved": "https://registry.npmmirror.com/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz",
"integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==",
"cpu": [
"x64"
],
"license": "MIT",
"optional": true,
"os": [
"sunos"
],
"engines": {
"node": ">=18"
}
},
"node_modules/@esbuild/win32-arm64": {
"version": "0.25.12",
"resolved": "https://registry.npmmirror.com/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz",
"integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==",
"cpu": [
"arm64"
],
"license": "MIT",
"optional": true,
"os": [
"win32"
],
"engines": {
"node": ">=18"
}
},
"node_modules/@esbuild/win32-ia32": {
"version": "0.25.12",
"resolved": "https://registry.npmmirror.com/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz",
"integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==",
"cpu": [
"ia32"
],
"license": "MIT",
"optional": true,
"os": [
"win32"
],
"engines": {
"node": ">=18"
}
},
"node_modules/@esbuild/win32-x64": {
"version": "0.25.12",
"resolved": "https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz",
"integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==",
"cpu": [
"x64"
],
"license": "MIT",
"optional": true,
"os": [
"win32"
],
"engines": {
"node": ">=18"
}
},
"node_modules/@floating-ui/core": {
"version": "1.7.3",
"resolved": "https://registry.npmmirror.com/@floating-ui/core/-/core-1.7.3.tgz",
"integrity": "sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==",
"license": "MIT",
"dependencies": {
"@floating-ui/utils": "^0.2.10"
}
},
"node_modules/@floating-ui/dom": {
"version": "1.7.4",
"resolved": "https://registry.npmmirror.com/@floating-ui/dom/-/dom-1.7.4.tgz",
"integrity": "sha512-OOchDgh4F2CchOX94cRVqhvy7b3AFb+/rQXyswmzmGakRfkMgoWVjfnLWkRirfLEfuD4ysVW16eXzwt3jHIzKA==",
"license": "MIT",
"dependencies": {
"@floating-ui/core": "^1.7.3",
"@floating-ui/utils": "^0.2.10"
}
},
"node_modules/@floating-ui/utils": {
"version": "0.2.10",
"resolved": "https://registry.npmmirror.com/@floating-ui/utils/-/utils-0.2.10.tgz",
"integrity": "sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==",
"license": "MIT"
},
"node_modules/@floating-ui/vue": {
"version": "1.1.9",
"resolved": "https://registry.npmmirror.com/@floating-ui/vue/-/vue-1.1.9.tgz",
"integrity": "sha512-BfNqNW6KA83Nexspgb9DZuz578R7HT8MZw1CfK9I6Ah4QReNWEJsXWHN+SdmOVLNGmTPDi+fDT535Df5PzMLbQ==",
"license": "MIT",
"dependencies": {
"@floating-ui/dom": "^1.7.4",
"@floating-ui/utils": "^0.2.10",
"vue-demi": ">=0.13.0"
}
},
"node_modules/@floating-ui/vue/node_modules/vue-demi": {
"version": "0.14.10",
"resolved": "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.14.10.tgz",
"integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==",
"hasInstallScript": true,
"license": "MIT",
"bin": {
"vue-demi-fix": "bin/vue-demi-fix.js",
"vue-demi-switch": "bin/vue-demi-switch.js"
},
"engines": {
"node": ">=12"
},
"funding": {
"url": "https://github.com/sponsors/antfu"
},
"peerDependencies": {
"@vue/composition-api": "^1.0.0-rc.1",
"vue": "^3.0.0-0 || ^2.6.0"
},
"peerDependenciesMeta": {
"@vue/composition-api": {
"optional": true
}
}
},
"node_modules/@gar/promisify": {
"version": "1.1.3",
"resolved": "https://registry.npmmirror.com/@gar/promisify/-/promisify-1.1.3.tgz",
"integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==",
"dev": true,
"license": "MIT"
},
"node_modules/@internationalized/date": {
"version": "3.10.0",
"resolved": "https://registry.npmmirror.com/@internationalized/date/-/date-3.10.0.tgz",
"integrity": "sha512-oxDR/NTEJ1k+UFVQElaNIk65E/Z83HK1z1WI3lQyhTtnNg4R5oVXaPzK3jcpKG8UHKDVuDQHzn+wsxSz8RP3aw==",
"license": "Apache-2.0",
"dependencies": {
"@swc/helpers": "^0.5.0"
}
},
"node_modules/@internationalized/number": {
"version": "3.6.5",
"resolved": "https://registry.npmmirror.com/@internationalized/number/-/number-3.6.5.tgz",
"integrity": "sha512-6hY4Kl4HPBvtfS62asS/R22JzNNy8vi/Ssev7x6EobfCp+9QIB2hKvI2EtbdJ0VSQacxVNtqhE/NmF/NZ0gm6g==",
"license": "Apache-2.0",
"dependencies": {
"@swc/helpers": "^0.5.0"
}
},
"node_modules/@isaacs/balanced-match": {
"version": "4.0.1",
"resolved": "https://registry.npmmirror.com/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz",
"integrity": "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==",
"dev": true,
"license": "MIT",
"engines": {
"node": "20 || >=22"
}
},
"node_modules/@isaacs/brace-expansion": {
"version": "5.0.0",
"resolved": "https://registry.npmmirror.com/@isaacs/brace-expansion/-/brace-expansion-5.0.0.tgz",
"integrity": "sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==",
"dev": true,
"license": "MIT",
"dependencies": {
"@isaacs/balanced-match": "^4.0.1"
},
"engines": {
"node": "20 || >=22"
}
},
"node_modules/@isaacs/cliui": {
"version": "8.0.2",
"resolved": "https://registry.npmmirror.com/@isaacs/cliui/-/cliui-8.0.2.tgz",
"integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==",
"dev": true,
"license": "ISC",
"dependencies": {
"string-width": "^5.1.2",
"string-width-cjs": "npm:string-width@^4.2.0",
"strip-ansi": "^7.0.1",
"strip-ansi-cjs": "npm:strip-ansi@^6.0.1",
"wrap-ansi": "^8.1.0",
"wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0"
},
"engines": {
"node": ">=12"
}
},
"node_modules/@isaacs/cliui/node_modules/ansi-regex": {
"version": "6.2.2",
"resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-6.2.2.tgz",
"integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=12"
},
"funding": {
"url": "https://github.com/chalk/ansi-regex?sponsor=1"
}
},
"node_modules/@isaacs/cliui/node_modules/ansi-styles": {
"version": "6.2.3",
"resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-6.2.3.tgz",
"integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=12"
},
"funding": {
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
"node_modules/@isaacs/cliui/node_modules/emoji-regex": {
"version": "9.2.2",
"resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-9.2.2.tgz",
"integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
"dev": true,
"license": "MIT"
},
"node_modules/@isaacs/cliui/node_modules/string-width": {
"version": "5.1.2",
"resolved": "https://registry.npmmirror.com/string-width/-/string-width-5.1.2.tgz",
"integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
"dev": true,
"license": "MIT",
"dependencies": {
"eastasianwidth": "^0.2.0",
"emoji-regex": "^9.2.2",
"strip-ansi": "^7.0.1"
},
"engines": {
"node": ">=12"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/@isaacs/cliui/node_modules/strip-ansi": {
"version": "7.1.2",
"resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-7.1.2.tgz",
"integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==",
"dev": true,
"license": "MIT",
"dependencies": {
"ansi-regex": "^6.0.1"
},
"engines": {
"node": ">=12"
},
"funding": {
"url": "https://github.com/chalk/strip-ansi?sponsor=1"
}
},
"node_modules/@isaacs/cliui/node_modules/wrap-ansi": {
"version": "8.1.0",
"resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
"integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"ansi-styles": "^6.1.0",
"string-width": "^5.0.1",
"strip-ansi": "^7.0.1"
},
"engines": {
"node": ">=12"
},
"funding": {
"url": "https://github.com/chalk/wrap-ansi?sponsor=1"
}
},
"node_modules/@jridgewell/gen-mapping": {
"version": "0.3.13",
"resolved": "https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz",
"integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==",
"license": "MIT",
"dependencies": {
"@jridgewell/sourcemap-codec": "^1.5.0",
"@jridgewell/trace-mapping": "^0.3.24"
}
},
"node_modules/@jridgewell/remapping": {
"version": "2.3.5",
"resolved": "https://registry.npmmirror.com/@jridgewell/remapping/-/remapping-2.3.5.tgz",
"integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==",
"license": "MIT",
"dependencies": {
"@jridgewell/gen-mapping": "^0.3.5",
"@jridgewell/trace-mapping": "^0.3.24"
}
},
"node_modules/@jridgewell/resolve-uri": {
"version": "3.1.2",
"resolved": "https://registry.npmmirror.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
"integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
"license": "MIT",
"engines": {
"node": ">=6.0.0"
}
},
"node_modules/@jridgewell/sourcemap-codec": {
"version": "1.5.5",
"resolved": "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz",
"integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==",
"license": "MIT"
},
"node_modules/@jridgewell/trace-mapping": {
"version": "0.3.31",
"resolved": "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz",
"integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==",
"license": "MIT",
"dependencies": {
"@jridgewell/resolve-uri": "^3.1.0",
"@jridgewell/sourcemap-codec": "^1.4.14"
}
},
"node_modules/@malept/cross-spawn-promise": {
"version": "2.0.0",
"resolved": "https://registry.npmmirror.com/@malept/cross-spawn-promise/-/cross-spawn-promise-2.0.0.tgz",
"integrity": "sha512-1DpKU0Z5ThltBwjNySMC14g0CkbyhCaz9FkhxqNsZI6uAPJXFS8cMXlBKo26FJ8ZuW6S9GCMcR9IO5k2X5/9Fg==",
"dev": true,
"funding": [
{
"type": "individual",
"url": "https://github.com/sponsors/malept"
},
{
"type": "tidelift",
"url": "https://tidelift.com/subscription/pkg/npm-.malept-cross-spawn-promise?utm_medium=referral&utm_source=npm_fund"
}
],
"license": "Apache-2.0",
"dependencies": {
"cross-spawn": "^7.0.1"
},
"engines": {
"node": ">= 12.13.0"
}
},
"node_modules/@malept/flatpak-bundler": {
"version": "0.4.0",
"resolved": "https://registry.npmmirror.com/@malept/flatpak-bundler/-/flatpak-bundler-0.4.0.tgz",
"integrity": "sha512-9QOtNffcOF/c1seMCDnjckb3R9WHcG34tky+FHpNKKCW0wc/scYLwMtO+ptyGUfMW0/b/n4qRiALlaFHc9Oj7Q==",
"dev": true,
"license": "MIT",
"dependencies": {
"debug": "^4.1.1",
"fs-extra": "^9.0.0",
"lodash": "^4.17.15",
"tmp-promise": "^3.0.2"
},
"engines": {
"node": ">= 10.0.0"
}
},
"node_modules/@malept/flatpak-bundler/node_modules/fs-extra": {
"version": "9.1.0",
"resolved": "https://registry.npmmirror.com/fs-extra/-/fs-extra-9.1.0.tgz",
"integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"at-least-node": "^1.0.0",
"graceful-fs": "^4.2.0",
"jsonfile": "^6.0.1",
"universalify": "^2.0.0"
},
"engines": {
"node": ">=10"
}
},
"node_modules/@malept/flatpak-bundler/node_modules/jsonfile": {
"version": "6.2.0",
"resolved": "https://registry.npmmirror.com/jsonfile/-/jsonfile-6.2.0.tgz",
"integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==",
"dev": true,
"license": "MIT",
"dependencies": {
"universalify": "^2.0.0"
},
"optionalDependencies": {
"graceful-fs": "^4.1.6"
}
},
"node_modules/@malept/flatpak-bundler/node_modules/universalify": {
"version": "2.0.1",
"resolved": "https://registry.npmmirror.com/universalify/-/universalify-2.0.1.tgz",
"integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 10.0.0"
}
},
"node_modules/@napi-rs/wasm-runtime": {
"version": "1.1.0",
"resolved": "https://registry.npmmirror.com/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.0.tgz",
"integrity": "sha512-Fq6DJW+Bb5jaWE69/qOE0D1TUN9+6uWhCeZpdnSBk14pjLcCWR7Q8n49PTSPHazM37JqrsdpEthXy2xn6jWWiA==",
"license": "MIT",
"optional": true,
"dependencies": {
"@emnapi/core": "^1.7.1",
"@emnapi/runtime": "^1.7.1",
"@tybys/wasm-util": "^0.10.1"
}
},
"node_modules/@npmcli/fs": {
"version": "2.1.2",
"resolved": "https://registry.npmmirror.com/@npmcli/fs/-/fs-2.1.2.tgz",
"integrity": "sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==",
"dev": true,
"license": "ISC",
"dependencies": {
"@gar/promisify": "^1.1.3",
"semver": "^7.3.5"
},
"engines": {
"node": "^12.13.0 || ^14.15.0 || >=16.0.0"
}
},
"node_modules/@npmcli/fs/node_modules/semver": {
"version": "7.7.3",
"resolved": "https://registry.npmmirror.com/semver/-/semver-7.7.3.tgz",
"integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==",
"dev": true,
"license": "ISC",
"bin": {
"semver": "bin/semver.js"
},
"engines": {
"node": ">=10"
}
},
"node_modules/@npmcli/move-file": {
"version": "2.0.1",
"resolved": "https://registry.npmmirror.com/@npmcli/move-file/-/move-file-2.0.1.tgz",
"integrity": "sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==",
"deprecated": "This functionality has been moved to @npmcli/fs",
"dev": true,
"license": "MIT",
"dependencies": {
"mkdirp": "^1.0.4",
"rimraf": "^3.0.2"
},
"engines": {
"node": "^12.13.0 || ^14.15.0 || >=16.0.0"
}
},
"node_modules/@oxc-project/runtime": {
"version": "0.97.0",
"resolved": "https://registry.npmmirror.com/@oxc-project/runtime/-/runtime-0.97.0.tgz",
"integrity": "sha512-yH0zw7z+jEws4dZ4IUKoix5Lh3yhqIJWF9Dc8PWvhpo7U7O+lJrv7ZZL4BeRO0la8LBQFwcCewtLBnVV7hPe/w==",
"license": "MIT",
"engines": {
"node": "^20.19.0 || >=22.12.0"
}
},
"node_modules/@oxc-project/types": {
"version": "0.97.0",
"resolved": "https://registry.npmmirror.com/@oxc-project/types/-/types-0.97.0.tgz",
"integrity": "sha512-lxmZK4xFrdvU0yZiDwgVQTCvh2gHWBJCBk5ALsrtsBWhs0uDIi+FTOnXRQeQfs304imdvTdaakT/lqwQ8hkOXQ==",
"license": "MIT",
"funding": {
"url": "https://github.com/sponsors/Boshen"
}
},
"node_modules/@pkgjs/parseargs": {
"version": "0.11.0",
"resolved": "https://registry.npmmirror.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
"integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==",
"dev": true,
"license": "MIT",
"optional": true,
"engines": {
"node": ">=14"
}
},
"node_modules/@rolldown/binding-android-arm64": {
"version": "1.0.0-beta.50",
"resolved": "https://registry.npmmirror.com/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.0-beta.50.tgz",
"integrity": "sha512-XlEkrOIHLyGT3avOgzfTFSjG+f+dZMw+/qd+Y3HLN86wlndrB/gSimrJCk4gOhr1XtRtEKfszpadI3Md4Z4/Ag==",
"cpu": [
"arm64"
],
"license": "MIT",
"optional": true,
"os": [
"android"
],
"engines": {
"node": "^20.19.0 || >=22.12.0"
}
},
"node_modules/@rolldown/binding-darwin-arm64": {
"version": "1.0.0-beta.50",
"resolved": "https://registry.npmmirror.com/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.0-beta.50.tgz",
"integrity": "sha512-+JRqKJhoFlt5r9q+DecAGPLZ5PxeLva+wCMtAuoFMWPoZzgcYrr599KQ+Ix0jwll4B4HGP43avu9My8KtSOR+w==",
"cpu": [
"arm64"
],
"license": "MIT",
"optional": true,
"os": [
"darwin"
],
"engines": {
"node": "^20.19.0 || >=22.12.0"
}
},
"node_modules/@rolldown/binding-darwin-x64": {
"version": "1.0.0-beta.50",
"resolved": "https://registry.npmmirror.com/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.0-beta.50.tgz",
"integrity": "sha512-fFXDjXnuX7/gQZQm/1FoivVtRcyAzdjSik7Eo+9iwPQ9EgtA5/nB2+jmbzaKtMGG3q+BnZbdKHCtOacmNrkIDA==",
"cpu": [
"x64"
],
"license": "MIT",
"optional": true,
"os": [
"darwin"
],
"engines": {
"node": "^20.19.0 || >=22.12.0"
}
},
"node_modules/@rolldown/binding-freebsd-x64": {
"version": "1.0.0-beta.50",
"resolved": "https://registry.npmmirror.com/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.0-beta.50.tgz",
"integrity": "sha512-F1b6vARy49tjmT/hbloplzgJS7GIvwWZqt+tAHEstCh0JIh9sa8FAMVqEmYxDviqKBaAI8iVvUREm/Kh/PD26Q==",
"cpu": [
"x64"
],
"license": "MIT",
"optional": true,
"os": [
"freebsd"
],
"engines": {
"node": "^20.19.0 || >=22.12.0"
}
},
"node_modules/@rolldown/binding-linux-arm-gnueabihf": {
"version": "1.0.0-beta.50",
"resolved": "https://registry.npmmirror.com/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.0-beta.50.tgz",
"integrity": "sha512-U6cR76N8T8M6lHj7EZrQ3xunLPxSvYYxA8vJsBKZiFZkT8YV4kjgCO3KwMJL0NOjQCPGKyiXO07U+KmJzdPGRw==",
"cpu": [
"arm"
],
"license": "MIT",
"optional": true,
"os": [
"linux"
],
"engines": {
"node": "^20.19.0 || >=22.12.0"
}
},
"node_modules/@rolldown/binding-linux-arm64-gnu": {
"version": "1.0.0-beta.50",
"resolved": "https://registry.npmmirror.com/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.0-beta.50.tgz",
"integrity": "sha512-ONgyjofCrrE3bnh5GZb8EINSFyR/hmwTzZ7oVuyUB170lboza1VMCnb8jgE6MsyyRgHYmN8Lb59i3NKGrxrYjw==",
"cpu": [
"arm64"
],
"license": "MIT",
"optional": true,
"os": [
"linux"
],
"engines": {
"node": "^20.19.0 || >=22.12.0"
}
},
"node_modules/@rolldown/binding-linux-arm64-musl": {
"version": "1.0.0-beta.50",
"resolved": "https://registry.npmmirror.com/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.0-beta.50.tgz",
"integrity": "sha512-L0zRdH2oDPkmB+wvuTl+dJbXCsx62SkqcEqdM+79LOcB+PxbAxxjzHU14BuZIQdXcAVDzfpMfaHWzZuwhhBTcw==",
"cpu": [
"arm64"
],
"license": "MIT",
"optional": true,
"os": [
"linux"
],
"engines": {
"node": "^20.19.0 || >=22.12.0"
}
},
"node_modules/@rolldown/binding-linux-x64-gnu": {
"version": "1.0.0-beta.50",
"resolved": "https://registry.npmmirror.com/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.0-beta.50.tgz",
"integrity": "sha512-gyoI8o/TGpQd3OzkJnh1M2kxy1Bisg8qJ5Gci0sXm9yLFzEXIFdtc4EAzepxGvrT2ri99ar5rdsmNG0zP0SbIg==",
"cpu": [
"x64"
],
"license": "MIT",
"optional": true,
"os": [
"linux"
],
"engines": {
"node": "^20.19.0 || >=22.12.0"
}
},
"node_modules/@rolldown/binding-linux-x64-musl": {
"version": "1.0.0-beta.50",
"resolved": "https://registry.npmmirror.com/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.0-beta.50.tgz",
"integrity": "sha512-zti8A7M+xFDpKlghpcCAzyOi+e5nfUl3QhU023ce5NCgUxRG5zGP2GR9LTydQ1rnIPwZUVBWd4o7NjZDaQxaXA==",
"cpu": [
"x64"
],
"license": "MIT",
"optional": true,
"os": [
"linux"
],
"engines": {
"node": "^20.19.0 || >=22.12.0"
}
},
"node_modules/@rolldown/binding-openharmony-arm64": {
"version": "1.0.0-beta.50",
"resolved": "https://registry.npmmirror.com/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.0-beta.50.tgz",
"integrity": "sha512-eZUssog7qljrrRU9Mi0eqYEPm3Ch0UwB+qlWPMKSUXHNqhm3TvDZarJQdTevGEfu3EHAXJvBIe0YFYr0TPVaMA==",
"cpu": [
"arm64"
],
"license": "MIT",
"optional": true,
"os": [
"openharmony"
],
"engines": {
"node": "^20.19.0 || >=22.12.0"
}
},
"node_modules/@rolldown/binding-wasm32-wasi": {
"version": "1.0.0-beta.50",
"resolved": "https://registry.npmmirror.com/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.0-beta.50.tgz",
"integrity": "sha512-nmCN0nIdeUnmgeDXiQ+2HU6FT162o+rxnF7WMkBm4M5Ds8qTU7Dzv2Wrf22bo4ftnlrb2hKK6FSwAJSAe2FWLg==",
"cpu": [
"wasm32"
],
"license": "MIT",
"optional": true,
"dependencies": {
"@napi-rs/wasm-runtime": "^1.0.7"
},
"engines": {
"node": ">=14.0.0"
}
},
"node_modules/@rolldown/binding-win32-arm64-msvc": {
"version": "1.0.0-beta.50",
"resolved": "https://registry.npmmirror.com/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.0-beta.50.tgz",
"integrity": "sha512-7kcNLi7Ua59JTTLvbe1dYb028QEPaJPJQHqkmSZ5q3tJueUeb6yjRtx8mw4uIqgWZcnQHAR3PrLN4XRJxvgIkA==",
"cpu": [
"arm64"
],
"license": "MIT",
"optional": true,
"os": [
"win32"
],
"engines": {
"node": "^20.19.0 || >=22.12.0"
}
},
"node_modules/@rolldown/binding-win32-ia32-msvc": {
"version": "1.0.0-beta.50",
"resolved": "https://registry.npmmirror.com/@rolldown/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.0.0-beta.50.tgz",
"integrity": "sha512-lL70VTNvSCdSZkDPPVMwWn/M2yQiYvSoXw9hTLgdIWdUfC3g72UaruezusR6ceRuwHCY1Ayu2LtKqXkBO5LIwg==",
"cpu": [
"ia32"
],
"license": "MIT",
"optional": true,
"os": [
"win32"
],
"engines": {
"node": "^20.19.0 || >=22.12.0"
}
},
"node_modules/@rolldown/binding-win32-x64-msvc": {
"version": "1.0.0-beta.50",
"resolved": "https://registry.npmmirror.com/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.0-beta.50.tgz",
"integrity": "sha512-4qU4x5DXWB4JPjyTne/wBNPqkbQU8J45bl21geERBKtEittleonioACBL1R0PsBu0Aq21SwMK5a9zdBkWSlQtQ==",
"cpu": [
"x64"
],
"license": "MIT",
"optional": true,
"os": [
"win32"
],
"engines": {
"node": "^20.19.0 || >=22.12.0"
}
},
"node_modules/@rolldown/pluginutils": {
"version": "1.0.0-beta.53",
"resolved": "https://registry.npmmirror.com/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.53.tgz",
"integrity": "sha512-vENRlFU4YbrwVqNDZ7fLvy+JR1CRkyr01jhSiDpE1u6py3OMzQfztQU2jxykW3ALNxO4kSlqIDeYyD0Y9RcQeQ==",
"dev": true,
"license": "MIT"
},
"node_modules/@sindresorhus/is": {
"version": "4.6.0",
"resolved": "https://registry.npmmirror.com/@sindresorhus/is/-/is-4.6.0.tgz",
"integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sindresorhus/is?sponsor=1"
}
},
"node_modules/@swc/helpers": {
"version": "0.5.17",
"resolved": "https://registry.npmmirror.com/@swc/helpers/-/helpers-0.5.17.tgz",
"integrity": "sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==",
"license": "Apache-2.0",
"dependencies": {
"tslib": "^2.8.0"
}
},
"node_modules/@szmarczak/http-timer": {
"version": "4.0.6",
"resolved": "https://registry.npmmirror.com/@szmarczak/http-timer/-/http-timer-4.0.6.tgz",
"integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==",
"dev": true,
"license": "MIT",
"dependencies": {
"defer-to-connect": "^2.0.0"
},
"engines": {
"node": ">=10"
}
},
"node_modules/@tailwindcss/node": {
"version": "4.1.18",
"resolved": "https://registry.npmmirror.com/@tailwindcss/node/-/node-4.1.18.tgz",
"integrity": "sha512-DoR7U1P7iYhw16qJ49fgXUlry1t4CpXeErJHnQ44JgTSKMaZUdf17cfn5mHchfJ4KRBZRFA/Coo+MUF5+gOaCQ==",
"license": "MIT",
"dependencies": {
"@jridgewell/remapping": "^2.3.4",
"enhanced-resolve": "^5.18.3",
"jiti": "^2.6.1",
"lightningcss": "1.30.2",
"magic-string": "^0.30.21",
"source-map-js": "^1.2.1",
"tailwindcss": "4.1.18"
}
},
"node_modules/@tailwindcss/oxide": {
"version": "4.1.18",
"resolved": "https://registry.npmmirror.com/@tailwindcss/oxide/-/oxide-4.1.18.tgz",
"integrity": "sha512-EgCR5tTS5bUSKQgzeMClT6iCY3ToqE1y+ZB0AKldj809QXk1Y+3jB0upOYZrn9aGIzPtUsP7sX4QQ4XtjBB95A==",
"license": "MIT",
"engines": {
"node": ">= 10"
},
"optionalDependencies": {
"@tailwindcss/oxide-android-arm64": "4.1.18",
"@tailwindcss/oxide-darwin-arm64": "4.1.18",
"@tailwindcss/oxide-darwin-x64": "4.1.18",
"@tailwindcss/oxide-freebsd-x64": "4.1.18",
"@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.18",
"@tailwindcss/oxide-linux-arm64-gnu": "4.1.18",
"@tailwindcss/oxide-linux-arm64-musl": "4.1.18",
"@tailwindcss/oxide-linux-x64-gnu": "4.1.18",
"@tailwindcss/oxide-linux-x64-musl": "4.1.18",
"@tailwindcss/oxide-wasm32-wasi": "4.1.18",
"@tailwindcss/oxide-win32-arm64-msvc": "4.1.18",
"@tailwindcss/oxide-win32-x64-msvc": "4.1.18"
}
},
"node_modules/@tailwindcss/oxide-android-arm64": {
"version": "4.1.18",
"resolved": "https://registry.npmmirror.com/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.18.tgz",
"integrity": "sha512-dJHz7+Ugr9U/diKJA0W6N/6/cjI+ZTAoxPf9Iz9BFRF2GzEX8IvXxFIi/dZBloVJX/MZGvRuFA9rqwdiIEZQ0Q==",
"cpu": [
"arm64"
],
"license": "MIT",
"optional": true,
"os": [
"android"
],
"engines": {
"node": ">= 10"
}
},
"node_modules/@tailwindcss/oxide-darwin-arm64": {
"version": "4.1.18",
"resolved": "https://registry.npmmirror.com/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.18.tgz",
"integrity": "sha512-Gc2q4Qhs660bhjyBSKgq6BYvwDz4G+BuyJ5H1xfhmDR3D8HnHCmT/BSkvSL0vQLy/nkMLY20PQ2OoYMO15Jd0A==",
"cpu": [
"arm64"
],
"license": "MIT",
"optional": true,
"os": [
"darwin"
],
"engines": {
"node": ">= 10"
}
},
"node_modules/@tailwindcss/oxide-darwin-x64": {
"version": "4.1.18",
"resolved": "https://registry.npmmirror.com/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.18.tgz",
"integrity": "sha512-FL5oxr2xQsFrc3X9o1fjHKBYBMD1QZNyc1Xzw/h5Qu4XnEBi3dZn96HcHm41c/euGV+GRiXFfh2hUCyKi/e+yw==",
"cpu": [
"x64"
],
"license": "MIT",
"optional": true,
"os": [
"darwin"
],
"engines": {
"node": ">= 10"
}
},
"node_modules/@tailwindcss/oxide-freebsd-x64": {
"version": "4.1.18",
"resolved": "https://registry.npmmirror.com/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.18.tgz",
"integrity": "sha512-Fj+RHgu5bDodmV1dM9yAxlfJwkkWvLiRjbhuO2LEtwtlYlBgiAT4x/j5wQr1tC3SANAgD+0YcmWVrj8R9trVMA==",
"cpu": [
"x64"
],
"license": "MIT",
"optional": true,
"os": [
"freebsd"
],
"engines": {
"node": ">= 10"
}
},
"node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": {
"version": "4.1.18",
"resolved": "https://registry.npmmirror.com/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.18.tgz",
"integrity": "sha512-Fp+Wzk/Ws4dZn+LV2Nqx3IilnhH51YZoRaYHQsVq3RQvEl+71VGKFpkfHrLM/Li+kt5c0DJe/bHXK1eHgDmdiA==",
"cpu": [
"arm"
],
"license": "MIT",
"optional": true,
"os": [
"linux"
],
"engines": {
"node": ">= 10"
}
},
"node_modules/@tailwindcss/oxide-linux-arm64-gnu": {
"version": "4.1.18",
"resolved": "https://registry.npmmirror.com/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.18.tgz",
"integrity": "sha512-S0n3jboLysNbh55Vrt7pk9wgpyTTPD0fdQeh7wQfMqLPM/Hrxi+dVsLsPrycQjGKEQk85Kgbx+6+QnYNiHalnw==",
"cpu": [
"arm64"
],
"license": "MIT",
"optional": true,
"os": [
"linux"
],
"engines": {
"node": ">= 10"
}
},
"node_modules/@tailwindcss/oxide-linux-arm64-musl": {
"version": "4.1.18",
"resolved": "https://registry.npmmirror.com/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.18.tgz",
"integrity": "sha512-1px92582HkPQlaaCkdRcio71p8bc8i/ap5807tPRDK/uw953cauQBT8c5tVGkOwrHMfc2Yh6UuxaH4vtTjGvHg==",
"cpu": [
"arm64"
],
"license": "MIT",
"optional": true,
"os": [
"linux"
],
"engines": {
"node": ">= 10"
}
},
"node_modules/@tailwindcss/oxide-linux-x64-gnu": {
"version": "4.1.18",
"resolved": "https://registry.npmmirror.com/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.18.tgz",
"integrity": "sha512-v3gyT0ivkfBLoZGF9LyHmts0Isc8jHZyVcbzio6Wpzifg/+5ZJpDiRiUhDLkcr7f/r38SWNe7ucxmGW3j3Kb/g==",
"cpu": [
"x64"
],
"license": "MIT",
"optional": true,
"os": [
"linux"
],
"engines": {
"node": ">= 10"
}
},
"node_modules/@tailwindcss/oxide-linux-x64-musl": {
"version": "4.1.18",
"resolved": "https://registry.npmmirror.com/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.18.tgz",
"integrity": "sha512-bhJ2y2OQNlcRwwgOAGMY0xTFStt4/wyU6pvI6LSuZpRgKQwxTec0/3Scu91O8ir7qCR3AuepQKLU/kX99FouqQ==",
"cpu": [
"x64"
],
"license": "MIT",
"optional": true,
"os": [
"linux"
],
"engines": {
"node": ">= 10"
}
},
"node_modules/@tailwindcss/oxide-wasm32-wasi": {
"version": "4.1.18",
"resolved": "https://registry.npmmirror.com/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.18.tgz",
"integrity": "sha512-LffYTvPjODiP6PT16oNeUQJzNVyJl1cjIebq/rWWBF+3eDst5JGEFSc5cWxyRCJ0Mxl+KyIkqRxk1XPEs9x8TA==",
"bundleDependencies": [
"@napi-rs/wasm-runtime",
"@emnapi/core",
"@emnapi/runtime",
"@tybys/wasm-util",
"@emnapi/wasi-threads",
"tslib"
],
"cpu": [
"wasm32"
],
"license": "MIT",
"optional": true,
"dependencies": {
"@emnapi/core": "^1.7.1",
"@emnapi/runtime": "^1.7.1",
"@emnapi/wasi-threads": "^1.1.0",
"@napi-rs/wasm-runtime": "^1.1.0",
"@tybys/wasm-util": "^0.10.1",
"tslib": "^2.4.0"
},
"engines": {
"node": ">=14.0.0"
}
},
"node_modules/@tailwindcss/oxide-win32-arm64-msvc": {
"version": "4.1.18",
"resolved": "https://registry.npmmirror.com/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.18.tgz",
"integrity": "sha512-HjSA7mr9HmC8fu6bdsZvZ+dhjyGCLdotjVOgLA2vEqxEBZaQo9YTX4kwgEvPCpRh8o4uWc4J/wEoFzhEmjvPbA==",
"cpu": [
"arm64"
],
"license": "MIT",
"optional": true,
"os": [
"win32"
],
"engines": {
"node": ">= 10"
}
},
"node_modules/@tailwindcss/oxide-win32-x64-msvc": {
"version": "4.1.18",
"resolved": "https://registry.npmmirror.com/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.18.tgz",
"integrity": "sha512-bJWbyYpUlqamC8dpR7pfjA0I7vdF6t5VpUGMWRkXVE3AXgIZjYUYAK7II1GNaxR8J1SSrSrppRar8G++JekE3Q==",
"cpu": [
"x64"
],
"license": "MIT",
"optional": true,
"os": [
"win32"
],
"engines": {
"node": ">= 10"
}
},
"node_modules/@tailwindcss/vite": {
"version": "4.1.18",
"resolved": "https://registry.npmmirror.com/@tailwindcss/vite/-/vite-4.1.18.tgz",
"integrity": "sha512-jVA+/UpKL1vRLg6Hkao5jldawNmRo7mQYrZtNHMIVpLfLhDml5nMRUo/8MwoX2vNXvnaXNNMedrMfMugAVX1nA==",
"license": "MIT",
"dependencies": {
"@tailwindcss/node": "4.1.18",
"@tailwindcss/oxide": "4.1.18",
"tailwindcss": "4.1.18"
},
"peerDependencies": {
"vite": "^5.2.0 || ^6 || ^7"
}
},
"node_modules/@tanstack/table-core": {
"version": "8.21.3",
"resolved": "https://registry.npmmirror.com/@tanstack/table-core/-/table-core-8.21.3.tgz",
"integrity": "sha512-ldZXEhOBb8Is7xLs01fR3YEc3DERiz5silj8tnGkFZytt1abEvl/GhUmCE0PMLaMPTa3Jk4HbKmRlHmu+gCftg==",
"license": "MIT",
"engines": {
"node": ">=12"
},
"funding": {
"type": "github",
"url": "https://github.com/sponsors/tannerlinsley"
}
},
"node_modules/@tanstack/virtual-core": {
"version": "3.13.13",
"resolved": "https://registry.npmmirror.com/@tanstack/virtual-core/-/virtual-core-3.13.13.tgz",
"integrity": "sha512-uQFoSdKKf5S8k51W5t7b2qpfkyIbdHMzAn+AMQvHPxKUPeo1SsGaA4JRISQT87jm28b7z8OEqPcg1IOZagQHcA==",
"license": "MIT",
"funding": {
"type": "github",
"url": "https://github.com/sponsors/tannerlinsley"
}
},
"node_modules/@tanstack/vue-table": {
"version": "8.21.3",
"resolved": "https://registry.npmmirror.com/@tanstack/vue-table/-/vue-table-8.21.3.tgz",
"integrity": "sha512-rusRyd77c5tDPloPskctMyPLFEQUeBzxdQ+2Eow4F7gDPlPOB1UnnhzfpdvqZ8ZyX2rRNGmqNnQWm87OI2OQPw==",
"license": "MIT",
"dependencies": {
"@tanstack/table-core": "8.21.3"
},
"engines": {
"node": ">=12"
},
"funding": {
"type": "github",
"url": "https://github.com/sponsors/tannerlinsley"
},
"peerDependencies": {
"vue": ">=3.2"
}
},
"node_modules/@tanstack/vue-virtual": {
"version": "3.13.13",
"resolved": "https://registry.npmmirror.com/@tanstack/vue-virtual/-/vue-virtual-3.13.13.tgz",
"integrity": "sha512-Cf2xIEE8nWAfsX0N5nihkPYMeQRT+pHt4NEkuP8rNCn6lVnLDiV8rC8IeIxbKmQC0yPnj4SIBLwXYVf86xxKTQ==",
"license": "MIT",
"dependencies": {
"@tanstack/virtual-core": "3.13.13"
},
"funding": {
"type": "github",
"url": "https://github.com/sponsors/tannerlinsley"
},
"peerDependencies": {
"vue": "^2.7.0 || ^3.0.0"
}
},
"node_modules/@tootallnate/once": {
"version": "2.0.0",
"resolved": "https://registry.npmmirror.com/@tootallnate/once/-/once-2.0.0.tgz",
"integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 10"
}
},
"node_modules/@tybys/wasm-util": {
"version": "0.10.1",
"resolved": "https://registry.npmmirror.com/@tybys/wasm-util/-/wasm-util-0.10.1.tgz",
"integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==",
"license": "MIT",
"optional": true,
"dependencies": {
"tslib": "^2.4.0"
}
},
"node_modules/@types/cacheable-request": {
"version": "6.0.3",
"resolved": "https://registry.npmmirror.com/@types/cacheable-request/-/cacheable-request-6.0.3.tgz",
"integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==",
"dev": true,
"license": "MIT",
"dependencies": {
"@types/http-cache-semantics": "*",
"@types/keyv": "^3.1.4",
"@types/node": "*",
"@types/responselike": "^1.0.0"
}
},
"node_modules/@types/crypto-js": {
"version": "4.2.2",
"resolved": "https://registry.npmmirror.com/@types/crypto-js/-/crypto-js-4.2.2.tgz",
"integrity": "sha512-sDOLlVbHhXpAUAL0YHDUUwDZf3iN4Bwi4W6a0W0b+QcAezUbRtH4FVb+9J4h+XFPW7l/gQ9F8qC7P+Ec4k8QVQ==",
"dev": true,
"license": "MIT"
},
"node_modules/@types/debug": {
"version": "4.1.12",
"resolved": "https://registry.npmmirror.com/@types/debug/-/debug-4.1.12.tgz",
"integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"@types/ms": "*"
}
},
"node_modules/@types/file-saver": {
"version": "2.0.7",
"resolved": "https://registry.npmmirror.com/@types/file-saver/-/file-saver-2.0.7.tgz",
"integrity": "sha512-dNKVfHd/jk0SkR/exKGj2ggkB45MAkzvWCaqLUUgkyjITkGNzH8H+yUwr+BLJUBjZOe9w8X3wgmXhZDRg1ED6A==",
"dev": true,
"license": "MIT"
},
"node_modules/@types/fs-extra": {
"version": "9.0.13",
"resolved": "https://registry.npmmirror.com/@types/fs-extra/-/fs-extra-9.0.13.tgz",
"integrity": "sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==",
"dev": true,
"license": "MIT",
"dependencies": {
"@types/node": "*"
}
},
"node_modules/@types/http-cache-semantics": {
"version": "4.0.4",
"resolved": "https://registry.npmmirror.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz",
"integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==",
"dev": true,
"license": "MIT"
},
"node_modules/@types/keyv": {
"version": "3.1.4",
"resolved": "https://registry.npmmirror.com/@types/keyv/-/keyv-3.1.4.tgz",
"integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==",
"dev": true,
"license": "MIT",
"dependencies": {
"@types/node": "*"
}
},
"node_modules/@types/ms": {
"version": "2.1.0",
"resolved": "https://registry.npmmirror.com/@types/ms/-/ms-2.1.0.tgz",
"integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==",
"dev": true,
"license": "MIT"
},
"node_modules/@types/node": {
"version": "24.10.4",
"resolved": "https://registry.npmmirror.com/@types/node/-/node-24.10.4.tgz",
"integrity": "sha512-vnDVpYPMzs4wunl27jHrfmwojOGKya0xyM3sH+UE5iv5uPS6vX7UIoh6m+vQc5LGBq52HBKPIn/zcSZVzeDEZg==",
"devOptional": true,
"license": "MIT",
"dependencies": {
"undici-types": "~7.16.0"
}
},
"node_modules/@types/plist": {
"version": "3.0.5",
"resolved": "https://registry.npmmirror.com/@types/plist/-/plist-3.0.5.tgz",
"integrity": "sha512-E6OCaRmAe4WDmWNsL/9RMqdkkzDCY1etutkflWk4c+AcjDU07Pcz1fQwTX0TQz+Pxqn9i4L1TU3UFpjnrcDgxA==",
"dev": true,
"license": "MIT",
"optional": true,
"dependencies": {
"@types/node": "*",
"xmlbuilder": ">=11.0.1"
}
},
"node_modules/@types/responselike": {
"version": "1.0.3",
"resolved": "https://registry.npmmirror.com/@types/responselike/-/responselike-1.0.3.tgz",
"integrity": "sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==",
"dev": true,
"license": "MIT",
"dependencies": {
"@types/node": "*"
}
},
"node_modules/@types/verror": {
"version": "1.10.11",
"resolved": "https://registry.npmmirror.com/@types/verror/-/verror-1.10.11.tgz",
"integrity": "sha512-RlDm9K7+o5stv0Co8i8ZRGxDbrTxhJtgjqjFyVh/tXQyl/rYtTKlnTvZ88oSTeYREWurwx20Js4kTuKCsFkUtg==",
"dev": true,
"license": "MIT",
"optional": true
},
"node_modules/@types/web-bluetooth": {
"version": "0.0.21",
"resolved": "https://registry.npmmirror.com/@types/web-bluetooth/-/web-bluetooth-0.0.21.tgz",
"integrity": "sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==",
"license": "MIT"
},
"node_modules/@types/yauzl": {
"version": "2.10.3",
"resolved": "https://registry.npmmirror.com/@types/yauzl/-/yauzl-2.10.3.tgz",
"integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==",
"dev": true,
"license": "MIT",
"optional": true,
"dependencies": {
"@types/node": "*"
}
},
"node_modules/@vitejs/plugin-vue": {
"version": "6.0.3",
"resolved": "https://registry.npmmirror.com/@vitejs/plugin-vue/-/plugin-vue-6.0.3.tgz",
"integrity": "sha512-TlGPkLFLVOY3T7fZrwdvKpjprR3s4fxRln0ORDo1VQ7HHyxJwTlrjKU3kpVWTlaAjIEuCTokmjkZnr8Tpc925w==",
"dev": true,
"license": "MIT",
"dependencies": {
"@rolldown/pluginutils": "1.0.0-beta.53"
},
"engines": {
"node": "^20.19.0 || >=22.12.0"
},
"peerDependencies": {
"vite": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0",
"vue": "^3.2.25"
}
},
"node_modules/@volar/language-core": {
"version": "2.4.26",
"resolved": "https://registry.npmmirror.com/@volar/language-core/-/language-core-2.4.26.tgz",
"integrity": "sha512-hH0SMitMxnB43OZpyF1IFPS9bgb2I3bpCh76m2WEK7BE0A0EzpYsRp0CCH2xNKshr7kacU5TQBLYn4zj7CG60A==",
"dev": true,
"license": "MIT",
"dependencies": {
"@volar/source-map": "2.4.26"
}
},
"node_modules/@volar/source-map": {
"version": "2.4.26",
"resolved": "https://registry.npmmirror.com/@volar/source-map/-/source-map-2.4.26.tgz",
"integrity": "sha512-JJw0Tt/kSFsIRmgTQF4JSt81AUSI1aEye5Zl65EeZ8H35JHnTvFGmpDOBn5iOxd48fyGE+ZvZBp5FcgAy/1Qhw==",
"dev": true,
"license": "MIT"
},
"node_modules/@volar/typescript": {
"version": "2.4.26",
"resolved": "https://registry.npmmirror.com/@volar/typescript/-/typescript-2.4.26.tgz",
"integrity": "sha512-N87ecLD48Sp6zV9zID/5yuS1+5foj0DfuYGdQ6KHj/IbKvyKv1zNX6VCmnKYwtmHadEO6mFc2EKISiu3RDPAvA==",
"dev": true,
"license": "MIT",
"dependencies": {
"@volar/language-core": "2.4.26",
"path-browserify": "^1.0.1",
"vscode-uri": "^3.0.8"
}
},
"node_modules/@vue/compiler-core": {
"version": "3.5.25",
"resolved": "https://registry.npmmirror.com/@vue/compiler-core/-/compiler-core-3.5.25.tgz",
"integrity": "sha512-vay5/oQJdsNHmliWoZfHPoVZZRmnSWhug0BYT34njkYTPqClh3DNWLkZNJBVSjsNMrg0CCrBfoKkjZQPM/QVUw==",
"license": "MIT",
"dependencies": {
"@babel/parser": "^7.28.5",
"@vue/shared": "3.5.25",
"entities": "^4.5.0",
"estree-walker": "^2.0.2",
"source-map-js": "^1.2.1"
}
},
"node_modules/@vue/compiler-dom": {
"version": "3.5.25",
"resolved": "https://registry.npmmirror.com/@vue/compiler-dom/-/compiler-dom-3.5.25.tgz",
"integrity": "sha512-4We0OAcMZsKgYoGlMjzYvaoErltdFI2/25wqanuTu+S4gismOTRTBPi4IASOjxWdzIwrYSjnqONfKvuqkXzE2Q==",
"license": "MIT",
"dependencies": {
"@vue/compiler-core": "3.5.25",
"@vue/shared": "3.5.25"
}
},
"node_modules/@vue/compiler-sfc": {
"version": "3.5.25",
"resolved": "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-3.5.25.tgz",
"integrity": "sha512-PUgKp2rn8fFsI++lF2sO7gwO2d9Yj57Utr5yEsDf3GNaQcowCLKL7sf+LvVFvtJDXUp/03+dC6f2+LCv5aK1ag==",
"license": "MIT",
"dependencies": {
"@babel/parser": "^7.28.5",
"@vue/compiler-core": "3.5.25",
"@vue/compiler-dom": "3.5.25",
"@vue/compiler-ssr": "3.5.25",
"@vue/shared": "3.5.25",
"estree-walker": "^2.0.2",
"magic-string": "^0.30.21",
"postcss": "^8.5.6",
"source-map-js": "^1.2.1"
}
},
"node_modules/@vue/compiler-ssr": {
"version": "3.5.25",
"resolved": "https://registry.npmmirror.com/@vue/compiler-ssr/-/compiler-ssr-3.5.25.tgz",
"integrity": "sha512-ritPSKLBcParnsKYi+GNtbdbrIE1mtuFEJ4U1sWeuOMlIziK5GtOL85t5RhsNy4uWIXPgk+OUdpnXiTdzn8o3A==",
"license": "MIT",
"dependencies": {
"@vue/compiler-dom": "3.5.25",
"@vue/shared": "3.5.25"
}
},
"node_modules/@vue/devtools-api": {
"version": "7.7.9",
"resolved": "https://registry.npmmirror.com/@vue/devtools-api/-/devtools-api-7.7.9.tgz",
"integrity": "sha512-kIE8wvwlcZ6TJTbNeU2HQNtaxLx3a84aotTITUuL/4bzfPxzajGBOoqjMhwZJ8L9qFYDU/lAYMEEm11dnZOD6g==",
"license": "MIT",
"dependencies": {
"@vue/devtools-kit": "^7.7.9"
}
},
"node_modules/@vue/devtools-kit": {
"version": "7.7.9",
"resolved": "https://registry.npmmirror.com/@vue/devtools-kit/-/devtools-kit-7.7.9.tgz",
"integrity": "sha512-PyQ6odHSgiDVd4hnTP+aDk2X4gl2HmLDfiyEnn3/oV+ckFDuswRs4IbBT7vacMuGdwY/XemxBoh302ctbsptuA==",
"license": "MIT",
"dependencies": {
"@vue/devtools-shared": "^7.7.9",
"birpc": "^2.3.0",
"hookable": "^5.5.3",
"mitt": "^3.0.1",
"perfect-debounce": "^1.0.0",
"speakingurl": "^14.0.1",
"superjson": "^2.2.2"
}
},
"node_modules/@vue/devtools-shared": {
"version": "7.7.9",
"resolved": "https://registry.npmmirror.com/@vue/devtools-shared/-/devtools-shared-7.7.9.tgz",
"integrity": "sha512-iWAb0v2WYf0QWmxCGy0seZNDPdO3Sp5+u78ORnyeonS6MT4PC7VPrryX2BpMJrwlDeaZ6BD4vP4XKjK0SZqaeA==",
"license": "MIT",
"dependencies": {
"rfdc": "^1.4.1"
}
},
"node_modules/@vue/language-core": {
"version": "3.1.8",
"resolved": "https://registry.npmmirror.com/@vue/language-core/-/language-core-3.1.8.tgz",
"integrity": "sha512-PfwAW7BLopqaJbneChNL6cUOTL3GL+0l8paYP5shhgY5toBNidWnMXWM+qDwL7MC9+zDtzCF2enT8r6VPu64iw==",
"dev": true,
"license": "MIT",
"dependencies": {
"@volar/language-core": "2.4.26",
"@vue/compiler-dom": "^3.5.0",
"@vue/shared": "^3.5.0",
"alien-signals": "^3.0.0",
"muggle-string": "^0.4.1",
"path-browserify": "^1.0.1",
"picomatch": "^4.0.2"
},
"peerDependencies": {
"typescript": "*"
},
"peerDependenciesMeta": {
"typescript": {
"optional": true
}
}
},
"node_modules/@vue/reactivity": {
"version": "3.5.25",
"resolved": "https://registry.npmmirror.com/@vue/reactivity/-/reactivity-3.5.25.tgz",
"integrity": "sha512-5xfAypCQepv4Jog1U4zn8cZIcbKKFka3AgWHEFQeK65OW+Ys4XybP6z2kKgws4YB43KGpqp5D/K3go2UPPunLA==",
"license": "MIT",
"dependencies": {
"@vue/shared": "3.5.25"
}
},
"node_modules/@vue/runtime-core": {
"version": "3.5.25",
"resolved": "https://registry.npmmirror.com/@vue/runtime-core/-/runtime-core-3.5.25.tgz",
"integrity": "sha512-Z751v203YWwYzy460bzsYQISDfPjHTl+6Zzwo/a3CsAf+0ccEjQ8c+0CdX1WsumRTHeywvyUFtW6KvNukT/smA==",
"license": "MIT",
"dependencies": {
"@vue/reactivity": "3.5.25",
"@vue/shared": "3.5.25"
}
},
"node_modules/@vue/runtime-dom": {
"version": "3.5.25",
"resolved": "https://registry.npmmirror.com/@vue/runtime-dom/-/runtime-dom-3.5.25.tgz",
"integrity": "sha512-a4WrkYFbb19i9pjkz38zJBg8wa/rboNERq3+hRRb0dHiJh13c+6kAbgqCPfMaJ2gg4weWD3APZswASOfmKwamA==",
"license": "MIT",
"dependencies": {
"@vue/reactivity": "3.5.25",
"@vue/runtime-core": "3.5.25",
"@vue/shared": "3.5.25",
"csstype": "^3.1.3"
}
},
"node_modules/@vue/server-renderer": {
"version": "3.5.25",
"resolved": "https://registry.npmmirror.com/@vue/server-renderer/-/server-renderer-3.5.25.tgz",
"integrity": "sha512-UJaXR54vMG61i8XNIzTSf2Q7MOqZHpp8+x3XLGtE3+fL+nQd+k7O5+X3D/uWrnQXOdMw5VPih+Uremcw+u1woQ==",
"license": "MIT",
"dependencies": {
"@vue/compiler-ssr": "3.5.25",
"@vue/shared": "3.5.25"
},
"peerDependencies": {
"vue": "3.5.25"
}
},
"node_modules/@vue/shared": {
"version": "3.5.25",
"resolved": "https://registry.npmmirror.com/@vue/shared/-/shared-3.5.25.tgz",
"integrity": "sha512-AbOPdQQnAnzs58H2FrrDxYj/TJfmeS2jdfEEhgiKINy+bnOANmVizIEgq1r+C5zsbs6l1CCQxtcj71rwNQ4jWg==",
"license": "MIT"
},
"node_modules/@vue/tsconfig": {
"version": "0.8.1",
"resolved": "https://registry.npmmirror.com/@vue/tsconfig/-/tsconfig-0.8.1.tgz",
"integrity": "sha512-aK7feIWPXFSUhsCP9PFqPyFOcz4ENkb8hZ2pneL6m2UjCkccvaOhC/5KCKluuBufvp2KzkbdA2W2pk20vLzu3g==",
"dev": true,
"license": "MIT",
"peerDependencies": {
"typescript": "5.x",
"vue": "^3.4.0"
},
"peerDependenciesMeta": {
"typescript": {
"optional": true
},
"vue": {
"optional": true
}
}
},
"node_modules/@vueuse/core": {
"version": "14.1.0",
"resolved": "https://registry.npmmirror.com/@vueuse/core/-/core-14.1.0.tgz",
"integrity": "sha512-rgBinKs07hAYyPF834mDTigH7BtPqvZ3Pryuzt1SD/lg5wEcWqvwzXXYGEDb2/cP0Sj5zSvHl3WkmMELr5kfWw==",
"license": "MIT",
"dependencies": {
"@types/web-bluetooth": "^0.0.21",
"@vueuse/metadata": "14.1.0",
"@vueuse/shared": "14.1.0"
},
"funding": {
"url": "https://github.com/sponsors/antfu"
},
"peerDependencies": {
"vue": "^3.5.0"
}
},
"node_modules/@vueuse/metadata": {
"version": "14.1.0",
"resolved": "https://registry.npmmirror.com/@vueuse/metadata/-/metadata-14.1.0.tgz",
"integrity": "sha512-7hK4g015rWn2PhKcZ99NyT+ZD9sbwm7SGvp7k+k+rKGWnLjS/oQozoIZzWfCewSUeBmnJkIb+CNr7Zc/EyRnnA==",
"license": "MIT",
"funding": {
"url": "https://github.com/sponsors/antfu"
}
},
"node_modules/@vueuse/shared": {
"version": "14.1.0",
"resolved": "https://registry.npmmirror.com/@vueuse/shared/-/shared-14.1.0.tgz",
"integrity": "sha512-EcKxtYvn6gx1F8z9J5/rsg3+lTQnvOruQd8fUecW99DCK04BkWD7z5KQ/wTAx+DazyoEE9dJt/zV8OIEQbM6kw==",
"license": "MIT",
"funding": {
"url": "https://github.com/sponsors/antfu"
},
"peerDependencies": {
"vue": "^3.5.0"
}
},
"node_modules/@xmldom/xmldom": {
"version": "0.8.11",
"resolved": "https://registry.npmmirror.com/@xmldom/xmldom/-/xmldom-0.8.11.tgz",
"integrity": "sha512-cQzWCtO6C8TQiYl1ruKNn2U6Ao4o4WBBcbL61yJl84x+j5sOWWFU9X7DpND8XZG3daDppSsigMdfAIl2upQBRw==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=10.0.0"
}
},
"node_modules/7zip-bin": {
"version": "5.2.0",
"resolved": "https://registry.npmmirror.com/7zip-bin/-/7zip-bin-5.2.0.tgz",
"integrity": "sha512-ukTPVhqG4jNzMro2qA9HSCSSVJN3aN7tlb+hfqYCt3ER0yWroeA2VR38MNrOHLQ/cVj+DaIMad0kFCtWWowh/A==",
"dev": true,
"license": "MIT"
},
"node_modules/abbrev": {
"version": "1.1.1",
"resolved": "https://registry.npmmirror.com/abbrev/-/abbrev-1.1.1.tgz",
"integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==",
"dev": true,
"license": "ISC"
},
"node_modules/agent-base": {
"version": "7.1.4",
"resolved": "https://registry.npmmirror.com/agent-base/-/agent-base-7.1.4.tgz",
"integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 14"
}
},
"node_modules/agentkeepalive": {
"version": "4.6.0",
"resolved": "https://registry.npmmirror.com/agentkeepalive/-/agentkeepalive-4.6.0.tgz",
"integrity": "sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"humanize-ms": "^1.2.1"
},
"engines": {
"node": ">= 8.0.0"
}
},
"node_modules/aggregate-error": {
"version": "3.1.0",
"resolved": "https://registry.npmmirror.com/aggregate-error/-/aggregate-error-3.1.0.tgz",
"integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==",
"dev": true,
"license": "MIT",
"dependencies": {
"clean-stack": "^2.0.0",
"indent-string": "^4.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/ajv": {
"version": "6.12.6",
"resolved": "https://registry.npmmirror.com/ajv/-/ajv-6.12.6.tgz",
"integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
"dev": true,
"license": "MIT",
"dependencies": {
"fast-deep-equal": "^3.1.1",
"fast-json-stable-stringify": "^2.0.0",
"json-schema-traverse": "^0.4.1",
"uri-js": "^4.2.2"
},
"funding": {
"type": "github",
"url": "https://github.com/sponsors/epoberezkin"
}
},
"node_modules/ajv-keywords": {
"version": "3.5.2",
"resolved": "https://registry.npmmirror.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
"integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
"dev": true,
"license": "MIT",
"peerDependencies": {
"ajv": "^6.9.1"
}
},
"node_modules/alien-signals": {
"version": "3.1.1",
"resolved": "https://registry.npmmirror.com/alien-signals/-/alien-signals-3.1.1.tgz",
"integrity": "sha512-ogkIWbVrLwKtHY6oOAXaYkAxP+cTH7V5FZ5+Tm4NZFd8VDZ6uNMDrfzqctTZ42eTMCSR3ne3otpcxmqSnFfPYA==",
"dev": true,
"license": "MIT"
},
"node_modules/ansi-regex": {
"version": "5.0.1",
"resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz",
"integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/ansi-styles": {
"version": "4.3.0",
"resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
"dev": true,
"license": "MIT",
"dependencies": {
"color-convert": "^2.0.1"
},
"engines": {
"node": ">=8"
},
"funding": {
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
"node_modules/app-builder-bin": {
"version": "5.0.0-alpha.12",
"resolved": "https://registry.npmmirror.com/app-builder-bin/-/app-builder-bin-5.0.0-alpha.12.tgz",
"integrity": "sha512-j87o0j6LqPL3QRr8yid6c+Tt5gC7xNfYo6uQIQkorAC6MpeayVMZrEDzKmJJ/Hlv7EnOQpaRm53k6ktDYZyB6w==",
"dev": true,
"license": "MIT"
},
"node_modules/app-builder-lib": {
"version": "26.0.12",
"resolved": "https://registry.npmmirror.com/app-builder-lib/-/app-builder-lib-26.0.12.tgz",
"integrity": "sha512-+/CEPH1fVKf6HowBUs6LcAIoRcjeqgvAeoSE+cl7Y7LndyQ9ViGPYibNk7wmhMHzNgHIuIbw4nWADPO+4mjgWw==",
"dev": true,
"license": "MIT",
"dependencies": {
"@develar/schema-utils": "~2.6.5",
"@electron/asar": "3.2.18",
"@electron/fuses": "^1.8.0",
"@electron/notarize": "2.5.0",
"@electron/osx-sign": "1.3.1",
"@electron/rebuild": "3.7.0",
"@electron/universal": "2.0.1",
"@malept/flatpak-bundler": "^0.4.0",
"@types/fs-extra": "9.0.13",
"async-exit-hook": "^2.0.1",
"builder-util": "26.0.11",
"builder-util-runtime": "9.3.1",
"chromium-pickle-js": "^0.2.0",
"config-file-ts": "0.2.8-rc1",
"debug": "^4.3.4",
"dotenv": "^16.4.5",
"dotenv-expand": "^11.0.6",
"ejs": "^3.1.8",
"electron-publish": "26.0.11",
"fs-extra": "^10.1.0",
"hosted-git-info": "^4.1.0",
"is-ci": "^3.0.0",
"isbinaryfile": "^5.0.0",
"js-yaml": "^4.1.0",
"json5": "^2.2.3",
"lazy-val": "^1.0.5",
"minimatch": "^10.0.0",
"plist": "3.1.0",
"resedit": "^1.7.0",
"semver": "^7.3.8",
"tar": "^6.1.12",
"temp-file": "^3.4.0",
"tiny-async-pool": "1.3.0"
},
"engines": {
"node": ">=14.0.0"
},
"peerDependencies": {
"dmg-builder": "26.0.12",
"electron-builder-squirrel-windows": "26.0.12"
}
},
"node_modules/app-builder-lib/node_modules/fs-extra": {
"version": "10.1.0",
"resolved": "https://registry.npmmirror.com/fs-extra/-/fs-extra-10.1.0.tgz",
"integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"graceful-fs": "^4.2.0",
"jsonfile": "^6.0.1",
"universalify": "^2.0.0"
},
"engines": {
"node": ">=12"
}
},
"node_modules/app-builder-lib/node_modules/jsonfile": {
"version": "6.2.0",
"resolved": "https://registry.npmmirror.com/jsonfile/-/jsonfile-6.2.0.tgz",
"integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==",
"dev": true,
"license": "MIT",
"dependencies": {
"universalify": "^2.0.0"
},
"optionalDependencies": {
"graceful-fs": "^4.1.6"
}
},
"node_modules/app-builder-lib/node_modules/semver": {
"version": "7.7.3",
"resolved": "https://registry.npmmirror.com/semver/-/semver-7.7.3.tgz",
"integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==",
"dev": true,
"license": "ISC",
"bin": {
"semver": "bin/semver.js"
},
"engines": {
"node": ">=10"
}
},
"node_modules/app-builder-lib/node_modules/universalify": {
"version": "2.0.1",
"resolved": "https://registry.npmmirror.com/universalify/-/universalify-2.0.1.tgz",
"integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 10.0.0"
}
},
"node_modules/argparse": {
"version": "2.0.1",
"resolved": "https://registry.npmmirror.com/argparse/-/argparse-2.0.1.tgz",
"integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
"dev": true,
"license": "Python-2.0"
},
"node_modules/aria-hidden": {
"version": "1.2.6",
"resolved": "https://registry.npmmirror.com/aria-hidden/-/aria-hidden-1.2.6.tgz",
"integrity": "sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==",
"license": "MIT",
"dependencies": {
"tslib": "^2.0.0"
},
"engines": {
"node": ">=10"
}
},
"node_modules/assert-plus": {
"version": "1.0.0",
"resolved": "https://registry.npmmirror.com/assert-plus/-/assert-plus-1.0.0.tgz",
"integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==",
"dev": true,
"license": "MIT",
"optional": true,
"engines": {
"node": ">=0.8"
}
},
"node_modules/astral-regex": {
"version": "2.0.0",
"resolved": "https://registry.npmmirror.com/astral-regex/-/astral-regex-2.0.0.tgz",
"integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==",
"dev": true,
"license": "MIT",
"optional": true,
"engines": {
"node": ">=8"
}
},
"node_modules/async": {
"version": "3.2.6",
"resolved": "https://registry.npmmirror.com/async/-/async-3.2.6.tgz",
"integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==",
"dev": true,
"license": "MIT"
},
"node_modules/async-exit-hook": {
"version": "2.0.1",
"resolved": "https://registry.npmmirror.com/async-exit-hook/-/async-exit-hook-2.0.1.tgz",
"integrity": "sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=0.12.0"
}
},
"node_modules/asynckit": {
"version": "0.4.0",
"resolved": "https://registry.npmmirror.com/asynckit/-/asynckit-0.4.0.tgz",
"integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
"dev": true,
"license": "MIT"
},
"node_modules/at-least-node": {
"version": "1.0.0",
"resolved": "https://registry.npmmirror.com/at-least-node/-/at-least-node-1.0.0.tgz",
"integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==",
"dev": true,
"license": "ISC",
"engines": {
"node": ">= 4.0.0"
}
},
"node_modules/balanced-match": {
"version": "1.0.2",
"resolved": "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz",
"integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
"dev": true,
"license": "MIT"
},
"node_modules/base64-js": {
"version": "1.5.1",
"resolved": "https://registry.npmmirror.com/base64-js/-/base64-js-1.5.1.tgz",
"integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
"dev": true,
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/feross"
},
{
"type": "patreon",
"url": "https://www.patreon.com/feross"
},
{
"type": "consulting",
"url": "https://feross.org/support"
}
],
"license": "MIT"
},
"node_modules/baseline-browser-mapping": {
"version": "2.9.7",
"resolved": "https://registry.npmmirror.com/baseline-browser-mapping/-/baseline-browser-mapping-2.9.7.tgz",
"integrity": "sha512-k9xFKplee6KIio3IDbwj+uaCLpqzOwakOgmqzPezM0sFJlFKcg30vk2wOiAJtkTSfx0SSQDSe8q+mWA/fSH5Zg==",
"dev": true,
"license": "Apache-2.0",
"bin": {
"baseline-browser-mapping": "dist/cli.js"
}
},
"node_modules/birpc": {
"version": "2.9.0",
"resolved": "https://registry.npmmirror.com/birpc/-/birpc-2.9.0.tgz",
"integrity": "sha512-KrayHS5pBi69Xi9JmvoqrIgYGDkD6mcSe/i6YKi3w5kekCLzrX4+nawcXqrj2tIp50Kw/mT/s3p+GVK0A0sKxw==",
"license": "MIT",
"funding": {
"url": "https://github.com/sponsors/antfu"
}
},
"node_modules/bl": {
"version": "4.1.0",
"resolved": "https://registry.npmmirror.com/bl/-/bl-4.1.0.tgz",
"integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==",
"dev": true,
"license": "MIT",
"dependencies": {
"buffer": "^5.5.0",
"inherits": "^2.0.4",
"readable-stream": "^3.4.0"
}
},
"node_modules/boolean": {
"version": "3.2.0",
"resolved": "https://registry.npmmirror.com/boolean/-/boolean-3.2.0.tgz",
"integrity": "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==",
"deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.",
"dev": true,
"license": "MIT",
"optional": true
},
"node_modules/brace-expansion": {
"version": "1.1.12",
"resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.12.tgz",
"integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==",
"dev": true,
"license": "MIT",
"dependencies": {
"balanced-match": "^1.0.0",
"concat-map": "0.0.1"
}
},
"node_modules/browserslist": {
"version": "4.28.1",
"resolved": "https://registry.npmmirror.com/browserslist/-/browserslist-4.28.1.tgz",
"integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==",
"dev": true,
"funding": [
{
"type": "opencollective",
"url": "https://opencollective.com/browserslist"
},
{
"type": "tidelift",
"url": "https://tidelift.com/funding/github/npm/browserslist"
},
{
"type": "github",
"url": "https://github.com/sponsors/ai"
}
],
"license": "MIT",
"dependencies": {
"baseline-browser-mapping": "^2.9.0",
"caniuse-lite": "^1.0.30001759",
"electron-to-chromium": "^1.5.263",
"node-releases": "^2.0.27",
"update-browserslist-db": "^1.2.0"
},
"bin": {
"browserslist": "cli.js"
},
"engines": {
"node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
}
},
"node_modules/buffer": {
"version": "5.7.1",
"resolved": "https://registry.npmmirror.com/buffer/-/buffer-5.7.1.tgz",
"integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
"dev": true,
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/feross"
},
{
"type": "patreon",
"url": "https://www.patreon.com/feross"
},
{
"type": "consulting",
"url": "https://feross.org/support"
}
],
"license": "MIT",
"dependencies": {
"base64-js": "^1.3.1",
"ieee754": "^1.1.13"
}
},
"node_modules/buffer-crc32": {
"version": "0.2.13",
"resolved": "https://registry.npmmirror.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
"integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==",
"dev": true,
"license": "MIT",
"engines": {
"node": "*"
}
},
"node_modules/buffer-from": {
"version": "1.1.2",
"resolved": "https://registry.npmmirror.com/buffer-from/-/buffer-from-1.1.2.tgz",
"integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
"dev": true,
"license": "MIT"
},
"node_modules/builder-util": {
"version": "26.0.11",
"resolved": "https://registry.npmmirror.com/builder-util/-/builder-util-26.0.11.tgz",
"integrity": "sha512-xNjXfsldUEe153h1DraD0XvDOpqGR0L5eKFkdReB7eFW5HqysDZFfly4rckda6y9dF39N3pkPlOblcfHKGw+uA==",
"dev": true,
"license": "MIT",
"dependencies": {
"@types/debug": "^4.1.6",
"7zip-bin": "~5.2.0",
"app-builder-bin": "5.0.0-alpha.12",
"builder-util-runtime": "9.3.1",
"chalk": "^4.1.2",
"cross-spawn": "^7.0.6",
"debug": "^4.3.4",
"fs-extra": "^10.1.0",
"http-proxy-agent": "^7.0.0",
"https-proxy-agent": "^7.0.0",
"is-ci": "^3.0.0",
"js-yaml": "^4.1.0",
"sanitize-filename": "^1.6.3",
"source-map-support": "^0.5.19",
"stat-mode": "^1.0.0",
"temp-file": "^3.4.0",
"tiny-async-pool": "1.3.0"
}
},
"node_modules/builder-util-runtime": {
"version": "9.3.1",
"resolved": "https://registry.npmmirror.com/builder-util-runtime/-/builder-util-runtime-9.3.1.tgz",
"integrity": "sha512-2/egrNDDnRaxVwK3A+cJq6UOlqOdedGA7JPqCeJjN2Zjk1/QB/6QUi3b714ScIGS7HafFXTyzJEOr5b44I3kvQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"debug": "^4.3.4",
"sax": "^1.2.4"
},
"engines": {
"node": ">=12.0.0"
}
},
"node_modules/builder-util/node_modules/fs-extra": {
"version": "10.1.0",
"resolved": "https://registry.npmmirror.com/fs-extra/-/fs-extra-10.1.0.tgz",
"integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"graceful-fs": "^4.2.0",
"jsonfile": "^6.0.1",
"universalify": "^2.0.0"
},
"engines": {
"node": ">=12"
}
},
"node_modules/builder-util/node_modules/jsonfile": {
"version": "6.2.0",
"resolved": "https://registry.npmmirror.com/jsonfile/-/jsonfile-6.2.0.tgz",
"integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==",
"dev": true,
"license": "MIT",
"dependencies": {
"universalify": "^2.0.0"
},
"optionalDependencies": {
"graceful-fs": "^4.1.6"
}
},
"node_modules/builder-util/node_modules/universalify": {
"version": "2.0.1",
"resolved": "https://registry.npmmirror.com/universalify/-/universalify-2.0.1.tgz",
"integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 10.0.0"
}
},
"node_modules/cac": {
"version": "6.7.14",
"resolved": "https://registry.npmmirror.com/cac/-/cac-6.7.14.tgz",
"integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/cacache": {
"version": "16.1.3",
"resolved": "https://registry.npmmirror.com/cacache/-/cacache-16.1.3.tgz",
"integrity": "sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==",
"dev": true,
"license": "ISC",
"dependencies": {
"@npmcli/fs": "^2.1.0",
"@npmcli/move-file": "^2.0.0",
"chownr": "^2.0.0",
"fs-minipass": "^2.1.0",
"glob": "^8.0.1",
"infer-owner": "^1.0.4",
"lru-cache": "^7.7.1",
"minipass": "^3.1.6",
"minipass-collect": "^1.0.2",
"minipass-flush": "^1.0.5",
"minipass-pipeline": "^1.2.4",
"mkdirp": "^1.0.4",
"p-map": "^4.0.0",
"promise-inflight": "^1.0.1",
"rimraf": "^3.0.2",
"ssri": "^9.0.0",
"tar": "^6.1.11",
"unique-filename": "^2.0.0"
},
"engines": {
"node": "^12.13.0 || ^14.15.0 || >=16.0.0"
}
},
"node_modules/cacache/node_modules/brace-expansion": {
"version": "2.0.2",
"resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-2.0.2.tgz",
"integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"balanced-match": "^1.0.0"
}
},
"node_modules/cacache/node_modules/glob": {
"version": "8.1.0",
"resolved": "https://registry.npmmirror.com/glob/-/glob-8.1.0.tgz",
"integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==",
"deprecated": "Glob versions prior to v9 are no longer supported",
"dev": true,
"license": "ISC",
"dependencies": {
"fs.realpath": "^1.0.0",
"inflight": "^1.0.4",
"inherits": "2",
"minimatch": "^5.0.1",
"once": "^1.3.0"
},
"engines": {
"node": ">=12"
},
"funding": {
"url": "https://github.com/sponsors/isaacs"
}
},
"node_modules/cacache/node_modules/lru-cache": {
"version": "7.18.3",
"resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-7.18.3.tgz",
"integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==",
"dev": true,
"license": "ISC",
"engines": {
"node": ">=12"
}
},
"node_modules/cacache/node_modules/minimatch": {
"version": "5.1.6",
"resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-5.1.6.tgz",
"integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
"dev": true,
"license": "ISC",
"dependencies": {
"brace-expansion": "^2.0.1"
},
"engines": {
"node": ">=10"
}
},
"node_modules/cacheable-lookup": {
"version": "5.0.4",
"resolved": "https://registry.npmmirror.com/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz",
"integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=10.6.0"
}
},
"node_modules/cacheable-request": {
"version": "7.0.4",
"resolved": "https://registry.npmmirror.com/cacheable-request/-/cacheable-request-7.0.4.tgz",
"integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==",
"dev": true,
"license": "MIT",
"dependencies": {
"clone-response": "^1.0.2",
"get-stream": "^5.1.0",
"http-cache-semantics": "^4.0.0",
"keyv": "^4.0.0",
"lowercase-keys": "^2.0.0",
"normalize-url": "^6.0.1",
"responselike": "^2.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/call-bind-apply-helpers": {
"version": "1.0.2",
"resolved": "https://registry.npmmirror.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
"integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"es-errors": "^1.3.0",
"function-bind": "^1.1.2"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/caniuse-lite": {
"version": "1.0.30001760",
"resolved": "https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001760.tgz",
"integrity": "sha512-7AAMPcueWELt1p3mi13HR/LHH0TJLT11cnwDJEs3xA4+CK/PLKeO9Kl1oru24htkyUKtkGCvAx4ohB0Ttry8Dw==",
"dev": true,
"funding": [
{
"type": "opencollective",
"url": "https://opencollective.com/browserslist"
},
{
"type": "tidelift",
"url": "https://tidelift.com/funding/github/npm/caniuse-lite"
},
{
"type": "github",
"url": "https://github.com/sponsors/ai"
}
],
"license": "CC-BY-4.0"
},
"node_modules/chalk": {
"version": "4.1.2",
"resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz",
"integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
"dev": true,
"license": "MIT",
"dependencies": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/chalk/chalk?sponsor=1"
}
},
"node_modules/chownr": {
"version": "2.0.0",
"resolved": "https://registry.npmmirror.com/chownr/-/chownr-2.0.0.tgz",
"integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==",
"dev": true,
"license": "ISC",
"engines": {
"node": ">=10"
}
},
"node_modules/chromium-pickle-js": {
"version": "0.2.0",
"resolved": "https://registry.npmmirror.com/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz",
"integrity": "sha512-1R5Fho+jBq0DDydt+/vHWj5KJNJCKdARKOCwZUen84I5BreWoLqRLANH1U87eJy1tiASPtMnGqJJq0ZsLoRPOw==",
"dev": true,
"license": "MIT"
},
"node_modules/ci-info": {
"version": "3.9.0",
"resolved": "https://registry.npmmirror.com/ci-info/-/ci-info-3.9.0.tgz",
"integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==",
"dev": true,
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/sibiraj-s"
}
],
"license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/class-variance-authority": {
"version": "0.7.1",
"resolved": "https://registry.npmmirror.com/class-variance-authority/-/class-variance-authority-0.7.1.tgz",
"integrity": "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==",
"license": "Apache-2.0",
"dependencies": {
"clsx": "^2.1.1"
},
"funding": {
"url": "https://polar.sh/cva"
}
},
"node_modules/clean-stack": {
"version": "2.2.0",
"resolved": "https://registry.npmmirror.com/clean-stack/-/clean-stack-2.2.0.tgz",
"integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=6"
}
},
"node_modules/cli-cursor": {
"version": "3.1.0",
"resolved": "https://registry.npmmirror.com/cli-cursor/-/cli-cursor-3.1.0.tgz",
"integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==",
"dev": true,
"license": "MIT",
"dependencies": {
"restore-cursor": "^3.1.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/cli-spinners": {
"version": "2.9.2",
"resolved": "https://registry.npmmirror.com/cli-spinners/-/cli-spinners-2.9.2.tgz",
"integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=6"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/cli-truncate": {
"version": "2.1.0",
"resolved": "https://registry.npmmirror.com/cli-truncate/-/cli-truncate-2.1.0.tgz",
"integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==",
"dev": true,
"license": "MIT",
"optional": true,
"dependencies": {
"slice-ansi": "^3.0.0",
"string-width": "^4.2.0"
},
"engines": {
"node": ">=8"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/cliui": {
"version": "8.0.1",
"resolved": "https://registry.npmmirror.com/cliui/-/cliui-8.0.1.tgz",
"integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
"dev": true,
"license": "ISC",
"dependencies": {
"string-width": "^4.2.0",
"strip-ansi": "^6.0.1",
"wrap-ansi": "^7.0.0"
},
"engines": {
"node": ">=12"
}
},
"node_modules/clone": {
"version": "1.0.4",
"resolved": "https://registry.npmmirror.com/clone/-/clone-1.0.4.tgz",
"integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=0.8"
}
},
"node_modules/clone-response": {
"version": "1.0.3",
"resolved": "https://registry.npmmirror.com/clone-response/-/clone-response-1.0.3.tgz",
"integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==",
"dev": true,
"license": "MIT",
"dependencies": {
"mimic-response": "^1.0.0"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/clsx": {
"version": "2.1.1",
"resolved": "https://registry.npmmirror.com/clsx/-/clsx-2.1.1.tgz",
"integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==",
"license": "MIT",
"engines": {
"node": ">=6"
}
},
"node_modules/color-convert": {
"version": "2.0.1",
"resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"color-name": "~1.1.4"
},
"engines": {
"node": ">=7.0.0"
}
},
"node_modules/color-name": {
"version": "1.1.4",
"resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz",
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
"dev": true,
"license": "MIT"
},
"node_modules/combined-stream": {
"version": "1.0.8",
"resolved": "https://registry.npmmirror.com/combined-stream/-/combined-stream-1.0.8.tgz",
"integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
"dev": true,
"license": "MIT",
"dependencies": {
"delayed-stream": "~1.0.0"
},
"engines": {
"node": ">= 0.8"
}
},
"node_modules/commander": {
"version": "5.1.0",
"resolved": "https://registry.npmmirror.com/commander/-/commander-5.1.0.tgz",
"integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 6"
}
},
"node_modules/compare-version": {
"version": "0.1.2",
"resolved": "https://registry.npmmirror.com/compare-version/-/compare-version-0.1.2.tgz",
"integrity": "sha512-pJDh5/4wrEnXX/VWRZvruAGHkzKdr46z11OlTPN+VrATlWWhSKewNCJ1futCO5C7eJB3nPMFZA1LeYtcFboZ2A==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/concat-map": {
"version": "0.0.1",
"resolved": "https://registry.npmmirror.com/concat-map/-/concat-map-0.0.1.tgz",
"integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
"dev": true,
"license": "MIT"
},
"node_modules/config-file-ts": {
"version": "0.2.8-rc1",
"resolved": "https://registry.npmmirror.com/config-file-ts/-/config-file-ts-0.2.8-rc1.tgz",
"integrity": "sha512-GtNECbVI82bT4RiDIzBSVuTKoSHufnU7Ce7/42bkWZJZFLjmDF2WBpVsvRkhKCfKBnTBb3qZrBwPpFBU/Myvhg==",
"dev": true,
"license": "MIT",
"dependencies": {
"glob": "^10.3.12",
"typescript": "^5.4.3"
}
},
"node_modules/config-file-ts/node_modules/brace-expansion": {
"version": "2.0.2",
"resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-2.0.2.tgz",
"integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"balanced-match": "^1.0.0"
}
},
"node_modules/config-file-ts/node_modules/glob": {
"version": "10.5.0",
"resolved": "https://registry.npmmirror.com/glob/-/glob-10.5.0.tgz",
"integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==",
"dev": true,
"license": "ISC",
"dependencies": {
"foreground-child": "^3.1.0",
"jackspeak": "^3.1.2",
"minimatch": "^9.0.4",
"minipass": "^7.1.2",
"package-json-from-dist": "^1.0.0",
"path-scurry": "^1.11.1"
},
"bin": {
"glob": "dist/esm/bin.mjs"
},
"funding": {
"url": "https://github.com/sponsors/isaacs"
}
},
"node_modules/config-file-ts/node_modules/minimatch": {
"version": "9.0.5",
"resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-9.0.5.tgz",
"integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
"dev": true,
"license": "ISC",
"dependencies": {
"brace-expansion": "^2.0.1"
},
"engines": {
"node": ">=16 || 14 >=14.17"
},
"funding": {
"url": "https://github.com/sponsors/isaacs"
}
},
"node_modules/config-file-ts/node_modules/minipass": {
"version": "7.1.2",
"resolved": "https://registry.npmmirror.com/minipass/-/minipass-7.1.2.tgz",
"integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
"dev": true,
"license": "ISC",
"engines": {
"node": ">=16 || 14 >=14.17"
}
},
"node_modules/convert-source-map": {
"version": "2.0.0",
"resolved": "https://registry.npmmirror.com/convert-source-map/-/convert-source-map-2.0.0.tgz",
"integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
"dev": true,
"license": "MIT"
},
"node_modules/copy-anything": {
"version": "4.0.5",
"resolved": "https://registry.npmmirror.com/copy-anything/-/copy-anything-4.0.5.tgz",
"integrity": "sha512-7Vv6asjS4gMOuILabD3l739tsaxFQmC+a7pLZm02zyvs8p977bL3zEgq3yDk5rn9B0PbYgIv++jmHcuUab4RhA==",
"license": "MIT",
"dependencies": {
"is-what": "^5.2.0"
},
"engines": {
"node": ">=18"
},
"funding": {
"url": "https://github.com/sponsors/mesqueeb"
}
},
"node_modules/core-util-is": {
"version": "1.0.2",
"resolved": "https://registry.npmmirror.com/core-util-is/-/core-util-is-1.0.2.tgz",
"integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==",
"dev": true,
"license": "MIT",
"optional": true
},
"node_modules/crc": {
"version": "3.8.0",
"resolved": "https://registry.npmmirror.com/crc/-/crc-3.8.0.tgz",
"integrity": "sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==",
"dev": true,
"license": "MIT",
"optional": true,
"dependencies": {
"buffer": "^5.1.0"
}
},
"node_modules/cross-dirname": {
"version": "0.1.0",
"resolved": "https://registry.npmmirror.com/cross-dirname/-/cross-dirname-0.1.0.tgz",
"integrity": "sha512-+R08/oI0nl3vfPcqftZRpytksBXDzOUveBq/NBVx0sUp1axwzPQrKinNx5yd5sxPu8j1wIy8AfnVQ+5eFdha6Q==",
"dev": true,
"license": "MIT",
"optional": true,
"peer": true
},
"node_modules/cross-spawn": {
"version": "7.0.6",
"resolved": "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.6.tgz",
"integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
"dev": true,
"license": "MIT",
"dependencies": {
"path-key": "^3.1.0",
"shebang-command": "^2.0.0",
"which": "^2.0.1"
},
"engines": {
"node": ">= 8"
}
},
"node_modules/crypto-js": {
"version": "4.2.0",
"resolved": "https://registry.npmmirror.com/crypto-js/-/crypto-js-4.2.0.tgz",
"integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==",
"license": "MIT"
},
"node_modules/csstype": {
"version": "3.2.3",
"resolved": "https://registry.npmmirror.com/csstype/-/csstype-3.2.3.tgz",
"integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==",
"license": "MIT"
},
"node_modules/debug": {
"version": "4.4.3",
"resolved": "https://registry.npmmirror.com/debug/-/debug-4.4.3.tgz",
"integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
"license": "MIT",
"dependencies": {
"ms": "^2.1.3"
},
"engines": {
"node": ">=6.0"
},
"peerDependenciesMeta": {
"supports-color": {
"optional": true
}
}
},
"node_modules/decompress-response": {
"version": "6.0.0",
"resolved": "https://registry.npmmirror.com/decompress-response/-/decompress-response-6.0.0.tgz",
"integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"mimic-response": "^3.1.0"
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/decompress-response/node_modules/mimic-response": {
"version": "3.1.0",
"resolved": "https://registry.npmmirror.com/mimic-response/-/mimic-response-3.1.0.tgz",
"integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/defaults": {
"version": "1.0.4",
"resolved": "https://registry.npmmirror.com/defaults/-/defaults-1.0.4.tgz",
"integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==",
"dev": true,
"license": "MIT",
"dependencies": {
"clone": "^1.0.2"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/defer-to-connect": {
"version": "2.0.1",
"resolved": "https://registry.npmmirror.com/defer-to-connect/-/defer-to-connect-2.0.1.tgz",
"integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=10"
}
},
"node_modules/define-data-property": {
"version": "1.1.4",
"resolved": "https://registry.npmmirror.com/define-data-property/-/define-data-property-1.1.4.tgz",
"integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==",
"dev": true,
"license": "MIT",
"optional": true,
"dependencies": {
"es-define-property": "^1.0.0",
"es-errors": "^1.3.0",
"gopd": "^1.0.1"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/define-properties": {
"version": "1.2.1",
"resolved": "https://registry.npmmirror.com/define-properties/-/define-properties-1.2.1.tgz",
"integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==",
"dev": true,
"license": "MIT",
"optional": true,
"dependencies": {
"define-data-property": "^1.0.1",
"has-property-descriptors": "^1.0.0",
"object-keys": "^1.1.1"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/defu": {
"version": "6.1.4",
"resolved": "https://registry.npmmirror.com/defu/-/defu-6.1.4.tgz",
"integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==",
"license": "MIT"
},
"node_modules/delayed-stream": {
"version": "1.0.0",
"resolved": "https://registry.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz",
"integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=0.4.0"
}
},
"node_modules/depd": {
"version": "2.0.0",
"resolved": "https://registry.npmmirror.com/depd/-/depd-2.0.0.tgz",
"integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
"license": "MIT",
"engines": {
"node": ">= 0.8"
}
},
"node_modules/detect-libc": {
"version": "2.1.2",
"resolved": "https://registry.npmmirror.com/detect-libc/-/detect-libc-2.1.2.tgz",
"integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==",
"license": "Apache-2.0",
"engines": {
"node": ">=8"
}
},
"node_modules/detect-node": {
"version": "2.1.0",
"resolved": "https://registry.npmmirror.com/detect-node/-/detect-node-2.1.0.tgz",
"integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==",
"dev": true,
"license": "MIT",
"optional": true
},
"node_modules/dir-compare": {
"version": "4.2.0",
"resolved": "https://registry.npmmirror.com/dir-compare/-/dir-compare-4.2.0.tgz",
"integrity": "sha512-2xMCmOoMrdQIPHdsTawECdNPwlVFB9zGcz3kuhmBO6U3oU+UQjsue0i8ayLKpgBcm+hcXPMVSGUN9d+pvJ6+VQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"minimatch": "^3.0.5",
"p-limit": "^3.1.0 "
}
},
"node_modules/dir-compare/node_modules/minimatch": {
"version": "3.1.2",
"resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz",
"integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
"dev": true,
"license": "ISC",
"dependencies": {
"brace-expansion": "^1.1.7"
},
"engines": {
"node": "*"
}
},
"node_modules/dmg-builder": {
"version": "26.0.12",
"resolved": "https://registry.npmmirror.com/dmg-builder/-/dmg-builder-26.0.12.tgz",
"integrity": "sha512-59CAAjAhTaIMCN8y9kD573vDkxbs1uhDcrFLHSgutYdPcGOU35Rf95725snvzEOy4BFB7+eLJ8djCNPmGwG67w==",
"dev": true,
"license": "MIT",
"dependencies": {
"app-builder-lib": "26.0.12",
"builder-util": "26.0.11",
"builder-util-runtime": "9.3.1",
"fs-extra": "^10.1.0",
"iconv-lite": "^0.6.2",
"js-yaml": "^4.1.0"
},
"optionalDependencies": {
"dmg-license": "^1.0.11"
}
},
"node_modules/dmg-builder/node_modules/fs-extra": {
"version": "10.1.0",
"resolved": "https://registry.npmmirror.com/fs-extra/-/fs-extra-10.1.0.tgz",
"integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"graceful-fs": "^4.2.0",
"jsonfile": "^6.0.1",
"universalify": "^2.0.0"
},
"engines": {
"node": ">=12"
}
},
"node_modules/dmg-builder/node_modules/jsonfile": {
"version": "6.2.0",
"resolved": "https://registry.npmmirror.com/jsonfile/-/jsonfile-6.2.0.tgz",
"integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==",
"dev": true,
"license": "MIT",
"dependencies": {
"universalify": "^2.0.0"
},
"optionalDependencies": {
"graceful-fs": "^4.1.6"
}
},
"node_modules/dmg-builder/node_modules/universalify": {
"version": "2.0.1",
"resolved": "https://registry.npmmirror.com/universalify/-/universalify-2.0.1.tgz",
"integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 10.0.0"
}
},
"node_modules/dmg-license": {
"version": "1.0.11",
"resolved": "https://registry.npmmirror.com/dmg-license/-/dmg-license-1.0.11.tgz",
"integrity": "sha512-ZdzmqwKmECOWJpqefloC5OJy1+WZBBse5+MR88z9g9Zn4VY+WYUkAyojmhzJckH5YbbZGcYIuGAkY5/Ys5OM2Q==",
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"darwin"
],
"dependencies": {
"@types/plist": "^3.0.1",
"@types/verror": "^1.10.3",
"ajv": "^6.10.0",
"crc": "^3.8.0",
"iconv-corefoundation": "^1.1.7",
"plist": "^3.0.4",
"smart-buffer": "^4.0.2",
"verror": "^1.10.0"
},
"bin": {
"dmg-license": "bin/dmg-license.js"
},
"engines": {
"node": ">=8"
}
},
"node_modules/dotenv": {
"version": "16.6.1",
"resolved": "https://registry.npmmirror.com/dotenv/-/dotenv-16.6.1.tgz",
"integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==",
"dev": true,
"license": "BSD-2-Clause",
"engines": {
"node": ">=12"
},
"funding": {
"url": "https://dotenvx.com"
}
},
"node_modules/dotenv-expand": {
"version": "11.0.7",
"resolved": "https://registry.npmmirror.com/dotenv-expand/-/dotenv-expand-11.0.7.tgz",
"integrity": "sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA==",
"dev": true,
"license": "BSD-2-Clause",
"dependencies": {
"dotenv": "^16.4.5"
},
"engines": {
"node": ">=12"
},
"funding": {
"url": "https://dotenvx.com"
}
},
"node_modules/dunder-proto": {
"version": "1.0.1",
"resolved": "https://registry.npmmirror.com/dunder-proto/-/dunder-proto-1.0.1.tgz",
"integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
"dev": true,
"license": "MIT",
"dependencies": {
"call-bind-apply-helpers": "^1.0.1",
"es-errors": "^1.3.0",
"gopd": "^1.2.0"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/eastasianwidth": {
"version": "0.2.0",
"resolved": "https://registry.npmmirror.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
"integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
"dev": true,
"license": "MIT"
},
"node_modules/ee-first": {
"version": "1.1.1",
"resolved": "https://registry.npmmirror.com/ee-first/-/ee-first-1.1.1.tgz",
"integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==",
"license": "MIT"
},
"node_modules/ejs": {
"version": "3.1.10",
"resolved": "https://registry.npmmirror.com/ejs/-/ejs-3.1.10.tgz",
"integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
"jake": "^10.8.5"
},
"bin": {
"ejs": "bin/cli.js"
},
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/electron": {
"version": "30.5.1",
"resolved": "https://registry.npmmirror.com/electron/-/electron-30.5.1.tgz",
"integrity": "sha512-AhL7+mZ8Lg14iaNfoYTkXQ2qee8mmsQyllKdqxlpv/zrKgfxz6jNVtcRRbQtLxtF8yzcImWdfTQROpYiPumdbw==",
"dev": true,
"hasInstallScript": true,
"license": "MIT",
"dependencies": {
"@electron/get": "^2.0.0",
"@types/node": "^20.9.0",
"extract-zip": "^2.0.1"
},
"bin": {
"electron": "cli.js"
},
"engines": {
"node": ">= 12.20.55"
}
},
"node_modules/electron-builder": {
"version": "26.0.12",
"resolved": "https://registry.npmmirror.com/electron-builder/-/electron-builder-26.0.12.tgz",
"integrity": "sha512-cD1kz5g2sgPTMFHjLxfMjUK5JABq3//J4jPswi93tOPFz6btzXYtK5NrDt717NRbukCUDOrrvmYVOWERlqoiXA==",
"dev": true,
"license": "MIT",
"dependencies": {
"app-builder-lib": "26.0.12",
"builder-util": "26.0.11",
"builder-util-runtime": "9.3.1",
"chalk": "^4.1.2",
"dmg-builder": "26.0.12",
"fs-extra": "^10.1.0",
"is-ci": "^3.0.0",
"lazy-val": "^1.0.5",
"simple-update-notifier": "2.0.0",
"yargs": "^17.6.2"
},
"bin": {
"electron-builder": "cli.js",
"install-app-deps": "install-app-deps.js"
},
"engines": {
"node": ">=14.0.0"
}
},
"node_modules/electron-builder-squirrel-windows": {
"version": "26.0.12",
"resolved": "https://registry.npmmirror.com/electron-builder-squirrel-windows/-/electron-builder-squirrel-windows-26.0.12.tgz",
"integrity": "sha512-kpwXM7c/ayRUbYVErQbsZ0nQZX4aLHQrPEG9C4h9vuJCXylwFH8a7Jgi2VpKIObzCXO7LKHiCw4KdioFLFOgqA==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"app-builder-lib": "26.0.12",
"builder-util": "26.0.11",
"electron-winstaller": "5.4.0"
}
},
"node_modules/electron-builder/node_modules/fs-extra": {
"version": "10.1.0",
"resolved": "https://registry.npmmirror.com/fs-extra/-/fs-extra-10.1.0.tgz",
"integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"graceful-fs": "^4.2.0",
"jsonfile": "^6.0.1",
"universalify": "^2.0.0"
},
"engines": {
"node": ">=12"
}
},
"node_modules/electron-builder/node_modules/jsonfile": {
"version": "6.2.0",
"resolved": "https://registry.npmmirror.com/jsonfile/-/jsonfile-6.2.0.tgz",
"integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==",
"dev": true,
"license": "MIT",
"dependencies": {
"universalify": "^2.0.0"
},
"optionalDependencies": {
"graceful-fs": "^4.1.6"
}
},
"node_modules/electron-builder/node_modules/universalify": {
"version": "2.0.1",
"resolved": "https://registry.npmmirror.com/universalify/-/universalify-2.0.1.tgz",
"integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 10.0.0"
}
},
"node_modules/electron-publish": {
"version": "26.0.11",
"resolved": "https://registry.npmmirror.com/electron-publish/-/electron-publish-26.0.11.tgz",
"integrity": "sha512-a8QRH0rAPIWH9WyyS5LbNvW9Ark6qe63/LqDB7vu2JXYpi0Gma5Q60Dh4tmTqhOBQt0xsrzD8qE7C+D7j+B24A==",
"dev": true,
"license": "MIT",
"dependencies": {
"@types/fs-extra": "^9.0.11",
"builder-util": "26.0.11",
"builder-util-runtime": "9.3.1",
"chalk": "^4.1.2",
"form-data": "^4.0.0",
"fs-extra": "^10.1.0",
"lazy-val": "^1.0.5",
"mime": "^2.5.2"
}
},
"node_modules/electron-publish/node_modules/fs-extra": {
"version": "10.1.0",
"resolved": "https://registry.npmmirror.com/fs-extra/-/fs-extra-10.1.0.tgz",
"integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"graceful-fs": "^4.2.0",
"jsonfile": "^6.0.1",
"universalify": "^2.0.0"
},
"engines": {
"node": ">=12"
}
},
"node_modules/electron-publish/node_modules/jsonfile": {
"version": "6.2.0",
"resolved": "https://registry.npmmirror.com/jsonfile/-/jsonfile-6.2.0.tgz",
"integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==",
"dev": true,
"license": "MIT",
"dependencies": {
"universalify": "^2.0.0"
},
"optionalDependencies": {
"graceful-fs": "^4.1.6"
}
},
"node_modules/electron-publish/node_modules/universalify": {
"version": "2.0.1",
"resolved": "https://registry.npmmirror.com/universalify/-/universalify-2.0.1.tgz",
"integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 10.0.0"
}
},
"node_modules/electron-to-chromium": {
"version": "1.5.267",
"resolved": "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.5.267.tgz",
"integrity": "sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==",
"dev": true,
"license": "ISC"
},
"node_modules/electron-vite": {
"version": "5.0.0",
"resolved": "https://registry.npmmirror.com/electron-vite/-/electron-vite-5.0.0.tgz",
"integrity": "sha512-OHp/vjdlubNlhNkPkL/+3JD34ii5ov7M0GpuXEVdQeqdQ3ulvVR7Dg/rNBLfS5XPIFwgoBLDf9sjjrL+CuDyRQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/core": "^7.28.4",
"@babel/plugin-transform-arrow-functions": "^7.27.1",
"cac": "^6.7.14",
"esbuild": "^0.25.11",
"magic-string": "^0.30.19",
"picocolors": "^1.1.1"
},
"bin": {
"electron-vite": "bin/electron-vite.js"
},
"engines": {
"node": "^20.19.0 || >=22.12.0"
},
"peerDependencies": {
"@swc/core": "^1.0.0",
"vite": "^5.0.0 || ^6.0.0 || ^7.0.0"
},
"peerDependenciesMeta": {
"@swc/core": {
"optional": true
}
}
},
"node_modules/electron-winstaller": {
"version": "5.4.0",
"resolved": "https://registry.npmmirror.com/electron-winstaller/-/electron-winstaller-5.4.0.tgz",
"integrity": "sha512-bO3y10YikuUwUuDUQRM4KfwNkKhnpVO7IPdbsrejwN9/AABJzzTQ4GeHwyzNSrVO+tEH3/Np255a3sVZpZDjvg==",
"dev": true,
"hasInstallScript": true,
"license": "MIT",
"peer": true,
"dependencies": {
"@electron/asar": "^3.2.1",
"debug": "^4.1.1",
"fs-extra": "^7.0.1",
"lodash": "^4.17.21",
"temp": "^0.9.0"
},
"engines": {
"node": ">=8.0.0"
},
"optionalDependencies": {
"@electron/windows-sign": "^1.1.2"
}
},
"node_modules/electron-winstaller/node_modules/fs-extra": {
"version": "7.0.1",
"resolved": "https://registry.npmmirror.com/fs-extra/-/fs-extra-7.0.1.tgz",
"integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"graceful-fs": "^4.1.2",
"jsonfile": "^4.0.0",
"universalify": "^0.1.0"
},
"engines": {
"node": ">=6 <7 || >=8"
}
},
"node_modules/electron/node_modules/@types/node": {
"version": "20.19.27",
"resolved": "https://registry.npmmirror.com/@types/node/-/node-20.19.27.tgz",
"integrity": "sha512-N2clP5pJhB2YnZJ3PIHFk5RkygRX5WO/5f0WC08tp0wd+sv0rsJk3MqWn3CbNmT2J505a5336jaQj4ph1AdMug==",
"dev": true,
"license": "MIT",
"dependencies": {
"undici-types": "~6.21.0"
}
},
"node_modules/electron/node_modules/undici-types": {
"version": "6.21.0",
"resolved": "https://registry.npmmirror.com/undici-types/-/undici-types-6.21.0.tgz",
"integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==",
"dev": true,
"license": "MIT"
},
"node_modules/emoji-regex": {
"version": "8.0.0",
"resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz",
"integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
"dev": true,
"license": "MIT"
},
"node_modules/encodeurl": {
"version": "2.0.0",
"resolved": "https://registry.npmmirror.com/encodeurl/-/encodeurl-2.0.0.tgz",
"integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==",
"license": "MIT",
"engines": {
"node": ">= 0.8"
}
},
"node_modules/encoding": {
"version": "0.1.13",
"resolved": "https://registry.npmmirror.com/encoding/-/encoding-0.1.13.tgz",
"integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==",
"dev": true,
"license": "MIT",
"optional": true,
"dependencies": {
"iconv-lite": "^0.6.2"
}
},
"node_modules/end-of-stream": {
"version": "1.4.5",
"resolved": "https://registry.npmmirror.com/end-of-stream/-/end-of-stream-1.4.5.tgz",
"integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==",
"dev": true,
"license": "MIT",
"dependencies": {
"once": "^1.4.0"
}
},
"node_modules/enhanced-resolve": {
"version": "5.18.4",
"resolved": "https://registry.npmmirror.com/enhanced-resolve/-/enhanced-resolve-5.18.4.tgz",
"integrity": "sha512-LgQMM4WXU3QI+SYgEc2liRgznaD5ojbmY3sb8LxyguVkIg5FxdpTkvk72te2R38/TGKxH634oLxXRGY6d7AP+Q==",
"license": "MIT",
"dependencies": {
"graceful-fs": "^4.2.4",
"tapable": "^2.2.0"
},
"engines": {
"node": ">=10.13.0"
}
},
"node_modules/entities": {
"version": "4.5.0",
"resolved": "https://registry.npmmirror.com/entities/-/entities-4.5.0.tgz",
"integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
"license": "BSD-2-Clause",
"engines": {
"node": ">=0.12"
},
"funding": {
"url": "https://github.com/fb55/entities?sponsor=1"
}
},
"node_modules/env-paths": {
"version": "2.2.1",
"resolved": "https://registry.npmmirror.com/env-paths/-/env-paths-2.2.1.tgz",
"integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=6"
}
},
"node_modules/err-code": {
"version": "2.0.3",
"resolved": "https://registry.npmmirror.com/err-code/-/err-code-2.0.3.tgz",
"integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==",
"dev": true,
"license": "MIT"
},
"node_modules/es-define-property": {
"version": "1.0.1",
"resolved": "https://registry.npmmirror.com/es-define-property/-/es-define-property-1.0.1.tgz",
"integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.4"
}
},
"node_modules/es-errors": {
"version": "1.3.0",
"resolved": "https://registry.npmmirror.com/es-errors/-/es-errors-1.3.0.tgz",
"integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.4"
}
},
"node_modules/es-object-atoms": {
"version": "1.1.1",
"resolved": "https://registry.npmmirror.com/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
"integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
"dev": true,
"license": "MIT",
"dependencies": {
"es-errors": "^1.3.0"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/es-set-tostringtag": {
"version": "2.1.0",
"resolved": "https://registry.npmmirror.com/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz",
"integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==",
"dev": true,
"license": "MIT",
"dependencies": {
"es-errors": "^1.3.0",
"get-intrinsic": "^1.2.6",
"has-tostringtag": "^1.0.2",
"hasown": "^2.0.2"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/es6-error": {
"version": "4.1.1",
"resolved": "https://registry.npmmirror.com/es6-error/-/es6-error-4.1.1.tgz",
"integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==",
"dev": true,
"license": "MIT",
"optional": true
},
"node_modules/esbuild": {
"version": "0.25.12",
"resolved": "https://registry.npmmirror.com/esbuild/-/esbuild-0.25.12.tgz",
"integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==",
"devOptional": true,
"hasInstallScript": true,
"license": "MIT",
"bin": {
"esbuild": "bin/esbuild"
},
"engines": {
"node": ">=18"
},
"optionalDependencies": {
"@esbuild/aix-ppc64": "0.25.12",
"@esbuild/android-arm": "0.25.12",
"@esbuild/android-arm64": "0.25.12",
"@esbuild/android-x64": "0.25.12",
"@esbuild/darwin-arm64": "0.25.12",
"@esbuild/darwin-x64": "0.25.12",
"@esbuild/freebsd-arm64": "0.25.12",
"@esbuild/freebsd-x64": "0.25.12",
"@esbuild/linux-arm": "0.25.12",
"@esbuild/linux-arm64": "0.25.12",
"@esbuild/linux-ia32": "0.25.12",
"@esbuild/linux-loong64": "0.25.12",
"@esbuild/linux-mips64el": "0.25.12",
"@esbuild/linux-ppc64": "0.25.12",
"@esbuild/linux-riscv64": "0.25.12",
"@esbuild/linux-s390x": "0.25.12",
"@esbuild/linux-x64": "0.25.12",
"@esbuild/netbsd-arm64": "0.25.12",
"@esbuild/netbsd-x64": "0.25.12",
"@esbuild/openbsd-arm64": "0.25.12",
"@esbuild/openbsd-x64": "0.25.12",
"@esbuild/openharmony-arm64": "0.25.12",
"@esbuild/sunos-x64": "0.25.12",
"@esbuild/win32-arm64": "0.25.12",
"@esbuild/win32-ia32": "0.25.12",
"@esbuild/win32-x64": "0.25.12"
}
},
"node_modules/escalade": {
"version": "3.2.0",
"resolved": "https://registry.npmmirror.com/escalade/-/escalade-3.2.0.tgz",
"integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=6"
}
},
"node_modules/escape-html": {
"version": "1.0.3",
"resolved": "https://registry.npmmirror.com/escape-html/-/escape-html-1.0.3.tgz",
"integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==",
"license": "MIT"
},
"node_modules/escape-string-regexp": {
"version": "4.0.0",
"resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
"integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
"dev": true,
"license": "MIT",
"optional": true,
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/estree-walker": {
"version": "2.0.2",
"resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-2.0.2.tgz",
"integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
"license": "MIT"
},
"node_modules/etag": {
"version": "1.8.1",
"resolved": "https://registry.npmmirror.com/etag/-/etag-1.8.1.tgz",
"integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
"license": "MIT",
"engines": {
"node": ">= 0.6"
}
},
"node_modules/exponential-backoff": {
"version": "3.1.3",
"resolved": "https://registry.npmmirror.com/exponential-backoff/-/exponential-backoff-3.1.3.tgz",
"integrity": "sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==",
"dev": true,
"license": "Apache-2.0"
},
"node_modules/extract-zip": {
"version": "2.0.1",
"resolved": "https://registry.npmmirror.com/extract-zip/-/extract-zip-2.0.1.tgz",
"integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==",
"dev": true,
"license": "BSD-2-Clause",
"dependencies": {
"debug": "^4.1.1",
"get-stream": "^5.1.0",
"yauzl": "^2.10.0"
},
"bin": {
"extract-zip": "cli.js"
},
"engines": {
"node": ">= 10.17.0"
},
"optionalDependencies": {
"@types/yauzl": "^2.9.1"
}
},
"node_modules/extsprintf": {
"version": "1.4.1",
"resolved": "https://registry.npmmirror.com/extsprintf/-/extsprintf-1.4.1.tgz",
"integrity": "sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA==",
"dev": true,
"engines": [
"node >=0.6.0"
],
"license": "MIT",
"optional": true
},
"node_modules/fast-deep-equal": {
"version": "3.1.3",
"resolved": "https://registry.npmmirror.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
"integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
"dev": true,
"license": "MIT"
},
"node_modules/fast-json-stable-stringify": {
"version": "2.1.0",
"resolved": "https://registry.npmmirror.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
"integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
"dev": true,
"license": "MIT"
},
"node_modules/fd-slicer": {
"version": "1.1.0",
"resolved": "https://registry.npmmirror.com/fd-slicer/-/fd-slicer-1.1.0.tgz",
"integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==",
"dev": true,
"license": "MIT",
"dependencies": {
"pend": "~1.2.0"
}
},
"node_modules/fdir": {
"version": "6.5.0",
"resolved": "https://registry.npmmirror.com/fdir/-/fdir-6.5.0.tgz",
"integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==",
"license": "MIT",
"engines": {
"node": ">=12.0.0"
},
"peerDependencies": {
"picomatch": "^3 || ^4"
},
"peerDependenciesMeta": {
"picomatch": {
"optional": true
}
}
},
"node_modules/file-saver": {
"version": "2.0.5",
"resolved": "https://registry.npmmirror.com/file-saver/-/file-saver-2.0.5.tgz",
"integrity": "sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA==",
"license": "MIT"
},
"node_modules/filelist": {
"version": "1.0.4",
"resolved": "https://registry.npmmirror.com/filelist/-/filelist-1.0.4.tgz",
"integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
"minimatch": "^5.0.1"
}
},
"node_modules/filelist/node_modules/brace-expansion": {
"version": "2.0.2",
"resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-2.0.2.tgz",
"integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"balanced-match": "^1.0.0"
}
},
"node_modules/filelist/node_modules/minimatch": {
"version": "5.1.6",
"resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-5.1.6.tgz",
"integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
"dev": true,
"license": "ISC",
"dependencies": {
"brace-expansion": "^2.0.1"
},
"engines": {
"node": ">=10"
}
},
"node_modules/finalhandler": {
"version": "2.1.1",
"resolved": "https://registry.npmmirror.com/finalhandler/-/finalhandler-2.1.1.tgz",
"integrity": "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==",
"license": "MIT",
"dependencies": {
"debug": "^4.4.0",
"encodeurl": "^2.0.0",
"escape-html": "^1.0.3",
"on-finished": "^2.4.1",
"parseurl": "^1.3.3",
"statuses": "^2.0.1"
},
"engines": {
"node": ">= 18.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/express"
}
},
"node_modules/foreground-child": {
"version": "3.3.1",
"resolved": "https://registry.npmmirror.com/foreground-child/-/foreground-child-3.3.1.tgz",
"integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==",
"dev": true,
"license": "ISC",
"dependencies": {
"cross-spawn": "^7.0.6",
"signal-exit": "^4.0.1"
},
"engines": {
"node": ">=14"
},
"funding": {
"url": "https://github.com/sponsors/isaacs"
}
},
"node_modules/foreground-child/node_modules/signal-exit": {
"version": "4.1.0",
"resolved": "https://registry.npmmirror.com/signal-exit/-/signal-exit-4.1.0.tgz",
"integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
"dev": true,
"license": "ISC",
"engines": {
"node": ">=14"
},
"funding": {
"url": "https://github.com/sponsors/isaacs"
}
},
"node_modules/form-data": {
"version": "4.0.5",
"resolved": "https://registry.npmmirror.com/form-data/-/form-data-4.0.5.tgz",
"integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==",
"dev": true,
"license": "MIT",
"dependencies": {
"asynckit": "^0.4.0",
"combined-stream": "^1.0.8",
"es-set-tostringtag": "^2.1.0",
"hasown": "^2.0.2",
"mime-types": "^2.1.12"
},
"engines": {
"node": ">= 6"
}
},
"node_modules/fresh": {
"version": "2.0.0",
"resolved": "https://registry.npmmirror.com/fresh/-/fresh-2.0.0.tgz",
"integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==",
"license": "MIT",
"engines": {
"node": ">= 0.8"
}
},
"node_modules/fs-extra": {
"version": "8.1.0",
"resolved": "https://registry.npmmirror.com/fs-extra/-/fs-extra-8.1.0.tgz",
"integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==",
"dev": true,
"license": "MIT",
"dependencies": {
"graceful-fs": "^4.2.0",
"jsonfile": "^4.0.0",
"universalify": "^0.1.0"
},
"engines": {
"node": ">=6 <7 || >=8"
}
},
"node_modules/fs-minipass": {
"version": "2.1.0",
"resolved": "https://registry.npmmirror.com/fs-minipass/-/fs-minipass-2.1.0.tgz",
"integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==",
"dev": true,
"license": "ISC",
"dependencies": {
"minipass": "^3.0.0"
},
"engines": {
"node": ">= 8"
}
},
"node_modules/fs.realpath": {
"version": "1.0.0",
"resolved": "https://registry.npmmirror.com/fs.realpath/-/fs.realpath-1.0.0.tgz",
"integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
"dev": true,
"license": "ISC"
},
"node_modules/fsevents": {
"version": "2.3.3",
"resolved": "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.3.tgz",
"integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
"hasInstallScript": true,
"license": "MIT",
"optional": true,
"os": [
"darwin"
],
"engines": {
"node": "^8.16.0 || ^10.6.0 || >=11.0.0"
}
},
"node_modules/function-bind": {
"version": "1.1.2",
"resolved": "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.2.tgz",
"integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
"dev": true,
"license": "MIT",
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/gensync": {
"version": "1.0.0-beta.2",
"resolved": "https://registry.npmmirror.com/gensync/-/gensync-1.0.0-beta.2.tgz",
"integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/get-caller-file": {
"version": "2.0.5",
"resolved": "https://registry.npmmirror.com/get-caller-file/-/get-caller-file-2.0.5.tgz",
"integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
"dev": true,
"license": "ISC",
"engines": {
"node": "6.* || 8.* || >= 10.*"
}
},
"node_modules/get-intrinsic": {
"version": "1.3.0",
"resolved": "https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
"integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"call-bind-apply-helpers": "^1.0.2",
"es-define-property": "^1.0.1",
"es-errors": "^1.3.0",
"es-object-atoms": "^1.1.1",
"function-bind": "^1.1.2",
"get-proto": "^1.0.1",
"gopd": "^1.2.0",
"has-symbols": "^1.1.0",
"hasown": "^2.0.2",
"math-intrinsics": "^1.1.0"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/get-proto": {
"version": "1.0.1",
"resolved": "https://registry.npmmirror.com/get-proto/-/get-proto-1.0.1.tgz",
"integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
"dev": true,
"license": "MIT",
"dependencies": {
"dunder-proto": "^1.0.1",
"es-object-atoms": "^1.0.0"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/get-stream": {
"version": "5.2.0",
"resolved": "https://registry.npmmirror.com/get-stream/-/get-stream-5.2.0.tgz",
"integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
"dev": true,
"license": "MIT",
"dependencies": {
"pump": "^3.0.0"
},
"engines": {
"node": ">=8"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/glob": {
"version": "7.2.3",
"resolved": "https://registry.npmmirror.com/glob/-/glob-7.2.3.tgz",
"integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
"deprecated": "Glob versions prior to v9 are no longer supported",
"dev": true,
"license": "ISC",
"dependencies": {
"fs.realpath": "^1.0.0",
"inflight": "^1.0.4",
"inherits": "2",
"minimatch": "^3.1.1",
"once": "^1.3.0",
"path-is-absolute": "^1.0.0"
},
"engines": {
"node": "*"
},
"funding": {
"url": "https://github.com/sponsors/isaacs"
}
},
"node_modules/glob/node_modules/minimatch": {
"version": "3.1.2",
"resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz",
"integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
"dev": true,
"license": "ISC",
"dependencies": {
"brace-expansion": "^1.1.7"
},
"engines": {
"node": "*"
}
},
"node_modules/global-agent": {
"version": "3.0.0",
"resolved": "https://registry.npmmirror.com/global-agent/-/global-agent-3.0.0.tgz",
"integrity": "sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==",
"dev": true,
"license": "BSD-3-Clause",
"optional": true,
"dependencies": {
"boolean": "^3.0.1",
"es6-error": "^4.1.1",
"matcher": "^3.0.0",
"roarr": "^2.15.3",
"semver": "^7.3.2",
"serialize-error": "^7.0.1"
},
"engines": {
"node": ">=10.0"
}
},
"node_modules/global-agent/node_modules/semver": {
"version": "7.7.3",
"resolved": "https://registry.npmmirror.com/semver/-/semver-7.7.3.tgz",
"integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==",
"dev": true,
"license": "ISC",
"optional": true,
"bin": {
"semver": "bin/semver.js"
},
"engines": {
"node": ">=10"
}
},
"node_modules/globalthis": {
"version": "1.0.4",
"resolved": "https://registry.npmmirror.com/globalthis/-/globalthis-1.0.4.tgz",
"integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==",
"dev": true,
"license": "MIT",
"optional": true,
"dependencies": {
"define-properties": "^1.2.1",
"gopd": "^1.0.1"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/gopd": {
"version": "1.2.0",
"resolved": "https://registry.npmmirror.com/gopd/-/gopd-1.2.0.tgz",
"integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/got": {
"version": "11.8.6",
"resolved": "https://registry.npmmirror.com/got/-/got-11.8.6.tgz",
"integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==",
"dev": true,
"license": "MIT",
"dependencies": {
"@sindresorhus/is": "^4.0.0",
"@szmarczak/http-timer": "^4.0.5",
"@types/cacheable-request": "^6.0.1",
"@types/responselike": "^1.0.0",
"cacheable-lookup": "^5.0.3",
"cacheable-request": "^7.0.2",
"decompress-response": "^6.0.0",
"http2-wrapper": "^1.0.0-beta.5.2",
"lowercase-keys": "^2.0.0",
"p-cancelable": "^2.0.0",
"responselike": "^2.0.0"
},
"engines": {
"node": ">=10.19.0"
},
"funding": {
"url": "https://github.com/sindresorhus/got?sponsor=1"
}
},
"node_modules/graceful-fs": {
"version": "4.2.11",
"resolved": "https://registry.npmmirror.com/graceful-fs/-/graceful-fs-4.2.11.tgz",
"integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
"license": "ISC"
},
"node_modules/has-flag": {
"version": "4.0.0",
"resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz",
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/has-property-descriptors": {
"version": "1.0.2",
"resolved": "https://registry.npmmirror.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz",
"integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==",
"dev": true,
"license": "MIT",
"optional": true,
"dependencies": {
"es-define-property": "^1.0.0"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/has-symbols": {
"version": "1.1.0",
"resolved": "https://registry.npmmirror.com/has-symbols/-/has-symbols-1.1.0.tgz",
"integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/has-tostringtag": {
"version": "1.0.2",
"resolved": "https://registry.npmmirror.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
"integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
"dev": true,
"license": "MIT",
"dependencies": {
"has-symbols": "^1.0.3"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/hasown": {
"version": "2.0.2",
"resolved": "https://registry.npmmirror.com/hasown/-/hasown-2.0.2.tgz",
"integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"function-bind": "^1.1.2"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/hookable": {
"version": "5.5.3",
"resolved": "https://registry.npmmirror.com/hookable/-/hookable-5.5.3.tgz",
"integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==",
"license": "MIT"
},
"node_modules/hosted-git-info": {
"version": "4.1.0",
"resolved": "https://registry.npmmirror.com/hosted-git-info/-/hosted-git-info-4.1.0.tgz",
"integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==",
"dev": true,
"license": "ISC",
"dependencies": {
"lru-cache": "^6.0.0"
},
"engines": {
"node": ">=10"
}
},
"node_modules/hosted-git-info/node_modules/lru-cache": {
"version": "6.0.0",
"resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-6.0.0.tgz",
"integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
"dev": true,
"license": "ISC",
"dependencies": {
"yallist": "^4.0.0"
},
"engines": {
"node": ">=10"
}
},
"node_modules/hosted-git-info/node_modules/yallist": {
"version": "4.0.0",
"resolved": "https://registry.npmmirror.com/yallist/-/yallist-4.0.0.tgz",
"integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
"dev": true,
"license": "ISC"
},
"node_modules/http-cache-semantics": {
"version": "4.2.0",
"resolved": "https://registry.npmmirror.com/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz",
"integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==",
"dev": true,
"license": "BSD-2-Clause"
},
"node_modules/http-errors": {
"version": "2.0.1",
"resolved": "https://registry.npmmirror.com/http-errors/-/http-errors-2.0.1.tgz",
"integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==",
"license": "MIT",
"dependencies": {
"depd": "~2.0.0",
"inherits": "~2.0.4",
"setprototypeof": "~1.2.0",
"statuses": "~2.0.2",
"toidentifier": "~1.0.1"
},
"engines": {
"node": ">= 0.8"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/express"
}
},
"node_modules/http-proxy-agent": {
"version": "7.0.2",
"resolved": "https://registry.npmmirror.com/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz",
"integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==",
"dev": true,
"license": "MIT",
"dependencies": {
"agent-base": "^7.1.0",
"debug": "^4.3.4"
},
"engines": {
"node": ">= 14"
}
},
"node_modules/http2-wrapper": {
"version": "1.0.3",
"resolved": "https://registry.npmmirror.com/http2-wrapper/-/http2-wrapper-1.0.3.tgz",
"integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==",
"dev": true,
"license": "MIT",
"dependencies": {
"quick-lru": "^5.1.1",
"resolve-alpn": "^1.0.0"
},
"engines": {
"node": ">=10.19.0"
}
},
"node_modules/https-proxy-agent": {
"version": "7.0.6",
"resolved": "https://registry.npmmirror.com/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz",
"integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==",
"dev": true,
"license": "MIT",
"dependencies": {
"agent-base": "^7.1.2",
"debug": "4"
},
"engines": {
"node": ">= 14"
}
},
"node_modules/humanize-ms": {
"version": "1.2.1",
"resolved": "https://registry.npmmirror.com/humanize-ms/-/humanize-ms-1.2.1.tgz",
"integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"ms": "^2.0.0"
}
},
"node_modules/iconv-corefoundation": {
"version": "1.1.7",
"resolved": "https://registry.npmmirror.com/iconv-corefoundation/-/iconv-corefoundation-1.1.7.tgz",
"integrity": "sha512-T10qvkw0zz4wnm560lOEg0PovVqUXuOFhhHAkixw8/sycy7TJt7v/RrkEKEQnAw2viPSJu6iAkErxnzR0g8PpQ==",
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"darwin"
],
"dependencies": {
"cli-truncate": "^2.1.0",
"node-addon-api": "^1.6.3"
},
"engines": {
"node": "^8.11.2 || >=10"
}
},
"node_modules/iconv-lite": {
"version": "0.6.3",
"resolved": "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.6.3.tgz",
"integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
"dev": true,
"license": "MIT",
"dependencies": {
"safer-buffer": ">= 2.1.2 < 3.0.0"
},
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/ieee754": {
"version": "1.2.1",
"resolved": "https://registry.npmmirror.com/ieee754/-/ieee754-1.2.1.tgz",
"integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
"dev": true,
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/feross"
},
{
"type": "patreon",
"url": "https://www.patreon.com/feross"
},
{
"type": "consulting",
"url": "https://feross.org/support"
}
],
"license": "BSD-3-Clause"
},
"node_modules/imurmurhash": {
"version": "0.1.4",
"resolved": "https://registry.npmmirror.com/imurmurhash/-/imurmurhash-0.1.4.tgz",
"integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=0.8.19"
}
},
"node_modules/indent-string": {
"version": "4.0.0",
"resolved": "https://registry.npmmirror.com/indent-string/-/indent-string-4.0.0.tgz",
"integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/infer-owner": {
"version": "1.0.4",
"resolved": "https://registry.npmmirror.com/infer-owner/-/infer-owner-1.0.4.tgz",
"integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==",
"dev": true,
"license": "ISC"
},
"node_modules/inflight": {
"version": "1.0.6",
"resolved": "https://registry.npmmirror.com/inflight/-/inflight-1.0.6.tgz",
"integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
"deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.",
"dev": true,
"license": "ISC",
"dependencies": {
"once": "^1.3.0",
"wrappy": "1"
}
},
"node_modules/inherits": {
"version": "2.0.4",
"resolved": "https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz",
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
"license": "ISC"
},
"node_modules/ip-address": {
"version": "10.1.0",
"resolved": "https://registry.npmmirror.com/ip-address/-/ip-address-10.1.0.tgz",
"integrity": "sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 12"
}
},
"node_modules/is-ci": {
"version": "3.0.1",
"resolved": "https://registry.npmmirror.com/is-ci/-/is-ci-3.0.1.tgz",
"integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"ci-info": "^3.2.0"
},
"bin": {
"is-ci": "bin.js"
}
},
"node_modules/is-fullwidth-code-point": {
"version": "3.0.0",
"resolved": "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
"integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/is-interactive": {
"version": "1.0.0",
"resolved": "https://registry.npmmirror.com/is-interactive/-/is-interactive-1.0.0.tgz",
"integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/is-lambda": {
"version": "1.0.1",
"resolved": "https://registry.npmmirror.com/is-lambda/-/is-lambda-1.0.1.tgz",
"integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==",
"dev": true,
"license": "MIT"
},
"node_modules/is-unicode-supported": {
"version": "0.1.0",
"resolved": "https://registry.npmmirror.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz",
"integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/is-what": {
"version": "5.5.0",
"resolved": "https://registry.npmmirror.com/is-what/-/is-what-5.5.0.tgz",
"integrity": "sha512-oG7cgbmg5kLYae2N5IVd3jm2s+vldjxJzK1pcu9LfpGuQ93MQSzo0okvRna+7y5ifrD+20FE8FvjusyGaz14fw==",
"license": "MIT",
"engines": {
"node": ">=18"
},
"funding": {
"url": "https://github.com/sponsors/mesqueeb"
}
},
"node_modules/isbinaryfile": {
"version": "5.0.7",
"resolved": "https://registry.npmmirror.com/isbinaryfile/-/isbinaryfile-5.0.7.tgz",
"integrity": "sha512-gnWD14Jh3FzS3CPhF0AxNOJ8CxqeblPTADzI38r0wt8ZyQl5edpy75myt08EG2oKvpyiqSqsx+Wkz9vtkbTqYQ==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 18.0.0"
},
"funding": {
"url": "https://github.com/sponsors/gjtorikian/"
}
},
"node_modules/isexe": {
"version": "2.0.0",
"resolved": "https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz",
"integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
"dev": true,
"license": "ISC"
},
"node_modules/jackspeak": {
"version": "3.4.3",
"resolved": "https://registry.npmmirror.com/jackspeak/-/jackspeak-3.4.3.tgz",
"integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==",
"dev": true,
"license": "BlueOak-1.0.0",
"dependencies": {
"@isaacs/cliui": "^8.0.2"
},
"funding": {
"url": "https://github.com/sponsors/isaacs"
},
"optionalDependencies": {
"@pkgjs/parseargs": "^0.11.0"
}
},
"node_modules/jake": {
"version": "10.9.4",
"resolved": "https://registry.npmmirror.com/jake/-/jake-10.9.4.tgz",
"integrity": "sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
"async": "^3.2.6",
"filelist": "^1.0.4",
"picocolors": "^1.1.1"
},
"bin": {
"jake": "bin/cli.js"
},
"engines": {
"node": ">=10"
}
},
"node_modules/jiti": {
"version": "2.6.1",
"resolved": "https://registry.npmmirror.com/jiti/-/jiti-2.6.1.tgz",
"integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==",
"license": "MIT",
"bin": {
"jiti": "lib/jiti-cli.mjs"
}
},
"node_modules/js-tokens": {
"version": "4.0.0",
"resolved": "https://registry.npmmirror.com/js-tokens/-/js-tokens-4.0.0.tgz",
"integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
"dev": true,
"license": "MIT"
},
"node_modules/js-yaml": {
"version": "4.1.1",
"resolved": "https://registry.npmmirror.com/js-yaml/-/js-yaml-4.1.1.tgz",
"integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==",
"dev": true,
"license": "MIT",
"dependencies": {
"argparse": "^2.0.1"
},
"bin": {
"js-yaml": "bin/js-yaml.js"
}
},
"node_modules/jsesc": {
"version": "3.1.0",
"resolved": "https://registry.npmmirror.com/jsesc/-/jsesc-3.1.0.tgz",
"integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==",
"dev": true,
"license": "MIT",
"bin": {
"jsesc": "bin/jsesc"
},
"engines": {
"node": ">=6"
}
},
"node_modules/json-buffer": {
"version": "3.0.1",
"resolved": "https://registry.npmmirror.com/json-buffer/-/json-buffer-3.0.1.tgz",
"integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
"dev": true,
"license": "MIT"
},
"node_modules/json-schema-traverse": {
"version": "0.4.1",
"resolved": "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
"integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
"dev": true,
"license": "MIT"
},
"node_modules/json-stringify-safe": {
"version": "5.0.1",
"resolved": "https://registry.npmmirror.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
"integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==",
"dev": true,
"license": "ISC",
"optional": true
},
"node_modules/json5": {
"version": "2.2.3",
"resolved": "https://registry.npmmirror.com/json5/-/json5-2.2.3.tgz",
"integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
"dev": true,
"license": "MIT",
"bin": {
"json5": "lib/cli.js"
},
"engines": {
"node": ">=6"
}
},
"node_modules/jsonfile": {
"version": "4.0.0",
"resolved": "https://registry.npmmirror.com/jsonfile/-/jsonfile-4.0.0.tgz",
"integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==",
"dev": true,
"license": "MIT",
"optionalDependencies": {
"graceful-fs": "^4.1.6"
}
},
"node_modules/keyv": {
"version": "4.5.4",
"resolved": "https://registry.npmmirror.com/keyv/-/keyv-4.5.4.tgz",
"integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==",
"dev": true,
"license": "MIT",
"dependencies": {
"json-buffer": "3.0.1"
}
},
"node_modules/lazy-val": {
"version": "1.0.5",
"resolved": "https://registry.npmmirror.com/lazy-val/-/lazy-val-1.0.5.tgz",
"integrity": "sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q==",
"dev": true,
"license": "MIT"
},
"node_modules/lightningcss": {
"version": "1.30.2",
"resolved": "https://registry.npmmirror.com/lightningcss/-/lightningcss-1.30.2.tgz",
"integrity": "sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==",
"license": "MPL-2.0",
"dependencies": {
"detect-libc": "^2.0.3"
},
"engines": {
"node": ">= 12.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/parcel"
},
"optionalDependencies": {
"lightningcss-android-arm64": "1.30.2",
"lightningcss-darwin-arm64": "1.30.2",
"lightningcss-darwin-x64": "1.30.2",
"lightningcss-freebsd-x64": "1.30.2",
"lightningcss-linux-arm-gnueabihf": "1.30.2",
"lightningcss-linux-arm64-gnu": "1.30.2",
"lightningcss-linux-arm64-musl": "1.30.2",
"lightningcss-linux-x64-gnu": "1.30.2",
"lightningcss-linux-x64-musl": "1.30.2",
"lightningcss-win32-arm64-msvc": "1.30.2",
"lightningcss-win32-x64-msvc": "1.30.2"
}
},
"node_modules/lightningcss-android-arm64": {
"version": "1.30.2",
"resolved": "https://registry.npmmirror.com/lightningcss-android-arm64/-/lightningcss-android-arm64-1.30.2.tgz",
"integrity": "sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==",
"cpu": [
"arm64"
],
"license": "MPL-2.0",
"optional": true,
"os": [
"android"
],
"engines": {
"node": ">= 12.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/parcel"
}
},
"node_modules/lightningcss-darwin-arm64": {
"version": "1.30.2",
"resolved": "https://registry.npmmirror.com/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.2.tgz",
"integrity": "sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA==",
"cpu": [
"arm64"
],
"license": "MPL-2.0",
"optional": true,
"os": [
"darwin"
],
"engines": {
"node": ">= 12.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/parcel"
}
},
"node_modules/lightningcss-darwin-x64": {
"version": "1.30.2",
"resolved": "https://registry.npmmirror.com/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.2.tgz",
"integrity": "sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ==",
"cpu": [
"x64"
],
"license": "MPL-2.0",
"optional": true,
"os": [
"darwin"
],
"engines": {
"node": ">= 12.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/parcel"
}
},
"node_modules/lightningcss-freebsd-x64": {
"version": "1.30.2",
"resolved": "https://registry.npmmirror.com/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.2.tgz",
"integrity": "sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA==",
"cpu": [
"x64"
],
"license": "MPL-2.0",
"optional": true,
"os": [
"freebsd"
],
"engines": {
"node": ">= 12.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/parcel"
}
},
"node_modules/lightningcss-linux-arm-gnueabihf": {
"version": "1.30.2",
"resolved": "https://registry.npmmirror.com/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.2.tgz",
"integrity": "sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA==",
"cpu": [
"arm"
],
"license": "MPL-2.0",
"optional": true,
"os": [
"linux"
],
"engines": {
"node": ">= 12.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/parcel"
}
},
"node_modules/lightningcss-linux-arm64-gnu": {
"version": "1.30.2",
"resolved": "https://registry.npmmirror.com/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.2.tgz",
"integrity": "sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A==",
"cpu": [
"arm64"
],
"license": "MPL-2.0",
"optional": true,
"os": [
"linux"
],
"engines": {
"node": ">= 12.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/parcel"
}
},
"node_modules/lightningcss-linux-arm64-musl": {
"version": "1.30.2",
"resolved": "https://registry.npmmirror.com/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.2.tgz",
"integrity": "sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==",
"cpu": [
"arm64"
],
"license": "MPL-2.0",
"optional": true,
"os": [
"linux"
],
"engines": {
"node": ">= 12.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/parcel"
}
},
"node_modules/lightningcss-linux-x64-gnu": {
"version": "1.30.2",
"resolved": "https://registry.npmmirror.com/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.2.tgz",
"integrity": "sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==",
"cpu": [
"x64"
],
"license": "MPL-2.0",
"optional": true,
"os": [
"linux"
],
"engines": {
"node": ">= 12.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/parcel"
}
},
"node_modules/lightningcss-linux-x64-musl": {
"version": "1.30.2",
"resolved": "https://registry.npmmirror.com/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.2.tgz",
"integrity": "sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==",
"cpu": [
"x64"
],
"license": "MPL-2.0",
"optional": true,
"os": [
"linux"
],
"engines": {
"node": ">= 12.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/parcel"
}
},
"node_modules/lightningcss-win32-arm64-msvc": {
"version": "1.30.2",
"resolved": "https://registry.npmmirror.com/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.2.tgz",
"integrity": "sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==",
"cpu": [
"arm64"
],
"license": "MPL-2.0",
"optional": true,
"os": [
"win32"
],
"engines": {
"node": ">= 12.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/parcel"
}
},
"node_modules/lightningcss-win32-x64-msvc": {
"version": "1.30.2",
"resolved": "https://registry.npmmirror.com/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.2.tgz",
"integrity": "sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==",
"cpu": [
"x64"
],
"license": "MPL-2.0",
"optional": true,
"os": [
"win32"
],
"engines": {
"node": ">= 12.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/parcel"
}
},
"node_modules/lodash": {
"version": "4.17.21",
"resolved": "https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz",
"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
"dev": true,
"license": "MIT"
},
"node_modules/log-symbols": {
"version": "4.1.0",
"resolved": "https://registry.npmmirror.com/log-symbols/-/log-symbols-4.1.0.tgz",
"integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==",
"dev": true,
"license": "MIT",
"dependencies": {
"chalk": "^4.1.0",
"is-unicode-supported": "^0.1.0"
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/lowercase-keys": {
"version": "2.0.0",
"resolved": "https://registry.npmmirror.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz",
"integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/lru-cache": {
"version": "5.1.1",
"resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-5.1.1.tgz",
"integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
"dev": true,
"license": "ISC",
"dependencies": {
"yallist": "^3.0.2"
}
},
"node_modules/lucide-vue-next": {
"version": "0.556.0",
"resolved": "https://registry.npmmirror.com/lucide-vue-next/-/lucide-vue-next-0.556.0.tgz",
"integrity": "sha512-JvdCM2smkWrMDhkfD/FpZiWekkbWD6MZLstIFx/FOVZgULrnMr5hegCB9LlTdgllEFnQYQs8hhHC1WYcAV9HTA==",
"license": "ISC",
"peerDependencies": {
"vue": ">=3.0.1"
}
},
"node_modules/magic-string": {
"version": "0.30.21",
"resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.30.21.tgz",
"integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==",
"license": "MIT",
"dependencies": {
"@jridgewell/sourcemap-codec": "^1.5.5"
}
},
"node_modules/make-fetch-happen": {
"version": "10.2.1",
"resolved": "https://registry.npmmirror.com/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz",
"integrity": "sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==",
"dev": true,
"license": "ISC",
"dependencies": {
"agentkeepalive": "^4.2.1",
"cacache": "^16.1.0",
"http-cache-semantics": "^4.1.0",
"http-proxy-agent": "^5.0.0",
"https-proxy-agent": "^5.0.0",
"is-lambda": "^1.0.1",
"lru-cache": "^7.7.1",
"minipass": "^3.1.6",
"minipass-collect": "^1.0.2",
"minipass-fetch": "^2.0.3",
"minipass-flush": "^1.0.5",
"minipass-pipeline": "^1.2.4",
"negotiator": "^0.6.3",
"promise-retry": "^2.0.1",
"socks-proxy-agent": "^7.0.0",
"ssri": "^9.0.0"
},
"engines": {
"node": "^12.13.0 || ^14.15.0 || >=16.0.0"
}
},
"node_modules/make-fetch-happen/node_modules/agent-base": {
"version": "6.0.2",
"resolved": "https://registry.npmmirror.com/agent-base/-/agent-base-6.0.2.tgz",
"integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"debug": "4"
},
"engines": {
"node": ">= 6.0.0"
}
},
"node_modules/make-fetch-happen/node_modules/http-proxy-agent": {
"version": "5.0.0",
"resolved": "https://registry.npmmirror.com/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz",
"integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==",
"dev": true,
"license": "MIT",
"dependencies": {
"@tootallnate/once": "2",
"agent-base": "6",
"debug": "4"
},
"engines": {
"node": ">= 6"
}
},
"node_modules/make-fetch-happen/node_modules/https-proxy-agent": {
"version": "5.0.1",
"resolved": "https://registry.npmmirror.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz",
"integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==",
"dev": true,
"license": "MIT",
"dependencies": {
"agent-base": "6",
"debug": "4"
},
"engines": {
"node": ">= 6"
}
},
"node_modules/make-fetch-happen/node_modules/lru-cache": {
"version": "7.18.3",
"resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-7.18.3.tgz",
"integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==",
"dev": true,
"license": "ISC",
"engines": {
"node": ">=12"
}
},
"node_modules/matcher": {
"version": "3.0.0",
"resolved": "https://registry.npmmirror.com/matcher/-/matcher-3.0.0.tgz",
"integrity": "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==",
"dev": true,
"license": "MIT",
"optional": true,
"dependencies": {
"escape-string-regexp": "^4.0.0"
},
"engines": {
"node": ">=10"
}
},
"node_modules/math-intrinsics": {
"version": "1.1.0",
"resolved": "https://registry.npmmirror.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
"integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.4"
}
},
"node_modules/mime": {
"version": "2.6.0",
"resolved": "https://registry.npmmirror.com/mime/-/mime-2.6.0.tgz",
"integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==",
"dev": true,
"license": "MIT",
"bin": {
"mime": "cli.js"
},
"engines": {
"node": ">=4.0.0"
}
},
"node_modules/mime-db": {
"version": "1.52.0",
"resolved": "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz",
"integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.6"
}
},
"node_modules/mime-types": {
"version": "2.1.35",
"resolved": "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz",
"integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
"dev": true,
"license": "MIT",
"dependencies": {
"mime-db": "1.52.0"
},
"engines": {
"node": ">= 0.6"
}
},
"node_modules/mimic-fn": {
"version": "2.1.0",
"resolved": "https://registry.npmmirror.com/mimic-fn/-/mimic-fn-2.1.0.tgz",
"integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=6"
}
},
"node_modules/mimic-response": {
"version": "1.0.1",
"resolved": "https://registry.npmmirror.com/mimic-response/-/mimic-response-1.0.1.tgz",
"integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=4"
}
},
"node_modules/minimatch": {
"version": "10.1.1",
"resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-10.1.1.tgz",
"integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==",
"dev": true,
"license": "BlueOak-1.0.0",
"dependencies": {
"@isaacs/brace-expansion": "^5.0.0"
},
"engines": {
"node": "20 || >=22"
},
"funding": {
"url": "https://github.com/sponsors/isaacs"
}
},
"node_modules/minimist": {
"version": "1.2.8",
"resolved": "https://registry.npmmirror.com/minimist/-/minimist-1.2.8.tgz",
"integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
"dev": true,
"license": "MIT",
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/minipass": {
"version": "3.3.6",
"resolved": "https://registry.npmmirror.com/minipass/-/minipass-3.3.6.tgz",
"integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
"dev": true,
"license": "ISC",
"dependencies": {
"yallist": "^4.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/minipass-collect": {
"version": "1.0.2",
"resolved": "https://registry.npmmirror.com/minipass-collect/-/minipass-collect-1.0.2.tgz",
"integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==",
"dev": true,
"license": "ISC",
"dependencies": {
"minipass": "^3.0.0"
},
"engines": {
"node": ">= 8"
}
},
"node_modules/minipass-fetch": {
"version": "2.1.2",
"resolved": "https://registry.npmmirror.com/minipass-fetch/-/minipass-fetch-2.1.2.tgz",
"integrity": "sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==",
"dev": true,
"license": "MIT",
"dependencies": {
"minipass": "^3.1.6",
"minipass-sized": "^1.0.3",
"minizlib": "^2.1.2"
},
"engines": {
"node": "^12.13.0 || ^14.15.0 || >=16.0.0"
},
"optionalDependencies": {
"encoding": "^0.1.13"
}
},
"node_modules/minipass-flush": {
"version": "1.0.5",
"resolved": "https://registry.npmmirror.com/minipass-flush/-/minipass-flush-1.0.5.tgz",
"integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==",
"dev": true,
"license": "ISC",
"dependencies": {
"minipass": "^3.0.0"
},
"engines": {
"node": ">= 8"
}
},
"node_modules/minipass-pipeline": {
"version": "1.2.4",
"resolved": "https://registry.npmmirror.com/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz",
"integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==",
"dev": true,
"license": "ISC",
"dependencies": {
"minipass": "^3.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/minipass-sized": {
"version": "1.0.3",
"resolved": "https://registry.npmmirror.com/minipass-sized/-/minipass-sized-1.0.3.tgz",
"integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==",
"dev": true,
"license": "ISC",
"dependencies": {
"minipass": "^3.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/minipass/node_modules/yallist": {
"version": "4.0.0",
"resolved": "https://registry.npmmirror.com/yallist/-/yallist-4.0.0.tgz",
"integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
"dev": true,
"license": "ISC"
},
"node_modules/minizlib": {
"version": "2.1.2",
"resolved": "https://registry.npmmirror.com/minizlib/-/minizlib-2.1.2.tgz",
"integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==",
"dev": true,
"license": "MIT",
"dependencies": {
"minipass": "^3.0.0",
"yallist": "^4.0.0"
},
"engines": {
"node": ">= 8"
}
},
"node_modules/minizlib/node_modules/yallist": {
"version": "4.0.0",
"resolved": "https://registry.npmmirror.com/yallist/-/yallist-4.0.0.tgz",
"integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
"dev": true,
"license": "ISC"
},
"node_modules/mitt": {
"version": "3.0.1",
"resolved": "https://registry.npmmirror.com/mitt/-/mitt-3.0.1.tgz",
"integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==",
"license": "MIT"
},
"node_modules/mkdirp": {
"version": "1.0.4",
"resolved": "https://registry.npmmirror.com/mkdirp/-/mkdirp-1.0.4.tgz",
"integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
"dev": true,
"license": "MIT",
"bin": {
"mkdirp": "bin/cmd.js"
},
"engines": {
"node": ">=10"
}
},
"node_modules/ms": {
"version": "2.1.3",
"resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz",
"integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
"license": "MIT"
},
"node_modules/muggle-string": {
"version": "0.4.1",
"resolved": "https://registry.npmmirror.com/muggle-string/-/muggle-string-0.4.1.tgz",
"integrity": "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==",
"dev": true,
"license": "MIT"
},
"node_modules/nanoid": {
"version": "3.3.11",
"resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.11.tgz",
"integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==",
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/ai"
}
],
"license": "MIT",
"bin": {
"nanoid": "bin/nanoid.cjs"
},
"engines": {
"node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
}
},
"node_modules/negotiator": {
"version": "0.6.4",
"resolved": "https://registry.npmmirror.com/negotiator/-/negotiator-0.6.4.tgz",
"integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.6"
}
},
"node_modules/node-abi": {
"version": "3.85.0",
"resolved": "https://registry.npmmirror.com/node-abi/-/node-abi-3.85.0.tgz",
"integrity": "sha512-zsFhmbkAzwhTft6nd3VxcG0cvJsT70rL+BIGHWVq5fi6MwGrHwzqKaxXE+Hl2GmnGItnDKPPkO5/LQqjVkIdFg==",
"dev": true,
"license": "MIT",
"dependencies": {
"semver": "^7.3.5"
},
"engines": {
"node": ">=10"
}
},
"node_modules/node-abi/node_modules/semver": {
"version": "7.7.3",
"resolved": "https://registry.npmmirror.com/semver/-/semver-7.7.3.tgz",
"integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==",
"dev": true,
"license": "ISC",
"bin": {
"semver": "bin/semver.js"
},
"engines": {
"node": ">=10"
}
},
"node_modules/node-addon-api": {
"version": "1.7.2",
"resolved": "https://registry.npmmirror.com/node-addon-api/-/node-addon-api-1.7.2.tgz",
"integrity": "sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg==",
"dev": true,
"license": "MIT",
"optional": true
},
"node_modules/node-api-version": {
"version": "0.2.1",
"resolved": "https://registry.npmmirror.com/node-api-version/-/node-api-version-0.2.1.tgz",
"integrity": "sha512-2xP/IGGMmmSQpI1+O/k72jF/ykvZ89JeuKX3TLJAYPDVLUalrshrLHkeVcCCZqG/eEa635cr8IBYzgnDvM2O8Q==",
"dev": true,
"license": "MIT",
"dependencies": {
"semver": "^7.3.5"
}
},
"node_modules/node-api-version/node_modules/semver": {
"version": "7.7.3",
"resolved": "https://registry.npmmirror.com/semver/-/semver-7.7.3.tgz",
"integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==",
"dev": true,
"license": "ISC",
"bin": {
"semver": "bin/semver.js"
},
"engines": {
"node": ">=10"
}
},
"node_modules/node-releases": {
"version": "2.0.27",
"resolved": "https://registry.npmmirror.com/node-releases/-/node-releases-2.0.27.tgz",
"integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==",
"dev": true,
"license": "MIT"
},
"node_modules/nopt": {
"version": "6.0.0",
"resolved": "https://registry.npmmirror.com/nopt/-/nopt-6.0.0.tgz",
"integrity": "sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==",
"dev": true,
"license": "ISC",
"dependencies": {
"abbrev": "^1.0.0"
},
"bin": {
"nopt": "bin/nopt.js"
},
"engines": {
"node": "^12.13.0 || ^14.15.0 || >=16.0.0"
}
},
"node_modules/normalize-url": {
"version": "6.1.0",
"resolved": "https://registry.npmmirror.com/normalize-url/-/normalize-url-6.1.0.tgz",
"integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/object-keys": {
"version": "1.1.1",
"resolved": "https://registry.npmmirror.com/object-keys/-/object-keys-1.1.1.tgz",
"integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
"dev": true,
"license": "MIT",
"optional": true,
"engines": {
"node": ">= 0.4"
}
},
"node_modules/ohash": {
"version": "2.0.11",
"resolved": "https://registry.npmmirror.com/ohash/-/ohash-2.0.11.tgz",
"integrity": "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==",
"license": "MIT"
},
"node_modules/on-finished": {
"version": "2.4.1",
"resolved": "https://registry.npmmirror.com/on-finished/-/on-finished-2.4.1.tgz",
"integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
"license": "MIT",
"dependencies": {
"ee-first": "1.1.1"
},
"engines": {
"node": ">= 0.8"
}
},
"node_modules/once": {
"version": "1.4.0",
"resolved": "https://registry.npmmirror.com/once/-/once-1.4.0.tgz",
"integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
"dev": true,
"license": "ISC",
"dependencies": {
"wrappy": "1"
}
},
"node_modules/onetime": {
"version": "5.1.2",
"resolved": "https://registry.npmmirror.com/onetime/-/onetime-5.1.2.tgz",
"integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
"dev": true,
"license": "MIT",
"dependencies": {
"mimic-fn": "^2.1.0"
},
"engines": {
"node": ">=6"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/ora": {
"version": "5.4.1",
"resolved": "https://registry.npmmirror.com/ora/-/ora-5.4.1.tgz",
"integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"bl": "^4.1.0",
"chalk": "^4.1.0",
"cli-cursor": "^3.1.0",
"cli-spinners": "^2.5.0",
"is-interactive": "^1.0.0",
"is-unicode-supported": "^0.1.0",
"log-symbols": "^4.1.0",
"strip-ansi": "^6.0.0",
"wcwidth": "^1.0.1"
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/p-cancelable": {
"version": "2.1.1",
"resolved": "https://registry.npmmirror.com/p-cancelable/-/p-cancelable-2.1.1.tgz",
"integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/p-limit": {
"version": "3.1.0",
"resolved": "https://registry.npmmirror.com/p-limit/-/p-limit-3.1.0.tgz",
"integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"yocto-queue": "^0.1.0"
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/p-map": {
"version": "4.0.0",
"resolved": "https://registry.npmmirror.com/p-map/-/p-map-4.0.0.tgz",
"integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"aggregate-error": "^3.0.0"
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/package-json-from-dist": {
"version": "1.0.1",
"resolved": "https://registry.npmmirror.com/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz",
"integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==",
"dev": true,
"license": "BlueOak-1.0.0"
},
"node_modules/parseurl": {
"version": "1.3.3",
"resolved": "https://registry.npmmirror.com/parseurl/-/parseurl-1.3.3.tgz",
"integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
"license": "MIT",
"engines": {
"node": ">= 0.8"
}
},
"node_modules/path-browserify": {
"version": "1.0.1",
"resolved": "https://registry.npmmirror.com/path-browserify/-/path-browserify-1.0.1.tgz",
"integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==",
"dev": true,
"license": "MIT"
},
"node_modules/path-is-absolute": {
"version": "1.0.1",
"resolved": "https://registry.npmmirror.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
"integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/path-key": {
"version": "3.1.1",
"resolved": "https://registry.npmmirror.com/path-key/-/path-key-3.1.1.tgz",
"integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/path-scurry": {
"version": "1.11.1",
"resolved": "https://registry.npmmirror.com/path-scurry/-/path-scurry-1.11.1.tgz",
"integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==",
"dev": true,
"license": "BlueOak-1.0.0",
"dependencies": {
"lru-cache": "^10.2.0",
"minipass": "^5.0.0 || ^6.0.2 || ^7.0.0"
},
"engines": {
"node": ">=16 || 14 >=14.18"
},
"funding": {
"url": "https://github.com/sponsors/isaacs"
}
},
"node_modules/path-scurry/node_modules/lru-cache": {
"version": "10.4.3",
"resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-10.4.3.tgz",
"integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==",
"dev": true,
"license": "ISC"
},
"node_modules/path-scurry/node_modules/minipass": {
"version": "7.1.2",
"resolved": "https://registry.npmmirror.com/minipass/-/minipass-7.1.2.tgz",
"integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
"dev": true,
"license": "ISC",
"engines": {
"node": ">=16 || 14 >=14.17"
}
},
"node_modules/pe-library": {
"version": "0.4.1",
"resolved": "https://registry.npmmirror.com/pe-library/-/pe-library-0.4.1.tgz",
"integrity": "sha512-eRWB5LBz7PpDu4PUlwT0PhnQfTQJlDDdPa35urV4Osrm0t0AqQFGn+UIkU3klZvwJ8KPO3VbBFsXquA6p6kqZw==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=12",
"npm": ">=6"
},
"funding": {
"type": "github",
"url": "https://github.com/sponsors/jet2jet"
}
},
"node_modules/pend": {
"version": "1.2.0",
"resolved": "https://registry.npmmirror.com/pend/-/pend-1.2.0.tgz",
"integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==",
"dev": true,
"license": "MIT"
},
"node_modules/perfect-debounce": {
"version": "1.0.0",
"resolved": "https://registry.npmmirror.com/perfect-debounce/-/perfect-debounce-1.0.0.tgz",
"integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==",
"license": "MIT"
},
"node_modules/picocolors": {
"version": "1.1.1",
"resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.1.1.tgz",
"integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
"license": "ISC"
},
"node_modules/picomatch": {
"version": "4.0.3",
"resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.3.tgz",
"integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
"license": "MIT",
"engines": {
"node": ">=12"
},
"funding": {
"url": "https://github.com/sponsors/jonschlinkert"
}
},
"node_modules/pinia": {
"version": "3.0.4",
"resolved": "https://registry.npmmirror.com/pinia/-/pinia-3.0.4.tgz",
"integrity": "sha512-l7pqLUFTI/+ESXn6k3nu30ZIzW5E2WZF/LaHJEpoq6ElcLD+wduZoB2kBN19du6K/4FDpPMazY2wJr+IndBtQw==",
"license": "MIT",
"dependencies": {
"@vue/devtools-api": "^7.7.7"
},
"funding": {
"url": "https://github.com/sponsors/posva"
},
"peerDependencies": {
"typescript": ">=4.5.0",
"vue": "^3.5.11"
},
"peerDependenciesMeta": {
"typescript": {
"optional": true
}
}
},
"node_modules/pinia-plugin-persistedstate": {
"version": "4.7.1",
"resolved": "https://registry.npmmirror.com/pinia-plugin-persistedstate/-/pinia-plugin-persistedstate-4.7.1.tgz",
"integrity": "sha512-WHOqh2esDlR3eAaknPbqXrkkj0D24h8shrDPqysgCFR6ghqP/fpFfJmMPJp0gETHsvrh9YNNg6dQfo2OEtDnIQ==",
"license": "MIT",
"dependencies": {
"defu": "^6.1.4"
},
"peerDependencies": {
"@nuxt/kit": ">=3.0.0",
"@pinia/nuxt": ">=0.10.0",
"pinia": ">=3.0.0"
},
"peerDependenciesMeta": {
"@nuxt/kit": {
"optional": true
},
"@pinia/nuxt": {
"optional": true
},
"pinia": {
"optional": true
}
}
},
"node_modules/plist": {
"version": "3.1.0",
"resolved": "https://registry.npmmirror.com/plist/-/plist-3.1.0.tgz",
"integrity": "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"@xmldom/xmldom": "^0.8.8",
"base64-js": "^1.5.1",
"xmlbuilder": "^15.1.1"
},
"engines": {
"node": ">=10.4.0"
}
},
"node_modules/postcss": {
"version": "8.5.6",
"resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.5.6.tgz",
"integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==",
"funding": [
{
"type": "opencollective",
"url": "https://opencollective.com/postcss/"
},
{
"type": "tidelift",
"url": "https://tidelift.com/funding/github/npm/postcss"
},
{
"type": "github",
"url": "https://github.com/sponsors/ai"
}
],
"license": "MIT",
"dependencies": {
"nanoid": "^3.3.11",
"picocolors": "^1.1.1",
"source-map-js": "^1.2.1"
},
"engines": {
"node": "^10 || ^12 || >=14"
}
},
"node_modules/postject": {
"version": "1.0.0-alpha.6",
"resolved": "https://registry.npmmirror.com/postject/-/postject-1.0.0-alpha.6.tgz",
"integrity": "sha512-b9Eb8h2eVqNE8edvKdwqkrY6O7kAwmI8kcnBv1NScolYJbo59XUF0noFq+lxbC1yN20bmC0WBEbDC5H/7ASb0A==",
"dev": true,
"license": "MIT",
"optional": true,
"peer": true,
"dependencies": {
"commander": "^9.4.0"
},
"bin": {
"postject": "dist/cli.js"
},
"engines": {
"node": ">=14.0.0"
}
},
"node_modules/postject/node_modules/commander": {
"version": "9.5.0",
"resolved": "https://registry.npmmirror.com/commander/-/commander-9.5.0.tgz",
"integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==",
"dev": true,
"license": "MIT",
"optional": true,
"peer": true,
"engines": {
"node": "^12.20.0 || >=14"
}
},
"node_modules/proc-log": {
"version": "2.0.1",
"resolved": "https://registry.npmmirror.com/proc-log/-/proc-log-2.0.1.tgz",
"integrity": "sha512-Kcmo2FhfDTXdcbfDH76N7uBYHINxc/8GW7UAVuVP9I+Va3uHSerrnKV6dLooga/gh7GlgzuCCr/eoldnL1muGw==",
"dev": true,
"license": "ISC",
"engines": {
"node": "^12.13.0 || ^14.15.0 || >=16.0.0"
}
},
"node_modules/progress": {
"version": "2.0.3",
"resolved": "https://registry.npmmirror.com/progress/-/progress-2.0.3.tgz",
"integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=0.4.0"
}
},
"node_modules/promise-inflight": {
"version": "1.0.1",
"resolved": "https://registry.npmmirror.com/promise-inflight/-/promise-inflight-1.0.1.tgz",
"integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==",
"dev": true,
"license": "ISC"
},
"node_modules/promise-retry": {
"version": "2.0.1",
"resolved": "https://registry.npmmirror.com/promise-retry/-/promise-retry-2.0.1.tgz",
"integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==",
"dev": true,
"license": "MIT",
"dependencies": {
"err-code": "^2.0.2",
"retry": "^0.12.0"
},
"engines": {
"node": ">=10"
}
},
"node_modules/pump": {
"version": "3.0.3",
"resolved": "https://registry.npmmirror.com/pump/-/pump-3.0.3.tgz",
"integrity": "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==",
"dev": true,
"license": "MIT",
"dependencies": {
"end-of-stream": "^1.1.0",
"once": "^1.3.1"
}
},
"node_modules/punycode": {
"version": "2.3.1",
"resolved": "https://registry.npmmirror.com/punycode/-/punycode-2.3.1.tgz",
"integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=6"
}
},
"node_modules/quick-lru": {
"version": "5.1.1",
"resolved": "https://registry.npmmirror.com/quick-lru/-/quick-lru-5.1.1.tgz",
"integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/range-parser": {
"version": "1.2.1",
"resolved": "https://registry.npmmirror.com/range-parser/-/range-parser-1.2.1.tgz",
"integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
"license": "MIT",
"engines": {
"node": ">= 0.6"
}
},
"node_modules/read-binary-file-arch": {
"version": "1.0.6",
"resolved": "https://registry.npmmirror.com/read-binary-file-arch/-/read-binary-file-arch-1.0.6.tgz",
"integrity": "sha512-BNg9EN3DD3GsDXX7Aa8O4p92sryjkmzYYgmgTAc6CA4uGLEDzFfxOxugu21akOxpcXHiEgsYkC6nPsQvLLLmEg==",
"dev": true,
"license": "MIT",
"dependencies": {
"debug": "^4.3.4"
},
"bin": {
"read-binary-file-arch": "cli.js"
}
},
"node_modules/readable-stream": {
"version": "3.6.2",
"resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-3.6.2.tgz",
"integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
"dev": true,
"license": "MIT",
"dependencies": {
"inherits": "^2.0.3",
"string_decoder": "^1.1.1",
"util-deprecate": "^1.0.1"
},
"engines": {
"node": ">= 6"
}
},
"node_modules/reka-ui": {
"version": "2.6.1",
"resolved": "https://registry.npmmirror.com/reka-ui/-/reka-ui-2.6.1.tgz",
"integrity": "sha512-XK7cJDQoNuGXfCNzBBo/81Yg/OgjPwvbabnlzXG2VsdSgNsT6iIkuPBPr+C0Shs+3bb0x0lbPvgQAhMSCKm5Ww==",
"license": "MIT",
"dependencies": {
"@floating-ui/dom": "^1.6.13",
"@floating-ui/vue": "^1.1.6",
"@internationalized/date": "^3.5.0",
"@internationalized/number": "^3.5.0",
"@tanstack/vue-virtual": "^3.12.0",
"@vueuse/core": "^12.5.0",
"@vueuse/shared": "^12.5.0",
"aria-hidden": "^1.2.4",
"defu": "^6.1.4",
"ohash": "^2.0.11"
},
"peerDependencies": {
"vue": ">= 3.2.0"
}
},
"node_modules/reka-ui/node_modules/@vueuse/core": {
"version": "12.8.2",
"resolved": "https://registry.npmmirror.com/@vueuse/core/-/core-12.8.2.tgz",
"integrity": "sha512-HbvCmZdzAu3VGi/pWYm5Ut+Kd9mn1ZHnn4L5G8kOQTPs/IwIAmJoBrmYk2ckLArgMXZj0AW3n5CAejLUO+PhdQ==",
"license": "MIT",
"dependencies": {
"@types/web-bluetooth": "^0.0.21",
"@vueuse/metadata": "12.8.2",
"@vueuse/shared": "12.8.2",
"vue": "^3.5.13"
},
"funding": {
"url": "https://github.com/sponsors/antfu"
}
},
"node_modules/reka-ui/node_modules/@vueuse/metadata": {
"version": "12.8.2",
"resolved": "https://registry.npmmirror.com/@vueuse/metadata/-/metadata-12.8.2.tgz",
"integrity": "sha512-rAyLGEuoBJ/Il5AmFHiziCPdQzRt88VxR+Y/A/QhJ1EWtWqPBBAxTAFaSkviwEuOEZNtW8pvkPgoCZQ+HxqW1A==",
"license": "MIT",
"funding": {
"url": "https://github.com/sponsors/antfu"
}
},
"node_modules/reka-ui/node_modules/@vueuse/shared": {
"version": "12.8.2",
"resolved": "https://registry.npmmirror.com/@vueuse/shared/-/shared-12.8.2.tgz",
"integrity": "sha512-dznP38YzxZoNloI0qpEfpkms8knDtaoQ6Y/sfS0L7Yki4zh40LFHEhur0odJC6xTHG5dxWVPiUWBXn+wCG2s5w==",
"license": "MIT",
"dependencies": {
"vue": "^3.5.13"
},
"funding": {
"url": "https://github.com/sponsors/antfu"
}
},
"node_modules/require-directory": {
"version": "2.1.1",
"resolved": "https://registry.npmmirror.com/require-directory/-/require-directory-2.1.1.tgz",
"integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/resedit": {
"version": "1.7.2",
"resolved": "https://registry.npmmirror.com/resedit/-/resedit-1.7.2.tgz",
"integrity": "sha512-vHjcY2MlAITJhC0eRD/Vv8Vlgmu9Sd3LX9zZvtGzU5ZImdTN3+d6e/4mnTyV8vEbyf1sgNIrWxhWlrys52OkEA==",
"dev": true,
"license": "MIT",
"dependencies": {
"pe-library": "^0.4.1"
},
"engines": {
"node": ">=12",
"npm": ">=6"
},
"funding": {
"type": "github",
"url": "https://github.com/sponsors/jet2jet"
}
},
"node_modules/resolve-alpn": {
"version": "1.2.1",
"resolved": "https://registry.npmmirror.com/resolve-alpn/-/resolve-alpn-1.2.1.tgz",
"integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==",
"dev": true,
"license": "MIT"
},
"node_modules/responselike": {
"version": "2.0.1",
"resolved": "https://registry.npmmirror.com/responselike/-/responselike-2.0.1.tgz",
"integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==",
"dev": true,
"license": "MIT",
"dependencies": {
"lowercase-keys": "^2.0.0"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/restore-cursor": {
"version": "3.1.0",
"resolved": "https://registry.npmmirror.com/restore-cursor/-/restore-cursor-3.1.0.tgz",
"integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==",
"dev": true,
"license": "MIT",
"dependencies": {
"onetime": "^5.1.0",
"signal-exit": "^3.0.2"
},
"engines": {
"node": ">=8"
}
},
"node_modules/retry": {
"version": "0.12.0",
"resolved": "https://registry.npmmirror.com/retry/-/retry-0.12.0.tgz",
"integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 4"
}
},
"node_modules/rfdc": {
"version": "1.4.1",
"resolved": "https://registry.npmmirror.com/rfdc/-/rfdc-1.4.1.tgz",
"integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==",
"license": "MIT"
},
"node_modules/rimraf": {
"version": "3.0.2",
"resolved": "https://registry.npmmirror.com/rimraf/-/rimraf-3.0.2.tgz",
"integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
"deprecated": "Rimraf versions prior to v4 are no longer supported",
"dev": true,
"license": "ISC",
"dependencies": {
"glob": "^7.1.3"
},
"bin": {
"rimraf": "bin.js"
},
"funding": {
"url": "https://github.com/sponsors/isaacs"
}
},
"node_modules/roarr": {
"version": "2.15.4",
"resolved": "https://registry.npmmirror.com/roarr/-/roarr-2.15.4.tgz",
"integrity": "sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==",
"dev": true,
"license": "BSD-3-Clause",
"optional": true,
"dependencies": {
"boolean": "^3.0.1",
"detect-node": "^2.0.4",
"globalthis": "^1.0.1",
"json-stringify-safe": "^5.0.1",
"semver-compare": "^1.0.0",
"sprintf-js": "^1.1.2"
},
"engines": {
"node": ">=8.0"
}
},
"node_modules/rolldown": {
"version": "1.0.0-beta.50",
"resolved": "https://registry.npmmirror.com/rolldown/-/rolldown-1.0.0-beta.50.tgz",
"integrity": "sha512-JFULvCNl/anKn99eKjOSEubi0lLmNqQDAjyEMME2T4CwezUDL0i6t1O9xZsu2OMehPnV2caNefWpGF+8TnzB6A==",
"license": "MIT",
"dependencies": {
"@oxc-project/types": "=0.97.0",
"@rolldown/pluginutils": "1.0.0-beta.50"
},
"bin": {
"rolldown": "bin/cli.mjs"
},
"engines": {
"node": "^20.19.0 || >=22.12.0"
},
"optionalDependencies": {
"@rolldown/binding-android-arm64": "1.0.0-beta.50",
"@rolldown/binding-darwin-arm64": "1.0.0-beta.50",
"@rolldown/binding-darwin-x64": "1.0.0-beta.50",
"@rolldown/binding-freebsd-x64": "1.0.0-beta.50",
"@rolldown/binding-linux-arm-gnueabihf": "1.0.0-beta.50",
"@rolldown/binding-linux-arm64-gnu": "1.0.0-beta.50",
"@rolldown/binding-linux-arm64-musl": "1.0.0-beta.50",
"@rolldown/binding-linux-x64-gnu": "1.0.0-beta.50",
"@rolldown/binding-linux-x64-musl": "1.0.0-beta.50",
"@rolldown/binding-openharmony-arm64": "1.0.0-beta.50",
"@rolldown/binding-wasm32-wasi": "1.0.0-beta.50",
"@rolldown/binding-win32-arm64-msvc": "1.0.0-beta.50",
"@rolldown/binding-win32-ia32-msvc": "1.0.0-beta.50",
"@rolldown/binding-win32-x64-msvc": "1.0.0-beta.50"
}
},
"node_modules/rolldown/node_modules/@rolldown/pluginutils": {
"version": "1.0.0-beta.50",
"resolved": "https://registry.npmmirror.com/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.50.tgz",
"integrity": "sha512-5e76wQiQVeL1ICOZVUg4LSOVYg9jyhGCin+icYozhsUzM+fHE7kddi1bdiE0jwVqTfkjba3jUFbEkoC9WkdvyA==",
"license": "MIT"
},
"node_modules/safe-buffer": {
"version": "5.2.1",
"resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz",
"integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
"dev": true,
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/feross"
},
{
"type": "patreon",
"url": "https://www.patreon.com/feross"
},
{
"type": "consulting",
"url": "https://feross.org/support"
}
],
"license": "MIT"
},
"node_modules/safer-buffer": {
"version": "2.1.2",
"resolved": "https://registry.npmmirror.com/safer-buffer/-/safer-buffer-2.1.2.tgz",
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
"dev": true,
"license": "MIT"
},
"node_modules/sanitize-filename": {
"version": "1.6.3",
"resolved": "https://registry.npmmirror.com/sanitize-filename/-/sanitize-filename-1.6.3.tgz",
"integrity": "sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==",
"dev": true,
"license": "WTFPL OR ISC",
"dependencies": {
"truncate-utf8-bytes": "^1.0.0"
}
},
"node_modules/sax": {
"version": "1.4.3",
"resolved": "https://registry.npmmirror.com/sax/-/sax-1.4.3.tgz",
"integrity": "sha512-yqYn1JhPczigF94DMS+shiDMjDowYO6y9+wB/4WgO0Y19jWYk0lQ4tuG5KI7kj4FTp1wxPj5IFfcrz/s1c3jjQ==",
"dev": true,
"license": "BlueOak-1.0.0"
},
"node_modules/semver": {
"version": "6.3.1",
"resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz",
"integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
"dev": true,
"license": "ISC",
"bin": {
"semver": "bin/semver.js"
}
},
"node_modules/semver-compare": {
"version": "1.0.0",
"resolved": "https://registry.npmmirror.com/semver-compare/-/semver-compare-1.0.0.tgz",
"integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==",
"dev": true,
"license": "MIT",
"optional": true
},
"node_modules/send": {
"version": "1.2.0",
"resolved": "https://registry.npmmirror.com/send/-/send-1.2.0.tgz",
"integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==",
"license": "MIT",
"dependencies": {
"debug": "^4.3.5",
"encodeurl": "^2.0.0",
"escape-html": "^1.0.3",
"etag": "^1.8.1",
"fresh": "^2.0.0",
"http-errors": "^2.0.0",
"mime-types": "^3.0.1",
"ms": "^2.1.3",
"on-finished": "^2.4.1",
"range-parser": "^1.2.1",
"statuses": "^2.0.1"
},
"engines": {
"node": ">= 18"
}
},
"node_modules/send/node_modules/mime-db": {
"version": "1.54.0",
"resolved": "https://registry.npmmirror.com/mime-db/-/mime-db-1.54.0.tgz",
"integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==",
"license": "MIT",
"engines": {
"node": ">= 0.6"
}
},
"node_modules/send/node_modules/mime-types": {
"version": "3.0.2",
"resolved": "https://registry.npmmirror.com/mime-types/-/mime-types-3.0.2.tgz",
"integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==",
"license": "MIT",
"dependencies": {
"mime-db": "^1.54.0"
},
"engines": {
"node": ">=18"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/express"
}
},
"node_modules/serialize-error": {
"version": "7.0.1",
"resolved": "https://registry.npmmirror.com/serialize-error/-/serialize-error-7.0.1.tgz",
"integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==",
"dev": true,
"license": "MIT",
"optional": true,
"dependencies": {
"type-fest": "^0.13.1"
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/serve-static": {
"version": "2.2.0",
"resolved": "https://registry.npmmirror.com/serve-static/-/serve-static-2.2.0.tgz",
"integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==",
"license": "MIT",
"dependencies": {
"encodeurl": "^2.0.0",
"escape-html": "^1.0.3",
"parseurl": "^1.3.3",
"send": "^1.2.0"
},
"engines": {
"node": ">= 18"
}
},
"node_modules/setprototypeof": {
"version": "1.2.0",
"resolved": "https://registry.npmmirror.com/setprototypeof/-/setprototypeof-1.2.0.tgz",
"integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==",
"license": "ISC"
},
"node_modules/shebang-command": {
"version": "2.0.0",
"resolved": "https://registry.npmmirror.com/shebang-command/-/shebang-command-2.0.0.tgz",
"integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
"dev": true,
"license": "MIT",
"dependencies": {
"shebang-regex": "^3.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/shebang-regex": {
"version": "3.0.0",
"resolved": "https://registry.npmmirror.com/shebang-regex/-/shebang-regex-3.0.0.tgz",
"integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/signal-exit": {
"version": "3.0.7",
"resolved": "https://registry.npmmirror.com/signal-exit/-/signal-exit-3.0.7.tgz",
"integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
"dev": true,
"license": "ISC"
},
"node_modules/simple-update-notifier": {
"version": "2.0.0",
"resolved": "https://registry.npmmirror.com/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz",
"integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==",
"dev": true,
"license": "MIT",
"dependencies": {
"semver": "^7.5.3"
},
"engines": {
"node": ">=10"
}
},
"node_modules/simple-update-notifier/node_modules/semver": {
"version": "7.7.3",
"resolved": "https://registry.npmmirror.com/semver/-/semver-7.7.3.tgz",
"integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==",
"dev": true,
"license": "ISC",
"bin": {
"semver": "bin/semver.js"
},
"engines": {
"node": ">=10"
}
},
"node_modules/slice-ansi": {
"version": "3.0.0",
"resolved": "https://registry.npmmirror.com/slice-ansi/-/slice-ansi-3.0.0.tgz",
"integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==",
"dev": true,
"license": "MIT",
"optional": true,
"dependencies": {
"ansi-styles": "^4.0.0",
"astral-regex": "^2.0.0",
"is-fullwidth-code-point": "^3.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/smart-buffer": {
"version": "4.2.0",
"resolved": "https://registry.npmmirror.com/smart-buffer/-/smart-buffer-4.2.0.tgz",
"integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 6.0.0",
"npm": ">= 3.0.0"
}
},
"node_modules/socks": {
"version": "2.8.7",
"resolved": "https://registry.npmmirror.com/socks/-/socks-2.8.7.tgz",
"integrity": "sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==",
"dev": true,
"license": "MIT",
"dependencies": {
"ip-address": "^10.0.1",
"smart-buffer": "^4.2.0"
},
"engines": {
"node": ">= 10.0.0",
"npm": ">= 3.0.0"
}
},
"node_modules/socks-proxy-agent": {
"version": "7.0.0",
"resolved": "https://registry.npmmirror.com/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz",
"integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==",
"dev": true,
"license": "MIT",
"dependencies": {
"agent-base": "^6.0.2",
"debug": "^4.3.3",
"socks": "^2.6.2"
},
"engines": {
"node": ">= 10"
}
},
"node_modules/socks-proxy-agent/node_modules/agent-base": {
"version": "6.0.2",
"resolved": "https://registry.npmmirror.com/agent-base/-/agent-base-6.0.2.tgz",
"integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"debug": "4"
},
"engines": {
"node": ">= 6.0.0"
}
},
"node_modules/source-map": {
"version": "0.6.1",
"resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz",
"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
"dev": true,
"license": "BSD-3-Clause",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/source-map-js": {
"version": "1.2.1",
"resolved": "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.2.1.tgz",
"integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
"license": "BSD-3-Clause",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/source-map-support": {
"version": "0.5.21",
"resolved": "https://registry.npmmirror.com/source-map-support/-/source-map-support-0.5.21.tgz",
"integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
"dev": true,
"license": "MIT",
"dependencies": {
"buffer-from": "^1.0.0",
"source-map": "^0.6.0"
}
},
"node_modules/speakingurl": {
"version": "14.0.1",
"resolved": "https://registry.npmmirror.com/speakingurl/-/speakingurl-14.0.1.tgz",
"integrity": "sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==",
"license": "BSD-3-Clause",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/sprintf-js": {
"version": "1.1.3",
"resolved": "https://registry.npmmirror.com/sprintf-js/-/sprintf-js-1.1.3.tgz",
"integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==",
"dev": true,
"license": "BSD-3-Clause",
"optional": true
},
"node_modules/ssri": {
"version": "9.0.1",
"resolved": "https://registry.npmmirror.com/ssri/-/ssri-9.0.1.tgz",
"integrity": "sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==",
"dev": true,
"license": "ISC",
"dependencies": {
"minipass": "^3.1.1"
},
"engines": {
"node": "^12.13.0 || ^14.15.0 || >=16.0.0"
}
},
"node_modules/stat-mode": {
"version": "1.0.0",
"resolved": "https://registry.npmmirror.com/stat-mode/-/stat-mode-1.0.0.tgz",
"integrity": "sha512-jH9EhtKIjuXZ2cWxmXS8ZP80XyC3iasQxMDV8jzhNJpfDb7VbQLVW4Wvsxz9QZvzV+G4YoSfBUVKDOyxLzi/sg==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 6"
}
},
"node_modules/statuses": {
"version": "2.0.2",
"resolved": "https://registry.npmmirror.com/statuses/-/statuses-2.0.2.tgz",
"integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==",
"license": "MIT",
"engines": {
"node": ">= 0.8"
}
},
"node_modules/string_decoder": {
"version": "1.3.0",
"resolved": "https://registry.npmmirror.com/string_decoder/-/string_decoder-1.3.0.tgz",
"integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
"dev": true,
"license": "MIT",
"dependencies": {
"safe-buffer": "~5.2.0"
}
},
"node_modules/string-width": {
"version": "4.2.3",
"resolved": "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz",
"integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
"dev": true,
"license": "MIT",
"dependencies": {
"emoji-regex": "^8.0.0",
"is-fullwidth-code-point": "^3.0.0",
"strip-ansi": "^6.0.1"
},
"engines": {
"node": ">=8"
}
},
"node_modules/string-width-cjs": {
"name": "string-width",
"version": "4.2.3",
"resolved": "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz",
"integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
"dev": true,
"license": "MIT",
"dependencies": {
"emoji-regex": "^8.0.0",
"is-fullwidth-code-point": "^3.0.0",
"strip-ansi": "^6.0.1"
},
"engines": {
"node": ">=8"
}
},
"node_modules/strip-ansi": {
"version": "6.0.1",
"resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz",
"integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
"dev": true,
"license": "MIT",
"dependencies": {
"ansi-regex": "^5.0.1"
},
"engines": {
"node": ">=8"
}
},
"node_modules/strip-ansi-cjs": {
"name": "strip-ansi",
"version": "6.0.1",
"resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz",
"integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
"dev": true,
"license": "MIT",
"dependencies": {
"ansi-regex": "^5.0.1"
},
"engines": {
"node": ">=8"
}
},
"node_modules/sumchecker": {
"version": "3.0.1",
"resolved": "https://registry.npmmirror.com/sumchecker/-/sumchecker-3.0.1.tgz",
"integrity": "sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
"debug": "^4.1.0"
},
"engines": {
"node": ">= 8.0"
}
},
"node_modules/superjson": {
"version": "2.2.6",
"resolved": "https://registry.npmmirror.com/superjson/-/superjson-2.2.6.tgz",
"integrity": "sha512-H+ue8Zo4vJmV2nRjpx86P35lzwDT3nItnIsocgumgr0hHMQ+ZGq5vrERg9kJBo5AWGmxZDhzDo+WVIJqkB0cGA==",
"license": "MIT",
"dependencies": {
"copy-anything": "^4"
},
"engines": {
"node": ">=16"
}
},
"node_modules/supports-color": {
"version": "7.2.0",
"resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz",
"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
"dev": true,
"license": "MIT",
"dependencies": {
"has-flag": "^4.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/tailwind-merge": {
"version": "3.4.0",
"resolved": "https://registry.npmmirror.com/tailwind-merge/-/tailwind-merge-3.4.0.tgz",
"integrity": "sha512-uSaO4gnW+b3Y2aWoWfFpX62vn2sR3skfhbjsEnaBI81WD1wBLlHZe5sWf0AqjksNdYTbGBEd0UasQMT3SNV15g==",
"license": "MIT",
"funding": {
"type": "github",
"url": "https://github.com/sponsors/dcastil"
}
},
"node_modules/tailwindcss": {
"version": "4.1.18",
"resolved": "https://registry.npmmirror.com/tailwindcss/-/tailwindcss-4.1.18.tgz",
"integrity": "sha512-4+Z+0yiYyEtUVCScyfHCxOYP06L5Ne+JiHhY2IjR2KWMIWhJOYZKLSGZaP5HkZ8+bY0cxfzwDE5uOmzFXyIwxw==",
"license": "MIT"
},
"node_modules/tapable": {
"version": "2.3.0",
"resolved": "https://registry.npmmirror.com/tapable/-/tapable-2.3.0.tgz",
"integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==",
"license": "MIT",
"engines": {
"node": ">=6"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/webpack"
}
},
"node_modules/tar": {
"version": "6.2.1",
"resolved": "https://registry.npmmirror.com/tar/-/tar-6.2.1.tgz",
"integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==",
"dev": true,
"license": "ISC",
"dependencies": {
"chownr": "^2.0.0",
"fs-minipass": "^2.0.0",
"minipass": "^5.0.0",
"minizlib": "^2.1.1",
"mkdirp": "^1.0.3",
"yallist": "^4.0.0"
},
"engines": {
"node": ">=10"
}
},
"node_modules/tar/node_modules/minipass": {
"version": "5.0.0",
"resolved": "https://registry.npmmirror.com/minipass/-/minipass-5.0.0.tgz",
"integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==",
"dev": true,
"license": "ISC",
"engines": {
"node": ">=8"
}
},
"node_modules/tar/node_modules/yallist": {
"version": "4.0.0",
"resolved": "https://registry.npmmirror.com/yallist/-/yallist-4.0.0.tgz",
"integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
"dev": true,
"license": "ISC"
},
"node_modules/temp": {
"version": "0.9.4",
"resolved": "https://registry.npmmirror.com/temp/-/temp-0.9.4.tgz",
"integrity": "sha512-yYrrsWnrXMcdsnu/7YMYAofM1ktpL5By7vZhf15CrXijWWrEYZks5AXBudalfSWJLlnen/QUJUB5aoB0kqZUGA==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"mkdirp": "^0.5.1",
"rimraf": "~2.6.2"
},
"engines": {
"node": ">=6.0.0"
}
},
"node_modules/temp-file": {
"version": "3.4.0",
"resolved": "https://registry.npmmirror.com/temp-file/-/temp-file-3.4.0.tgz",
"integrity": "sha512-C5tjlC/HCtVUOi3KWVokd4vHVViOmGjtLwIh4MuzPo/nMYTV/p1urt3RnMz2IWXDdKEGJH3k5+KPxtqRsUYGtg==",
"dev": true,
"license": "MIT",
"dependencies": {
"async-exit-hook": "^2.0.1",
"fs-extra": "^10.0.0"
}
},
"node_modules/temp-file/node_modules/fs-extra": {
"version": "10.1.0",
"resolved": "https://registry.npmmirror.com/fs-extra/-/fs-extra-10.1.0.tgz",
"integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"graceful-fs": "^4.2.0",
"jsonfile": "^6.0.1",
"universalify": "^2.0.0"
},
"engines": {
"node": ">=12"
}
},
"node_modules/temp-file/node_modules/jsonfile": {
"version": "6.2.0",
"resolved": "https://registry.npmmirror.com/jsonfile/-/jsonfile-6.2.0.tgz",
"integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==",
"dev": true,
"license": "MIT",
"dependencies": {
"universalify": "^2.0.0"
},
"optionalDependencies": {
"graceful-fs": "^4.1.6"
}
},
"node_modules/temp-file/node_modules/universalify": {
"version": "2.0.1",
"resolved": "https://registry.npmmirror.com/universalify/-/universalify-2.0.1.tgz",
"integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 10.0.0"
}
},
"node_modules/temp/node_modules/mkdirp": {
"version": "0.5.6",
"resolved": "https://registry.npmmirror.com/mkdirp/-/mkdirp-0.5.6.tgz",
"integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"minimist": "^1.2.6"
},
"bin": {
"mkdirp": "bin/cmd.js"
}
},
"node_modules/temp/node_modules/rimraf": {
"version": "2.6.3",
"resolved": "https://registry.npmmirror.com/rimraf/-/rimraf-2.6.3.tgz",
"integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==",
"deprecated": "Rimraf versions prior to v4 are no longer supported",
"dev": true,
"license": "ISC",
"peer": true,
"dependencies": {
"glob": "^7.1.3"
},
"bin": {
"rimraf": "bin.js"
}
},
"node_modules/tiny-async-pool": {
"version": "1.3.0",
"resolved": "https://registry.npmmirror.com/tiny-async-pool/-/tiny-async-pool-1.3.0.tgz",
"integrity": "sha512-01EAw5EDrcVrdgyCLgoSPvqznC0sVxDSVeiOz09FUpjh71G79VCqneOr+xvt7T1r76CF6ZZfPjHorN2+d+3mqA==",
"dev": true,
"license": "MIT",
"dependencies": {
"semver": "^5.5.0"
}
},
"node_modules/tiny-async-pool/node_modules/semver": {
"version": "5.7.2",
"resolved": "https://registry.npmmirror.com/semver/-/semver-5.7.2.tgz",
"integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
"dev": true,
"license": "ISC",
"bin": {
"semver": "bin/semver"
}
},
"node_modules/tinyglobby": {
"version": "0.2.15",
"resolved": "https://registry.npmmirror.com/tinyglobby/-/tinyglobby-0.2.15.tgz",
"integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==",
"license": "MIT",
"dependencies": {
"fdir": "^6.5.0",
"picomatch": "^4.0.3"
},
"engines": {
"node": ">=12.0.0"
},
"funding": {
"url": "https://github.com/sponsors/SuperchupuDev"
}
},
"node_modules/tmp": {
"version": "0.2.5",
"resolved": "https://registry.npmmirror.com/tmp/-/tmp-0.2.5.tgz",
"integrity": "sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=14.14"
}
},
"node_modules/tmp-promise": {
"version": "3.0.3",
"resolved": "https://registry.npmmirror.com/tmp-promise/-/tmp-promise-3.0.3.tgz",
"integrity": "sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"tmp": "^0.2.0"
}
},
"node_modules/toidentifier": {
"version": "1.0.1",
"resolved": "https://registry.npmmirror.com/toidentifier/-/toidentifier-1.0.1.tgz",
"integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
"license": "MIT",
"engines": {
"node": ">=0.6"
}
},
"node_modules/truncate-utf8-bytes": {
"version": "1.0.2",
"resolved": "https://registry.npmmirror.com/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz",
"integrity": "sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==",
"dev": true,
"license": "WTFPL",
"dependencies": {
"utf8-byte-length": "^1.0.1"
}
},
"node_modules/tslib": {
"version": "2.8.1",
"resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.8.1.tgz",
"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
"license": "0BSD"
},
"node_modules/tw-animate-css": {
"version": "1.4.0",
"resolved": "https://registry.npmmirror.com/tw-animate-css/-/tw-animate-css-1.4.0.tgz",
"integrity": "sha512-7bziOlRqH0hJx80h/3mbicLW7o8qLsH5+RaLR2t+OHM3D0JlWGODQKQ4cxbK7WlvmUxpcj6Kgu6EKqjrGFe3QQ==",
"dev": true,
"license": "MIT",
"funding": {
"url": "https://github.com/sponsors/Wombosvideo"
}
},
"node_modules/type-fest": {
"version": "0.13.1",
"resolved": "https://registry.npmmirror.com/type-fest/-/type-fest-0.13.1.tgz",
"integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==",
"dev": true,
"license": "(MIT OR CC0-1.0)",
"optional": true,
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/typescript": {
"version": "5.9.3",
"resolved": "https://registry.npmmirror.com/typescript/-/typescript-5.9.3.tgz",
"integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
"devOptional": true,
"license": "Apache-2.0",
"bin": {
"tsc": "bin/tsc",
"tsserver": "bin/tsserver"
},
"engines": {
"node": ">=14.17"
}
},
"node_modules/undici-types": {
"version": "7.16.0",
"resolved": "https://registry.npmmirror.com/undici-types/-/undici-types-7.16.0.tgz",
"integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==",
"devOptional": true,
"license": "MIT"
},
"node_modules/unique-filename": {
"version": "2.0.1",
"resolved": "https://registry.npmmirror.com/unique-filename/-/unique-filename-2.0.1.tgz",
"integrity": "sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==",
"dev": true,
"license": "ISC",
"dependencies": {
"unique-slug": "^3.0.0"
},
"engines": {
"node": "^12.13.0 || ^14.15.0 || >=16.0.0"
}
},
"node_modules/unique-slug": {
"version": "3.0.0",
"resolved": "https://registry.npmmirror.com/unique-slug/-/unique-slug-3.0.0.tgz",
"integrity": "sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==",
"dev": true,
"license": "ISC",
"dependencies": {
"imurmurhash": "^0.1.4"
},
"engines": {
"node": "^12.13.0 || ^14.15.0 || >=16.0.0"
}
},
"node_modules/universalify": {
"version": "0.1.2",
"resolved": "https://registry.npmmirror.com/universalify/-/universalify-0.1.2.tgz",
"integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 4.0.0"
}
},
"node_modules/update-browserslist-db": {
"version": "1.2.2",
"resolved": "https://registry.npmmirror.com/update-browserslist-db/-/update-browserslist-db-1.2.2.tgz",
"integrity": "sha512-E85pfNzMQ9jpKkA7+TJAi4TJN+tBCuWh5rUcS/sv6cFi+1q9LYDwDI5dpUL0u/73EElyQ8d3TEaeW4sPedBqYA==",
"dev": true,
"funding": [
{
"type": "opencollective",
"url": "https://opencollective.com/browserslist"
},
{
"type": "tidelift",
"url": "https://tidelift.com/funding/github/npm/browserslist"
},
{
"type": "github",
"url": "https://github.com/sponsors/ai"
}
],
"license": "MIT",
"dependencies": {
"escalade": "^3.2.0",
"picocolors": "^1.1.1"
},
"bin": {
"update-browserslist-db": "cli.js"
},
"peerDependencies": {
"browserslist": ">= 4.21.0"
}
},
"node_modules/uri-js": {
"version": "4.4.1",
"resolved": "https://registry.npmmirror.com/uri-js/-/uri-js-4.4.1.tgz",
"integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
"dev": true,
"license": "BSD-2-Clause",
"dependencies": {
"punycode": "^2.1.0"
}
},
"node_modules/utf8-byte-length": {
"version": "1.0.5",
"resolved": "https://registry.npmmirror.com/utf8-byte-length/-/utf8-byte-length-1.0.5.tgz",
"integrity": "sha512-Xn0w3MtiQ6zoz2vFyUVruaCL53O/DwUvkEeOvj+uulMm0BkUGYWmBYVyElqZaSLhY6ZD0ulfU3aBra2aVT4xfA==",
"dev": true,
"license": "(WTFPL OR MIT)"
},
"node_modules/util-deprecate": {
"version": "1.0.2",
"resolved": "https://registry.npmmirror.com/util-deprecate/-/util-deprecate-1.0.2.tgz",
"integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
"dev": true,
"license": "MIT"
},
"node_modules/verror": {
"version": "1.10.1",
"resolved": "https://registry.npmmirror.com/verror/-/verror-1.10.1.tgz",
"integrity": "sha512-veufcmxri4e3XSrT0xwfUR7kguIkaxBeosDg00yDWhk49wdwkSUrvvsm7nc75e1PUyvIeZj6nS8VQRYz2/S4Xg==",
"dev": true,
"license": "MIT",
"optional": true,
"dependencies": {
"assert-plus": "^1.0.0",
"core-util-is": "1.0.2",
"extsprintf": "^1.2.0"
},
"engines": {
"node": ">=0.6.0"
}
},
"node_modules/vite": {
"name": "rolldown-vite",
"version": "7.2.5",
"resolved": "https://registry.npmmirror.com/rolldown-vite/-/rolldown-vite-7.2.5.tgz",
"integrity": "sha512-u09tdk/huMiN8xwoiBbig197jKdCamQTtOruSalOzbqGje3jdHiV0njQlAW0YvzoahkirFePNQ4RYlfnRQpXZA==",
"license": "MIT",
"dependencies": {
"@oxc-project/runtime": "0.97.0",
"fdir": "^6.5.0",
"lightningcss": "^1.30.2",
"picomatch": "^4.0.3",
"postcss": "^8.5.6",
"rolldown": "1.0.0-beta.50",
"tinyglobby": "^0.2.15"
},
"bin": {
"vite": "bin/vite.js"
},
"engines": {
"node": "^20.19.0 || >=22.12.0"
},
"funding": {
"url": "https://github.com/vitejs/vite?sponsor=1"
},
"optionalDependencies": {
"fsevents": "~2.3.3"
},
"peerDependencies": {
"@types/node": "^20.19.0 || >=22.12.0",
"esbuild": "^0.25.0",
"jiti": ">=1.21.0",
"less": "^4.0.0",
"sass": "^1.70.0",
"sass-embedded": "^1.70.0",
"stylus": ">=0.54.8",
"sugarss": "^5.0.0",
"terser": "^5.16.0",
"tsx": "^4.8.1",
"yaml": "^2.4.2"
},
"peerDependenciesMeta": {
"@types/node": {
"optional": true
},
"esbuild": {
"optional": true
},
"jiti": {
"optional": true
},
"less": {
"optional": true
},
"sass": {
"optional": true
},
"sass-embedded": {
"optional": true
},
"stylus": {
"optional": true
},
"sugarss": {
"optional": true
},
"terser": {
"optional": true
},
"tsx": {
"optional": true
},
"yaml": {
"optional": true
}
}
},
"node_modules/vite-plugin-electron": {
"version": "0.29.0",
"resolved": "https://registry.npmmirror.com/vite-plugin-electron/-/vite-plugin-electron-0.29.0.tgz",
"integrity": "sha512-HP0DI9Shg41hzt55IKYVnbrChWXHX95QtsEQfM+szQBpWjVhVGMlqRjVco6ebfQjWNr+Ga+PeoBjMIl8zMaufw==",
"dev": true,
"license": "MIT",
"peerDependencies": {
"vite-plugin-electron-renderer": "*"
},
"peerDependenciesMeta": {
"vite-plugin-electron-renderer": {
"optional": true
}
}
},
"node_modules/vite-plugin-electron-renderer": {
"version": "0.14.6",
"resolved": "https://registry.npmmirror.com/vite-plugin-electron-renderer/-/vite-plugin-electron-renderer-0.14.6.tgz",
"integrity": "sha512-oqkWFa7kQIkvHXG7+Mnl1RTroA4sP0yesKatmAy0gjZC4VwUqlvF9IvOpHd1fpLWsqYX/eZlVxlhULNtaQ78Jw==",
"dev": true,
"license": "MIT"
},
"node_modules/vscode-uri": {
"version": "3.1.0",
"resolved": "https://registry.npmmirror.com/vscode-uri/-/vscode-uri-3.1.0.tgz",
"integrity": "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==",
"dev": true,
"license": "MIT"
},
"node_modules/vue": {
"version": "3.5.25",
"resolved": "https://registry.npmmirror.com/vue/-/vue-3.5.25.tgz",
"integrity": "sha512-YLVdgv2K13WJ6n+kD5owehKtEXwdwXuj2TTyJMsO7pSeKw2bfRNZGjhB7YzrpbMYj5b5QsUebHpOqR3R3ziy/g==",
"license": "MIT",
"dependencies": {
"@vue/compiler-dom": "3.5.25",
"@vue/compiler-sfc": "3.5.25",
"@vue/runtime-dom": "3.5.25",
"@vue/server-renderer": "3.5.25",
"@vue/shared": "3.5.25"
},
"peerDependencies": {
"typescript": "*"
},
"peerDependenciesMeta": {
"typescript": {
"optional": true
}
}
},
"node_modules/vue-router": {
"version": "4.6.4",
"resolved": "https://registry.npmmirror.com/vue-router/-/vue-router-4.6.4.tgz",
"integrity": "sha512-Hz9q5sa33Yhduglwz6g9skT8OBPii+4bFn88w6J+J4MfEo4KRRpmiNG/hHHkdbRFlLBOqxN8y8gf2Fb0MTUgVg==",
"license": "MIT",
"dependencies": {
"@vue/devtools-api": "^6.6.4"
},
"funding": {
"url": "https://github.com/sponsors/posva"
},
"peerDependencies": {
"vue": "^3.5.0"
}
},
"node_modules/vue-router/node_modules/@vue/devtools-api": {
"version": "6.6.4",
"resolved": "https://registry.npmmirror.com/@vue/devtools-api/-/devtools-api-6.6.4.tgz",
"integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==",
"license": "MIT"
},
"node_modules/vue-sonner": {
"version": "2.0.9",
"resolved": "https://registry.npmmirror.com/vue-sonner/-/vue-sonner-2.0.9.tgz",
"integrity": "sha512-i6BokNlNDL93fpzNxN/LZSn6D6MzlO+i3qXt6iVZne3x1k7R46d5HlFB4P8tYydhgqOrRbIZEsnRd3kG7qGXyw==",
"license": "MIT",
"peerDependencies": {
"@nuxt/kit": "^4.0.3",
"@nuxt/schema": "^4.0.3",
"nuxt": "^4.0.3"
},
"peerDependenciesMeta": {
"@nuxt/kit": {
"optional": true
},
"@nuxt/schema": {
"optional": true
},
"nuxt": {
"optional": true
}
}
},
"node_modules/vue-tsc": {
"version": "3.1.8",
"resolved": "https://registry.npmmirror.com/vue-tsc/-/vue-tsc-3.1.8.tgz",
"integrity": "sha512-deKgwx6exIHeZwF601P1ktZKNF0bepaSN4jBU3AsbldPx9gylUc1JDxYppl82yxgkAgaz0Y0LCLOi+cXe9HMYA==",
"dev": true,
"license": "MIT",
"dependencies": {
"@volar/typescript": "2.4.26",
"@vue/language-core": "3.1.8"
},
"bin": {
"vue-tsc": "bin/vue-tsc.js"
},
"peerDependencies": {
"typescript": ">=5.0.0"
}
},
"node_modules/wcwidth": {
"version": "1.0.1",
"resolved": "https://registry.npmmirror.com/wcwidth/-/wcwidth-1.0.1.tgz",
"integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==",
"dev": true,
"license": "MIT",
"dependencies": {
"defaults": "^1.0.3"
}
},
"node_modules/which": {
"version": "2.0.2",
"resolved": "https://registry.npmmirror.com/which/-/which-2.0.2.tgz",
"integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
"dev": true,
"license": "ISC",
"dependencies": {
"isexe": "^2.0.0"
},
"bin": {
"node-which": "bin/node-which"
},
"engines": {
"node": ">= 8"
}
},
"node_modules/wrap-ansi": {
"version": "7.0.0",
"resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
"integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
"dev": true,
"license": "MIT",
"dependencies": {
"ansi-styles": "^4.0.0",
"string-width": "^4.1.0",
"strip-ansi": "^6.0.0"
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/chalk/wrap-ansi?sponsor=1"
}
},
"node_modules/wrap-ansi-cjs": {
"name": "wrap-ansi",
"version": "7.0.0",
"resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
"integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
"dev": true,
"license": "MIT",
"dependencies": {
"ansi-styles": "^4.0.0",
"string-width": "^4.1.0",
"strip-ansi": "^6.0.0"
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/chalk/wrap-ansi?sponsor=1"
}
},
"node_modules/wrappy": {
"version": "1.0.2",
"resolved": "https://registry.npmmirror.com/wrappy/-/wrappy-1.0.2.tgz",
"integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
"dev": true,
"license": "ISC"
},
"node_modules/xmlbuilder": {
"version": "15.1.1",
"resolved": "https://registry.npmmirror.com/xmlbuilder/-/xmlbuilder-15.1.1.tgz",
"integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=8.0"
}
},
"node_modules/y18n": {
"version": "5.0.8",
"resolved": "https://registry.npmmirror.com/y18n/-/y18n-5.0.8.tgz",
"integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
"dev": true,
"license": "ISC",
"engines": {
"node": ">=10"
}
},
"node_modules/yallist": {
"version": "3.1.1",
"resolved": "https://registry.npmmirror.com/yallist/-/yallist-3.1.1.tgz",
"integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
"dev": true,
"license": "ISC"
},
"node_modules/yargs": {
"version": "17.7.2",
"resolved": "https://registry.npmmirror.com/yargs/-/yargs-17.7.2.tgz",
"integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==",
"dev": true,
"license": "MIT",
"dependencies": {
"cliui": "^8.0.1",
"escalade": "^3.1.1",
"get-caller-file": "^2.0.5",
"require-directory": "^2.1.1",
"string-width": "^4.2.3",
"y18n": "^5.0.5",
"yargs-parser": "^21.1.1"
},
"engines": {
"node": ">=12"
}
},
"node_modules/yargs-parser": {
"version": "21.1.1",
"resolved": "https://registry.npmmirror.com/yargs-parser/-/yargs-parser-21.1.1.tgz",
"integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
"dev": true,
"license": "ISC",
"engines": {
"node": ">=12"
}
},
"node_modules/yauzl": {
"version": "2.10.0",
"resolved": "https://registry.npmmirror.com/yauzl/-/yauzl-2.10.0.tgz",
"integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==",
"dev": true,
"license": "MIT",
"dependencies": {
"buffer-crc32": "~0.2.3",
"fd-slicer": "~1.1.0"
}
},
"node_modules/yocto-queue": {
"version": "0.1.0",
"resolved": "https://registry.npmmirror.com/yocto-queue/-/yocto-queue-0.1.0.tgz",
"integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
}
}
}

View File

@@ -8,8 +8,8 @@
"email": "1962257451@qq.com" "email": "1962257451@qq.com"
}, },
"private": true, "private": true,
"version": "1.1.0", "version": "1.2.0",
"buildDate": "2025/12/14 13:13:07", "buildDate": "2025/12/15 08:22:52",
"main": "dist-electron/main.js", "main": "dist-electron/main.js",
"type": "module", "type": "module",
"scripts": { "scripts": {
@@ -17,7 +17,7 @@
"build": "vue-tsc -b && vite build && node update-build-date.js", "build": "vue-tsc -b && vite build && node update-build-date.js",
"preview": "vite preview", "preview": "vite preview",
"build:server": "pnpm run build && go build", "build:server": "pnpm run build && go build",
"build:electron": "pnpm run build && electron-builder" "build:electron": "cross-env ELECTRON_BUILD=1 pnpm run build && electron-builder"
}, },
"dependencies": { "dependencies": {
"@tailwindcss/vite": "^4.1.17", "@tailwindcss/vite": "^4.1.17",
@@ -45,6 +45,7 @@
"@types/node": "^24.10.2", "@types/node": "^24.10.2",
"@vitejs/plugin-vue": "^6.0.1", "@vitejs/plugin-vue": "^6.0.1",
"@vue/tsconfig": "^0.8.1", "@vue/tsconfig": "^0.8.1",
"cross-env": "^7.0.3",
"electron": "^39.2.7", "electron": "^39.2.7",
"electron-builder": "^26.0.12", "electron-builder": "^26.0.12",
"electron-vite": "^5.0.0", "electron-vite": "^5.0.0",
@@ -63,6 +64,9 @@
"electron-winstaller", "electron-winstaller",
"esbuild", "esbuild",
"vue-demi" "vue-demi"
],
"ignoredBuiltDependencies": [
"electron"
] ]
}, },
"packageManager": "pnpm@10.13.1+sha512.37ebf1a5c7a30d5fabe0c5df44ee8da4c965ca0c5af3dbab28c3a1681b70a256218d05c81c9c0dcf767ef6b8551eb5b960042b9ed4300c59242336377e01cfad", "packageManager": "pnpm@10.13.1+sha512.37ebf1a5c7a30d5fabe0c5df44ee8da4c965ca0c5af3dbab28c3a1681b70a256218d05c81c9c0dcf767ef6b8551eb5b960042b9ed4300c59242336377e01cfad",
@@ -79,11 +83,17 @@
"artifactName": "${productName}-Setup.${ext}" "artifactName": "${productName}-Setup.${ext}"
}, },
"mac": { "mac": {
"target": ["dmg", "zip"], "target": [
"dmg",
"zip"
],
"artifactName": "${productName}-mac.${ext}" "artifactName": "${productName}-mac.${ext}"
}, },
"linux": { "linux": {
"target": ["AppImage", "deb"], "target": [
"AppImage",
"deb"
],
"artifactName": "${productName}-linux.${ext}" "artifactName": "${productName}-linux.${ext}"
} }
} }

12
pnpm-lock.yaml generated
View File

@@ -81,6 +81,9 @@ importers:
'@vue/tsconfig': '@vue/tsconfig':
specifier: ^0.8.1 specifier: ^0.8.1
version: 0.8.1(typescript@5.9.3)(vue@3.5.25(typescript@5.9.3)) version: 0.8.1(typescript@5.9.3)(vue@3.5.25(typescript@5.9.3))
cross-env:
specifier: ^7.0.3
version: 7.0.3
electron: electron:
specifier: ^39.2.7 specifier: ^39.2.7
version: 39.2.7 version: 39.2.7
@@ -1114,6 +1117,11 @@ packages:
cross-dirname@0.1.0: cross-dirname@0.1.0:
resolution: {integrity: sha512-+R08/oI0nl3vfPcqftZRpytksBXDzOUveBq/NBVx0sUp1axwzPQrKinNx5yd5sxPu8j1wIy8AfnVQ+5eFdha6Q==} resolution: {integrity: sha512-+R08/oI0nl3vfPcqftZRpytksBXDzOUveBq/NBVx0sUp1axwzPQrKinNx5yd5sxPu8j1wIy8AfnVQ+5eFdha6Q==}
cross-env@7.0.3:
resolution: {integrity: sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==}
engines: {node: '>=10.14', npm: '>=6', yarn: '>=1'}
hasBin: true
cross-spawn@7.0.6: cross-spawn@7.0.6:
resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==}
engines: {node: '>= 8'} engines: {node: '>= 8'}
@@ -3548,6 +3556,10 @@ snapshots:
cross-dirname@0.1.0: cross-dirname@0.1.0:
optional: true optional: true
cross-env@7.0.3:
dependencies:
cross-spawn: 7.0.6
cross-spawn@7.0.6: cross-spawn@7.0.6:
dependencies: dependencies:
path-key: 3.1.1 path-key: 3.1.1

View File

@@ -228,7 +228,18 @@
</SidebarInset> </SidebarInset>
<!-- 确认对话框 --> <!-- 确认对话框 -->
<ConfirmDialog ref="confirmDialog" /> <AlertDialog :open="confirmDialogOpen" @update:open="confirmDialogOpen = $event">
<AlertDialogContent>
<AlertDialogHeader>
<AlertDialogTitle>{{ confirmDialogTitle }}</AlertDialogTitle>
<AlertDialogDescription>{{ confirmDialogMessage }}</AlertDialogDescription>
</AlertDialogHeader>
<AlertDialogFooter>
<AlertDialogCancel>{{ t('common.cancel') }}</AlertDialogCancel>
<AlertDialogAction @click="handleConfirmAction">{{ t('common.confirm') }}</AlertDialogAction>
</AlertDialogFooter>
</AlertDialogContent>
</AlertDialog>
<!-- 详情弹窗 --> <!-- 详情弹窗 -->
<DetailDialog /> <DetailDialog />
@@ -242,7 +253,6 @@
import { onMounted, onUnmounted, computed, ref } from 'vue' import { onMounted, onUnmounted, computed, ref } from 'vue'
import { RouterView, RouterLink } from 'vue-router' import { RouterView, RouterLink } from 'vue-router'
import { useGameStore } from '@/stores/gameStore' import { useGameStore } from '@/stores/gameStore'
import { useUniverseStore } from '@/stores/universeStore'
import { useTheme } from '@/composables/useTheme' import { useTheme } from '@/composables/useTheme'
import { useI18n } from '@/composables/useI18n' import { useI18n } from '@/composables/useI18n'
import { localeNames, detectBrowserLocale, type Locale } from '@/locales' import { localeNames, detectBrowserLocale, type Locale } from '@/locales'
@@ -265,11 +275,18 @@
SidebarTrigger SidebarTrigger
} from '@/components/ui/sidebar' } from '@/components/ui/sidebar'
import ResourceIcon from '@/components/ResourceIcon.vue' import ResourceIcon from '@/components/ResourceIcon.vue'
import ConfirmDialog from '@/components/ConfirmDialog.vue'
import DetailDialog from '@/components/DetailDialog.vue' import DetailDialog from '@/components/DetailDialog.vue'
import Sonner from '@/components/ui/sonner/Sonner.vue' import Sonner from '@/components/ui/sonner/Sonner.vue'
import { MissionType } from '@/types/game' import {
import type { BuildQueueItem, FleetMission } from '@/types/game' AlertDialog,
AlertDialogAction,
AlertDialogCancel,
AlertDialogContent,
AlertDialogDescription,
AlertDialogFooter,
AlertDialogHeader,
AlertDialogTitle
} from '@/components/ui/alert-dialog'
import { formatNumber, formatTime, getResourceColor } from '@/utils/format' import { formatNumber, formatTime, getResourceColor } from '@/utils/format'
import { import {
Moon, Moon,
@@ -289,175 +306,52 @@
Wrench, Wrench,
ChevronsLeft ChevronsLeft
} from 'lucide-vue-next' } from 'lucide-vue-next'
import * as gameLogic from '@/logic/gameLogic'
import * as planetLogic from '@/logic/planetLogic'
import * as officerLogic from '@/logic/officerLogic' import * as officerLogic from '@/logic/officerLogic'
import * as buildingValidation from '@/logic/buildingValidation'
import * as resourceLogic from '@/logic/resourceLogic' import * as resourceLogic from '@/logic/resourceLogic'
import * as researchValidation from '@/logic/researchValidation' import { useGameLifecycle } from '@/composables/useGameLifecycle'
import * as fleetLogic from '@/logic/fleetLogic' import { useMissionHandler } from '@/composables/useMissionHandler'
import * as shipLogic from '@/logic/shipLogic' import { useNPCHandler } from '@/composables/useNPCHandler'
import pkg from '../package.json' import { useQueueHandler } from '@/composables/useQueueHandler'
import { useGameUpdate } from '@/composables/useGameUpdate'
import { migrateGameData } from '@/utils/migration' import { migrateGameData } from '@/utils/migration'
import pkg from '../package.json'
// 执行数据迁移(在 store 初始化之前)
migrateGameData() migrateGameData()
const gameStore = useGameStore() const gameStore = useGameStore()
const universeStore = useUniverseStore()
const { isDark } = useTheme() const { isDark } = useTheme()
const { t } = useI18n() const { t } = useI18n()
const confirmDialog = ref<InstanceType<typeof ConfirmDialog> | null>(null) const confirmDialogOpen = ref(false)
const confirmDialogTitle = ref('')
const confirmDialogMessage = ref('')
const confirmDialogAction = ref<(() => void) | null>(null)
// 所有可用的语言选项 // 所有可用的语言选项
const locales: Locale[] = ['zh-CN', 'zh-TW', 'en', 'de', 'ru', 'ko', 'ja'] const locales: Locale[] = ['zh-CN', 'zh-TW', 'en', 'de', 'ru', 'ko', 'ja']
// 侧边栏状态(不持久化,根据屏幕尺寸初始化) // 侧边栏状态(不持久化,根据屏幕尺寸初始化)
// PC端≥1024px默认打开移动端默认关闭
const sidebarOpen = ref(window.innerWidth >= 1024) const sidebarOpen = ref(window.innerWidth >= 1024)
const initGame = async () => { // 初始化 composables
const shouldInit = gameLogic.shouldInitializeGame(gameStore.player.planets) const { initGame } = useGameLifecycle()
if (!shouldInit) {
const now = Date.now()
// 计算离线收益(直接同步计算) const { processMissionArrival, processMissionReturn } = useMissionHandler(t)
const bonuses = officerLogic.calculateActiveBonuses(gameStore.player.officers, now)
gameStore.player.planets.forEach(planet => {
resourceLogic.updatePlanetResources(planet, now, bonuses)
})
generateNPCPlanets() const { processNPCMissionArrival, processNPCMissionReturn, updateNPCGrowth, updateNPCBehavior } = useNPCHandler()
return
}
gameStore.player = gameLogic.initializePlayer(gameStore.player.id, t('common.playerName'))
const initialPlanet = planetLogic.createInitialPlanet(gameStore.player.id, t('planet.homePlanet'))
gameStore.player.planets = [initialPlanet]
gameStore.currentPlanetId = initialPlanet.id
}
const generateNPCPlanets = () => { const { handleCancelBuild, handleCancelResearch, getItemName, getRemainingTime, getQueueProgress } = useQueueHandler(
const npcCount = 200 t,
for (let i = 0; i < npcCount; i++) { confirmDialogOpen,
const position = gameLogic.generateRandomPosition() confirmDialogTitle,
const key = gameLogic.generatePositionKey(position.galaxy, position.system, position.position) confirmDialogMessage,
if (universeStore.planets[key]) continue confirmDialogAction
const npcPlanet = planetLogic.createNPCPlanet(i, position, t('planet.planetPrefix'))
universeStore.planets[key] = npcPlanet
}
}
const updateGame = () => {
if (gameStore.isPaused) return
const now = Date.now()
gameStore.gameTime = now
// 检查军官过期
gameLogic.checkOfficersExpiration(gameStore.player.officers, now)
// 处理游戏更新(建造队列、研究队列等)
const result = gameLogic.processGameUpdate(gameStore.player, now)
gameStore.player.researchQueue = result.updatedResearchQueue
// 处理舰队任务
gameStore.player.fleetMissions.forEach(mission => {
if (mission.status === 'outbound' && now >= mission.arrivalTime) {
processMissionArrival(mission)
} else if (mission.status === 'returning' && mission.returnTime && now >= mission.returnTime) {
processMissionReturn(mission)
}
})
}
const processMissionArrival = async (mission: FleetMission) => {
// 从宇宙星球地图中查找目标星球
const targetKey = gameLogic.generatePositionKey(
mission.targetPosition.galaxy,
mission.targetPosition.system,
mission.targetPosition.position
) )
// 先从玩家星球中查找,再从宇宙地图中查找
const targetPlanet =
gameStore.player.planets.find(
p =>
p.position.galaxy === mission.targetPosition.galaxy &&
p.position.system === mission.targetPosition.system &&
p.position.position === mission.targetPosition.position
) || universeStore.planets[targetKey]
if (mission.missionType === MissionType.Transport) { const { updateGame } = useGameUpdate(
fleetLogic.processTransportArrival(mission, targetPlanet) processMissionArrival,
} else if (mission.missionType === MissionType.Attack) { processMissionReturn,
const attackResult = await fleetLogic.processAttackArrival(mission, targetPlanet, gameStore.player, null, gameStore.player.planets) processNPCMissionArrival,
if (attackResult) { processNPCMissionReturn,
gameStore.player.battleReports.push(attackResult.battleResult) updateNPCGrowth,
if (attackResult.moon) { updateNPCBehavior
gameStore.player.planets.push(attackResult.moon) )
}
if (attackResult.debrisField) {
// 将残骸场添加到游戏状态
universeStore.debrisFields[attackResult.debrisField.id] = attackResult.debrisField
}
}
} else if (mission.missionType === MissionType.Colonize) {
const newPlanet = fleetLogic.processColonizeArrival(mission, targetPlanet, gameStore.player.id, t('planet.colonyPrefix'))
if (newPlanet) {
gameStore.player.planets.push(newPlanet)
}
} else if (mission.missionType === MissionType.Spy) {
const spyReport = fleetLogic.processSpyArrival(mission, targetPlanet, gameStore.player.id)
if (spyReport) gameStore.player.spyReports.push(spyReport)
} else if (mission.missionType === MissionType.Deploy) {
const deployed = fleetLogic.processDeployArrival(mission, targetPlanet, gameStore.player.id)
if (deployed) {
const missionIndex = gameStore.player.fleetMissions.indexOf(mission)
if (missionIndex > -1) gameStore.player.fleetMissions.splice(missionIndex, 1)
return
}
} else if (mission.missionType === MissionType.Recycle) {
// 处理回收任务
const debrisId = `debris_${mission.targetPosition.galaxy}_${mission.targetPosition.system}_${mission.targetPosition.position}`
const debrisField = universeStore.debrisFields[debrisId]
const recycleResult = fleetLogic.processRecycleArrival(mission, debrisField)
if (recycleResult && debrisField) {
if (recycleResult.remainingDebris && (recycleResult.remainingDebris.metal > 0 || recycleResult.remainingDebris.crystal > 0)) {
// 更新残骸场
universeStore.debrisFields[debrisId] = {
id: debrisField.id,
position: debrisField.position,
resources: recycleResult.remainingDebris,
createdAt: debrisField.createdAt,
expiresAt: debrisField.expiresAt
}
} else {
// 残骸场已被完全收集,删除
delete universeStore.debrisFields[debrisId]
}
}
} else if (mission.missionType === MissionType.Destroy) {
// 处理行星毁灭任务
const destroyResult = fleetLogic.processDestroyArrival(mission, targetPlanet, gameStore.player)
if (destroyResult && destroyResult.success && destroyResult.planetId) {
// 星球被摧毁
// 从玩家星球列表中移除(如果是玩家的星球)
const planetIndex = gameStore.player.planets.findIndex(p => p.id === destroyResult.planetId)
if (planetIndex > -1) {
gameStore.player.planets.splice(planetIndex, 1)
} else {
// 不是玩家星球,从宇宙地图中移除
delete universeStore.planets[targetKey]
}
// TODO: 可以添加战斗报告或摧毁报告来通知玩家结果
}
}
}
const processMissionReturn = (mission: FleetMission) => {
const originPlanet = gameStore.player.planets.find(p => p.id === mission.originPlanetId)
if (!originPlanet) return
shipLogic.addFleet(originPlanet.fleet, mission.fleet)
resourceLogic.addResources(originPlanet.resources, mission.cargo)
const missionIndex = gameStore.player.fleetMissions.indexOf(mission)
if (missionIndex > -1) gameStore.player.fleetMissions.splice(missionIndex, 1)
}
// 游戏循环定时器 // 游戏循环定时器
let gameLoop: ReturnType<typeof setInterval> | null = null let gameLoop: ReturnType<typeof setInterval> | null = null
@@ -474,7 +368,7 @@
if (isFirstVisit) { if (isFirstVisit) {
gameStore.locale = detectBrowserLocale() gameStore.locale = detectBrowserLocale()
} }
await initGame() await initGame(t('common.playerName'), t('planet.homePlanet'), t('planet.planetPrefix'))
// 启动游戏循环 // 启动游戏循环
gameLoop = setInterval(() => { gameLoop = setInterval(() => {
updateGame() updateGame()
@@ -561,71 +455,12 @@
sidebarOpen.value = !sidebarOpen.value sidebarOpen.value = !sidebarOpen.value
} }
// 获取队列项的名称 // 处理确认对话框的确认操作
const getItemName = (item: BuildQueueItem): string => { const handleConfirmAction = () => {
if (item.type === 'building' || item.type === 'demolish') { if (confirmDialogAction.value) {
const buildingName = t(`buildings.${item.itemType}`) confirmDialogAction.value()
return item.type === 'demolish' ? `${t('buildingsView.demolish')} - ${buildingName}` : buildingName
} else if (item.type === 'technology') {
return t(`technologies.${item.itemType}`)
} else if (item.type === 'ship') {
return t(`ships.${item.itemType}`)
} else if (item.type === 'defense') {
return t(`defenses.${item.itemType}`)
} }
return item.itemType confirmDialogOpen.value = false
}
// 获取剩余时间
const getRemainingTime = (item: BuildQueueItem): number => {
const now = Date.now()
return Math.max(0, Math.floor((item.endTime - now) / 1000))
}
// 获取队列进度
const getQueueProgress = (item: BuildQueueItem): number => {
const now = Date.now()
const total = item.endTime - item.startTime
const elapsed = now - item.startTime
return Math.min(100, Math.max(0, (elapsed / total) * 100))
}
// 取消建造
const handleCancelBuild = (queueId: string) => {
confirmDialog.value?.show({
title: t('queue.cancelBuild'),
message: t('queue.confirmCancel'),
onConfirm: () => {
if (!gameStore.currentPlanet) return false
const { item, index } = buildingValidation.findQueueItem(gameStore.currentPlanet.buildQueue, queueId)
if (!item) return false
if (item.type === 'building') {
const refund = buildingValidation.cancelBuildingUpgrade(gameStore.currentPlanet, item)
resourceLogic.addResources(gameStore.currentPlanet.resources, refund)
}
gameStore.currentPlanet.buildQueue.splice(index, 1)
return true
}
})
}
// 取消研究
const handleCancelResearch = (queueId: string) => {
confirmDialog.value?.show({
title: t('queue.cancelResearch'),
message: t('queue.confirmCancel'),
onConfirm: () => {
if (!gameStore.currentPlanet) return false
const { item, index } = buildingValidation.findQueueItem(gameStore.player.researchQueue, queueId)
if (!item) return false
if (item.type === 'technology') {
const refund = researchValidation.cancelTechnologyResearch(item)
resourceLogic.addResources(gameStore.currentPlanet.resources, refund)
}
gameStore.player.researchQueue.splice(index, 1)
return true
}
})
} }
</script> </script>

View File

@@ -1,51 +0,0 @@
<template>
<Teleport to="body">
<div v-if="isOpen" class="fixed inset-0 z-50 flex items-center justify-center">
<div class="fixed inset-0 bg-black/50" @click="handleClose" />
<div class="relative bg-card border rounded-lg shadow-lg p-6 max-w-md w-full mx-4 z-10">
<h2 class="text-lg font-semibold mb-2">{{ dialogProps?.title }}</h2>
<p class="text-sm text-muted-foreground mb-6 whitespace-pre-line">{{ dialogProps?.message }}</p>
<div class="flex justify-end gap-2">
<Button v-if="dialogProps?.onConfirm" @click="handleClose" variant="outline">{{ t('common.cancel') }}</Button>
<Button @click="handleConfirm" variant="default">{{ t('common.confirm') }}</Button>
</div>
</div>
</div>
</Teleport>
</template>
<script setup lang="ts">
import { ref } from 'vue'
import { Button } from '@/components/ui/button'
import { useI18n } from '@/composables/useI18n'
const { t } = useI18n()
interface AlertDialogProps {
title: string
message: string
onConfirm?: () => void
}
const isOpen = ref(false)
const dialogProps = ref<AlertDialogProps | null>(null)
const show = (props: AlertDialogProps) => {
dialogProps.value = props
isOpen.value = true
}
const handleConfirm = () => {
if (dialogProps.value?.onConfirm) {
dialogProps.value.onConfirm()
}
isOpen.value = false
}
const handleClose = () => {
isOpen.value = false
}
defineExpose({ show })
</script>

View File

@@ -1,6 +1,7 @@
<template> <template>
<Dialog v-model:open="isOpen"> <Dialog v-model:open="isOpen">
<DialogContent class="max-w-4xl max-h-[90vh] overflow-y-auto"> <ScrollableDialogContent container-class="sm:max-w-4xl max-h-[90vh]">
<template #header>
<DialogHeader> <DialogHeader>
<DialogTitle class="flex items-center gap-2"> <DialogTitle class="flex items-center gap-2">
<Trophy class="h-5 w-5" /> <Trophy class="h-5 w-5" />
@@ -10,6 +11,8 @@
{{ formatDate(report.timestamp) }} {{ formatDate(report.timestamp) }}
</DialogDescription> </DialogDescription>
</DialogHeader> </DialogHeader>
</template>
<div v-if="report" class="space-y-4"> <div v-if="report" class="space-y-4">
<!-- 战斗双方信息 --> <!-- 战斗双方信息 -->
<div class="grid grid-cols-1 md:grid-cols-2 gap-4 text-sm"> <div class="grid grid-cols-1 md:grid-cols-2 gap-4 text-sm">
@@ -260,7 +263,7 @@
</div> </div>
</div> </div>
</div> </div>
</DialogContent> </ScrollableDialogContent>
</Dialog> </Dialog>
</template> </template>
@@ -270,7 +273,7 @@
import { useUniverseStore } from '@/stores/universeStore' import { useUniverseStore } from '@/stores/universeStore'
import { useI18n } from '@/composables/useI18n' import { useI18n } from '@/composables/useI18n'
import { useGameConfig } from '@/composables/useGameConfig' import { useGameConfig } from '@/composables/useGameConfig'
import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle } from '@/components/ui/dialog' import { Dialog, ScrollableDialogContent, DialogDescription, DialogHeader, DialogTitle } from '@/components/ui/dialog'
import { Button } from '@/components/ui/button' import { Button } from '@/components/ui/button'
import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@/components/ui/tooltip' import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@/components/ui/tooltip'
import ResourceIcon from '@/components/ResourceIcon.vue' import ResourceIcon from '@/components/ResourceIcon.vue'

View File

@@ -13,7 +13,19 @@
</div> </div>
<!-- 前置条件详情对话框 --> <!-- 前置条件详情对话框 -->
<AlertDialog ref="requirementsDialog" /> <AlertDialog :open="requirementsDialogOpen" @update:open="requirementsDialogOpen = $event">
<AlertDialogContent>
<AlertDialogHeader>
<AlertDialogTitle>{{ requirementsDialogTitle }}</AlertDialogTitle>
<AlertDialogDescription class="whitespace-pre-line">
{{ requirementsDialogMessage }}
</AlertDialogDescription>
</AlertDialogHeader>
<AlertDialogFooter>
<AlertDialogAction>{{ t('common.confirm') }}</AlertDialogAction>
</AlertDialogFooter>
</AlertDialogContent>
</AlertDialog>
</div> </div>
</template> </template>
@@ -25,7 +37,15 @@
import { BuildingType, TechnologyType } from '@/types/game' import { BuildingType, TechnologyType } from '@/types/game'
import { Lock } from 'lucide-vue-next' import { Lock } from 'lucide-vue-next'
import { Button } from '@/components/ui/button' import { Button } from '@/components/ui/button'
import AlertDialog from '@/components/AlertDialog.vue' import {
AlertDialog,
AlertDialogAction,
AlertDialogContent,
AlertDialogDescription,
AlertDialogFooter,
AlertDialogHeader,
AlertDialogTitle
} from '@/components/ui/alert-dialog'
import * as publicLogic from '@/logic/publicLogic' import * as publicLogic from '@/logic/publicLogic'
interface Props { interface Props {
@@ -37,7 +57,11 @@
const gameStore = useGameStore() const gameStore = useGameStore()
const { t } = useI18n() const { t } = useI18n()
const { BUILDINGS, TECHNOLOGIES } = useGameConfig() const { BUILDINGS, TECHNOLOGIES } = useGameConfig()
const requirementsDialog = ref<InstanceType<typeof AlertDialog> | null>(null)
// AlertDialog 状态
const requirementsDialogOpen = ref(false)
const requirementsDialogTitle = ref('')
const requirementsDialogMessage = ref('')
const isUnlocked = computed(() => { const isUnlocked = computed(() => {
// 如果已经建造过level > 0则认为已解锁不显示遮罩 // 如果已经建造过level > 0则认为已解锁不显示遮罩
@@ -72,9 +96,8 @@
} }
const showRequirements = () => { const showRequirements = () => {
requirementsDialog.value?.show({ requirementsDialogTitle.value = t('common.requirementsNotMet')
title: t('common.requirementsNotMet'), requirementsDialogMessage.value = getRequirementsList()
message: getRequirementsList() requirementsDialogOpen.value = true
})
} }
</script> </script>

View File

@@ -1,51 +0,0 @@
<template>
<Teleport to="body">
<div v-if="isOpen" class="fixed inset-0 z-50 flex items-center justify-center">
<div class="fixed inset-0 bg-black/50" @click="handleCancel" />
<div class="relative bg-card border rounded-lg shadow-lg p-6 max-w-md w-full mx-4 z-10">
<h2 class="text-lg font-semibold mb-2">{{ dialogProps?.title }}</h2>
<p class="text-sm text-muted-foreground mb-6">{{ dialogProps?.message }}</p>
<div class="flex justify-end gap-3">
<Button @click="handleCancel" variant="outline">{{ t('common.cancel') }}</Button>
<Button @click="handleConfirm" variant="default">{{ t('common.confirm') }}</Button>
</div>
</div>
</div>
</Teleport>
</template>
<script setup lang="ts">
import { ref } from 'vue'
import { Button } from '@/components/ui/button'
import { useI18n } from '@/composables/useI18n'
const { t } = useI18n()
interface ConfirmDialogProps {
title: string
message: string
onConfirm: () => void
}
const isOpen = ref(false)
const dialogProps = ref<ConfirmDialogProps | null>(null)
const show = (props: ConfirmDialogProps) => {
dialogProps.value = props
isOpen.value = true
}
const handleConfirm = () => {
if (dialogProps.value) {
dialogProps.value.onConfirm()
}
isOpen.value = false
}
const handleCancel = () => {
isOpen.value = false
}
defineExpose({ show })
</script>

View File

@@ -1,81 +1,61 @@
<template> <template>
<Dialog :open="dialogStore.isOpen" @update:open="handleClose"> <Dialog :open="dialogStore.isOpen" @update:open="handleClose">
<DialogContent class="max-w-[calc(100%-1rem)] sm:max-w-[90vw] md:max-w-3xl lg:max-w-4xl max-h-[90vh] flex flex-col p-0"> <ScrollableDialogContent
<!-- 建筑详情 --> v-if="dialogStore.type && dialogStore.itemType"
<template v-if="dialogStore.type === 'building' && dialogStore.itemType"> container-class="sm:max-w-[90vw] md:max-w-3xl lg:max-w-4xl max-h-[90vh]"
<DialogHeader class="px-6 pt-6 pb-4 shrink-0"> >
<template #header>
<DialogHeader>
<DialogTitle class="flex items-center gap-2"> <DialogTitle class="flex items-center gap-2">
{{ t(`buildings.${dialogStore.itemType}`) }} {{ itemTitle }}
<Badge variant="outline">{{ t('common.currentLevel') }} {{ dialogStore.currentLevel || 0 }}</Badge> <Badge v-if="dialogStore.currentLevel !== undefined" variant="outline">
{{ t('common.currentLevel') }} {{ dialogStore.currentLevel }}
</Badge>
</DialogTitle> </DialogTitle>
<DialogDescription> <DialogDescription>
{{ t(`buildingDescriptions.${dialogStore.itemType}`) }} {{ itemDescription }}
</DialogDescription> </DialogDescription>
</DialogHeader> </DialogHeader>
<div class="overflow-y-auto px-6 pb-6">
<BuildingDetailView :buildingType="dialogStore.itemType as BuildingType" :currentLevel="dialogStore.currentLevel || 0" />
</div>
</template> </template>
<!-- 科技详情 --> <ItemDetailView :type="dialogStore.type" :itemType="dialogStore.itemType" :currentLevel="dialogStore.currentLevel" />
<template v-else-if="dialogStore.type === 'technology' && dialogStore.itemType"> </ScrollableDialogContent>
<DialogHeader class="px-6 pt-6 pb-4 shrink-0">
<DialogTitle class="flex items-center gap-2">
{{ t(`technologies.${dialogStore.itemType}`) }}
<Badge variant="outline">{{ t('common.currentLevel') }} {{ dialogStore.currentLevel || 0 }}</Badge>
</DialogTitle>
<DialogDescription>
{{ t(`technologyDescriptions.${dialogStore.itemType}`) }}
</DialogDescription>
</DialogHeader>
<div class="overflow-y-auto px-6 pb-6">
<TechnologyDetailView :technologyType="dialogStore.itemType as TechnologyType" :currentLevel="dialogStore.currentLevel || 0" />
</div>
</template>
<!-- 舰船详情 -->
<template v-else-if="dialogStore.type === 'ship' && dialogStore.itemType">
<DialogHeader class="px-6 pt-6 pb-4 shrink-0">
<DialogTitle>{{ t(`ships.${dialogStore.itemType}`) }}</DialogTitle>
<DialogDescription>
{{ t(`shipDescriptions.${dialogStore.itemType}`) }}
</DialogDescription>
</DialogHeader>
<div class="overflow-y-auto px-6 pb-6">
<ShipDetailView :shipType="dialogStore.itemType as ShipType" />
</div>
</template>
<!-- 防御详情 -->
<template v-else-if="dialogStore.type === 'defense' && dialogStore.itemType">
<DialogHeader class="px-6 pt-6 pb-4 shrink-0">
<DialogTitle>{{ t(`defenses.${dialogStore.itemType}`) }}</DialogTitle>
<DialogDescription>
{{ t(`defenseDescriptions.${dialogStore.itemType}`) }}
</DialogDescription>
</DialogHeader>
<div class="overflow-y-auto px-6 pb-6">
<DefenseDetailView :defenseType="dialogStore.itemType as DefenseType" />
</div>
</template>
</DialogContent>
</Dialog> </Dialog>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription } from '@/components/ui/dialog' import { computed } from 'vue'
import { Dialog, ScrollableDialogContent, DialogHeader, DialogTitle, DialogDescription } from '@/components/ui/dialog'
import { Badge } from '@/components/ui/badge' import { Badge } from '@/components/ui/badge'
import { useDetailDialogStore } from '@/stores/detailDialogStore' import { useDetailDialogStore } from '@/stores/detailDialogStore'
import { useI18n } from '@/composables/useI18n' import { useI18n } from '@/composables/useI18n'
import type { BuildingType, TechnologyType, ShipType, DefenseType } from '@/types/game' import ItemDetailView from './ItemDetailView.vue'
import BuildingDetailView from './detail-views/BuildingDetailView.vue'
import TechnologyDetailView from './detail-views/TechnologyDetailView.vue'
import ShipDetailView from './detail-views/ShipDetailView.vue'
import DefenseDetailView from './detail-views/DefenseDetailView.vue'
const { t } = useI18n() const { t } = useI18n()
const dialogStore = useDetailDialogStore() const dialogStore = useDetailDialogStore()
const itemTitle = computed(() => {
if (!dialogStore.type || !dialogStore.itemType) return ''
const typeMap = {
building: 'buildings',
technology: 'technologies',
ship: 'ships',
defense: 'defenses'
}
return t(`${typeMap[dialogStore.type]}.${dialogStore.itemType}`)
})
const itemDescription = computed(() => {
if (!dialogStore.type || !dialogStore.itemType) return ''
const typeMap = {
building: 'buildingDescriptions',
technology: 'technologyDescriptions',
ship: 'shipDescriptions',
defense: 'defenseDescriptions'
}
return t(`${typeMap[dialogStore.type]}.${dialogStore.itemType}`)
})
const handleClose = (open: boolean) => { const handleClose = (open: boolean) => {
if (!open) { if (!open) {
dialogStore.close() dialogStore.close()

View File

@@ -0,0 +1,101 @@
<template>
<div v-if="alerts.length > 0" class="bg-destructive/10 border-b border-destructive/20">
<div class="px-4 sm:px-6 py-2 space-y-2">
<div
v-for="alert in alerts"
:key="alert.id"
class="flex items-center justify-between gap-3 bg-destructive/5 rounded-lg px-3 py-2 border border-destructive/20"
>
<!-- 警告图标和信息 -->
<div class="flex items-center gap-2 flex-1 min-w-0">
<AlertTriangle class="h-5 w-5 text-destructive flex-shrink-0 animate-pulse" />
<div class="flex-1 min-w-0">
<p class="text-sm font-semibold text-destructive truncate">
<template v-if="alert.missionType === 'spy'">
{{ t('alerts.npcSpyIncoming') }}
</template>
<template v-else-if="alert.missionType === 'attack'">
{{ t('alerts.npcAttackIncoming') }}
</template>
<template v-else>
{{ t('alerts.npcFleetIncoming') }}
</template>
</p>
<p class="text-xs text-muted-foreground truncate">
{{ alert.npcName }} {{ alert.targetPlanetName }}
<template v-if="alert.missionType === 'attack'">({{ alert.fleetSize }} {{ t('alerts.ships') }})</template>
</p>
</div>
</div>
<!-- 倒计时 -->
<div class="flex items-center gap-2 flex-shrink-0">
<div class="text-right">
<p class="text-xs font-mono text-destructive">
{{ formatTimeRemaining(alert.arrivalTime) }}
</p>
<p class="text-[10px] text-muted-foreground">
{{ formatTime(alert.arrivalTime) }}
</p>
</div>
<Button @click="markAsRead(alert)" variant="ghost" size="sm" class="h-6 w-6 p-0">
<X class="h-3 w-3" />
</Button>
</div>
</div>
</div>
</div>
</template>
<script setup lang="ts">
import { ref, onMounted, onUnmounted } from 'vue'
import type { IncomingFleetAlert } from '@/types/game'
import { Button } from '@/components/ui/button'
import { AlertTriangle, X } from 'lucide-vue-next'
import { useI18n } from '@/composables/useI18n'
const props = defineProps<{
alerts: IncomingFleetAlert[]
}>()
const emit = defineEmits<{
(e: 'markAsRead', alert: IncomingFleetAlert): void
}>()
const { t } = useI18n()
// 强制更新倒计时
const now = ref(Date.now())
let updateInterval: ReturnType<typeof setInterval> | null = null
onMounted(() => {
updateInterval = setInterval(() => {
now.value = Date.now()
}, 1000)
})
onUnmounted(() => {
if (updateInterval) clearInterval(updateInterval)
})
const formatTimeRemaining = (arrivalTime: number): string => {
const remaining = Math.max(0, arrivalTime - now.value)
const seconds = Math.floor((remaining / 1000) % 60)
const minutes = Math.floor((remaining / (1000 * 60)) % 60)
const hours = Math.floor(remaining / (1000 * 60 * 60))
if (hours > 0) {
return `${hours}:${String(minutes).padStart(2, '0')}:${String(seconds).padStart(2, '0')}`
}
return `${minutes}:${String(seconds).padStart(2, '0')}`
}
const formatTime = (timestamp: number): string => {
const date = new Date(timestamp)
return date.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' })
}
const markAsRead = (alert: IncomingFleetAlert) => {
emit('markAsRead', alert)
}
</script>

View File

@@ -0,0 +1,733 @@
<template>
<div class="space-y-4">
<!-- 建筑/科技等级范围表格 -->
<div v-if="type === 'building' || type === 'technology'" class="border rounded-lg overflow-hidden">
<Table>
<TableHeader>
<TableRow>
<TableHead class="w-20 text-center">{{ t(`${typeKey}.levelRange`) }}</TableHead>
<TableHead class="text-center">{{ t('resources.metal') }}</TableHead>
<TableHead class="text-center">{{ t('resources.crystal') }}</TableHead>
<TableHead class="text-center">{{ t('resources.deuterium') }}</TableHead>
<TableHead v-if="showDarkMatterColumn" class="text-center">{{ t('resources.darkMatter') }}</TableHead>
<TableHead class="text-center">{{ type === 'building' ? t('buildings.buildTime') : t('research.researchTime') }}</TableHead>
<!-- 建筑相关列 -->
<TableHead v-if="type === 'building' && showProductionColumn" class="text-center">{{ t('buildings.production') }}</TableHead>
<TableHead v-if="type === 'building' && showConsumptionColumn" class="text-center">{{ t('buildings.consumption') }}</TableHead>
<TableHead v-if="type === 'building' && showCapacityColumn" class="text-center">{{ t('buildings.storageCapacity') }}</TableHead>
<TableHead v-if="type === 'building' && showFleetStorageColumn" class="text-center">{{ t('buildings.fleetStorage') }}</TableHead>
<TableHead v-if="type === 'building' && showBuildQueueColumn" class="text-center">{{ t('buildings.buildQueueBonus') }}</TableHead>
<TableHead v-if="type === 'building' && showSpaceColumn" class="text-center">{{ t('buildings.spaceBonus') }}</TableHead>
<TableHead v-if="type === 'building' && showMissileColumn" class="text-center">{{ t('buildings.missileCapacity') }}</TableHead>
<TableHead v-if="type === 'building' && showBuildSpeedColumn" class="text-center">{{ t('buildings.buildSpeedBonus') }}</TableHead>
<TableHead v-if="type === 'building' && showResearchSpeedColumn" class="text-center">{{ t('buildings.researchSpeedBonus') }}</TableHead>
<!-- 科技相关列 -->
<TableHead v-if="type === 'technology' && showAttackBonusColumn" class="text-center">{{ t('research.attackBonus') }}</TableHead>
<TableHead v-if="type === 'technology' && showShieldBonusColumn" class="text-center">{{ t('research.shieldBonus') }}</TableHead>
<TableHead v-if="type === 'technology' && showArmorBonusColumn" class="text-center">{{ t('research.armorBonus') }}</TableHead>
<TableHead v-if="type === 'technology' && showSpyLevelColumn" class="text-center">{{ t('research.spyLevel') }}</TableHead>
<TableHead v-if="type === 'technology' && showFleetStorageColumn" class="text-center">{{ t('buildings.fleetStorage') }}</TableHead>
<TableHead v-if="type === 'technology' && showResearchQueueColumn" class="text-center">{{ t('research.researchQueueBonus') }}</TableHead>
<TableHead v-if="type === 'technology' && showColonySlotsColumn" class="text-center">{{ t('research.colonySlots') }}</TableHead>
<TableHead v-if="type === 'technology' && showSpaceColumn" class="text-center">{{ t('buildings.spaceBonus') }}</TableHead>
<TableHead v-if="type === 'technology' && showSpeedBonusColumn" class="text-center">{{ t('research.speedBonus') }}</TableHead>
<TableHead v-if="type === 'technology' && showResearchSpeedColumn" class="text-center">{{ t('buildings.researchSpeedBonus') }}</TableHead>
<TableHead class="text-center">{{ t('player.points') }}</TableHead>
</TableRow>
</TableHeader>
<TableBody>
<TableRow v-for="level in levelRange" :key="level" :class="{ 'bg-muted/50': level === safeCurrentLevel }">
<TableCell class="text-center font-medium">
<Badge v-if="level === safeCurrentLevel" variant="default">{{ level }}</Badge>
<span v-else>{{ level }}</span>
</TableCell>
<TableCell class="text-center text-sm">
<NumberWithTooltip :value="getLevelData(level).cost.metal" />
</TableCell>
<TableCell class="text-center text-sm">
<NumberWithTooltip :value="getLevelData(level).cost.crystal" />
</TableCell>
<TableCell class="text-center text-sm">
<NumberWithTooltip :value="getLevelData(level).cost.deuterium" />
</TableCell>
<TableCell v-if="showDarkMatterColumn" class="text-center text-sm">
<NumberWithTooltip :value="getLevelData(level).cost.darkMatter" />
</TableCell>
<TableCell class="text-center text-sm">{{ formatTime(getLevelData(level).time) }}</TableCell>
<!-- 建筑相关数据 -->
<TableCell v-if="type === 'building' && showProductionColumn" class="text-center text-sm">
<span v-if="getLevelData(level).production > 0" class="text-green-600 dark:text-green-400">
+
<NumberWithTooltip :value="getLevelData(level).production" />
/{{ t('resources.perHour') }}
</span>
<span v-else>-</span>
</TableCell>
<TableCell v-if="type === 'building' && showConsumptionColumn" class="text-center text-sm">
<span v-if="getLevelData(level).consumption > 0" class="text-red-600 dark:text-red-400">
-
<NumberWithTooltip :value="getLevelData(level).consumption" />
</span>
<span v-else>-</span>
</TableCell>
<TableCell v-if="type === 'building' && showCapacityColumn" class="text-center text-sm">
<span v-if="getLevelData(level).capacity > 0" class="text-blue-600 dark:text-blue-400">
<NumberWithTooltip :value="getLevelData(level).capacity" />
</span>
<span v-else>-</span>
</TableCell>
<TableCell v-if="type === 'building' && showFleetStorageColumn" class="text-center text-sm">
<span v-if="getLevelData(level).fleetStorage > 0" class="text-blue-600 dark:text-blue-400">
+<NumberWithTooltip :value="getLevelData(level).fleetStorage" />
</span>
<span v-else>-</span>
</TableCell>
<TableCell v-if="type === 'building' && showBuildQueueColumn" class="text-center text-sm">
<span class="text-purple-600 dark:text-purple-400">+1</span>
</TableCell>
<TableCell v-if="type === 'building' && showSpaceColumn" class="text-center text-sm">
<span v-if="getLevelData(level).spaceBonus > 0" class="text-green-600 dark:text-green-400">
+<NumberWithTooltip :value="getLevelData(level).spaceBonus" />
</span>
<span v-else>-</span>
</TableCell>
<TableCell v-if="type === 'building' && showMissileColumn" class="text-center text-sm">
<span class="text-orange-600 dark:text-orange-400">+10</span>
</TableCell>
<TableCell v-if="type === 'building' && showBuildSpeedColumn" class="text-center text-sm">
<span v-if="itemType === 'roboticsFactory'" class="text-cyan-600 dark:text-cyan-400">+{{ getLevelData(level).buildSpeedBonus * 100 }}%</span>
<span v-else-if="itemType === 'naniteFactory'" class="text-cyan-600 dark:text-cyan-400">+{{ getLevelData(level).buildSpeedBonus * 100 }}%</span>
</TableCell>
<TableCell v-if="type === 'building' && showResearchSpeedColumn" class="text-center text-sm">
<span class="text-indigo-600 dark:text-indigo-400">+{{ (getLevelData(level).researchSpeedBonus - 1) * 100 }}%</span>
</TableCell>
<!-- 科技相关数据 -->
<TableCell v-if="type === 'technology' && showAttackBonusColumn" class="text-center text-sm">
<span class="text-red-600 dark:text-red-400">+{{ level * 10 }}%</span>
</TableCell>
<TableCell v-if="type === 'technology' && showShieldBonusColumn" class="text-center text-sm">
<span class="text-blue-600 dark:text-blue-400">+{{ level * 10 }}%</span>
</TableCell>
<TableCell v-if="type === 'technology' && showArmorBonusColumn" class="text-center text-sm">
<span class="text-gray-600 dark:text-gray-400">+{{ level * 10 }}%</span>
</TableCell>
<TableCell v-if="type === 'technology' && showSpyLevelColumn" class="text-center text-sm">
<span class="text-purple-600 dark:text-purple-400">+{{ level }}</span>
</TableCell>
<TableCell v-if="type === 'technology' && showFleetStorageColumn" class="text-center text-sm">
<span class="text-blue-600 dark:text-blue-400">+<NumberWithTooltip :value="level * 500" /></span>
</TableCell>
<TableCell v-if="type === 'technology' && showResearchQueueColumn" class="text-center text-sm">
<span class="text-purple-600 dark:text-purple-400">+1</span>
</TableCell>
<TableCell v-if="type === 'technology' && showColonySlotsColumn" class="text-center text-sm">
<span class="text-green-600 dark:text-green-400">+1</span>
</TableCell>
<TableCell v-if="type === 'technology' && showSpaceColumn" class="text-center text-sm">
<span class="text-green-600 dark:text-green-400">+5 {{ t('research.forAllPlanets') }}</span>
</TableCell>
<TableCell v-if="type === 'technology' && showSpeedBonusColumn" class="text-center text-sm">
<span class="text-yellow-600 dark:text-yellow-400">+{{ level * 10 }}%</span>
</TableCell>
<TableCell v-if="type === 'technology' && showResearchSpeedColumn" class="text-center text-sm">
<span class="text-indigo-600 dark:text-indigo-400">+{{ getLevelData(level).researchSpeedBonus * 100 }}%</span>
</TableCell>
<TableCell class="text-center text-sm">
<span class="text-primary font-medium">
+
<NumberWithTooltip :value="getLevelData(level).points" />
</span>
</TableCell>
</TableRow>
</TableBody>
</Table>
</div>
<!-- 建筑/科技累积统计 -->
<div v-if="type === 'building' || type === 'technology'" class="grid grid-cols-2 gap-4">
<Card>
<CardHeader class="pb-3">
<CardTitle class="text-sm">{{ t(`${typeKey}.totalCost`) }}</CardTitle>
</CardHeader>
<CardContent class="space-y-2">
<div class="flex items-center justify-between text-sm">
<span class="text-muted-foreground">{{ t('resources.metal') }}:</span>
<span class="font-medium"><NumberWithTooltip :value="totalStats.metal" /></span>
</div>
<div class="flex items-center justify-between text-sm">
<span class="text-muted-foreground">{{ t('resources.crystal') }}:</span>
<span class="font-medium"><NumberWithTooltip :value="totalStats.crystal" /></span>
</div>
<div class="flex items-center justify-between text-sm">
<span class="text-muted-foreground">{{ t('resources.deuterium') }}:</span>
<span class="font-medium"><NumberWithTooltip :value="totalStats.deuterium" /></span>
</div>
</CardContent>
</Card>
<Card>
<CardHeader class="pb-3">
<CardTitle class="text-sm">{{ t(`${typeKey}.totalPoints`) }}</CardTitle>
</CardHeader>
<CardContent>
<div class="text-3xl font-bold text-primary">
<NumberWithTooltip :value="totalStats.points" />
</div>
<p class="text-xs text-muted-foreground mt-1">
{{ t(`${typeKey}.levelRange`) }}: {{ Math.max(0, safeCurrentLevel - 10) }} - {{ safeCurrentLevel + 10 }}
</p>
</CardContent>
</Card>
</div>
<!-- 舰船/防御基础属性 -->
<div v-if="type === 'ship' || type === 'defense'" class="grid grid-cols-2 md:grid-cols-3 gap-4">
<Card>
<CardHeader class="pb-3">
<CardTitle class="text-sm flex items-center gap-2">
<Sword class="h-4 w-4" />
{{ t(`${typeKey}.attack`) }}
</CardTitle>
</CardHeader>
<CardContent>
<div class="text-2xl font-bold">
<NumberWithTooltip :value="combatUnitConfig?.attack || 0" />
</div>
</CardContent>
</Card>
<Card>
<CardHeader class="pb-3">
<CardTitle class="text-sm flex items-center gap-2">
<Shield class="h-4 w-4" />
{{ t(`${typeKey}.shield`) }}
</CardTitle>
</CardHeader>
<CardContent>
<div class="text-2xl font-bold">
<NumberWithTooltip :value="combatUnitConfig?.shield || 0" />
</div>
</CardContent>
</Card>
<Card>
<CardHeader class="pb-3">
<CardTitle class="text-sm flex items-center gap-2">
<ShieldCheck class="h-4 w-4" />
{{ t(`${typeKey}.armor`) }}
</CardTitle>
</CardHeader>
<CardContent>
<div class="text-2xl font-bold">
<NumberWithTooltip :value="combatUnitConfig?.armor || 0" />
</div>
</CardContent>
</Card>
<!-- 仅舰船显示 -->
<Card v-if="type === 'ship'">
<CardHeader class="pb-3">
<CardTitle class="text-sm flex items-center gap-2">
<Zap class="h-4 w-4" />
{{ t('shipyard.speed') }}
</CardTitle>
</CardHeader>
<CardContent>
<div class="text-2xl font-bold">
<NumberWithTooltip :value="shipConfig?.speed || 0" />
</div>
</CardContent>
</Card>
<Card v-if="type === 'ship'">
<CardHeader class="pb-3">
<CardTitle class="text-sm flex items-center gap-2">
<Package class="h-4 w-4" />
{{ t('shipyard.cargoCapacity') }}
</CardTitle>
</CardHeader>
<CardContent>
<div class="text-2xl font-bold">
<NumberWithTooltip :value="shipConfig?.cargoCapacity || 0" />
</div>
</CardContent>
</Card>
<Card v-if="type === 'ship'">
<CardHeader class="pb-3">
<CardTitle class="text-sm flex items-center gap-2">
<Fuel class="h-4 w-4" />
{{ t('shipyard.fuelConsumption') }}
</CardTitle>
</CardHeader>
<CardContent>
<div class="text-2xl font-bold">
<NumberWithTooltip :value="shipConfig?.fuelConsumption || 0" />
</div>
</CardContent>
</Card>
</div>
<!-- 舰船/防御建造成本和时间 -->
<div v-if="type === 'ship' || type === 'defense'" class="grid grid-cols-1 md:grid-cols-2 gap-4">
<Card>
<CardHeader>
<CardTitle class="text-sm">{{ t(`${typeKey}.buildCost`) }}</CardTitle>
</CardHeader>
<CardContent class="space-y-2">
<div v-for="resourceType in costResourceTypes" :key="resourceType.key" v-show="unitCost[resourceType.key] > 0" class="flex items-center justify-between text-sm">
<span class="text-muted-foreground">{{ t(`resources.${resourceType.key}`) }}:</span>
<span class="font-medium"><NumberWithTooltip :value="unitCost[resourceType.key]" /></span>
</div>
<div class="flex items-center justify-between text-sm pt-2 border-t">
<span class="text-muted-foreground">{{ t('player.points') }}:</span>
<span class="font-bold text-primary"><NumberWithTooltip :value="pointsPerUnit" /></span>
</div>
</CardContent>
</Card>
<Card>
<CardHeader>
<CardTitle class="text-sm">{{ t(`${typeKey}.buildTime`) }}</CardTitle>
</CardHeader>
<CardContent>
<div class="text-3xl font-bold">{{ formatTime(unitBuildTime) }}</div>
<p class="text-xs text-muted-foreground mt-2">{{ t(`${typeKey}.perUnit`) }}</p>
</CardContent>
</Card>
</div>
<!-- 舰船/防御批量建造计算器 -->
<Card v-if="type === 'ship' || type === 'defense'">
<CardHeader>
<CardTitle class="text-sm">{{ t(`${typeKey}.batchCalculator`) }}</CardTitle>
</CardHeader>
<CardContent class="space-y-4">
<div class="flex items-center gap-4">
<Label class="w-20">{{ t(`${typeKey}.quantity`) }}:</Label>
<Input v-model.number="quantity" type="number" min="1" class="flex-1" />
</div>
<div class="grid grid-cols-2 gap-4 pt-4 border-t">
<div class="space-y-2">
<p class="text-sm text-muted-foreground">{{ t(`${typeKey}.totalCost`) }}:</p>
<div class="space-y-1 text-sm">
<div v-for="resourceType in costResourceTypes" :key="resourceType.key" class="flex justify-between">
<span>{{ t(`resources.${resourceType.key}`) }}:</span>
<span class="font-medium"><NumberWithTooltip :value="batchCost[resourceType.key]" /></span>
</div>
</div>
</div>
<div class="space-y-2">
<p class="text-sm text-muted-foreground">{{ t(`${typeKey}.totalTime`) }}:</p>
<div class="text-xl font-bold">{{ formatTime(unitBuildTime * quantity) }}</div>
<p class="text-xs text-muted-foreground">
{{ t('player.points') }}: +
<NumberWithTooltip :value="batchPoints" />
</p>
</div>
</div>
</CardContent>
</Card>
</div>
</template>
<script setup lang="ts">
import { ref, computed } from 'vue'
import { useI18n } from '@/composables/useI18n'
import { useGameStore } from '@/stores/gameStore'
import type { BuildingType, TechnologyType, ShipType, DefenseType } from '@/types/game'
import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '@/components/ui/table'
import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'
import { Badge } from '@/components/ui/badge'
import { Input } from '@/components/ui/input'
import { Label } from '@/components/ui/label'
import NumberWithTooltip from '@/components/NumberWithTooltip.vue'
import { Sword, Shield, ShieldCheck, Zap, Package, Fuel } from 'lucide-vue-next'
import * as buildingLogic from '@/logic/buildingLogic'
import * as researchLogic from '@/logic/researchLogic'
import * as pointsLogic from '@/logic/pointsLogic'
import * as officerLogic from '@/logic/officerLogic'
import * as shipLogic from '@/logic/shipLogic'
import { SHIPS, DEFENSES } from '@/config/gameConfig'
import { formatTime } from '@/utils/format'
const { t } = useI18n()
const gameStore = useGameStore()
const props = defineProps<{
type: 'building' | 'technology' | 'ship' | 'defense'
itemType: BuildingType | TechnologyType | ShipType | DefenseType
currentLevel?: number
}>()
const quantity = ref(1)
// 资源类型配置(用于成本显示)
const costResourceTypes = [{ key: 'metal' as const }, { key: 'crystal' as const }, { key: 'deuterium' as const }]
// 获取当前星球
const currentPlanet = computed(() => gameStore.currentPlanet)
// 计算当前加成
const activeBonuses = computed(() => {
return officerLogic.calculateActiveBonuses(gameStore.player.officers, gameStore.gameTime)
})
// 获取工厂等级(用于建造时间计算)
const roboticsFactoryLevel = computed(() => {
if (!currentPlanet.value) return 0
return currentPlanet.value.buildings['roboticsFactory'] || 0
})
const naniteFactoryLevel = computed(() => {
if (!currentPlanet.value) return 0
return currentPlanet.value.buildings['naniteFactory'] || 0
})
// 获取研究所等级(用于研究时间计算)
const researchLabLevel = computed(() => {
if (!currentPlanet.value) return 0
return currentPlanet.value.buildings['researchLab'] || 0
})
// 翻译键(转换为复数形式)
const typeKey = computed(() => {
const typeMap = {
building: 'buildings',
technology: 'research',
ship: 'shipyard',
defense: 'defense'
} as const
return typeMap[props.type]
})
// 控制建筑列显示
const showDarkMatterColumn = computed(() => {
if (props.type === 'building') {
const buildingType = props.itemType as BuildingType
return buildingType === 'darkMatterCollector'
} else if (props.type === 'technology') {
const techType = props.itemType as TechnologyType
return techType === 'gravitonTechnology'
}
return false
})
const showProductionColumn = computed(() => {
if (props.type !== 'building') return false
const buildingType = props.itemType as BuildingType
return ['metalMine', 'crystalMine', 'deuteriumSynthesizer', 'solarPlant', 'fusionReactor', 'darkMatterCollector'].includes(buildingType)
})
const showConsumptionColumn = computed(() => {
if (props.type !== 'building') return false
const buildingType = props.itemType as BuildingType
return ['metalMine', 'crystalMine', 'deuteriumSynthesizer'].includes(buildingType)
})
const showCapacityColumn = computed(() => {
if (props.type !== 'building') return false
const buildingType = props.itemType as BuildingType
return ['metalStorage', 'crystalStorage', 'deuteriumTank', 'darkMatterCollector', 'darkMatterTank'].includes(buildingType)
})
const showFleetStorageColumn = computed(() => {
if (props.type === 'building') {
const buildingType = props.itemType as BuildingType
return buildingType === 'shipyard'
} else if (props.type === 'technology') {
const techType = props.itemType as TechnologyType
return techType === 'computerTechnology'
}
return false
})
const showBuildQueueColumn = computed(() => {
if (props.type !== 'building') return false
const buildingType = props.itemType as BuildingType
return buildingType === 'naniteFactory'
})
const showSpaceColumn = computed(() => {
if (props.type === 'building') {
const buildingType = props.itemType as BuildingType
return ['terraformer', 'lunarBase'].includes(buildingType)
} else if (props.type === 'technology') {
const techType = props.itemType as TechnologyType
return techType === 'terraformingTechnology'
}
return false
})
const showMissileColumn = computed(() => {
if (props.type !== 'building') return false
const buildingType = props.itemType as BuildingType
return buildingType === 'missileSilo'
})
const showBuildSpeedColumn = computed(() => {
if (props.type !== 'building') return false
const buildingType = props.itemType as BuildingType
return ['roboticsFactory', 'naniteFactory'].includes(buildingType)
})
const showResearchSpeedColumn = computed(() => {
if (props.type === 'building') {
const buildingType = props.itemType as BuildingType
return buildingType === 'researchLab'
} else if (props.type === 'technology') {
const techType = props.itemType as TechnologyType
return techType === 'energyTechnology'
}
return false
})
// 控制科技列显示
const showAttackBonusColumn = computed(() => {
if (props.type !== 'technology') return false
const techType = props.itemType as TechnologyType
return techType === 'weaponsTechnology'
})
const showShieldBonusColumn = computed(() => {
if (props.type !== 'technology') return false
const techType = props.itemType as TechnologyType
return techType === 'shieldingTechnology'
})
const showArmorBonusColumn = computed(() => {
if (props.type !== 'technology') return false
const techType = props.itemType as TechnologyType
return techType === 'armourTechnology'
})
const showSpyLevelColumn = computed(() => {
if (props.type !== 'technology') return false
const techType = props.itemType as TechnologyType
return techType === 'espionageTechnology'
})
const showResearchQueueColumn = computed(() => {
if (props.type !== 'technology') return false
const techType = props.itemType as TechnologyType
return techType === 'computerTechnology'
})
const showColonySlotsColumn = computed(() => {
if (props.type !== 'technology') return false
const techType = props.itemType as TechnologyType
return techType === 'astrophysics'
})
const showSpeedBonusColumn = computed(() => {
if (props.type !== 'technology') return false
const techType = props.itemType as TechnologyType
return ['combustionDrive', 'impulseDrive', 'hyperspaceDrive'].includes(techType)
})
// 安全的当前等级防止undefined
const safeCurrentLevel = computed(() => props.currentLevel ?? 0)
// 类型安全:战斗单位配置(舰船/防御)
const combatUnitConfig = computed(() => {
if (props.type === 'ship') return SHIPS[props.itemType as ShipType]
if (props.type === 'defense') return DEFENSES[props.itemType as DefenseType]
return null
})
// 类型安全:舰船配置
const shipConfig = computed(() => {
if (props.type === 'ship') return SHIPS[props.itemType as ShipType]
return null
})
// 类型安全单位成本处理cost vs baseCost差异
const unitCost = computed(() => {
if (props.type === 'ship') return SHIPS[props.itemType as ShipType].cost
if (props.type === 'defense') return DEFENSES[props.itemType as DefenseType].cost
return { metal: 0, crystal: 0, deuterium: 0 }
})
// 类型安全单位建造时间处理buildTime vs baseTime差异应用加成
const unitBuildTime = computed(() => {
if (props.type === 'ship') {
return shipLogic.calculateShipBuildTime(
props.itemType as ShipType,
1, // 单个单位
activeBonuses.value.buildingSpeedBonus,
roboticsFactoryLevel.value,
naniteFactoryLevel.value
)
}
if (props.type === 'defense') {
return shipLogic.calculateDefenseBuildTime(
props.itemType as DefenseType,
1, // 单个单位
activeBonuses.value.buildingSpeedBonus,
roboticsFactoryLevel.value,
naniteFactoryLevel.value
)
}
return 0
})
// 建筑/科技:等级范围
const levelRange = computed(() => {
if (props.type !== 'building' && props.type !== 'technology') return []
const current = props.currentLevel || 0
const levels = []
for (let i = current; i <= current + 10; i++) {
levels.push(i)
}
return levels
})
// 建筑/科技:获取某个等级的数据
const getLevelData = (level: number) => {
if (level === 0) {
return {
cost: { metal: 0, crystal: 0, deuterium: 0, darkMatter: 0 },
time: 0,
production: 0,
consumption: 0,
points: 0,
capacity: 0,
fleetStorage: 0,
spaceBonus: 0,
buildSpeedBonus: 0,
researchSpeedBonus: 0
}
}
if (props.type === 'building') {
const buildingType = props.itemType as BuildingType
const cost = buildingLogic.calculateBuildingCost(buildingType, level)
// 使用实际的工厂等级和加成计算建造时间
const time = buildingLogic.calculateBuildingTime(
buildingType,
level,
activeBonuses.value.buildingSpeedBonus,
roboticsFactoryLevel.value,
naniteFactoryLevel.value
)
let production = 0
let consumption = 0
let capacity = 0
let fleetStorage = 0
let spaceBonus = 0
let buildSpeedBonus = 0
let researchSpeedBonus = 0
// 应用资源产量加成
const resourceBonus = 1 + (activeBonuses.value.resourceProductionBonus || 0) / 100
const energyBonus = 1 + (activeBonuses.value.energyProductionBonus || 0) / 100
const storageBonus = 1 + (activeBonuses.value.storageCapacityBonus || 0) / 100
const baseCapacity = 10000
if (buildingType === 'metalMine') {
production = Math.floor(1500 * level * Math.pow(1.5, level) * resourceBonus)
consumption = Math.floor(10 * level * Math.pow(1.1, level))
} else if (buildingType === 'crystalMine') {
production = Math.floor(1000 * level * Math.pow(1.5, level) * resourceBonus)
consumption = Math.floor(10 * level * Math.pow(1.1, level))
} else if (buildingType === 'deuteriumSynthesizer') {
production = Math.floor(500 * level * Math.pow(1.5, level) * resourceBonus)
consumption = Math.floor(10 * level * Math.pow(1.1, level))
} else if (buildingType === 'solarPlant') {
production = Math.floor(50 * level * Math.pow(1.1, level) * energyBonus)
} else if (buildingType === 'metalStorage') {
capacity = Math.floor(baseCapacity * Math.pow(2, level) * storageBonus)
} else if (buildingType === 'crystalStorage') {
capacity = Math.floor(baseCapacity * Math.pow(2, level) * storageBonus)
} else if (buildingType === 'deuteriumTank') {
capacity = Math.floor(baseCapacity * Math.pow(2, level) * storageBonus)
} else if (buildingType === 'darkMatterCollector') {
capacity = 1000 + level * 100
production = Math.floor(25 * level * Math.pow(1.5, level))
} else if (buildingType === 'darkMatterTank') {
const darkMatterBaseCapacity = 1000
capacity = Math.floor(darkMatterBaseCapacity * Math.pow(2, level) * storageBonus)
} else if (buildingType === 'fusionReactor') {
production = Math.floor(150 * level * Math.pow(1.15, level))
} else if (buildingType === 'shipyard') {
fleetStorage = 1000 * level
} else if (buildingType === 'terraformer') {
spaceBonus = 5
} else if (buildingType === 'lunarBase') {
spaceBonus = 5
} else if (buildingType === 'roboticsFactory') {
buildSpeedBonus = level
} else if (buildingType === 'naniteFactory') {
buildSpeedBonus = level * 2
} else if (buildingType === 'researchLab') {
researchSpeedBonus = level
}
const points = pointsLogic.calculateBuildingPoints(buildingType, level - 1, level)
return { cost, time, production, consumption, points, capacity, fleetStorage, spaceBonus, buildSpeedBonus, researchSpeedBonus }
} else {
const techType = props.itemType as TechnologyType
const cost = researchLogic.calculateTechnologyCost(techType, level)
// 使用实际的研究所等级和加成计算研究时间
const time = researchLogic.calculateTechnologyTime(
techType,
level - 1,
activeBonuses.value.researchSpeedBonus,
researchLabLevel.value
)
let researchSpeedBonus = 0
if (techType === 'energyTechnology') {
researchSpeedBonus = level
}
const points = pointsLogic.calculateTechnologyPoints(techType, level - 1, level)
return { cost, time, production: 0, consumption: 0, points, capacity: 0, fleetStorage: 0, spaceBonus: 0, buildSpeedBonus: 0, researchSpeedBonus }
}
}
// 建筑/科技:累积统计
const totalStats = computed(() => {
if (props.type !== 'building' && props.type !== 'technology') {
return { metal: 0, crystal: 0, deuterium: 0, points: 0 }
}
let metal = 0,
crystal = 0,
deuterium = 0,
points = 0
for (const level of levelRange.value) {
if (level === 0) continue
const data = getLevelData(level)
metal += data.cost.metal
crystal += data.cost.crystal
deuterium += data.cost.deuterium
points += data.points
}
return { metal, crystal, deuterium, points }
})
// 舰船/防御:单位积分
const pointsPerUnit = computed(() => {
if (props.type === 'ship') return pointsLogic.calculateShipPoints(props.itemType as ShipType, 1)
if (props.type === 'defense') return pointsLogic.calculateDefensePoints(props.itemType as DefenseType, 1)
return 0
})
// 舰船/防御:批量成本
const batchCost = computed(() => ({
metal: unitCost.value.metal * quantity.value,
crystal: unitCost.value.crystal * quantity.value,
deuterium: unitCost.value.deuterium * quantity.value
}))
// 舰船/防御:批量积分
const batchPoints = computed(() => {
if (props.type === 'ship') return pointsLogic.calculateShipPoints(props.itemType as ShipType, quantity.value)
if (props.type === 'defense') return pointsLogic.calculateDefensePoints(props.itemType as DefenseType, quantity.value)
return 0
})
</script>

View File

@@ -0,0 +1,232 @@
<template>
<Card>
<CardHeader>
<div class="flex items-start justify-between">
<div class="flex-1">
<CardTitle class="flex items-center gap-2">
{{ npc.name }}
<Badge :variant="statusBadgeVariant">
{{ statusText }}
</Badge>
</CardTitle>
<CardDescription class="mt-1">
{{ npc.planets.length }} {{ t('diplomacy.planets') }}
<span v-if="npc.allies && npc.allies.length > 0" class="ml-2">· {{ npc.allies.length }} {{ t('diplomacy.allies') }}</span>
</CardDescription>
</div>
</div>
</CardHeader>
<CardContent class="space-y-4">
<!-- 好感度进度条 -->
<div class="space-y-2">
<div class="flex items-center justify-between text-sm">
<span class="text-muted-foreground">{{ t('diplomacy.reputation') }}</span>
<span class="font-semibold" :class="reputationColor">{{ reputation > 0 ? '+' : '' }}{{ reputation }}</span>
</div>
<div class="relative">
<!-- 背景进度条 -->
<div class="h-2 bg-muted rounded-full overflow-hidden">
<!-- 负值部分左侧红色 -->
<div
v-if="reputation < 0"
class="h-full bg-red-500 dark:bg-red-600 absolute right-1/2"
:style="{ width: `${Math.abs(reputation) / 2}%` }"
/>
<!-- 正值部分右侧绿色 -->
<div
v-if="reputation > 0"
class="h-full bg-green-500 dark:bg-green-600 absolute left-1/2"
:style="{ width: `${reputation / 2}%` }"
/>
</div>
<!-- 中心线 -->
<div class="absolute left-1/2 top-0 bottom-0 w-px bg-border" />
</div>
<div class="flex justify-between text-xs text-muted-foreground">
<span>-100</span>
<span>0</span>
<span>+100</span>
</div>
</div>
<!-- 盟友信息 -->
<div v-if="npc.allies && npc.allies.length > 0" class="pt-2 border-t">
<p class="text-sm text-muted-foreground mb-2">{{ t('diplomacy.alliedWith') }}:</p>
<div class="flex flex-wrap gap-1">
<Badge v-for="allyId in npc.allies.slice(0, 3)" :key="allyId" variant="outline" class="text-xs">
{{ getAllyName(allyId) }}
</Badge>
<Badge v-if="npc.allies.length > 3" variant="outline" class="text-xs">
+{{ npc.allies.length - 3 }} {{ t('diplomacy.more') }}
</Badge>
</div>
</div>
<!-- 操作按钮 -->
<div class="flex gap-2 pt-2">
<Button size="sm" variant="outline" class="flex-1" @click="handleGiftResources">
<Gift class="h-4 w-4 mr-2" />
{{ t('diplomacy.actions.gift') }}
</Button>
<Button size="sm" variant="outline" class="flex-1" @click="handleViewPlanets">
<Globe class="h-4 w-4 mr-2" />
{{ t('diplomacy.actions.viewPlanets') }}
</Button>
</div>
<!-- 最近活动 -->
<div v-if="recentEvent" class="pt-2 border-t">
<p class="text-xs text-muted-foreground mb-1">{{ t('diplomacy.lastEvent') }}:</p>
<div class="flex items-center gap-2 text-xs">
<component :is="getEventIcon(recentEvent.reason)" class="h-3 w-3" />
<span>{{ getEventText(recentEvent.reason) }}</span>
<span class="text-muted-foreground">{{ formatTime(Date.now() - recentEvent.timestamp) }} {{ t('diplomacy.ago') }}</span>
</div>
</div>
</CardContent>
</Card>
</template>
<script setup lang="ts">
import { computed } from 'vue'
import { useRouter } from 'vue-router'
import { useNPCStore } from '@/stores/npcStore'
import { useI18n } from '@/composables/useI18n'
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card'
import { Badge } from '@/components/ui/badge'
import { Button } from '@/components/ui/button'
import { Gift, Globe, Sword, Eye, Trash2 } from 'lucide-vue-next'
import { RelationStatus, DiplomaticEventType } from '@/types/game'
import type { DiplomaticRelation, NPC } from '@/types/game'
import { formatTime } from '@/utils/format'
const props = defineProps<{
npc: NPC
relation?: DiplomaticRelation
}>()
const router = useRouter()
const npcStore = useNPCStore()
const { t } = useI18n()
// 好感度值
const reputation = computed(() => props.relation?.reputation || 0)
// 关系状态
const status = computed(() => props.relation?.status || RelationStatus.Neutral)
// 关系状态文本
const statusText = computed(() => {
switch (status.value) {
case RelationStatus.Friendly:
return t('diplomacy.status.friendly')
case RelationStatus.Hostile:
return t('diplomacy.status.hostile')
default:
return t('diplomacy.status.neutral')
}
})
// 关系状态Badge样式
const statusBadgeVariant = computed(() => {
switch (status.value) {
case RelationStatus.Friendly:
return 'default'
case RelationStatus.Hostile:
return 'destructive'
default:
return 'secondary'
}
})
// 好感度颜色
const reputationColor = computed(() => {
if (reputation.value >= 20) return 'text-green-600 dark:text-green-400'
if (reputation.value <= -20) return 'text-red-600 dark:text-red-400'
return 'text-muted-foreground'
})
// 最近的外交事件
const recentEvent = computed(() => {
if (!props.relation?.history || props.relation.history.length === 0) return null
return props.relation.history[props.relation.history.length - 1]
})
// 获取盟友名称
const getAllyName = (allyId: string) => {
const ally = npcStore.npcs.find(n => n.id === allyId)
return ally?.name || allyId.substring(0, 8)
}
// 获取事件图标
const getEventIcon = (eventType: string) => {
switch (eventType) {
case DiplomaticEventType.GiftResources:
return Gift
case DiplomaticEventType.Attack:
case DiplomaticEventType.AllyAttacked:
return Sword
case DiplomaticEventType.Spy:
return Eye
case DiplomaticEventType.StealDebris:
return Trash2
default:
return Gift
}
}
// 获取事件文本
const getEventText = (eventType: string) => {
switch (eventType) {
case DiplomaticEventType.GiftResources:
return t('diplomacy.events.gift')
case DiplomaticEventType.Attack:
return t('diplomacy.events.attack')
case DiplomaticEventType.AllyAttacked:
return t('diplomacy.events.allyAttacked')
case DiplomaticEventType.Spy:
return t('diplomacy.events.spy')
case DiplomaticEventType.StealDebris:
return t('diplomacy.events.stealDebris')
default:
return eventType
}
}
// 赠送资源
const handleGiftResources = () => {
// 跳转到舰队页面自动选择第一个NPC星球
if (props.npc.planets.length > 0) {
const targetPlanet = props.npc.planets[0]
if (!targetPlanet) return
router.push({
path: '/fleet',
query: {
galaxy: targetPlanet.position.galaxy,
system: targetPlanet.position.system,
position: targetPlanet.position.position,
gift: '1'
}
})
}
}
// 查看星球
const handleViewPlanets = () => {
// 跳转到星系视图定位到第一个NPC星球并传递NPC ID用于高亮
if (props.npc.planets.length > 0) {
const targetPlanet = props.npc.planets[0]
if (!targetPlanet) return
router.push({
path: '/galaxy',
query: {
galaxy: targetPlanet.position.galaxy,
system: targetPlanet.position.system,
highlightNpc: props.npc.id
}
})
}
}
</script>

View File

@@ -1,7 +1,7 @@
<template> <template>
<Popover> <Popover>
<PopoverTrigger as-child> <PopoverTrigger as-child>
<span class="cursor-pointer underline decoration-dotted underline-offset-4 touch-manipulation">{{ abbreviatedValue }}</span> <span class="cursor-pointer underline decoration-dotted underline-offset-4 touch-manipulation">{{ formatNumber(value, 1) }}</span>
</PopoverTrigger> </PopoverTrigger>
<PopoverContent class="w-auto p-2" side="top" align="center"> <PopoverContent class="w-auto p-2" side="top" align="center">
<p class="font-mono text-sm">{{ formattedValue }}</p> <p class="font-mono text-sm">{{ formattedValue }}</p>
@@ -12,6 +12,7 @@
<script setup lang="ts"> <script setup lang="ts">
import { computed } from 'vue' import { computed } from 'vue'
import { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover' import { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover'
import { formatNumber } from '@/utils/format'
const props = defineProps<{ const props = defineProps<{
value: number value: number
@@ -21,30 +22,4 @@
const formattedValue = computed(() => { const formattedValue = computed(() => {
return props.value.toLocaleString() return props.value.toLocaleString()
}) })
// 缩写格式的数字
const abbreviatedValue = computed(() => {
const num = props.value
// 小于1000直接显示
if (num < 1000) {
return num.toString()
}
// 1000 - 999,999: 使用 K (千)
if (num < 1000000) {
const k = num / 1000
return k % 1 === 0 ? `${k}K` : `${k.toFixed(1)}K`
}
// 1,000,000 - 999,999,999: 使用 M (百万)
if (num < 1000000000) {
const m = num / 1000000
return m % 1 === 0 ? `${m}M` : `${m.toFixed(1)}M`
}
// 1,000,000,000+: 使用 B (十亿)
const b = num / 1000000000
return b % 1 === 0 ? `${b}B` : `${b.toFixed(1)}B`
})
</script> </script>

View File

@@ -1,6 +1,7 @@
<template> <template>
<Dialog v-model:open="isOpen"> <Dialog v-model:open="isOpen">
<DialogContent class="max-w-2xl max-h-[90vh] overflow-y-auto"> <ScrollableDialogContent container-class="sm:max-w-2xl max-h-[90vh]">
<template #header>
<DialogHeader> <DialogHeader>
<DialogTitle class="flex items-center gap-2"> <DialogTitle class="flex items-center gap-2">
<Eye class="h-5 w-5" /> <Eye class="h-5 w-5" />
@@ -10,16 +11,17 @@
{{ formatDate(report.timestamp) }} {{ formatDate(report.timestamp) }}
</DialogDescription> </DialogDescription>
</DialogHeader> </DialogHeader>
</template>
<div v-if="report" class="space-y-4"> <div v-if="report" class="space-y-4">
<!-- 目标星球信息 --> <!-- 目标星球信息 -->
<div class="p-3 bg-muted rounded-lg"> <div class="p-3 bg-muted rounded-lg">
<p class="text-sm font-medium mb-2">{{ t('messagesView.targetPlanet') }}</p> <p class="text-sm font-medium mb-2">{{ t('messagesView.targetPlanet') }}</p>
<p v-if="targetPlanet" class="text-xs text-muted-foreground"> <p class="text-xs text-muted-foreground">
{{ targetPlanet.name }} [{{ targetPlanet.position.galaxy }}:{{ targetPlanet.position.system }}:{{ {{ report.targetPlanetName }} [{{ report.targetPosition.galaxy }}:{{ report.targetPosition.system }}:{{
targetPlanet.position.position report.targetPosition.position
}}] }}]
</p> </p>
<p v-else class="text-xs text-muted-foreground">{{ report.targetPlanetId }}</p>
</div> </div>
<!-- 资源 --> <!-- 资源 -->
@@ -80,17 +82,15 @@
</div> </div>
</div> </div>
</div> </div>
</DialogContent> </ScrollableDialogContent>
</Dialog> </Dialog>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { ref, watch, computed } from 'vue' import { ref, watch } from 'vue'
import { useGameStore } from '@/stores/gameStore'
import { useUniverseStore } from '@/stores/universeStore'
import { useI18n } from '@/composables/useI18n' import { useI18n } from '@/composables/useI18n'
import { useGameConfig } from '@/composables/useGameConfig' import { useGameConfig } from '@/composables/useGameConfig'
import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle } from '@/components/ui/dialog' import { Dialog, ScrollableDialogContent, DialogDescription, DialogHeader, DialogTitle } from '@/components/ui/dialog'
import ResourceIcon from '@/components/ResourceIcon.vue' import ResourceIcon from '@/components/ResourceIcon.vue'
import { formatNumber, formatDate } from '@/utils/format' import { formatNumber, formatDate } from '@/utils/format'
import { Eye } from 'lucide-vue-next' import { Eye } from 'lucide-vue-next'
@@ -105,23 +105,11 @@
(e: 'update:open', value: boolean): void (e: 'update:open', value: boolean): void
}>() }>()
const gameStore = useGameStore()
const universeStore = useUniverseStore()
const { t } = useI18n() const { t } = useI18n()
const { SHIPS, DEFENSES, BUILDINGS } = useGameConfig() const { SHIPS, DEFENSES, BUILDINGS } = useGameConfig()
const isOpen = ref(props.open) const isOpen = ref(props.open)
// 获取目标星球信息
const targetPlanet = computed(() => {
if (!props.report) return null
// 先从玩家星球中查找
const playerPlanet = gameStore.player.planets.find(p => p.id === props.report!.targetPlanetId)
if (playerPlanet) return playerPlanet
// 再从宇宙星球地图中查找
return Object.values(universeStore.planets).find(p => p.id === props.report!.targetPlanetId)
})
watch( watch(
() => props.open, () => props.open,
newValue => { newValue => {

View File

@@ -1,202 +0,0 @@
<template>
<div class="space-y-4">
<!-- 建筑等级范围表格 -->
<div class="border rounded-lg overflow-hidden">
<Table>
<TableHeader>
<TableRow>
<TableHead class="w-20 text-center">{{ t('buildings.levelRange') }}</TableHead>
<TableHead class="text-center">{{ t('resources.metal') }}</TableHead>
<TableHead class="text-center">{{ t('resources.crystal') }}</TableHead>
<TableHead class="text-center">{{ t('resources.deuterium') }}</TableHead>
<TableHead class="text-center">{{ t('buildings.buildTime') }}</TableHead>
<TableHead class="text-center">{{ t('buildings.production') }}</TableHead>
<TableHead class="text-center">{{ t('buildings.consumption') }}</TableHead>
<TableHead class="text-center">{{ t('player.points') }}</TableHead>
</TableRow>
</TableHeader>
<TableBody>
<TableRow v-for="level in levelRange" :key="level" :class="{ 'bg-muted/50': level === currentLevel }">
<TableCell class="text-center font-medium">
<Badge v-if="level === currentLevel" variant="default">{{ level }}</Badge>
<span v-else>{{ level }}</span>
</TableCell>
<TableCell class="text-center text-sm">
<NumberWithTooltip :value="getLevelData(level).cost.metal" />
</TableCell>
<TableCell class="text-center text-sm">
<NumberWithTooltip :value="getLevelData(level).cost.crystal" />
</TableCell>
<TableCell class="text-center text-sm">
<NumberWithTooltip :value="getLevelData(level).cost.deuterium" />
</TableCell>
<TableCell class="text-center text-sm">{{ formatTime(getLevelData(level).buildTime) }}</TableCell>
<TableCell class="text-center text-sm">
<span v-if="getLevelData(level).production > 0" class="text-green-600 dark:text-green-400">
+
<NumberWithTooltip :value="getLevelData(level).production" />
/{{ t('resources.perHour') }}
</span>
<span v-else>-</span>
</TableCell>
<TableCell class="text-center text-sm">
<span v-if="getLevelData(level).consumption > 0" class="text-red-600 dark:text-red-400">
-
<NumberWithTooltip :value="getLevelData(level).consumption" />
</span>
<span v-else>-</span>
</TableCell>
<TableCell class="text-center text-sm">
<span class="text-primary font-medium">
+
<NumberWithTooltip :value="getLevelData(level).points" />
</span>
</TableCell>
</TableRow>
</TableBody>
</Table>
</div>
<!-- 累积统计 -->
<div class="grid grid-cols-2 gap-4">
<Card>
<CardHeader class="pb-3">
<CardTitle class="text-sm">{{ t('buildings.totalCost') }}</CardTitle>
</CardHeader>
<CardContent class="space-y-2">
<div class="flex items-center justify-between text-sm">
<span class="text-muted-foreground">{{ t('resources.metal') }}:</span>
<span class="font-medium">
<NumberWithTooltip :value="totalStats.metal" />
</span>
</div>
<div class="flex items-center justify-between text-sm">
<span class="text-muted-foreground">{{ t('resources.crystal') }}:</span>
<span class="font-medium">
<NumberWithTooltip :value="totalStats.crystal" />
</span>
</div>
<div class="flex items-center justify-between text-sm">
<span class="text-muted-foreground">{{ t('resources.deuterium') }}:</span>
<span class="font-medium">
<NumberWithTooltip :value="totalStats.deuterium" />
</span>
</div>
</CardContent>
</Card>
<Card>
<CardHeader class="pb-3">
<CardTitle class="text-sm">{{ t('buildings.totalPoints') }}</CardTitle>
</CardHeader>
<CardContent>
<div class="text-3xl font-bold text-primary">
<NumberWithTooltip :value="totalStats.points" />
</div>
<p class="text-xs text-muted-foreground mt-1">
{{ t('buildings.levelRange') }}: {{ Math.max(0, currentLevel - 10) }} - {{ Math.min(currentLevel + 10, currentLevel + 10) }}
</p>
</CardContent>
</Card>
</div>
</div>
</template>
<script setup lang="ts">
import { computed } from 'vue'
import { useI18n } from '@/composables/useI18n'
import type { BuildingType } from '@/types/game'
import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '@/components/ui/table'
import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'
import { Badge } from '@/components/ui/badge'
import NumberWithTooltip from '@/components/NumberWithTooltip.vue'
import * as buildingLogic from '@/logic/buildingLogic'
import * as pointsLogic from '@/logic/pointsLogic'
import { formatTime } from '@/utils/format'
const { t } = useI18n()
const props = defineProps<{
buildingType: BuildingType
currentLevel: number
}>()
// 等级范围:当前等级 +10
const levelRange = computed(() => {
const end = props.currentLevel + 10
const levels = []
for (let i = props.currentLevel; i <= end; i++) {
levels.push(i)
}
return levels
})
// 获取某个等级的详细数据
const getLevelData = (level: number) => {
if (level === 0) {
return {
cost: { metal: 0, crystal: 0, deuterium: 0 },
buildTime: 0,
production: 0,
consumption: 0,
points: 0
}
}
const cost = buildingLogic.calculateBuildingCost(props.buildingType, level)
const buildTime = buildingLogic.calculateBuildingTime(props.buildingType, level)
// 计算产量和消耗
let production = 0
let consumption = 0
// 资源矿产量(与 resourceLogic.ts 保持一致)
if (props.buildingType === 'metalMine') {
production = Math.floor(1500 * level * Math.pow(1.5, level))
} else if (props.buildingType === 'crystalMine') {
production = Math.floor(1000 * level * Math.pow(1.5, level))
} else if (props.buildingType === 'deuteriumSynthesizer') {
production = Math.floor(500 * level * Math.pow(1.5, level))
}
// 能量产出(与 resourceLogic.ts 保持一致)
if (props.buildingType === 'solarPlant') {
production = Math.floor(50 * level * Math.pow(1.1, level))
}
// 能量消耗(矿场和合成器)
if (['metalMine', 'crystalMine', 'deuteriumSynthesizer'].includes(props.buildingType)) {
consumption = Math.floor(10 * level * Math.pow(1.1, level))
}
// 计算积分
const points = pointsLogic.calculateBuildingPoints(props.buildingType, level - 1, level)
return {
cost,
buildTime,
production,
consumption,
points
}
}
// 累积统计
const totalStats = computed(() => {
let metal = 0
let crystal = 0
let deuterium = 0
let points = 0
for (const level of levelRange.value) {
if (level === 0) continue
const data = getLevelData(level)
metal += data.cost.metal
crystal += data.cost.crystal
deuterium += data.cost.deuterium
points += data.points
}
return { metal, crystal, deuterium, points }
})
</script>

View File

@@ -1,179 +0,0 @@
<template>
<div class="space-y-4">
<!-- 防御基础信息 -->
<div class="grid grid-cols-2 md:grid-cols-3 gap-4">
<Card>
<CardHeader class="pb-3">
<CardTitle class="text-sm flex items-center gap-2">
<Sword class="h-4 w-4" />
{{ t('defense.attack') }}
</CardTitle>
</CardHeader>
<CardContent>
<div class="text-2xl font-bold">
<NumberWithTooltip :value="config.attack" />
</div>
</CardContent>
</Card>
<Card>
<CardHeader class="pb-3">
<CardTitle class="text-sm flex items-center gap-2">
<Shield class="h-4 w-4" />
{{ t('defense.shield') }}
</CardTitle>
</CardHeader>
<CardContent>
<div class="text-2xl font-bold">
<NumberWithTooltip :value="config.shield" />
</div>
</CardContent>
</Card>
<Card>
<CardHeader class="pb-3">
<CardTitle class="text-sm flex items-center gap-2">
<ShieldCheck class="h-4 w-4" />
{{ t('defense.armor') }}
</CardTitle>
</CardHeader>
<CardContent>
<div class="text-2xl font-bold">
<NumberWithTooltip :value="config.armor" />
</div>
</CardContent>
</Card>
</div>
<!-- 建造成本和时间 -->
<div class="grid grid-cols-1 md:grid-cols-2 gap-4">
<Card>
<CardHeader>
<CardTitle class="text-sm">{{ t('defense.buildCost') }}</CardTitle>
</CardHeader>
<CardContent class="space-y-2">
<div v-if="config.cost.metal > 0" class="flex items-center justify-between text-sm">
<span class="text-muted-foreground">{{ t('resources.metal') }}:</span>
<span class="font-medium">
<NumberWithTooltip :value="config.cost.metal" />
</span>
</div>
<div v-if="config.cost.crystal > 0" class="flex items-center justify-between text-sm">
<span class="text-muted-foreground">{{ t('resources.crystal') }}:</span>
<span class="font-medium">
<NumberWithTooltip :value="config.cost.crystal" />
</span>
</div>
<div v-if="config.cost.deuterium > 0" class="flex items-center justify-between text-sm">
<span class="text-muted-foreground">{{ t('resources.deuterium') }}:</span>
<span class="font-medium">
<NumberWithTooltip :value="config.cost.deuterium" />
</span>
</div>
<div class="flex items-center justify-between text-sm pt-2 border-t">
<span class="text-muted-foreground">{{ t('player.points') }}:</span>
<span class="font-bold text-primary">
<NumberWithTooltip :value="pointsPerUnit" />
</span>
</div>
</CardContent>
</Card>
<Card>
<CardHeader>
<CardTitle class="text-sm">{{ t('defense.buildTime') }}</CardTitle>
</CardHeader>
<CardContent>
<div class="text-3xl font-bold">{{ formatTime(config.buildTime) }}</div>
<p class="text-xs text-muted-foreground mt-2">{{ t('defense.perUnit') }}</p>
</CardContent>
</Card>
</div>
<!-- 批量建造计算器 -->
<Card>
<CardHeader>
<CardTitle class="text-sm">{{ t('defense.batchCalculator') }}</CardTitle>
</CardHeader>
<CardContent class="space-y-4">
<div class="flex items-center gap-4">
<Label class="w-20">{{ t('defense.quantity') }}:</Label>
<Input v-model.number="quantity" type="number" min="1" class="flex-1" />
</div>
<div class="grid grid-cols-2 gap-4 pt-4 border-t">
<div class="space-y-2">
<p class="text-sm text-muted-foreground">{{ t('defense.totalCost') }}:</p>
<div class="space-y-1 text-sm">
<div class="flex justify-between">
<span>{{ t('resources.metal') }}:</span>
<span class="font-medium">
<NumberWithTooltip :value="batchCost.metal" />
</span>
</div>
<div class="flex justify-between">
<span>{{ t('resources.crystal') }}:</span>
<span class="font-medium">
<NumberWithTooltip :value="batchCost.crystal" />
</span>
</div>
<div class="flex justify-between">
<span>{{ t('resources.deuterium') }}:</span>
<span class="font-medium">
<NumberWithTooltip :value="batchCost.deuterium" />
</span>
</div>
</div>
</div>
<div class="space-y-2">
<p class="text-sm text-muted-foreground">{{ t('defense.totalTime') }}:</p>
<div class="text-xl font-bold">{{ formatTime(config.buildTime * quantity) }}</div>
<p class="text-xs text-muted-foreground">
{{ t('player.points') }}: +
<NumberWithTooltip :value="batchPoints" />
</p>
</div>
</div>
</CardContent>
</Card>
</div>
</template>
<script setup lang="ts">
import { ref, computed } from 'vue'
import { useI18n } from '@/composables/useI18n'
import type { DefenseType } from '@/types/game'
import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'
import { Input } from '@/components/ui/input'
import { Label } from '@/components/ui/label'
import NumberWithTooltip from '@/components/NumberWithTooltip.vue'
import { Sword, Shield, ShieldCheck } from 'lucide-vue-next'
import * as pointsLogic from '@/logic/pointsLogic'
import { DEFENSES } from '@/config/gameConfig'
import { formatTime } from '@/utils/format'
const { t } = useI18n()
const props = defineProps<{
defenseType: DefenseType
}>()
const config = computed(() => DEFENSES[props.defenseType])
const quantity = ref(1)
// 单个防御的积分
const pointsPerUnit = computed(() => {
return pointsLogic.calculateDefensePoints(props.defenseType, 1)
})
// 批量建造成本
const batchCost = computed(() => ({
metal: config.value.cost.metal * quantity.value,
crystal: config.value.cost.crystal * quantity.value,
deuterium: config.value.cost.deuterium * quantity.value
}))
// 批量建造积分
const batchPoints = computed(() => {
return pointsLogic.calculateDefensePoints(props.defenseType, quantity.value)
})
</script>

View File

@@ -1,221 +0,0 @@
<template>
<div class="space-y-4">
<!-- 舰船基础信息 -->
<div class="grid grid-cols-2 md:grid-cols-3 gap-4">
<Card>
<CardHeader class="pb-3">
<CardTitle class="text-sm flex items-center gap-2">
<Sword class="h-4 w-4" />
{{ t('shipyard.attack') }}
</CardTitle>
</CardHeader>
<CardContent>
<div class="text-2xl font-bold">
<NumberWithTooltip :value="config.attack" />
</div>
</CardContent>
</Card>
<Card>
<CardHeader class="pb-3">
<CardTitle class="text-sm flex items-center gap-2">
<Shield class="h-4 w-4" />
{{ t('shipyard.shield') }}
</CardTitle>
</CardHeader>
<CardContent>
<div class="text-2xl font-bold">
<NumberWithTooltip :value="config.shield" />
</div>
</CardContent>
</Card>
<Card>
<CardHeader class="pb-3">
<CardTitle class="text-sm flex items-center gap-2">
<ShieldCheck class="h-4 w-4" />
{{ t('shipyard.armor') }}
</CardTitle>
</CardHeader>
<CardContent>
<div class="text-2xl font-bold">
<NumberWithTooltip :value="config.armor" />
</div>
</CardContent>
</Card>
<Card>
<CardHeader class="pb-3">
<CardTitle class="text-sm flex items-center gap-2">
<Zap class="h-4 w-4" />
{{ t('shipyard.speed') }}
</CardTitle>
</CardHeader>
<CardContent>
<div class="text-2xl font-bold">
<NumberWithTooltip :value="config.speed" />
</div>
</CardContent>
</Card>
<Card>
<CardHeader class="pb-3">
<CardTitle class="text-sm flex items-center gap-2">
<Package class="h-4 w-4" />
{{ t('shipyard.cargoCapacity') }}
</CardTitle>
</CardHeader>
<CardContent>
<div class="text-2xl font-bold">
<NumberWithTooltip :value="config.cargoCapacity" />
</div>
</CardContent>
</Card>
<Card>
<CardHeader class="pb-3">
<CardTitle class="text-sm flex items-center gap-2">
<Fuel class="h-4 w-4" />
{{ t('shipyard.fuelConsumption') }}
</CardTitle>
</CardHeader>
<CardContent>
<div class="text-2xl font-bold">
<NumberWithTooltip :value="config.fuelConsumption" />
</div>
</CardContent>
</Card>
</div>
<!-- 建造成本和时间 -->
<div class="grid grid-cols-1 md:grid-cols-2 gap-4">
<Card>
<CardHeader>
<CardTitle class="text-sm">{{ t('shipyard.buildCost') }}</CardTitle>
</CardHeader>
<CardContent class="space-y-2">
<div v-if="config.cost.metal > 0" class="flex items-center justify-between text-sm">
<span class="text-muted-foreground">{{ t('resources.metal') }}:</span>
<span class="font-medium">
<NumberWithTooltip :value="config.cost.metal" />
</span>
</div>
<div v-if="config.cost.crystal > 0" class="flex items-center justify-between text-sm">
<span class="text-muted-foreground">{{ t('resources.crystal') }}:</span>
<span class="font-medium">
<NumberWithTooltip :value="config.cost.crystal" />
</span>
</div>
<div v-if="config.cost.deuterium > 0" class="flex items-center justify-between text-sm">
<span class="text-muted-foreground">{{ t('resources.deuterium') }}:</span>
<span class="font-medium">
<NumberWithTooltip :value="config.cost.deuterium" />
</span>
</div>
<div class="flex items-center justify-between text-sm pt-2 border-t">
<span class="text-muted-foreground">{{ t('player.points') }}:</span>
<span class="font-bold text-primary">
<NumberWithTooltip :value="pointsPerUnit" />
</span>
</div>
</CardContent>
</Card>
<Card>
<CardHeader>
<CardTitle class="text-sm">{{ t('shipyard.buildTime') }}</CardTitle>
</CardHeader>
<CardContent>
<div class="text-3xl font-bold">{{ formatTime(config.buildTime) }}</div>
<p class="text-xs text-muted-foreground mt-2">{{ t('shipyard.perUnit') }}</p>
</CardContent>
</Card>
</div>
<!-- 批量建造计算器 -->
<Card>
<CardHeader>
<CardTitle class="text-sm">{{ t('shipyard.batchCalculator') }}</CardTitle>
</CardHeader>
<CardContent class="space-y-4">
<div class="flex items-center gap-4">
<Label class="w-20">{{ t('shipyard.quantity') }}:</Label>
<Input v-model.number="quantity" type="number" min="1" class="flex-1" />
</div>
<div class="grid grid-cols-2 gap-4 pt-4 border-t">
<div class="space-y-2">
<p class="text-sm text-muted-foreground">{{ t('shipyard.totalCost') }}:</p>
<div class="space-y-1 text-sm">
<div class="flex justify-between">
<span>{{ t('resources.metal') }}:</span>
<span class="font-medium">
<NumberWithTooltip :value="batchCost.metal" />
</span>
</div>
<div class="flex justify-between">
<span>{{ t('resources.crystal') }}:</span>
<span class="font-medium">
<NumberWithTooltip :value="batchCost.crystal" />
</span>
</div>
<div class="flex justify-between">
<span>{{ t('resources.deuterium') }}:</span>
<span class="font-medium">
<NumberWithTooltip :value="batchCost.deuterium" />
</span>
</div>
</div>
</div>
<div class="space-y-2">
<p class="text-sm text-muted-foreground">{{ t('shipyard.totalTime') }}:</p>
<div class="text-xl font-bold">{{ formatTime(config.buildTime * quantity) }}</div>
<p class="text-xs text-muted-foreground">
{{ t('player.points') }}: +
<NumberWithTooltip :value="batchPoints" />
</p>
</div>
</div>
</CardContent>
</Card>
</div>
</template>
<script setup lang="ts">
import { ref, computed } from 'vue'
import { useI18n } from '@/composables/useI18n'
import type { ShipType } from '@/types/game'
import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'
import { Input } from '@/components/ui/input'
import { Label } from '@/components/ui/label'
import NumberWithTooltip from '@/components/NumberWithTooltip.vue'
import { Sword, Shield, ShieldCheck, Zap, Package, Fuel } from 'lucide-vue-next'
import * as pointsLogic from '@/logic/pointsLogic'
import { SHIPS } from '@/config/gameConfig'
import { formatTime } from '@/utils/format'
const { t } = useI18n()
const props = defineProps<{
shipType: ShipType
}>()
const config = computed(() => SHIPS[props.shipType])
const quantity = ref(1)
// 单艘舰船的积分
const pointsPerUnit = computed(() => {
return pointsLogic.calculateShipPoints(props.shipType, 1)
})
// 批量建造成本
const batchCost = computed(() => ({
metal: config.value.cost.metal * quantity.value,
crystal: config.value.cost.crystal * quantity.value,
deuterium: config.value.cost.deuterium * quantity.value
}))
// 批量建造积分
const batchPoints = computed(() => {
return pointsLogic.calculateShipPoints(props.shipType, quantity.value)
})
</script>

View File

@@ -1,158 +0,0 @@
<template>
<div class="space-y-4">
<!-- 科技等级范围表格 -->
<div class="border rounded-lg overflow-hidden">
<Table>
<TableHeader>
<TableRow>
<TableHead class="w-20 text-center">{{ t('research.levelRange') }}</TableHead>
<TableHead class="text-center">{{ t('resources.metal') }}</TableHead>
<TableHead class="text-center">{{ t('resources.crystal') }}</TableHead>
<TableHead class="text-center">{{ t('resources.deuterium') }}</TableHead>
<TableHead class="text-center">{{ t('research.researchTime') }}</TableHead>
<TableHead class="text-center">{{ t('player.points') }}</TableHead>
</TableRow>
</TableHeader>
<TableBody>
<TableRow v-for="level in levelRange" :key="level" :class="{ 'bg-muted/50': level === currentLevel }">
<TableCell class="text-center font-medium">
<Badge v-if="level === currentLevel" variant="default">{{ level }}</Badge>
<span v-else>{{ level }}</span>
</TableCell>
<TableCell class="text-center text-sm">
<NumberWithTooltip :value="getLevelData(level).cost.metal" />
</TableCell>
<TableCell class="text-center text-sm">
<NumberWithTooltip :value="getLevelData(level).cost.crystal" />
</TableCell>
<TableCell class="text-center text-sm">
<NumberWithTooltip :value="getLevelData(level).cost.deuterium" />
</TableCell>
<TableCell class="text-center text-sm">{{ formatTime(getLevelData(level).researchTime) }}</TableCell>
<TableCell class="text-center text-sm">
<span class="text-primary font-medium">
+
<NumberWithTooltip :value="getLevelData(level).points" />
</span>
</TableCell>
</TableRow>
</TableBody>
</Table>
</div>
<!-- 累积统计 -->
<div class="grid grid-cols-2 gap-4">
<Card>
<CardHeader class="pb-3">
<CardTitle class="text-sm">{{ t('research.totalCost') }}</CardTitle>
</CardHeader>
<CardContent class="space-y-2">
<div class="flex items-center justify-between text-sm">
<span class="text-muted-foreground">{{ t('resources.metal') }}:</span>
<span class="font-medium">
<NumberWithTooltip :value="totalStats.metal" />
</span>
</div>
<div class="flex items-center justify-between text-sm">
<span class="text-muted-foreground">{{ t('resources.crystal') }}:</span>
<span class="font-medium">
<NumberWithTooltip :value="totalStats.crystal" />
</span>
</div>
<div class="flex items-center justify-between text-sm">
<span class="text-muted-foreground">{{ t('resources.deuterium') }}:</span>
<span class="font-medium">
<NumberWithTooltip :value="totalStats.deuterium" />
</span>
</div>
</CardContent>
</Card>
<Card>
<CardHeader class="pb-3">
<CardTitle class="text-sm">{{ t('research.totalPoints') }}</CardTitle>
</CardHeader>
<CardContent>
<div class="text-3xl font-bold text-primary">
<NumberWithTooltip :value="totalStats.points" />
</div>
<p class="text-xs text-muted-foreground mt-1">
{{ t('research.levelRange') }}: {{ Math.max(0, currentLevel - 10) }} - {{ Math.min(currentLevel + 10, currentLevel + 10) }}
</p>
</CardContent>
</Card>
</div>
</div>
</template>
<script setup lang="ts">
import { computed } from 'vue'
import { useI18n } from '@/composables/useI18n'
import type { TechnologyType } from '@/types/game'
import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '@/components/ui/table'
import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'
import { Badge } from '@/components/ui/badge'
import NumberWithTooltip from '@/components/NumberWithTooltip.vue'
import * as researchLogic from '@/logic/researchLogic'
import * as pointsLogic from '@/logic/pointsLogic'
import { formatTime } from '@/utils/format'
const { t } = useI18n()
const props = defineProps<{
technologyType: TechnologyType
currentLevel: number
}>()
// 等级范围:当前等级 +10
const levelRange = computed(() => {
const end = props.currentLevel + 10
const levels = []
for (let i = props.currentLevel; i <= end; i++) {
levels.push(i)
}
return levels
})
// 获取某个等级的详细数据
const getLevelData = (level: number) => {
if (level === 0) {
return {
cost: { metal: 0, crystal: 0, deuterium: 0 },
researchTime: 0,
points: 0
}
}
const cost = researchLogic.calculateTechnologyCost(props.technologyType, level)
const researchTime = researchLogic.calculateTechnologyTime(props.technologyType, level - 1)
// 计算积分
const points = pointsLogic.calculateTechnologyPoints(props.technologyType, level - 1, level)
return {
cost,
researchTime,
points
}
}
// 累积统计
const totalStats = computed(() => {
let metal = 0
let crystal = 0
let deuterium = 0
let points = 0
for (const level of levelRange.value) {
if (level === 0) continue
const data = getLevelData(level)
metal += data.cost.metal
crystal += data.cost.crystal
deuterium += data.cost.deuterium
points += data.points
}
return { metal, crystal, deuterium, points }
})
</script>

View File

@@ -4,7 +4,7 @@ import { cva } from 'class-variance-authority'
export { default as Badge } from './Badge.vue' export { default as Badge } from './Badge.vue'
export const badgeVariants = cva( export const badgeVariants = cva(
'inline-flex items-center justify-center rounded-full border px-2 py-0.5 text-xs font-medium w-fit whitespace-nowrap shrink-0 [&>svg]:size-3 gap-1 [&>svg]:pointer-events-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive transition-[color,box-shadow] overflow-hidden', 'inline-flex items-center justify-center rounded-sm border h-5 min-w-5 px-1 text-xs font-medium tabular-nums select-none w-fit whitespace-nowrap shrink-0 [&>svg]:size-3 gap-1 [&>svg]:pointer-events-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive transition-[color,box-shadow] overflow-hidden',
{ {
variants: { variants: {
variant: { variant: {

View File

@@ -5,20 +5,20 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import type { PrimitiveProps } from 'reka-ui' import type { PrimitiveProps } from 'reka-ui'
import type { HTMLAttributes } from 'vue' import type { HTMLAttributes } from 'vue'
import type { ButtonVariants } from '.' import type { ButtonVariants } from '.'
import { Primitive } from 'reka-ui' import { Primitive } from 'reka-ui'
import { cn } from '@/lib/utils' import { cn } from '@/lib/utils'
import { buttonVariants } from '.' import { buttonVariants } from '.'
interface Props extends PrimitiveProps { interface Props extends PrimitiveProps {
variant?: ButtonVariants['variant'] variant?: ButtonVariants['variant']
size?: ButtonVariants['size'] size?: ButtonVariants['size']
class?: HTMLAttributes['class'] class?: HTMLAttributes['class']
} }
const props = withDefaults(defineProps<Props>(), { const props = withDefaults(defineProps<Props>(), {
as: 'button' as: 'button'
}) })
</script> </script>

View File

@@ -0,0 +1,35 @@
<template>
<CheckboxRoot
v-slot="slotProps"
data-slot="checkbox"
v-bind="forwarded"
:class="
cn(
'peer border-input data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground data-[state=checked]:border-primary focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive size-4 shrink-0 rounded-[4px] border shadow-xs transition-shadow outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50',
props.class
)
"
>
<CheckboxIndicator data-slot="checkbox-indicator" class="grid place-content-center text-current transition-none">
<slot v-bind="slotProps">
<Check class="size-3.5" />
</slot>
</CheckboxIndicator>
</CheckboxRoot>
</template>
<script setup lang="ts">
import type { CheckboxRootEmits, CheckboxRootProps } from 'reka-ui'
import type { HTMLAttributes } from 'vue'
import { reactiveOmit } from '@vueuse/core'
import { Check } from 'lucide-vue-next'
import { CheckboxIndicator, CheckboxRoot, useForwardPropsEmits } from 'reka-ui'
import { cn } from '@/lib/utils'
const props = defineProps<CheckboxRootProps & { class?: HTMLAttributes['class'] }>()
const emits = defineEmits<CheckboxRootEmits>()
const delegatedProps = reactiveOmit(props, 'class')
const forwarded = useForwardPropsEmits(delegatedProps, emits)
</script>

View File

@@ -0,0 +1 @@
export { default as Checkbox } from './Checkbox.vue'

View File

@@ -0,0 +1,71 @@
<template>
<DialogPortal>
<DialogOverlay />
<DialogContent
data-slot="scrollable-dialog-content"
v-bind="{ ...$attrs, ...forwarded }"
:class="
cn(
'bg-background data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 fixed top-[50%] left-[50%] z-50 w-[calc(100vw-3rem)] translate-x-[-50%] translate-y-[-50%] rounded-lg border shadow-lg duration-200 sm:w-auto flex flex-col p-0',
containerClass
)
"
>
<!-- 固定的头部 -->
<div class="shrink-0 px-4 pt-4 pb-3 sm:px-6 sm:pt-6 sm:pb-4 border-b">
<slot name="header" />
</div>
<!-- 可滚动的内容区域 -->
<div class="overflow-y-auto px-4 py-3 sm:px-6 sm:py-4">
<slot />
</div>
<!-- 可选的固定底部 -->
<div v-if="$slots.footer" class="shrink-0 px-4 pb-4 pt-3 sm:px-6 sm:pb-6 sm:pt-4 border-t">
<slot name="footer" />
</div>
<!-- 关闭按钮 -->
<DialogClose
v-if="showCloseButton"
data-slot="dialog-close"
class="ring-offset-background focus:ring-ring data-[state=open]:bg-accent data-[state=open]:text-muted-foreground absolute top-4 right-4 rounded-xs opacity-70 transition-opacity hover:opacity-100 focus:ring-2 focus:ring-offset-2 focus:outline-hidden disabled:pointer-events-none [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 z-10"
>
<X />
<span class="sr-only">Close</span>
</DialogClose>
</DialogContent>
</DialogPortal>
</template>
<script setup lang="ts">
import type { DialogContentEmits, DialogContentProps } from 'reka-ui'
import type { HTMLAttributes } from 'vue'
import { reactiveOmit } from '@vueuse/core'
import { X } from 'lucide-vue-next'
import { DialogClose, DialogContent, DialogPortal, useForwardPropsEmits } from 'reka-ui'
import { cn } from '@/lib/utils'
import DialogOverlay from './DialogOverlay.vue'
defineOptions({
inheritAttrs: false
})
const props = withDefaults(
defineProps<
DialogContentProps & {
containerClass?: HTMLAttributes['class']
showCloseButton?: boolean
}
>(),
{
showCloseButton: true
}
)
const emits = defineEmits<DialogContentEmits>()
const delegatedProps = reactiveOmit(props, 'containerClass')
const forwarded = useForwardPropsEmits(delegatedProps, emits)
</script>

View File

@@ -6,5 +6,6 @@ export { default as DialogFooter } from './DialogFooter.vue'
export { default as DialogHeader } from './DialogHeader.vue' export { default as DialogHeader } from './DialogHeader.vue'
export { default as DialogOverlay } from './DialogOverlay.vue' export { default as DialogOverlay } from './DialogOverlay.vue'
export { default as DialogScrollContent } from './DialogScrollContent.vue' export { default as DialogScrollContent } from './DialogScrollContent.vue'
export { default as ScrollableDialogContent } from './ScrollableDialogContent.vue'
export { default as DialogTitle } from './DialogTitle.vue' export { default as DialogTitle } from './DialogTitle.vue'
export { default as DialogTrigger } from './DialogTrigger.vue' export { default as DialogTrigger } from './DialogTrigger.vue'

View File

@@ -0,0 +1,28 @@
<template>
<PaginationRoot
v-slot="slotProps"
data-slot="pagination"
v-bind="forwarded"
:class="cn('mx-auto flex w-full justify-center', props.class)"
>
<slot v-bind="slotProps" />
</PaginationRoot>
</template>
<script setup lang="ts">
import type { PaginationRootEmits, PaginationRootProps } from 'reka-ui'
import type { HTMLAttributes } from 'vue'
import { reactiveOmit } from '@vueuse/core'
import { PaginationRoot, useForwardPropsEmits } from 'reka-ui'
import { cn } from '@/lib/utils'
const props = defineProps<
PaginationRootProps & {
class?: HTMLAttributes['class']
}
>()
const emits = defineEmits<PaginationRootEmits>()
const delegatedProps = reactiveOmit(props, 'class')
const forwarded = useForwardPropsEmits(delegatedProps, emits)
</script>

View File

@@ -0,0 +1,22 @@
<template>
<PaginationList
v-slot="slotProps"
data-slot="pagination-content"
v-bind="delegatedProps"
:class="cn('flex flex-row items-center gap-1', props.class)"
>
<slot v-bind="slotProps" />
</PaginationList>
</template>
<script setup lang="ts">
import type { PaginationListProps } from 'reka-ui'
import type { HTMLAttributes } from 'vue'
import { reactiveOmit } from '@vueuse/core'
import { PaginationList } from 'reka-ui'
import { cn } from '@/lib/utils'
const props = defineProps<PaginationListProps & { class?: HTMLAttributes['class'] }>()
const delegatedProps = reactiveOmit(props, 'class')
</script>

View File

@@ -0,0 +1,25 @@
<template>
<PaginationEllipsis
data-slot="pagination-ellipsis"
v-bind="delegatedProps"
:class="cn('flex size-9 items-center justify-center', props.class)"
>
<slot>
<MoreHorizontal class="size-4" />
<span class="sr-only">More pages</span>
</slot>
</PaginationEllipsis>
</template>
<script setup lang="ts">
import type { PaginationEllipsisProps } from 'reka-ui'
import type { HTMLAttributes } from 'vue'
import { reactiveOmit } from '@vueuse/core'
import { MoreHorizontal } from 'lucide-vue-next'
import { PaginationEllipsis } from 'reka-ui'
import { cn } from '@/lib/utils'
const props = defineProps<PaginationEllipsisProps & { class?: HTMLAttributes['class'] }>()
const delegatedProps = reactiveOmit(props, 'class')
</script>

View File

@@ -0,0 +1,38 @@
<template>
<PaginationFirst
data-slot="pagination-first"
:class="cn(buttonVariants({ variant: 'ghost', size }), 'gap-1 px-2.5 sm:pr-2.5', props.class)"
v-bind="forwarded"
>
<slot>
<ChevronLeftIcon />
<span class="hidden sm:block">First</span>
</slot>
</PaginationFirst>
</template>
<script setup lang="ts">
import type { PaginationFirstProps } from 'reka-ui'
import type { HTMLAttributes } from 'vue'
import type { ButtonVariants } from '@/components/ui/button'
import { reactiveOmit } from '@vueuse/core'
import { ChevronLeftIcon } from 'lucide-vue-next'
import { PaginationFirst, useForwardProps } from 'reka-ui'
import { cn } from '@/lib/utils'
import { buttonVariants } from '@/components/ui/button'
const props = withDefaults(
defineProps<
PaginationFirstProps & {
size?: ButtonVariants['size']
class?: HTMLAttributes['class']
}
>(),
{
size: 'default'
}
)
const delegatedProps = reactiveOmit(props, 'class', 'size')
const forwarded = useForwardProps(delegatedProps)
</script>

View File

@@ -0,0 +1,42 @@
<template>
<PaginationListItem
data-slot="pagination-item"
v-bind="delegatedProps"
:class="
cn(
buttonVariants({
variant: isActive ? 'outline' : 'ghost',
size
}),
props.class
)
"
>
<slot />
</PaginationListItem>
</template>
<script setup lang="ts">
import type { PaginationListItemProps } from 'reka-ui'
import type { HTMLAttributes } from 'vue'
import type { ButtonVariants } from '@/components/ui/button'
import { reactiveOmit } from '@vueuse/core'
import { PaginationListItem } from 'reka-ui'
import { cn } from '@/lib/utils'
import { buttonVariants } from '@/components/ui/button'
const props = withDefaults(
defineProps<
PaginationListItemProps & {
size?: ButtonVariants['size']
class?: HTMLAttributes['class']
isActive?: boolean
}
>(),
{
size: 'icon'
}
)
const delegatedProps = reactiveOmit(props, 'class', 'size', 'isActive')
</script>

View File

@@ -0,0 +1,38 @@
<template>
<PaginationLast
data-slot="pagination-last"
:class="cn(buttonVariants({ variant: 'ghost', size }), 'gap-1 px-2.5 sm:pr-2.5', props.class)"
v-bind="forwarded"
>
<slot>
<span class="hidden sm:block">Last</span>
<ChevronRightIcon />
</slot>
</PaginationLast>
</template>
<script setup lang="ts">
import type { PaginationLastProps } from 'reka-ui'
import type { HTMLAttributes } from 'vue'
import type { ButtonVariants } from '@/components/ui/button'
import { reactiveOmit } from '@vueuse/core'
import { ChevronRightIcon } from 'lucide-vue-next'
import { PaginationLast, useForwardProps } from 'reka-ui'
import { cn } from '@/lib/utils'
import { buttonVariants } from '@/components/ui/button'
const props = withDefaults(
defineProps<
PaginationLastProps & {
size?: ButtonVariants['size']
class?: HTMLAttributes['class']
}
>(),
{
size: 'default'
}
)
const delegatedProps = reactiveOmit(props, 'class', 'size')
const forwarded = useForwardProps(delegatedProps)
</script>

View File

@@ -0,0 +1,38 @@
<template>
<PaginationNext
data-slot="pagination-next"
:class="cn(buttonVariants({ variant: 'ghost', size }), 'gap-1 px-2.5 sm:pr-2.5', props.class)"
v-bind="forwarded"
>
<slot>
<span class="hidden sm:block">Next</span>
<ChevronRightIcon />
</slot>
</PaginationNext>
</template>
<script setup lang="ts">
import type { PaginationNextProps } from 'reka-ui'
import type { HTMLAttributes } from 'vue'
import type { ButtonVariants } from '@/components/ui/button'
import { reactiveOmit } from '@vueuse/core'
import { ChevronRightIcon } from 'lucide-vue-next'
import { PaginationNext, useForwardProps } from 'reka-ui'
import { cn } from '@/lib/utils'
import { buttonVariants } from '@/components/ui/button'
const props = withDefaults(
defineProps<
PaginationNextProps & {
size?: ButtonVariants['size']
class?: HTMLAttributes['class']
}
>(),
{
size: 'default'
}
)
const delegatedProps = reactiveOmit(props, 'class', 'size')
const forwarded = useForwardProps(delegatedProps)
</script>

View File

@@ -0,0 +1,38 @@
<template>
<PaginationPrev
data-slot="pagination-previous"
:class="cn(buttonVariants({ variant: 'ghost', size }), 'gap-1 px-2.5 sm:pr-2.5', props.class)"
v-bind="forwarded"
>
<slot>
<ChevronLeftIcon />
<span class="hidden sm:block">Previous</span>
</slot>
</PaginationPrev>
</template>
<script setup lang="ts">
import type { PaginationPrevProps } from 'reka-ui'
import type { HTMLAttributes } from 'vue'
import type { ButtonVariants } from '@/components/ui/button'
import { reactiveOmit } from '@vueuse/core'
import { ChevronLeftIcon } from 'lucide-vue-next'
import { PaginationPrev, useForwardProps } from 'reka-ui'
import { cn } from '@/lib/utils'
import { buttonVariants } from '@/components/ui/button'
const props = withDefaults(
defineProps<
PaginationPrevProps & {
size?: ButtonVariants['size']
class?: HTMLAttributes['class']
}
>(),
{
size: 'default'
}
)
const delegatedProps = reactiveOmit(props, 'class', 'size')
const forwarded = useForwardProps(delegatedProps)
</script>

View File

@@ -0,0 +1,8 @@
export { default as Pagination } from './Pagination.vue'
export { default as PaginationContent } from './PaginationContent.vue'
export { default as PaginationEllipsis } from './PaginationEllipsis.vue'
export { default as PaginationFirst } from './PaginationFirst.vue'
export { default as PaginationItem } from './PaginationItem.vue'
export { default as PaginationLast } from './PaginationLast.vue'
export { default as PaginationNext } from './PaginationNext.vue'
export { default as PaginationPrevious } from './PaginationPrevious.vue'

View File

@@ -4,12 +4,13 @@
data-sidebar="menu-badge" data-sidebar="menu-badge"
:class=" :class="
cn( cn(
'text-sidebar-foreground pointer-events-none absolute right-1 flex h-5 min-w-5 items-center justify-center rounded-md px-1 text-xs font-medium tabular-nums select-none', 'text-sidebar-foreground pointer-events-none flex h-5 min-w-5 items-center justify-center rounded-sm px-1 text-xs font-medium tabular-nums select-none',
'peer-hover/menu-button:text-sidebar-accent-foreground peer-data-[active=true]/menu-button:text-sidebar-accent-foreground', 'peer-hover/menu-button:text-sidebar-accent-foreground peer-data-[active=true]/menu-button:text-sidebar-accent-foreground',
'absolute right-1',
'peer-data-[size=sm]/menu-button:top-1', 'peer-data-[size=sm]/menu-button:top-1',
'peer-data-[size=default]/menu-button:top-1.5', 'peer-data-[size=default]/menu-button:top-1.5',
'peer-data-[size=lg]/menu-button:top-2.5', 'peer-data-[size=lg]/menu-button:top-2.5',
'group-data-[collapsible=icon]:hidden', 'group-data-[collapsible=icon]:absolute group-data-[collapsible=icon]:right-0 group-data-[collapsible=icon]:-top-1 group-data-[collapsible=icon]:h-4 group-data-[collapsible=icon]:min-w-4',
props.class props.class
) )
" "

View File

@@ -53,19 +53,19 @@
passive: (props.open === undefined) as false passive: (props.open === undefined) as false
}) as Ref<boolean> }) as Ref<boolean>
function setOpen(value: boolean) { const setOpen = (value: boolean) => {
open.value = value // emits('update:open', value) open.value = value // emits('update:open', value)
// This sets the cookie to keep the sidebar state. // This sets the cookie to keep the sidebar state.
document.cookie = `${SIDEBAR_COOKIE_NAME}=${open.value}; path=/; max-age=${SIDEBAR_COOKIE_MAX_AGE}` document.cookie = `${SIDEBAR_COOKIE_NAME}=${open.value}; path=/; max-age=${SIDEBAR_COOKIE_MAX_AGE}`
} }
function setOpenMobile(value: boolean) { const setOpenMobile = (value: boolean) => {
openMobile.value = value openMobile.value = value
} }
// Helper to toggle the sidebar. // Helper to toggle the sidebar.
function toggleSidebar() { const toggleSidebar = () => {
return isMobile.value ? setOpenMobile(!openMobile.value) : setOpen(!open.value) return isMobile.value ? setOpenMobile(!openMobile.value) : setOpen(!open.value)
} }

View File

@@ -0,0 +1,19 @@
<template>
<TabsRoot v-slot="slotProps" data-slot="tabs" v-bind="forwarded" :class="cn('flex flex-col gap-2', props.class)">
<slot v-bind="slotProps" />
</TabsRoot>
</template>
<script setup lang="ts">
import type { TabsRootEmits, TabsRootProps } from 'reka-ui'
import type { HTMLAttributes } from 'vue'
import { reactiveOmit } from '@vueuse/core'
import { TabsRoot, useForwardPropsEmits } from 'reka-ui'
import { cn } from '@/lib/utils'
const props = defineProps<TabsRootProps & { class?: HTMLAttributes['class'] }>()
const emits = defineEmits<TabsRootEmits>()
const delegatedProps = reactiveOmit(props, 'class')
const forwarded = useForwardPropsEmits(delegatedProps, emits)
</script>

View File

@@ -0,0 +1,17 @@
<template>
<TabsContentRoot data-slot="tabs-content" :class="cn('flex-1 outline-none', props.class)" v-bind="delegatedProps">
<slot />
</TabsContentRoot>
</template>
<script setup lang="ts">
import type { TabsContentProps } from 'reka-ui'
import type { HTMLAttributes } from 'vue'
import { reactiveOmit } from '@vueuse/core'
import { TabsContent as TabsContentRoot } from 'reka-ui'
import { cn } from '@/lib/utils'
const props = defineProps<TabsContentProps & { class?: HTMLAttributes['class'] }>()
const delegatedProps = reactiveOmit(props, 'class')
</script>

View File

@@ -0,0 +1,27 @@
<template>
<TabsListRoot
data-slot="tabs-list"
v-bind="delegatedProps"
:class="
cn(
'bg-muted text-muted-foreground inline-flex w-fit items-center justify-center rounded-lg p-[3px]',
tabCount && tabCount > 3 ? (tabCount > 6 ? 'h-[85px] sm:h-9' : 'h-[65px] sm:h-9') : 'h-9',
props.class
)
"
>
<slot />
</TabsListRoot>
</template>
<script setup lang="ts">
import type { TabsListProps } from 'reka-ui'
import type { HTMLAttributes } from 'vue'
import { reactiveOmit } from '@vueuse/core'
import { TabsList as TabsListRoot } from 'reka-ui'
import { cn } from '@/lib/utils'
const props = defineProps<TabsListProps & { class?: HTMLAttributes['class']; tabCount?: number }>()
const delegatedProps = reactiveOmit(props, 'class', 'tabCount')
</script>

View File

@@ -0,0 +1,34 @@
<template>
<TabsTriggerRoot
data-slot="tabs-trigger"
:class="
cn(
'inline-flex h-[calc(100%-1px)] flex-1 items-center justify-center gap-1.5 rounded-md border border-transparent px-2 py-1 text-sm font-medium whitespace-nowrap transition-all',
'text-muted-foreground hover:text-foreground',
'data-[state=active]:bg-background data-[state=active]:text-foreground data-[state=active]:shadow-md data-[state=active]:border-border',
'dark:data-[state=active]:bg-background dark:data-[state=active]:text-foreground dark:data-[state=active]:border-border dark:data-[state=active]:shadow-lg',
'focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:outline-ring focus-visible:ring-[3px] focus-visible:outline-1',
'disabled:pointer-events-none disabled:opacity-50',
'[&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*=\'size-\'])]:size-4',
props.class
)
"
v-bind="forwardedProps"
>
<slot />
</TabsTriggerRoot>
</template>
<script setup lang="ts">
import type { TabsTriggerProps } from 'reka-ui'
import type { HTMLAttributes } from 'vue'
import { reactiveOmit } from '@vueuse/core'
import { TabsTrigger as TabsTriggerRoot, useForwardProps } from 'reka-ui'
import { cn } from '@/lib/utils'
const props = defineProps<TabsTriggerProps & { class?: HTMLAttributes['class'] }>()
const delegatedProps = reactiveOmit(props, 'class')
const forwardedProps = useForwardProps(delegatedProps)
</script>

View File

@@ -0,0 +1,4 @@
export { default as Tabs } from './Tabs.vue'
export { default as TabsContent } from './TabsContent.vue'
export { default as TabsList } from './TabsList.vue'
export { default as TabsTrigger } from './TabsTrigger.vue'

View File

@@ -25,6 +25,7 @@ export const useGameConfig = () => {
[BuildingType.CrystalMine]: 'crystalMine', [BuildingType.CrystalMine]: 'crystalMine',
[BuildingType.DeuteriumSynthesizer]: 'deuteriumSynthesizer', [BuildingType.DeuteriumSynthesizer]: 'deuteriumSynthesizer',
[BuildingType.SolarPlant]: 'solarPlant', [BuildingType.SolarPlant]: 'solarPlant',
[BuildingType.FusionReactor]: 'fusionReactor',
[BuildingType.RoboticsFactory]: 'roboticsFactory', [BuildingType.RoboticsFactory]: 'roboticsFactory',
[BuildingType.NaniteFactory]: 'naniteFactory', [BuildingType.NaniteFactory]: 'naniteFactory',
[BuildingType.Shipyard]: 'shipyard', [BuildingType.Shipyard]: 'shipyard',
@@ -33,6 +34,8 @@ export const useGameConfig = () => {
[BuildingType.CrystalStorage]: 'crystalStorage', [BuildingType.CrystalStorage]: 'crystalStorage',
[BuildingType.DeuteriumTank]: 'deuteriumTank', [BuildingType.DeuteriumTank]: 'deuteriumTank',
[BuildingType.DarkMatterCollector]: 'darkMatterCollector', [BuildingType.DarkMatterCollector]: 'darkMatterCollector',
[BuildingType.DarkMatterTank]: 'darkMatterTank',
[BuildingType.MissileSilo]: 'missileSilo',
[BuildingType.Terraformer]: 'terraformer', [BuildingType.Terraformer]: 'terraformer',
[BuildingType.LunarBase]: 'lunarBase', [BuildingType.LunarBase]: 'lunarBase',
[BuildingType.SensorPhalanx]: 'sensorPhalanx', [BuildingType.SensorPhalanx]: 'sensorPhalanx',
@@ -46,11 +49,15 @@ export const useGameConfig = () => {
[ShipType.HeavyFighter]: 'heavyFighter', [ShipType.HeavyFighter]: 'heavyFighter',
[ShipType.Cruiser]: 'cruiser', [ShipType.Cruiser]: 'cruiser',
[ShipType.Battleship]: 'battleship', [ShipType.Battleship]: 'battleship',
[ShipType.Battlecruiser]: 'battlecruiser',
[ShipType.Bomber]: 'bomber',
[ShipType.Destroyer]: 'destroyer',
[ShipType.SmallCargo]: 'smallCargo', [ShipType.SmallCargo]: 'smallCargo',
[ShipType.LargeCargo]: 'largeCargo', [ShipType.LargeCargo]: 'largeCargo',
[ShipType.ColonyShip]: 'colonyShip', [ShipType.ColonyShip]: 'colonyShip',
[ShipType.Recycler]: 'recycler', [ShipType.Recycler]: 'recycler',
[ShipType.EspionageProbe]: 'espionageProbe', [ShipType.EspionageProbe]: 'espionageProbe',
[ShipType.SolarSatellite]: 'solarSatellite',
[ShipType.DarkMatterHarvester]: 'darkMatterHarvester', [ShipType.DarkMatterHarvester]: 'darkMatterHarvester',
[ShipType.Deathstar]: 'deathstar' [ShipType.Deathstar]: 'deathstar'
} }
@@ -65,6 +72,8 @@ export const useGameConfig = () => {
[DefenseType.PlasmaTurret]: 'plasmaTurret', [DefenseType.PlasmaTurret]: 'plasmaTurret',
[DefenseType.SmallShieldDome]: 'smallShieldDome', [DefenseType.SmallShieldDome]: 'smallShieldDome',
[DefenseType.LargeShieldDome]: 'largeShieldDome', [DefenseType.LargeShieldDome]: 'largeShieldDome',
[DefenseType.AntiBallisticMissile]: 'antiBallisticMissile',
[DefenseType.InterplanetaryMissile]: 'interplanetaryMissile',
[DefenseType.PlanetaryShield]: 'planetaryShield' [DefenseType.PlanetaryShield]: 'planetaryShield'
} }
@@ -76,6 +85,12 @@ export const useGameConfig = () => {
[TechnologyType.HyperspaceTechnology]: 'hyperspaceTechnology', [TechnologyType.HyperspaceTechnology]: 'hyperspaceTechnology',
[TechnologyType.PlasmaTechnology]: 'plasmaTechnology', [TechnologyType.PlasmaTechnology]: 'plasmaTechnology',
[TechnologyType.ComputerTechnology]: 'computerTechnology', [TechnologyType.ComputerTechnology]: 'computerTechnology',
[TechnologyType.EspionageTechnology]: 'espionageTechnology',
[TechnologyType.WeaponsTechnology]: 'weaponsTechnology',
[TechnologyType.ShieldingTechnology]: 'shieldingTechnology',
[TechnologyType.ArmourTechnology]: 'armourTechnology',
[TechnologyType.Astrophysics]: 'astrophysics',
[TechnologyType.GravitonTechnology]: 'gravitonTechnology',
[TechnologyType.CombustionDrive]: 'combustionDrive', [TechnologyType.CombustionDrive]: 'combustionDrive',
[TechnologyType.ImpulseDrive]: 'impulseDrive', [TechnologyType.ImpulseDrive]: 'impulseDrive',
[TechnologyType.HyperspaceDrive]: 'hyperspaceDrive', [TechnologyType.HyperspaceDrive]: 'hyperspaceDrive',

View File

@@ -0,0 +1,63 @@
import { useGameStore } from '@/stores/gameStore'
import { useUniverseStore } from '@/stores/universeStore'
import * as gameLogic from '@/logic/gameLogic'
import * as planetLogic from '@/logic/planetLogic'
import * as resourceLogic from '@/logic/resourceLogic'
import * as officerLogic from '@/logic/officerLogic'
/**
* 游戏生命周期管理
* 处理游戏初始化、NPC星球生成等
*/
export const useGameLifecycle = () => {
const gameStore = useGameStore()
const universeStore = useUniverseStore()
/**
* 生成NPC星球
*/
const generateNPCPlanets = (npcCount: number, planetPrefix: string) => {
for (let i = 0; i < npcCount; i++) {
const position = gameLogic.generateRandomPosition()
const key = gameLogic.generatePositionKey(position.galaxy, position.system, position.position)
if (universeStore.planets[key]) continue
const npcPlanet = planetLogic.createNPCPlanet(i, position, planetPrefix)
universeStore.planets[key] = npcPlanet
}
}
/**
* 初始化游戏
*/
const initGame = async (playerName: string, homePlanetName: string, planetPrefix: string) => {
const shouldInit = gameLogic.shouldInitializeGame(gameStore.player.planets)
if (!shouldInit) {
const now = Date.now()
// 计算离线收益(直接同步计算)
const bonuses = officerLogic.calculateActiveBonuses(gameStore.player.officers, now)
gameStore.player.planets.forEach(planet => {
resourceLogic.updatePlanetResources(planet, now, bonuses)
})
// 只在没有NPC星球时才生成首次加载已有玩家数据时
if (Object.keys(universeStore.planets).length === 0) {
generateNPCPlanets(200, planetPrefix)
}
return
}
gameStore.player = gameLogic.initializePlayer(gameStore.player.id, playerName)
const initialPlanet = planetLogic.createInitialPlanet(gameStore.player.id, homePlanetName)
gameStore.player.planets = [initialPlanet]
gameStore.currentPlanetId = initialPlanet.id
// 新玩家初始化时生成NPC星球
generateNPCPlanets(200, planetPrefix)
}
return {
initGame,
generateNPCPlanets
}
}

View File

@@ -0,0 +1,68 @@
import { useGameStore } from '@/stores/gameStore'
import { useNPCStore } from '@/stores/npcStore'
import type { FleetMission } from '@/types/game'
import * as gameLogic from '@/logic/gameLogic'
/**
* 游戏更新循环
* 处理游戏状态的定期更新
*/
export const useGameUpdate = (
processMissionArrival: (mission: FleetMission) => Promise<void>,
processMissionReturn: (mission: FleetMission) => void,
processNPCMissionArrival: (npc: any, mission: FleetMission) => void,
processNPCMissionReturn: (npc: any, mission: FleetMission) => void,
updateNPCGrowth: (deltaSeconds: number) => void,
updateNPCBehavior: (deltaSeconds: number) => void
) => {
const gameStore = useGameStore()
const npcStore = useNPCStore()
/**
* 游戏主更新函数
*/
const updateGame = () => {
if (gameStore.isPaused) return
const now = Date.now()
gameStore.gameTime = now
// 检查军官过期
gameLogic.checkOfficersExpiration(gameStore.player.officers, now)
// 处理游戏更新(建造队列、研究队列等)
const result = gameLogic.processGameUpdate(gameStore.player, now)
gameStore.player.researchQueue = result.updatedResearchQueue
// 处理舰队任务
gameStore.player.fleetMissions.forEach(mission => {
if (mission.status === 'outbound' && now >= mission.arrivalTime) {
processMissionArrival(mission)
} else if (mission.status === 'returning' && mission.returnTime && now >= mission.returnTime) {
processMissionReturn(mission)
}
})
// 处理NPC舰队任务
npcStore.npcs.forEach(npc => {
if (npc.fleetMissions) {
npc.fleetMissions.forEach(mission => {
if (mission.status === 'outbound' && now >= mission.arrivalTime) {
processNPCMissionArrival(npc, mission)
} else if (mission.status === 'returning' && mission.returnTime && now >= mission.returnTime) {
processNPCMissionReturn(npc, mission)
}
})
}
})
// NPC成长系统更新
updateNPCGrowth(1) // 传入1秒的时间间隔
// NPC行为系统更新侦查和攻击决策
updateNPCBehavior(1)
}
return {
updateGame
}
}

View File

@@ -0,0 +1,249 @@
import { useGameStore } from '@/stores/gameStore'
import { useUniverseStore } from '@/stores/universeStore'
import { useNPCStore } from '@/stores/npcStore'
import type { FleetMission } from '@/types/game'
import { MissionType } from '@/types/game'
import * as gameLogic from '@/logic/gameLogic'
import * as fleetLogic from '@/logic/fleetLogic'
import * as shipLogic from '@/logic/shipLogic'
import * as resourceLogic from '@/logic/resourceLogic'
import * as diplomaticLogic from '@/logic/diplomaticLogic'
/**
* 舰队任务处理
* 处理玩家舰队任务的到达和返回
*/
export const useMissionHandler = (t: (key: string) => string) => {
const gameStore = useGameStore()
const universeStore = useUniverseStore()
const npcStore = useNPCStore()
/**
* 处理任务到达
*/
const processMissionArrival = async (mission: FleetMission) => {
// 从宇宙星球地图中查找目标星球
const targetKey = gameLogic.generatePositionKey(
mission.targetPosition.galaxy,
mission.targetPosition.system,
mission.targetPosition.position
)
// 先从玩家星球中查找,再从宇宙地图中查找
const targetPlanet =
gameStore.player.planets.find(
p =>
p.position.galaxy === mission.targetPosition.galaxy &&
p.position.system === mission.targetPosition.system &&
p.position.position === mission.targetPosition.position
) || universeStore.planets[targetKey]
// 获取起始星球名称(用于报告)
const originPlanet = gameStore.player.planets.find(p => p.id === mission.originPlanetId)
const originPlanetName = originPlanet?.name || t('fleetView.unknownPlanet')
if (mission.missionType === MissionType.Transport) {
const result = fleetLogic.processTransportArrival(mission, targetPlanet, gameStore.player, npcStore.npcs)
// 生成运输任务报告
if (!gameStore.player.missionReports) {
gameStore.player.missionReports = []
}
gameStore.player.missionReports.push({
id: `mission-report-${mission.id}`,
timestamp: Date.now(),
missionType: MissionType.Transport,
originPlanetId: mission.originPlanetId,
originPlanetName,
targetPosition: mission.targetPosition,
targetPlanetId: targetPlanet?.id,
targetPlanetName:
targetPlanet?.name || `[${mission.targetPosition.galaxy}:${mission.targetPosition.system}:${mission.targetPosition.position}]`,
success: result.success,
message: result.success ? t('missionReports.transportSuccess') : t('missionReports.transportFailed'),
details: {
transportedResources: mission.cargo
},
read: false
})
} else if (mission.missionType === MissionType.Attack) {
const attackResult = await fleetLogic.processAttackArrival(mission, targetPlanet, gameStore.player, null, gameStore.player.planets)
if (attackResult) {
gameStore.player.battleReports.push(attackResult.battleResult)
// 检查是否攻击了NPC星球更新外交关系
if (targetPlanet) {
const targetNpc = npcStore.npcs.find(npc => npc.planets.some(p => p.id === targetPlanet.id))
if (targetNpc) {
diplomaticLogic.handleAttackReputation(gameStore.player, targetNpc, attackResult.battleResult, npcStore.npcs)
}
}
if (attackResult.moon) {
gameStore.player.planets.push(attackResult.moon)
}
if (attackResult.debrisField) {
// 将残骸场添加到游戏状态
universeStore.debrisFields[attackResult.debrisField.id] = attackResult.debrisField
}
}
} else if (mission.missionType === MissionType.Colonize) {
const newPlanet = fleetLogic.processColonizeArrival(mission, targetPlanet, gameStore.player, t('planet.colonyPrefix'))
// 生成殖民任务报告
if (!gameStore.player.missionReports) {
gameStore.player.missionReports = []
}
gameStore.player.missionReports.push({
id: `mission-report-${mission.id}`,
timestamp: Date.now(),
missionType: MissionType.Colonize,
originPlanetId: mission.originPlanetId,
originPlanetName,
targetPosition: mission.targetPosition,
targetPlanetId: newPlanet?.id,
targetPlanetName: newPlanet?.name,
success: !!newPlanet,
message: newPlanet ? t('missionReports.colonizeSuccess') : t('missionReports.colonizeFailed'),
details: newPlanet
? {
newPlanetId: newPlanet.id,
newPlanetName: newPlanet.name
}
: undefined,
read: false
})
if (newPlanet) {
gameStore.player.planets.push(newPlanet)
}
} else if (mission.missionType === MissionType.Spy) {
const spyReport = fleetLogic.processSpyArrival(mission, targetPlanet, gameStore.player, null, npcStore.npcs)
if (spyReport) gameStore.player.spyReports.push(spyReport)
} else if (mission.missionType === MissionType.Deploy) {
const deployed = fleetLogic.processDeployArrival(mission, targetPlanet, gameStore.player.id)
// 生成部署任务报告
if (!gameStore.player.missionReports) {
gameStore.player.missionReports = []
}
gameStore.player.missionReports.push({
id: `mission-report-${mission.id}`,
timestamp: Date.now(),
missionType: MissionType.Deploy,
originPlanetId: mission.originPlanetId,
originPlanetName,
targetPosition: mission.targetPosition,
targetPlanetId: targetPlanet?.id,
targetPlanetName:
targetPlanet?.name || `[${mission.targetPosition.galaxy}:${mission.targetPosition.system}:${mission.targetPosition.position}]`,
success: deployed,
message: deployed ? t('missionReports.deploySuccess') : t('missionReports.deployFailed'),
details: {
deployedFleet: mission.fleet
},
read: false
})
if (deployed) {
const missionIndex = gameStore.player.fleetMissions.indexOf(mission)
if (missionIndex > -1) gameStore.player.fleetMissions.splice(missionIndex, 1)
return
}
} else if (mission.missionType === MissionType.Recycle) {
// 处理回收任务
const debrisId = `debris_${mission.targetPosition.galaxy}_${mission.targetPosition.system}_${mission.targetPosition.position}`
const debrisField = universeStore.debrisFields[debrisId]
const recycleResult = fleetLogic.processRecycleArrival(mission, debrisField)
// 生成回收任务报告
if (!gameStore.player.missionReports) {
gameStore.player.missionReports = []
}
gameStore.player.missionReports.push({
id: `mission-report-${mission.id}`,
timestamp: Date.now(),
missionType: MissionType.Recycle,
originPlanetId: mission.originPlanetId,
originPlanetName,
targetPosition: mission.targetPosition,
success: !!recycleResult,
message: recycleResult ? t('missionReports.recycleSuccess') : t('missionReports.recycleFailed'),
details: recycleResult
? {
recycledResources: recycleResult.collectedResources,
remainingDebris: recycleResult.remainingDebris || undefined
}
: undefined,
read: false
})
if (recycleResult && debrisField) {
if (recycleResult.remainingDebris && (recycleResult.remainingDebris.metal > 0 || recycleResult.remainingDebris.crystal > 0)) {
// 更新残骸场
universeStore.debrisFields[debrisId] = {
id: debrisField.id,
position: debrisField.position,
resources: recycleResult.remainingDebris,
createdAt: debrisField.createdAt,
expiresAt: debrisField.expiresAt
}
} else {
// 残骸场已被完全收集,删除
delete universeStore.debrisFields[debrisId]
}
}
} else if (mission.missionType === MissionType.Destroy) {
// 处理行星毁灭任务
const destroyResult = fleetLogic.processDestroyArrival(mission, targetPlanet, gameStore.player)
// 生成毁灭任务报告
if (!gameStore.player.missionReports) {
gameStore.player.missionReports = []
}
gameStore.player.missionReports.push({
id: `mission-report-${mission.id}`,
timestamp: Date.now(),
missionType: MissionType.Destroy,
originPlanetId: mission.originPlanetId,
originPlanetName,
targetPosition: mission.targetPosition,
targetPlanetId: targetPlanet?.id,
targetPlanetName: targetPlanet?.name,
success: destroyResult?.success || false,
message: destroyResult?.success ? t('missionReports.destroySuccess') : t('missionReports.destroyFailed'),
details: destroyResult?.success
? {
destroyedPlanetName:
targetPlanet?.name ||
`[${mission.targetPosition.galaxy}:${mission.targetPosition.system}:${mission.targetPosition.position}]`
}
: undefined,
read: false
})
if (destroyResult && destroyResult.success && destroyResult.planetId) {
// 星球被摧毁
// 从玩家星球列表中移除(如果是玩家的星球)
const planetIndex = gameStore.player.planets.findIndex(p => p.id === destroyResult.planetId)
if (planetIndex > -1) {
gameStore.player.planets.splice(planetIndex, 1)
} else {
// 不是玩家星球,从宇宙地图中移除
delete universeStore.planets[targetKey]
}
}
}
}
/**
* 处理任务返回
*/
const processMissionReturn = (mission: FleetMission) => {
const originPlanet = gameStore.player.planets.find(p => p.id === mission.originPlanetId)
if (!originPlanet) return
shipLogic.addFleet(originPlanet.fleet, mission.fleet)
resourceLogic.addResources(originPlanet.resources, mission.cargo)
const missionIndex = gameStore.player.fleetMissions.indexOf(mission)
if (missionIndex > -1) gameStore.player.fleetMissions.splice(missionIndex, 1)
}
return {
processMissionArrival,
processMissionReturn
}
}

View File

@@ -0,0 +1,300 @@
import { useGameStore } from '@/stores/gameStore'
import { useUniverseStore } from '@/stores/universeStore'
import { useNPCStore } from '@/stores/npcStore'
import type { NPC, FleetMission, IncomingFleetAlert } from '@/types/game'
import { MissionType } from '@/types/game'
import * as gameLogic from '@/logic/gameLogic'
import * as fleetLogic from '@/logic/fleetLogic'
import * as shipLogic from '@/logic/shipLogic'
import * as npcGrowthLogic from '@/logic/npcGrowthLogic'
import * as npcBehaviorLogic from '@/logic/npcBehaviorLogic'
/**
* NPC处理
* 处理NPC舰队任务、成长系统、行为系统
*/
export const useNPCHandler = () => {
const gameStore = useGameStore()
const universeStore = useUniverseStore()
const npcStore = useNPCStore()
/**
* 移除即将到来的舰队警告
*/
const removeIncomingFleetAlert = (alert: IncomingFleetAlert) => {
if (!gameStore.player.incomingFleetAlerts) return
const index = gameStore.player.incomingFleetAlerts.indexOf(alert)
if (index > -1) {
gameStore.player.incomingFleetAlerts.splice(index, 1)
}
}
/**
* 根据任务ID移除即将到来的舰队警告
*/
const removeIncomingFleetAlertById = (missionId: string) => {
if (!gameStore.player.incomingFleetAlerts) return
const index = gameStore.player.incomingFleetAlerts.findIndex(a => a.id === missionId)
if (index > -1) {
gameStore.player.incomingFleetAlerts.splice(index, 1)
}
}
/**
* 处理NPC任务到达
*/
const processNPCMissionArrival = (npc: NPC, mission: FleetMission) => {
if (mission.missionType === MissionType.Recycle) {
// NPC回收任务到达
const debrisId = mission.debrisFieldId
if (!debrisId) {
console.warn('[NPC Mission] Recycle mission missing debrisFieldId')
mission.status = 'returning'
mission.returnTime = Date.now() + (mission.arrivalTime - mission.departureTime)
return
}
const debrisField = universeStore.debrisFields[debrisId]
const recycleResult = fleetLogic.processRecycleArrival(mission, debrisField)
if (recycleResult && debrisField) {
if (recycleResult.remainingDebris && (recycleResult.remainingDebris.metal > 0 || recycleResult.remainingDebris.crystal > 0)) {
// 更新残骸场
universeStore.debrisFields[debrisId] = {
id: debrisField.id,
position: debrisField.position,
resources: recycleResult.remainingDebris,
createdAt: debrisField.createdAt
}
} else {
// 残骸已被完全回收,从宇宙中删除
delete universeStore.debrisFields[debrisId]
}
}
// 移除即将到来的警告(回收任务已到达)
removeIncomingFleetAlertById(mission.id)
// 设置返回时间
mission.returnTime = Date.now() + (mission.arrivalTime - mission.departureTime)
return
}
// 找到目标星球
const targetKey = gameLogic.generatePositionKey(
mission.targetPosition.galaxy,
mission.targetPosition.system,
mission.targetPosition.position
)
const targetPlanet =
gameStore.player.planets.find(
p =>
p.position.galaxy === mission.targetPosition.galaxy &&
p.position.system === mission.targetPosition.system &&
p.position.position === mission.targetPosition.position
) || universeStore.planets[targetKey]
if (!targetPlanet) {
console.warn('[NPC Mission] Target planet not found')
return
}
if (mission.missionType === MissionType.Spy) {
// NPC侦查到达
const { spiedNotification, spyReport } = npcBehaviorLogic.processNPCSpyArrival(npc, mission, targetPlanet, gameStore.player)
// 保存侦查报告到NPC用于后续攻击决策
if (!npc.playerSpyReports) {
npc.playerSpyReports = {}
}
npc.playerSpyReports[targetPlanet.id] = spyReport
// 添加被侦查通知给玩家
if (!gameStore.player.spiedNotifications) {
gameStore.player.spiedNotifications = []
}
gameStore.player.spiedNotifications.push(spiedNotification)
// 移除即将到来的警告(侦查已到达)
removeIncomingFleetAlertById(mission.id)
} else if (mission.missionType === MissionType.Attack) {
// NPC攻击到达 - 使用专门的NPC攻击处理逻辑
fleetLogic.processNPCAttackArrival(npc, mission, targetPlanet, gameStore.player, gameStore.player.planets).then(attackResult => {
if (attackResult) {
// 添加战斗报告给玩家
gameStore.player.battleReports.push(attackResult.battleResult)
// 如果生成月球,添加到玩家星球列表
if (attackResult.moon) {
gameStore.player.planets.push(attackResult.moon)
}
// 如果生成残骸场,添加到宇宙残骸场列表
if (attackResult.debrisField) {
universeStore.debrisFields[attackResult.debrisField.id] = attackResult.debrisField
}
}
// 移除即将到来的警告(攻击已到达)
removeIncomingFleetAlertById(mission.id)
})
}
}
/**
* 处理NPC任务返回
*/
const processNPCMissionReturn = (npc: NPC, mission: FleetMission) => {
// 找到NPC的起始星球
const originPlanet = npc.planets.find(p => p.id === mission.originPlanetId)
if (!originPlanet) return
// 返还舰队
shipLogic.addFleet(originPlanet.fleet, mission.fleet)
// 如果携带掠夺资源给NPC添加资源
if (mission.cargo) {
originPlanet.resources.metal += mission.cargo.metal
originPlanet.resources.crystal += mission.cargo.crystal
originPlanet.resources.deuterium += mission.cargo.deuterium
}
// 从NPC任务列表中移除
if (npc.fleetMissions) {
const missionIndex = npc.fleetMissions.indexOf(mission)
if (missionIndex > -1) {
npc.fleetMissions.splice(missionIndex, 1)
}
}
}
// NPC成长系统更新
let npcUpdateCounter = 0
const NPC_UPDATE_INTERVAL = 10
/**
* 更新NPC成长系统
*/
const updateNPCGrowth = (deltaSeconds: number) => {
// 累积时间
npcUpdateCounter += deltaSeconds
// 只在达到更新间隔时才执行
if (npcUpdateCounter < NPC_UPDATE_INTERVAL) {
return
}
// 获取所有星球
const allPlanets = Object.values(universeStore.planets)
// 如果NPC store为空从星球数据中初始化NPC
if (npcStore.npcs.length === 0) {
const npcMap = new Map<string, any>()
allPlanets.forEach(planet => {
// 跳过玩家的星球
if (planet.ownerId === gameStore.player.id || !planet.ownerId) return
// 这是NPC的星球
if (!npcMap.has(planet.ownerId)) {
npcMap.set(planet.ownerId, {
id: planet.ownerId,
name: `NPC-${planet.ownerId.substring(0, 8)}`,
planets: [],
technologies: {},
difficulty: 'medium' as const,
relations: {},
allies: [],
enemies: []
})
}
npcMap.get(planet.ownerId)!.planets.push(planet)
})
// 保存到store
npcStore.npcs = Array.from(npcMap.values())
// 如果有NPC基于玩家实力初始化NPC
if (npcStore.npcs.length > 0) {
const gameState: npcGrowthLogic.NPCGrowthGameState = {
planets: allPlanets,
player: gameStore.player,
npcs: npcStore.npcs
}
const playerPower = npcGrowthLogic.calculatePlayerAveragePower(gameState)
npcStore.npcs.forEach(npc => {
npcGrowthLogic.initializeNPCStartingPower(npc, playerPower)
})
// 初始化NPC之间的外交关系盟友/敌人)
npcGrowthLogic.initializeNPCDiplomacy(npcStore.npcs)
}
}
// 如果没有NPC直接返回
if (npcStore.npcs.length === 0) {
npcUpdateCounter = 0
return
}
// 构建游戏状态
const gameState: npcGrowthLogic.NPCGrowthGameState = {
planets: allPlanets,
player: gameStore.player,
npcs: npcStore.npcs
}
// 使用累积的时间更新每个NPC
npcStore.npcs.forEach(npc => {
npcGrowthLogic.updateNPCGrowth(npc, gameState, npcUpdateCounter)
})
// 重置计数器
npcUpdateCounter = 0
}
// NPC行为系统更新
let npcBehaviorCounter = 0
const NPC_BEHAVIOR_INTERVAL = 5
/**
* 更新NPC行为系统
*/
const updateNPCBehavior = (deltaSeconds: number) => {
// 累积时间
npcBehaviorCounter += deltaSeconds
// 只在达到更新间隔时才执行
if (npcBehaviorCounter < NPC_BEHAVIOR_INTERVAL) {
return
}
// 如果没有NPC直接返回
if (npcStore.npcs.length === 0) {
npcBehaviorCounter = 0
return
}
const now = Date.now()
const allPlanets = Object.values(universeStore.planets)
// 更新每个NPC的行为
npcStore.npcs.forEach(npc => {
npcBehaviorLogic.updateNPCBehavior(npc, gameStore.player, allPlanets, universeStore.debrisFields, now)
})
npcBehaviorCounter = 0
}
return {
processNPCMissionArrival,
processNPCMissionReturn,
removeIncomingFleetAlert,
removeIncomingFleetAlertById,
updateNPCGrowth,
updateNPCBehavior
}
}

View File

@@ -0,0 +1,103 @@
import type { Ref } from 'vue'
import { useGameStore } from '@/stores/gameStore'
import type { BuildQueueItem } from '@/types/game'
import * as buildingValidation from '@/logic/buildingValidation'
import * as resourceLogic from '@/logic/resourceLogic'
import * as researchValidation from '@/logic/researchValidation'
/**
* 队列处理
* 处理建造队列和研究队列的取消操作
*/
export const useQueueHandler = (
t: (key: string) => string,
confirmDialogOpen: Ref<boolean>,
confirmDialogTitle: Ref<string>,
confirmDialogMessage: Ref<string>,
confirmDialogAction: Ref<(() => void) | null>
) => {
const gameStore = useGameStore()
/**
* 取消建造
*/
const handleCancelBuild = (queueId: string) => {
confirmDialogTitle.value = t('queue.cancelBuild')
confirmDialogMessage.value = t('queue.confirmCancel')
confirmDialogAction.value = () => {
if (!gameStore.currentPlanet) return false
const { item, index } = buildingValidation.findQueueItem(gameStore.currentPlanet.buildQueue, queueId)
if (!item) return false
if (item.type === 'building') {
const refund = buildingValidation.cancelBuildingUpgrade(gameStore.currentPlanet, item)
resourceLogic.addResources(gameStore.currentPlanet.resources, refund)
}
gameStore.currentPlanet.buildQueue.splice(index, 1)
return true
}
confirmDialogOpen.value = true
}
/**
* 取消研究
*/
const handleCancelResearch = (queueId: string) => {
confirmDialogTitle.value = t('queue.cancelResearch')
confirmDialogMessage.value = t('queue.confirmCancel')
confirmDialogAction.value = () => {
if (!gameStore.currentPlanet) return false
const { item, index } = buildingValidation.findQueueItem(gameStore.player.researchQueue, queueId)
if (!item) return false
if (item.type === 'technology') {
const refund = researchValidation.cancelTechnologyResearch(item)
resourceLogic.addResources(gameStore.currentPlanet.resources, refund)
}
gameStore.player.researchQueue.splice(index, 1)
return true
}
confirmDialogOpen.value = true
}
/**
* 获取队列项名称
*/
const getItemName = (item: BuildQueueItem): string => {
if (item.type === 'building' || item.type === 'demolish') {
const buildingName = t(`buildings.${item.itemType}`)
return item.type === 'demolish' ? `${t('buildingsView.demolish')} - ${buildingName}` : buildingName
} else if (item.type === 'technology') {
return t(`technologies.${item.itemType}`)
} else if (item.type === 'ship') {
return t(`ships.${item.itemType}`)
} else if (item.type === 'defense') {
return t(`defenses.${item.itemType}`)
}
return t('common.unknown')
}
/**
* 获取剩余时间(秒)
*/
const getRemainingTime = (item: BuildQueueItem): number => {
const now = Date.now()
return Math.max(0, Math.floor((item.endTime - now) / 1000))
}
/**
* 获取队列进度(百分比)
*/
const getQueueProgress = (item: BuildQueueItem): number => {
const now = Date.now()
const total = item.endTime - item.startTime
const elapsed = now - item.startTime
return Math.min(100, Math.max(0, (elapsed / total) * 100))
}
return {
handleCancelBuild,
handleCancelResearch,
getItemName,
getRemainingTime,
getQueueProgress
}
}

View File

@@ -65,6 +65,23 @@ export const BUILDINGS: Record<BuildingType, BuildingConfig> = {
35: { [BuildingType.NaniteFactory]: 1, [BuildingType.ResearchLab]: 10 } 35: { [BuildingType.NaniteFactory]: 1, [BuildingType.ResearchLab]: 10 }
} }
}, },
[BuildingType.FusionReactor]: {
id: BuildingType.FusionReactor,
name: '核聚变反应堆',
description: '使用重氢产生大量能源',
baseCost: { metal: 900, crystal: 360, deuterium: 180, darkMatter: 0, energy: 0 },
baseTime: 30,
costMultiplier: 1.8,
spaceUsage: 4,
requirements: {
[TechnologyType.EnergyTechnology]: 3,
[BuildingType.DeuteriumSynthesizer]: 5
},
levelRequirements: {
10: { [BuildingType.RoboticsFactory]: 5, [TechnologyType.EnergyTechnology]: 6 },
20: { [BuildingType.RoboticsFactory]: 8, [TechnologyType.EnergyTechnology]: 10, [BuildingType.NaniteFactory]: 2 }
}
},
[BuildingType.RoboticsFactory]: { [BuildingType.RoboticsFactory]: {
id: BuildingType.RoboticsFactory, id: BuildingType.RoboticsFactory,
name: '机器人工厂', name: '机器人工厂',
@@ -80,8 +97,7 @@ export const BUILDINGS: Record<BuildingType, BuildingConfig> = {
}, },
levelRequirements: { levelRequirements: {
5: { [BuildingType.ResearchLab]: 3, [BuildingType.SolarPlant]: 8 }, 5: { [BuildingType.ResearchLab]: 3, [BuildingType.SolarPlant]: 8 },
8: { [BuildingType.ResearchLab]: 6, [BuildingType.SolarPlant]: 12, [BuildingType.MetalMine]: 12, [BuildingType.CrystalMine]: 12 }, 8: { [BuildingType.ResearchLab]: 6, [BuildingType.SolarPlant]: 12, [BuildingType.MetalMine]: 12, [BuildingType.CrystalMine]: 12 }
10: { [BuildingType.ResearchLab]: 8, [BuildingType.NaniteFactory]: 1 }
} }
}, },
[BuildingType.NaniteFactory]: { [BuildingType.NaniteFactory]: {
@@ -197,6 +213,41 @@ export const BUILDINGS: Record<BuildingType, BuildingConfig> = {
8: { [BuildingType.ResearchLab]: 10, [TechnologyType.DarkMatterTechnology]: 5, [BuildingType.NaniteFactory]: 2 } 8: { [BuildingType.ResearchLab]: 10, [TechnologyType.DarkMatterTechnology]: 5, [BuildingType.NaniteFactory]: 2 }
} }
}, },
[BuildingType.DarkMatterTank]: {
id: BuildingType.DarkMatterTank,
name: '暗物质储罐',
description: '增加暗物质存储上限',
baseCost: { metal: 10000, crystal: 10000, deuterium: 5000, darkMatter: 0, energy: 0 },
baseTime: 20,
costMultiplier: 2,
spaceUsage: 2,
planetOnly: true,
requirements: {
[BuildingType.DarkMatterCollector]: 2,
[TechnologyType.DarkMatterTechnology]: 1
},
levelRequirements: {
8: { [BuildingType.DarkMatterCollector]: 8, [BuildingType.RoboticsFactory]: 3 },
12: { [BuildingType.DarkMatterCollector]: 15, [BuildingType.RoboticsFactory]: 6, [TechnologyType.DarkMatterTechnology]: 3 }
}
},
[BuildingType.MissileSilo]: {
id: BuildingType.MissileSilo,
name: '导弹发射井',
description: '存储和发射导弹每级可存储10枚导弹',
baseCost: { metal: 20000, crystal: 20000, deuterium: 1000, darkMatter: 0, energy: 0 },
baseTime: 45,
costMultiplier: 2,
spaceUsage: 5,
maxLevel: 10,
requirements: {
[BuildingType.Shipyard]: 1
},
levelRequirements: {
5: { [BuildingType.Shipyard]: 5, [TechnologyType.ComputerTechnology]: 3 },
8: { [BuildingType.Shipyard]: 8, [TechnologyType.ComputerTechnology]: 6, [BuildingType.NaniteFactory]: 2 }
}
},
[BuildingType.Terraformer]: { [BuildingType.Terraformer]: {
id: BuildingType.Terraformer, id: BuildingType.Terraformer,
name: '地形改造器', name: '地形改造器',
@@ -250,7 +301,7 @@ export const BUILDINGS: Record<BuildingType, BuildingConfig> = {
id: BuildingType.JumpGate, id: BuildingType.JumpGate,
name: '跳跃门', name: '跳跃门',
description: '瞬间传送舰队到其他月球', description: '瞬间传送舰队到其他月球',
baseCost: { metal: 2000000, crystal: 4000000, deuterium: 2000000, darkMatter: 0, energy: 0 }, baseCost: { metal: 2000000, crystal: 4000000, deuterium: 2000000, darkMatter: 50000, energy: 0 },
baseTime: 240, // 减少建造时间300→240秒 baseTime: 240, // 减少建造时间300→240秒
costMultiplier: 2, costMultiplier: 2,
spaceUsage: 10, spaceUsage: 10,
@@ -269,7 +320,7 @@ export const BUILDINGS: Record<BuildingType, BuildingConfig> = {
id: BuildingType.PlanetDestroyerFactory, id: BuildingType.PlanetDestroyerFactory,
name: '行星毁灭者工厂', name: '行星毁灭者工厂',
description: '建造能够摧毁行星的终极武器', description: '建造能够摧毁行星的终极武器',
baseCost: { metal: 5000000, crystal: 4000000, deuterium: 1000000, darkMatter: 0, energy: 0 }, baseCost: { metal: 5000000, crystal: 4000000, deuterium: 1000000, darkMatter: 100000, energy: 0 },
baseTime: 300, baseTime: 300,
costMultiplier: 2, costMultiplier: 2,
spaceUsage: 15, spaceUsage: 15,
@@ -297,7 +348,7 @@ export const TECHNOLOGIES: Record<TechnologyType, TechnologyConfig> = {
[TechnologyType.EnergyTechnology]: { [TechnologyType.EnergyTechnology]: {
id: TechnologyType.EnergyTechnology, id: TechnologyType.EnergyTechnology,
name: '能源技术', name: '能源技术',
description: '提高能源利用效率', description: '加快研究速度',
baseCost: { metal: 0, crystal: 800, deuterium: 400, darkMatter: 0, energy: 0 }, baseCost: { metal: 0, crystal: 800, deuterium: 400, darkMatter: 0, energy: 0 },
baseTime: 30, // 减少研究时间60→30秒 baseTime: 30, // 减少研究时间60→30秒
costMultiplier: 2, costMultiplier: 2,
@@ -391,6 +442,87 @@ export const TECHNOLOGIES: Record<TechnologyType, TechnologyConfig> = {
8: { [BuildingType.ResearchLab]: 10, [BuildingType.NaniteFactory]: 2 } 8: { [BuildingType.ResearchLab]: 10, [BuildingType.NaniteFactory]: 2 }
} }
}, },
[TechnologyType.EspionageTechnology]: {
id: TechnologyType.EspionageTechnology,
name: '间谍技术',
description: '提高间谍探测效果每级提高1级侦查深度',
baseCost: { metal: 200, crystal: 1000, deuterium: 200, darkMatter: 0, energy: 0 },
baseTime: 60,
costMultiplier: 2,
requirements: { [BuildingType.ResearchLab]: 3 },
levelRequirements: {
5: { [BuildingType.ResearchLab]: 6, [TechnologyType.ComputerTechnology]: 3 },
8: { [BuildingType.ResearchLab]: 8, [TechnologyType.ComputerTechnology]: 5 }
}
},
[TechnologyType.WeaponsTechnology]: {
id: TechnologyType.WeaponsTechnology,
name: '武器技术',
description: '提高舰船和防御的攻击力,每级+10%',
baseCost: { metal: 800, crystal: 200, deuterium: 0, darkMatter: 0, energy: 0 },
baseTime: 60,
costMultiplier: 2,
requirements: { [BuildingType.ResearchLab]: 4 },
levelRequirements: {
5: { [BuildingType.ResearchLab]: 7, [BuildingType.Shipyard]: 4 },
10: { [BuildingType.ResearchLab]: 10, [BuildingType.Shipyard]: 8, [BuildingType.NaniteFactory]: 2 }
}
},
[TechnologyType.ShieldingTechnology]: {
id: TechnologyType.ShieldingTechnology,
name: '护盾技术',
description: '提高舰船和防御的护盾值,每级+10%',
baseCost: { metal: 200, crystal: 600, deuterium: 0, darkMatter: 0, energy: 0 },
baseTime: 60,
costMultiplier: 2,
requirements: { [BuildingType.ResearchLab]: 6, [TechnologyType.EnergyTechnology]: 3 },
levelRequirements: {
5: { [BuildingType.ResearchLab]: 8, [TechnologyType.EnergyTechnology]: 6 },
10: { [BuildingType.ResearchLab]: 10, [TechnologyType.EnergyTechnology]: 10, [BuildingType.NaniteFactory]: 2 }
}
},
[TechnologyType.ArmourTechnology]: {
id: TechnologyType.ArmourTechnology,
name: '装甲技术',
description: '提高舰船和防御的装甲值,每级+10%',
baseCost: { metal: 1000, crystal: 0, deuterium: 0, darkMatter: 0, energy: 0 },
baseTime: 60,
costMultiplier: 2,
requirements: { [BuildingType.ResearchLab]: 2 },
levelRequirements: {
5: { [BuildingType.ResearchLab]: 6, [BuildingType.Shipyard]: 3 },
10: { [BuildingType.ResearchLab]: 10, [BuildingType.Shipyard]: 7, [BuildingType.NaniteFactory]: 1 }
}
},
[TechnologyType.Astrophysics]: {
id: TechnologyType.Astrophysics,
name: '天体物理学',
description: '每级增加1个殖民地槽位增加探险成功率',
baseCost: { metal: 4000, crystal: 8000, deuterium: 4000, darkMatter: 0, energy: 0 },
baseTime: 60,
costMultiplier: 1.75,
requirements: {
[BuildingType.ResearchLab]: 3,
[TechnologyType.EspionageTechnology]: 4,
[TechnologyType.ImpulseDrive]: 3
},
levelRequirements: {
5: { [BuildingType.ResearchLab]: 8, [TechnologyType.EspionageTechnology]: 8 },
10: { [BuildingType.ResearchLab]: 12, [TechnologyType.HyperspaceTechnology]: 5, [BuildingType.NaniteFactory]: 3 }
}
},
[TechnologyType.GravitonTechnology]: {
id: TechnologyType.GravitonTechnology,
name: '引力技术',
description: '研究引力操纵,死星的必要技术',
baseCost: { metal: 0, crystal: 0, deuterium: 0, darkMatter: 300000, energy: 0 },
baseTime: 0,
costMultiplier: 3,
maxLevel: 1, // 只有1级
requirements: {
[BuildingType.ResearchLab]: 12
}
},
[TechnologyType.CombustionDrive]: { [TechnologyType.CombustionDrive]: {
id: TechnologyType.CombustionDrive, id: TechnologyType.CombustionDrive,
name: '燃烧引擎', name: '燃烧引擎',
@@ -470,7 +602,7 @@ export const TECHNOLOGIES: Record<TechnologyType, TechnologyConfig> = {
id: TechnologyType.PlanetDestructionTech, id: TechnologyType.PlanetDestructionTech,
name: '行星毁灭技术', name: '行星毁灭技术',
description: '研究如何摧毁整个行星的恐怖技术', description: '研究如何摧毁整个行星的恐怖技术',
baseCost: { metal: 4000000, crystal: 8000000, deuterium: 4000000, darkMatter: 0, energy: 0 }, baseCost: { metal: 4000000, crystal: 8000000, deuterium: 4000000, darkMatter: 200000, energy: 0 },
baseTime: 300, baseTime: 300,
costMultiplier: 2, costMultiplier: 2,
maxLevel: 5, // 最多5级 maxLevel: 5, // 最多5级
@@ -554,6 +686,64 @@ export const SHIPS: Record<ShipType, ShipConfig> = {
storageUsage: 25, storageUsage: 25,
requirements: { [BuildingType.Shipyard]: 7, [TechnologyType.HyperspaceDrive]: 4 } requirements: { [BuildingType.Shipyard]: 7, [TechnologyType.HyperspaceDrive]: 4 }
}, },
[ShipType.Battlecruiser]: {
id: ShipType.Battlecruiser,
name: '战列巡洋舰',
description: '快速强大的战斗舰船,擅长攻击战列舰',
cost: { metal: 30000, crystal: 40000, deuterium: 15000, darkMatter: 0, energy: 0 },
buildTime: 70,
cargoCapacity: 750,
attack: 700,
shield: 400,
armor: 7000,
speed: 10000,
fuelConsumption: 250,
storageUsage: 20,
requirements: {
[BuildingType.Shipyard]: 8,
[TechnologyType.HyperspaceDrive]: 5,
[TechnologyType.HyperspaceTechnology]: 5,
[TechnologyType.LaserTechnology]: 12
}
},
[ShipType.Bomber]: {
id: ShipType.Bomber,
name: '轰炸机',
description: '专门对付防御设施的轰炸舰',
cost: { metal: 50000, crystal: 25000, deuterium: 15000, darkMatter: 0, energy: 0 },
buildTime: 100,
cargoCapacity: 500,
attack: 1000,
shield: 500,
armor: 7500,
speed: 4000,
fuelConsumption: 700,
storageUsage: 35,
requirements: {
[BuildingType.Shipyard]: 8,
[TechnologyType.ImpulseDrive]: 6,
[TechnologyType.PlasmaTechnology]: 5
}
},
[ShipType.Destroyer]: {
id: ShipType.Destroyer,
name: '驱逐舰',
description: '擅长摧毁大型舰船的猎杀者',
cost: { metal: 60000, crystal: 50000, deuterium: 15000, darkMatter: 0, energy: 0 },
buildTime: 120,
cargoCapacity: 2000,
attack: 2000,
shield: 500,
armor: 11000,
speed: 5000,
fuelConsumption: 1000,
storageUsage: 40,
requirements: {
[BuildingType.Shipyard]: 9,
[TechnologyType.HyperspaceDrive]: 6,
[TechnologyType.HyperspaceTechnology]: 5
}
},
[ShipType.SmallCargo]: { [ShipType.SmallCargo]: {
id: ShipType.SmallCargo, id: ShipType.SmallCargo,
name: '小型运输船', name: '小型运输船',
@@ -629,6 +819,21 @@ export const SHIPS: Record<ShipType, ShipConfig> = {
storageUsage: 2, storageUsage: 2,
requirements: { [BuildingType.Shipyard]: 3, [TechnologyType.CombustionDrive]: 3 } requirements: { [BuildingType.Shipyard]: 3, [TechnologyType.CombustionDrive]: 3 }
}, },
[ShipType.SolarSatellite]: {
id: ShipType.SolarSatellite,
name: '太阳能卫星',
description: '提供额外能源每个产生50点能量',
cost: { metal: 0, crystal: 2000, deuterium: 500, darkMatter: 0, energy: 0 },
buildTime: 10,
cargoCapacity: 0,
attack: 1,
shield: 1,
armor: 200,
speed: 0,
fuelConsumption: 0,
storageUsage: 1,
requirements: { [BuildingType.Shipyard]: 1 }
},
[ShipType.DarkMatterHarvester]: { [ShipType.DarkMatterHarvester]: {
id: ShipType.DarkMatterHarvester, id: ShipType.DarkMatterHarvester,
name: '暗物质采集船', name: '暗物质采集船',
@@ -652,7 +857,7 @@ export const SHIPS: Record<ShipType, ShipConfig> = {
id: ShipType.Deathstar, id: ShipType.Deathstar,
name: '死星', name: '死星',
description: '终极武器,能够摧毁整个行星', description: '终极武器,能够摧毁整个行星',
cost: { metal: 5000000, crystal: 4000000, deuterium: 1000000, darkMatter: 0, energy: 0 }, cost: { metal: 5000000, crystal: 4000000, deuterium: 1000000, darkMatter: 50000, energy: 0 },
buildTime: 600, buildTime: 600,
cargoCapacity: 1000000, cargoCapacity: 1000000,
attack: 200000, attack: 200000,
@@ -763,7 +968,7 @@ export const DEFENSES: Record<DefenseType, DefenseConfig> = {
id: DefenseType.PlanetaryShield, id: DefenseType.PlanetaryShield,
name: '行星护盾', name: '行星护盾',
description: '保护行星免受毁灭攻击的超级护盾', description: '保护行星免受毁灭攻击的超级护盾',
cost: { metal: 2000000, crystal: 2000000, deuterium: 1000000, darkMatter: 0, energy: 0 }, cost: { metal: 2000000, crystal: 2000000, deuterium: 1000000, darkMatter: 50000, energy: 0 },
buildTime: 180, buildTime: 180,
attack: 1, attack: 1,
shield: 100000, shield: 100000,
@@ -773,6 +978,33 @@ export const DEFENSES: Record<DefenseType, DefenseConfig> = {
[TechnologyType.EnergyTechnology]: 10, [TechnologyType.EnergyTechnology]: 10,
[TechnologyType.HyperspaceTechnology]: 8 [TechnologyType.HyperspaceTechnology]: 8
} }
},
[DefenseType.AntiBallisticMissile]: {
id: DefenseType.AntiBallisticMissile,
name: '反弹道导弹',
description: '拦截敌方导弹每个可拦截1枚星际导弹',
cost: { metal: 8000, crystal: 0, deuterium: 2000, darkMatter: 0, energy: 0 },
buildTime: 20,
attack: 1,
shield: 1,
armor: 800,
requirements: {
[BuildingType.MissileSilo]: 2
}
},
[DefenseType.InterplanetaryMissile]: {
id: DefenseType.InterplanetaryMissile,
name: '星际导弹',
description: '可以攻击其他星球的防御设施,射程取决于脉冲引擎等级',
cost: { metal: 12500, crystal: 2500, deuterium: 10000, darkMatter: 0, energy: 0 },
buildTime: 30,
attack: 12000,
shield: 1,
armor: 1500,
requirements: {
[BuildingType.MissileSilo]: 4,
[TechnologyType.ImpulseDrive]: 1
}
} }
} }
@@ -782,8 +1014,8 @@ export const OFFICERS: Record<OfficerType, OfficerConfig> = {
id: OfficerType.Commander, id: OfficerType.Commander,
name: '指挥官', name: '指挥官',
description: '提升建筑速度和管理能力', description: '提升建筑速度和管理能力',
cost: { metal: 0, crystal: 50000, deuterium: 25000, darkMatter: 0, energy: 0 }, cost: { metal: 0, crystal: 50000, deuterium: 25000, darkMatter: 7000, energy: 0 },
weeklyMaintenance: { metal: 0, crystal: 5000, deuterium: 2500, darkMatter: 0, energy: 0 }, weeklyMaintenance: { metal: 0, crystal: 5000, deuterium: 2500, darkMatter: 900, energy: 0 },
benefits: { benefits: {
buildingSpeedBonus: 10, // 建筑速度 +10% buildingSpeedBonus: 10, // 建筑速度 +10%
additionalBuildQueue: 1, // 额外1个建筑队列 additionalBuildQueue: 1, // 额外1个建筑队列
@@ -794,8 +1026,8 @@ export const OFFICERS: Record<OfficerType, OfficerConfig> = {
id: OfficerType.Admiral, id: OfficerType.Admiral,
name: '上将', name: '上将',
description: '提升舰队作战能力', description: '提升舰队作战能力',
cost: { metal: 50000, crystal: 25000, deuterium: 0, darkMatter: 0, energy: 0 }, cost: { metal: 50000, crystal: 25000, deuterium: 0, darkMatter: 7000, energy: 0 },
weeklyMaintenance: { metal: 5000, crystal: 2500, deuterium: 0, darkMatter: 0, energy: 0 }, weeklyMaintenance: { metal: 5000, crystal: 2500, deuterium: 0, darkMatter: 900, energy: 0 },
benefits: { benefits: {
additionalFleetSlots: 2, // 额外2个舰队槽位 additionalFleetSlots: 2, // 额外2个舰队槽位
fleetSpeedBonus: 10, // 舰队速度 +10% fleetSpeedBonus: 10, // 舰队速度 +10%
@@ -806,8 +1038,8 @@ export const OFFICERS: Record<OfficerType, OfficerConfig> = {
id: OfficerType.Engineer, id: OfficerType.Engineer,
name: '工程师', name: '工程师',
description: '增强防御和能量系统', description: '增强防御和能量系统',
cost: { metal: 40000, crystal: 20000, deuterium: 10000, darkMatter: 0, energy: 0 }, cost: { metal: 40000, crystal: 20000, deuterium: 10000, darkMatter: 7000, energy: 0 },
weeklyMaintenance: { metal: 4000, crystal: 2000, deuterium: 1000, darkMatter: 0, energy: 0 }, weeklyMaintenance: { metal: 4000, crystal: 2000, deuterium: 1000, darkMatter: 900, energy: 0 },
benefits: { benefits: {
defenseBonus: 15, // 防御力 +15% defenseBonus: 15, // 防御力 +15%
energyProductionBonus: 10, // 电量产出 +10% energyProductionBonus: 10, // 电量产出 +10%
@@ -818,8 +1050,8 @@ export const OFFICERS: Record<OfficerType, OfficerConfig> = {
id: OfficerType.Geologist, id: OfficerType.Geologist,
name: '地质学家', name: '地质学家',
description: '提高资源开采效率', description: '提高资源开采效率',
cost: { metal: 30000, crystal: 30000, deuterium: 20000, darkMatter: 0, energy: 0 }, cost: { metal: 30000, crystal: 30000, deuterium: 20000, darkMatter: 7000, energy: 0 },
weeklyMaintenance: { metal: 3000, crystal: 3000, deuterium: 2000, darkMatter: 0, energy: 0 }, weeklyMaintenance: { metal: 3000, crystal: 3000, deuterium: 2000, darkMatter: 900, energy: 0 },
benefits: { benefits: {
resourceProductionBonus: 15, // 资源产量 +15% resourceProductionBonus: 15, // 资源产量 +15%
storageCapacityBonus: 10 // 仓储容量 +10% storageCapacityBonus: 10 // 仓储容量 +10%
@@ -829,8 +1061,8 @@ export const OFFICERS: Record<OfficerType, OfficerConfig> = {
id: OfficerType.Technocrat, id: OfficerType.Technocrat,
name: '技术专家', name: '技术专家',
description: '加快科技研究速度', description: '加快科技研究速度',
cost: { metal: 20000, crystal: 40000, deuterium: 20000, darkMatter: 0, energy: 0 }, cost: { metal: 20000, crystal: 40000, deuterium: 20000, darkMatter: 7000, energy: 0 },
weeklyMaintenance: { metal: 2000, crystal: 4000, deuterium: 2000, darkMatter: 0, energy: 0 }, weeklyMaintenance: { metal: 2000, crystal: 4000, deuterium: 2000, darkMatter: 900, energy: 0 },
benefits: { benefits: {
researchSpeedBonus: 15 // 研究速度 +15% researchSpeedBonus: 15 // 研究速度 +15%
} }
@@ -870,3 +1102,81 @@ export const FLEET_STORAGE_CONFIG = {
shipyardBonus: 1000, // 每级造船厂增加的仓储 shipyardBonus: 1000, // 每级造船厂增加的仓储
computerTechBonus: 500 // 每级计算机技术全局增加的仓储 computerTechBonus: 500 // 每级计算机技术全局增加的仓储
} }
// 外交系统配置
export const DIPLOMATIC_CONFIG = {
// 好感度范围
MIN_REPUTATION: -100,
MAX_REPUTATION: 100,
// 关系状态阈值
HOSTILE_THRESHOLD: -20, // 低于此值为敌对
FRIENDLY_THRESHOLD: 20, // 高于此值为友好
// 各种行为的好感度变化值
REPUTATION_CHANGES: {
// 赠送资源(基于资源价值计算)
GIFT_BASE: 0, // 基础好感度(移除固定奖励,完全基于资源量)
GIFT_PER_1K_RESOURCES: 2, // 每1000资源价值增加2点提高权重
GIFT_MIN_VALUE: 500, // 最小资源价值门槛(低于此值不增加好感度)
GIFT_MAX_SINGLE: 20, // 单次赠送最大好感度增加
// 负面行为
ATTACK: -15, // 攻击一次
ATTACK_WIN: -25, // 攻击并获胜
ATTACK_DESTROY_PLANET: -50, // 摧毁星球
SPY_DETECTED: -5, // 侦查被发现
SPY_UNDETECTED: -2, // 侦查未被发现
STEAL_DEBRIS: -10, // 抢夺残骸在NPC星球位置
DESTROY_FLEET: -3, // 每摧毁1单位战力扣除好感度
// 正面行为
HELP_ATTACK_ENEMY: 15, // 帮助攻击NPC的敌人
LONG_PEACE_DECAY: 1, // 长期不攻击的友好衰减(每周+1
TRADE: 5, // 贸易(未来功能预留)
// 关系网络影响
ALLY_ATTACKED: -10, // 攻击盟友导致的好感度降低
ALLY_HELPED: 5 // 帮助盟友导致的好感度增加
},
// 好感度自然变化
NATURAL_DECAY: {
ENABLED: true,
INTERVAL: 7 * 24 * 3600, // 7天
TOWARDS_NEUTRAL_RATE: 2 // 每周向中立值回归2点
},
// 基于关系的行为调整
BEHAVIOR_MODIFIERS: {
HOSTILE_ATTACK_MULTIPLIER: 2.0, // 敌对状态攻击频率翻倍
HOSTILE_SPY_MULTIPLIER: 1.5, // 敌对状态侦查频率提高50%
FRIENDLY_ATTACK_PROBABILITY: 0, // 友好状态不攻击
FRIENDLY_SPY_PROBABILITY: 0.5, // 友好状态侦查概率降低到50%
NEUTRAL_ATTACK_PROBABILITY: 1.0, // 中立状态正常攻击概率
NEUTRAL_SPY_PROBABILITY: 1.0 // 中立状态正常侦查概率
},
// NPC主动赠送资源配置
NPC_GIFT_CONFIG: {
ENABLED: true,
MIN_REPUTATION: 60, // NPC对玩家好感度≥60才会赠送
CHECK_INTERVAL: 24 * 3600, // 每天检查一次(秒)
GIFT_PROBABILITY: 0.05, // 5%概率赠送
GIFT_AMOUNT: {
METAL: { min: 1000, max: 5000 },
CRYSTAL: { min: 500, max: 2500 },
DEUTERIUM: { min: 200, max: 1000 }
}
},
// 礼物接受/拒绝配置
GIFT_ACCEPTANCE_CONFIG: {
NPC_REJECTION_BASE_PROBABILITY: 0.3, // NPC拒绝礼物的基础概率30%
NPC_REJECTION_REPUTATION_MODIFIER: 0.01, // 好感度每降低1点拒绝概率增加1%
MIN_REJECTION_PROBABILITY: 0.05, // 最小拒绝概率5%,即使关系很好)
MAX_REJECTION_PROBABILITY: 0.8, // 最大拒绝概率80%,即使关系很差)
GIFT_EXPIRATION_DAYS: 7, // 礼物通知过期天数
REJECTION_REPUTATION_PENALTY: -5 // 拒绝礼物导致的好感度降低
}
}

View File

@@ -62,6 +62,7 @@ export default {
officers: 'Offiziere', officers: 'Offiziere',
simulator: 'Simulator', simulator: 'Simulator',
galaxy: 'Galaxie', galaxy: 'Galaxie',
diplomacy: 'Diplomacy',
messages: 'Nachrichten', messages: 'Nachrichten',
settings: 'Einstellungen', settings: 'Einstellungen',
gm: 'GM' gm: 'GM'
@@ -97,6 +98,8 @@ export default {
coordinates: 'Koordinaten', coordinates: 'Koordinaten',
switchToMoon: 'Zum Mond', switchToMoon: 'Zum Mond',
backToPlanet: 'Zurück zum Planeten', backToPlanet: 'Zurück zum Planeten',
switchPlanet: 'Planet wechseln',
currentPlanet: 'Aktueller Planet',
fields: 'Felder', fields: 'Felder',
temperature: 'Temperatur', temperature: 'Temperatur',
homePlanet: 'Heimatplanet', homePlanet: 'Heimatplanet',
@@ -112,6 +115,7 @@ export default {
crystalMine: 'Kristallmine', crystalMine: 'Kristallmine',
deuteriumSynthesizer: 'Deuterium-Synthesizer', deuteriumSynthesizer: 'Deuterium-Synthesizer',
solarPlant: 'Solarkraftwerk', solarPlant: 'Solarkraftwerk',
fusionReactor: 'Fusionsreaktor',
roboticsFactory: 'Roboterfabrik', roboticsFactory: 'Roboterfabrik',
naniteFactory: 'Nanitenfabrik', naniteFactory: 'Nanitenfabrik',
shipyard: 'Raumschiffwerft', shipyard: 'Raumschiffwerft',
@@ -120,6 +124,8 @@ export default {
crystalStorage: 'Kristallspeicher', crystalStorage: 'Kristallspeicher',
deuteriumTank: 'Deuteriumtank', deuteriumTank: 'Deuteriumtank',
darkMatterCollector: 'Dunkle-Materie-Kollektor', darkMatterCollector: 'Dunkle-Materie-Kollektor',
darkMatterTank: 'Dunkle-Materie-Tank',
missileSilo: 'Raketensilo',
terraformer: 'Terraformer', terraformer: 'Terraformer',
lunarBase: 'Mondbasis', lunarBase: 'Mondbasis',
sensorPhalanx: 'Sensorphalanx', sensorPhalanx: 'Sensorphalanx',
@@ -130,13 +136,26 @@ export default {
consumption: 'Verbrauch', consumption: 'Verbrauch',
totalCost: 'Gesamtkosten', totalCost: 'Gesamtkosten',
totalPoints: 'Gesamtpunkte', totalPoints: 'Gesamtpunkte',
levelRange: 'Stufenbereich' levelRange: 'Stufenbereich',
capacity: 'Capacity/Effect',
storageCapacity: 'Capacity',
energyProduction: 'Energy Production',
fleetStorage: 'Fleet Storage',
buildQueue: 'Build Queue',
buildQueueBonus: 'Bauauftrag',
spaceBonus: 'Raumbonus',
buildSpeedBonus: 'Baugeschwindigkeitsbonus',
researchSpeedBonus: 'Forschungsgeschwindigkeitsbonus',
planetSpace: 'Planet Space',
moonSpace: 'Moon Space',
missileCapacity: 'Missile Capacity'
}, },
buildingDescriptions: { buildingDescriptions: {
metalMine: 'Fördert Metallressourcen', metalMine: 'Fördert Metallressourcen',
crystalMine: 'Fördert Kristallressourcen', crystalMine: 'Fördert Kristallressourcen',
deuteriumSynthesizer: 'Synthesiert Deuteriumressourcen', deuteriumSynthesizer: 'Synthesiert Deuteriumressourcen',
solarPlant: 'Liefert Energie', solarPlant: 'Liefert Energie',
fusionReactor: 'Nutzt Deuterium zur Erzeugung großer Energiemengen',
roboticsFactory: 'Beschleunigt Baugeschwindigkeit', roboticsFactory: 'Beschleunigt Baugeschwindigkeit',
naniteFactory: 'Erhöht Bauauftragskapazität, +1 pro Stufe (max 10 Stufen)', naniteFactory: 'Erhöht Bauauftragskapazität, +1 pro Stufe (max 10 Stufen)',
shipyard: 'Baut Schiffe', shipyard: 'Baut Schiffe',
@@ -145,6 +164,8 @@ export default {
crystalStorage: 'Erhöht Kristallspeicherkapazität', crystalStorage: 'Erhöht Kristallspeicherkapazität',
deuteriumTank: 'Erhöht Deuteriumspeicherkapazität', deuteriumTank: 'Erhöht Deuteriumspeicherkapazität',
darkMatterCollector: 'Sammelt seltene Dunkle-Materie-Ressourcen', darkMatterCollector: 'Sammelt seltene Dunkle-Materie-Ressourcen',
darkMatterTank: 'Erhöht Dunkle-Materie-Speicherkapazität',
missileSilo: 'Lagert und startet Raketen, 10 Raketen pro Stufe',
terraformer: 'Terraformt Planetenoberfläche, erhöht verfügbaren Platz um 5 pro Stufe', terraformer: 'Terraformt Planetenoberfläche, erhöht verfügbaren Platz um 5 pro Stufe',
lunarBase: 'Erhöht verfügbaren Platz auf dem Mond, +5 Platz pro Stufe', lunarBase: 'Erhöht verfügbaren Platz auf dem Mond, +5 Platz pro Stufe',
sensorPhalanx: 'Erkennt Flottenaktivitäten in umliegenden Systemen', sensorPhalanx: 'Erkennt Flottenaktivitäten in umliegenden Systemen',
@@ -156,11 +177,15 @@ export default {
heavyFighter: 'Schwerer Jäger', heavyFighter: 'Schwerer Jäger',
cruiser: 'Kreuzer', cruiser: 'Kreuzer',
battleship: 'Schlachtschiff', battleship: 'Schlachtschiff',
battlecruiser: 'Schlachtkreuzer',
bomber: 'Bomber',
destroyer: 'Zerstörer',
smallCargo: 'Kleiner Transporter', smallCargo: 'Kleiner Transporter',
largeCargo: 'Großer Transporter', largeCargo: 'Großer Transporter',
colonyShip: 'Kolonieschiff', colonyShip: 'Kolonieschiff',
recycler: 'Recycler', recycler: 'Recycler',
espionageProbe: 'Spionagesonde', espionageProbe: 'Spionagesonde',
solarSatellite: 'Solarsatellit',
darkMatterHarvester: 'Dunkle-Materie-Ernter', darkMatterHarvester: 'Dunkle-Materie-Ernter',
deathstar: 'Todesstern' deathstar: 'Todesstern'
}, },
@@ -169,11 +194,15 @@ export default {
heavyFighter: 'Schwer gepanzerter Jäger', heavyFighter: 'Schwer gepanzerter Jäger',
cruiser: 'Mittleres Kriegsschiff, ausgewogene Offensive und Defensive', cruiser: 'Mittleres Kriegsschiff, ausgewogene Offensive und Defensive',
battleship: 'Mächtiges Kriegsschiff', battleship: 'Mächtiges Kriegsschiff',
battlecruiser: 'Schnelles mächtiges Kriegsschiff, hervorragend gegen Schlachtschiffe',
bomber: 'Spezialisiertes Schiff zum Angriff auf Verteidigungsanlagen',
destroyer: 'Jäger spezialisiert auf Zerstörung großer Schiffe',
smallCargo: 'Transportiert kleine Mengen Ressourcen', smallCargo: 'Transportiert kleine Mengen Ressourcen',
largeCargo: 'Transportiert große Mengen Ressourcen', largeCargo: 'Transportiert große Mengen Ressourcen',
colonyShip: 'Zur Kolonisierung neuer Planeten', colonyShip: 'Zur Kolonisierung neuer Planeten',
recycler: 'Sammelt Trümmerfeld-Ressourcen', recycler: 'Sammelt Trümmerfeld-Ressourcen',
espionageProbe: 'Späht feindliche Planeten aus', espionageProbe: 'Späht feindliche Planeten aus',
solarSatellite: 'Liefert zusätzliche Energie, erzeugt 50 Energie pro Satellit',
darkMatterHarvester: 'Spezielles Schiff zum Ernten von Dunkler Materie', darkMatterHarvester: 'Spezielles Schiff zum Ernten von Dunkler Materie',
deathstar: 'Ultimative Waffe, die ganze Planeten zerstören kann' deathstar: 'Ultimative Waffe, die ganze Planeten zerstören kann'
}, },
@@ -186,6 +215,8 @@ export default {
plasmaTurret: 'Plasmawerfer', plasmaTurret: 'Plasmawerfer',
smallShieldDome: 'Kleine Schildkuppel', smallShieldDome: 'Kleine Schildkuppel',
largeShieldDome: 'Große Schildkuppel', largeShieldDome: 'Große Schildkuppel',
antiBallisticMissile: 'Abfangrakete',
interplanetaryMissile: 'Interkontinentalrakete',
planetaryShield: 'Planetarschild' planetaryShield: 'Planetarschild'
}, },
defenseDescriptions: { defenseDescriptions: {
@@ -197,13 +228,23 @@ export default {
plasmaTurret: 'Mächtige Verteidigungsanlage', plasmaTurret: 'Mächtige Verteidigungsanlage',
smallShieldDome: 'Kleiner Schild zum Schutz des gesamten Planeten', smallShieldDome: 'Kleiner Schild zum Schutz des gesamten Planeten',
largeShieldDome: 'Großer Schild zum Schutz des gesamten Planeten', largeShieldDome: 'Großer Schild zum Schutz des gesamten Planeten',
antiBallisticMissile: 'Fängt feindliche Raketen ab, kann 1 Interkontinentalrakete abfangen',
interplanetaryMissile: 'Kann Verteidigungsanlagen auf anderen Planeten angreifen',
planetaryShield: 'Superschild zum Schutz des Planeten vor Vernichtungsangriffen' planetaryShield: 'Superschild zum Schutz des Planeten vor Vernichtungsangriffen'
}, },
research: { research: {
researchTime: 'Forschungszeit', researchTime: 'Forschungszeit',
totalCost: 'Gesamtkosten', totalCost: 'Gesamtkosten',
totalPoints: 'Gesamtpunkte', totalPoints: 'Gesamtpunkte',
levelRange: 'Stufenbereich' levelRange: 'Stufenbereich',
capacity: 'Capacity/Effect',
storageCapacity: 'Capacity',
energyProduction: 'Energy Production',
fleetStorage: 'Fleet Storage',
buildQueue: 'Build Queue',
planetSpace: 'Planet Space',
moonSpace: 'Moon Space',
missileCapacity: 'Missile Capacity'
}, },
technologies: { technologies: {
energyTechnology: 'Energietechnik', energyTechnology: 'Energietechnik',
@@ -212,6 +253,12 @@ export default {
hyperspaceTechnology: 'Hyperraumtechnik', hyperspaceTechnology: 'Hyperraumtechnik',
plasmaTechnology: 'Plasmatechnik', plasmaTechnology: 'Plasmatechnik',
computerTechnology: 'Computertechnologie', computerTechnology: 'Computertechnologie',
espionageTechnology: 'Spionagetechnik',
weaponsTechnology: 'Waffentechnik',
shieldingTechnology: 'Schildtechnik',
armourTechnology: 'Panzerung',
astrophysics: 'Astrophysik',
gravitonTechnology: 'Gravitontechnik',
combustionDrive: 'Verbrennungsantrieb', combustionDrive: 'Verbrennungsantrieb',
impulseDrive: 'Impulsantrieb', impulseDrive: 'Impulsantrieb',
hyperspaceDrive: 'Hyperraumantrieb', hyperspaceDrive: 'Hyperraumantrieb',
@@ -226,6 +273,12 @@ export default {
hyperspaceTechnology: 'Hyperraumsprung-Technologie', hyperspaceTechnology: 'Hyperraumsprung-Technologie',
plasmaTechnology: 'Plasmawaffentechnologie', plasmaTechnology: 'Plasmawaffentechnologie',
computerTechnology: 'Erhöht Forschungsauftragskapazität, +1 pro Stufe (max 10 Stufen)', computerTechnology: 'Erhöht Forschungsauftragskapazität, +1 pro Stufe (max 10 Stufen)',
espionageTechnology: 'Verbessert Sondenwirksamkeit, +1 Spionagestufe pro Stufe',
weaponsTechnology: 'Erhöht Angriffskraft von Schiffen und Verteidigung um 10% pro Stufe',
shieldingTechnology: 'Erhöht Schilde von Schiffen und Verteidigung um 10% pro Stufe',
armourTechnology: 'Erhöht Panzerung von Schiffen und Verteidigung um 10% pro Stufe',
astrophysics: 'Jede Stufe fügt 1 Kolonieslot hinzu und erhöht Expeditionserfolgsrate',
gravitonTechnology: 'Erforscht Gravitonmanipulation, erforderlich für Todesstern',
combustionDrive: 'Grundlegende Antriebstechnologie', combustionDrive: 'Grundlegende Antriebstechnologie',
impulseDrive: 'Mittlere Antriebstechnologie', impulseDrive: 'Mittlere Antriebstechnologie',
hyperspaceDrive: 'Fortgeschrittene Antriebstechnologie', hyperspaceDrive: 'Fortgeschrittene Antriebstechnologie',
@@ -293,7 +346,9 @@ export default {
demolish: 'Abreißen', demolish: 'Abreißen',
demolishRefund: 'Abriss-Rückerstattung', demolishRefund: 'Abriss-Rückerstattung',
demolishFailed: 'Abriss fehlgeschlagen', demolishFailed: 'Abriss fehlgeschlagen',
demolishFailedMessage: 'Abriss nicht möglich. Bitte überprüfen Sie, ob die Bauqueue voll ist oder die Gebäudestufe 0 ist.' demolishFailedMessage: 'Abriss nicht möglich. Bitte überprüfen Sie, ob die Bauqueue voll ist oder die Gebäudestufe 0 ist.',
confirmDemolish: '',
confirmDemolishMessage: ''
}, },
researchView: { researchView: {
title: 'Forschung', title: 'Forschung',
@@ -382,6 +437,7 @@ export default {
all: 'Alle', all: 'Alle',
targetCoordinates: 'Zielkoordinaten', targetCoordinates: 'Zielkoordinaten',
galaxy: 'Galaxie', galaxy: 'Galaxie',
diplomacy: 'Diplomacy',
system: 'System', system: 'System',
position: 'Position', position: 'Position',
missionType: 'Missionstyp', missionType: 'Missionstyp',
@@ -415,7 +471,11 @@ export default {
cannotSendToOwnPlanet: 'Flotte kann nicht zu eigenem Planeten gesendet werden', cannotSendToOwnPlanet: 'Flotte kann nicht zu eigenem Planeten gesendet werden',
cargoExceedsCapacity: 'Fracht überschreitet Kapazität', cargoExceedsCapacity: 'Fracht überschreitet Kapazität',
noColonyShip: 'Kolonieschiff für Kolonisierungsmission erforderlich', noColonyShip: 'Kolonieschiff für Kolonisierungsmission erforderlich',
noDebrisAtTarget: 'Kein Trümmerfeld an Zielkoordinaten oder Trümmerfeld ist leer' noDebrisAtTarget: 'Kein Trümmerfeld an Zielkoordinaten oder Trümmerfeld ist leer',
noDeathstar: 'Todesstern für Zerstörungsmission erforderlich',
giftMode: 'Geschenkmodus',
giftModeDescription: 'Ressourcen als Geschenk senden an',
estimatedReputationGain: 'Geschätzter Reputationsgewinn'
}, },
officersView: { officersView: {
title: 'Offiziere', title: 'Offiziere',
@@ -455,11 +515,15 @@ export default {
title: 'Galaxie', title: 'Galaxie',
selectCoordinates: 'Koordinaten auswählen', selectCoordinates: 'Koordinaten auswählen',
galaxy: 'Galaxie', galaxy: 'Galaxie',
diplomacy: 'Diplomacy',
selectGalaxy: 'Galaxie auswählen', selectGalaxy: 'Galaxie auswählen',
system: 'System', system: 'System',
selectSystem: 'System auswählen', selectSystem: 'System auswählen',
view: 'Anzeigen', view: 'Anzeigen',
myPlanet: 'Mein Planet', myPlanet: 'Mein Planet',
myPlanets: 'Meine Planeten',
npcPlanets: 'NPC-Planeten',
selectPlanetToView: 'Planet zum Anzeigen auswählen',
totalPositions: 'Insgesamt 10 Planetenpositionen', totalPositions: 'Insgesamt 10 Planetenpositionen',
mine: 'Mein', mine: 'Mein',
hostile: 'Feindlich', hostile: 'Feindlich',
@@ -481,21 +545,32 @@ export default {
colonizePlanetMessage: colonizePlanetMessage:
'Möchten Sie wirklich Position [{coordinates}] kolonisieren?\n\nBitte gehen Sie zur Flottenseite, um ein Kolonieschiff zu senden.', 'Möchten Sie wirklich Position [{coordinates}] kolonisieren?\n\nBitte gehen Sie zur Flottenseite, um ein Kolonieschiff zu senden.',
recyclePlanetMessage: recyclePlanetMessage:
'Möchten Sie wirklich Trümmer bei Position [{coordinates}] recyceln?\n\nBitte gehen Sie zur Flottenseite, um Recycler zu senden.' 'Möchten Sie wirklich Trümmer bei Position [{coordinates}] recyceln?\n\nBitte gehen Sie zur Flottenseite, um Recycler zu senden.',
sendGift: 'Geschenk senden',
debris: 'Trümmer',
giftPlanetTitle: 'Geschenk senden',
giftPlanetMessage:
'Möchten Sie wirklich Ressourcen als Geschenk an Planet [{coordinates}] senden?\n\nBitte gehen Sie zur Flottenseite, um Transporter auszuwählen und Ressourcen zu laden.'
}, },
messagesView: { messagesView: {
title: 'Nachrichten', title: 'Nachrichten',
battles: 'Kämpfe', battles: 'Kämpfe',
spy: 'Spionage', spy: 'Spionage',
npc: 'NPC',
spied: 'Ausspioniert',
battleReports: 'Kampfberichte', battleReports: 'Kampfberichte',
spyReports: 'Spionageberichte', spyReports: 'Spionageberichte',
noBattleReports: 'Keine Kampfberichte', noBattleReports: 'Keine Kampfberichte',
noSpyReports: 'Keine Spionageberichte', noSpyReports: 'Keine Spionageberichte',
noSpiedNotifications: 'Keine Ausspionierungs-Benachrichtigungen',
battleReport: 'Kampfbericht', battleReport: 'Kampfbericht',
spyReport: 'Spionagebericht', spyReport: 'Spionagebericht',
spiedNotification: 'Ausspionierungs-Benachrichtigung',
victory: 'Sieg', victory: 'Sieg',
defeat: 'Niederlage', defeat: 'Niederlage',
draw: 'Unentschieden', draw: 'Unentschieden',
detected: 'Entdeckt',
undetected: 'Unentdeckt',
attackerFleet: 'Angreiferflotte', attackerFleet: 'Angreiferflotte',
defenderFleet: 'Verteidigerflotte', defenderFleet: 'Verteidigerflotte',
defenderDefense: 'Verteidigerverteidigung', defenderDefense: 'Verteidigerverteidigung',
@@ -517,7 +592,43 @@ export default {
hideRoundDetails: 'Rundendetails ausblenden', hideRoundDetails: 'Rundendetails ausblenden',
round: 'Runde {round}', round: 'Runde {round}',
attackerRemainingPower: 'Verbleibende Angreiferkraft', attackerRemainingPower: 'Verbleibende Angreiferkraft',
defenderRemainingPower: 'Verbleibende Verteidigerkraft' defenderRemainingPower: 'Verbleibende Verteidigerkraft',
missions: 'Missionen',
noMissionReports: 'Keine Missionsberichte',
success: 'Erfolg',
failed: 'Fehlgeschlagen',
npcActivity: 'NPC-Aktivität',
noNPCActivity: 'Keine NPC-Aktivitätsbenachrichtigungen',
npcRecycleActivity: 'NPC recycelt Trümmer',
gifts: 'Geschenke',
giftRejected: 'Abgelehnt',
noGiftNotifications: 'Keine Geschenkbenachrichtigungen',
noGiftRejected: 'Keine abgelehnten Geschenke',
giftFrom: 'Geschenk von {npcName}',
giftRejectedBy: '{npcName} hat das Geschenk abgelehnt',
giftResources: 'Geschenk-Ressourcen',
rejectedResources: 'Abgelehnte Ressourcen',
expectedReputation: 'Erwarteter Ruf',
currentReputation: 'Aktueller Ruf',
acceptGift: 'Annehmen',
rejectGift: 'Ablehnen',
rejectionReason: {
hostile: 'Sie sind feindlich und nehmen keine Geschenke an',
neutral_distrust: 'Sie vertrauen Ihnen nicht',
polite_decline: 'Sie lehnten höflich ab'
}
},
missionReports: {
transportSuccess: 'Transportmission erfolgreich abgeschlossen',
transportFailed: 'Transportmission fehlgeschlagen',
colonizeSuccess: 'Kolonisierungsmission erfolgreich, neuer Planet gegründet',
colonizeFailed: 'Kolonisierungsmission fehlgeschlagen',
deploySuccess: 'Einsatzmission erfolgreich abgeschlossen',
deployFailed: 'Einsatzmission fehlgeschlagen',
recycleSuccess: 'Recyclingmission erfolgreich abgeschlossen',
recycleFailed: 'Recyclingmission fehlgeschlagen, keine Trümmer am Zielort',
destroySuccess: 'Planetenzerstörungsmission erfolgreich ausgeführt',
destroyFailed: 'Planetenzerstörungsmission fehlgeschlagen'
}, },
simulatorView: { simulatorView: {
title: 'Kampfsimulator', title: 'Kampfsimulator',
@@ -570,13 +681,15 @@ export default {
selectFile: 'Datei auswählen', selectFile: 'Datei auswählen',
importSuccess: 'Import erfolgreich', importSuccess: 'Import erfolgreich',
importConfirmTitle: 'Import bestätigen', importConfirmTitle: 'Import bestätigen',
importConfirmMessage: 'Beim Importieren wird der aktuelle Spielfortschritt überschrieben. Diese Aktion kann nicht rückgängig gemacht werden. Fortfahren?', importConfirmMessage:
'Beim Importieren wird der aktuelle Spielfortschritt überschrieben. Diese Aktion kann nicht rückgängig gemacht werden. Fortfahren?',
importFailed: 'Import fehlgeschlagen, bitte Dateiformat überprüfen', importFailed: 'Import fehlgeschlagen, bitte Dateiformat überprüfen',
clearData: 'Daten löschen', clearData: 'Daten löschen',
clearDataDesc: 'Alle Spieldaten löschen und zurücksetzen', clearDataDesc: 'Alle Spieldaten löschen und zurücksetzen',
clear: 'Löschen', clear: 'Löschen',
clearConfirmTitle: 'Löschen bestätigen', clearConfirmTitle: 'Löschen bestätigen',
clearConfirmMessage: 'Alle Spieldaten werden gelöscht und von vorne begonnen. Diese Aktion kann nicht rückgängig gemacht werden. Fortfahren?', clearConfirmMessage:
'Alle Spieldaten werden gelöscht und von vorne begonnen. Diese Aktion kann nicht rückgängig gemacht werden. Fortfahren?',
gameSettings: 'Spieleinstellungen', gameSettings: 'Spieleinstellungen',
gameSettingsDesc: 'Spielparameter und Einstellungen anpassen', gameSettingsDesc: 'Spielparameter und Einstellungen anpassen',
gamePause: 'Spielpause', gamePause: 'Spielpause',
@@ -619,9 +732,82 @@ export default {
modifyOfficers: 'Offiziere ändern', modifyOfficers: 'Offiziere ändern',
officersDesc: 'Offiziersablaufzeit schnell festlegen', officersDesc: 'Offiziersablaufzeit schnell festlegen',
days: 'T', days: 'T',
npcTesting: 'NPC-Test',
npcTestingDesc: 'NPC-Spionage- und Angriffsverhalten testen',
selectNPC: 'NPC auswählen',
chooseNPC: 'Wählen Sie einen NPC',
targetPlanet: 'Zielplanet',
chooseTarget: 'Zielplanet auswählen',
testSpy: 'Spionage testen',
testAttack: 'Angriff testen',
testSpyAndAttack: 'Spionage & Angriff testen',
initializeFleet: 'NPC-Flotte initialisieren',
accelerateMissions: 'Alle Missionen beschleunigen (5s)',
selectNPCFirst: 'Bitte wählen Sie zuerst einen NPC',
npcNoProbes: 'NPC hat keine Spionagesonden',
npcNoSpyReport: 'NPC muss zuerst spionieren',
npcMissionFailed: 'Mission konnte nicht erstellt werden',
dangerZone: 'Gefahrenzone', dangerZone: 'Gefahrenzone',
dangerZoneDesc: 'Die folgenden Vorgänge sind irreversibel', dangerZoneDesc: 'Die folgenden Vorgänge sind irreversibel',
resetGame: 'Spiel zurücksetzen', resetGame: 'Spiel zurücksetzen',
resetGameConfirm: 'Möchten Sie das Spiel wirklich zurücksetzen? Alle Daten werden gelöscht!' resetGameConfirm: 'Möchten Sie das Spiel wirklich zurücksetzen? Alle Daten werden gelöscht!'
},
alerts: {
npcSpyIncoming: 'NPC-Spionagesonde nähert sich',
npcAttackIncoming: 'NPC-Flotten-Angriff im Anmarsch!',
npcFleetIncoming: 'NPC-Flotte nähert sich',
ships: 'Schiffe',
spiedBy: 'Ausspioniert von',
attackedBy: 'Angegriffen von',
detectionSuccess: 'Spionage entdeckt',
detectionFailed: 'Spionage nicht entdeckt',
npcSpiedYourPlanet: 'NPC hat deinen Planeten ausspioniert',
npcAttackedYourPlanet: 'NPC hat deinen Planeten angegriffen'
},
diplomacy: {
title: 'Diplomatie',
description: 'Verwalte diplomatische Beziehungen mit NPCs',
tabs: {
all: 'Alle',
friendly: 'Freundlich',
neutral: 'Neutral',
hostile: 'Feindlich'
},
noNpcs: 'Keine NPCs',
noFriendlyNpcs: 'Keine freundlichen NPCs',
noNeutralNpcs: 'Keine neutralen NPCs',
noHostileNpcs: 'Keine feindlichen NPCs',
recentEvents: 'Aktuelle Ereignisse',
recentEventsDescription: 'Protokoll der jüngsten diplomatischen Aktivitäten',
ago: 'vor',
status: {
friendly: 'Freundlich',
neutral: 'Neutral',
hostile: 'Feindlich'
},
planets: 'Planeten',
allies: 'Verbündete',
reputation: 'Ansehen',
alliedWith: 'Verbündet mit',
more: 'weitere',
actions: {
gift: 'Geschenk senden',
viewPlanets: 'Planeten ansehen'
},
lastEvent: 'Letztes Ereignis',
events: {
gift: 'Geschenk gesendet',
attack: 'Angriff',
allyAttacked: 'Verbündeter angegriffen',
spy: 'Spionage',
stealDebris: 'Trümmer gestohlen'
}
},
pagination: {
previous: 'Vorherige',
next: 'Nächste',
first: 'Erste',
last: 'Letzte',
page: 'Seite {page}'
} }
} }

View File

@@ -62,6 +62,7 @@ export default {
officers: 'Officers', officers: 'Officers',
simulator: 'Simulator', simulator: 'Simulator',
galaxy: 'Galaxy', galaxy: 'Galaxy',
diplomacy: 'Diplomacy',
messages: 'Messages', messages: 'Messages',
settings: 'Settings', settings: 'Settings',
gm: 'GM' gm: 'GM'
@@ -97,6 +98,8 @@ export default {
coordinates: 'Coordinates', coordinates: 'Coordinates',
switchToMoon: 'View Moon', switchToMoon: 'View Moon',
backToPlanet: 'Back to Planet', backToPlanet: 'Back to Planet',
switchPlanet: 'Switch Planet',
currentPlanet: 'Current Planet',
fields: 'Fields', fields: 'Fields',
temperature: 'Temperature', temperature: 'Temperature',
homePlanet: 'Home Planet', homePlanet: 'Home Planet',
@@ -112,6 +115,7 @@ export default {
crystalMine: 'Crystal Mine', crystalMine: 'Crystal Mine',
deuteriumSynthesizer: 'Deuterium Synthesizer', deuteriumSynthesizer: 'Deuterium Synthesizer',
solarPlant: 'Solar Plant', solarPlant: 'Solar Plant',
fusionReactor: 'Fusion Reactor',
roboticsFactory: 'Robotics Factory', roboticsFactory: 'Robotics Factory',
naniteFactory: 'Nanite Factory', naniteFactory: 'Nanite Factory',
shipyard: 'Shipyard', shipyard: 'Shipyard',
@@ -120,6 +124,8 @@ export default {
crystalStorage: 'Crystal Storage', crystalStorage: 'Crystal Storage',
deuteriumTank: 'Deuterium Tank', deuteriumTank: 'Deuterium Tank',
darkMatterCollector: 'Dark Matter Collector', darkMatterCollector: 'Dark Matter Collector',
darkMatterTank: 'Dark Matter Tank',
missileSilo: 'Missile Silo',
terraformer: 'Terraformer', terraformer: 'Terraformer',
lunarBase: 'Lunar Base', lunarBase: 'Lunar Base',
sensorPhalanx: 'Sensor Phalanx', sensorPhalanx: 'Sensor Phalanx',
@@ -130,13 +136,24 @@ export default {
consumption: 'Consumption', consumption: 'Consumption',
totalCost: 'Total Cost', totalCost: 'Total Cost',
totalPoints: 'Total Points', totalPoints: 'Total Points',
levelRange: 'Level Range' levelRange: 'Level Range',
storageCapacity: 'Capacity',
energyProduction: 'Energy Production',
fleetStorage: 'Fleet Storage',
buildQueueBonus: 'Build Queue',
spaceBonus: 'Space Bonus',
buildSpeedBonus: 'Build Speed Bonus',
researchSpeedBonus: 'Research Speed Bonus',
missileCapacity: 'Missile Capacity'
}, },
buildingDescriptions: { buildingDescriptions: {
metalMine: 'Extracts metal resources', metalMine: 'Extracts metal resources',
crystalMine: 'Extracts crystal resources', crystalMine: 'Extracts crystal resources',
deuteriumSynthesizer: 'Synthesizes deuterium resources', deuteriumSynthesizer: 'Synthesizes deuterium resources',
solarPlant: 'Provides energy', solarPlant: 'Provides energy',
fusionReactor: 'Uses deuterium to generate large amounts of energy',
roboticsFactory: 'Accelerates construction speed', roboticsFactory: 'Accelerates construction speed',
naniteFactory: 'Increases build queue capacity, +1 per level (max 10 levels)', naniteFactory: 'Increases build queue capacity, +1 per level (max 10 levels)',
shipyard: 'Constructs ships', shipyard: 'Constructs ships',
@@ -145,6 +162,8 @@ export default {
crystalStorage: 'Increases crystal storage capacity', crystalStorage: 'Increases crystal storage capacity',
deuteriumTank: 'Increases deuterium storage capacity', deuteriumTank: 'Increases deuterium storage capacity',
darkMatterCollector: 'Collects rare dark matter resources', darkMatterCollector: 'Collects rare dark matter resources',
darkMatterTank: 'Increases dark matter storage capacity',
missileSilo: 'Stores and launches missiles, 10 missiles per level',
terraformer: 'Terraforms planet surface, adds 5 available space per level', terraformer: 'Terraforms planet surface, adds 5 available space per level',
lunarBase: 'Increases available space on the moon, +5 space per level', lunarBase: 'Increases available space on the moon, +5 space per level',
sensorPhalanx: 'Detects fleet activities in surrounding systems', sensorPhalanx: 'Detects fleet activities in surrounding systems',
@@ -156,11 +175,15 @@ export default {
heavyFighter: 'Heavy Fighter', heavyFighter: 'Heavy Fighter',
cruiser: 'Cruiser', cruiser: 'Cruiser',
battleship: 'Battleship', battleship: 'Battleship',
battlecruiser: 'Battlecruiser',
bomber: 'Bomber',
destroyer: 'Destroyer',
smallCargo: 'Small Cargo', smallCargo: 'Small Cargo',
largeCargo: 'Large Cargo', largeCargo: 'Large Cargo',
colonyShip: 'Colony Ship', colonyShip: 'Colony Ship',
recycler: 'Recycler', recycler: 'Recycler',
espionageProbe: 'Espionage Probe', espionageProbe: 'Espionage Probe',
solarSatellite: 'Solar Satellite',
darkMatterHarvester: 'Dark Matter Harvester', darkMatterHarvester: 'Dark Matter Harvester',
deathstar: 'Deathstar' deathstar: 'Deathstar'
}, },
@@ -169,11 +192,15 @@ export default {
heavyFighter: 'Heavily armored fighter', heavyFighter: 'Heavily armored fighter',
cruiser: 'Medium warship, balanced offense and defense', cruiser: 'Medium warship, balanced offense and defense',
battleship: 'Powerful warship', battleship: 'Powerful warship',
battlecruiser: 'Fast powerful warship, excels at attacking battleships',
bomber: 'Specialized ship for attacking defense structures',
destroyer: 'Hunter specialized in destroying large ships',
smallCargo: 'Transports small amounts of resources', smallCargo: 'Transports small amounts of resources',
largeCargo: 'Transports large amounts of resources', largeCargo: 'Transports large amounts of resources',
colonyShip: 'Used to colonize new planets', colonyShip: 'Used to colonize new planets',
recycler: 'Collects debris field resources', recycler: 'Collects debris field resources',
espionageProbe: 'Scouts enemy planets', espionageProbe: 'Scouts enemy planets',
solarSatellite: 'Provides extra energy, generates 50 energy per satellite',
darkMatterHarvester: 'Special ship for harvesting dark matter', darkMatterHarvester: 'Special ship for harvesting dark matter',
deathstar: 'Ultimate weapon capable of destroying entire planets' deathstar: 'Ultimate weapon capable of destroying entire planets'
}, },
@@ -186,6 +213,8 @@ export default {
plasmaTurret: 'Plasma Turret', plasmaTurret: 'Plasma Turret',
smallShieldDome: 'Small Shield Dome', smallShieldDome: 'Small Shield Dome',
largeShieldDome: 'Large Shield Dome', largeShieldDome: 'Large Shield Dome',
antiBallisticMissile: 'Anti-Ballistic Missile',
interplanetaryMissile: 'Interplanetary Missile',
planetaryShield: 'Planetary Shield' planetaryShield: 'Planetary Shield'
}, },
defenseDescriptions: { defenseDescriptions: {
@@ -197,13 +226,25 @@ export default {
plasmaTurret: 'Powerful defense facility', plasmaTurret: 'Powerful defense facility',
smallShieldDome: 'Small shield protecting the entire planet', smallShieldDome: 'Small shield protecting the entire planet',
largeShieldDome: 'Large shield protecting the entire planet', largeShieldDome: 'Large shield protecting the entire planet',
antiBallisticMissile: 'Intercepts enemy missiles, can intercept 1 interplanetary missile each',
interplanetaryMissile: 'Can attack defense structures on other planets',
planetaryShield: 'Super shield protecting planet from destruction attacks' planetaryShield: 'Super shield protecting planet from destruction attacks'
}, },
research: { research: {
researchTime: 'Research Time', researchTime: 'Research Time',
totalCost: 'Total Cost', totalCost: 'Total Cost',
totalPoints: 'Total Points', totalPoints: 'Total Points',
levelRange: 'Level Range' levelRange: 'Level Range',
attackBonus: 'Attack Bonus',
shieldBonus: 'Shield Bonus',
armorBonus: 'Armor Bonus',
spyLevel: 'Spy Level',
researchQueueBonus: 'Research Queue',
colonySlots: 'Colony Slots',
forAllPlanets: '(Global)',
speedBonus: 'Speed Bonus',
researchSpeedBonus: 'Research Speed Bonus'
}, },
technologies: { technologies: {
energyTechnology: 'Energy Technology', energyTechnology: 'Energy Technology',
@@ -212,6 +253,12 @@ export default {
hyperspaceTechnology: 'Hyperspace Technology', hyperspaceTechnology: 'Hyperspace Technology',
plasmaTechnology: 'Plasma Technology', plasmaTechnology: 'Plasma Technology',
computerTechnology: 'Computer Technology', computerTechnology: 'Computer Technology',
espionageTechnology: 'Espionage Technology',
weaponsTechnology: 'Weapons Technology',
shieldingTechnology: 'Shielding Technology',
armourTechnology: 'Armour Technology',
astrophysics: 'Astrophysics',
gravitonTechnology: 'Graviton Technology',
combustionDrive: 'Combustion Drive', combustionDrive: 'Combustion Drive',
impulseDrive: 'Impulse Drive', impulseDrive: 'Impulse Drive',
hyperspaceDrive: 'Hyperspace Drive', hyperspaceDrive: 'Hyperspace Drive',
@@ -226,6 +273,12 @@ export default {
hyperspaceTechnology: 'Hyperspace jump technology', hyperspaceTechnology: 'Hyperspace jump technology',
plasmaTechnology: 'Plasma weapon technology', plasmaTechnology: 'Plasma weapon technology',
computerTechnology: 'Increases research queue capacity, +1 per level (max 10 levels)', computerTechnology: 'Increases research queue capacity, +1 per level (max 10 levels)',
espionageTechnology: 'Improves spy probe effectiveness, +1 espionage level per level',
weaponsTechnology: 'Increases ship and defense attack power by 10% per level',
shieldingTechnology: 'Increases ship and defense shields by 10% per level',
armourTechnology: 'Increases ship and defense armour by 10% per level',
astrophysics: 'Each level adds 1 colony slot and increases expedition success rate',
gravitonTechnology: 'Studies graviton manipulation, required for Death Star',
combustionDrive: 'Basic propulsion technology', combustionDrive: 'Basic propulsion technology',
impulseDrive: 'Intermediate propulsion technology', impulseDrive: 'Intermediate propulsion technology',
hyperspaceDrive: 'Advanced propulsion technology', hyperspaceDrive: 'Advanced propulsion technology',
@@ -253,8 +306,11 @@ export default {
darkMatterSpecialist: 'Improves dark matter collection efficiency' darkMatterSpecialist: 'Improves dark matter collection efficiency'
}, },
queue: { queue: {
buildQueue: 'Build Queue', buildQueueBonus: 'Build Queue',
researchQueue: 'Research Queue', spaceBonus: 'Space Bonus',
buildSpeedBonus: 'Build Speed Bonus',
researchSpeedBonus: 'Research Speed Bonus',
researchQueueBonus: 'Research Queue',
building: 'Building', building: 'Building',
researching: 'Researching', researching: 'Researching',
remaining: 'Remaining', remaining: 'Remaining',
@@ -294,7 +350,9 @@ export default {
demolish: 'Demolish', demolish: 'Demolish',
demolishRefund: 'Demolish Refund', demolishRefund: 'Demolish Refund',
demolishFailed: 'Demolish Failed', demolishFailed: 'Demolish Failed',
demolishFailedMessage: 'Unable to demolish this building. Please check if the build queue is full or the building level is 0.' demolishFailedMessage: 'Unable to demolish this building. Please check if the build queue is full or the building level is 0.',
confirmDemolish: 'Confirm Demolish',
confirmDemolishMessage: 'Are you sure you want to demolish'
}, },
researchView: { researchView: {
title: 'Research', title: 'Research',
@@ -416,7 +474,10 @@ export default {
cargoExceedsCapacity: 'Cargo exceeds capacity', cargoExceedsCapacity: 'Cargo exceeds capacity',
noColonyShip: 'Colony ship required for colonization mission', noColonyShip: 'Colony ship required for colonization mission',
noDebrisAtTarget: 'No debris field at target coordinates or debris field is empty', noDebrisAtTarget: 'No debris field at target coordinates or debris field is empty',
noDeathstar: 'Deathstar required for destruction mission' noDeathstar: 'Deathstar required for destruction mission',
giftMode: 'Gift Mode',
giftModeDescription: 'Send resources as a gift to',
estimatedReputationGain: 'Estimated reputation gain'
}, },
officersView: { officersView: {
title: 'Officers', title: 'Officers',
@@ -437,7 +498,10 @@ export default {
fuelConsumption: 'Fuel Consumption', fuelConsumption: 'Fuel Consumption',
defense: 'Defense', defense: 'Defense',
storageCapacity: 'Storage Capacity', storageCapacity: 'Storage Capacity',
buildQueue: 'Build Queue', buildQueueBonus: 'Build Queue',
spaceBonus: 'Space Bonus',
buildSpeedBonus: 'Build Speed Bonus',
researchSpeedBonus: 'Research Speed Bonus',
fleetSlots: 'Fleet Slots', fleetSlots: 'Fleet Slots',
hire: 'Hire', hire: 'Hire',
renew: 'Renew', renew: 'Renew',
@@ -461,6 +525,9 @@ export default {
selectSystem: 'Select System', selectSystem: 'Select System',
view: 'View', view: 'View',
myPlanet: 'My Planet', myPlanet: 'My Planet',
myPlanets: 'My Planets',
npcPlanets: 'NPC Planets',
selectPlanetToView: 'Select planet to view',
totalPositions: '10 planet positions total', totalPositions: '10 planet positions total',
mine: 'Mine', mine: 'Mine',
hostile: 'Hostile', hostile: 'Hostile',
@@ -480,12 +547,19 @@ export default {
attackPlanetMessage: 'Are you sure you want to attack planet [{coordinates}]?\n\nPlease go to the fleet page to select ships and send.', attackPlanetMessage: 'Are you sure you want to attack planet [{coordinates}]?\n\nPlease go to the fleet page to select ships and send.',
colonizePlanetMessage: colonizePlanetMessage:
'Are you sure you want to colonize position [{coordinates}]?\n\nPlease go to the fleet page to send a colony ship.', 'Are you sure you want to colonize position [{coordinates}]?\n\nPlease go to the fleet page to send a colony ship.',
recyclePlanetMessage: 'Are you sure you want to recycle debris at position [{coordinates}]?\n\nPlease go to the fleet page to send recycler ships.' recyclePlanetMessage:
'Are you sure you want to recycle debris at position [{coordinates}]?\n\nPlease go to the fleet page to send recycler ships.',
sendGift: 'Send Gift',
debris: 'Debris',
giftPlanetTitle: 'Send Gift',
giftPlanetMessage:
'Are you sure you want to send resources as a gift to planet [{coordinates}]?\n\nPlease go to the fleet page to select transport ships and load resources.'
}, },
messagesView: { messagesView: {
title: 'Messages', title: 'Messages',
battles: 'Battles', battles: 'Battles',
spy: 'Spy', spy: 'Spy',
npc: 'NPC',
battleReports: 'Battle Reports', battleReports: 'Battle Reports',
spyReports: 'Spy Reports', spyReports: 'Spy Reports',
noBattleReports: 'No battle reports', noBattleReports: 'No battle reports',
@@ -508,7 +582,48 @@ export default {
defense: 'Defense', defense: 'Defense',
buildings: 'Buildings', buildings: 'Buildings',
unread: 'Unread', unread: 'Unread',
targetPlanet: 'Target Planet' targetPlanet: 'Target Planet',
spied: 'Spied',
spiedNotification: 'Spied Notification',
noSpiedNotifications: 'No spied notifications',
detected: 'Detected',
undetected: 'Undetected',
missions: 'Missions',
noMissionReports: 'No mission reports',
success: 'Success',
failed: 'Failed',
npcActivity: 'NPC Activity',
noNPCActivity: 'No NPC activity notifications',
npcRecycleActivity: 'NPC Recycling Debris',
gifts: 'Gifts',
giftRejected: 'Rejected',
noGiftNotifications: 'No gift notifications',
noGiftRejected: 'No rejected gifts',
giftFrom: 'Gift from {npcName}',
giftRejectedBy: '{npcName} rejected the gift',
giftResources: 'Gift resources',
rejectedResources: 'Rejected resources',
expectedReputation: 'Expected reputation',
currentReputation: 'Current reputation',
acceptGift: 'Accept',
rejectGift: 'Reject',
rejectionReason: {
hostile: 'They are hostile towards you and do not accept gifts',
neutral_distrust: 'They lack trust in you',
polite_decline: 'They politely declined'
}
},
missionReports: {
transportSuccess: 'Transport mission completed successfully',
transportFailed: 'Transport mission failed',
colonizeSuccess: 'Colonization mission successful, new planet established',
colonizeFailed: 'Colonization mission failed',
deploySuccess: 'Deployment mission completed successfully',
deployFailed: 'Deployment mission failed',
recycleSuccess: 'Recycling mission completed successfully',
recycleFailed: 'Recycling mission failed, no debris at target location',
destroySuccess: 'Planet destruction mission executed successfully',
destroyFailed: 'Planet destruction mission failed'
}, },
simulatorView: { simulatorView: {
title: 'Battle Simulator', title: 'Battle Simulator',
@@ -545,7 +660,12 @@ export default {
hideRoundDetails: 'Hide round details', hideRoundDetails: 'Hide round details',
round: 'Round {round}', round: 'Round {round}',
attackerRemainingPower: 'Attacker remaining power', attackerRemainingPower: 'Attacker remaining power',
defenderRemainingPower: 'Defender remaining power' defenderRemainingPower: 'Defender remaining power',
spied: 'Spied',
spiedNotification: 'Spied Notification',
noSpiedNotifications: 'No spied notifications',
detected: 'Detected',
undetected: 'Undetected'
}, },
settings: { settings: {
dataManagement: 'Data Management', dataManagement: 'Data Management',
@@ -610,9 +730,82 @@ export default {
modifyOfficers: 'Modify Officers', modifyOfficers: 'Modify Officers',
officersDesc: 'Quickly set officer expiration time', officersDesc: 'Quickly set officer expiration time',
days: 'd', days: 'd',
npcTesting: 'NPC Testing',
npcTestingDesc: 'Test NPC spy and attack behavior',
selectNPC: 'Select NPC',
chooseNPC: 'Choose an NPC',
targetPlanet: 'Target Planet',
chooseTarget: 'Choose target planet',
testSpy: 'Test Spy',
testAttack: 'Test Attack',
testSpyAndAttack: 'Test Spy & Attack',
initializeFleet: 'Initialize NPC Fleet',
accelerateMissions: 'Accelerate All Missions (5s)',
selectNPCFirst: 'Please select an NPC first',
npcNoProbes: 'NPC has no spy probes',
npcNoSpyReport: 'NPC needs to spy first',
npcMissionFailed: 'Failed to create mission',
dangerZone: 'Danger Zone', dangerZone: 'Danger Zone',
dangerZoneDesc: 'The following operations are irreversible', dangerZoneDesc: 'The following operations are irreversible',
resetGame: 'Reset Game', resetGame: 'Reset Game',
resetGameConfirm: 'Are you sure you want to reset the game? This will delete all data!' resetGameConfirm: 'Are you sure you want to reset the game? This will delete all data!'
},
alerts: {
npcSpyIncoming: 'NPC Spy Probe Incoming',
npcAttackIncoming: 'NPC Fleet Attack Incoming!',
npcFleetIncoming: 'NPC Fleet Approaching',
ships: 'ships',
spiedBy: 'Spied By',
attackedBy: 'Attacked By',
detectionSuccess: 'Spy detected',
detectionFailed: 'Spy not detected',
npcSpiedYourPlanet: 'NPC spied your planet',
npcAttackedYourPlanet: 'NPC attacked your planet'
},
diplomacy: {
title: 'Diplomacy',
description: 'Manage diplomatic relations with NPCs',
tabs: {
all: 'All',
friendly: 'Friendly',
neutral: 'Neutral',
hostile: 'Hostile'
},
noNpcs: 'No NPCs',
noFriendlyNpcs: 'No friendly NPCs',
noNeutralNpcs: 'No neutral NPCs',
noHostileNpcs: 'No hostile NPCs',
recentEvents: 'Recent Events',
recentEventsDescription: 'Recent diplomatic activity log',
ago: 'ago',
status: {
friendly: 'Friendly',
neutral: 'Neutral',
hostile: 'Hostile'
},
planets: 'planets',
allies: 'allies',
reputation: 'Reputation',
alliedWith: 'Allied with',
more: 'more',
actions: {
gift: 'Send Gift',
viewPlanets: 'View Planets'
},
lastEvent: 'Last Event',
events: {
gift: 'Sent Gift',
attack: 'Attack',
allyAttacked: 'Ally Attacked',
spy: 'Espionage',
stealDebris: 'Debris Stolen'
}
},
pagination: {
previous: 'Previous',
next: 'Next',
first: 'First',
last: 'Last',
page: 'Page {page}'
} }
} }

View File

@@ -62,6 +62,7 @@ export default {
officers: '士官', officers: '士官',
simulator: 'シミュレーター', simulator: 'シミュレーター',
galaxy: '銀河', galaxy: '銀河',
diplomacy: 'Diplomacy',
messages: 'メッセージ', messages: 'メッセージ',
settings: '設定', settings: '設定',
gm: 'GM' gm: 'GM'
@@ -97,6 +98,8 @@ export default {
coordinates: '座標', coordinates: '座標',
switchToMoon: '月を表示', switchToMoon: '月を表示',
backToPlanet: '母星に戻る', backToPlanet: '母星に戻る',
switchPlanet: '惑星を切り替える',
currentPlanet: '現在の惑星',
fields: 'フィールド', fields: 'フィールド',
temperature: '温度', temperature: '温度',
homePlanet: '母星', homePlanet: '母星',
@@ -112,6 +115,7 @@ export default {
crystalMine: 'クリスタル鉱山', crystalMine: 'クリスタル鉱山',
deuteriumSynthesizer: '重水素合成装置', deuteriumSynthesizer: '重水素合成装置',
solarPlant: '太陽光発電所', solarPlant: '太陽光発電所',
fusionReactor: '核融合炉',
roboticsFactory: 'ロボット工場', roboticsFactory: 'ロボット工場',
naniteFactory: 'ナノマシン工場', naniteFactory: 'ナノマシン工場',
shipyard: '造船所', shipyard: '造船所',
@@ -120,6 +124,8 @@ export default {
crystalStorage: 'クリスタル倉庫', crystalStorage: 'クリスタル倉庫',
deuteriumTank: '重水素タンク', deuteriumTank: '重水素タンク',
darkMatterCollector: 'ダークマター採取装置', darkMatterCollector: 'ダークマター採取装置',
darkMatterTank: 'ダークマタータンク',
missileSilo: 'ミサイル格納庫',
terraformer: 'テラフォーマー', terraformer: 'テラフォーマー',
lunarBase: '月面基地', lunarBase: '月面基地',
sensorPhalanx: 'センサーファランクス', sensorPhalanx: 'センサーファランクス',
@@ -130,13 +136,26 @@ export default {
consumption: '消費', consumption: '消費',
totalCost: '総コスト', totalCost: '総コスト',
totalPoints: '総ポイント', totalPoints: '総ポイント',
levelRange: 'レベル範囲' levelRange: 'レベル範囲',
capacity: 'Capacity/Effect',
storageCapacity: 'Capacity',
energyProduction: 'Energy Production',
fleetStorage: 'Fleet Storage',
buildQueue: 'Build Queue',
buildQueueBonus: '建造隊列',
spaceBonus: 'スペースボーナス',
buildSpeedBonus: '建設速度ボーナス',
researchSpeedBonus: '研究速度ボーナス',
planetSpace: 'Planet Space',
moonSpace: 'Moon Space',
missileCapacity: 'Missile Capacity'
}, },
buildingDescriptions: { buildingDescriptions: {
metalMine: '金属資源を採掘', metalMine: '金属資源を採掘',
crystalMine: 'クリスタル資源を採掘', crystalMine: 'クリスタル資源を採掘',
deuteriumSynthesizer: '重水素資源を合成', deuteriumSynthesizer: '重水素資源を合成',
solarPlant: 'エネルギーを供給', solarPlant: 'エネルギーを供給',
fusionReactor: '重水素を使用して大量のエネルギーを生成',
roboticsFactory: '建設速度を向上', roboticsFactory: '建設速度を向上',
naniteFactory: '建設キュー数を増加、レベル毎に+1最大10レベル', naniteFactory: '建設キュー数を増加、レベル毎に+1最大10レベル',
shipyard: '艦船を建造', shipyard: '艦船を建造',
@@ -145,6 +164,8 @@ export default {
crystalStorage: 'クリスタルの貯蔵上限を増加', crystalStorage: 'クリスタルの貯蔵上限を増加',
deuteriumTank: '重水素の貯蔵上限を増加', deuteriumTank: '重水素の貯蔵上限を増加',
darkMatterCollector: '希少なダークマター資源を収集', darkMatterCollector: '希少なダークマター資源を収集',
darkMatterTank: 'ダークマターの貯蔵上限を増加',
missileSilo: 'ミサイルを保管・発射、レベル毎に10発',
terraformer: '惑星地形を改造、レベル毎に利用可能スペース5増加', terraformer: '惑星地形を改造、レベル毎に利用可能スペース5増加',
lunarBase: '月の利用可能スペースを増加、レベル毎に+5スペース', lunarBase: '月の利用可能スペースを増加、レベル毎に+5スペース',
sensorPhalanx: '周辺星系の艦隊活動を探知', sensorPhalanx: '周辺星系の艦隊活動を探知',
@@ -156,11 +177,15 @@ export default {
heavyFighter: '重戦闘機', heavyFighter: '重戦闘機',
cruiser: '巡洋艦', cruiser: '巡洋艦',
battleship: '戦艦', battleship: '戦艦',
battlecruiser: '巡洋戦艦',
bomber: '爆撃機',
destroyer: '駆逐艦',
smallCargo: '小型輸送船', smallCargo: '小型輸送船',
largeCargo: '大型輸送船', largeCargo: '大型輸送船',
colonyShip: 'コロニーシップ', colonyShip: 'コロニーシップ',
recycler: 'リサイクラー', recycler: 'リサイクラー',
espionageProbe: 'スパイプローブ', espionageProbe: 'スパイプローブ',
solarSatellite: '太陽光衛星',
darkMatterHarvester: 'ダークマター採取船', darkMatterHarvester: 'ダークマター採取船',
deathstar: 'デススター' deathstar: 'デススター'
}, },
@@ -169,11 +194,15 @@ export default {
heavyFighter: '重装甲戦闘機', heavyFighter: '重装甲戦闘機',
cruiser: '中型戦艦、攻守バランス型', cruiser: '中型戦艦、攻守バランス型',
battleship: '強力な戦艦', battleship: '強力な戦艦',
battlecruiser: '高速強力な戦闘艦、戦艦への攻撃に優れる',
bomber: '防御施設への攻撃に特化した艦船',
destroyer: '大型艦の破壊に特化したハンター',
smallCargo: '少量の資源を輸送', smallCargo: '少量の資源を輸送',
largeCargo: '大量の資源を輸送', largeCargo: '大量の資源を輸送',
colonyShip: '新惑星の植民に使用', colonyShip: '新惑星の植民に使用',
recycler: 'デブリフィールドの資源を回収', recycler: 'デブリフィールドの資源を回収',
espionageProbe: '敵惑星を偵察', espionageProbe: '敵惑星を偵察',
solarSatellite: '追加エネルギーを提供、衛星1つにつき50エネルギー生成',
darkMatterHarvester: 'ダークマター採取専用の特殊艦', darkMatterHarvester: 'ダークマター採取専用の特殊艦',
deathstar: '惑星全体を破壊できる究極兵器' deathstar: '惑星全体を破壊できる究極兵器'
}, },
@@ -186,6 +215,8 @@ export default {
plasmaTurret: 'プラズマタレット', plasmaTurret: 'プラズマタレット',
smallShieldDome: '小型シールドドーム', smallShieldDome: '小型シールドドーム',
largeShieldDome: '大型シールドドーム', largeShieldDome: '大型シールドドーム',
antiBallisticMissile: '迎撃ミサイル',
interplanetaryMissile: '惑星間ミサイル',
planetaryShield: '惑星シールド' planetaryShield: '惑星シールド'
}, },
defenseDescriptions: { defenseDescriptions: {
@@ -197,13 +228,23 @@ export default {
plasmaTurret: '強力な防衛施設', plasmaTurret: '強力な防衛施設',
smallShieldDome: '惑星全体を保護する小型シールド', smallShieldDome: '惑星全体を保護する小型シールド',
largeShieldDome: '惑星全体を保護する大型シールド', largeShieldDome: '惑星全体を保護する大型シールド',
antiBallisticMissile: '敵ミサイルを迎撃、惑星間ミサイル1発を迎撃可能',
interplanetaryMissile: '他の惑星の防御施設を攻撃可能',
planetaryShield: '破壊攻撃から惑星を保護する超級シールド' planetaryShield: '破壊攻撃から惑星を保護する超級シールド'
}, },
research: { research: {
researchTime: '研究時間', researchTime: '研究時間',
totalCost: '総コスト', totalCost: '総コスト',
totalPoints: '総ポイント', totalPoints: '総ポイント',
levelRange: 'レベル範囲' levelRange: 'レベル範囲',
capacity: 'Capacity/Effect',
storageCapacity: 'Capacity',
energyProduction: 'Energy Production',
fleetStorage: 'Fleet Storage',
buildQueue: 'Build Queue',
planetSpace: 'Planet Space',
moonSpace: 'Moon Space',
missileCapacity: 'Missile Capacity'
}, },
technologies: { technologies: {
energyTechnology: 'エネルギー技術', energyTechnology: 'エネルギー技術',
@@ -212,6 +253,12 @@ export default {
hyperspaceTechnology: 'ハイパースペース技術', hyperspaceTechnology: 'ハイパースペース技術',
plasmaTechnology: 'プラズマ技術', plasmaTechnology: 'プラズマ技術',
computerTechnology: 'コンピューター技術', computerTechnology: 'コンピューター技術',
espionageTechnology: 'スパイ技術',
weaponsTechnology: '兵器技術',
shieldingTechnology: 'シールド技術',
armourTechnology: '装甲技術',
astrophysics: '天体物理学',
gravitonTechnology: '重力技術',
combustionDrive: '燃焼ドライブ', combustionDrive: '燃焼ドライブ',
impulseDrive: 'インパルスドライブ', impulseDrive: 'インパルスドライブ',
hyperspaceDrive: 'ハイパースペースドライブ', hyperspaceDrive: 'ハイパースペースドライブ',
@@ -226,6 +273,12 @@ export default {
hyperspaceTechnology: 'ハイパースペースジャンプ技術', hyperspaceTechnology: 'ハイパースペースジャンプ技術',
plasmaTechnology: 'プラズマ兵器技術', plasmaTechnology: 'プラズマ兵器技術',
computerTechnology: '研究キュー数を増加、レベル毎に+1最大10レベル', computerTechnology: '研究キュー数を増加、レベル毎に+1最大10レベル',
espionageTechnology: 'スパイ探査機の効果を向上、レベル毎に偵察深度+1',
weaponsTechnology: '艦船と防御の攻撃力をレベル毎に10%増加',
shieldingTechnology: '艦船と防御のシールドをレベル毎に10%増加',
armourTechnology: '艦船と防御の装甲をレベル毎に10%増加',
astrophysics: 'レベル毎に植民地スロット+1、探検成功率を向上',
gravitonTechnology: '重力操作を研究、デススターに必要',
combustionDrive: '基本推進技術', combustionDrive: '基本推進技術',
impulseDrive: '中級推進技術', impulseDrive: '中級推進技術',
hyperspaceDrive: '高級推進技術', hyperspaceDrive: '高級推進技術',
@@ -308,7 +361,9 @@ export default {
demolish: '解体', demolish: '解体',
demolishRefund: '解体返還', demolishRefund: '解体返還',
demolishFailed: '解体失敗', demolishFailed: '解体失敗',
demolishFailedMessage: 'この建物を解体できません。建設キューが満杯か、建物レベルが0でないか確認してください。' demolishFailedMessage: 'この建物を解体できません。建設キューが満杯か、建物レベルが0でないか確認してください。',
confirmDemolish: '',
confirmDemolishMessage: ''
}, },
researchView: { researchView: {
title: '研究', title: '研究',
@@ -380,6 +435,7 @@ export default {
all: '全て', all: '全て',
targetCoordinates: '目標座標', targetCoordinates: '目標座標',
galaxy: '銀河', galaxy: '銀河',
diplomacy: 'Diplomacy',
system: '星系', system: '星系',
position: '位置', position: '位置',
missionType: 'ミッションタイプ', missionType: 'ミッションタイプ',
@@ -413,7 +469,11 @@ export default {
cannotSendToOwnPlanet: '自分の惑星に艦隊を派遣できません', cannotSendToOwnPlanet: '自分の惑星に艦隊を派遣できません',
cargoExceedsCapacity: '積載量が容量を超えています', cargoExceedsCapacity: '積載量が容量を超えています',
noColonyShip: '植民ミッションにはコロニーシップが必要です', noColonyShip: '植民ミッションにはコロニーシップが必要です',
noDebrisAtTarget: '目標座標にデブリフィールドがないか、デブリフィールドが空です' noDebrisAtTarget: '目標座標にデブリフィールドがないか、デブリフィールドが空です',
noDeathstar: '破壊ミッションにはデススターが必要です',
giftMode: 'ギフトモード',
giftModeDescription: '資源を贈り物として送る',
estimatedReputationGain: '推定評判獲得'
}, },
officersView: { officersView: {
title: '士官', title: '士官',
@@ -453,11 +513,15 @@ export default {
title: '銀河', title: '銀河',
selectCoordinates: '座標選択', selectCoordinates: '座標選択',
galaxy: '銀河', galaxy: '銀河',
diplomacy: 'Diplomacy',
selectGalaxy: '銀河を選択', selectGalaxy: '銀河を選択',
system: '星系', system: '星系',
selectSystem: '星系を選択', selectSystem: '星系を選択',
view: '表示', view: '表示',
myPlanet: '自分の惑星', myPlanet: '自分の惑星',
myPlanets: '私の惑星',
npcPlanets: 'NPCの惑星',
selectPlanetToView: '表示する惑星を選択',
totalPositions: '全10惑星位置', totalPositions: '全10惑星位置',
mine: '自分', mine: '自分',
hostile: '敵対', hostile: '敵対',
@@ -475,12 +539,17 @@ export default {
scoutPlanetMessage: '惑星[{coordinates}]にスパイプローブを送りますか?\n\n艦隊ページに移動して艦船を選択して派遣してください。', scoutPlanetMessage: '惑星[{coordinates}]にスパイプローブを送りますか?\n\n艦隊ページに移動して艦船を選択して派遣してください。',
attackPlanetMessage: '惑星[{coordinates}]を攻撃しますか?\n\n艦隊ページに移動して艦船を選択して派遣してください。', attackPlanetMessage: '惑星[{coordinates}]を攻撃しますか?\n\n艦隊ページに移動して艦船を選択して派遣してください。',
colonizePlanetMessage: '位置[{coordinates}]を植民しますか?\n\n艦隊ページに移動してコロニーシップを派遣してください。', colonizePlanetMessage: '位置[{coordinates}]を植民しますか?\n\n艦隊ページに移動してコロニーシップを派遣してください。',
recyclePlanetMessage: '位置[{coordinates}]のデブリを回収しますか?\n\n艦隊ページに移動してリサイクラーを派遣してください。' recyclePlanetMessage: '位置[{coordinates}]のデブリを回収しますか?\n\n艦隊ページに移動してリサイクラーを派遣してください。',
sendGift: 'ギフト送信',
debris: '破片',
giftPlanetTitle: 'ギフト送信',
giftPlanetMessage: '惑星[{coordinates}]にリソースを贈りますか?\n\n艦隊ページに移動して輸送船を選択し、リソースを積載してください。'
}, },
messagesView: { messagesView: {
title: 'メッセージセンター', title: 'メッセージセンター',
battles: '戦闘', battles: '戦闘',
spy: 'スパイ', spy: 'スパイ',
npc: 'NPC',
battleReports: '戦闘レポート', battleReports: '戦闘レポート',
spyReports: 'スパイレポート', spyReports: 'スパイレポート',
noBattleReports: '戦闘レポートなし', noBattleReports: '戦闘レポートなし',
@@ -511,7 +580,48 @@ export default {
hideRoundDetails: 'ラウンド詳細非表示', hideRoundDetails: 'ラウンド詳細非表示',
round: '第{round}ラウンド', round: '第{round}ラウンド',
attackerRemainingPower: '攻撃側残存火力', attackerRemainingPower: '攻撃側残存火力',
defenderRemainingPower: '防御側残存火力' defenderRemainingPower: '防御側残存火力',
spied: '偵察された',
spiedNotification: '偵察通知',
noSpiedNotifications: '偵察通知はありません',
detected: '発見された',
undetected: '未発見',
missions: 'ミッション',
noMissionReports: 'ミッションレポートなし',
success: '成功',
failed: '失敗',
npcActivity: 'NPC活動',
noNPCActivity: 'NPC活動通知はありません',
npcRecycleActivity: 'NPCがデブリを回収',
gifts: 'ギフト',
giftRejected: '拒否',
noGiftNotifications: 'ギフト通知はありません',
noGiftRejected: '拒否された記録はありません',
giftFrom: '{npcName}からのギフト',
giftRejectedBy: '{npcName}がギフトを拒否しました',
giftResources: 'ギフトリソース',
rejectedResources: '拒否されたリソース',
expectedReputation: '期待される評判',
currentReputation: '現在の評判',
acceptGift: '受け取る',
rejectGift: '拒否',
rejectionReason: {
hostile: '相手は敵対的でギフトを受け取りません',
neutral_distrust: '相手はあなたを信頼していません',
polite_decline: '丁重に断りました'
}
},
missionReports: {
transportSuccess: '輸送ミッションが正常に完了しました',
transportFailed: '輸送ミッションが失敗しました',
colonizeSuccess: '植民ミッション成功、新しい惑星が確立されました',
colonizeFailed: '植民ミッションが失敗しました',
deploySuccess: '配備ミッションが正常に完了しました',
deployFailed: '配備ミッションが失敗しました',
recycleSuccess: '回収ミッションが正常に完了しました',
recycleFailed: '回収ミッションが失敗しました。目標位置にデブリがありません',
destroySuccess: '惑星破壊ミッションが正常に実行されました',
destroyFailed: '惑星破壊ミッションが失敗しました'
}, },
simulatorView: { simulatorView: {
title: '戦闘シミュレーター', title: '戦闘シミュレーター',
@@ -613,9 +723,82 @@ export default {
modifyOfficers: '士官を変更', modifyOfficers: '士官を変更',
officersDesc: '士官の有効期限を素早く設定', officersDesc: '士官の有効期限を素早く設定',
days: '日', days: '日',
npcTesting: 'NPCテスト',
npcTestingDesc: 'NPCの偵察と攻撃動作をテスト',
selectNPC: 'NPCを選択',
chooseNPC: 'NPCを選択してください',
targetPlanet: 'ターゲット惑星',
chooseTarget: 'ターゲット惑星を選択',
testSpy: '偵察テスト',
testAttack: '攻撃テスト',
testSpyAndAttack: '偵察&攻撃テスト',
initializeFleet: 'NPC艦隊を初期化',
accelerateMissions: 'すべてのミッションを加速(5秒)',
selectNPCFirst: '最初にNPCを選択してください',
npcNoProbes: 'NPCには偵察プローブがありません',
npcNoSpyReport: 'NPCは最初に偵察する必要があります',
npcMissionFailed: 'ミッションの作成に失敗しました',
dangerZone: '危険ゾーン', dangerZone: '危険ゾーン',
dangerZoneDesc: '以下の操作は元に戻せません', dangerZoneDesc: '以下の操作は元に戻せません',
resetGame: 'ゲームをリセット', resetGame: 'ゲームをリセット',
resetGameConfirm: 'ゲームをリセットしてもよろしいですか?すべてのデータが削除されます!' resetGameConfirm: 'ゲームをリセットしてもよろしいですか?すべてのデータが削除されます!'
},
alerts: {
npcSpyIncoming: 'NPC偵察プローブが接近中',
npcAttackIncoming: 'NPC艦隊攻撃が接近中',
npcFleetIncoming: 'NPC艦隊が接近中',
ships: '隻',
spiedBy: '偵察された',
attackedBy: '攻撃された',
detectionSuccess: '偵察が発見された',
detectionFailed: '偵察が発見されなかった',
npcSpiedYourPlanet: 'NPCがあなたの惑星を偵察しました',
npcAttackedYourPlanet: 'NPCがあなたの惑星を攻撃しました'
},
diplomacy: {
title: '外交',
description: 'NPCとの外交関係を管理',
tabs: {
all: 'すべて',
friendly: '友好的',
neutral: '中立',
hostile: '敵対的'
},
noNpcs: 'NPCなし',
noFriendlyNpcs: '友好的なNPCなし',
noNeutralNpcs: '中立なNPCなし',
noHostileNpcs: '敵対的なNPCなし',
recentEvents: '最近のイベント',
recentEventsDescription: '最近の外交活動ログ',
ago: '前',
status: {
friendly: '友好的',
neutral: '中立',
hostile: '敵対的'
},
planets: '惑星',
allies: '同盟',
reputation: '評判',
alliedWith: '同盟関係',
more: 'その他',
actions: {
gift: 'ギフトを送る',
viewPlanets: '惑星を表示'
},
lastEvent: '最後のイベント',
events: {
gift: 'ギフト送信',
attack: '攻撃',
allyAttacked: '同盟が攻撃された',
spy: '諜報活動',
stealDebris: '残骸を略奪'
}
},
pagination: {
previous: '前へ',
next: '次へ',
first: '最初',
last: '最後',
page: '{page}ページ'
} }
} }

View File

@@ -62,6 +62,7 @@ export default {
officers: '장교', officers: '장교',
simulator: '시뮬레이터', simulator: '시뮬레이터',
galaxy: '은하계', galaxy: '은하계',
diplomacy: 'Diplomacy',
messages: '메시지', messages: '메시지',
settings: '설정', settings: '설정',
gm: 'GM' gm: 'GM'
@@ -97,6 +98,8 @@ export default {
coordinates: '좌표', coordinates: '좌표',
switchToMoon: '위성 보기', switchToMoon: '위성 보기',
backToPlanet: '모행성으로 돌아가기', backToPlanet: '모행성으로 돌아가기',
switchPlanet: '행성 전환',
currentPlanet: '현재 행성',
fields: '필드', fields: '필드',
temperature: '온도', temperature: '온도',
homePlanet: '모행성', homePlanet: '모행성',
@@ -112,6 +115,7 @@ export default {
crystalMine: '크리스탈 광산', crystalMine: '크리스탈 광산',
deuteriumSynthesizer: '중수소 합성기', deuteriumSynthesizer: '중수소 합성기',
solarPlant: '태양광 발전소', solarPlant: '태양광 발전소',
fusionReactor: '핵융합 반응로',
roboticsFactory: '로봇 공장', roboticsFactory: '로봇 공장',
naniteFactory: '나노 공장', naniteFactory: '나노 공장',
shipyard: '조선소', shipyard: '조선소',
@@ -120,6 +124,8 @@ export default {
crystalStorage: '크리스탈 창고', crystalStorage: '크리스탈 창고',
deuteriumTank: '중수소 탱크', deuteriumTank: '중수소 탱크',
darkMatterCollector: '암흑 물질 수집기', darkMatterCollector: '암흑 물질 수집기',
darkMatterTank: '암흑 물질 탱크',
missileSilo: '미사일 발사대',
terraformer: '지형 변환기', terraformer: '지형 변환기',
lunarBase: '달 기지', lunarBase: '달 기지',
sensorPhalanx: '센서 팔랑크스', sensorPhalanx: '센서 팔랑크스',
@@ -130,13 +136,26 @@ export default {
consumption: '소비', consumption: '소비',
totalCost: '총 비용', totalCost: '총 비용',
totalPoints: '총 점수', totalPoints: '총 점수',
levelRange: '레벨 범위' levelRange: '레벨 범위',
capacity: 'Capacity/Effect',
storageCapacity: 'Capacity',
energyProduction: 'Energy Production',
fleetStorage: 'Fleet Storage',
buildQueue: 'Build Queue',
buildQueueBonus: '건설 대기열',
spaceBonus: '공간 보너스',
buildSpeedBonus: '건설 속도 보너스',
researchSpeedBonus: '연구 속도 보너스',
planetSpace: 'Planet Space',
moonSpace: 'Moon Space',
missileCapacity: 'Missile Capacity'
}, },
buildingDescriptions: { buildingDescriptions: {
metalMine: '금속 자원 채굴', metalMine: '금속 자원 채굴',
crystalMine: '크리스탈 자원 채굴', crystalMine: '크리스탈 자원 채굴',
deuteriumSynthesizer: '중수소 자원 합성', deuteriumSynthesizer: '중수소 자원 합성',
solarPlant: '에너지 제공', solarPlant: '에너지 제공',
fusionReactor: '중수소를 사용하여 대량의 에너지 생산',
roboticsFactory: '건설 속도 향상', roboticsFactory: '건설 속도 향상',
naniteFactory: '건설 대기열 수 증가, 레벨당 +1 (최대 10레벨)', naniteFactory: '건설 대기열 수 증가, 레벨당 +1 (최대 10레벨)',
shipyard: '함선 건조', shipyard: '함선 건조',
@@ -145,6 +164,8 @@ export default {
crystalStorage: '크리스탈 저장 용량 증가', crystalStorage: '크리스탈 저장 용량 증가',
deuteriumTank: '중수소 저장 용량 증가', deuteriumTank: '중수소 저장 용량 증가',
darkMatterCollector: '희귀한 암흑 물질 자원 수집', darkMatterCollector: '희귀한 암흑 물질 자원 수집',
darkMatterTank: '암흑 물질 저장 용량 증가',
missileSilo: '미사일을 저장 및 발사, 레벨당 10발',
terraformer: '행성 지형 개조, 레벨당 가용 공간 5 증가', terraformer: '행성 지형 개조, 레벨당 가용 공간 5 증가',
lunarBase: '달 가용 공간 증가, 레벨당 +5 공간', lunarBase: '달 가용 공간 증가, 레벨당 +5 공간',
sensorPhalanx: '주변 행성계의 함대 활동 감지', sensorPhalanx: '주변 행성계의 함대 활동 감지',
@@ -156,11 +177,15 @@ export default {
heavyFighter: '중전투기', heavyFighter: '중전투기',
cruiser: '순양함', cruiser: '순양함',
battleship: '전함', battleship: '전함',
battlecruiser: '순양전함',
bomber: '폭격기',
destroyer: '구축함',
smallCargo: '소형 수송선', smallCargo: '소형 수송선',
largeCargo: '대형 수송선', largeCargo: '대형 수송선',
colonyShip: '식민선', colonyShip: '식민선',
recycler: '재활용선', recycler: '재활용선',
espionageProbe: '정찰기', espionageProbe: '정찰기',
solarSatellite: '태양광 위성',
darkMatterHarvester: '암흑 물질 채취선', darkMatterHarvester: '암흑 물질 채취선',
deathstar: '데스스타' deathstar: '데스스타'
}, },
@@ -169,11 +194,15 @@ export default {
heavyFighter: '중장갑 전투기', heavyFighter: '중장갑 전투기',
cruiser: '중형 전함, 공격과 방어 균형', cruiser: '중형 전함, 공격과 방어 균형',
battleship: '강력한 전함', battleship: '강력한 전함',
battlecruiser: '빠르고 강력한 전투함, 전함 공격에 탁월',
bomber: '방어 시설 공격 전문 함선',
destroyer: '대형 함선 파괴 전문 헌터',
smallCargo: '소량의 자원 운송', smallCargo: '소량의 자원 운송',
largeCargo: '대량의 자원 운송', largeCargo: '대량의 자원 운송',
colonyShip: '새로운 행성 식민에 사용', colonyShip: '새로운 행성 식민에 사용',
recycler: '잔해장 자원 수집', recycler: '잔해장 자원 수집',
espionageProbe: '적 행성 정찰', espionageProbe: '적 행성 정찰',
solarSatellite: '추가 에너지 제공, 위성당 50 에너지 생성',
darkMatterHarvester: '암흑 물질 채취 전용 특수 함선', darkMatterHarvester: '암흑 물질 채취 전용 특수 함선',
deathstar: '행성 전체를 파괴할 수 있는 궁극 병기' deathstar: '행성 전체를 파괴할 수 있는 궁극 병기'
}, },
@@ -186,6 +215,8 @@ export default {
plasmaTurret: '플라즈마 포탑', plasmaTurret: '플라즈마 포탑',
smallShieldDome: '소형 실드 돔', smallShieldDome: '소형 실드 돔',
largeShieldDome: '대형 실드 돔', largeShieldDome: '대형 실드 돔',
antiBallisticMissile: '요격 미사일',
interplanetaryMissile: '행성간 미사일',
planetaryShield: '행성 실드' planetaryShield: '행성 실드'
}, },
defenseDescriptions: { defenseDescriptions: {
@@ -197,13 +228,23 @@ export default {
plasmaTurret: '강력한 방어 시설', plasmaTurret: '강력한 방어 시설',
smallShieldDome: '행성 전체를 보호하는 소형 실드', smallShieldDome: '행성 전체를 보호하는 소형 실드',
largeShieldDome: '행성 전체를 보호하는 대형 실드', largeShieldDome: '행성 전체를 보호하는 대형 실드',
antiBallisticMissile: '적 미사일 요격, 행성간 미사일 1발 요격 가능',
interplanetaryMissile: '다른 행성의 방어 시설 공격 가능',
planetaryShield: '파괴 공격으로부터 행성을 보호하는 초급 실드' planetaryShield: '파괴 공격으로부터 행성을 보호하는 초급 실드'
}, },
research: { research: {
researchTime: '연구 시간', researchTime: '연구 시간',
totalCost: '총 비용', totalCost: '총 비용',
totalPoints: '총 점수', totalPoints: '총 점수',
levelRange: '레벨 범위' levelRange: '레벨 범위',
capacity: 'Capacity/Effect',
storageCapacity: 'Capacity',
energyProduction: 'Energy Production',
fleetStorage: 'Fleet Storage',
buildQueue: 'Build Queue',
planetSpace: 'Planet Space',
moonSpace: 'Moon Space',
missileCapacity: 'Missile Capacity'
}, },
technologies: { technologies: {
energyTechnology: '에너지 기술', energyTechnology: '에너지 기술',
@@ -212,6 +253,12 @@ export default {
hyperspaceTechnology: '초공간 기술', hyperspaceTechnology: '초공간 기술',
plasmaTechnology: '플라즈마 기술', plasmaTechnology: '플라즈마 기술',
computerTechnology: '컴퓨터 기술', computerTechnology: '컴퓨터 기술',
espionageTechnology: '스파이 기술',
weaponsTechnology: '무기 기술',
shieldingTechnology: '실드 기술',
armourTechnology: '장갑 기술',
astrophysics: '천체물리학',
gravitonTechnology: '중력자 기술',
combustionDrive: '연소 엔진', combustionDrive: '연소 엔진',
impulseDrive: '임펄스 엔진', impulseDrive: '임펄스 엔진',
hyperspaceDrive: '초공간 엔진', hyperspaceDrive: '초공간 엔진',
@@ -226,6 +273,12 @@ export default {
hyperspaceTechnology: '초공간 점프 기술', hyperspaceTechnology: '초공간 점프 기술',
plasmaTechnology: '플라즈마 무기 기술', plasmaTechnology: '플라즈마 무기 기술',
computerTechnology: '연구 대기열 수 증가, 레벨당 +1 (최대 10레벨)', computerTechnology: '연구 대기열 수 증가, 레벨당 +1 (최대 10레벨)',
espionageTechnology: '스파이 탐사기 효과 향상, 레벨당 정찰 깊이 +1',
weaponsTechnology: '함선과 방어의 공격력 레벨당 10% 증가',
shieldingTechnology: '함선과 방어의 실드 레벨당 10% 증가',
armourTechnology: '함선과 방어의 장갑 레벨당 10% 증가',
astrophysics: '레벨당 식민지 슬롯 +1, 탐험 성공률 향상',
gravitonTechnology: '중력 조작 연구, 데스스타 필요 기술',
combustionDrive: '기본 추진 기술', combustionDrive: '기본 추진 기술',
impulseDrive: '중급 추진 기술', impulseDrive: '중급 추진 기술',
hyperspaceDrive: '고급 추진 기술', hyperspaceDrive: '고급 추진 기술',
@@ -293,7 +346,9 @@ export default {
demolish: '철거', demolish: '철거',
demolishRefund: '철거 환불', demolishRefund: '철거 환불',
demolishFailed: '철거 실패', demolishFailed: '철거 실패',
demolishFailedMessage: '이 건물을 철거할 수 없습니다. 건설 대기열이 가득 찼거나 건물 레벨이 0인지 확인하세요.' demolishFailedMessage: '이 건물을 철거할 수 없습니다. 건설 대기열이 가득 찼거나 건물 레벨이 0인지 확인하세요.',
confirmDemolish: '',
confirmDemolishMessage: ''
}, },
researchView: { researchView: {
title: '연구', title: '연구',
@@ -380,6 +435,7 @@ export default {
all: '전체', all: '전체',
targetCoordinates: '목표 좌표', targetCoordinates: '목표 좌표',
galaxy: '은하계', galaxy: '은하계',
diplomacy: 'Diplomacy',
system: '행성계', system: '행성계',
position: '위치', position: '위치',
missionType: '임무 유형', missionType: '임무 유형',
@@ -413,7 +469,11 @@ export default {
cannotSendToOwnPlanet: '자신의 행성으로 함대를 파견할 수 없습니다', cannotSendToOwnPlanet: '자신의 행성으로 함대를 파견할 수 없습니다',
cargoExceedsCapacity: '적재량이 용량을 초과합니다', cargoExceedsCapacity: '적재량이 용량을 초과합니다',
noColonyShip: '식민 임무를 위해 식민선이 필요합니다', noColonyShip: '식민 임무를 위해 식민선이 필요합니다',
noDebrisAtTarget: '대상 좌표에 잔해장이 없거나 잔해장이 비어 있습니다' noDebrisAtTarget: '대상 좌표에 잔해장이 없거나 잔해장이 비어 있습니다',
noDeathstar: '파괴 임무를 위해 데스스타가 필요합니다',
giftMode: '선물 모드',
giftModeDescription: '자원을 선물로 보내기',
estimatedReputationGain: '예상 평판 획득'
}, },
officersView: { officersView: {
title: '장교', title: '장교',
@@ -453,11 +513,15 @@ export default {
title: '은하계', title: '은하계',
selectCoordinates: '좌표 선택', selectCoordinates: '좌표 선택',
galaxy: '은하계', galaxy: '은하계',
diplomacy: 'Diplomacy',
selectGalaxy: '은하계 선택', selectGalaxy: '은하계 선택',
system: '행성계', system: '행성계',
selectSystem: '행성계 선택', selectSystem: '행성계 선택',
view: '보기', view: '보기',
myPlanet: '내 행성', myPlanet: '내 행성',
myPlanets: '내 행성들',
npcPlanets: 'NPC 행성들',
selectPlanetToView: '볼 행성 선택',
totalPositions: '총 10개 행성 위치', totalPositions: '총 10개 행성 위치',
mine: '내 것', mine: '내 것',
hostile: '적대', hostile: '적대',
@@ -476,12 +540,17 @@ export default {
'행성 [{coordinates}]을(를) 정찰하기 위해 정찰기를 보내시겠습니까?\n\n함대 페이지로 이동하여 함선을 선택하고 파견하세요.', '행성 [{coordinates}]을(를) 정찰하기 위해 정찰기를 보내시겠습니까?\n\n함대 페이지로 이동하여 함선을 선택하고 파견하세요.',
attackPlanetMessage: '행성 [{coordinates}]을(를) 공격하시겠습니까?\n\n함대 페이지로 이동하여 함선을 선택하고 파견하세요.', attackPlanetMessage: '행성 [{coordinates}]을(를) 공격하시겠습니까?\n\n함대 페이지로 이동하여 함선을 선택하고 파견하세요.',
colonizePlanetMessage: '위치 [{coordinates}]을(를) 식민하시겠습니까?\n\n함대 페이지로 이동하여 식민선을 파견하세요.', colonizePlanetMessage: '위치 [{coordinates}]을(를) 식민하시겠습니까?\n\n함대 페이지로 이동하여 식민선을 파견하세요.',
recyclePlanetMessage: '위치 [{coordinates}]의 잔해를 회수하시겠습니까?\n\n함대 페이지로 이동하여 회수선을 파견하세요.' recyclePlanetMessage: '위치 [{coordinates}]의 잔해를 회수하시겠습니까?\n\n함대 페이지로 이동하여 회수선을 파견하세요.',
sendGift: '선물 보내기',
debris: '잔해',
giftPlanetTitle: '선물 보내기',
giftPlanetMessage: '행성 [{coordinates}]에 자원을 선물로 보내시겠습니까?\n\n함대 페이지로 이동하여 수송선을 선택하고 자원을 적재하세요.'
}, },
messagesView: { messagesView: {
title: '메시지 센터', title: '메시지 센터',
battles: '전투', battles: '전투',
spy: '정찰', spy: '정찰',
npc: 'NPC',
battleReports: '전투 보고서', battleReports: '전투 보고서',
spyReports: '정찰 보고서', spyReports: '정찰 보고서',
noBattleReports: '전투 보고서 없음', noBattleReports: '전투 보고서 없음',
@@ -512,7 +581,48 @@ export default {
hideRoundDetails: '라운드 상세 숨기기', hideRoundDetails: '라운드 상세 숨기기',
round: '제{round}라운드', round: '제{round}라운드',
attackerRemainingPower: '공격자 잔여 화력', attackerRemainingPower: '공격자 잔여 화력',
defenderRemainingPower: '방어자 잔여 화력' defenderRemainingPower: '방어자 잔여 화력',
spied: '정찰당함',
spiedNotification: '정찰 알림',
noSpiedNotifications: '정찰 알림 없음',
detected: '발견됨',
undetected: '미발견',
missions: '임무',
noMissionReports: '임무 보고서 없음',
success: '성공',
failed: '실패',
npcActivity: 'NPC 활동',
noNPCActivity: 'NPC 활동 알림 없음',
npcRecycleActivity: 'NPC가 잔해 회수',
gifts: '선물',
giftRejected: '거부됨',
noGiftNotifications: '선물 알림 없음',
noGiftRejected: '거부된 기록 없음',
giftFrom: '{npcName}의 선물',
giftRejectedBy: '{npcName}가 선물을 거부했습니다',
giftResources: '선물 자원',
rejectedResources: '거부된 자원',
expectedReputation: '예상 평판',
currentReputation: '현재 평판',
acceptGift: '수락',
rejectGift: '거부',
rejectionReason: {
hostile: '상대방이 적대적이어서 선물을 받지 않습니다',
neutral_distrust: '상대방이 당신을 신뢰하지 않습니다',
polite_decline: '정중하게 거절했습니다'
}
},
missionReports: {
transportSuccess: '수송 임무가 성공적으로 완료되었습니다',
transportFailed: '수송 임무 실패',
colonizeSuccess: '식민 임무 성공, 새로운 행성이 건설되었습니다',
colonizeFailed: '식민 임무 실패',
deploySuccess: '배치 임무가 성공적으로 완료되었습니다',
deployFailed: '배치 임무 실패',
recycleSuccess: '회수 임무가 성공적으로 완료되었습니다',
recycleFailed: '회수 임무 실패, 목표 위치에 잔해가 없습니다',
destroySuccess: '행성 파괴 임무가 성공적으로 실행되었습니다',
destroyFailed: '행성 파괴 임무 실패'
}, },
simulatorView: { simulatorView: {
title: '전투 시뮬레이터', title: '전투 시뮬레이터',
@@ -614,9 +724,82 @@ export default {
modifyOfficers: '장교 수정', modifyOfficers: '장교 수정',
officersDesc: '장교 만료 시간을 빠르게 설정', officersDesc: '장교 만료 시간을 빠르게 설정',
days: '일', days: '일',
npcTesting: 'NPC 테스트',
npcTestingDesc: 'NPC 정찰 및 공격 동작 테스트',
selectNPC: 'NPC 선택',
chooseNPC: 'NPC를 선택하세요',
targetPlanet: '목표 행성',
chooseTarget: '목표 행성 선택',
testSpy: '정찰 테스트',
testAttack: '공격 테스트',
testSpyAndAttack: '정찰 & 공격 테스트',
initializeFleet: 'NPC 함대 초기화',
accelerateMissions: '모든 임무 가속(5초)',
selectNPCFirst: '먼저 NPC를 선택하세요',
npcNoProbes: 'NPC에 정찰 프로브가 없습니다',
npcNoSpyReport: 'NPC가 먼저 정찰해야 합니다',
npcMissionFailed: '임무 생성 실패',
dangerZone: '위험 구역', dangerZone: '위험 구역',
dangerZoneDesc: '다음 작업은 되돌릴 수 없습니다', dangerZoneDesc: '다음 작업은 되돌릴 수 없습니다',
resetGame: '게임 초기화', resetGame: '게임 초기화',
resetGameConfirm: '게임을 초기화하시겠습니까? 모든 데이터가 삭제됩니다!' resetGameConfirm: '게임을 초기화하시겠습니까? 모든 데이터가 삭제됩니다!'
},
alerts: {
npcSpyIncoming: 'NPC 정찰 프로브 접근 중',
npcAttackIncoming: 'NPC 함대 공격 진행 중!',
npcFleetIncoming: 'NPC 함대 접근 중',
ships: '척',
spiedBy: '정찰당함',
attackedBy: '공격당함',
detectionSuccess: '정찰 발견됨',
detectionFailed: '정찰 미발견',
npcSpiedYourPlanet: 'NPC가 당신의 행성을 정찰했습니다',
npcAttackedYourPlanet: 'NPC가 당신의 행성을 공격했습니다'
},
diplomacy: {
title: '외교',
description: 'NPC와의 외교 관계 관리',
tabs: {
all: '전체',
friendly: '우호적',
neutral: '중립',
hostile: '적대적'
},
noNpcs: 'NPC 없음',
noFriendlyNpcs: '우호적인 NPC 없음',
noNeutralNpcs: '중립적인 NPC 없음',
noHostileNpcs: '적대적인 NPC 없음',
recentEvents: '최근 이벤트',
recentEventsDescription: '최근 외교 활동 로그',
ago: '전',
status: {
friendly: '우호적',
neutral: '중립',
hostile: '적대적'
},
planets: '행성',
allies: '동맹',
reputation: '평판',
alliedWith: '동맹 관계',
more: '더보기',
actions: {
gift: '선물 보내기',
viewPlanets: '행성 보기'
},
lastEvent: '최근 이벤트',
events: {
gift: '선물 전송',
attack: '공격',
allyAttacked: '동맹 공격당함',
spy: '정찰',
stealDebris: '잔해 약탈'
}
},
pagination: {
previous: '이전',
next: '다음',
first: '처음',
last: '마지막',
page: '{page}페이지'
} }
} }

View File

@@ -62,6 +62,7 @@ export default {
officers: 'Офицеры', officers: 'Офицеры',
simulator: 'Симулятор', simulator: 'Симулятор',
galaxy: 'Галактика', galaxy: 'Галактика',
diplomacy: 'Diplomacy',
messages: 'Сообщения', messages: 'Сообщения',
settings: 'Настройки', settings: 'Настройки',
gm: 'GM' gm: 'GM'
@@ -97,6 +98,8 @@ export default {
coordinates: 'Координаты', coordinates: 'Координаты',
switchToMoon: 'На луну', switchToMoon: 'На луну',
backToPlanet: 'Вернуться на планету', backToPlanet: 'Вернуться на планету',
switchPlanet: 'Переключить планету',
currentPlanet: 'Текущая планета',
fields: 'Поля', fields: 'Поля',
temperature: 'Температура', temperature: 'Температура',
homePlanet: 'Родная планета', homePlanet: 'Родная планета',
@@ -112,6 +115,7 @@ export default {
crystalMine: 'Рудник кристалла', crystalMine: 'Рудник кристалла',
deuteriumSynthesizer: 'Синтезатор дейтерия', deuteriumSynthesizer: 'Синтезатор дейтерия',
solarPlant: 'Солнечная электростанция', solarPlant: 'Солнечная электростанция',
fusionReactor: 'Термоядерный реактор',
roboticsFactory: 'Фабрика роботов', roboticsFactory: 'Фабрика роботов',
naniteFactory: 'Нанитная фабрика', naniteFactory: 'Нанитная фабрика',
shipyard: 'Верфь', shipyard: 'Верфь',
@@ -120,6 +124,8 @@ export default {
crystalStorage: 'Хранилище кристалла', crystalStorage: 'Хранилище кристалла',
deuteriumTank: 'Цистерна дейтерия', deuteriumTank: 'Цистерна дейтерия',
darkMatterCollector: 'Коллектор тёмной материи', darkMatterCollector: 'Коллектор тёмной материи',
darkMatterTank: 'Резервуар тёмной материи',
missileSilo: 'Ракетная шахта',
terraformer: 'Терраформер', terraformer: 'Терраформер',
lunarBase: 'Лунная база', lunarBase: 'Лунная база',
sensorPhalanx: 'Сенсорная фаланга', sensorPhalanx: 'Сенсорная фаланга',
@@ -130,13 +136,26 @@ export default {
consumption: 'Потребление', consumption: 'Потребление',
totalCost: 'Общая стоимость', totalCost: 'Общая стоимость',
totalPoints: 'Общие очки', totalPoints: 'Общие очки',
levelRange: 'Диапазон уровней' levelRange: 'Диапазон уровней',
capacity: 'Capacity/Effect',
storageCapacity: 'Capacity',
energyProduction: 'Energy Production',
fleetStorage: 'Fleet Storage',
buildQueue: 'Build Queue',
buildQueueBonus: 'Очередь строительства',
spaceBonus: 'Бонус пространства',
buildSpeedBonus: 'Бонус скорости строительства',
researchSpeedBonus: 'Бонус скорости исследования',
planetSpace: 'Planet Space',
moonSpace: 'Moon Space',
missileCapacity: 'Missile Capacity'
}, },
buildingDescriptions: { buildingDescriptions: {
metalMine: 'Добывает металлические ресурсы', metalMine: 'Добывает металлические ресурсы',
crystalMine: 'Добывает кристаллические ресурсы', crystalMine: 'Добывает кристаллические ресурсы',
deuteriumSynthesizer: 'Синтезирует дейтериевые ресурсы', deuteriumSynthesizer: 'Синтезирует дейтериевые ресурсы',
solarPlant: 'Обеспечивает энергией', solarPlant: 'Обеспечивает энергией',
fusionReactor: 'Использует дейтерий для производства большого количества энергии',
roboticsFactory: 'Ускоряет скорость строительства', roboticsFactory: 'Ускоряет скорость строительства',
naniteFactory: 'Увеличивает вместимость очереди строительства, +1 за уровень (макс 10 уровней)', naniteFactory: 'Увеличивает вместимость очереди строительства, +1 за уровень (макс 10 уровней)',
shipyard: 'Строит корабли', shipyard: 'Строит корабли',
@@ -145,6 +164,8 @@ export default {
crystalStorage: 'Увеличивает ёмкость хранилища кристалла', crystalStorage: 'Увеличивает ёмкость хранилища кристалла',
deuteriumTank: 'Увеличивает ёмкость хранилища дейтерия', deuteriumTank: 'Увеличивает ёмкость хранилища дейтерия',
darkMatterCollector: 'Собирает редкие ресурсы тёмной материи', darkMatterCollector: 'Собирает редкие ресурсы тёмной материи',
darkMatterTank: 'Увеличивает ёмкость хранилища тёмной материи',
missileSilo: 'Хранит и запускает ракеты, 10 ракет на уровень',
terraformer: 'Терраформирует поверхность планеты, увеличивает доступное пространство на 5 за уровень', terraformer: 'Терраформирует поверхность планеты, увеличивает доступное пространство на 5 за уровень',
lunarBase: 'Увеличивает доступное пространство на луне, +5 пространства за уровень', lunarBase: 'Увеличивает доступное пространство на луне, +5 пространства за уровень',
sensorPhalanx: 'Обнаруживает активность флота в окружающих системах', sensorPhalanx: 'Обнаруживает активность флота в окружающих системах',
@@ -156,11 +177,15 @@ export default {
heavyFighter: 'Тяжёлый истребитель', heavyFighter: 'Тяжёлый истребитель',
cruiser: 'Крейсер', cruiser: 'Крейсер',
battleship: 'Линкор', battleship: 'Линкор',
battlecruiser: 'Линейный крейсер',
bomber: 'Бомбардировщик',
destroyer: 'Эсминец',
smallCargo: 'Малый транспорт', smallCargo: 'Малый транспорт',
largeCargo: 'Большой транспорт', largeCargo: 'Большой транспорт',
colonyShip: 'Колонизатор', colonyShip: 'Колонизатор',
recycler: 'Переработчик', recycler: 'Переработчик',
espionageProbe: 'Шпионский зонд', espionageProbe: 'Шпионский зонд',
solarSatellite: 'Солнечный спутник',
darkMatterHarvester: 'Сборщик тёмной материи', darkMatterHarvester: 'Сборщик тёмной материи',
deathstar: 'Звезда Смерти' deathstar: 'Звезда Смерти'
}, },
@@ -169,11 +194,15 @@ export default {
heavyFighter: 'Тяжелобронированный истребитель', heavyFighter: 'Тяжелобронированный истребитель',
cruiser: 'Средний боевой корабль, сбалансированная атака и защита', cruiser: 'Средний боевой корабль, сбалансированная атака и защита',
battleship: 'Мощный боевой корабль', battleship: 'Мощный боевой корабль',
battlecruiser: 'Быстрый мощный боевой корабль, отлично атакует линкоры',
bomber: 'Специализированный корабль для атаки оборонительных сооружений',
destroyer: 'Охотник, специализирующийся на уничтожении крупных кораблей',
smallCargo: 'Транспортирует небольшое количество ресурсов', smallCargo: 'Транспортирует небольшое количество ресурсов',
largeCargo: 'Транспортирует большое количество ресурсов', largeCargo: 'Транспортирует большое количество ресурсов',
colonyShip: 'Используется для колонизации новых планет', colonyShip: 'Используется для колонизации новых планет',
recycler: 'Собирает ресурсы с поля обломков', recycler: 'Собирает ресурсы с поля обломков',
espionageProbe: 'Разведывает вражеские планеты', espionageProbe: 'Разведывает вражеские планеты',
solarSatellite: 'Обеспечивает дополнительную энергию, генерирует 50 энергии на спутник',
darkMatterHarvester: 'Специальный корабль для сбора тёмной материи', darkMatterHarvester: 'Специальный корабль для сбора тёмной материи',
deathstar: 'Абсолютное оружие, способное уничтожать целые планеты' deathstar: 'Абсолютное оружие, способное уничтожать целые планеты'
}, },
@@ -186,6 +215,8 @@ export default {
plasmaTurret: 'Плазменная турель', plasmaTurret: 'Плазменная турель',
smallShieldDome: 'Малый щитовой купол', smallShieldDome: 'Малый щитовой купол',
largeShieldDome: 'Большой щитовой купол', largeShieldDome: 'Большой щитовой купол',
antiBallisticMissile: 'Противоракета',
interplanetaryMissile: 'Межпланетная ракета',
planetaryShield: 'Планетарный щит' planetaryShield: 'Планетарный щит'
}, },
defenseDescriptions: { defenseDescriptions: {
@@ -197,13 +228,23 @@ export default {
plasmaTurret: 'Мощное оборонительное сооружение', plasmaTurret: 'Мощное оборонительное сооружение',
smallShieldDome: 'Малый щит, защищающий всю планету', smallShieldDome: 'Малый щит, защищающий всю планету',
largeShieldDome: 'Большой щит, защищающий всю планету', largeShieldDome: 'Большой щит, защищающий всю планету',
antiBallisticMissile: 'Перехватывает вражеские ракеты, может перехватить 1 межпланетную ракету',
interplanetaryMissile: 'Может атаковать оборонительные сооружения на других планетах',
planetaryShield: 'Суперщит, защищающий планету от атак уничтожения' planetaryShield: 'Суперщит, защищающий планету от атак уничтожения'
}, },
research: { research: {
researchTime: 'Время исследования', researchTime: 'Время исследования',
totalCost: 'Общая стоимость', totalCost: 'Общая стоимость',
totalPoints: 'Общие очки', totalPoints: 'Общие очки',
levelRange: 'Диапазон уровней' levelRange: 'Диапазон уровней',
capacity: 'Capacity/Effect',
storageCapacity: 'Capacity',
energyProduction: 'Energy Production',
fleetStorage: 'Fleet Storage',
buildQueue: 'Build Queue',
planetSpace: 'Planet Space',
moonSpace: 'Moon Space',
missileCapacity: 'Missile Capacity'
}, },
technologies: { technologies: {
energyTechnology: 'Энергетическая технология', energyTechnology: 'Энергетическая технология',
@@ -212,6 +253,12 @@ export default {
hyperspaceTechnology: 'Гиперпространственная технология', hyperspaceTechnology: 'Гиперпространственная технология',
plasmaTechnology: 'Плазменная технология', plasmaTechnology: 'Плазменная технология',
computerTechnology: 'Компьютерная технология', computerTechnology: 'Компьютерная технология',
espionageTechnology: 'Шпионаж',
weaponsTechnology: 'Оружие',
shieldingTechnology: 'Щиты',
armourTechnology: 'Броня',
astrophysics: 'Астрофизика',
gravitonTechnology: 'Гравитоны',
combustionDrive: 'Реактивный двигатель', combustionDrive: 'Реактивный двигатель',
impulseDrive: 'Импульсный двигатель', impulseDrive: 'Импульсный двигатель',
hyperspaceDrive: 'Гиперпространственный двигатель', hyperspaceDrive: 'Гиперпространственный двигатель',
@@ -226,11 +273,18 @@ export default {
hyperspaceTechnology: 'Технология гиперпространственных прыжков', hyperspaceTechnology: 'Технология гиперпространственных прыжков',
plasmaTechnology: 'Технология плазменного оружия', plasmaTechnology: 'Технология плазменного оружия',
computerTechnology: 'Увеличивает вместимость очереди исследований, +1 за уровень (макс 10 уровней)', computerTechnology: 'Увеличивает вместимость очереди исследований, +1 за уровень (макс 10 уровней)',
espionageTechnology: 'Повышает эффективность зондов, +1 уровень шпионажа за уровень',
weaponsTechnology: 'Увеличивает силу атаки кораблей и обороны на 10% за уровень',
shieldingTechnology: 'Увеличивает щиты кораблей и обороны на 10% за уровень',
armourTechnology: 'Увеличивает броню кораблей и обороны на 10% за уровень',
astrophysics: 'Каждый уровень добавляет 1 слот колонии и повышает шанс успеха экспедиций',
gravitonTechnology: 'Изучает манипуляцию гравитонами, требуется для Звезды смерти',
combustionDrive: 'Базовая технология двигателей', combustionDrive: 'Базовая технология двигателей',
impulseDrive: 'Средняя технология двигателей', impulseDrive: 'Средняя технология двигателей',
hyperspaceDrive: 'Продвинутая технология двигателей', hyperspaceDrive: 'Продвинутая технология двигателей',
darkMatterTechnology: 'Исследование свойств и применения тёмной материи', darkMatterTechnology: 'Исследование свойств и применения тёмной материи',
terraformingTechnology: 'Исследование технологии терраформирования планет, увеличивает доступное пространство всех планет на 3 за уровень', terraformingTechnology:
'Исследование технологии терраформирования планет, увеличивает доступное пространство всех планет на 3 за уровень',
planetDestructionTech: 'Исследование ужасающей технологии уничтожения целых планет' planetDestructionTech: 'Исследование ужасающей технологии уничтожения целых планет'
}, },
officers: { officers: {
@@ -293,7 +347,9 @@ export default {
demolish: 'Снести', demolish: 'Снести',
demolishRefund: 'Возврат от сноса', demolishRefund: 'Возврат от сноса',
demolishFailed: 'Снос не удался', demolishFailed: 'Снос не удался',
demolishFailedMessage: 'Невозможно снести это здание. Проверьте, не заполнена ли очередь строительства или уровень здания не равен 0.' demolishFailedMessage: 'Невозможно снести это здание. Проверьте, не заполнена ли очередь строительства или уровень здания не равен 0.',
confirmDemolish: '',
confirmDemolishMessage: ''
}, },
researchView: { researchView: {
title: 'Исследования', title: 'Исследования',
@@ -382,6 +438,7 @@ export default {
all: 'Все', all: 'Все',
targetCoordinates: 'Целевые координаты', targetCoordinates: 'Целевые координаты',
galaxy: 'Галактика', galaxy: 'Галактика',
diplomacy: 'Diplomacy',
system: 'Система', system: 'Система',
position: 'Позиция', position: 'Позиция',
missionType: 'Тип миссии', missionType: 'Тип миссии',
@@ -415,7 +472,11 @@ export default {
cannotSendToOwnPlanet: 'Невозможно отправить флот на свою планету', cannotSendToOwnPlanet: 'Невозможно отправить флот на свою планету',
cargoExceedsCapacity: 'Груз превышает вместимость', cargoExceedsCapacity: 'Груз превышает вместимость',
noColonyShip: 'Для колонизационной миссии требуется колониальный корабль', noColonyShip: 'Для колонизационной миссии требуется колониальный корабль',
noDebrisAtTarget: 'Нет поля обломков по целевым координатам или поле обломков пусто' noDebrisAtTarget: 'Нет поля обломков по целевым координатам или поле обломков пусто',
noDeathstar: 'Для миссии разрушения требуется Звезда Смерти',
giftMode: 'Режим подарка',
giftModeDescription: 'Отправить ресурсы в подарок',
estimatedReputationGain: 'Ожидаемый прирост репутации'
}, },
officersView: { officersView: {
title: 'Офицеры', title: 'Офицеры',
@@ -455,11 +516,15 @@ export default {
title: 'Галактика', title: 'Галактика',
selectCoordinates: 'Выбрать координаты', selectCoordinates: 'Выбрать координаты',
galaxy: 'Галактика', galaxy: 'Галактика',
diplomacy: 'Diplomacy',
selectGalaxy: 'Выбрать галактику', selectGalaxy: 'Выбрать галактику',
system: 'Система', system: 'Система',
selectSystem: 'Выбрать систему', selectSystem: 'Выбрать систему',
view: 'Показать', view: 'Показать',
myPlanet: 'Моя планета', myPlanet: 'Моя планета',
myPlanets: 'Мои планеты',
npcPlanets: 'Планеты NPC',
selectPlanetToView: 'Выберите планету для просмотра',
totalPositions: 'Всего 10 позиций планет', totalPositions: 'Всего 10 позиций планет',
mine: 'Моя', mine: 'Моя',
hostile: 'Враждебная', hostile: 'Враждебная',
@@ -481,12 +546,18 @@ export default {
colonizePlanetMessage: colonizePlanetMessage:
'Вы уверены, что хотите колонизировать позицию [{coordinates}]?\n\nПерейдите на страницу флота, чтобы отправить колонизационный корабль.', 'Вы уверены, что хотите колонизировать позицию [{coordinates}]?\n\nПерейдите на страницу флота, чтобы отправить колонизационный корабль.',
recyclePlanetMessage: recyclePlanetMessage:
'Вы уверены, что хотите переработать обломки в позиции [{coordinates}]?\n\nПерейдите на страницу флота, чтобы отправить переработчики.' 'Вы уверены, что хотите переработать обломки в позиции [{coordinates}]?\n\nПерейдите на страницу флота, чтобы отправить переработчики.',
sendGift: 'Отправить подарок',
debris: 'Обломки',
giftPlanetTitle: 'Отправить подарок',
giftPlanetMessage:
'Вы уверены, что хотите отправить ресурсы в подарок планете [{coordinates}]?\n\nПерейдите на страницу флота, чтобы выбрать транспортные корабли и загрузить ресурсы.'
}, },
messagesView: { messagesView: {
title: 'Сообщения', title: 'Сообщения',
battles: 'Битвы', battles: 'Битвы',
spy: 'Разведка', spy: 'Разведка',
npc: 'NPC',
battleReports: 'Отчёты о боях', battleReports: 'Отчёты о боях',
spyReports: 'Отчёты разведки', spyReports: 'Отчёты разведки',
noBattleReports: 'Нет отчётов о боях', noBattleReports: 'Нет отчётов о боях',
@@ -517,7 +588,48 @@ export default {
hideRoundDetails: 'Скрыть детали раундов', hideRoundDetails: 'Скрыть детали раундов',
round: 'Раунд {round}', round: 'Раунд {round}',
attackerRemainingPower: 'Оставшаяся мощь нападающего', attackerRemainingPower: 'Оставшаяся мощь нападающего',
defenderRemainingPower: 'Оставшаяся мощь защитника' defenderRemainingPower: 'Оставшаяся мощь защитника',
spied: 'Шпионаж',
spiedNotification: 'Уведомление о шпионаже',
noSpiedNotifications: 'Нет уведомлений о шпионаже',
detected: 'Обнаружено',
undetected: 'Не обнаружено',
missions: 'Миссии',
noMissionReports: 'Нет отчётов о миссиях',
success: 'Успех',
failed: 'Неудача',
npcActivity: 'Активность NPC',
noNPCActivity: 'Нет уведомлений об активности NPC',
npcRecycleActivity: 'NPC перерабатывает обломки',
gifts: 'Подарки',
giftRejected: 'Отклонено',
noGiftNotifications: 'Нет уведомлений о подарках',
noGiftRejected: 'Нет отклоненных подарков',
giftFrom: 'Подарок от {npcName}',
giftRejectedBy: '{npcName} отклонил подарок',
giftResources: 'Ресурсы подарка',
rejectedResources: 'Отклоненные ресурсы',
expectedReputation: 'Ожидаемая репутация',
currentReputation: 'Текущая репутация',
acceptGift: 'Принять',
rejectGift: 'Отклонить',
rejectionReason: {
hostile: 'Они враждебны и не принимают подарки',
neutral_distrust: 'Они вам не доверяют',
polite_decline: 'Вежливо отказались'
}
},
missionReports: {
transportSuccess: 'Миссия транспортировки успешно завершена',
transportFailed: 'Миссия транспортировки провалена',
colonizeSuccess: 'Миссия колонизации успешна, новая планета создана',
colonizeFailed: 'Миссия колонизации провалена',
deploySuccess: 'Миссия размещения успешно завершена',
deployFailed: 'Миссия размещения провалена',
recycleSuccess: 'Миссия переработки успешно завершена',
recycleFailed: 'Миссия переработки провалена, нет обломков в целевой позиции',
destroySuccess: 'Миссия уничтожения планеты успешно выполнена',
destroyFailed: 'Миссия уничтожения планеты провалена'
}, },
simulatorView: { simulatorView: {
title: 'Симулятор боя', title: 'Симулятор боя',
@@ -619,9 +731,82 @@ export default {
modifyOfficers: 'Изменить офицеров', modifyOfficers: 'Изменить офицеров',
officersDesc: 'Быстрая установка времени истечения офицеров', officersDesc: 'Быстрая установка времени истечения офицеров',
days: 'д', days: 'д',
npcTesting: 'Тестирование NPC',
npcTestingDesc: 'Тестирование разведки и атак NPC',
selectNPC: 'Выбрать NPC',
chooseNPC: 'Выберите NPC',
targetPlanet: 'Целевая планета',
chooseTarget: 'Выберите целевую планету',
testSpy: 'Тест разведки',
testAttack: 'Тест атаки',
testSpyAndAttack: 'Тест разведки и атаки',
initializeFleet: 'Инициализировать флот NPC',
accelerateMissions: 'Ускорить все миссии (5с)',
selectNPCFirst: 'Сначала выберите NPC',
npcNoProbes: 'У NPC нет шпионских зондов',
npcNoSpyReport: 'NPC нужно сначала разведать',
npcMissionFailed: 'Не удалось создать миссию',
dangerZone: 'Опасная зона', dangerZone: 'Опасная зона',
dangerZoneDesc: 'Следующие операции необратимы', dangerZoneDesc: 'Следующие операции необратимы',
resetGame: 'Сбросить игру', resetGame: 'Сбросить игру',
resetGameConfirm: 'Вы уверены, что хотите сбросить игру? Все данные будут удалены!' resetGameConfirm: 'Вы уверены, что хотите сбросить игру? Все данные будут удалены!'
},
alerts: {
npcSpyIncoming: 'Приближается шпионский зонд NPC',
npcAttackIncoming: 'Атака флота NPC приближается!',
npcFleetIncoming: 'Приближается флот NPC',
ships: 'кораблей',
spiedBy: 'Разведан',
attackedBy: 'Атакован',
detectionSuccess: 'Разведка обнаружена',
detectionFailed: 'Разведка не обнаружена',
npcSpiedYourPlanet: 'NPC разведал вашу планету',
npcAttackedYourPlanet: 'NPC атаковал вашу планету'
},
diplomacy: {
title: 'Дипломатия',
description: 'Управление дипломатическими отношениями с NPC',
tabs: {
all: 'Все',
friendly: 'Дружественные',
neutral: 'Нейтральные',
hostile: 'Враждебные'
},
noNpcs: 'Нет NPC',
noFriendlyNpcs: 'Нет дружественных NPC',
noNeutralNpcs: 'Нет нейтральных NPC',
noHostileNpcs: 'Нет враждебных NPC',
recentEvents: 'Недавние события',
recentEventsDescription: 'Журнал последних дипломатических действий',
ago: 'назад',
status: {
friendly: 'Дружественный',
neutral: 'Нейтральный',
hostile: 'Враждебный'
},
planets: 'планет',
allies: 'союзников',
reputation: 'Репутация',
alliedWith: 'В союзе с',
more: 'еще',
actions: {
gift: 'Отправить подарок',
viewPlanets: 'Посмотреть планеты'
},
lastEvent: 'Последнее событие',
events: {
gift: 'Подарок отправлен',
attack: 'Атака',
allyAttacked: 'Союзник атакован',
spy: 'Шпионаж',
stealDebris: 'Обломки украдены'
}
},
pagination: {
previous: 'Предыдущая',
next: 'Следующая',
first: 'Первая',
last: 'Последняя',
page: 'Страница {page}'
} }
} }

Some files were not shown because too many files have changed in this diff Show More