跳过主要内容

更新日志

发布了什么,以及底下改了什么

转盘本体

pre-1.0 · 2026-08-29

十二个页面、可以拖甩的盘面、声音、分享链接,以及一个不再逐帧重绘的渲染器。

抽取

  • 先抽,再转。 一次旋转用 crypto.getRandomValues 加拒绝采样抽出中奖条目, 动画随后瞄准它。用力甩换来更久的旋转,换不来另一个答案。
  • 公平性页面。 在那一页上算法本身就是正文——页面上的代码就是实际跑的代码。
  • 权重与重复项。 一个条目的权重就是它在抽取里占的份额,并直接显示这个权重换来的百分比。 两个文字相同的条目仍然是两个条目,名单只会告诉你发现了几处重复,而不会悄悄合并它们。

盘面

  • 十二个页面。 每一页打开就是一个已经填好的盘面, 且各有一个别的页面没有的控件——数字区间、字母表、分队器、班级名单、抽奖记录。
  • 拖住甩出去。 手离开时的速度变成额外的圈数。旋转中按一下会提前落定; 空格与回车直接旋转,不用先去找按钮。
  • 声音。 咔哒声对齐指针掠过的每一条分隔线,落定有提示音,倒数可以取消, 手机上还会震动——每一项都能关,而且每一项都写着自己当前是开还是关。
  • 展示模式。 次级控件隐藏,盘面放大到屏幕短边的 70% 以上, 结果抬进一块高对比面板,用一屋子人都看得见的字号。
  • 另外两种呈现方式。 老虎机式滚动条与卡片条,用在圆形不是正确画法的时候。

保存与分享

  • 分享链接是快照。 盘面被编码进 URL,所以链接永不过期, 之后再改盘面也不会改变同事打开的那一个。
  • 已存盘面、旋转历史与权重预设,全都在这个浏览器里, 并且可以导出成一个文件带到另一个浏览器。没有账号,所以那个文件是唯一的搬运方式。

底下

  • 渲染器改用 canvas。 画面只在内容变化时画一次,旋转是对元素本身做 transform, 所以一次旋转完全不做逐帧工作。条目文字仍以一份真实但视觉隐藏的列表并存—— canvas 是像素,屏幕阅读器需要有东西可读。
  • 减弱动效已实现。prefers-reduced-motion: reduce 下跳过行程,直接播报结果。 三家竞品实测对它的处理数都是零。
  • 结果会被播报。 它落在一个 live region 里,是可以选中的真实文本, 不是画在盘面上的像素。

收缩成一个工具站

pre-1.0 · 2026-08-27

这个仓库起步时带的那套 SaaS 脚手架被删掉,而不是关掉。

TossWheel 是从一套 SaaS 起步模板开始的,这一天的工作大部分是做减法。

删掉

  • 账号、控制台、后台与设置。 没有可登录的东西,登录之后也没有东西,所以这些界面是被删掉而不是关掉的—— 一个关着的开关,它背后的代码照样会打包发出去。
  • 数据库、对象存储与键值缓存。 Worker 现在一个 binding 都没有。名单留在你的浏览器里, 分享出去的盘面装在链接本身。
  • 支付、订阅邮件与 AI 相关的部分。 在这里它们都没有活干。

定下

  • 方向 A「克制工具」。 做了三个高保真原型,选中其中一个:转盘在左,名单在旁, 主动作贴在转盘下方,全页只有转盘是彩色的。
  • 一个预发布开关。 在发布清单走完之前,每一个响应都带 noindex, 免得半成品先被收录、之后再费劲取消收录。

为什么把它写下来

以后再把数据库或登录加回来,是一次产品改动,不是实现细节。 正是这条约束,让这里的转盘不需要账号,也不保留你名单的任何副本。