Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ jobs:

- name: 校验依赖(仅允许内置 @rpath framework,禁止包外 dylib)
run: |
# 放宽后的核心戒律:dufs 死于运行时缺失的包外 dylib(/opt/homebrew。这里逐条核对——
# 放宽后的核心戒律:不依赖任何包外 dylib——运行时去包外路径(/opt/homebrew 等)找库会缺库。这里逐条核对——
# 系统库放行;@rpath 引用必须对应包内 Contents/Frameworks 里存在的 framework;
# 其余绝对路径包外 dylib 一律失败。build.sh 已做同样检查,这里在 CI 再设一道可见闸门。
BIN=dist/LocalShare.app/Contents/MacOS/LocalShare
Expand Down
20 changes: 12 additions & 8 deletions CLAUDE.md

Large diffs are not rendered by default.

34 changes: 33 additions & 1 deletion DESIGN.md
Original file line number Diff line number Diff line change
Expand Up @@ -192,11 +192,43 @@
- **在线访客设备名**:分享屏地址下方的在线行不再裸显人数(见 §5.2)——小绿点 + 「<设备名> 正在浏览」/「<设备名> 等 N 人正在浏览」(11.5 sans inkMute),查不到设备名回退「…IP 尾号」,`lineLimit(1)` 末端截断。
- **明文风险提示**(两处,克制灰字 inkMute + `lock.open` 图标):① 设置页「访问权限」区下一行;② 分享屏底部「连不上?」气泡末尾、隔离线下另起一行。措辞统一「同一网络下传输不加密 · 公共 Wi-Fi(咖啡馆 / 机场等)下同网的人可能看到内容,敏感文件别在这种网络分享」。**不进彩底警告框**——克制告知、不吓人。

### 6.7 传递文本:发 / 收(0.9)★

`Screen.text`,带返回二级页(头部 `← + 「传递文本」+ ⚙`,品牌名只留主页)。两条**独立单向通道**——发出去(Mac→手机)的 `sharedText` 与收回来(手机→Mac)的收件箱互不相通;一页一码、两端双向。

屏内区块(从上到下):

1. **二维码卡 / 空态**:服务运行且有码 → QRCard(172×172,内距 18,圆角 14)+ 说明(sans 13 semibold) + CopyPill(mono 13,§5.6) + 备用地址(mono 10);否则空态提示「发送一段文本,或开启接收,扫码即可」。
2. **发文本卡**(`surface` 圆角 16、内距 16、`line` 1px 描边):小节眼标「发送文本」(sans 11 bold,字距 0.8,inkMute) → `PlainTextEditor`(`field` 底圆角 12,**mono 13**,最小高 118,自绘 placeholder 兼容中文输入法,光标 accent) → `PrimaryBtn`「分享」(已分享后文案变「更新」,右侧可现「撤回」GhostBtn)。
3. **允许收文本行**(`surface` 圆角 14、内距 14):标题「允许收文本」+ 说明「对方扫码后可把一段文本发到这台 Mac」(sans 12.5 inkMute) + 右侧 Switch(§5.3)。**opt-in,默认关**。
4. **收件箱卡**(仅 `textInboxEnabled` 或已有收件时出现,`surface` 圆角 14):头行 = 状态圆点(accent) + 「收到的文本」(sans 11 bold) + 未读角标(Capsule,accent 底白字 sans 10 bold,「N 条新」)+「清空」;列表最多显 12 条、超出显条数。单行 = TextGlyph(26,accentSoft 底) + 来源设备名/IP(sans 11.5 semibold) ·收到时长(mono 10.5 inkFaint) + 文本预览(mono 11.5,≤3 行,可选中) + 复制(成功 ✓ 1.3s)/删除 ✕。
5. **停止传递**:`DangerBtn`「停止」,仅 `isRunning && (有文本 ‖ 收件开)` 时出现。

关键行为(务必守):

- **token = 会话维度**:更新文本(`setSharedText`)**不轮换 token**(否则把正在看的对端刷掉、还误伤共存的文件分享链接);只在换分享 / 停止 / 清除这些会话边界才轮换。
- **接收双上限挡内存**:单条 ≤ 64KB(事后 413)+ 收件箱 ≤ 100 条挤旧。**仅应用内提醒**(未读角标 / 「新收到」卡片),不发系统通知。
- **接收呼吸点**:「传递文本」入口与运行态用 `PulsingDot`(size 6,缓慢淡入淡出,发或收都亮)区别于静态未读。
- **停止 `stopTextTransfer`**:撤文本 + 清草稿 + 关接收 + 删持久化(不在磁盘留口令)+ 停服务(轮换 token 作废链接)+ 回主页。
- **持久化两开关各默认关**(「记住分享的文本」/「记住收到的文本」,语义不同:发的是自己粘的、收的是他人投递的)。开「记住分享」只回填草稿、**不自动广播**。
- 网页端:发文本页纯文本转义显示 + 大「复制」(`execCommand` 回退——纯 http 非安全上下文) + http(s) 自动链接;收文本表单与访客上传表单**同处、同条件**出现。

### 6.8 语言切换 / 国际化(i18n,0.9)★

设置页「语言」= 三分段控件(与「外观」同款 `…Seg` 结构):`跟随系统 / 中文 / English`。圆角 9、高 34、间距 8、均分宽;选中 = accent 底 + 白字(sans 13 semibold)、无描边,未选 = `surface` 底 + `ink` 字 + `line` 描边(sans 13 medium)。**语言用本族文字呈现**(「中文」「English」不翻译),「跟随系统」随当前语言显示。绑定 `AppState.langPref`(system / zh / en,持久化)。

**两个解析域彼此独立**(务必守):

- 原生 app —— 跟设置 `langPref`(`AppState.lang` / `Lang.current` 快照供菜单、CLI 读取)。
- 网页 —— **逐请求**按浏览器 `Accept-Language`(`q` 值降序、`q=0` 跳过),**绝不读 app 设置**。同一台 Mac 分享:桌面界面可中文、手机按自己系统语言显示。

文案三类:静态走 `L`(枚举键,编译器强制穷尽)、插值 / 复数 / 语序差异走 `LStr`、网页 JS 侧拼接走 `i18nJSON`(`jsEscape` 把 `<` 转义挡 `</script>`)。加语言只需在 `L`/`LStr` 各补一支。

---

## 7. 文案规范 Copywriting

- 全中文,简短克制;分隔统一用「 · 」(空格+中点+空格)。
- 中英双语(简体中文基准 + English,全部经 `Lang.swift` 文案表,见 §6.8);简短克制,分隔统一用「 · 」(空格+中点+空格)。
- 技术值(IP、端口、路径、体积、项数、日期)一律 mono。
- 危险操作动词直白:「停止」。正向:「选择文件或文件夹 / 重新广播 / 重新分享」。
- 权限措辞跟随状态:「只读分享 / 可读写」,不要写「读写模式开启」这类机翻腔。
Expand Down
Loading
Loading