most-box 0.3.0 → 0.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (176) hide show
  1. package/README.md +45 -24
  2. package/electron/main.js +19 -2
  3. package/electron/preload.cjs +8 -0
  4. package/out/admin/index.html +0 -0
  5. package/out/app/index.html +0 -0
  6. package/out/assets/AccountMenu-BgbcUc0m.js +1 -0
  7. package/out/assets/AppTop-DZFTO9-m.js +1 -0
  8. package/out/assets/CopyButton-B03fpFFc.js +1 -0
  9. package/out/assets/FilePreviewOverlay-CA04_Ved.js +1 -0
  10. package/out/assets/MarketingHeader-BVJy8hXd.js +1 -0
  11. package/out/assets/MarketingLayout-Cltu-DRw.js +1 -0
  12. package/out/assets/{MilkdownEditor-BTq9bDAf.js → MilkdownEditor-Dw_ze7EE.js} +92 -92
  13. package/out/assets/OpenSidebarButton-C2UJYXKh.js +1 -0
  14. package/out/assets/arrow-right-CXzRt0Fp.js +1 -0
  15. package/out/assets/chatJoinInvite-BcPz_IV5.js +1 -0
  16. package/out/assets/chatNoteDraft-CYbvcEvC.js +1 -0
  17. package/out/assets/check-iBCQl0yr.js +1 -0
  18. package/out/assets/circle-alert-dfN4T6Nq.js +1 -0
  19. package/out/assets/cobol-DHLQUbN7.js +1 -0
  20. package/out/assets/copy-B7pPZ2MP.js +1 -0
  21. package/out/assets/{dist-DCX0ws1K.js → dist-1jNICPWO.js} +1 -1
  22. package/out/assets/{dist-BAJKKN4w.js → dist-B3unnv5t.js} +1 -1
  23. package/out/assets/{dist-DJdv-Ma3.js → dist-B5MBMmGa.js} +1 -1
  24. package/out/assets/{dist-CMmmtl3f.js → dist-BAqJdUtV.js} +1 -1
  25. package/out/assets/{dist-C3lbe8SW.js → dist-BBJOmVU3.js} +1 -1
  26. package/out/assets/{dist-IN8WN7NI.js → dist-BV5CqsJD.js} +1 -1
  27. package/out/assets/{dist-DBnWo8ZP.js → dist-Ba7fxbV-.js} +1 -1
  28. package/out/assets/{dist-BzqqCPi2.js → dist-BxxtNKuo.js} +1 -1
  29. package/out/assets/{dist-DvWZsW-D.js → dist-C8Ue2rSs.js} +1 -1
  30. package/out/assets/{dist-C-Tg23jc.js → dist-CIn7Xx5U.js} +1 -1
  31. package/out/assets/{dist-CbTzBiwL.js → dist-CSyRxrry.js} +3 -3
  32. package/out/assets/{dist-DTL5jL08.js → dist-CZIuQqmV.js} +1 -1
  33. package/out/assets/{dist-8QDHqrPN.js → dist-CaaBTHCc.js} +1 -1
  34. package/out/assets/{dist-yZ96GF-e.js → dist-CgReC0ZE.js} +1 -1
  35. package/out/assets/{dist-D94V9Zlh.js → dist-Ct90qYA2.js} +1 -1
  36. package/out/assets/{dist-IGpXmkFm.js → dist-DIFFjNuO.js} +1 -1
  37. package/out/assets/{dist-CqQavSZV.js → dist-DUB2IhWu.js} +1 -1
  38. package/out/assets/{dist-B0JrbG7f.js → dist-DheA_Tyz.js} +1 -1
  39. package/out/assets/{dist-Br_5lLVO.js → dist-DyZh1ncm.js} +1 -1
  40. package/out/assets/{dist-BPs0Xns9.js → dist-E74uGTy3.js} +1 -1
  41. package/out/assets/{dist-BFSyuOuw.js → dist-K2s-Uj08.js} +1 -1
  42. package/out/assets/{dist-zyJb88Zz.js → dist-RU_cpjXQ.js} +1 -1
  43. package/out/assets/{dist-chOCTzB2.js → dist-eIeCvp_6.js} +1 -1
  44. package/out/assets/{dist-CfU9fwWz.js → dist-hEE2Ub__.js} +1 -1
  45. package/out/assets/download-COQOcPqI.js +1 -0
  46. package/out/assets/downloadValidation-Zvllo2SZ.js +1 -0
  47. package/out/assets/external-link-D6tHlYgS.js +1 -0
  48. package/out/assets/file-text-DiyIGL1I.js +1 -0
  49. package/out/assets/folder-DAcox9xz.js +1 -0
  50. package/out/assets/folder-open-Di0oALaC.js +1 -0
  51. package/out/assets/hard-drive-Cqa7Rstj.js +1 -0
  52. package/out/assets/index-B6acG3-t.css +1 -0
  53. package/out/assets/index-DjBN7bZV.js +31 -0
  54. package/out/assets/index.lazy-BUODxlbz.js +1 -0
  55. package/out/assets/index.lazy-Ba2rqd32.js +3 -0
  56. package/out/assets/index.lazy-Bdh8QUOx.js +1 -0
  57. package/out/assets/index.lazy-BfAHB94y.js +1 -0
  58. package/out/assets/index.lazy-Bo0LfJNK.js +2 -0
  59. package/out/assets/index.lazy-C9-w4fAF.js +3 -0
  60. package/out/assets/index.lazy-CNQbNKyf.js +1 -0
  61. package/out/assets/index.lazy-Cd0znkpY.js +1 -0
  62. package/out/assets/index.lazy-CtUrBLS0.js +1 -0
  63. package/out/assets/index.lazy-CyNgk0ta.js +1 -0
  64. package/out/assets/index.lazy-D3HxQTg_.js +1 -0
  65. package/out/assets/index.lazy-DSsE3iyf.js +1 -0
  66. package/out/assets/index.lazy-DWXndrGa.js +1 -0
  67. package/out/assets/index.lazy-Dk7cmQ-j.js +2 -0
  68. package/out/assets/key-round-JR8M3aHl.js +1 -0
  69. package/out/assets/loader-CwyHYZdX.js +1 -0
  70. package/out/assets/lock-CuwwlXlx.js +1 -0
  71. package/out/assets/message-square-BgsNXPft.js +1 -0
  72. package/out/assets/mp-Dv12gDTx.js +1 -0
  73. package/out/assets/music-Dn9nm9Qb.js +1 -0
  74. package/out/assets/notebook-pen-SWT-zZ4v.js +1 -0
  75. package/out/assets/play-CvWKSMwY.js +1 -0
  76. package/out/assets/refresh-cw-D4BsHvhi.js +1 -0
  77. package/out/assets/save-B02sbO9Y.js +1 -0
  78. package/out/assets/scheme-tChLYBuY.js +1 -0
  79. package/out/assets/search-HW4oPOBP.js +1 -0
  80. package/out/assets/send-4dhnJGuS.js +1 -0
  81. package/out/assets/shield-check-Boae7Nc6.js +1 -0
  82. package/out/assets/smartphone-JXH-zQXB.js +1 -0
  83. package/out/assets/textile-CyzeGT9J.js +1 -0
  84. package/out/assets/trash-2-BLwoM0ME.js +1 -0
  85. package/out/assets/triangle-alert-B9sMiA9l.js +1 -0
  86. package/out/assets/upload-DVuXJt_o.js +1 -0
  87. package/out/assets/useAppStore-DOnk608w.js +4 -0
  88. package/out/assets/{useChannelMessages-DOaWHdAP.js → useChannelMessages-CDvw-f_x.js} +1 -1
  89. package/out/assets/useGameRoom-B1_r6bc7.js +1 -0
  90. package/out/assets/userProfile-BZvkCuet.js +1 -0
  91. package/out/assets/wallet-D9Iw4YWE.js +1 -0
  92. package/out/assets/wifi-ljEI_ySA.js +1 -0
  93. package/out/chat/index.html +0 -0
  94. package/out/chat/join/demo/index.html +0 -0
  95. package/out/chat/join/index.html +0 -0
  96. package/out/download/index.html +2 -2
  97. package/out/game/gandengyan/index.html +0 -0
  98. package/out/game/index.html +0 -0
  99. package/out/game/zhajinhua/index.html +0 -0
  100. package/out/index.html +2 -2
  101. package/out/note/index.html +0 -0
  102. package/out/ping/index.html +2 -2
  103. package/out/profile/index.html +0 -0
  104. package/out/web3/index.html +0 -0
  105. package/package.json +28 -28
  106. package/server/index.js +3 -0
  107. package/server/src/config.js +0 -1
  108. package/server/src/core/gameRoom.js +12 -19
  109. package/server/src/http/app.js +2 -0
  110. package/server/src/http/routePolicy.js +1 -0
  111. package/server/src/http/routes/noteVaultRoutes.js +155 -0
  112. package/server/src/index.js +9 -0
  113. package/server/src/utils/accountBackup.js +8 -0
  114. package/server/src/utils/api.js +0 -14
  115. package/server/src/utils/auth.js +0 -7
  116. package/server/src/utils/avatar.js +6 -6
  117. package/server/src/utils/noteVault.js +522 -0
  118. package/electron/preload.js +0 -6
  119. package/out/assets/FilePreviewOverlay-CM5IqnZD.js +0 -1
  120. package/out/assets/LanguageToggle-CSQtRZ3A.js +0 -1
  121. package/out/assets/MarketingHeader-B45AaM29.js +0 -1
  122. package/out/assets/MarketingLayout-A00pEOa2.js +0 -1
  123. package/out/assets/MarketingThemeToggle-CIKP8x9W.js +0 -1
  124. package/out/assets/OpenSidebarButton-D8qfUGzU.js +0 -1
  125. package/out/assets/SidebarAccount-_RBE5K_o.js +0 -1
  126. package/out/assets/SidebarHomeLink-qMFEGjZt.js +0 -1
  127. package/out/assets/arrow-right-BU9c_SL4.js +0 -1
  128. package/out/assets/circle-alert-iuHzciph.js +0 -1
  129. package/out/assets/cobol-B_OZ4V-R.js +0 -1
  130. package/out/assets/copy-DEzFUzeX.js +0 -1
  131. package/out/assets/download-jEPn2njL.js +0 -1
  132. package/out/assets/downloadValidation-CSXwoQKW.js +0 -1
  133. package/out/assets/external-link-BFaoZeK0.js +0 -1
  134. package/out/assets/file-text-DPA1riJ_.js +0 -1
  135. package/out/assets/folder-Cfgc70_F.js +0 -1
  136. package/out/assets/hard-drive-Dar_AZEq.js +0 -1
  137. package/out/assets/i18n-NjvOSuV6.js +0 -1
  138. package/out/assets/index-BHZhApbo.css +0 -1
  139. package/out/assets/index-C-_ZwxuN.js +0 -31
  140. package/out/assets/index.lazy-0YYV0CR3.js +0 -1
  141. package/out/assets/index.lazy-BTYGr9Vb.js +0 -1
  142. package/out/assets/index.lazy-BVAtQtTa.js +0 -3
  143. package/out/assets/index.lazy-BbdLA2L-.js +0 -1
  144. package/out/assets/index.lazy-CbiLtziY.js +0 -1
  145. package/out/assets/index.lazy-CcEdBg3i.js +0 -2
  146. package/out/assets/index.lazy-CePHsLXG.js +0 -1
  147. package/out/assets/index.lazy-DG_3_VdF.js +0 -1
  148. package/out/assets/index.lazy-DR0rWEWZ.js +0 -2
  149. package/out/assets/index.lazy-DSyTSCJD.js +0 -1
  150. package/out/assets/index.lazy-DUhsuPLv.js +0 -1
  151. package/out/assets/index.lazy-DVnhWbzH.js +0 -1
  152. package/out/assets/index.lazy-DZpkg1DJ.js +0 -1
  153. package/out/assets/key-round-DNcpSuMw.js +0 -1
  154. package/out/assets/loader-BXQtdens.js +0 -1
  155. package/out/assets/lock-CLIE8cct.js +0 -1
  156. package/out/assets/message-square-Dp09WY1I.js +0 -1
  157. package/out/assets/mp-B6kdA94c.js +0 -1
  158. package/out/assets/music-B19Tg557.js +0 -1
  159. package/out/assets/notebook-pen-C8TlK5sB.js +0 -1
  160. package/out/assets/play-B-BjsTZz.js +0 -1
  161. package/out/assets/plus-4hygj-1Z.js +0 -1
  162. package/out/assets/save-BjrbPwhJ.js +0 -1
  163. package/out/assets/scheme-CyDdOh7e.js +0 -1
  164. package/out/assets/search-DSkiWdvX.js +0 -1
  165. package/out/assets/send-BL4d5iOt.js +0 -1
  166. package/out/assets/shield-check-DzDuWO8r.js +0 -1
  167. package/out/assets/smartphone-tRRFFO0a.js +0 -1
  168. package/out/assets/textile-DWBqthVk.js +0 -1
  169. package/out/assets/trash-2-V12tJ8lI.js +0 -1
  170. package/out/assets/triangle-alert-DGWc8ZHu.js +0 -1
  171. package/out/assets/ui-BpDGD3IR.js +0 -4
  172. package/out/assets/upload-CoCptKya.js +0 -1
  173. package/out/assets/useGameRoom-hHkV65ii.js +0 -1
  174. package/out/assets/userProfile-DwZip0Dt.js +0 -1
  175. package/out/assets/wallet-T7ONZ3Kg.js +0 -1
  176. package/out/assets/wifi-Bgo8eHY0.js +0 -1
package/README.md CHANGED
@@ -1,26 +1,29 @@
1
- # MostBox:你的数字魔盒
1
+ # MostBox:聊天优先的 P2P 工具箱
2
2
 
3
3
  [![npm version](https://img.shields.io/npm/v/most-box)](https://npmjs.com/package/most-box)
4
4
  [![Node.js version](https://img.shields.io/badge/node-%3E%3D22.12-brightgreen)](https://nodejs.org)
5
5
  [![License](https://img.shields.io/badge/license-MIT-blue)](LICENSE)
6
6
 
7
- > P2P 文件分享应用。基于 Hyperswarm/Hyperdrive 的去中心化文件分发。
7
+ > 用户之间直接连接的 P2P 工具箱。
8
+ > 从聊天开始,直连传文件,把重要内容整理成知识库。
9
+ >
10
+ > Channel 承载消息、文件附件和知识库入口。文件分享仍使用 `most://` 链接、CID 校验和下载后做种;游戏和 Web3 工具箱保留独立能力,但暂不进入聊天详情主流程。
8
11
  >
9
12
  > CID 是 MostBox 的文件身份:发布、做种、发现、下载和校验都围绕 CID 进行。文件名和目录只用于展示与本地保存路径,不作为内容是否存在或是否可信的依据。
10
13
 
11
14
  ## 为什么用 MostBox?
12
15
 
13
- | 特性 | MostBox | 微信/QQ | 网盘 |
14
- | ------------------- | ------- | ------- | ---- |
15
- | 🔒 无需云端账号 | ✅ | | |
16
- | 🚀 P2P直连,不限速 | ✅ | | 限流 |
17
- | 💾 去中心化存储 | ✅ | | |
18
- | 🌐 开源免费,自托管 | | | |
19
- | 📦 大文件分享 | ✅ | | 限流 |
16
+ | 入口 | 用户理解 | 协议边界 |
17
+ | ---- | -------- | -------- |
18
+ | 聊天 | 先创建聊天或房间,分享房间 ID 给朋友 | Channel + WebSocket + Corestore/Hypercore |
19
+ | 附件 | 在聊天里直接传文件 | `most://` + CID 校验 + 下载后做种 |
20
+ | 知识库 | 把重要消息和想法沉淀成 Markdown | `/note/` 保留现有本地笔记库能力 |
21
+ | 游戏 | 独立游戏页面保留 | `game.*` channel 事件,不新增独立后端协议 |
22
+ | Web3 | 密钥、钱包和地址工具 | 独立工具箱,不是聊天或文件分享前置条件 |
20
23
 
21
24
  ## 演示
22
25
 
23
- 在线 Web 入口:[Most.Box](https://Most.Box)
26
+ 在线 Web 入口:[MostBox](https://Most.Box)
24
27
 
25
28
  > Web 入口只负责连接已有 MostBox 节点;要在本机发布、下载、校验和持续做种,优先使用桌面客户端,或在本机运行 `npx most-box@latest` 启动完整节点。
26
29
 
@@ -28,13 +31,21 @@
28
31
 
29
32
  ### 方式一:桌面客户端(推荐)
30
33
 
31
- 前往 [Most.Box 下载页](https://Most.Box/download) 下载客户端,支持 Windows、macOS 和 Linux。桌面端内置本地 MostBox 节点,提供完整 P2P 文件分享、下载校验和持续做种能力,无需单独安装 Node.js。
34
+ 前往 [MostBox 下载页](https://Most.Box/download) 下载客户端,支持 Windows、macOS 和 Linux。桌面端内置本地 MostBox 节点,提供完整 P2P 文件分享、下载校验和持续做种能力,无需单独安装 Node.js。
32
35
 
33
36
  ### 移动端 App 计划
34
37
 
35
- 移动端优先按 Android 前台完整种子 MVP 推进,参考 Keet/Pear 的“P2P 核心端 + 平台 UI 壳”分层:手机端先验证自己能发布、下载、校验并在前台继续做种,再扩展后台能力、iOS 和商店分发。详细范围见 [docs/mobile-android-plan.md](docs/mobile-android-plan.md)。
38
+ 移动端优先按 Android 聊天优先完整种子 MVP 推进,参考 Keet/Pear 的“P2P 核心端 + 平台 UI 壳”分层:手机端先验证自己能加入聊天、收发消息、用 `most://` 附件传文件、下载校验并在前台继续做种,再扩展后台能力、iOS 和商店分发。详细范围见 [docs/mobile-android-plan.md](docs/mobile-android-plan.md)。
39
+
40
+ Android 工程入口以 `mobile/android/` 子包为准,仓库根目录不提供 `android:start`、`android:test` 或 `android:build` 包装脚本。本地开发、测试和打包命令统一在子包目录执行:
36
41
 
37
- Android 工程入口在 `mobile/android/`。本地开发可运行 `npm run android` 启动 Expo Dev Client 并打开 Android 真机/模拟器;首次安装开发版或原生依赖变更后运行 `npm run android:build`。
42
+ ```bash
43
+ cd mobile/android
44
+ npm install
45
+ npm start # 启动 Expo Dev Client 并打开 Android 真机/模拟器
46
+ npm test # 运行移动端 CID、most://、Channel 和 Bare Worklet IPC 测试
47
+ npm run build # 生成内部 Alpha APK 和 SHA256 校验文件
48
+ ```
38
49
 
39
50
  ### 方式二:npm 包
40
51
 
@@ -46,7 +57,7 @@ npx most-box@latest
46
57
 
47
58
  > 使用 `@latest` 确保每次运行最新版本。
48
59
 
49
- 浏览器自动访问 **http://localhost:1976**
60
+ 启动后在浏览器打开 **http://localhost:1976**
50
61
 
51
62
  ## 需求
52
63
 
@@ -58,7 +69,7 @@ npx most-box@latest
58
69
  ## 开发
59
70
 
60
71
  ```bash
61
- git clone <your-repo-url>
72
+ git clone https://github.com/most-people/most.git
62
73
  cd most
63
74
  npm i
64
75
  npm run dev
@@ -72,27 +83,32 @@ node server/index.js
72
83
  前端源码集中在 `src/`:
73
84
 
74
85
  - `src/routes/`:TanStack Router file-based routes。`index.tsx` 保留路由关键配置,`index.lazy.tsx` 加载页面组件。
75
- - `src/features/`:页面和业务实现,例如文件分享、聊天、笔记、管理台、游戏和 Web3 工具箱。
86
+ - `src/features/`:页面和业务实现,例如文件分享、聊天、知识库、管理台、游戏和 Web3 工具箱。
76
87
  - `src/components/`:跨功能共享 UI。
77
88
  - `src/hooks/`、`src/lib/`、`src/stores/`、`src/styles/`:共享 hooks、工具、状态和样式。
78
89
  - `src/lib/i18n/messages/*.ts`:按域拆分的中英文文案 catalog,由 `src/lib/i18n/messages.ts` 聚合。
79
90
  - `server/`:daemon、HTTP API、P2P 引擎和协议测试。
91
+ - `mobile/android/`:聊天优先 Android Alpha 应用和 Bare Worklet P2P 核心。
80
92
 
81
93
  ## 测试
82
94
 
83
95
  ```bash
84
- npm test # 运行全部测试
85
- npm run test:unit # 只运行单元测试
96
+ npm test # 运行全部后端测试
97
+ npm run test:unit # 只运行后端单元测试
98
+ npm run test:protocol # 运行 CID / 发布 / 下载 / P2P 接力协议回归
99
+
100
+ cd mobile/android
101
+ npm test # 运行 Android 子包协议、Channel 和 IPC 测试
86
102
  ```
87
103
 
88
104
  ## 访问场景
89
105
 
90
- | 场景 | 方式 | 访问地址 |
91
- | ---------- | ------------------------------------- | --------------------------- |
92
- | 本地 | 桌面客户端或 `npx most-box@latest` | `http://localhost:1976` |
93
- | 局域网/NAS | 监听 `0.0.0.0`,仅信任家庭局域网 | `http://NAS-IP:1976` |
94
- | 远程管理 | SSH 隧道 + `/admin/` | `http://localhost:1976` |
95
- | 外网 | Caddy 反向代理 | `https://your-domain` |
106
+ | 场景 | 方式 | 访问地址 |
107
+ | ---------- | ---------------------------------- | ----------------------- |
108
+ | 本地 | 桌面客户端或 `npx most-box@latest` | `http://localhost:1976` |
109
+ | 局域网/NAS | 监听 `0.0.0.0`,仅信任家庭局域网 | `http://NAS-IP:1976` |
110
+ | 远程管理 | SSH 隧道 + `/admin/` | `http://localhost:1976` |
111
+ | 外网 | Caddy 反向代理 | `https://your-domain` |
96
112
 
97
113
  ### 飞牛 OS / NAS 局域网部署
98
114
 
@@ -222,6 +238,10 @@ mostbox.example.com {
222
238
 
223
239
  这里的登录是本地身份,不是云端账号注册。MostBox 用它隔离同一节点上的不同用户文件列表,并为本地 HTTP API 请求生成短期签名;知道 `most://` 链接的人仍然可以尝试下载对应 CID 内容。
224
240
 
241
+ ### 知识库云备份和文件分享是什么关系?
242
+
243
+ 知识库、笔记和账号备份属于独立工具箱能力;云备份只覆盖对应工具箱数据,不会把 MostBox 发布的文件上传成云盘,也不参与 `most://` 文件下载、CID 校验或做种传播闭环。
244
+
225
245
  ### 支持大文件吗?
226
246
 
227
247
  支持。目前默认单文件上限为 **10GB**,可在本地节点策略中调整;传输采用流式处理,内存占用低。
@@ -263,6 +283,7 @@ npx most-box@latest
263
283
  - **后端**: Hono + @hono/node-server + WebSocket
264
284
  - **P2P**: Hyperswarm 4.x, Hyperdrive 13.x, Corestore 7.x
265
285
  - **桌面**: Electron 42, electron-builder
286
+ - **移动端**: Expo 56, React Native 0.85, react-native-bare-kit / Bare Worklet
266
287
  - **测试**: Node.js built-in test runner
267
288
 
268
289
  ## CI/CD
package/electron/main.js CHANGED
@@ -1,6 +1,7 @@
1
1
  import {
2
2
  app,
3
3
  BrowserWindow,
4
+ ipcMain,
4
5
  Menu,
5
6
  Tray,
6
7
  dialog,
@@ -84,7 +85,7 @@ function getLocalAppUrl(routePath = '/') {
84
85
  }
85
86
 
86
87
  function getInitialWindowUrl() {
87
- const initialUrl = pendingDeepLinkUrl || getLocalAppUrl('/')
88
+ const initialUrl = pendingDeepLinkUrl || getLocalAppUrl('/chat/')
88
89
  pendingDeepLinkUrl = ''
89
90
  return initialUrl
90
91
  }
@@ -144,6 +145,21 @@ function createTray() {
144
145
  tray.on('double-click', showMainWindow)
145
146
  }
146
147
 
148
+ function registerNoteVaultIpc() {
149
+ ipcMain.handle('note-vault:select-directory', async () => {
150
+ const result = await dialog.showOpenDialog(mainWindow, {
151
+ title: '选择 Markdown 笔记库',
152
+ properties: ['openDirectory', 'createDirectory'],
153
+ })
154
+
155
+ if (result.canceled || result.filePaths.length === 0) {
156
+ return null
157
+ }
158
+
159
+ return result.filePaths[0]
160
+ })
161
+ }
162
+
147
163
  function createWindow() {
148
164
  const iconPath = getIconPath()
149
165
 
@@ -158,7 +174,7 @@ function createWindow() {
158
174
  webPreferences: {
159
175
  nodeIntegration: false,
160
176
  contextIsolation: true,
161
- preload: path.join(__dirname, 'preload.js'),
177
+ preload: path.join(__dirname, 'preload.cjs'),
162
178
  },
163
179
  })
164
180
 
@@ -273,6 +289,7 @@ if (!gotSingleInstanceLock) {
273
289
  app.whenReady().then(async () => {
274
290
  try {
275
291
  await startServer()
292
+ registerNoteVaultIpc()
276
293
  createWindow()
277
294
  createTray()
278
295
  Menu.setApplicationMenu(null)
@@ -0,0 +1,8 @@
1
+ const { contextBridge, ipcRenderer } = require('electron')
2
+
3
+ contextBridge.exposeInMainWorld('electronAPI', {
4
+ platform: process.platform,
5
+ isElectron: true,
6
+ selectNoteVaultDirectory: () =>
7
+ ipcRenderer.invoke('note-vault:select-directory'),
8
+ })
Binary file
Binary file
@@ -0,0 +1 @@
1
+ import{t as e}from"./jsx-runtime-Bt-cYkS5.js";import{B as t,E as n,W as r,t as i}from"./useAppStore-DOnk608w.js";import{t as a}from"./check-iBCQl0yr.js";import{A as o,M as s,f as c,g as l,j as u}from"./index-DjBN7bZV.js";var d=t(`languages`,[[`path`,{d:`m5 8 6 6`,key:`1wu5hv`}],[`path`,{d:`m4 14 6-6 2-3`,key:`1k1g8d`}],[`path`,{d:`M2 5h12`,key:`or177f`}],[`path`,{d:`M7 2h1`,key:`1t2jsx`}],[`path`,{d:`m22 22-5-10-5 10`,key:`don7ne`}],[`path`,{d:`M14 18h6`,key:`1m8k6r`}]]),f=t(`moon`,[[`path`,{d:`M20.985 12.486a9 9 0 1 1-9.473-9.472c.405-.022.617.46.402.803a6 6 0 0 0 8.268 8.268c.344-.215.825-.004.803.401`,key:`kfwtm`}]]),p=t(`sun`,[[`circle`,{cx:`12`,cy:`12`,r:`4`,key:`4exip2`}],[`path`,{d:`M12 2v2`,key:`tus03m`}],[`path`,{d:`M12 20v2`,key:`1lh1kg`}],[`path`,{d:`m4.93 4.93 1.41 1.41`,key:`149t6j`}],[`path`,{d:`m17.66 17.66 1.41 1.41`,key:`ptbguv`}],[`path`,{d:`M2 12h2`,key:`1t8f8n`}],[`path`,{d:`M20 12h2`,key:`1q8mjw`}],[`path`,{d:`m6.34 17.66-1.41 1.41`,key:`1m8zz5`}],[`path`,{d:`m19.07 4.93-1.41 1.41`,key:`1shlcs`}]]),m=t(`user`,[[`path`,{d:`M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2`,key:`975kel`}],[`circle`,{cx:`12`,cy:`7`,r:`4`,key:`17ys0d`}]]),h=e();function g(){let{locale:e,setLocale:t,t:n}=o(),r=n(`common.locale.choose`);return(0,h.jsx)(l,{ariaLabel:r,className:`language-toggle`,items:u.map(n=>({key:n,label:s[n],icon:n===e?(0,h.jsx)(a,{size:16}):(0,h.jsx)(`span`,{className:`language-toggle-placeholder`,"aria-hidden":`true`}),onSelect:()=>{n!==e&&t(n)}})),renderTrigger:e=>(0,h.jsx)(`button`,{...e,className:`header-tool-btn`,title:r,"aria-label":r,children:(0,h.jsx)(d,{size:16})})})}function _(){let{t:e}=o(),t=i(e=>e.isDarkMode),n=i(e=>e.setIsDarkMode),r=e(`common.theme.toggle`);return(0,h.jsx)(`button`,{type:`button`,className:`header-tool-btn`,title:r,"aria-label":r,"aria-pressed":t,onClick:()=>n(!t),children:t?(0,h.jsx)(p,{size:16}):(0,h.jsx)(f,{size:16})})}function v(){let{t:e}=o(),t=n(e=>e.identity),i=c(t?.address,t?.avatar),a=e(`nav.profile`);return(0,h.jsx)(r,{to:`/profile/`,className:`account-profile-link`,title:a,"aria-label":a,children:t?(0,h.jsx)(`img`,{className:`account-profile-link-avatar`,src:i,alt:``,"aria-hidden":`true`}):(0,h.jsx)(m,{size:18})})}export{m as i,_ as n,g as r,v as t};
@@ -0,0 +1 @@
1
+ import{n as e,o as t,t as n}from"./jsx-runtime-Bt-cYkS5.js";import{B as r,W as i}from"./useAppStore-DOnk608w.js";import{n as a,r as o,t as s}from"./AccountMenu-BgbcUc0m.js";import{A as c,E as l}from"./index-DjBN7bZV.js";var u=r(`menu`,[[`path`,{d:`M4 5h16`,key:`1tepv9`}],[`path`,{d:`M4 12h16`,key:`1lakjw`}],[`path`,{d:`M4 19h16`,key:`1djgab`}]]),d=t(e(),1);function f(e,t){return typeof t==`boolean`?t:typeof window<`u`&&`matchMedia`in window?window.matchMedia(e).matches:!1}function p(e,t,{getInitialValueInEffect:n}={getInitialValueInEffect:!0}){let[r,i]=(0,d.useState)(n?t:f(e));return(0,d.useEffect)(()=>{try{if(`matchMedia`in window){let t=window.matchMedia(e);i(t.matches);let n=e=>i(e.matches);return t.addEventListener(`change`,n),()=>{t.removeEventListener(`change`,n)}}}catch{return}},[e]),r||!1}function m(e=!1,t={}){let[n,r]=(0,d.useState)(e),i=(0,d.useCallback)(()=>{r(e=>e||(t.onOpen?.(),!0))},[t.onOpen]),a=(0,d.useCallback)(()=>{r(e=>e&&(t.onClose?.(),!1))},[t.onClose]);return[n,{open:i,close:a,toggle:(0,d.useCallback)(()=>{n?a():i()},[a,i,n]),set:r}]}var h=n(),g=(0,d.createContext)(null);function _(){let e=(0,d.useContext)(g);if(!e)throw Error(`useAppShell must be used within AppShell`);return e}function v({sidebar:e,className:t=``,headerTitle:n,headerRight:r,sidebarToggleReplacement:i,defaultHide:l=!1,hideAccountMenu:f=!1,children:_}){let[v,y]=m(!1),[b,x]=(0,d.useState)(l),S=(0,d.useRef)(l),C=p(`(max-width: 768px)`),{t:w}=c(),T=(0,d.useCallback)((e={})=>{y.close(),e.collapse&&x(!0)},[y]);(0,d.useEffect)(()=>{l!==S.current&&(l?T({collapse:!0}):x(!1),S.current=l)},[l,T]);let E=()=>{C?y.toggle():x(!b)},D=()=>{C?y.open():x(!1)},O=C?v:!b;return(0,h.jsx)(g.Provider,{value:{closeSidebar:T,openSidebar:D,isSidebarVisible:O},children:(0,h.jsxs)(`div`,{className:[`app-layout`,t].filter(Boolean).join(` `),children:[(0,h.jsx)(`div`,{className:`sidebar-overlay ${v?`visible`:``}`,onClick:()=>T()}),(0,h.jsx)(`div`,{className:`sidebar ${v?`open`:``} ${b?`collapsed`:``}`,children:e({closeSidebar:T,openSidebar:D})}),(0,h.jsxs)(`div`,{className:`main-content`,children:[(0,h.jsxs)(`header`,{className:`app-header`,children:[(0,h.jsxs)(`div`,{className:`header-left`,children:[i??(0,h.jsx)(`button`,{onClick:E,className:`btn btn-icon sidebar-toggle-btn`,"aria-label":w(C?`appShell.openMenu`:b?`appShell.expandSidebar`:`appShell.collapseSidebar`),children:(0,h.jsx)(u,{size:16})}),n]}),(0,h.jsxs)(`div`,{className:`header-right`,children:[r,(0,h.jsx)(a,{}),(0,h.jsx)(o,{}),!f&&(0,h.jsx)(s,{})]})]}),_]})]})})}function y({onNavigate:e}){let{t}=c(),n=t(`common.brand`);return(0,h.jsxs)(i,{to:`/`,className:`sidebar-header sidebar-header-link`,onClick:e,"aria-label":n,title:n,children:[(0,h.jsx)(l,{size:18}),(0,h.jsx)(`h1`,{children:n})]})}export{m as i,v as n,_ as r,y as t};
@@ -0,0 +1 @@
1
+ import{n as e,o as t,t as n}from"./jsx-runtime-Bt-cYkS5.js";import{t as r}from"./check-iBCQl0yr.js";import{t as i}from"./copy-B7pPZ2MP.js";import{A as a}from"./index-DjBN7bZV.js";var o=t(e(),1),s=n();function c({text:e,label:t,copiedLabel:n,className:c=`btn btn-icon`,iconSize:l=14}){let{t:u}=a(),[d,f]=(0,o.useState)(!1),p=n||u(`common.copied`),m=t||u(`common.copy`);async function h(){try{await navigator.clipboard.writeText(e),f(!0),setTimeout(()=>f(!1),1500)}catch{}}return(0,s.jsxs)(`button`,{type:`button`,className:c,onClick:h,title:d?p:m,children:[d?(0,s.jsx)(r,{size:l}):(0,s.jsx)(i,{size:l}),t?d?p:t:null]})}export{c as t};
@@ -0,0 +1 @@
1
+ import{n as e,o as t,t as n}from"./jsx-runtime-Bt-cYkS5.js";import{B as r,c as i}from"./useAppStore-DOnk608w.js";import{t as a}from"./file-text-DiyIGL1I.js";import{t as o}from"./loader-CwyHYZdX.js";import{t as s}from"./music-Dn9nm9Qb.js";import{A as c,S as l}from"./index-DjBN7bZV.js";var u=r(`pen`,[[`path`,{d:`M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z`,key:`1a8usu`}]]),d=r(`film`,[[`rect`,{width:`18`,height:`18`,x:`3`,y:`3`,rx:`2`,key:`afitv7`}],[`path`,{d:`M7 3v18`,key:`bbkbws`}],[`path`,{d:`M3 7.5h4`,key:`zfgn84`}],[`path`,{d:`M3 12h18`,key:`1i2n21`}],[`path`,{d:`M3 16.5h4`,key:`1230mu`}],[`path`,{d:`M17 3v18`,key:`in4fa5`}],[`path`,{d:`M17 7.5h4`,key:`myr1c1`}],[`path`,{d:`M17 16.5h4`,key:`go4c1d`}]]),f=r(`image`,[[`rect`,{width:`18`,height:`18`,x:`3`,y:`3`,rx:`2`,ry:`2`,key:`1m3agn`}],[`circle`,{cx:`9`,cy:`9`,r:`2`,key:`af1f0g`}],[`path`,{d:`m21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21`,key:`1xmnt7`}]]);function p(e){let t=String(e||``).split(`.`).pop()?.toLowerCase()||``,n=[`jpg`,`jpeg`,`png`,`gif`,`webp`,`svg`,`bmp`,`ico`,`tiff`,`heic`,`heif`],r=[`mp4`,`webm`,`mov`,`avi`,`mkv`,`flv`,`wmv`,`m4v`,`mpeg`,`3gp`],i=[`mp3`,`wav`,`ogg`,`flac`,`aac`,`m4a`,`wma`,`opus`],a=`txt.md.js.ts.jsx.tsx.css.scss.less.json.xml.html.htm.yaml.yml.toml.ini.cfg.conf.log.sh.bash.py.rb.go.rs.java.c.cpp.h.hpp.cs.php.sql.graphql.env.gitignore.dockerfile.readme`.split(`.`);return n.includes(t)?`image`:r.includes(t)?`video`:i.includes(t)?`audio`:a.includes(t)?`text`:`file`}var m=t(e(),1),h=n();function g(e){return e===`image`||e===`video`||e===`audio`}function _({item:e,isBackendReady:t,getFileDownloadUrl:n,onClose:r}){let{t:u}=c(),[d,f]=(0,m.useState)(``),[p,_]=(0,m.useState)(!1),[v,y]=(0,m.useState)(``),[b,x]=(0,m.useState)(``);return(0,m.useEffect)(()=>{if(e.subtype!==`text`)return;let r=!1;if(f(``),x(``),!t){f(u(`preview.loadFailed`));return}return _(!0),(async()=>{try{let t=await fetch(n(e.cid),{headers:{...await i(`GET`,`/api/files/${e.cid}/download`),Range:`bytes=0-9999`}});if(!t.ok)throw Error(u(`preview.loadFailed`));let a=await t.text();r||f(a||u(`preview.emptyFile`))}catch{r||f(u(`preview.loadFailed`))}finally{r||_(!1)}})(),()=>{r=!0}},[n,t,e.cid,e.subtype]),(0,m.useEffect)(()=>{if(!g(e.subtype)){y(``);return}if(y(``),x(``),!t){x(u(`preview.loadFailed`));return}let r=``,a=!1;return(async()=>{try{let t=await fetch(n(e.cid),{headers:await i(`GET`,`/api/files/${e.cid}/download`)});if(!t.ok)throw Error(u(`preview.loadFailed`));let o=URL.createObjectURL(await t.blob());r=o,a||y(o)}catch{a||x(u(`preview.loadFailed`))}})(),()=>{a=!0,r&&URL.revokeObjectURL(r)}},[n,t,e.cid,e.subtype]),(0,h.jsxs)(`div`,{className:`preview-overlay`,onClick:r,children:[(0,h.jsx)(`button`,{type:`button`,className:`preview-close`,onClick:r,"aria-label":u(`preview.close`),children:(0,h.jsx)(l,{size:20})}),(0,h.jsxs)(`div`,{onClick:e=>e.stopPropagation(),children:[e.subtype===`image`&&(0,h.jsx)(`div`,{className:`preview-media-wrapper`,children:v?(0,h.jsx)(`img`,{src:v,alt:e.fileName,translate:`no`}):b?(0,h.jsxs)(`div`,{className:`preview-unsupported`,children:[(0,h.jsx)(a,{size:48,className:`preview-file-icon`}),(0,h.jsx)(`p`,{translate:`no`,children:e.fileName}),(0,h.jsx)(`p`,{className:`preview-unsupported-hint`,children:b})]}):(0,h.jsx)(`div`,{className:`preview-loading`,children:(0,h.jsx)(`div`,{className:`preview-loading-spinner`})})}),e.subtype===`video`&&(0,h.jsx)(`div`,{className:`preview-media-wrapper`,children:v?(0,h.jsx)(`video`,{src:v,controls:!0}):b?(0,h.jsxs)(`div`,{className:`preview-unsupported`,children:[(0,h.jsx)(a,{size:48,className:`preview-file-icon`}),(0,h.jsx)(`p`,{translate:`no`,children:e.fileName}),(0,h.jsx)(`p`,{className:`preview-unsupported-hint`,children:b})]}):(0,h.jsx)(`div`,{className:`preview-loading`,children:(0,h.jsx)(`div`,{className:`preview-loading-spinner`})})}),e.subtype===`audio`&&(0,h.jsxs)(`div`,{className:`preview-audio`,children:[(0,h.jsx)(`div`,{className:`preview-audio-icon`,children:(0,h.jsx)(s,{size:36,color:`var(--accent)`})}),(0,h.jsx)(`p`,{className:`preview-audio-filename`,translate:`no`,children:e.fileName}),v?(0,h.jsx)(`audio`,{className:`preview-audio-player`,src:v,controls:!0}):(0,h.jsx)(`div`,{className:`preview-text-loading`,children:b?(0,h.jsx)(`p`,{children:b}):(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)(o,{size:24,className:`preview-text-spinner`}),(0,h.jsx)(`p`,{children:u(`preview.audioLoading`)})]})})]}),e.subtype===`file`&&(0,h.jsxs)(`div`,{className:`preview-unsupported`,children:[(0,h.jsx)(a,{size:48,className:`preview-file-icon`}),(0,h.jsx)(`p`,{translate:`no`,children:e.fileName}),(0,h.jsx)(`p`,{className:`preview-unsupported-hint`,children:u(`preview.unsupported`)})]}),e.subtype===`text`&&(0,h.jsxs)(`div`,{className:`preview-text-container`,children:[(0,h.jsx)(`div`,{className:`preview-text-header`,children:(0,h.jsx)(`span`,{translate:`no`,children:e.fileName})}),p?(0,h.jsxs)(`div`,{className:`preview-text-loading`,children:[(0,h.jsx)(o,{size:24,className:`preview-text-spinner`}),(0,h.jsx)(`p`,{children:u(`preview.textLoading`)}),(0,h.jsx)(`p`,{className:`preview-text-loading-hint`,children:u(`preview.firstSyncHint`)})]}):(0,h.jsx)(`pre`,{className:`preview-text`,translate:`no`,children:d||u(`preview.emptyFile`)})]})]})]})}export{u as a,d as i,p as n,f as r,_ as t};
@@ -0,0 +1 @@
1
+ import{t as e}from"./jsx-runtime-Bt-cYkS5.js";import{n as t,r as n,t as r}from"./AccountMenu-BgbcUc0m.js";import{E as i,x as a}from"./index-DjBN7bZV.js";var o=e();function s(){return(0,o.jsx)(`nav`,{className:`mkt-nav`,children:(0,o.jsxs)(`div`,{className:`mkt-nav-inner`,children:[(0,o.jsxs)(`button`,{type:`button`,className:`mkt-nav-logo`,onClick:a(),children:[(0,o.jsx)(i,{size:18}),(0,o.jsx)(`span`,{children:`MOST PEOPLE`})]}),(0,o.jsxs)(`div`,{className:`mkt-nav-cta`,children:[(0,o.jsx)(t,{}),(0,o.jsx)(n,{}),(0,o.jsx)(r,{})]})]})})}export{s as t};
@@ -0,0 +1 @@
1
+ import{t as e}from"./jsx-runtime-Bt-cYkS5.js";import{W as t}from"./useAppStore-DOnk608w.js";import{t as n}from"./download-COQOcPqI.js";import{n as r,r as i,t as a}from"./AccountMenu-BgbcUc0m.js";import{A as o,b as s}from"./index-DjBN7bZV.js";import{t as c}from"./LogoIcon-B2fFe0l1.js";var l={name:`most-box`,version:`0.3.2`,description:`MostBox - chat-first P2P toolbox for files, notes, and game rooms`,type:`module`,main:`electron/main.js`,bin:{"most-box":`server/cli.js`},files:[`out`,`public`,`electron`,`server/src`,`server/index.js`,`server/cli.js`],scripts:{start:`vite`,server:`node --watch server/index.js`,desktop:`npm run electron:dev`,build:`vite build && node scripts/prepare-start-static.mjs`,preview:`vite preview`,serve:`npm run build && node server/index.js`,test:`node --test server/tests/**/*.test.js`,"test:unit":`node --test server/tests/unit/*.test.js`,"test:desktop":`node --test electron/*.test.js`,"test:frontend":`node --test src/tests/*.test.js`,"test:protocol":`node --test --test-name-pattern "extracts CID and filename|matches golden CID samples|publishes a file from Buffer|lists published files|pulls through local seed nodes" server/tests/unit/cid.test.js server/tests/integration/cid.test.js server/tests/integration/engine.test.js`,typecheck:`tsc -p tsconfig.typecheck.json`,"typecheck:strict-router":`tsc -p tsconfig.strict-router.json`,"check:static-output":`node scripts/check-static-output.mjs`,format:`npx prettier --write .`,lint:`npx eslint .`,"r2:cors":`node scripts/configure-r2-cors.mjs`,"electron:dev":`concurrently "npm run build" "wait-on out/index.html && electron ."`,"electron:rebuild":`electron-rebuild -f -w sodium-native`,"electron:build":`npm run build && npm run electron:rebuild && electron-builder`,"electron:build:win":`npm run build && npm run electron:rebuild && electron-builder --win`,"electron:build:win:x64":`npm run electron:build:win -- --x64`,"electron:build:win:arm64":`npm run electron:build:win -- --arm64`,"electron:build:mac":`npm run build && npm run electron:rebuild && electron-builder --mac`,"electron:build:linux":`npm run build && npm run electron:rebuild && electron-builder --linux`},keywords:[`p2p`,`chat`,`file-sharing`,`file-transfer`,`hyperswarm`,`hypercore`,`hyperdrive`],license:`MIT`,dependencies:{"@dicebear/core":`^10.3.0`,"@dicebear/styles":`^10.2.0`,"@hono/node-server":`^2.0.6`,"@tanstack/react-router":`^1.170.16`,"@tanstack/react-start":`^1.168.26`,b4a:`^1.8.1`,busboy:`^1.6.0`,corestore:`^7.11.0`,dayjs:`^1.11.21`,ethers:`^6.17.0`,eventemitter3:`^5.0.4`,hono:`^4.12.27`,hypercore:`^11.33.2`,hyperdrive:`^13.3.2`,hyperswarm:`^4.17.0`,"ipfs-unixfs-importer":`^17.0.1`,multiformats:`^14.0.2`,tweetnacl:`^1.0.3`,ws:`^8.21.0`},devDependencies:{"@electron/rebuild":`^4.0.4`,"@eslint/js":`^10.0.1`,"@iconify/react":`^6.0.2`,"@mantine/hooks":`^9.4.0`,"@milkdown/crepe":`^7.21.2`,"@milkdown/utils":`^7.21.2`,"@types/react":`^19.2.17`,"@vitejs/plugin-react":`^6.0.3`,concurrently:`^10.0.3`,electron:`^42.5.0`,"electron-builder":`^26.15.3`,esbuild:`^0.28.1`,eslint:`^10.5.0`,globals:`^17.7.0`,ky:`^2.0.2`,"lucide-react":`^1.21.0`,prettier:`^3.8.4`,"qrcode.react":`^4.2.0`,react:`^19.2.7`,"react-dom":`^19.2.7`,typescript:`6.0.3`,"typescript-eslint":`^8.62.0`,vite:`^8.1.0`,"wait-on":`^9.0.10`,zustand:`^5.0.14`},overrides:{"brace-expansion":`5.0.6`,postcss:`8.5.15`,ws:`$ws`},build:{appId:`com.mostbox.app`,productName:`MostBox`,publish:[{provider:`github`,releaseType:`release`}],directories:{output:`dist`},afterPack:`electron/afterPack.cjs`,files:[`out/**/*`,`electron/**/*`,`server/src/**/*`,`server/index.js`,`server/cli.js`,`package.json`,`!**/*.map`,`!electron/**/*.test.js`,`!server/tests/**/*`],asarUnpack:[`**/*.node`,`**/sodium-native/**`],protocols:[{name:`MostBox Link`,schemes:[`most`]}],win:{target:[`nsis`],artifactName:"${productName}-${version}-win-${arch}-setup.${ext}",icon:`public/logo.ico`},nsis:{oneClick:!1,allowToChangeInstallationDirectory:!0,createDesktopShortcut:!0,createStartMenuShortcut:!0,shortcutName:`MostBox`},mac:{artifactName:"${productName}-${version}-mac-${arch}.${ext}",target:[{target:`dmg`,arch:[`x64`,`arm64`]}],icon:`public/logo-512.png`,category:`public.app-category.utilities`},dmg:{contents:[{x:130,y:220},{x:410,y:220,type:`link`,path:`/Applications`}]},linux:{artifactName:"${productName}-${version}-linux-${arch}.${ext}",target:[{target:`AppImage`,arch:[`x64`,`arm64`]}],icon:`public/logo-512.png`,category:`Utility`}}},u=e(),d=[{to:`/`,labelKey:`footer.about`},{to:`/ping/`,labelKey:`footer.network`},{href:`https://github.com/most-people/most`,labelKey:null,label:`GitHub`,external:!0}],f=l.version;function p(){let{t:e}=o();return(0,u.jsx)(`footer`,{className:`mkt-footer`,children:(0,u.jsx)(`div`,{className:`mkt-container`,children:(0,u.jsxs)(`div`,{className:`mkt-footer-inner`,children:[(0,u.jsx)(`div`,{className:`mkt-footer-links`,children:d.map(n=>`external`in n?(0,u.jsx)(`a`,{href:n.href,target:`_blank`,rel:`noopener noreferrer`,children:n.label},n.href):(0,u.jsx)(t,{to:n.to,children:e(n.labelKey)},n.to))}),(0,u.jsxs)(`span`,{className:`mkt-footer-copy`,children:[`© `,new Date().getFullYear(),` MOST PEOPLE · MIT License`]}),(0,u.jsxs)(`span`,{className:`mkt-footer-build`,translate:`no`,children:[`v`,f]})]})})})}function m({children:e,header:t}){return(0,u.jsxs)(`div`,{className:`mkt-layout`,children:[t??(0,u.jsx)(h,{}),(0,u.jsx)(`main`,{className:`mkt-layout-main`,children:e}),(0,u.jsx)(p,{})]})}function h(){let{t:e}=o(),l=s();return(0,u.jsx)(`nav`,{className:`mkt-nav`,children:(0,u.jsxs)(`div`,{className:`mkt-nav-inner`,children:[(0,u.jsxs)(t,{to:`/`,className:`mkt-nav-logo`,children:[(0,u.jsx)(c,{}),`MOST PEOPLE`]}),(0,u.jsxs)(`div`,{className:`mkt-nav-cta`,children:[(0,u.jsx)(r,{}),(0,u.jsx)(i,{}),!l&&(0,u.jsxs)(t,{to:`/download/`,className:`btn btn-primary mkt-nav-preview`,children:[(0,u.jsx)(n,{size:16}),e(`nav.downloadClient`)]}),(0,u.jsx)(a,{})]})]})})}export{m as t};