一张纸上的朋友画板。底是 paper-landing 的纸面,鼠标不着墨。圆可以缩放和拖动,缩放停在 1 倍和 3 倍之间。头像齐了才一起出现,也不能被选中。悬停时其余头像降低饱和度并变淡;当前头像小于 96px 才把图片放大到这个尺寸,热区仍是原来的圆。点头像,屏幕中间摊开一张纸条:「我想说的」和「TA 想说的」。还没写过的,按 id 固定显示一句等候的话。在纸条外滚动鼠标会收起,在纸条里滚动则翻笔记本身。暗色纸面只有斑点,没有横纹。圆排成 GitHub Sponsors 那种打包。头像大小按近 90 天的互动量:回复、引用和 @ 越多越大,最大的靠近中间。没有互动的头像一样小。画板上没有 froQ 自己的头像。点头像看纸条。画板只放互关。每周一,GitHub Action 用 SocialData 重拉名单,只写入互关,并把这一周新的回复、引用和 @ 加进互动数。secret 是 SOCIALDATA_API_KEY。头像用 X 的图片地址,每周任务不提交新的图片文件。最早那批文件还在 public/avatars/。
pnpm install
pnpm dev # http://localhost:3000
pnpm generate # 静态导出到 dist,给 Cloudflare Workers
pnpm test # 摆放与头像大小
pnpm lint
pnpm typecheck推 main 后由 Cloudflare Workers Builds 构建并部署。仓库里不放 Cloudflare token。pnpm generate 产出 dist/。Worker 配置在 cloudflare.config.ts,静态资源目录在 wrangler.config.ts。本地一次发布用 pnpm deploy。自定义域名:https://circle.froq.me。
Workers Builds(GitHub 连接):NODE_VERSION=22,构建 pnpm generate,生产 pnpm exec cf deploy,预览 pnpm exec cf previews deploy。
| 路径 | 作用 |
|---|---|
data/people.json |
成员数据(构建时读取,页面只画互关) |
data/hidden.json |
不要再出现的 user id |
data/sync.json |
每周任务写下的时间与已计帖子 id(第一次跑之后才有) |
data/README.md |
JSON 字段说明 |
public/avatars/ |
这一次快照的头像。之后的名单改用远程地址 |
shared/circle/ |
类型、互关合并与画板摆放 |
.github/workflows/refresh-circle.yml |
每周一重拉互关 |
cloudflare.config.ts |
Worker 名与静态资源路由 |
wrangler.config.ts |
构建侧资源目录(dist) |
app/components/circle/ |
画板、纸条、名单 |
app/pages/index.vue |
首页。英文 /,中文 /zh,日文 /ja |
- 「TA 想说的」还是空的,标签不可点。「我想说的」空着时,显示按 userId 固定的等候句
- 互动数从 2026-08-21 起累加。每周任务第一次跑不重扫更早的帖
product.install.href指向/,避免模板「安装」遮罩
手写字体 EMS Allure(SIL OFL 1.1),见 vendor/ui/src/core/signature/hand-font.ts。