feat: 优化 README 及文档结构,新增英文说明

删除 README.zh-CN.md,新增英文版 README.EN.md,简体中文说明合并至 README.md 并补充内容。同步 docs/assets 下页面 JS/CSS 文件,优化文档资源命名与引用,提升多语言文档一致性。
This commit is contained in:
谦君
2025-12-11 15:21:51 +08:00
parent 705ee8c3db
commit 9754140cbf
49 changed files with 860 additions and 487 deletions

241
README.EN.md Normal file
View File

@@ -0,0 +1,241 @@
<div align="center">
<img src="public/logo.svg" alt="OGame Vue TS Logo" width="128" height="128">
# OGame Vue TS
A modern web-based implementation of the classic OGame space strategy game, built with Vue 3 and TypeScript.
[![License: CC BY-NC 4.0](https://img.shields.io/badge/License-CC%20BY--NC%204.0-lightgrey.svg)](https://creativecommons.org/licenses/by-nc/4.0/)
[![Vue 3](https://img.shields.io/badge/Vue-3.5-brightgreen.svg)](https://vuejs.org/)
[![TypeScript](https://img.shields.io/badge/TypeScript-5.9-blue.svg)](https://www.typescriptlang.org/)
[![Vite](https://img.shields.io/badge/Vite-7.2-646CFF.svg)](https://vitejs.dev/)
[简体中文](README.md) | English
</div>
## 📖 About
OGame Vue TS is a single-player, browser-based space strategy game inspired by the classic OGame. Build your empire across the galaxy, research technologies, construct ships, and engage in epic space battles. This project is built with modern web technologies, offering a smooth and responsive gaming experience entirely in your browser with local data persistence.
## ✨ Features
- 🌍 **Multi-language Support** - Available in 6 languages: English, Chinese (Simplified & Traditional), German, Russian, and Korean
- 🏗️ **Building Management** - Construct and upgrade various buildings on planets and moons
- 🔬 **Research Technologies** - Unlock advanced technologies to enhance your empire
- 🚀 **Fleet Management** - Build ships, send missions, and engage in tactical space battles
- 🛡️ **Defense Systems** - Deploy defensive structures to protect your colonies
- 👨‍✈️ **Officers System** - Recruit officers to gain strategic advantages
- ⚔️ **Battle Simulator** - Test combat scenarios before committing resources
- 🌌 **Galaxy View** - Explore the universe and interact with other planets
- 💾 **Local Data Persistence** - All game data is encrypted and stored locally in your browser
- 🌓 **Dark/Light Mode** - Choose your preferred visual theme
- 📊 **Queue Management** - Manage multiple build and research queues
- 🌙 **Moon Generation** - Chance-based moon creation from debris fields
## 🛠️ Tech Stack
- **Frontend Framework:** [Vue 3](https://vuejs.org/) with Composition API (`<script setup>`)
- **Language:** [TypeScript](https://www.typescriptlang.org/) with strict type checking
- **Build Tool:** [Vite](https://vitejs.dev/) (Custom Rolldown-Vite 7.2.5)
- **State Management:** [Pinia](https://pinia.vuejs.org/) with persisted state plugin
- **Routing:** [Vue Router 4](https://router.vuejs.org/)
- **UI Components:** [shadcn-vue](https://www.shadcn-vue.com/) (New York style)
- **Styling:** [Tailwind CSS v4](https://tailwindcss.com/) with CSS variables
- **Icons:** [Lucide Vue Next](https://lucide.dev/)
- **Animations:** [tw-animate-css](https://www.npmjs.com/package/tw-animate-css)
- **Internationalization:** Custom i18n implementation
## 🚀 Quick Start
### Prerequisites
- [Node.js](https://nodejs.org/) (version 18 or higher recommended)
- [pnpm](https://pnpm.io/) (version 10.13.1 or higher)
### Installation
```bash
# Clone the repository
git clone https://github.com/setube/ogame-vue-ts.git
# Navigate to project directory
cd ogame-vue-ts
# Install dependencies
pnpm install
```
### Development
```bash
# Start development server (runs on port 25121)
pnpm dev
```
Open your browser and visit `http://localhost:25121`
### Build for Production
```bash
# Build the application
pnpm build
# Preview production build
pnpm preview
```
## 📁 Project Structure
```
ogame-vue-ts/
├── public/ # Static assets
│ └── logo.svg # Application logo
├── src/
│ ├── assets/ # Dynamic assets
│ ├── components/ # Vue components
│ │ └── ui/ # shadcn-vue UI components
│ ├── composables/ # Vue composables
│ ├── config/ # Game configuration
│ ├── lib/ # Utility libraries
│ ├── locales/ # i18n translation files
│ ├── logic/ # Game logic modules
│ │ ├── buildingLogic.ts
│ │ ├── buildingValidation.ts
│ │ ├── fleetLogic.ts
│ │ ├── moonLogic.ts
│ │ ├── moonValidation.ts
│ │ ├── researchLogic.ts
│ │ ├── researchValidation.ts
│ │ ├── shipLogic.ts
│ │ └── shipValidation.ts
│ ├── router/ # Vue Router configuration
│ ├── stores/ # Pinia state stores
│ ├── types/ # TypeScript type definitions
│ ├── utils/ # Utility functions
│ ├── views/ # Page components
│ │ ├── OverviewView.vue
│ │ ├── BuildingsView.vue
│ │ ├── ResearchView.vue
│ │ ├── ShipyardView.vue
│ │ ├── DefenseView.vue
│ │ ├── FleetView.vue
│ │ ├── GalaxyView.vue
│ │ ├── OfficersView.vue
│ │ ├── BattleSimulatorView.vue
│ │ ├── MessagesView.vue
│ │ └── SettingsView.vue
│ ├── App.vue # Root component
│ ├── main.ts # Application entry point
│ └── style.css # Global styles
├── .github/
│ └── ISSUE_TEMPLATE/ # GitHub issue templates
├── CLAUDE.md # AI assistant instructions
├── LICENSE # CC BY-NC 4.0 License
├── package.json # Project dependencies
├── tsconfig.json # TypeScript configuration
└── vite.config.ts # Vite configuration
```
## 🌐 Available Languages
- 🇺🇸 English
- 🇨🇳 简体中文 (Simplified Chinese)
- 🇹🇼 繁體中文 (Traditional Chinese)
- 🇩🇪 Deutsch (German)
- 🇷🇺 Русский (Russian)
- 🇰🇷 한국어 (Korean)
## 🎮 Game Features
### Resource Management
- **Metal** - Primary construction material
- **Crystal** - Advanced technology component
- **Deuterium** - Fuel and research resource
- **Dark Matter** - Premium resource
- **Energy** - Powers your facilities
### Building Types
- **Resource Buildings** - Metal Mine, Crystal Mine, Deuterium Synthesizer, Solar Plant
- **Facilities** - Robotics Factory, Shipyard, Research Lab, Storage facilities
- **Special Buildings** - Nanite Factory, Terraformer, and more
### Technologies
- **Energy Technology** - Improves energy efficiency
- **Laser Technology** - Enhances weapon systems
- **Ion Technology** - Advanced propulsion and weapons
- **Hyperspace Technology** - Enables faster travel
- **Plasma Technology** - Ultimate weapon systems
- And many more...
### Ship Classes
- **Civil Ships** - Small/Large Cargo, Colony Ship, Recycler
- **Combat Ships** - Light/Heavy Fighter, Cruiser, Battleship, Bomber
- **Special Ships** - Deathstar, Battlecruiser, Destroyer
### Defense Systems
- Rocket Launcher, Light/Heavy Laser, Gauss Cannon
- Ion Cannon, Plasma Turret
- Small/Large Shield Dome
## 🔒 Data Security
All game data is automatically encrypted using AES encryption before being stored in your browser's local storage. Your game progress is secure and private.
## 🎨 Customization
The application supports full theme customization through Tailwind CSS variables defined in `src/style.css`. You can easily switch between light and dark modes.
## 🤝 Contributing
Contributions are welcome! Please feel free to submit issues or pull requests.
### Issue Templates
We provide the following issue templates in both Chinese and English:
- 🐛 Bug Report
- ✨ Feature Request
- 📚 Documentation Improvement
- 💡 Feedback & Suggestion
## 📄 License
This work is licensed under the [Creative Commons Attribution-NonCommercial 4.0 International License](https://creativecommons.org/licenses/by-nc/4.0/).
### You are free to:
- **Share** — copy and redistribute the material in any medium or format
- **Adapt** — remix, transform, and build upon the material
### Under the following terms:
- **Attribution** — You must give appropriate credit, provide a link to the license, and indicate if changes were made
- **NonCommercial** — You may not use the material for commercial purposes
**Original Author:** Jun Qian (谦君)
## 👨‍💻 Author
- **GitHub:** [@setube](https://github.com/setube)
- **Project:** [ogame-vue-ts](https://github.com/setube/ogame-vue-ts)
## 💬 Community
### Chinese Community
- **QQ Group:** 920930589
### Global Community
- **GitHub Issues:** [Report bugs or request features](https://github.com/setube/ogame-vue-ts/issues)
- **GitHub Discussions:** [Join the conversation](https://github.com/setube/ogame-vue-ts/discussions)
## 🙏 Acknowledgments
This project is inspired by the original [OGame](https://ogame.org/) browser game. All game mechanics and design elements are reimplemented for educational and entertainment purposes.
## ⚠️ Disclaimer
This project is not affiliated with, endorsed by, or connected to Gameforge AG or the official OGame game. It is an independent fan project created for educational purposes and personal enjoyment.
---
<div align="center">
Made with ❤️ by Jun Qian
<br>
© 2025 - All rights reserved (except those granted by CC BY-NC 4.0 License)
</div>

311
README.md
View File

@@ -3,239 +3,240 @@
# OGame Vue TS # OGame Vue TS
A modern web-based implementation of the classic OGame space strategy game, built with Vue 3 and TypeScript. 一个基于 Vue 3 和 TypeScript 构建的现代化 OGame 太空策略游戏 Web 实现。
[![License: CC BY-NC 4.0](https://img.shields.io/badge/License-CC%20BY--NC%204.0-lightgrey.svg)](https://creativecommons.org/licenses/by-nc/4.0/) [![License: CC BY-NC 4.0](https://img.shields.io/badge/License-CC%20BY--NC%204.0-lightgrey.svg)](https://creativecommons.org/licenses/by-nc/4.0/)
[![Vue 3](https://img.shields.io/badge/Vue-3.5-brightgreen.svg)](https://vuejs.org/) [![Vue 3](https://img.shields.io/badge/Vue-3.5-brightgreen.svg)](https://vuejs.org/)
[![TypeScript](https://img.shields.io/badge/TypeScript-5.9-blue.svg)](https://www.typescriptlang.org/) [![TypeScript](https://img.shields.io/badge/TypeScript-5.9-blue.svg)](https://www.typescriptlang.org/)
[![Vite](https://img.shields.io/badge/Vite-7.2-646CFF.svg)](https://vitejs.dev/) [![Vite](https://img.shields.io/badge/Vite-7.2-646CFF.svg)](https://vitejs.dev/)
[English](README-EN.md) | 简体中文
</div> </div>
## 📖 About ## 📖 关于项目
OGame Vue TS is a single-player, browser-based space strategy game inspired by the classic OGame. Build your empire across the galaxy, research technologies, construct ships, and engage in epic space battles. This project is built with modern web technologies, offering a smooth and responsive gaming experience entirely in your browser with local data persistence. OGame Vue TS 是一款受经典 OGame 游戏启发的单机版、基于浏览器的太空策略游戏。在银河系中建立你的帝国,研究科技,建造舰船,参与史诗般的太空战斗。本项目采用现代 Web 技术构建,完全在浏览器中运行,提供流畅且响应迅速的游戏体验,所有数据都存储在本地。
## ✨ Features ## ✨ 核心特性
- 🌍 **Multi-language Support** - Available in 6 languages: English, Chinese (Simplified & Traditional), German, Russian, and Korean - 🌍 **多语言支持** - 支持 6 种语言:英语、简体中文、繁体中文、德语、俄语和韩语
- 🏗️ **Building Management** - Construct and upgrade various buildings on planets and moons - 🏗️ **建筑管理** - 在行星和月球上建造和升级各种建筑
- 🔬 **Research Technologies** - Unlock advanced technologies to enhance your empire - 🔬 **科技研究** - 解锁先进科技来增强你的帝国
- 🚀 **Fleet Management** - Build ships, send missions, and engage in tactical space battles - 🚀 **舰队管理** - 建造舰船、派遣任务、参与战术太空战斗
- 🛡️ **Defense Systems** - Deploy defensive structures to protect your colonies - 🛡️ **防御系统** - 部署防御设施来保护你的殖民地
- 👨‍✈️ **Officers System** - Recruit officers to gain strategic advantages - 👨‍✈️ **军官系统** - 招募军官以获得战略优势
- ⚔️ **Battle Simulator** - Test combat scenarios before committing resources - ⚔️ **战斗模拟器** - 在投入资源前测试战斗场景
- 🌌 **Galaxy View** - Explore the universe and interact with other planets - 🌌 **银河视图** - 探索宇宙并与其他星球互动
- 💾 **Local Data Persistence** - All game data is encrypted and stored locally in your browser - 💾 **本地数据持久化** - 所有游戏数据都经过加密并存储在浏览器本地
- 🌓 **Dark/Light Mode** - Choose your preferred visual theme - 🌓 **深色/浅色主题** - 选择你喜欢的视觉主题
- 📊 **Queue Management** - Manage multiple build and research queues - 📊 **队列管理** - 管理多个建造和研究队列
- 🌙 **Moon Generation** - Chance-based moon creation from debris fields - 🌙 **月球生成** - 基于概率的月球从残骸场生成机制
## 🛠️ Tech Stack ## 🛠️ 技术栈
- **Frontend Framework:** [Vue 3](https://vuejs.org/) with Composition API (`<script setup>`) - **前端框架:** [Vue 3](https://vuejs.org/) + Composition API (`<script setup>` 语法)
- **Language:** [TypeScript](https://www.typescriptlang.org/) with strict type checking - **开发语言:** [TypeScript](https://www.typescriptlang.org/) (启用严格类型检查)
- **Build Tool:** [Vite](https://vitejs.dev/) (Custom Rolldown-Vite 7.2.5) - **构建工具:** [Vite](https://vitejs.dev/) (自定义 Rolldown-Vite 7.2.5)
- **State Management:** [Pinia](https://pinia.vuejs.org/) with persisted state plugin - **状态管理:** [Pinia](https://pinia.vuejs.org/) + 持久化插件
- **Routing:** [Vue Router 4](https://router.vuejs.org/) - **路由管理:** [Vue Router 4](https://router.vuejs.org/)
- **UI Components:** [shadcn-vue](https://www.shadcn-vue.com/) (New York style) - **UI 组件:** [shadcn-vue](https://www.shadcn-vue.com/) (New York 风格)
- **Styling:** [Tailwind CSS v4](https://tailwindcss.com/) with CSS variables - **样式方案:** [Tailwind CSS v4](https://tailwindcss.com/) + CSS 变量
- **Icons:** [Lucide Vue Next](https://lucide.dev/) - **图标库:** [Lucide Vue Next](https://lucide.dev/)
- **Animations:** [tw-animate-css](https://www.npmjs.com/package/tw-animate-css) - **动画效果:** [tw-animate-css](https://www.npmjs.com/package/tw-animate-css)
- **Internationalization:** Custom i18n implementation - **国际化:** 自定义 i18n 实现
- **Encryption:** [CryptoJS](https://cryptojs.gitbook.io/) for data security
## 🚀 Quick Start ## 🚀 快速开始
### Prerequisites ### 环境要求
- [Node.js](https://nodejs.org/) (version 18 or higher recommended) - [Node.js](https://nodejs.org/) (推荐 18 或更高版本)
- [pnpm](https://pnpm.io/) (version 10.13.1 or higher) - [pnpm](https://pnpm.io/) (版本 10.13.1 或更高)
### Installation ### 安装
```bash ```bash
# Clone the repository # 克隆仓库
git clone https://github.com/setube/ogame-vue-ts.git git clone https://github.com/setube/ogame-vue-ts.git
# Navigate to project directory # 进入项目目录
cd ogame-vue-ts cd ogame-vue-ts
# Install dependencies # 安装依赖
pnpm install pnpm install
``` ```
### Development ### 开发
```bash ```bash
# Start development server (runs on port 25121) # 启动开发服务器 (运行在端口 25121)
pnpm dev pnpm dev
``` ```
Open your browser and visit `http://localhost:25121` 在浏览器中访问 `http://localhost:25121`
### Build for Production ### 生产构建
```bash ```bash
# Build the application # 构建应用
pnpm build pnpm build
# Preview production build # 预览生产构建
pnpm preview pnpm preview
``` ```
## 📁 Project Structure ## 📁 项目结构
``` ```
ogame-vue-ts/ ogame-vue-ts/
├── public/ # Static assets ├── public/ # 静态资源
│ └── logo.svg # Application logo │ └── logo.svg # 应用图标
├── src/ ├── src/
│ ├── assets/ # Dynamic assets │ ├── assets/ # 动态资源
│ ├── components/ # Vue components │ ├── components/ # Vue 组件
│ │ └── ui/ # shadcn-vue UI components │ │ └── ui/ # shadcn-vue UI 组件
│ ├── composables/ # Vue composables │ ├── composables/ # Vue 组合式函数
│ ├── config/ # Game configuration │ ├── config/ # 游戏配置
│ ├── lib/ # Utility libraries │ ├── lib/ # 工具库
│ ├── locales/ # i18n translation files │ ├── locales/ # 国际化翻译文件
│ ├── logic/ # Game logic modules │ ├── logic/ # 游戏逻辑模块
│ │ ├── buildingLogic.ts │ │ ├── buildingLogic.ts # 建筑逻辑
│ │ ├── buildingValidation.ts │ │ ├── buildingValidation.ts # 建筑验证
│ │ ├── fleetLogic.ts │ │ ├── fleetLogic.ts # 舰队逻辑
│ │ ├── moonLogic.ts │ │ ├── moonLogic.ts # 月球逻辑
│ │ ├── moonValidation.ts │ │ ├── moonValidation.ts # 月球验证
│ │ ├── researchLogic.ts │ │ ├── researchLogic.ts # 研究逻辑
│ │ ├── researchValidation.ts │ │ ├── researchValidation.ts # 研究验证
│ │ ├── shipLogic.ts │ │ ├── shipLogic.ts # 舰船逻辑
│ │ └── shipValidation.ts │ │ └── shipValidation.ts # 舰船验证
│ ├── router/ # Vue Router configuration │ ├── router/ # Vue Router 路由配置
│ ├── stores/ # Pinia state stores │ ├── stores/ # Pinia 状态存储
│ ├── types/ # TypeScript type definitions │ ├── types/ # TypeScript 类型定义
│ ├── utils/ # Utility functions │ ├── utils/ # 工具函数
│ ├── views/ # Page components │ ├── views/ # 页面组件
│ │ ├── OverviewView.vue │ │ ├── OverviewView.vue # 概览页面
│ │ ├── BuildingsView.vue │ │ ├── BuildingsView.vue # 建筑页面
│ │ ├── ResearchView.vue │ │ ├── ResearchView.vue # 研究页面
│ │ ├── ShipyardView.vue │ │ ├── ShipyardView.vue # 船坞页面
│ │ ├── DefenseView.vue │ │ ├── DefenseView.vue # 防御页面
│ │ ├── FleetView.vue │ │ ├── FleetView.vue # 舰队页面
│ │ ├── GalaxyView.vue │ │ ├── GalaxyView.vue # 银河页面
│ │ ├── OfficersView.vue │ │ ├── OfficersView.vue # 军官页面
│ │ ├── BattleSimulatorView.vue │ │ ├── BattleSimulatorView.vue # 战斗模拟器
│ │ ├── MessagesView.vue │ │ ├── MessagesView.vue # 消息页面
│ │ └── SettingsView.vue │ │ └── SettingsView.vue # 设置页面
│ ├── App.vue # Root component │ ├── App.vue # 根组件
│ ├── main.ts # Application entry point │ ├── main.ts # 应用入口
│ └── style.css # Global styles │ └── style.css # 全局样式
├── .github/ ├── .github/
│ └── ISSUE_TEMPLATE/ # GitHub issue templates │ └── ISSUE_TEMPLATE/ # GitHub issue 模板
├── CLAUDE.md # AI assistant instructions ├── CLAUDE.md # AI 助手说明文档
├── LICENSE # CC BY-NC 4.0 License ├── LICENSE # CC BY-NC 4.0 许可证
├── package.json # Project dependencies ├── package.json # 项目依赖
├── tsconfig.json # TypeScript configuration ├── tsconfig.json # TypeScript 配置
└── vite.config.ts # Vite configuration └── vite.config.ts # Vite 配置
``` ```
## 🌐 Available Languages ## 🌐 支持的语言
- 🇺🇸 English - 🇺🇸 English (英语)
- 🇨🇳 简体中文 (Simplified Chinese) - 🇨🇳 简体中文
- 🇹🇼 繁體中文 (Traditional Chinese) - 🇹🇼 繁體中文
- 🇩🇪 Deutsch (German) - 🇩🇪 Deutsch (德语)
- 🇷🇺 Русский (Russian) - 🇷🇺 Русский (俄语)
- 🇰🇷 한국어 (Korean) - 🇰🇷 한국어 (韩语)
## 🎮 Game Features ## 🎮 游戏特性
### Resource Management ### 资源管理
- **Metal** - Primary construction material - **金属** - 主要建筑材料
- **Crystal** - Advanced technology component - **晶体** - 高级科技组件
- **Deuterium** - Fuel and research resource - **重氢** - 燃料和研究资源
- **Dark Matter** - Premium resource - **暗物质** - 高级资源
- **Energy** - Powers your facilities - **能量** - 为设施供电
### Building Types ### 建筑类型
- **Resource Buildings** - Metal Mine, Crystal Mine, Deuterium Synthesizer, Solar Plant - **资源建筑** - 金属矿、晶体矿、重氢合成器、太阳能发电厂
- **Facilities** - Robotics Factory, Shipyard, Research Lab, Storage facilities - **设施建筑** - 机器人工厂、船坞、研究实验室、仓储设施
- **Special Buildings** - Nanite Factory, Terraformer, and more - **特殊建筑** - 纳米机器人工厂、行星改造器等
### Technologies ### 科技系统
- **Energy Technology** - Improves energy efficiency - **能量技术** - 提高能量效率
- **Laser Technology** - Enhances weapon systems - **激光技术** - 增强武器系统
- **Ion Technology** - Advanced propulsion and weapons - **离子技术** - 高级推进和武器
- **Hyperspace Technology** - Enables faster travel - **超空间技术** - 实现更快的旅行
- **Plasma Technology** - Ultimate weapon systems - **等离子技术** - 终极武器系统
- And many more... - 还有更多...
### Ship Classes ### 舰船类别
- **Civil Ships** - Small/Large Cargo, Colony Ship, Recycler - **民用舰船** - 小型/大型货船、殖民船、回收船
- **Combat Ships** - Light/Heavy Fighter, Cruiser, Battleship, Bomber - **战斗舰船** - 轻型/重型战斗机、巡洋舰、战列舰、轰炸机
- **Special Ships** - Deathstar, Battlecruiser, Destroyer - **特殊舰船** - 死星、战列巡洋舰、毁灭者
### Defense Systems ### 防御系统
- Rocket Launcher, Light/Heavy Laser, Gauss Cannon - 火箭发射器、轻型/重型激光炮、高斯炮
- Ion Cannon, Plasma Turret - 离子炮、等离子炮塔
- Small/Large Shield Dome - 小型/大型防护罩
## 🔒 Data Security ## 🔒 数据安全
All game data is automatically encrypted using AES encryption before being stored in your browser's local storage. Your game progress is secure and private. 所有游戏数据在存储到浏览器的本地存储之前都会使用 AES 加密自动加密。您的游戏进度是安全且私密的。
## 🎨 Customization ## 🎨 自定义
The application supports full theme customization through Tailwind CSS variables defined in `src/style.css`. You can easily switch between light and dark modes. 应用支持通过 `src/style.css` 中定义的 Tailwind CSS 变量进行完整的主题自定义。您可以轻松地在浅色和深色模式之间切换。
## 🤝 Contributing ## 🤝 贡献
Contributions are welcome! Please feel free to submit issues or pull requests. 欢迎贡献!请随时提交 issue pull request
### Issue Templates ### Issue 模板
We provide the following issue templates in both Chinese and English: 我们提供以下中英文 issue 模板:
- 🐛 Bug Report - 🐛 BUG反馈 / Bug Report
- ✨ Feature Request - 功能请求 / Feature Request
- 📚 Documentation Improvement - 📚 文档改进 / Documentation Improvement
- 💡 Feedback & Suggestion - 💡 反馈建议 / Feedback & Suggestion
## 📄 License ## 📄 许可证
This work is licensed under the [Creative Commons Attribution-NonCommercial 4.0 International License](https://creativecommons.org/licenses/by-nc/4.0/). 本作品采用 [知识共享署名-非商业性使用 4.0 国际许可协议](https://creativecommons.org/licenses/by-nc/4.0/) 进行许可。
### You are free to: ### 您可以自由地:
- **Share** — copy and redistribute the material in any medium or format - **共享** — 在任何媒介以任何形式复制、发行本作品
- **Adapt** — remix, transform, and build upon the material - **演绎** — 修改、转换或以本作品为基础进行创作
### Under the following terms: ### 惟须遵守下列条件:
- **Attribution** — You must give appropriate credit, provide a link to the license, and indicate if changes were made - **署名** — 您必须给出适当的署名,提供指向本许可协议的链接,同时标明是否对原始作品作了修改
- **NonCommercial** — You may not use the material for commercial purposes - **非商业性使用** — 您不得将本作品用于商业目的
**Original Author:** Jun Qian (谦君) **原作者:** Jun Qian (谦君)
## 👨‍💻 Author ## 👨‍💻 作者
- **GitHub:** [@setube](https://github.com/setube) - **GitHub:** [@setube](https://github.com/setube)
- **Project:** [ogame-vue-ts](https://github.com/setube/ogame-vue-ts) - **项目地址:** [ogame-vue-ts](https://github.com/setube/ogame-vue-ts)
## 💬 Community ## 💬 社区
### Chinese Community ### 中文社区
- **QQ Group:** 920930589 - **QQ :** 920930589
### Global Community ### 国际社区
- **GitHub Issues:** [Report bugs or request features](https://github.com/setube/ogame-vue-ts/issues) - **GitHub Issues:** [报告 bug 或请求功能](https://github.com/setube/ogame-vue-ts/issues)
- **GitHub Discussions:** [Join the conversation](https://github.com/setube/ogame-vue-ts/discussions) - **GitHub Discussions:** [加入讨论](https://github.com/setube/ogame-vue-ts/discussions)
## 🙏 Acknowledgments ## 🙏 致谢
This project is inspired by the original [OGame](https://ogame.org/) browser game. All game mechanics and design elements are reimplemented for educational and entertainment purposes. 本项目受原版 [OGame](https://ogame.org/) 浏览器游戏启发。所有游戏机制和设计元素都是为了教育和娱乐目的而重新实现的。
## ⚠️ Disclaimer ## ⚠️ 免责声明
This project is not affiliated with, endorsed by, or connected to Gameforge AG or the official OGame game. It is an independent fan project created for educational purposes and personal enjoyment. 本项目与 Gameforge AG 或官方 OGame 游戏没有任何关联、认可或联系。这是一个独立的粉丝项目,创建目的仅用于教育和个人娱乐。
--- ---
<div align="center"> <div align="center">
Made with ❤️ by Jun Qian 用 ❤️ 制作,作者:谦君
<br> <br>
© 2025 - All rights reserved (except those granted by CC BY-NC 4.0 License) © 2025 - 保留所有权利(除 CC BY-NC 4.0 许可证授予的权利外)
</div> </div>

View File

@@ -1,243 +0,0 @@
<div align="center">
<img src="public/logo.svg" alt="OGame Vue TS Logo" width="128" height="128">
# OGame Vue TS
一个基于 Vue 3 和 TypeScript 构建的现代化 OGame 太空策略游戏 Web 实现。
[![License: CC BY-NC 4.0](https://img.shields.io/badge/License-CC%20BY--NC%204.0-lightgrey.svg)](https://creativecommons.org/licenses/by-nc/4.0/)
[![Vue 3](https://img.shields.io/badge/Vue-3.5-brightgreen.svg)](https://vuejs.org/)
[![TypeScript](https://img.shields.io/badge/TypeScript-5.9-blue.svg)](https://www.typescriptlang.org/)
[![Vite](https://img.shields.io/badge/Vite-7.2-646CFF.svg)](https://vitejs.dev/)
[English](README.md) | 简体中文
</div>
## 📖 关于项目
OGame Vue TS 是一款受经典 OGame 游戏启发的单机版、基于浏览器的太空策略游戏。在银河系中建立你的帝国,研究科技,建造舰船,参与史诗般的太空战斗。本项目采用现代 Web 技术构建,完全在浏览器中运行,提供流畅且响应迅速的游戏体验,所有数据都存储在本地。
## ✨ 核心特性
- 🌍 **多语言支持** - 支持 6 种语言:英语、简体中文、繁体中文、德语、俄语和韩语
- 🏗️ **建筑管理** - 在行星和月球上建造和升级各种建筑
- 🔬 **科技研究** - 解锁先进科技来增强你的帝国
- 🚀 **舰队管理** - 建造舰船、派遣任务、参与战术太空战斗
- 🛡️ **防御系统** - 部署防御设施来保护你的殖民地
- 👨‍✈️ **军官系统** - 招募军官以获得战略优势
- ⚔️ **战斗模拟器** - 在投入资源前测试战斗场景
- 🌌 **银河视图** - 探索宇宙并与其他星球互动
- 💾 **本地数据持久化** - 所有游戏数据都经过加密并存储在浏览器本地
- 🌓 **深色/浅色主题** - 选择你喜欢的视觉主题
- 📊 **队列管理** - 管理多个建造和研究队列
- 🌙 **月球生成** - 基于概率的月球从残骸场生成机制
## 🛠️ 技术栈
- **前端框架:** [Vue 3](https://vuejs.org/) + Composition API (`<script setup>` 语法)
- **开发语言:** [TypeScript](https://www.typescriptlang.org/) (启用严格类型检查)
- **构建工具:** [Vite](https://vitejs.dev/) (自定义 Rolldown-Vite 7.2.5)
- **状态管理:** [Pinia](https://pinia.vuejs.org/) + 持久化插件
- **路由管理:** [Vue Router 4](https://router.vuejs.org/)
- **UI 组件:** [shadcn-vue](https://www.shadcn-vue.com/) (New York 风格)
- **样式方案:** [Tailwind CSS v4](https://tailwindcss.com/) + CSS 变量
- **图标库:** [Lucide Vue Next](https://lucide.dev/)
- **动画效果:** [tw-animate-css](https://www.npmjs.com/package/tw-animate-css)
- **国际化:** 自定义 i18n 实现
- **数据加密:** [CryptoJS](https://cryptojs.gitbook.io/) 保障数据安全
## 🚀 快速开始
### 环境要求
- [Node.js](https://nodejs.org/) (推荐 18 或更高版本)
- [pnpm](https://pnpm.io/) (版本 10.13.1 或更高)
### 安装
```bash
# 克隆仓库
git clone https://github.com/setube/ogame-vue-ts.git
# 进入项目目录
cd ogame-vue-ts
# 安装依赖
pnpm install
```
### 开发
```bash
# 启动开发服务器 (运行在端口 25121)
pnpm dev
```
在浏览器中访问 `http://localhost:25121`
### 生产构建
```bash
# 构建应用
pnpm build
# 预览生产构建
pnpm preview
```
## 📁 项目结构
```
ogame-vue-ts/
├── public/ # 静态资源
│ └── logo.svg # 应用图标
├── src/
│ ├── assets/ # 动态资源
│ ├── components/ # Vue 组件
│ │ └── ui/ # shadcn-vue UI 组件
│ ├── composables/ # Vue 组合式函数
│ ├── config/ # 游戏配置
│ ├── lib/ # 工具库
│ ├── locales/ # 国际化翻译文件
│ ├── logic/ # 游戏逻辑模块
│ │ ├── buildingLogic.ts # 建筑逻辑
│ │ ├── buildingValidation.ts # 建筑验证
│ │ ├── fleetLogic.ts # 舰队逻辑
│ │ ├── moonLogic.ts # 月球逻辑
│ │ ├── moonValidation.ts # 月球验证
│ │ ├── researchLogic.ts # 研究逻辑
│ │ ├── researchValidation.ts # 研究验证
│ │ ├── shipLogic.ts # 舰船逻辑
│ │ └── shipValidation.ts # 舰船验证
│ ├── router/ # Vue Router 路由配置
│ ├── stores/ # Pinia 状态存储
│ ├── types/ # TypeScript 类型定义
│ ├── utils/ # 工具函数
│ ├── views/ # 页面组件
│ │ ├── OverviewView.vue # 概览页面
│ │ ├── BuildingsView.vue # 建筑页面
│ │ ├── ResearchView.vue # 研究页面
│ │ ├── ShipyardView.vue # 船坞页面
│ │ ├── DefenseView.vue # 防御页面
│ │ ├── FleetView.vue # 舰队页面
│ │ ├── GalaxyView.vue # 银河页面
│ │ ├── OfficersView.vue # 军官页面
│ │ ├── BattleSimulatorView.vue # 战斗模拟器
│ │ ├── MessagesView.vue # 消息页面
│ │ └── SettingsView.vue # 设置页面
│ ├── App.vue # 根组件
│ ├── main.ts # 应用入口
│ └── style.css # 全局样式
├── .github/
│ └── ISSUE_TEMPLATE/ # GitHub issue 模板
├── CLAUDE.md # AI 助手说明文档
├── LICENSE # CC BY-NC 4.0 许可证
├── package.json # 项目依赖
├── tsconfig.json # TypeScript 配置
└── vite.config.ts # Vite 配置
```
## 🌐 支持的语言
- 🇺🇸 English (英语)
- 🇨🇳 简体中文
- 🇹🇼 繁體中文
- 🇩🇪 Deutsch (德语)
- 🇷🇺 Русский (俄语)
- 🇰🇷 한국어 (韩语)
## 🎮 游戏特性
### 资源管理
- **金属** - 主要建筑材料
- **晶体** - 高级科技组件
- **重氢** - 燃料和研究资源
- **暗物质** - 高级资源
- **能量** - 为设施供电
### 建筑类型
- **资源建筑** - 金属矿、晶体矿、重氢合成器、太阳能发电厂
- **设施建筑** - 机器人工厂、船坞、研究实验室、仓储设施
- **特殊建筑** - 纳米机器人工厂、行星改造器等
### 科技系统
- **能量技术** - 提高能量效率
- **激光技术** - 增强武器系统
- **离子技术** - 高级推进和武器
- **超空间技术** - 实现更快的旅行
- **等离子技术** - 终极武器系统
- 还有更多...
### 舰船类别
- **民用舰船** - 小型/大型货船、殖民船、回收船
- **战斗舰船** - 轻型/重型战斗机、巡洋舰、战列舰、轰炸机
- **特殊舰船** - 死星、战列巡洋舰、毁灭者
### 防御系统
- 火箭发射器、轻型/重型激光炮、高斯炮
- 离子炮、等离子炮塔
- 小型/大型防护罩
## 🔒 数据安全
所有游戏数据在存储到浏览器的本地存储之前都会使用 AES 加密自动加密。您的游戏进度是安全且私密的。
## 🎨 自定义
应用支持通过 `src/style.css` 中定义的 Tailwind CSS 变量进行完整的主题自定义。您可以轻松地在浅色和深色模式之间切换。
## 🤝 贡献
欢迎贡献!请随时提交 issue 或 pull request。
### Issue 模板
我们提供以下中英文 issue 模板:
- 🐛 BUG反馈 / Bug Report
- ✨ 功能请求 / Feature Request
- 📚 文档改进 / Documentation Improvement
- 💡 反馈建议 / Feedback & Suggestion
## 📄 许可证
本作品采用 [知识共享署名-非商业性使用 4.0 国际许可协议](https://creativecommons.org/licenses/by-nc/4.0/) 进行许可。
### 您可以自由地:
- **共享** — 在任何媒介以任何形式复制、发行本作品
- **演绎** — 修改、转换或以本作品为基础进行创作
### 惟须遵守下列条件:
- **署名** — 您必须给出适当的署名,提供指向本许可协议的链接,同时标明是否对原始作品作了修改
- **非商业性使用** — 您不得将本作品用于商业目的
**原作者:** Jun Qian (谦君)
## 👨‍💻 作者
- **GitHub:** [@setube](https://github.com/setube)
- **项目地址:** [ogame-vue-ts](https://github.com/setube/ogame-vue-ts)
## 💬 社区
### 中文社区
- **QQ 群:** 920930589
### 国际社区
- **GitHub Issues:** [报告 bug 或请求功能](https://github.com/setube/ogame-vue-ts/issues)
- **GitHub Discussions:** [加入讨论](https://github.com/setube/ogame-vue-ts/discussions)
## 🙏 致谢
本项目受原版 [OGame](https://ogame.org/) 浏览器游戏启发。所有游戏机制和设计元素都是为了教育和娱乐目的而重新实现的。
## ⚠️ 免责声明
本项目与 Gameforge AG 或官方 OGame 游戏没有任何关联、认可或联系。这是一个独立的粉丝项目,创建目的仅用于教育和个人娱乐。
---
<div align="center">
用 ❤️ 制作,作者:谦君
<br>
© 2025 - 保留所有权利(除 CC BY-NC 4.0 许可证授予的权利外)
</div>

View File

@@ -1 +0,0 @@
import{An as e,Dn as t,Fn as n,Gn as r,Mn as i,Nn as a,Pn as o,Qn as s,bn as c,er as l,jn as u,kn as d,rr as f,sr as p,zt as m}from"./index-BpOElaf9.js";var h={key:0,class:`fixed inset-0 z-50 flex items-center justify-center`},g={class:`relative bg-card border rounded-lg shadow-lg p-6 max-w-md w-full mx-4 z-10`},_={class:`text-lg font-semibold mb-2`},v={class:`text-sm text-muted-foreground mb-6 whitespace-pre-line`},y={class:`flex justify-end gap-2`},b=n({__name:`AlertDialog`,setup(n,{expose:b}){let{t:x}=c(),S=l(!1),C=l(null),w=e=>{C.value=e,S.value=!0},T=()=>{C.value?.onConfirm&&C.value.onConfirm(),S.value=!1},E=()=>{S.value=!1};return b({show:w}),(n,c)=>(r(),e(t,{to:`body`},[S.value?(r(),i(`div`,h,[d(`div`,{class:`fixed inset-0 bg-black/50`,onClick:E}),d(`div`,g,[d(`h2`,_,p(C.value?.title),1),d(`p`,v,p(C.value?.message),1),d(`div`,y,[C.value?.onConfirm?(r(),e(f(m),{key:0,onClick:E,variant:`outline`},{default:s(()=>[a(p(f(x)(`common.cancel`)),1)]),_:1})):u(``,!0),o(f(m),{onClick:T,variant:`default`},{default:s(()=>[a(p(f(x)(`common.confirm`)),1)]),_:1})])])])):u(``,!0)]))}});export{b as t};

View File

@@ -0,0 +1 @@
import{Dt as e,G as t,J as n,K as r,St as i,U as a,X as o,Y as s,Z as c,jt as l,pt as u,q as d,st as f}from"./vendor-ui-DBxeWLyT.js";import{Bt as p,Rt as m}from"./index-Cch-Ig40.js";var h={key:0,class:`fixed inset-0 z-50 flex items-center justify-center`},g={class:`relative bg-card border rounded-lg shadow-lg p-6 max-w-md w-full mx-4 z-10`},_={class:`text-lg font-semibold mb-2`},v={class:`text-sm text-muted-foreground mb-6 whitespace-pre-line`},y={class:`flex justify-end gap-2`},b=c({__name:`AlertDialog`,setup(c,{expose:b}){let{t:x}=p(),S=i(!1),C=i(null),w=e=>{C.value=e,S.value=!0},T=()=>{C.value?.onConfirm&&C.value.onConfirm(),S.value=!1},E=()=>{S.value=!1};return b({show:w}),(i,c)=>(f(),r(a,{to:`body`},[S.value?(f(),n(`div`,h,[t(`div`,{class:`fixed inset-0 bg-black/50`,onClick:E}),t(`div`,g,[t(`h2`,_,l(C.value?.title),1),t(`p`,v,l(C.value?.message),1),t(`div`,y,[C.value?.onConfirm?(f(),r(e(m),{key:0,onClick:E,variant:`outline`},{default:u(()=>[s(l(e(x)(`common.cancel`)),1)]),_:1})):d(``,!0),o(e(m),{onClick:T,variant:`default`},{default:u(()=>[s(l(e(x)(`common.confirm`)),1)]),_:1})])])])):d(``,!0)]))}});export{b 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

View File

@@ -0,0 +1 @@
import{Dt as e,J as t,Ot as n,Z as r,st as i,ut as a}from"./vendor-ui-DBxeWLyT.js";import{zt as o}from"./index-Cch-Ig40.js";var s=r({__name:`CardDescription`,props:{class:{}},setup(r){let s=r;return(r,c)=>(i(),t(`p`,{"data-slot":`card-description`,class:n(e(o)(`text-muted-foreground text-sm`,s.class))},[a(r.$slots,`default`)],2))}});export{s as t};

View File

@@ -1 +0,0 @@
import{Bt as e,Fn as t,Gn as n,Jn as r,Mn as i,ir as a,rr as o}from"./index-BpOElaf9.js";var s=t({__name:`CardDescription`,props:{class:{}},setup(t){let s=t;return(t,c)=>(n(),i(`p`,{"data-slot":`card-description`,class:a(o(e)(`text-muted-foreground text-sm`,s.class))},[r(t.$slots,`default`)],2))}});export{s as t};

View File

@@ -0,0 +1,2 @@
import{Dt as e,G as t,J as n,St as r,W as i,X as a,Y as o,Z as s,jt as c,pt as l,q as u,st as d}from"./vendor-ui-DBxeWLyT.js";import{n as f}from"./UnlockRequirement-BdFx1RC0.js";import{Bt as p,Rt as m,Vt as h,ct as g,rt as _,w as v}from"./index-Cch-Ig40.js";import{t as y}from"./useGameConfig-D2EZdt1x.js";import{t as b}from"./AlertDialog-_72FqRCT.js";var x={key:0,class:`absolute inset-0 z-10 bg-background/70 backdrop-blur-[2px] rounded-lg flex items-center justify-center`},S={class:`text-center p-4 space-y-2`},C={class:`flex justify-center`},w={class:`rounded-full bg-muted p-2`},T={class:`text-xs font-medium text-muted-foreground`},E=s({__name:`CardUnlockOverlay`,props:{requirements:{}},setup(s){let E=s,D=h(),{t:O}=p(),{BUILDINGS:k,TECHNOLOGIES:A}=y(),j=r(null),M=i(()=>!E.requirements||!D.currentPlanet?!0:v(D.currentPlanet,D.player.technologies,E.requirements)),N=()=>{if(!E.requirements||!D.currentPlanet)return``;let e=[];for(let[t,n]of Object.entries(E.requirements))if(Object.values(_).includes(t)){let r=t,i=D.currentPlanet.buildings[r]||0,a=k.value[r]?.name||r,o=i>=n?``:``;e.push(`${o} ${a}: Lv ${n} (${O(`common.current`)}: Lv ${i})`)}else if(Object.values(g).includes(t)){let r=t,i=D.player.technologies[r]||0,a=A.value[r]?.name||r,o=i>=n?``:``;e.push(`${o} ${a}: Lv ${n} (${O(`common.current`)}: Lv ${i})`)}return e.join(`
`)},P=()=>{j.value?.show({title:O(`common.requirementsNotMet`),message:N()})};return(r,i)=>M.value?u(``,!0):(d(),n(`div`,x,[t(`div`,S,[t(`div`,C,[t(`div`,w,[a(e(f),{size:20,class:`text-muted-foreground`})])]),t(`p`,T,c(e(O)(`common.locked`)),1),a(e(m),{variant:`outline`,size:`sm`,onClick:P,class:`text-xs`},{default:l(()=>[o(c(e(O)(`common.viewRequirements`)),1)]),_:1})]),a(b,{ref_key:`requirementsDialog`,ref:j},null,512)]))}});export{E as t};

View File

@@ -1,2 +0,0 @@
import{n as e}from"./UnlockRequirement-DeOUxO_t.js";import{Fn as t,Gn as n,Mn as r,Nn as i,On as a,Pn as o,Qn as s,bn as c,ct as l,er as u,jn as d,kn as f,rr as p,rt as m,sr as h,w as g,xn as _,zt as v}from"./index-BpOElaf9.js";import{t as y}from"./useGameConfig-DqswvIth.js";import{t as b}from"./AlertDialog-BbpHh-RO.js";var x={key:0,class:`absolute inset-0 z-10 bg-background/70 backdrop-blur-[2px] rounded-lg flex items-center justify-center`},S={class:`text-center p-4 space-y-2`},C={class:`flex justify-center`},w={class:`rounded-full bg-muted p-2`},T={class:`text-xs font-medium text-muted-foreground`},E=t({__name:`CardUnlockOverlay`,props:{requirements:{}},setup(t){let E=t,D=_(),{t:O}=c(),{BUILDINGS:k,TECHNOLOGIES:A}=y(),j=u(null),M=a(()=>!E.requirements||!D.currentPlanet?!0:g(D.currentPlanet,D.player.technologies,E.requirements)),N=()=>{if(!E.requirements||!D.currentPlanet)return``;let e=[];for(let[t,n]of Object.entries(E.requirements))if(Object.values(m).includes(t)){let r=t,i=D.currentPlanet.buildings[r]||0,a=k.value[r]?.name||r,o=i>=n?``:``;e.push(`${o} ${a}: Lv ${n} (${O(`common.current`)}: Lv ${i})`)}else if(Object.values(l).includes(t)){let r=t,i=D.player.technologies[r]||0,a=A.value[r]?.name||r,o=i>=n?``:``;e.push(`${o} ${a}: Lv ${n} (${O(`common.current`)}: Lv ${i})`)}return e.join(`
`)},P=()=>{j.value?.show({title:O(`common.requirementsNotMet`),message:N()})};return(t,a)=>M.value?d(``,!0):(n(),r(`div`,x,[f(`div`,S,[f(`div`,C,[f(`div`,w,[o(p(e),{size:20,class:`text-muted-foreground`})])]),f(`p`,T,h(p(O)(`common.locked`)),1),o(p(v),{variant:`outline`,size:`sm`,onClick:P,class:`text-xs`},{default:s(()=>[i(h(p(O)(`common.viewRequirements`)),1)]),_:1})]),o(b,{ref_key:`requirementsDialog`,ref:j},null,512)]))}});export{E 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

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -1 +0,0 @@
import{t as e}from"./CardDescription-Cb9v68Xa.js";import{An as t,D as n,E as r,En as i,F as a,Fn as o,Gn as s,It as c,M as l,Mn as u,Nn as d,On as f,Pn as p,Pt as m,Qn as h,U as g,V as _,_t as v,bn as ee,dt as y,ft as b,gt as x,ht as S,ir as C,j as w,jn as T,kn as E,lt as D,mt as O,pt as te,qn as k,rr as A,sr as j,ut as M,vt as N,xn as P,zt as F}from"./index-BpOElaf9.js";import{t as I}from"./useGameConfig-DqswvIth.js";var L={key:0,class:`container mx-auto p-4 sm:p-6 space-y-4 sm:space-y-6`},R={class:`text-center`},z={class:`text-2xl sm:text-3xl font-bold mb-1 sm:mb-2 flex items-center justify-center gap-2`},B={class:`text-xs sm:text-sm text-muted-foreground`},V={key:0,class:`mt-2`},H={key:1,class:`mt-2`},U={class:`flex items-center gap-2`},W={class:`grid grid-cols-2 sm:grid-cols-3 md:grid-cols-4 gap-3 sm:gap-4`},G={class:`text-xs sm:text-sm text-muted-foreground`},K={class:`text-lg sm:text-xl font-bold`},q=o({__name:`OverviewView`,setup(o){let q=P(),{t:J}=ee(),{SHIPS:Y}=I(),X=f(()=>q.currentPlanet),Z=f(()=>X.value?n(X.value,q.player.officers):null),Q=f(()=>X.value?r(X.value,q.player.officers):null),ne=f(()=>{if(!X.value)return 0;let e=a(q.player.officers,Date.now());return l(X.value,{energyProductionBonus:e.energyProductionBonus})}),re=f(()=>X.value?w(X.value):0),ie=[{key:`metal`},{key:`crystal`},{key:`deuterium`},{key:`darkMatter`},{key:`energy`}],$=f(()=>!X.value||X.value.isMoon?null:ae(X.value.id)),ae=e=>q.player.planets.find(t=>t.isMoon&&t.parentPlanetId===e)||null,oe=()=>{$.value&&(q.currentPlanetId=$.value.id)},se=()=>{X.value?.parentPlanetId&&(q.currentPlanetId=X.value.parentPlanetId)};return(n,r)=>X.value?(s(),u(`div`,L,[E(`div`,R,[E(`h1`,z,[d(j(X.value.name)+` `,1),X.value.isMoon?(s(),t(A(c),{key:0,variant:`secondary`},{default:h(()=>[d(j(A(J)(`planet.moon`)),1)]),_:1})):T(``,!0)]),E(`p`,B,j(A(J)(`planet.position`))+`: [`+j(X.value.position.galaxy)+`:`+j(X.value.position.system)+`:`+j(X.value.position.position)+`] `,1),!X.value.isMoon&&$.value?(s(),u(`div`,V,[p(A(F),{onClick:oe,variant:`outline`,size:`sm`},{default:h(()=>[r[0]||=E(`span`,{class:`mr-2`},`🌙`,-1),d(` `+j(A(J)(`planet.switchToMoon`)),1)]),_:1})])):T(``,!0),X.value.isMoon?(s(),u(`div`,H,[p(A(F),{onClick:se,variant:`outline`,size:`sm`},{default:h(()=>[d(j(A(J)(`planet.backToPlanet`)),1)]),_:1})])):T(``,!0)]),p(A(b),null,{default:h(()=>[p(A(M),null,{default:h(()=>[p(A(D),null,{default:h(()=>[d(j(A(J)(`overview.resourceOverview`)),1)]),_:1})]),_:1}),p(A(y),null,{default:h(()=>[p(A(N),null,{default:h(()=>[p(A(te),null,{default:h(()=>[p(A(S),null,{default:h(()=>[p(A(O),null,{default:h(()=>[d(j(A(J)(`common.resourceType`)),1)]),_:1}),p(A(O),{class:`text-right`},{default:h(()=>[d(j(A(J)(`resources.current`)),1)]),_:1}),p(A(O),{class:`text-right`},{default:h(()=>[d(j(A(J)(`resources.max`)),1)]),_:1}),p(A(O),{class:`text-right`},{default:h(()=>[d(j(A(J)(`resources.production`))+j(A(J)(`resources.perHour`)),1)]),_:1})]),_:1})]),_:1}),p(A(v),null,{default:h(()=>[(s(),u(i,null,k(ie,e=>p(A(S),{key:e.key},{default:h(()=>[p(A(x),{class:`font-medium`},{default:h(()=>[E(`div`,U,[p(m,{type:e.key,size:`sm`},null,8,[`type`]),d(` `+j(A(J)(`resources.${e.key}`)),1)])]),_:2},1024),e.key===`energy`?(s(),u(i,{key:0},[p(A(x),{class:C([`text-right`,X.value.resources[e.key]>=0?`text-green-600 dark:text-green-400`:`text-red-600 dark:text-red-400`])},{default:h(()=>[d(j(A(_)(X.value.resources[e.key])),1)]),_:2},1032,[`class`]),p(A(x),{class:`text-right text-muted-foreground`},{default:h(()=>[...r[1]||=[d(`-`,-1)]]),_:1}),p(A(x),{class:`text-right text-muted-foreground`},{default:h(()=>[d(j(A(_)(ne.value))+` / `+j(A(_)(re.value)),1)]),_:1})],64)):(s(),u(i,{key:1},[p(A(x),{class:C([`text-right`,A(g)(X.value.resources[e.key],Q.value?.[e.key]||1/0)])},{default:h(()=>[d(j(A(_)(X.value.resources[e.key])),1)]),_:2},1032,[`class`]),p(A(x),{class:`text-right text-muted-foreground`},{default:h(()=>[d(j(A(_)(Q.value?.[e.key]||0)),1)]),_:2},1024),p(A(x),{class:`text-right text-muted-foreground`},{default:h(()=>[d(j(A(_)(Z.value?.[e.key]||0)),1)]),_:2},1024)],64))]),_:2},1024)),64))]),_:1})]),_:1})]),_:1})]),_:1}),p(A(b),null,{default:h(()=>[p(A(M),null,{default:h(()=>[p(A(D),null,{default:h(()=>[d(j(A(J)(`overview.fleetInfo`)),1)]),_:1}),p(A(e),null,{default:h(()=>[d(j(A(J)(`overview.currentShips`)),1)]),_:1})]),_:1}),p(A(y),null,{default:h(()=>[E(`div`,W,[(s(!0),u(i,null,k(X.value.fleet,(e,t)=>(s(),u(`div`,{key:t},[E(`p`,G,j(A(Y)[t].name),1),E(`p`,K,j(e),1)]))),128))])]),_:1})]),_:1})])):T(``,!0)}});export{q as default};

View File

@@ -0,0 +1 @@
import{Dt as e,G as t,H as n,J as r,K as i,Ot as a,W as o,X as s,Y as c,Z as l,jt as u,lt as d,pt as f,q as p,st as m}from"./vendor-ui-DBxeWLyT.js";import"./vendor-vue-Bqq1sBNf.js";import{t as h}from"./CardDescription-CRV0m8La.js";import{Bt as g,D as ee,E as te,F as _,It as v,M as y,Pt as b,Rt as x,U as S,V as C,Vt as w,_t as T,dt as E,ft as D,gt as O,ht as k,j as A,lt as j,mt as M,pt as N,ut as P,vt as F}from"./index-Cch-Ig40.js";import{t as I}from"./useGameConfig-D2EZdt1x.js";var L={key:0,class:`container mx-auto p-4 sm:p-6 space-y-4 sm:space-y-6`},R={class:`text-center`},z={class:`text-2xl sm:text-3xl font-bold mb-1 sm:mb-2 flex items-center justify-center gap-2`},B={class:`text-xs sm:text-sm text-muted-foreground`},V={key:0,class:`mt-2`},H={key:1,class:`mt-2`},U={class:`flex items-center gap-2`},W={class:`grid grid-cols-2 sm:grid-cols-3 md:grid-cols-4 gap-3 sm:gap-4`},G={class:`text-xs sm:text-sm text-muted-foreground`},K={class:`text-lg sm:text-xl font-bold`},q=l({__name:`OverviewView`,setup(l){let q=w(),{t:J}=g(),{SHIPS:Y}=I(),X=o(()=>q.currentPlanet),Z=o(()=>X.value?ee(X.value,q.player.officers):null),Q=o(()=>X.value?te(X.value,q.player.officers):null),ne=o(()=>{if(!X.value)return 0;let e=_(q.player.officers,Date.now());return y(X.value,{energyProductionBonus:e.energyProductionBonus})}),re=o(()=>X.value?A(X.value):0),ie=[{key:`metal`},{key:`crystal`},{key:`deuterium`},{key:`darkMatter`},{key:`energy`}],$=o(()=>!X.value||X.value.isMoon?null:ae(X.value.id)),ae=e=>q.player.planets.find(t=>t.isMoon&&t.parentPlanetId===e)||null,oe=()=>{$.value&&(q.currentPlanetId=$.value.id)},se=()=>{X.value?.parentPlanetId&&(q.currentPlanetId=X.value.parentPlanetId)};return(o,l)=>X.value?(m(),r(`div`,L,[t(`div`,R,[t(`h1`,z,[c(u(X.value.name)+` `,1),X.value.isMoon?(m(),i(e(v),{key:0,variant:`secondary`},{default:f(()=>[c(u(e(J)(`planet.moon`)),1)]),_:1})):p(``,!0)]),t(`p`,B,u(e(J)(`planet.position`))+`: [`+u(X.value.position.galaxy)+`:`+u(X.value.position.system)+`:`+u(X.value.position.position)+`] `,1),!X.value.isMoon&&$.value?(m(),r(`div`,V,[s(e(x),{onClick:oe,variant:`outline`,size:`sm`},{default:f(()=>[l[0]||=t(`span`,{class:`mr-2`},`🌙`,-1),c(` `+u(e(J)(`planet.switchToMoon`)),1)]),_:1})])):p(``,!0),X.value.isMoon?(m(),r(`div`,H,[s(e(x),{onClick:se,variant:`outline`,size:`sm`},{default:f(()=>[c(u(e(J)(`planet.backToPlanet`)),1)]),_:1})])):p(``,!0)]),s(e(D),null,{default:f(()=>[s(e(P),null,{default:f(()=>[s(e(j),null,{default:f(()=>[c(u(e(J)(`overview.resourceOverview`)),1)]),_:1})]),_:1}),s(e(E),null,{default:f(()=>[s(e(F),null,{default:f(()=>[s(e(N),null,{default:f(()=>[s(e(k),null,{default:f(()=>[s(e(M),null,{default:f(()=>[c(u(e(J)(`common.resourceType`)),1)]),_:1}),s(e(M),{class:`text-right`},{default:f(()=>[c(u(e(J)(`resources.current`)),1)]),_:1}),s(e(M),{class:`text-right`},{default:f(()=>[c(u(e(J)(`resources.max`)),1)]),_:1}),s(e(M),{class:`text-right`},{default:f(()=>[c(u(e(J)(`resources.production`))+u(e(J)(`resources.perHour`)),1)]),_:1})]),_:1})]),_:1}),s(e(T),null,{default:f(()=>[(m(),r(n,null,d(ie,i=>s(e(k),{key:i.key},{default:f(()=>[s(e(O),{class:`font-medium`},{default:f(()=>[t(`div`,U,[s(b,{type:i.key,size:`sm`},null,8,[`type`]),c(` `+u(e(J)(`resources.${i.key}`)),1)])]),_:2},1024),i.key===`energy`?(m(),r(n,{key:0},[s(e(O),{class:a([`text-right`,X.value.resources[i.key]>=0?`text-green-600 dark:text-green-400`:`text-red-600 dark:text-red-400`])},{default:f(()=>[c(u(e(C)(X.value.resources[i.key])),1)]),_:2},1032,[`class`]),s(e(O),{class:`text-right text-muted-foreground`},{default:f(()=>[...l[1]||=[c(`-`,-1)]]),_:1}),s(e(O),{class:`text-right text-muted-foreground`},{default:f(()=>[c(u(e(C)(ne.value))+` / `+u(e(C)(re.value)),1)]),_:1})],64)):(m(),r(n,{key:1},[s(e(O),{class:a([`text-right`,e(S)(X.value.resources[i.key],Q.value?.[i.key]||1/0)])},{default:f(()=>[c(u(e(C)(X.value.resources[i.key])),1)]),_:2},1032,[`class`]),s(e(O),{class:`text-right text-muted-foreground`},{default:f(()=>[c(u(e(C)(Q.value?.[i.key]||0)),1)]),_:2},1024),s(e(O),{class:`text-right text-muted-foreground`},{default:f(()=>[c(u(e(C)(Z.value?.[i.key]||0)),1)]),_:2},1024)],64))]),_:2},1024)),64))]),_:1})]),_:1})]),_:1})]),_:1}),s(e(D),null,{default:f(()=>[s(e(P),null,{default:f(()=>[s(e(j),null,{default:f(()=>[c(u(e(J)(`overview.fleetInfo`)),1)]),_:1}),s(e(h),null,{default:f(()=>[c(u(e(J)(`overview.currentShips`)),1)]),_:1})]),_:1}),s(e(E),null,{default:f(()=>[t(`div`,W,[(m(!0),r(n,null,d(X.value.fleet,(n,i)=>(m(),r(`div`,{key:i},[t(`p`,G,u(e(Y)[i].name),1),t(`p`,K,u(n),1)]))),128))])]),_:1})]),_:1})])):p(``,!0)}});export{q as default};

View File

@@ -0,0 +1 @@
import{Dt as e,G as t,H as n,J as r,K as ee,Ot as i,St as te,W as a,X as o,Y as s,Z as c,jt as l,lt as u,pt as d,q as ne,st as f}from"./vendor-ui-DBxeWLyT.js";import"./vendor-vue-Bqq1sBNf.js";import{t as re}from"./UnlockRequirement-BdFx1RC0.js";import{t as ie}from"./CardDescription-CRV0m8La.js";import{Bt as ae,It as p,Pt as m,Rt as h,V as g,Vt as oe,W as _,Z as v,ct as y,dt as b,ft as x,lt as S,rt as C,ut as w,v as T,w as E,y as D,yt as O}from"./index-Cch-Ig40.js";import{t as k}from"./useGameConfig-D2EZdt1x.js";import{t as A}from"./AlertDialog-_72FqRCT.js";import{t as j}from"./CardUnlockOverlay-SeY-L1Ut.js";var M={key:0,class:`container mx-auto p-4 sm:p-6`},N={class:`text-2xl sm:text-3xl font-bold mb-4 sm:mb-6`},P={class:`grid grid-cols-2 lg:grid-cols-3 gap-3 sm:gap-4`},F={class:`flex justify-between items-start gap-2`},se={class:`min-w-0 flex-1`},I={class:`space-y-2.5 sm:space-y-3`},L={class:`text-xs sm:text-sm space-y-1.5 sm:space-y-2`},R={class:`text-muted-foreground mb-1 sm:mb-2`},z={class:`space-y-1 sm:space-y-1.5`},B={class:`flex items-center gap-1.5 sm:gap-2`},V={class:`text-xs`},H={class:`flex items-center gap-1.5 sm:gap-2`},U={class:`text-xs`},W={class:`flex items-center gap-1.5 sm:gap-2`},G={class:`text-xs`},K=c({__name:`ResearchView`,setup(c){let K=oe(),ce=O(),{t:q}=ae(),{TECHNOLOGIES:J}=k(),Y=a(()=>K.currentPlanet),X=a(()=>K.player),Z=te(null),le=e=>{if(!K.currentPlanet||!D(K.currentPlanet,e,K.player.technologies,K.player.researchQueue).valid)return!1;let t=K.player.technologies[e]||0,{queueItem:n}=T(K.currentPlanet,e,t,K.player.officers);return K.player.researchQueue.push(n),!0},ue=e=>{le(e)||Z.value?.show({title:q(`researchView.researchFailed`),message:q(`researchView.researchFailedMessage`)})},Q=e=>X.value.technologies[e]||0,de=e=>{if(!Y.value||X.value.researchQueue.length>0)return!1;let t=J.value[e],n=$(e,Q(e)+1);return E(Y.value,K.player.technologies,t.requirements)&&Y.value.resources.metal>=n.metal&&Y.value.resources.crystal>=n.crystal&&Y.value.resources.deuterium>=n.deuterium},$=(e,t)=>v(e,t);return(te,a)=>Y.value?(f(),r(`div`,M,[o(re,{"required-building":e(C).ResearchLab,"required-level":1},null,8,[`required-building`]),t(`h1`,N,l(e(q)(`researchView.title`)),1),t(`div`,P,[(f(!0),r(n,null,u(Object.values(e(y)),n=>(f(),ee(e(x),{key:n,class:`relative`},{default:d(()=>[o(j,{requirements:e(J)[n].requirements},null,8,[`requirements`]),o(e(w),null,{default:d(()=>[t(`div`,F,[t(`div`,se,[o(e(S),{class:`text-base sm:text-lg cursor-pointer hover:text-primary transition-colors`,onClick:t=>e(ce).openTechnology(n,Q(n))},{default:d(()=>[s(l(e(J)[n].name),1)]),_:2},1032,[`onClick`]),o(e(ie),{class:`text-xs sm:text-sm`},{default:d(()=>[s(l(e(J)[n].description),1)]),_:2},1024)]),o(e(p),{variant:`secondary`,class:`text-xs whitespace-nowrap flex-shrink-0`},{default:d(()=>[s(`Lv `+l(Q(n)),1)]),_:2},1024)])]),_:2},1024),o(e(b),null,{default:d(()=>[t(`div`,I,[t(`div`,L,[t(`p`,R,l(e(q)(`researchView.researchCost`))+`:`,1),t(`div`,z,[t(`div`,B,[o(m,{type:`metal`,size:`sm`}),t(`span`,V,l(e(q)(`resources.metal`))+`:`,1),t(`span`,{class:i([`font-medium text-xs sm:text-sm`,e(_)(Y.value.resources.metal,$(n,Q(n)+1).metal)])},l(e(g)($(n,Q(n)+1).metal)),3)]),t(`div`,H,[o(m,{type:`crystal`,size:`sm`}),t(`span`,U,l(e(q)(`resources.crystal`))+`:`,1),t(`span`,{class:i([`font-medium text-xs sm:text-sm`,e(_)(Y.value.resources.crystal,$(n,Q(n)+1).crystal)])},l(e(g)($(n,Q(n)+1).crystal)),3)]),t(`div`,W,[o(m,{type:`deuterium`,size:`sm`}),t(`span`,G,l(e(q)(`resources.deuterium`))+`:`,1),t(`span`,{class:i([`font-medium text-xs sm:text-sm`,e(_)(Y.value.resources.deuterium,$(n,Q(n)+1).deuterium)])},l(e(g)($(n,Q(n)+1).deuterium)),3)])])]),o(e(h),{onClick:e=>ue(n),disabled:!de(n),class:`w-full`},{default:d(()=>[s(l(e(q)(`researchView.research`)),1)]),_:1},8,[`onClick`,`disabled`])])]),_:2},1024)]),_:2},1024))),128))]),o(A,{ref_key:`alertDialog`,ref:Z},null,512)])):ne(``,!0)}});export{K as default};

View File

@@ -1 +0,0 @@
import{t as e}from"./UnlockRequirement-DeOUxO_t.js";import{t}from"./CardDescription-Cb9v68Xa.js";import{An as n,En as r,Fn as i,Gn as a,It as o,Mn as s,Nn as c,On as l,Pn as u,Pt as d,Qn as f,V as p,W as m,Z as h,bn as ee,ct as te,dt as ne,er as re,ft as ie,ir as g,jn as _,kn as v,lt as ae,qn as oe,rr as y,rt as b,sr as x,ut as S,v as C,w,xn as T,y as E,yt as D,zt as O}from"./index-BpOElaf9.js";import{t as k}from"./useGameConfig-DqswvIth.js";import{t as A}from"./AlertDialog-BbpHh-RO.js";import{t as j}from"./CardUnlockOverlay-tiSNfyF3.js";var M={key:0,class:`container mx-auto p-4 sm:p-6`},N={class:`text-2xl sm:text-3xl font-bold mb-4 sm:mb-6`},P={class:`grid grid-cols-2 lg:grid-cols-3 gap-3 sm:gap-4`},F={class:`flex justify-between items-start gap-2`},I={class:`min-w-0 flex-1`},L={class:`space-y-2.5 sm:space-y-3`},se={class:`text-xs sm:text-sm space-y-1.5 sm:space-y-2`},R={class:`text-muted-foreground mb-1 sm:mb-2`},z={class:`space-y-1 sm:space-y-1.5`},B={class:`flex items-center gap-1.5 sm:gap-2`},V={class:`text-xs`},H={class:`flex items-center gap-1.5 sm:gap-2`},U={class:`text-xs`},W={class:`flex items-center gap-1.5 sm:gap-2`},G={class:`text-xs`},K=i({__name:`ResearchView`,setup(i){let K=T(),ce=D(),{t:q}=ee(),{TECHNOLOGIES:J}=k(),Y=l(()=>K.currentPlanet),X=l(()=>K.player),Z=re(null),le=e=>{if(!K.currentPlanet||!E(K.currentPlanet,e,K.player.technologies,K.player.researchQueue).valid)return!1;let t=K.player.technologies[e]||0,{queueItem:n}=C(K.currentPlanet,e,t,K.player.officers);return K.player.researchQueue.push(n),!0},ue=e=>{le(e)||Z.value?.show({title:q(`researchView.researchFailed`),message:q(`researchView.researchFailedMessage`)})},Q=e=>X.value.technologies[e]||0,de=e=>{if(!Y.value||X.value.researchQueue.length>0)return!1;let t=J.value[e],n=$(e,Q(e)+1);return w(Y.value,K.player.technologies,t.requirements)&&Y.value.resources.metal>=n.metal&&Y.value.resources.crystal>=n.crystal&&Y.value.resources.deuterium>=n.deuterium},$=(e,t)=>h(e,t);return(i,l)=>Y.value?(a(),s(`div`,M,[u(e,{"required-building":y(b).ResearchLab,"required-level":1},null,8,[`required-building`]),v(`h1`,N,x(y(q)(`researchView.title`)),1),v(`div`,P,[(a(!0),s(r,null,oe(Object.values(y(te)),e=>(a(),n(y(ie),{key:e,class:`relative`},{default:f(()=>[u(j,{requirements:y(J)[e].requirements},null,8,[`requirements`]),u(y(S),null,{default:f(()=>[v(`div`,F,[v(`div`,I,[u(y(ae),{class:`text-base sm:text-lg cursor-pointer hover:text-primary transition-colors`,onClick:t=>y(ce).openTechnology(e,Q(e))},{default:f(()=>[c(x(y(J)[e].name),1)]),_:2},1032,[`onClick`]),u(y(t),{class:`text-xs sm:text-sm`},{default:f(()=>[c(x(y(J)[e].description),1)]),_:2},1024)]),u(y(o),{variant:`secondary`,class:`text-xs whitespace-nowrap flex-shrink-0`},{default:f(()=>[c(`Lv `+x(Q(e)),1)]),_:2},1024)])]),_:2},1024),u(y(ne),null,{default:f(()=>[v(`div`,L,[v(`div`,se,[v(`p`,R,x(y(q)(`researchView.researchCost`))+`:`,1),v(`div`,z,[v(`div`,B,[u(d,{type:`metal`,size:`sm`}),v(`span`,V,x(y(q)(`resources.metal`))+`:`,1),v(`span`,{class:g([`font-medium text-xs sm:text-sm`,y(m)(Y.value.resources.metal,$(e,Q(e)+1).metal)])},x(y(p)($(e,Q(e)+1).metal)),3)]),v(`div`,H,[u(d,{type:`crystal`,size:`sm`}),v(`span`,U,x(y(q)(`resources.crystal`))+`:`,1),v(`span`,{class:g([`font-medium text-xs sm:text-sm`,y(m)(Y.value.resources.crystal,$(e,Q(e)+1).crystal)])},x(y(p)($(e,Q(e)+1).crystal)),3)]),v(`div`,W,[u(d,{type:`deuterium`,size:`sm`}),v(`span`,G,x(y(q)(`resources.deuterium`))+`:`,1),v(`span`,{class:g([`font-medium text-xs sm:text-sm`,y(m)(Y.value.resources.deuterium,$(e,Q(e)+1).deuterium)])},x(y(p)($(e,Q(e)+1).deuterium)),3)])])]),u(y(O),{onClick:t=>ue(e),disabled:!de(e),class:`w-full`},{default:f(()=>[c(x(y(q)(`researchView.research`)),1)]),_:1},8,[`onClick`,`disabled`])])]),_:2},1024)]),_:2},1024))),128))]),u(A,{ref_key:`alertDialog`,ref:Z},null,512)])):_(``,!0)}});export{K 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

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
import{Dt as e,G as t,J as n,W as r,X as i,Y as a,Z as o,jt as s,pt as c,q as l,st as u}from"./vendor-ui-DBxeWLyT.js";import{s as d}from"./vendor-vue-Bqq1sBNf.js";import{t as f}from"./CardDescription-CRV0m8La.js";import{At as p,Bt as m,It as h,Rt as g,Vt as _,dt as v,ft as y,jt as b,lt as x,ut as S}from"./index-Cch-Ig40.js";import{t as C}from"./useGameConfig-D2EZdt1x.js";var w=b(`lock`,[[`rect`,{width:`18`,height:`11`,x:`3`,y:`11`,rx:`2`,ry:`2`,key:`1w4ew1`}],[`path`,{d:`M7 11V7a5 5 0 0 1 10 0v4`,key:`fwvmzm`}]]),T={key:0,class:`fixed inset-0 z-50 bg-background/80 backdrop-blur-sm flex items-center justify-center p-4`},E={class:`flex justify-center mb-4`},D={class:`rounded-full bg-muted p-4`},O={class:`p-4 bg-muted rounded-lg space-y-2`},k={class:`text-sm font-medium text-center`},A={class:`flex items-center justify-center gap-2`},j={class:`text-base sm:text-lg font-bold`},M={key:0,class:`text-xs text-center text-muted-foreground`},N={class:`flex gap-2`},P=o({__name:`UnlockRequirement`,props:{requiredBuilding:{},requiredLevel:{}},setup(o){let b=o,P=d(),F=_(),{t:I}=m(),{BUILDINGS:L}=C(),R=r(()=>L.value[b.requiredBuilding]?.name||b.requiredBuilding),z=r(()=>F.currentPlanet&&F.currentPlanet.buildings[b.requiredBuilding]||0),B=r(()=>z.value>=b.requiredLevel),V=()=>{P.push(`/buildings`)};return(r,d)=>B.value?l(``,!0):(u(),n(`div`,T,[i(e(y),{class:`max-w-md w-full`},{default:c(()=>[i(e(S),{class:`text-center`},{default:c(()=>[t(`div`,E,[t(`div`,D,[i(e(w),{size:48,class:`text-muted-foreground`})])]),i(e(x),{class:`text-xl sm:text-2xl`},{default:c(()=>[a(s(e(I)(`common.featureLocked`)),1)]),_:1}),i(e(f),{class:`text-sm sm:text-base`},{default:c(()=>[a(s(e(I)(`common.unlockRequired`)),1)]),_:1})]),_:1}),i(e(v),{class:`space-y-4`},{default:c(()=>[t(`div`,O,[t(`p`,k,s(e(I)(`common.requiredBuilding`))+`:`,1),t(`div`,A,[t(`span`,j,s(R.value),1),i(e(h),{variant:`default`},{default:c(()=>[a(`Lv `+s(o.requiredLevel),1)]),_:1})]),z.value===void 0?l(``,!0):(u(),n(`p`,M,s(e(I)(`common.currentLevel`))+`: Lv `+s(z.value),1))]),t(`div`,N,[i(e(g),{onClick:V,class:`flex-1`},{default:c(()=>[i(e(p),{size:16,class:`mr-2`}),a(` `+s(e(I)(`common.goToBuildings`)),1)]),_:1})])]),_:1})]),_:1})]))}});export{w as n,P as t};

View File

@@ -1 +0,0 @@
import{t as e}from"./CardDescription-Cb9v68Xa.js";import{At as t,Fn as n,Gn as r,It as i,Mn as a,Nn as o,On as s,Pn as c,Qn as l,bn as u,dt as d,ft as f,jn as p,jt as m,kn as h,lt as g,rr as _,sr as v,ut as y,wn as b,xn as x,zt as S}from"./index-BpOElaf9.js";import{t as C}from"./useGameConfig-DqswvIth.js";var w=m(`lock`,[[`rect`,{width:`18`,height:`11`,x:`3`,y:`11`,rx:`2`,ry:`2`,key:`1w4ew1`}],[`path`,{d:`M7 11V7a5 5 0 0 1 10 0v4`,key:`fwvmzm`}]]),T={key:0,class:`fixed inset-0 z-50 bg-background/80 backdrop-blur-sm flex items-center justify-center p-4`},E={class:`flex justify-center mb-4`},D={class:`rounded-full bg-muted p-4`},O={class:`p-4 bg-muted rounded-lg space-y-2`},k={class:`text-sm font-medium text-center`},A={class:`flex items-center justify-center gap-2`},j={class:`text-base sm:text-lg font-bold`},M={key:0,class:`text-xs text-center text-muted-foreground`},N={class:`flex gap-2`},P=n({__name:`UnlockRequirement`,props:{requiredBuilding:{},requiredLevel:{}},setup(n){let m=n,P=b(),F=x(),{t:I}=u(),{BUILDINGS:L}=C(),R=s(()=>L.value[m.requiredBuilding]?.name||m.requiredBuilding),z=s(()=>F.currentPlanet&&F.currentPlanet.buildings[m.requiredBuilding]||0),B=s(()=>z.value>=m.requiredLevel),V=()=>{P.push(`/buildings`)};return(s,u)=>B.value?p(``,!0):(r(),a(`div`,T,[c(_(f),{class:`max-w-md w-full`},{default:l(()=>[c(_(y),{class:`text-center`},{default:l(()=>[h(`div`,E,[h(`div`,D,[c(_(w),{size:48,class:`text-muted-foreground`})])]),c(_(g),{class:`text-xl sm:text-2xl`},{default:l(()=>[o(v(_(I)(`common.featureLocked`)),1)]),_:1}),c(_(e),{class:`text-sm sm:text-base`},{default:l(()=>[o(v(_(I)(`common.unlockRequired`)),1)]),_:1})]),_:1}),c(_(d),{class:`space-y-4`},{default:l(()=>[h(`div`,O,[h(`p`,k,v(_(I)(`common.requiredBuilding`))+`:`,1),h(`div`,A,[h(`span`,j,v(R.value),1),c(_(i),{variant:`default`},{default:l(()=>[o(`Lv `+v(n.requiredLevel),1)]),_:1})]),z.value===void 0?p(``,!0):(r(),a(`p`,M,v(_(I)(`common.currentLevel`))+`: Lv `+v(z.value),1))]),h(`div`,N,[c(_(S),{onClick:V,class:`flex-1`},{default:l(()=>[c(_(t),{size:16,class:`mr-2`}),o(` `+v(_(I)(`common.goToBuildings`)),1)]),_:1})])]),_:1})]),_:1})]))}});export{w as n,P as t};

View File

@@ -1 +1 @@
import{jt as e}from"./index-BpOElaf9.js";var t=e(`eye`,[[`path`,{d:`M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0`,key:`1nclc0`}],[`circle`,{cx:`12`,cy:`12`,r:`3`,key:`1v7zrd`}]]);export{t}; import{jt as e}from"./index-Cch-Ig40.js";var t=e(`eye`,[[`path`,{d:`M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0`,key:`1nclc0`}],[`circle`,{cx:`12`,cy:`12`,r:`3`,key:`1v7zrd`}]]);export{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

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

@@ -1 +0,0 @@
import{F as e,N as t,P as n,T as r,a as i,c as a,d as o,f as s,l as c,n as l,o as u,p as d,r as f,s as p,t as m,u as h}from"./index-BpOElaf9.js";const g=(e,n,r,i)=>{let a=u(n,r);return h(n,e.buildings,i)?t(e.resources,a)?{valid:!0}:{valid:!1,reason:`资源不足`}:{valid:!1,reason:`不满足前置条件`}},_=(t,r,a,o)=>{let c=u(r,a),l=i(r,a,e(o,Date.now()).buildingSpeedBonus);return n(t.resources,c),s(r,a,l)},v=(e,n,r,i)=>{let a=l(n,r);return p(n,e.buildings,i)?t(e.resources,a)?c(n,e.defense,r)?{valid:!0}:{valid:!1,reason:`护盾罩数量限制`}:{valid:!1,reason:`资源不足`}:{valid:!1,reason:`不满足前置条件`}},y=(t,r,i,a)=>{let s=l(r,i),c=m(r,i,e(a,Date.now()).buildingSpeedBonus);return n(t.resources,s),o(r,i,c)},b=(t,n,i,o,s=0)=>{let c=e(o,Date.now());if(s>=r(c.additionalFleetSlots))return{valid:!1,reason:`舰队任务槽位已满`};if(!a(t.fleet,n))return{valid:!1,reason:`舰队数量不足`};let l=f(n,c.fuelConsumptionReduction,i);return t.resources.deuterium<l?{valid:!1,reason:`燃料不足`,fuelNeeded:l}:{valid:!0,fuelNeeded:l}},x=(e,t,r,i,a)=>{d(e.fleet,t),e.resources.deuterium-=r,i&&n(e.resources,a)};export{b as a,v as i,x as n,g as o,_ as r,y as t};

View File

@@ -0,0 +1 @@
import{F as e,N as t,P as n,T as r,a as i,c as a,d as o,f as s,l as c,n as l,o as u,p as d,r as f,s as p,t as m,u as h}from"./index-Cch-Ig40.js";const g=(e,n,r,i)=>{let a=u(n,r);return h(n,e.buildings,i)?t(e.resources,a)?{valid:!0}:{valid:!1,reason:`errors.insufficientResources`}:{valid:!1,reason:`errors.requirementsNotMet`}},_=(t,r,a,o)=>{let c=u(r,a),l=i(r,a,e(o,Date.now()).buildingSpeedBonus);return n(t.resources,c),s(r,a,l)},v=(e,n,r,i)=>{let a=l(n,r);return p(n,e.buildings,i)?t(e.resources,a)?c(n,e.defense,r)?{valid:!0}:{valid:!1,reason:`errors.shieldDomeLimit`}:{valid:!1,reason:`errors.insufficientResources`}:{valid:!1,reason:`errors.requirementsNotMet`}},y=(t,r,i,a)=>{let s=l(r,i),c=m(r,i,e(a,Date.now()).buildingSpeedBonus);return n(t.resources,s),o(r,i,c)},b=(t,n,i,o,s=0)=>{let c=e(o,Date.now());if(s>=r(c.additionalFleetSlots))return{valid:!1,reason:`errors.fleetMissionsFull`};if(!a(t.fleet,n))return{valid:!1,reason:`errors.insufficientFleet`};let l=f(n,c.fuelConsumptionReduction,i);return t.resources.deuterium<l?{valid:!1,reason:`errors.insufficientFuel`,fuelNeeded:l}:{valid:!0,fuelNeeded:l}},x=(e,t,r,i,a)=>{d(e.fleet,t),e.resources.deuterium-=r,i&&n(e.resources,a)};export{b as a,v as i,x as n,g as o,_ as r,y as t};

View File

@@ -0,0 +1 @@
import{W as e}from"./vendor-ui-DBxeWLyT.js";import{$ as t,Bt as n,Q as r,ct as i,et as a,it as o,nt as s,ot as c,rt as l,st as u,tt as d}from"./index-Cch-Ig40.js";const f=()=>{let{t:f}=n(),p={[l.MetalMine]:`metalMine`,[l.CrystalMine]:`crystalMine`,[l.DeuteriumSynthesizer]:`deuteriumSynthesizer`,[l.SolarPlant]:`solarPlant`,[l.RoboticsFactory]:`roboticsFactory`,[l.NaniteFactory]:`naniteFactory`,[l.Shipyard]:`shipyard`,[l.ResearchLab]:`researchLab`,[l.MetalStorage]:`metalStorage`,[l.CrystalStorage]:`crystalStorage`,[l.DeuteriumTank]:`deuteriumTank`,[l.DarkMatterCollector]:`darkMatterCollector`,[l.LunarBase]:`lunarBase`,[l.SensorPhalanx]:`sensorPhalanx`,[l.JumpGate]:`jumpGate`},m={[u.LightFighter]:`lightFighter`,[u.HeavyFighter]:`heavyFighter`,[u.Cruiser]:`cruiser`,[u.Battleship]:`battleship`,[u.SmallCargo]:`smallCargo`,[u.LargeCargo]:`largeCargo`,[u.ColonyShip]:`colonyShip`,[u.Recycler]:`recycler`,[u.EspionageProbe]:`espionageProbe`,[u.DarkMatterHarvester]:`darkMatterHarvester`},h={[o.RocketLauncher]:`rocketLauncher`,[o.LightLaser]:`lightLaser`,[o.HeavyLaser]:`heavyLaser`,[o.GaussCannon]:`gaussCannon`,[o.IonCannon]:`ionCannon`,[o.PlasmaTurret]:`plasmaTurret`,[o.SmallShieldDome]:`smallShieldDome`,[o.LargeShieldDome]:`largeShieldDome`},g={[i.EnergyTechnology]:`energyTechnology`,[i.LaserTechnology]:`laserTechnology`,[i.IonTechnology]:`ionTechnology`,[i.HyperspaceTechnology]:`hyperspaceTechnology`,[i.PlasmaTechnology]:`plasmaTechnology`,[i.ComputerTechnology]:`computerTechnology`,[i.CombustionDrive]:`combustionDrive`,[i.ImpulseDrive]:`impulseDrive`,[i.HyperspaceDrive]:`hyperspaceDrive`,[i.DarkMatterTechnology]:`darkMatterTechnology`},_={[c.Commander]:`commander`,[c.Admiral]:`admiral`,[c.Engineer]:`engineer`,[c.Geologist]:`geologist`,[c.Technocrat]:`technocrat`,[c.DarkMatterSpecialist]:`darkMatterSpecialist`};return{BUILDINGS:e(()=>{let e={};for(let[t,n]of Object.entries(r)){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(d)){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[n,r]of Object.entries(t)){let t=n,i=h[t];e[t]={...r,name:f(`defenses.${i}`),description:f(`defenseDescriptions.${i}`)}}return e}),TECHNOLOGIES:e(()=>{let e={};for(let[t,n]of Object.entries(s)){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(a)){let r=t,i=_[r];e[r]={...n,name:f(`officers.${i}`),description:f(`officerDescriptions.${i}`)}}return e})}};export{f as t};

View File

@@ -1 +0,0 @@
import{$ as e,On as t,Q as n,bn as r,ct as i,et as a,it as o,nt as s,ot as c,rt as l,st as u,tt as d}from"./index-BpOElaf9.js";const f=()=>{let{t:f}=r(),p={[l.MetalMine]:`metalMine`,[l.CrystalMine]:`crystalMine`,[l.DeuteriumSynthesizer]:`deuteriumSynthesizer`,[l.SolarPlant]:`solarPlant`,[l.RoboticsFactory]:`roboticsFactory`,[l.NaniteFactory]:`naniteFactory`,[l.Shipyard]:`shipyard`,[l.ResearchLab]:`researchLab`,[l.MetalStorage]:`metalStorage`,[l.CrystalStorage]:`crystalStorage`,[l.DeuteriumTank]:`deuteriumTank`,[l.DarkMatterCollector]:`darkMatterCollector`,[l.LunarBase]:`lunarBase`,[l.SensorPhalanx]:`sensorPhalanx`,[l.JumpGate]:`jumpGate`},m={[u.LightFighter]:`lightFighter`,[u.HeavyFighter]:`heavyFighter`,[u.Cruiser]:`cruiser`,[u.Battleship]:`battleship`,[u.SmallCargo]:`smallCargo`,[u.LargeCargo]:`largeCargo`,[u.ColonyShip]:`colonyShip`,[u.Recycler]:`recycler`,[u.EspionageProbe]:`espionageProbe`,[u.DarkMatterHarvester]:`darkMatterHarvester`},h={[o.RocketLauncher]:`rocketLauncher`,[o.LightLaser]:`lightLaser`,[o.HeavyLaser]:`heavyLaser`,[o.GaussCannon]:`gaussCannon`,[o.IonCannon]:`ionCannon`,[o.PlasmaTurret]:`plasmaTurret`,[o.SmallShieldDome]:`smallShieldDome`,[o.LargeShieldDome]:`largeShieldDome`},g={[i.EnergyTechnology]:`energyTechnology`,[i.LaserTechnology]:`laserTechnology`,[i.IonTechnology]:`ionTechnology`,[i.HyperspaceTechnology]:`hyperspaceTechnology`,[i.PlasmaTechnology]:`plasmaTechnology`,[i.ComputerTechnology]:`computerTechnology`,[i.CombustionDrive]:`combustionDrive`,[i.ImpulseDrive]:`impulseDrive`,[i.HyperspaceDrive]:`hyperspaceDrive`,[i.DarkMatterTechnology]:`darkMatterTechnology`},_={[c.Commander]:`commander`,[c.Admiral]:`admiral`,[c.Engineer]:`engineer`,[c.Geologist]:`geologist`,[c.Technocrat]:`technocrat`,[c.DarkMatterSpecialist]:`darkMatterSpecialist`};return{BUILDINGS:t(()=>{let e={};for(let[t,r]of Object.entries(n)){let n=t,i=p[n];e[n]={...r,name:f(`buildings.${i}`),description:f(`buildingDescriptions.${i}`)}}return e}),SHIPS:t(()=>{let e={};for(let[t,n]of Object.entries(d)){let r=t,i=m[r];e[r]={...n,name:f(`ships.${i}`),description:f(`shipDescriptions.${i}`)}}return e}),DEFENSES:t(()=>{let t={};for(let[n,r]of Object.entries(e)){let e=n,i=h[e];t[e]={...r,name:f(`defenses.${i}`),description:f(`defenseDescriptions.${i}`)}}return t}),TECHNOLOGIES:t(()=>{let e={};for(let[t,n]of Object.entries(s)){let r=t,i=g[r];e[r]={...n,name:f(`technologies.${i}`),description:f(`technologyDescriptions.${i}`)}}return e}),OFFICERS:t(()=>{let e={};for(let[t,n]of Object.entries(a)){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

View File

@@ -1,17 +1,24 @@
<!doctype html> <!DOCTYPE html>
<html lang="zh-CN"> <html lang="zh-cmn-Hans">
<head> <head>
<meta charset="UTF-8" /> <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" /> <link rel="icon" type="image/svg+xml" href="./logo.svg" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>OGame-Vue-Ts</title> <title>OGame-Vue-Ts</title>
<script type="module" crossorigin src="./assets/index-BpOElaf9.js"></script> <script type="module" crossorigin src="./assets/index-Cch-Ig40.js"></script>
<link rel="stylesheet" crossorigin href="./assets/index-BXmZ_V9Y.css"> <link rel="modulepreload" crossorigin href="./assets/rolldown-runtime-CIDIeb-o.js">
<link rel="modulepreload" crossorigin href="./assets/vendor-ui-DBxeWLyT.js">
<link rel="modulepreload" crossorigin href="./assets/vendor-vue-Bqq1sBNf.js">
<link rel="stylesheet" crossorigin href="./assets/index-B25uYV3W.css">
</head> </head>
<body> <body>
<div id="app"></div> <div id="app"></div>
<!-- 统计勿删 -->
<script charset="UTF-8" id="LA_COLLECT" src="//sdk.51.la/js-sdk-pro.min.js"></script>
<script>LA.init({ id: "L298GYqn6JhAO0VU", ck: "L298GYqn6JhAO0VU", autoTrack: true, hashMode: true })</script>
</body> </body>
</html> </html>

View File

@@ -18,6 +18,8 @@
"@vueuse/core": "^14.1.0", "@vueuse/core": "^14.1.0",
"class-variance-authority": "^0.7.1", "class-variance-authority": "^0.7.1",
"clsx": "^2.1.1", "clsx": "^2.1.1",
"crypto-js": "^4.2.0",
"file-saver": "^2.0.5",
"lucide-vue-next": "^0.556.0", "lucide-vue-next": "^0.556.0",
"pinia": "^3.0.4", "pinia": "^3.0.4",
"pinia-plugin-persistedstate": "^4.7.1", "pinia-plugin-persistedstate": "^4.7.1",

359
pnpm-lock.yaml generated
View File

@@ -13,7 +13,7 @@ importers:
dependencies: dependencies:
'@tailwindcss/vite': '@tailwindcss/vite':
specifier: ^4.1.17 specifier: ^4.1.17
version: 4.1.17(rolldown-vite@7.2.5(@types/node@24.10.2)(jiti@2.6.1)) version: 4.1.17(rolldown-vite@7.2.5(@types/node@24.10.2)(esbuild@0.27.1)(jiti@2.6.1)(terser@5.44.1))
'@tanstack/vue-table': '@tanstack/vue-table':
specifier: ^8.21.3 specifier: ^8.21.3
version: 8.21.3(vue@3.5.25(typescript@5.9.3)) version: 8.21.3(vue@3.5.25(typescript@5.9.3))
@@ -26,6 +26,12 @@ importers:
clsx: clsx:
specifier: ^2.1.1 specifier: ^2.1.1
version: 2.1.1 version: 2.1.1
crypto-js:
specifier: ^4.2.0
version: 4.2.0
file-saver:
specifier: ^2.0.5
version: 2.0.5
lucide-vue-next: lucide-vue-next:
specifier: ^0.556.0 specifier: ^0.556.0
version: 0.556.0(vue@3.5.25(typescript@5.9.3)) version: 0.556.0(vue@3.5.25(typescript@5.9.3))
@@ -65,10 +71,16 @@ importers:
version: 24.10.2 version: 24.10.2
'@vitejs/plugin-vue': '@vitejs/plugin-vue':
specifier: ^6.0.1 specifier: ^6.0.1
version: 6.0.2(rolldown-vite@7.2.5(@types/node@24.10.2)(jiti@2.6.1))(vue@3.5.25(typescript@5.9.3)) version: 6.0.2(rolldown-vite@7.2.5(@types/node@24.10.2)(esbuild@0.27.1)(jiti@2.6.1)(terser@5.44.1))(vue@3.5.25(typescript@5.9.3))
'@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))
esbuild:
specifier: ^0.27.1
version: 0.27.1
terser:
specifier: ^5.44.1
version: 5.44.1
tw-animate-css: tw-animate-css:
specifier: ^1.4.0 specifier: ^1.4.0
version: 1.4.0 version: 1.4.0
@@ -77,7 +89,7 @@ importers:
version: 5.9.3 version: 5.9.3
vite: vite:
specifier: npm:rolldown-vite@7.2.5 specifier: npm:rolldown-vite@7.2.5
version: rolldown-vite@7.2.5(@types/node@24.10.2)(jiti@2.6.1) version: rolldown-vite@7.2.5(@types/node@24.10.2)(esbuild@0.27.1)(jiti@2.6.1)(terser@5.44.1)
vue-tsc: vue-tsc:
specifier: ^3.1.4 specifier: ^3.1.4
version: 3.1.8(typescript@5.9.3) version: 3.1.8(typescript@5.9.3)
@@ -110,6 +122,162 @@ packages:
'@emnapi/wasi-threads@1.1.0': '@emnapi/wasi-threads@1.1.0':
resolution: {integrity: sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==} resolution: {integrity: sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==}
'@esbuild/aix-ppc64@0.27.1':
resolution: {integrity: sha512-HHB50pdsBX6k47S4u5g/CaLjqS3qwaOVE5ILsq64jyzgMhLuCuZ8rGzM9yhsAjfjkbgUPMzZEPa7DAp7yz6vuA==}
engines: {node: '>=18'}
cpu: [ppc64]
os: [aix]
'@esbuild/android-arm64@0.27.1':
resolution: {integrity: sha512-45fuKmAJpxnQWixOGCrS+ro4Uvb4Re9+UTieUY2f8AEc+t7d4AaZ6eUJ3Hva7dtrxAAWHtlEFsXFMAgNnGU9uQ==}
engines: {node: '>=18'}
cpu: [arm64]
os: [android]
'@esbuild/android-arm@0.27.1':
resolution: {integrity: sha512-kFqa6/UcaTbGm/NncN9kzVOODjhZW8e+FRdSeypWe6j33gzclHtwlANs26JrupOntlcWmB0u8+8HZo8s7thHvg==}
engines: {node: '>=18'}
cpu: [arm]
os: [android]
'@esbuild/android-x64@0.27.1':
resolution: {integrity: sha512-LBEpOz0BsgMEeHgenf5aqmn/lLNTFXVfoWMUox8CtWWYK9X4jmQzWjoGoNb8lmAYml/tQ/Ysvm8q7szu7BoxRQ==}
engines: {node: '>=18'}
cpu: [x64]
os: [android]
'@esbuild/darwin-arm64@0.27.1':
resolution: {integrity: sha512-veg7fL8eMSCVKL7IW4pxb54QERtedFDfY/ASrumK/SbFsXnRazxY4YykN/THYqFnFwJ0aVjiUrVG2PwcdAEqQQ==}
engines: {node: '>=18'}
cpu: [arm64]
os: [darwin]
'@esbuild/darwin-x64@0.27.1':
resolution: {integrity: sha512-+3ELd+nTzhfWb07Vol7EZ+5PTbJ/u74nC6iv4/lwIU99Ip5uuY6QoIf0Hn4m2HoV0qcnRivN3KSqc+FyCHjoVQ==}
engines: {node: '>=18'}
cpu: [x64]
os: [darwin]
'@esbuild/freebsd-arm64@0.27.1':
resolution: {integrity: sha512-/8Rfgns4XD9XOSXlzUDepG8PX+AVWHliYlUkFI3K3GB6tqbdjYqdhcb4BKRd7C0BhZSoaCxhv8kTcBrcZWP+xg==}
engines: {node: '>=18'}
cpu: [arm64]
os: [freebsd]
'@esbuild/freebsd-x64@0.27.1':
resolution: {integrity: sha512-GITpD8dK9C+r+5yRT/UKVT36h/DQLOHdwGVwwoHidlnA168oD3uxA878XloXebK4Ul3gDBBIvEdL7go9gCUFzQ==}
engines: {node: '>=18'}
cpu: [x64]
os: [freebsd]
'@esbuild/linux-arm64@0.27.1':
resolution: {integrity: sha512-W9//kCrh/6in9rWIBdKaMtuTTzNj6jSeG/haWBADqLLa9P8O5YSRDzgD5y9QBok4AYlzS6ARHifAb75V6G670Q==}
engines: {node: '>=18'}
cpu: [arm64]
os: [linux]
'@esbuild/linux-arm@0.27.1':
resolution: {integrity: sha512-ieMID0JRZY/ZeCrsFQ3Y3NlHNCqIhTprJfDgSB3/lv5jJZ8FX3hqPyXWhe+gvS5ARMBJ242PM+VNz/ctNj//eA==}
engines: {node: '>=18'}
cpu: [arm]
os: [linux]
'@esbuild/linux-ia32@0.27.1':
resolution: {integrity: sha512-VIUV4z8GD8rtSVMfAj1aXFahsi/+tcoXXNYmXgzISL+KB381vbSTNdeZHHHIYqFyXcoEhu9n5cT+05tRv13rlw==}
engines: {node: '>=18'}
cpu: [ia32]
os: [linux]
'@esbuild/linux-loong64@0.27.1':
resolution: {integrity: sha512-l4rfiiJRN7sTNI//ff65zJ9z8U+k6zcCg0LALU5iEWzY+a1mVZ8iWC1k5EsNKThZ7XCQ6YWtsZ8EWYm7r1UEsg==}
engines: {node: '>=18'}
cpu: [loong64]
os: [linux]
'@esbuild/linux-mips64el@0.27.1':
resolution: {integrity: sha512-U0bEuAOLvO/DWFdygTHWY8C067FXz+UbzKgxYhXC0fDieFa0kDIra1FAhsAARRJbvEyso8aAqvPdNxzWuStBnA==}
engines: {node: '>=18'}
cpu: [mips64el]
os: [linux]
'@esbuild/linux-ppc64@0.27.1':
resolution: {integrity: sha512-NzdQ/Xwu6vPSf/GkdmRNsOfIeSGnh7muundsWItmBsVpMoNPVpM61qNzAVY3pZ1glzzAxLR40UyYM23eaDDbYQ==}
engines: {node: '>=18'}
cpu: [ppc64]
os: [linux]
'@esbuild/linux-riscv64@0.27.1':
resolution: {integrity: sha512-7zlw8p3IApcsN7mFw0O1Z1PyEk6PlKMu18roImfl3iQHTnr/yAfYv6s4hXPidbDoI2Q0pW+5xeoM4eTCC0UdrQ==}
engines: {node: '>=18'}
cpu: [riscv64]
os: [linux]
'@esbuild/linux-s390x@0.27.1':
resolution: {integrity: sha512-cGj5wli+G+nkVQdZo3+7FDKC25Uh4ZVwOAK6A06Hsvgr8WqBBuOy/1s+PUEd/6Je+vjfm6stX0kmib5b/O2Ykw==}
engines: {node: '>=18'}
cpu: [s390x]
os: [linux]
'@esbuild/linux-x64@0.27.1':
resolution: {integrity: sha512-z3H/HYI9MM0HTv3hQZ81f+AKb+yEoCRlUby1F80vbQ5XdzEMyY/9iNlAmhqiBKw4MJXwfgsh7ERGEOhrM1niMA==}
engines: {node: '>=18'}
cpu: [x64]
os: [linux]
'@esbuild/netbsd-arm64@0.27.1':
resolution: {integrity: sha512-wzC24DxAvk8Em01YmVXyjl96Mr+ecTPyOuADAvjGg+fyBpGmxmcr2E5ttf7Im8D0sXZihpxzO1isus8MdjMCXQ==}
engines: {node: '>=18'}
cpu: [arm64]
os: [netbsd]
'@esbuild/netbsd-x64@0.27.1':
resolution: {integrity: sha512-1YQ8ybGi2yIXswu6eNzJsrYIGFpnlzEWRl6iR5gMgmsrR0FcNoV1m9k9sc3PuP5rUBLshOZylc9nqSgymI+TYg==}
engines: {node: '>=18'}
cpu: [x64]
os: [netbsd]
'@esbuild/openbsd-arm64@0.27.1':
resolution: {integrity: sha512-5Z+DzLCrq5wmU7RDaMDe2DVXMRm2tTDvX2KU14JJVBN2CT/qov7XVix85QoJqHltpvAOZUAc3ndU56HSMWrv8g==}
engines: {node: '>=18'}
cpu: [arm64]
os: [openbsd]
'@esbuild/openbsd-x64@0.27.1':
resolution: {integrity: sha512-Q73ENzIdPF5jap4wqLtsfh8YbYSZ8Q0wnxplOlZUOyZy7B4ZKW8DXGWgTCZmF8VWD7Tciwv5F4NsRf6vYlZtqg==}
engines: {node: '>=18'}
cpu: [x64]
os: [openbsd]
'@esbuild/openharmony-arm64@0.27.1':
resolution: {integrity: sha512-ajbHrGM/XiK+sXM0JzEbJAen+0E+JMQZ2l4RR4VFwvV9JEERx+oxtgkpoKv1SevhjavK2z2ReHk32pjzktWbGg==}
engines: {node: '>=18'}
cpu: [arm64]
os: [openharmony]
'@esbuild/sunos-x64@0.27.1':
resolution: {integrity: sha512-IPUW+y4VIjuDVn+OMzHc5FV4GubIwPnsz6ubkvN8cuhEqH81NovB53IUlrlBkPMEPxvNnf79MGBoz8rZ2iW8HA==}
engines: {node: '>=18'}
cpu: [x64]
os: [sunos]
'@esbuild/win32-arm64@0.27.1':
resolution: {integrity: sha512-RIVRWiljWA6CdVu8zkWcRmGP7iRRIIwvhDKem8UMBjPql2TXM5PkDVvvrzMtj1V+WFPB4K7zkIGM7VzRtFkjdg==}
engines: {node: '>=18'}
cpu: [arm64]
os: [win32]
'@esbuild/win32-ia32@0.27.1':
resolution: {integrity: sha512-2BR5M8CPbptC1AK5JbJT1fWrHLvejwZidKx3UMSF0ecHMa+smhi16drIrCEggkgviBwLYd5nwrFLSl5Kho96RQ==}
engines: {node: '>=18'}
cpu: [ia32]
os: [win32]
'@esbuild/win32-x64@0.27.1':
resolution: {integrity: sha512-d5X6RMYv6taIymSk8JBP+nxv8DQAMY6A51GPgusqLdK9wBz5wWIXy1KjTck6HnjE9hqJzJRdk+1p/t5soSbCtw==}
engines: {node: '>=18'}
cpu: [x64]
os: [win32]
'@floating-ui/core@1.7.3': '@floating-ui/core@1.7.3':
resolution: {integrity: sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==} resolution: {integrity: sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==}
@@ -138,6 +306,9 @@ packages:
resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==}
engines: {node: '>=6.0.0'} engines: {node: '>=6.0.0'}
'@jridgewell/source-map@0.3.11':
resolution: {integrity: sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==}
'@jridgewell/sourcemap-codec@1.5.5': '@jridgewell/sourcemap-codec@1.5.5':
resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==}
@@ -472,6 +643,11 @@ packages:
peerDependencies: peerDependencies:
vue: ^3.5.0 vue: ^3.5.0
acorn@8.15.0:
resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==}
engines: {node: '>=0.4.0'}
hasBin: true
alien-signals@3.1.1: alien-signals@3.1.1:
resolution: {integrity: sha512-ogkIWbVrLwKtHY6oOAXaYkAxP+cTH7V5FZ5+Tm4NZFd8VDZ6uNMDrfzqctTZ42eTMCSR3ne3otpcxmqSnFfPYA==} resolution: {integrity: sha512-ogkIWbVrLwKtHY6oOAXaYkAxP+cTH7V5FZ5+Tm4NZFd8VDZ6uNMDrfzqctTZ42eTMCSR3ne3otpcxmqSnFfPYA==}
@@ -482,6 +658,9 @@ packages:
birpc@2.9.0: birpc@2.9.0:
resolution: {integrity: sha512-KrayHS5pBi69Xi9JmvoqrIgYGDkD6mcSe/i6YKi3w5kekCLzrX4+nawcXqrj2tIp50Kw/mT/s3p+GVK0A0sKxw==} resolution: {integrity: sha512-KrayHS5pBi69Xi9JmvoqrIgYGDkD6mcSe/i6YKi3w5kekCLzrX4+nawcXqrj2tIp50Kw/mT/s3p+GVK0A0sKxw==}
buffer-from@1.1.2:
resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==}
class-variance-authority@0.7.1: class-variance-authority@0.7.1:
resolution: {integrity: sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==} resolution: {integrity: sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==}
@@ -489,10 +668,16 @@ packages:
resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==}
engines: {node: '>=6'} engines: {node: '>=6'}
commander@2.20.3:
resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==}
copy-anything@4.0.5: copy-anything@4.0.5:
resolution: {integrity: sha512-7Vv6asjS4gMOuILabD3l739tsaxFQmC+a7pLZm02zyvs8p977bL3zEgq3yDk5rn9B0PbYgIv++jmHcuUab4RhA==} resolution: {integrity: sha512-7Vv6asjS4gMOuILabD3l739tsaxFQmC+a7pLZm02zyvs8p977bL3zEgq3yDk5rn9B0PbYgIv++jmHcuUab4RhA==}
engines: {node: '>=18'} engines: {node: '>=18'}
crypto-js@4.2.0:
resolution: {integrity: sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==}
csstype@3.2.3: csstype@3.2.3:
resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==}
@@ -511,6 +696,11 @@ packages:
resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==}
engines: {node: '>=0.12'} engines: {node: '>=0.12'}
esbuild@0.27.1:
resolution: {integrity: sha512-yY35KZckJJuVVPXpvjgxiCuVEJT67F6zDeVTv4rizyPrfGBUpZQsvmxnN+C371c2esD/hNMjj4tpBhuueLN7aA==}
engines: {node: '>=18'}
hasBin: true
estree-walker@2.0.2: estree-walker@2.0.2:
resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==}
@@ -523,6 +713,9 @@ packages:
picomatch: picomatch:
optional: true optional: true
file-saver@2.0.5:
resolution: {integrity: sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA==}
fsevents@2.3.3: fsevents@2.3.3:
resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
@@ -735,6 +928,13 @@ packages:
resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==}
engines: {node: '>=0.10.0'} engines: {node: '>=0.10.0'}
source-map-support@0.5.21:
resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==}
source-map@0.6.1:
resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==}
engines: {node: '>=0.10.0'}
speakingurl@14.0.1: speakingurl@14.0.1:
resolution: {integrity: sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==} resolution: {integrity: sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==}
engines: {node: '>=0.10.0'} engines: {node: '>=0.10.0'}
@@ -753,6 +953,11 @@ packages:
resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==} resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==}
engines: {node: '>=6'} engines: {node: '>=6'}
terser@5.44.1:
resolution: {integrity: sha512-t/R3R/n0MSwnnazuPpPNVO60LX0SKL45pyl9YlvxIdkH0Of7D5qM2EVe+yASRIlY5pZ73nclYJfNANGWPwFDZw==}
engines: {node: '>=10'}
hasBin: true
tinyglobby@0.2.15: tinyglobby@0.2.15:
resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==}
engines: {node: '>=12.0.0'} engines: {node: '>=12.0.0'}
@@ -849,6 +1054,84 @@ snapshots:
tslib: 2.8.1 tslib: 2.8.1
optional: true optional: true
'@esbuild/aix-ppc64@0.27.1':
optional: true
'@esbuild/android-arm64@0.27.1':
optional: true
'@esbuild/android-arm@0.27.1':
optional: true
'@esbuild/android-x64@0.27.1':
optional: true
'@esbuild/darwin-arm64@0.27.1':
optional: true
'@esbuild/darwin-x64@0.27.1':
optional: true
'@esbuild/freebsd-arm64@0.27.1':
optional: true
'@esbuild/freebsd-x64@0.27.1':
optional: true
'@esbuild/linux-arm64@0.27.1':
optional: true
'@esbuild/linux-arm@0.27.1':
optional: true
'@esbuild/linux-ia32@0.27.1':
optional: true
'@esbuild/linux-loong64@0.27.1':
optional: true
'@esbuild/linux-mips64el@0.27.1':
optional: true
'@esbuild/linux-ppc64@0.27.1':
optional: true
'@esbuild/linux-riscv64@0.27.1':
optional: true
'@esbuild/linux-s390x@0.27.1':
optional: true
'@esbuild/linux-x64@0.27.1':
optional: true
'@esbuild/netbsd-arm64@0.27.1':
optional: true
'@esbuild/netbsd-x64@0.27.1':
optional: true
'@esbuild/openbsd-arm64@0.27.1':
optional: true
'@esbuild/openbsd-x64@0.27.1':
optional: true
'@esbuild/openharmony-arm64@0.27.1':
optional: true
'@esbuild/sunos-x64@0.27.1':
optional: true
'@esbuild/win32-arm64@0.27.1':
optional: true
'@esbuild/win32-ia32@0.27.1':
optional: true
'@esbuild/win32-x64@0.27.1':
optional: true
'@floating-ui/core@1.7.3': '@floating-ui/core@1.7.3':
dependencies: dependencies:
'@floating-ui/utils': 0.2.10 '@floating-ui/utils': 0.2.10
@@ -889,6 +1172,11 @@ snapshots:
'@jridgewell/resolve-uri@3.1.2': {} '@jridgewell/resolve-uri@3.1.2': {}
'@jridgewell/source-map@0.3.11':
dependencies:
'@jridgewell/gen-mapping': 0.3.13
'@jridgewell/trace-mapping': 0.3.31
'@jridgewell/sourcemap-codec@1.5.5': {} '@jridgewell/sourcemap-codec@1.5.5': {}
'@jridgewell/trace-mapping@0.3.31': '@jridgewell/trace-mapping@0.3.31':
@@ -1018,12 +1306,12 @@ snapshots:
'@tailwindcss/oxide-win32-arm64-msvc': 4.1.17 '@tailwindcss/oxide-win32-arm64-msvc': 4.1.17
'@tailwindcss/oxide-win32-x64-msvc': 4.1.17 '@tailwindcss/oxide-win32-x64-msvc': 4.1.17
'@tailwindcss/vite@4.1.17(rolldown-vite@7.2.5(@types/node@24.10.2)(jiti@2.6.1))': '@tailwindcss/vite@4.1.17(rolldown-vite@7.2.5(@types/node@24.10.2)(esbuild@0.27.1)(jiti@2.6.1)(terser@5.44.1))':
dependencies: dependencies:
'@tailwindcss/node': 4.1.17 '@tailwindcss/node': 4.1.17
'@tailwindcss/oxide': 4.1.17 '@tailwindcss/oxide': 4.1.17
tailwindcss: 4.1.17 tailwindcss: 4.1.17
vite: rolldown-vite@7.2.5(@types/node@24.10.2)(jiti@2.6.1) vite: rolldown-vite@7.2.5(@types/node@24.10.2)(esbuild@0.27.1)(jiti@2.6.1)(terser@5.44.1)
'@tanstack/table-core@8.21.3': {} '@tanstack/table-core@8.21.3': {}
@@ -1054,10 +1342,10 @@ snapshots:
'@types/web-bluetooth@0.0.21': {} '@types/web-bluetooth@0.0.21': {}
'@vitejs/plugin-vue@6.0.2(rolldown-vite@7.2.5(@types/node@24.10.2)(jiti@2.6.1))(vue@3.5.25(typescript@5.9.3))': '@vitejs/plugin-vue@6.0.2(rolldown-vite@7.2.5(@types/node@24.10.2)(esbuild@0.27.1)(jiti@2.6.1)(terser@5.44.1))(vue@3.5.25(typescript@5.9.3))':
dependencies: dependencies:
'@rolldown/pluginutils': 1.0.0-beta.50 '@rolldown/pluginutils': 1.0.0-beta.50
vite: rolldown-vite@7.2.5(@types/node@24.10.2)(jiti@2.6.1) vite: rolldown-vite@7.2.5(@types/node@24.10.2)(esbuild@0.27.1)(jiti@2.6.1)(terser@5.44.1)
vue: 3.5.25(typescript@5.9.3) vue: 3.5.25(typescript@5.9.3)
'@volar/language-core@2.4.26': '@volar/language-core@2.4.26':
@@ -1193,6 +1481,8 @@ snapshots:
dependencies: dependencies:
vue: 3.5.25(typescript@5.9.3) vue: 3.5.25(typescript@5.9.3)
acorn@8.15.0: {}
alien-signals@3.1.1: {} alien-signals@3.1.1: {}
aria-hidden@1.2.6: aria-hidden@1.2.6:
@@ -1201,16 +1491,22 @@ snapshots:
birpc@2.9.0: {} birpc@2.9.0: {}
buffer-from@1.1.2: {}
class-variance-authority@0.7.1: class-variance-authority@0.7.1:
dependencies: dependencies:
clsx: 2.1.1 clsx: 2.1.1
clsx@2.1.1: {} clsx@2.1.1: {}
commander@2.20.3: {}
copy-anything@4.0.5: copy-anything@4.0.5:
dependencies: dependencies:
is-what: 5.5.0 is-what: 5.5.0
crypto-js@4.2.0: {}
csstype@3.2.3: {} csstype@3.2.3: {}
defu@6.1.4: {} defu@6.1.4: {}
@@ -1224,12 +1520,43 @@ snapshots:
entities@4.5.0: {} entities@4.5.0: {}
esbuild@0.27.1:
optionalDependencies:
'@esbuild/aix-ppc64': 0.27.1
'@esbuild/android-arm': 0.27.1
'@esbuild/android-arm64': 0.27.1
'@esbuild/android-x64': 0.27.1
'@esbuild/darwin-arm64': 0.27.1
'@esbuild/darwin-x64': 0.27.1
'@esbuild/freebsd-arm64': 0.27.1
'@esbuild/freebsd-x64': 0.27.1
'@esbuild/linux-arm': 0.27.1
'@esbuild/linux-arm64': 0.27.1
'@esbuild/linux-ia32': 0.27.1
'@esbuild/linux-loong64': 0.27.1
'@esbuild/linux-mips64el': 0.27.1
'@esbuild/linux-ppc64': 0.27.1
'@esbuild/linux-riscv64': 0.27.1
'@esbuild/linux-s390x': 0.27.1
'@esbuild/linux-x64': 0.27.1
'@esbuild/netbsd-arm64': 0.27.1
'@esbuild/netbsd-x64': 0.27.1
'@esbuild/openbsd-arm64': 0.27.1
'@esbuild/openbsd-x64': 0.27.1
'@esbuild/openharmony-arm64': 0.27.1
'@esbuild/sunos-x64': 0.27.1
'@esbuild/win32-arm64': 0.27.1
'@esbuild/win32-ia32': 0.27.1
'@esbuild/win32-x64': 0.27.1
estree-walker@2.0.2: {} estree-walker@2.0.2: {}
fdir@6.5.0(picomatch@4.0.3): fdir@6.5.0(picomatch@4.0.3):
optionalDependencies: optionalDependencies:
picomatch: 4.0.3 picomatch: 4.0.3
file-saver@2.0.5: {}
fsevents@2.3.3: fsevents@2.3.3:
optional: true optional: true
@@ -1352,7 +1679,7 @@ snapshots:
rfdc@1.4.1: {} rfdc@1.4.1: {}
rolldown-vite@7.2.5(@types/node@24.10.2)(jiti@2.6.1): rolldown-vite@7.2.5(@types/node@24.10.2)(esbuild@0.27.1)(jiti@2.6.1)(terser@5.44.1):
dependencies: dependencies:
'@oxc-project/runtime': 0.97.0 '@oxc-project/runtime': 0.97.0
fdir: 6.5.0(picomatch@4.0.3) fdir: 6.5.0(picomatch@4.0.3)
@@ -1363,8 +1690,10 @@ snapshots:
tinyglobby: 0.2.15 tinyglobby: 0.2.15
optionalDependencies: optionalDependencies:
'@types/node': 24.10.2 '@types/node': 24.10.2
esbuild: 0.27.1
fsevents: 2.3.3 fsevents: 2.3.3
jiti: 2.6.1 jiti: 2.6.1
terser: 5.44.1
rolldown@1.0.0-beta.50: rolldown@1.0.0-beta.50:
dependencies: dependencies:
@@ -1388,6 +1717,13 @@ snapshots:
source-map-js@1.2.1: {} source-map-js@1.2.1: {}
source-map-support@0.5.21:
dependencies:
buffer-from: 1.1.2
source-map: 0.6.1
source-map@0.6.1: {}
speakingurl@14.0.1: {} speakingurl@14.0.1: {}
superjson@2.2.6: superjson@2.2.6:
@@ -1400,6 +1736,13 @@ snapshots:
tapable@2.3.0: {} tapable@2.3.0: {}
terser@5.44.1:
dependencies:
'@jridgewell/source-map': 0.3.11
acorn: 8.15.0
commander: 2.20.3
source-map-support: 0.5.21
tinyglobby@0.2.15: tinyglobby@0.2.15:
dependencies: dependencies:
fdir: 6.5.0(picomatch@4.0.3) fdir: 6.5.0(picomatch@4.0.3)

View File

@@ -5,7 +5,26 @@ import path from 'node:path'
export default defineConfig({ export default defineConfig({
base: './', base: './',
build: { outDir: 'docs' }, build: {
outDir: 'docs',
sourcemap: false,
cssCodeSplit: true,
rollupOptions: {
output: {
manualChunks(id) {
if (id.includes('node_modules/vue')) return 'vendor-vue'
if (id.includes('node_modules/vue-router')) return 'vendor-vue'
if (id.includes('node_modules/pinia')) return 'vendor-vue'
if (id.includes('node_modules/reka-ui')) return 'vendor-ui'
if (id.includes('node_modules/@vueuse/core')) return 'vendor-ui'
}
}
},
},
plugins: [vue(), tailwindcss()], plugins: [vue(), tailwindcss()],
resolve: { alias: { '@': path.resolve(__dirname, './src') } } resolve: {
alias: {
'@': path.resolve(__dirname, './src'),
}
}
}) })