koishi-plugin-ciyi 1.2.10 → 1.3.0

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 (3) hide show
  1. package/lib/index.js +373 -213
  2. package/lib/m3.d.ts +256 -0
  3. package/package.json +1 -1
package/lib/index.js CHANGED
@@ -38,14 +38,185 @@ var allWords_default = ["哀悼", "悼念", "追悼", "致哀", "痛悼", "哀
38
38
  // src/data/questionList.json
39
39
  var questionList_default = ["视频", "网站", "公司", "时间", "电影", "孩子", "小说", "手机", "图片", "中文", "影院", "朋友", "记者", "玩家", "作者", "身体", "学校", "国家", "老师", "儿子", "照片", "父母", "电话", "影片", "观众", "软件", "城市", "宝宝", "天堂", "衣服", "女性", "父亲", "影视", "电脑", "空间", "明星", "家庭", "文章", "女儿", "医院", "母亲", "哥哥", "客户", "家长", "妻子", "成绩", "世界", "演员", "环境", "食物", "速度", "压力", "网络", "人类", "眼睛", "家人", "激情", "老人", "医生", "房子", "苹果", "质量", "时代", "人物", "历史", "政府", "团队", "人生", "价值", "姐姐", "员工", "女子", "妹妹", "数量", "社会", "汽车", "风险", "男子", "大学", "老板", "区域", "资料", "答案", "气质", "地位", "编辑", "性格", "身材", "皇帝", "专家", "角度", "丈夫", "知识", "剧情", "方案", "文件", "事业", "银行", "穿着", "敌人", "故事", "工具", "头发", "声音", "民警", "媒体", "话题", "酒店", "爱情", "文化", "号码", "集团", "武器", "论坛", "新闻", "资金", "对象", "心情", "背景", "力量", "少女", "科技", "趋势", "性能", "成本", "女友", "细节", "情绪", "程度", "想法", "前期", "音乐", "原则", "队伍", "部门", "高手", "道路", "年龄", "场景", "面积", "理由", "考生", "游客", "文字", "群众", "手段", "程序", "彩票", "目光", "居民", "婚姻", "选手", "责任", "男友", "意见", "队友", "状况", "成员", "市民", "香蕉", "股票", "农村", "村民", "主角", "动力", "冠军", "意义", "兴趣", "属性", "基地", "生命", "字谜", "演技", "广告", "概念", "元素", "小区", "核心", "产业", "天下", "工资", "制度", "会议", "球迷", "大众", "地球", "商品", "特色", "事实", "司机", "镜头", "数字", "品质", "教师", "校园", "正文", "联盟", "课程", "疾病", "理念", "午夜", "歌曲", "火箭", "儿童", "房间", "流量", "屏幕", "机制", "弟弟", "差距", "小米", "大人", "小时", "女神", "级别", "机器", "商家", "魅力", "美食", "物质", "能量", "案件", "战争", "飞机", "等级", "型号", "家族", "观点", "道理", "身高", "印象", "心态", "环节", "全集", "伙伴", "合同", "地图", "大哥", "气息", "太阳", "主任", "地点", "男性", "冬天", "功效", "阵容", "现金", "入口", "农民", "流程", "出口", "日期", "温度", "夫妻", "学院", "真心", "人群", "水果", "人民", "病人", "植物", "部队", "情侣", "信号", "漫画", "效率", "结局", "称号", "病毒", "小姐", "勇士", "特征", "利益", "动物", "夏天", "古代", "进口", "生气", "基金", "人口", "军队", "态度", "工厂", "热度", "法律", "发型", "公主", "法院", "物品", "案例", "语言", "外观", "姐妹", "孕妇", "冬季", "会员", "顾客", "资格", "笔者", "积分", "电池", "周边", "名称", "电视", "礼物", "真相", "资讯", "材质", "服装", "食品", "代码", "特性", "鞋子", "生日", "土地", "业主", "品种", "日子", "药物", "车子", "难题", "难度", "手指", "缺点", "高考", "大师", "警察", "渠道", "个性", "机场", "士兵", "利润", "成果", "裙子", "垃圾", "路线", "动画", "餐厅", "心理", "宝贝", "周末", "行情", "工艺", "女士", "皇上", "收益", "灵魂", "奖金", "景区", "页面", "师傅", "艺人", "指数", "详情", "大会", "走势", "蔬菜", "口罩", "色彩", "模型", "战士", "口碑", "律师", "空气", "字幕", "星座", "信心", "高校", "岗位", "高中", "芯片", "店铺", "头像", "邮箱", "同志", "厨房", "密码", "歌手", "成分", "情感", "差异", "财富", "青年", "股价", "智慧", "部位", "营养", "参数", "板块", "年纪", "账号", "生物", "一身", "金额", "舞台", "资产", "命运", "黑人", "线路", "心思", "学员", "花费", "指标", "乘客", "题目", "氛围", "网页", "款式", "综艺", "全程", "小学", "夏季", "民众", "饮食", "体育", "功夫", "联赛", "显卡", "客人", "通道", "房屋", "夫人", "队员", "用心", "看法", "体重", "消耗", "形态", "护士", "规格", "长度", "地铁", "射手", "战略", "步骤", "街道", "牌子", "规律", "原理", "时光", "电子", "强势", "博士", "超市", "干部", "主体", "事故", "现状", "主流", "空调", "人士", "格局", "订单", "股份", "大奖", "疑问", "海外", "裤子", "智能", "宠物", "教程", "优点", "姿势", "子女", "年度", "主力", "传奇", "读者", "足球", "公园", "名气", "形状", "内存", "一体", "种类", "气温", "法师", "爱人", "肚子", "工人", "脸色", "业绩", "外表", "主场", "手下", "地下", "热线", "弟子", "麻将", "新人", "重量", "教学", "报考", "宿舍", "官员", "群体", "亮点", "新手", "家具", "天空", "婴儿", "势力", "证据", "战绩", "场所", "比分", "丁香", "资本", "思路", "股东", "层面", "厂商", "版权", "外套", "事项", "商业", "皇后", "交警", "客厅", "情节", "精力", "强度", "用途", "节奏", "数学", "几率", "危机", "格式", "春天", "石头", "赛事", "玻璃", "玩具", "原料", "证书", "性质", "大脑", "最初", "篮球", "内地", "国语", "主席", "金融", "手臂", "频道", "手续", "概率", "肩膀", "乐趣", "活力", "本科", "视线", "骑士", "集体", "疫苗", "海报", "道具", "帝国", "次数", "途径", "肌肉", "年代", "工业", "商场", "大门", "职工", "图案", "论文", "春节", "口感", "形势", "学历", "金币", "金属", "政治", "深夜", "火车", "电源", "太子", "口味", "鼻子", "歌词", "后果", "月份", "市区", "气氛", "中医", "潮流", "正品", "设施", "窗口", "光芒", "场面", "周期", "战场", "尸体", "邻居", "快递", "产量", "机遇", "单身", "草原", "特效", "同期", "本质", "耳机", "模块", "魔法", "总裁", "股权", "配件", "逻辑", "陌生", "事物", "短信", "境界", "涨幅", "偶像", "景点", "蛋糕", "物流", "四周", "纪录", "嘉宾", "日后", "脾气", "岁月", "生态", "夫妇", "厕所", "路上", "金钱", "海量", "热门", "界面", "路段", "职位", "题材", "票房", "细胞", "观念", "硬件", "旅客", "红包", "初期", "家乡", "荣誉", "短期", "好评", "假期", "线条", "进程", "主板", "模板", "青草", "水分", "导师", "耳朵", "病情", "牙齿", "杂志", "上衣", "辖区", "房产", "公路", "门店", "师父", "硬盘", "恋情", "零食", "小组", "书籍", "接口", "故障", "权力", "协会", "威力", "账户", "年底", "频率", "卧室", "前提", "华人", "局部", "语气", "标题", "国王", "书记", "青春", "高温", "基因", "勇气", "股市", "广场", "老家", "西瓜", "嘴巴", "衬衫", "早餐", "外国", "朝廷", "城区", "栏目", "主机", "电信", "财产", "民间", "悲剧", "起点", "时机", "站点", "外形", "含量", "党员", "咖啡", "车身", "中学", "初中", "男士", "车站", "视野", "病例", "潜力", "按钮", "赛场", "液体", "目录", "前辈", "铁路", "货物", "都市", "物资", "血液", "帽子", "教材", "坐标", "别墅", "狐狸", "帖子", "价钱", "玉米", "五官", "脖子", "手法", "物业", "权利", "怪物", "公交", "县城", "欧元", "眼泪", "层次", "域名", "右手", "总统", "质感", "战术", "星期", "线索", "焦点", "心脏", "古人", "农业", "猴子", "言论", "公众", "园区", "仪器", "胖子", "婚礼", "钻石", "世纪", "胎儿", "大腿", "民族", "笑容", "路径", "直径", "住宅", "人心", "框架", "举措", "生涯", "事后", "举动", "精英", "妇女", "博客", "作家", "职责", "缺陷", "容量", "一带", "路口", "价位", "和尚", "愿望", "剧本", "祖国", "学者", "新品", "门票", "亲人", "一行", "生肖", "电机", "热量", "态势", "服饰", "酒吧", "伤口", "宇宙", "结论", "沙发", "奶粉", "客场", "饮料", "岛国", "坦克", "土豆", "代价", "椅子", "能源", "大赛", "物体", "细菌", "名义", "年份", "眼镜", "节点", "粮食", "开关", "塑料", "厚度", "人和", "姓名", "手表", "个股", "狮子", "话语", "前任", "类别", "乾隆", "好运", "图像", "女王", "大地", "雷霆", "茶叶", "药品", "脂肪", "效力", "嘴角", "秋季", "人间", "心灵", "家属", "美味", "巅峰", "功率", "前景", "幅度", "路人", "使命", "套路", "会计", "份额", "物理", "气势", "专科", "火锅", "插件", "资质", "节日", "后台", "轿车", "市值", "丫头", "要素", "外援", "总数", "秋天", "露珠", "视角", "专辑", "专题", "文学", "轮胎", "编制", "额头", "骗子", "亲戚", "商标", "省份", "奖项", "左手", "土壤", "极致", "戒指", "电梯", "学科", "样式", "户口", "面膜", "大妈", "女方", "天才", "权威", "公寓", "行程", "迹象", "热点", "灯光", "白酒", "职务", "美景", "冰箱", "公式", "地产", "全文", "侧面", "诗人", "壁纸", "盒子", "海军", "副本", "西装", "世间", "力气", "场地", "神色", "桌面", "神情", "新生", "内涵", "单元", "要点", "街头", "宾馆", "徒弟", "快手", "公子", "句子", "暴力", "档次", "剧组", "基层", "长安", "局势", "仪式", "水准", "钥匙", "暑假", "美人", "口气", "蜂蜜", "函数", "利息", "阳台", "字体", "航班", "嘴唇", "乡镇", "喜剧", "素质", "辣椒", "日夜", "昔日", "奇迹", "专利", "素材", "大盘", "化身", "大军", "央行", "商人", "库存", "气体", "底线", "最爱", "本土", "台词", "区间", "寿命", "村庄", "曲线", "火焰", "楼盘", "座位", "日记", "人性", "窗户", "上身", "乡村", "隐患", "场合", "酒精", "十一", "恋人", "中药", "首都", "鼠标", "意愿", "外地", "仓库", "后人", "均价", "军人", "科目", "舌头", "指南", "子弹", "本事", "学费", "内线", "引擎", "网吧", "手感", "立场", "成语", "幼儿", "缘分", "草莓", "买卖", "中期", "部落", "权益", "财运", "巨头", "面包", "景象", "智商", "键盘", "分子", "新年", "春季", "爱心", "长城", "陛下", "早点", "修士", "大厅", "户型", "癌症", "江南", "人格", "外部", "原先", "商店", "上帝", "例子", "后卫", "兔子", "豆腐", "航母", "情形", "刺客", "男方", "片刻", "睡眠", "教会", "世人", "被告", "视觉", "榜单", "光线", "下巴", "教室", "球星", "童年", "军事", "进度", "贸易", "行人", "森林", "情人", "伴侣", "季度", "内裤", "油耗", "王子", "主意", "石油", "餐饮", "跌幅", "团体", "月亮", "漏洞", "土豪", "情怀", "小吃", "房东", "主线", "文物", "片段", "异地", "大专", "利率", "毛衣", "前锋", "档案", "面的", "期限", "化学", "口红", "啤酒", "春色", "象棋", "隔壁", "彩色", "饭店", "美感", "电流", "电压", "凤凰", "套餐", "果实", "滋味", "电力", "法官", "贵族", "好感", "列车", "肝脏", "个体", "浑身", "王爷", "家居", "名额", "体积", "人选", "章节", "面料", "农户", "京城", "符号", "康熙", "片子", "年间", "困境", "菊花", "太后", "成效", "寓意", "医学", "秩序", "宽度", "名声", "宝石", "血管", "化工", "封面", "地域", "水泥", "跨度", "叶片", "事宜", "梦幻", "载体", "上限", "剧照", "钱包", "车头", "色调", "终端", "江湖", "法宝", "眉毛", "景观", "是非", "语文", "书法", "卡片", "比重", "孙子", "容器", "零件", "辈子", "导弹", "总额", "业界", "膝盖", "心得", "葡萄", "战机", "奶茶", "诗歌", "职场", "水晶", "体力", "精度", "文档", "浓度", "师兄", "人大", "海鲜", "邮件", "晚间", "桌子", "黄瓜", "新娘", "现货", "老鼠", "公安", "大臣", "强力", "老虎", "海洋", "胳膊", "语音", "行列", "上司", "内衣", "楼市", "花园", "文艺", "儿女", "饺子", "色球", "大队", "鲜花", "合约", "眼球", "商户", "友情", "信念", "中考", "委员", "景色", "信誉", "词语", "原价", "友谊", "欲望", "快感", "货车", "社保", "公民", "往年", "中介", "树木", "实体", "法规", "富豪", "党委", "性别", "极限", "英镑", "姿态", "上级", "债务", "海口", "体质", "业内", "阴影", "导语", "效应", "野外", "数值", "新高", "成品", "心意", "私人", "常识", "神话", "新区", "大将", "灵感", "弹性", "工地", "战役", "项链", "年夜", "用品", "眼下", "手掌", "同伴", "科普", "字母", "大米", "财务", "杀手", "将领", "理科", "筹码", "大姐", "发票", "部件", "颗粒", "地理", "港口", "货币", "方位", "原版", "网民", "骑兵", "气候", "早年", "流水", "密度", "灾难", "三国", "情报", "后天", "少爷", "空白", "五一", "模具", "反派", "名人", "胸口", "才华", "金星", "风采", "长辈", "被子", "身影", "单词", "纠纷", "额度", "原告", "胜率", "外人", "血压", "灰尘", "重心", "助手", "陷阱", "恶魔", "百科", "事务", "雨水", "食堂", "监狱", "好人", "拳头", "地狱", "初心", "简历", "美貌", "独家", "清单", "老将", "玫瑰", "小人", "看点", "报纸", "浴室", "中华", "海拔", "酱油", "谣言", "泡沫", "第五", "气味", "新房", "大衣", "电器", "轨道", "亲情", "利好", "公益", "范畴", "隧道", "画家", "身价", "热血", "电缆", "指甲", "大厦", "中原", "衣物", "路面", "意图", "马车", "包子", "奇葩", "四处", "美金", "小弟", "佛教", "火星", "地主", "权限", "泪水", "季节", "租金", "条款", "原著", "台风", "实战", "增幅", "面粉", "样品", "样本", "鲜血", "面条", "意志", "附件", "生前", "绯闻", "钱财", "按键", "娃娃", "文科", "社交", "人称", "心头", "神仙", "情商", "肿瘤", "证件", "后代", "萝卜", "肤色", "脚步", "空姐", "银子", "个子", "下身", "把手", "常态", "秘书", "白菜", "尼姑", "学位", "品类", "容貌", "像素", "翅膀", "商务", "金牌", "尾巴", "图表", "手腕", "兵力", "野心", "性命", "风扇", "水面", "课堂", "习俗", "时长", "眼光", "夜色", "皇冠", "花生", "痕迹", "豪宅", "巨星", "孕期", "仙女", "香水", "住房", "班级", "小雨", "墙壁", "脸颊", "契机", "历程", "熊猫", "陶瓷", "原型", "标的", "公元", "车间", "防线", "展会", "楼梯", "白银", "房源", "翡翠", "茄子", "书房", "吃货", "下游", "国庆", "米饭", "贵人", "地形", "钢琴", "顾问", "车队", "前妻", "皇宫", "图纸", "王朝", "手艺", "母乳", "腰带", "旗舰", "老汉", "舆论", "背面", "实质", "边界", "暴雨", "效益", "用法", "杯子", "上天", "满分", "沙漠", "佣金", "平面", "董事", "外貌", "小麦", "往后", "激光", "殿下", "袜子", "平民", "黑白", "粤语", "大蒜", "道士", "管家", "传言", "灵气", "月经", "爵士", "木材", "厨师", "用处", "菜单", "器官", "榜首", "低价", "说白", "口水", "动静", "年薪", "隐私", "旗袍", "风水", "中将", "官兵", "词汇", "妖怪", "皇子", "毛巾", "礼服", "星球", "热潮", "中年", "噪音", "误区", "折扣", "河流", "武将", "阀门", "法术", "世上", "天色", "吉他", "当代", "产妇", "中途", "年级", "风波", "大号", "余额", "原文", "宽带", "酸奶", "前途", "瓶子", "故宫", "巨人", "榜样", "门派", "村子", "豪门", "桥梁", "饭菜", "体型", "债券", "步伐", "良心", "年初", "蝴蝶", "肉体", "试卷", "字样", "春秋", "精髓", "售卖", "条例", "医药", "白宫", "烧烤", "表格", "箱子", "月底", "往事", "医师", "考点", "深渊", "珍珠", "手套", "下属", "瓷砖", "高峰", "太监", "晚年", "圈子", "寺庙", "文凭", "来人", "汽油", "对白", "诚意", "阵地", "汉族", "共识", "魔力", "首饰", "机体", "领袖", "意向", "文本", "意味", "阵营", "蛋白", "来电", "仪表", "珠宝", "上游", "终点", "全线", "特价", "帝王", "禁区", "家电", "哲学", "天干", "玄机", "边境", "庄家", "红军", "小雪", "战力", "众生", "肾脏", "阻力", "实话", "原油", "坏人", "后世", "智力", "花卉", "中锋", "家园", "国企", "古装", "军团", "汉字", "期货", "工会", "电路", "弱点", "证券", "网点", "上空", "礼包", "华夏", "硕士", "名片", "劣势", "实例", "战友", "身心", "炎症", "含义", "故乡", "源头", "小腿", "饰品", "低温", "海域", "涂料", "专线", "军官", "角落", "产物", "财经", "质地", "光环", "单价", "球场", "寝室", "万物", "轴承", "补丁", "雍正", "空军", "轮廓", "调料", "学长", "中东", "氧气", "下场", "红薯", "电气", "油脂", "死神", "宗教", "图形", "尺度", "相声", "地毯", "淀粉", "种族", "时段", "时装", "小将", "筷子", "面具", "屋子", "小车", "骗局", "门将", "沿线", "大王", "保姆", "闪电", "火灾", "前线", "绳子", "缺口", "跑车", "备注", "日月", "窗帘", "螃蟹", "院子", "樱桃", "午后", "人流", "位移", "癫痫", "多云", "汗水", "眉头", "药材", "韭菜", "煤炭", "纤维", "甲醛", "印花", "晚餐", "驾照", "店面", "绿茶", "财政", "当局", "课题", "光泽", "百合", "音频", "红利", "全民", "两岸", "药店", "晚会", "日照", "橡胶", "皇家", "菩萨", "谎言", "五行", "温泉", "美术", "歌声", "重伤", "新作", "白糖", "产地", "情景", "本领", "礼品", "声响", "毒素", "主子", "枕头", "学业", "音响", "厂房", "父子", "使者", "风雨", "后宫", "山区", "底层", "讲座", "穷人", "功力", "农场", "棋子", "回合", "诸葛", "花瓣", "海关", "魔术", "介质", "职能", "花朵", "行李", "台阶", "樱花", "胃口", "航线", "真理", "学期", "毒品", "柠檬", "政权", "前世", "公会", "水质", "意境", "宝物", "建材", "韵味", "招牌", "住户", "病症", "背包", "天上", "体温", "试题", "僵尸", "前夫", "轨迹", "外资", "盛宴", "特产", "秘诀", "口袋", "王国", "月光", "盘口", "血脉", "花纹", "薪水", "恶意", "月球", "四季", "平日", "乐队", "船舶", "姐夫", "活塞", "番茄", "餐馆", "高地", "剑客", "坐骑", "熟人", "匈奴", "时节", "噩梦", "兵器", "次日", "婚纱", "瑜伽", "学问", "事迹", "间隙", "姓氏", "伺候", "制品", "马桶", "鲍鱼", "料酒", "体制", "八字", "客栈", "肠胃", "年会", "风暴", "高价", "黑洞", "念头", "名号", "峡谷", "全员", "大雨", "责编", "车牌", "南瓜", "帝都", "远方", "真空", "城镇", "城堡", "根基", "国民", "物种", "底气", "菜品", "寒假", "饲料", "驾校", "浪潮", "地步", "洋葱", "学术", "遗产", "初始", "时空", "情网", "合体", "南非", "关节", "人力", "山水", "疗效", "城墙", "木耳", "白虎", "鹈鹕", "机组", "枸杞", "宫殿", "星空", "姑姑", "农历", "仙子", "端口", "峰会", "数目", "面容", "人中", "香烟", "面孔", "岛屿", "亚军", "容颜", "插图", "战舰", "上将", "虫子", "动感", "肥料", "风口", "集锦", "蚂蚁", "舰队", "扑克", "族人", "前列", "猎人", "变量", "头皮", "小偷", "脚本", "车位", "雕像", "走廊", "做工", "分量", "苦难", "月饼", "薪资", "小品", "异味", "来历", "核桃", "可乐", "乐器", "餐桌", "行星", "重任", "宝藏", "面团", "激素", "会场", "蚊子", "硬币", "将士", "面貌", "手脚", "指针", "难点", "彩虹", "实物", "风云", "车门", "东风", "邮编", "影子", "篮板", "手势", "法庭", "电线", "廉价", "前身", "元旦", "面色", "工序", "真皮", "废物", "科幻", "花椒", "岩石", "口腔", "湿度", "欧阳", "专栏", "地段", "太空", "高调", "传媒", "污水", "奴隶", "大风", "眼角", "糖果", "常人", "雷电", "园林", "如来", "终身", "瓶颈", "球鞋", "房租", "机油", "护照", "排骨", "头盔", "名词", "开水", "风味", "七夕", "黑马", "跟前", "洪水", "血糖", "诗词", "民生", "趣味", "杂质", "君子", "水库", "货源", "架子", "菠菜", "温情", "作风", "时辰", "圣人", "弊端", "病因", "教堂", "见解", "视力", "段位", "本体", "江山", "大豆", "产值", "遗址", "电量", "科室", "赛程", "抗体", "老年", "全局", "降幅", "伤势", "地带", "牛市", "会所", "前夕", "油漆", "神通", "溶液", "主食", "风衣", "利器", "关卡", "税收", "备胎", "喉咙", "火花", "帐篷", "天子", "往日", "银河", "散户", "中队", "决议", "状元", "经费", "外贸", "蜘蛛", "植株", "性子", "鸭子", "木头", "听力", "专项", "方针", "亮度", "星辰", "嫌疑", "段子", "网卡", "板材", "旅馆", "宗旨", "心境", "人马", "日内", "插座", "球衣", "皇室", "中秋", "分支", "户籍", "领土", "祖先", "围巾", "情趣", "蓝牙", "皱纹", "前沿", "方言", "特质", "标杆", "麒麟", "牌照", "二战", "牙膏", "河道", "范文", "北宋", "头衔", "旅程", "泥土", "喇叭", "考场", "奖杯", "插曲", "魔王", "正义", "粽子", "支队", "散文", "民国", "攻势", "本性", "误差", "瀑布", "老乡", "孙女", "火力", "校花", "奇才", "年末", "饮品", "偏差", "修养", "宝玉", "福气", "彩礼", "新址", "王牌", "纹理", "界限", "牡丹", "案子", "客车", "出路", "乌龟", "水域", "尾灯", "礼仪", "野兽", "骨骼", "性情", "盟友", "幕后", "元宝", "日志", "饼干", "韧性", "专柜", "乐园", "校服", "秘籍", "宫女", "怒火", "技艺", "柜子", "娘娘", "剧场", "大汉", "花样", "丫鬟", "名下", "耳环", "钢管", "晚饭", "物件", "手柄", "红旗", "黑客", "商机", "天性", "山顶", "傀儡", "车祸", "古风", "生机", "阳性", "店员", "水流", "世家", "蒸汽", "楼层", "棉花", "作物", "仙人", "顶端", "气流", "毛发", "沿海", "凡人", "皮带", "妇人", "车厢", "新郎", "轻声", "娘家", "冷战", "相貌", "山脉", "新书", "时分", "财物", "香菇", "罪名", "格子", "终极", "戏剧", "引得", "光源", "锅炉", "本金", "外号", "军舰", "月色", "朝代", "硬度", "飞船", "人参", "真情", "卡车", "魔鬼", "篇章", "凶手", "潜艇", "转速", "大同", "雪花", "车道", "橘子", "新秀", "财神", "笑脸", "豆浆", "雷达", "下水", "净利", "条纹", "期刊", "橱柜", "主义", "昵称", "业态", "船只", "石材", "家教", "点球", "高空", "卖点", "阵风", "现款", "语法", "原件", "地标", "拖鞋", "准则", "米色", "莲花", "午餐", "口号", "病房", "产权", "睡衣", "国会", "本子", "议员", "小丑", "步兵", "对联", "特权", "毅力", "湖泊", "沙滩", "老鹰", "衬衣", "鳄鱼", "心血", "农药", "皮革", "庄园", "大蕉", "成色", "南宋", "武术", "营地", "清明", "余生", "旗帜", "商会", "琉璃", "布料", "替身", "口径", "背心", "燃料", "职员", "股民", "后市", "报酬", "同胞", "缝隙", "恐龙", "序列", "护栏", "月薪", "四肢", "法力", "圣地", "柴油", "提案", "电网", "船长", "君主", "山寨", "灯具", "手枪", "钢板", "凭证", "思绪", "客房", "动机", "慕容", "点心", "人文", "牧师", "数码", "人脉", "历年", "前台", "门户", "王室", "高原", "博文", "长子", "荔枝", "桃子", "关口", "器材", "车标", "武侠", "宴会", "影帝", "感想", "历代", "小龙", "冷水", "袖子", "席位", "过错", "干货", "蜜蜂", "手册", "语句", "手镯", "异议", "钢筋", "龙虾", "天涯", "总和", "禁令", "袋子", "平原", "领地", "旋律", "树脂", "食盐", "课时", "院士", "浓眉", "郊区", "亲友", "妖精", "尽头", "纸巾", "专场", "遗迹", "油画", "锋线", "阴阳", "钢材", "月初", "评委", "阁下", "包头", "特长", "步枪", "元年", "皇位", "盘面", "团伙", "果汁", "部下", "先天", "葫芦", "京都", "文人", "款项", "清香", "农夫", "汉语", "胜负", "弹簧", "功课", "荷花", "地势", "纸张", "马路", "肺炎", "水位", "心事", "画作", "墓地", "大关", "海滩", "配饰", "而今", "村落", "赢家", "云端", "名次", "铠甲", "美学", "靴子", "电阻", "元气", "愿景", "大局", "茶几", "动向", "基调", "书本", "人情", "青龙", "关门", "字号", "竹子", "暖气", "间距", "声誉", "粉尘", "校友", "海盗", "天平", "偏见", "羽毛", "罪犯", "紫薇", "负载", "赛区", "九州", "枪械", "俗语", "庭院", "清风", "联邦", "坚果", "期末", "反响", "菠萝", "大雪", "边框", "掌声", "五更", "白领", "糯米", "芝麻", "受众", "花色", "投向", "展厅", "带宽", "寒冬", "武士", "亲属", "书包", "家务", "宰相", "气象", "仓位", "痔疮", "盘子", "楼房", "犯人", "龙王", "墨镜", "南宫", "神灵", "天王", "外线", "山峰", "三代", "水稻", "炮弹", "马克", "住所", "机床", "身世", "圣诞", "梦境", "合金", "匕首", "世俗", "养分", "远古", "盗贼", "社团", "天庭", "功德", "小鬼", "去向", "音质", "大使", "里程", "声望", "近照", "法人", "暑期", "毛孔", "气球", "工件", "数额", "沧桑", "陆军", "树林", "心神", "菜肴", "子孙", "榴莲", "友人", "米粉", "起火", "师姐", "征程", "一世", "恒星", "侄子", "字符", "旺季", "文献", "瑕疵", "直觉", "兰花", "背影", "运费", "去处", "剂量", "王府", "童装", "大街", "鸽子", "小队", "动能", "诗意", "食欲", "瓷器", "果子", "用人", "柜台", "片源", "套房", "家装", "沙子", "今生", "心机", "概况", "香菜", "齿轮", "粉末", "山谷", "幽灵", "锤子", "喜讯", "天线", "路灯", "口语", "杂物", "气泡", "外交", "汉人", "大巴", "床单", "网恋", "年限", "鲨鱼", "餐具", "福音", "配偶", "奖品", "人手", "讲师", "磁力", "善意", "绅士", "药剂", "祖父", "晚期", "妃子", "枝条", "速率", "功劳", "快讯", "燕窝", "青铜", "体能", "月票", "冷门", "隔断", "变故", "干警", "上古", "七七", "底蕴", "议题", "弱势", "轩辕", "地质", "博主", "内幕", "矿山", "生理", "大殿", "红豆", "绿地", "中卫", "杠杆", "身躯", "听众", "元件", "社群", "烟花", "船员", "新星", "猎物", "流向", "盛会", "电台", "媒介", "课件", "皮球", "天价", "芹菜", "嗓子", "疤痕", "威望", "宪法", "同感", "新低", "黑夜", "造价", "穴位", "花草", "器械", "肉身", "轮毂", "诊所", "射程", "霸主", "底座", "主队", "佛法", "木板", "老伴", "味精", "大庆", "周年", "娇妻", "寡妇", "耶稣", "果树", "享年", "眼皮", "国度", "重力", "系数", "物价", "夜市", "关税", "族长", "柚子", "粪便", "摆设", "话费", "后门", "荧幕", "生猪", "香料", "缘由", "坏处", "乞丐", "胆子", "光驱", "雪山", "末日", "课本", "燕子", "玉帝", "路程", "尿液", "夜景", "小腹", "上层", "泰山", "摊位", "方圆", "睫毛", "诱导", "押金", "纹路", "壁画", "客流", "风力", "火炮", "特写", "空地", "疯子", "宝座", "法子", "车速", "教主", "水源", "燃气", "支部", "话剧", "水货", "西门", "踪迹", "机房", "整机", "水泵", "警车", "陆地", "机电", "苦瓜", "捷径", "相片", "征兆", "色泽", "白人", "食谱", "印章", "烤箱", "骷髅", "山楂", "骨架", "教官", "火山", "手头", "童星", "书架", "路况", "影迷", "围棋", "国旗", "本钱", "枢纽", "百里", "近代", "橙子", "华北", "风气", "外语", "蜡烛", "骨干", "士气", "外汇", "契约", "别名", "丞相", "红茶", "省会", "呼声", "眼影", "玉石", "泉水", "磁场", "益处", "黄页", "纸币", "水箱", "城管", "刑法", "贵妃", "勺子", "春运", "胸膛", "字节", "甜品", "柱子", "游人", "报表", "场次", "花瓶", "怒气", "通宵", "标语", "凳子", "政协", "毛线", "燃油", "烟雾", "君王", "路子", "奶油", "名牌", "老总", "代号", "街区", "粒子", "两手", "花儿", "领口", "丑闻", "上官", "职称", "武松", "感触", "展区", "胶水", "外省", "内力", "洞穴", "住处", "流氓", "处境", "诸侯", "输赢", "全称", "床位", "妙招", "议会", "心愿", "观音", "薪酬", "婚事", "勋章", "蝎子", "底牌", "海岸", "雇主", "旅途", "眼线", "星光", "亡灵", "青蛙", "单子", "效能", "祖母", "童话", "气血", "铭文", "圣经", "牛排", "文笔", "才子", "盛世", "基数", "基准", "蜀汉", "终生", "光纤", "书院", "汇率", "残疾", "家境", "官职", "车库", "机缘", "驻地", "药水", "手链", "人身", "岳母", "场馆", "风俗", "色素", "素养", "离子", "磁盘", "太极", "血统", "眼底", "噪声", "画卷", "徽章", "买点", "剪刀", "网球", "栏杆", "彩蛋", "车程", "包袱", "眸子", "中外", "绰号", "司令", "吊带", "昆虫", "克星", "税务", "来宾", "早饭", "后裔", "道教", "工匠", "斗志", "得主", "武力", "器件", "近况", "野菜", "税率", "纪律", "五金", "字眼", "集市", "王后", "国籍", "光圈", "财力", "石化", "中指", "刹那", "盟主", "柿子", "特工", "命题", "半径", "山庄", "上任", "痛风", "柔情", "大黄", "北欧", "邮政", "亲王", "元帅", "端午", "电容", "底色", "磨难", "好心", "色狼", "野猪", "原子", "表皮", "名言", "风头", "城池", "乌鸦", "流域", "余地", "拇指", "渔民", "恒温", "班车", "湿疹", "胶带", "顶峰", "功臣", "下文", "佛像", "白金", "把头", "才艺", "沙龙", "法案", "创伤", "血色", "大头", "枪手", "头颅", "胶囊", "宫廷", "人像", "白眼", "冰糖", "兵团", "山地", "现年", "峰值", "摩托", "己方", "潜能", "根系", "趣事", "序幕", "食客", "西服", "蝙蝠", "插头", "门面", "歌迷", "插画", "桂花", "大嫂", "战线", "托盘", "固体", "奴婢", "围墙", "基建", "果园", "西域", "专员", "草案", "湿地", "因子", "军营", "风貌", "鸡精", "天神", "影后", "傻瓜", "时速", "佳作", "神态", "天数", "节气", "神明", "胚胎", "刀具", "基站", "外教", "五色", "硬伤", "索引", "外衣", "大炮", "功用", "水电", "耻辱", "文书", "孤儿", "棺材", "花期", "存量", "青椒", "喜事", "田园", "战事", "话筒", "红糖", "因果", "掌心", "名家", "保费", "钞票", "恩怨", "日历", "华南", "笔画", "货运", "师长", "情谊", "千金", "信徒", "悬崖", "原作", "书生", "单打", "机能", "言行", "内脏", "华东", "乱码", "身家", "珠子", "红人", "武艺", "螺纹", "国土", "低谷", "泳池", "尾盘", "茶水", "权势", "港币", "定金", "化肥", "盛典", "蛋黄", "学年", "本意", "指纹", "开端", "玄关", "火烧", "皮质", "鬼子", "颜料", "草地", "股指", "帮手", "黄油", "大厨", "世代", "脑海", "辅料", "海岛", "京剧", "新春", "星系", "空隙", "计谋", "教案", "土匪", "雾气", "海绵", "葬礼", "本源", "天际", "少将", "术语", "续集", "响声", "除夕", "片酬", "均线", "军工", "海带", "七彩", "联军", "警力", "后院", "专职", "羊毛", "妇科", "农田", "读音", "罪行", "山林", "足迹", "版图", "中旬", "矿工", "水利", "战马", "两性", "末期", "宾客", "糕点", "濮阳", "蚝油", "电工", "污垢", "罪恶", "资历", "一端", "票据", "兵种", "废水", "名录", "反差", "比率", "期中", "母校", "耳根", "尾声", "唇膏", "绿豆", "情敌", "明珠", "郡主", "周身", "冬瓜", "班子", "银杏", "题型", "伤痕", "周岁", "法器", "心智", "领主", "二线", "国宝", "奶妈", "仇人", "选票", "金子", "情书", "史诗", "擂台", "手心", "笨蛋", "纽带", "战国", "高薪", "倍数", "香油", "风筝", "盾牌", "午饭", "空缺", "三农", "诀窍", "石榴", "典范", "凉鞋", "岳父", "单体", "灯笼", "阵雨", "功耗", "黄豆", "运河", "要害", "脚趾", "镜片", "位子", "皇族", "下联", "起因", "战乱", "肉质", "地表", "都城", "牙刷", "大名", "造诣", "仆人", "庆典", "拉链", "妇联", "偏方", "首富", "农家", "生计", "颈椎", "毛笔", "方程", "珍品", "天帝", "起色", "天鹅", "末世", "剧院", "悬疑", "木星", "技师", "底子", "典故", "前言", "感官", "流星", "儒家", "鞋底", "要塞", "子弟", "工伤", "公厕", "实业", "官场", "香肠", "尘埃", "华裔", "眼眶", "化石", "淮南", "西施", "脾胃", "苍蝇", "寺院", "死刑", "壁垒", "课文", "墙角", "企鹅", "天尊", "功底", "官府", "学分", "惯性", "声卡", "兄长", "诗句", "古董", "废墟", "褶皱", "强敌", "江北", "钻戒", "邮票", "帮派", "孔雀", "结语", "横财", "阴性", "凉水", "血迹", "晶体", "坟墓", "招数", "说唱", "池塘", "瓜子", "车手", "末节", "家小", "毒液", "机芯", "病菌", "音量", "间谍", "开篇", "名师", "莲藕", "藏品", "誓言", "钱币", "定律", "魄力", "稿件", "口岸", "假象", "首相", "花絮", "豹子", "差价", "树干", "书画", "游记", "叉车", "书桌", "卵巢", "祖宗", "电瓶", "恶人", "丸子", "倒数", "弹力", "蜗牛", "页码", "长处", "快餐", "玩偶", "女皇", "满月", "贝壳", "丝绸", "草药", "客机", "卫视", "废气", "公社", "构件", "奶酪", "假日", "机枪", "张力", "矿石", "窍门", "插口", "牛皮", "用意", "浴缸", "个位", "战车", "机车", "海面", "容积", "宝剑", "日报", "甜点", "常客", "烟草", "风度", "灾害", "低压", "冷库", "驿站", "破绽", "西医", "富商", "厂区", "油条", "冬至", "面食", "汤圆", "分店", "账单", "内战", "振幅", "佛陀", "厨艺", "殊荣", "摆件", "草坪", "口诀", "电站", "电极", "一审", "曙光", "管子", "马达", "笔墨", "度数", "面相", "夹克", "学名", "变数", "食指", "标本", "肥皂", "行货", "品格", "洋房", "朱雀", "邮局", "光子", "仙境", "旧址", "飓风", "风声", "朝向", "衣着", "深海", "甘蔗", "侍女", "雨伞", "伤疤", "本色", "扇子", "飞天", "缘故", "司徒", "难民", "瘟疫", "肢体", "隔阂", "战火", "视图", "母爱", "治安", "姻缘", "奶牛", "陵墓", "葱花", "电能", "骆驼", "光学", "安危", "惯例", "忠心", "大洋", "基点", "蟑螂", "灵性", "刑罚", "侄女", "兴致", "冰川", "支柱", "波折", "盔甲", "地基", "信件", "观感", "宗师", "后勤", "点子", "戏曲", "硬汉", "展馆", "绝招", "陨石", "拳击", "毛囊", "美德", "田地", "波澜", "色鬼", "饰物", "副业", "大纲", "举止", "身姿", "限度", "油箱", "谜语", "巴掌", "波浪", "限额", "本名", "展位", "阴霾", "微风", "天河", "天宫", "天窗", "预案", "阶层", "帝君", "军校", "叛徒", "排球", "紧邻", "寒气", "下限", "枪支", "法学", "继母", "司马", "热气", "政委", "佛祖", "海参", "宦官", "富婆", "油门", "人世", "螺栓", "师妹", "战局", "新意", "面值", "家产", "果肉", "闹钟", "红叶", "大势", "幻影", "蓝图", "黑头", "织物", "器具", "政务", "曲子", "初衷", "议案", "污渍", "事例", "魂魄", "丝瓜", "公关", "图腾", "新欢", "教皇", "上联", "行踪", "裂痕", "气色", "盘古", "信封", "操场", "阶梯", "绝技", "大户", "图说", "难关", "丛林", "病患", "军阀", "躯体", "眼界", "女郎", "归宿", "线圈", "巫师", "抽屉", "债权", "遗嘱", "三七", "油田", "灾区", "琐事", "半生", "刀片", "西汉", "山头", "针灸", "银耳", "技法", "本部", "引力", "草丛", "国力", "触手", "堡垒", "风向", "踪影", "金奖", "菜谱", "乱世", "脚底", "地砖", "田野", "铅笔", "跑道", "白醋", "腹地", "暴君", "四面", "螺旋", "小名", "道家", "牧场", "晚辈", "气压", "脚印", "商贸", "错觉", "婆家", "唱片", "境遇", "北极", "路途", "素描", "烧饼", "医术", "年华", "试剂", "渊源", "名利", "扶手", "货品", "四海", "乾坤", "故人", "流体", "结石", "专人", "海豚", "秀才", "首府", "硅谷", "球门", "市政", "武林", "东门", "称谓", "院落", "茉莉", "玄武", "托福", "条约", "骑手", "口子", "旅店", "火光", "耐力", "静电", "经脉", "下旬", "内里", "荧屏", "落差", "展品", "工期", "语录", "年终", "车次", "典礼", "顶点", "病床", "绳索", "烈焰", "衣衫", "美酒", "经期", "细则", "鼻梁", "班次", "动词", "客队", "常温", "图画", "展台", "史料", "角球", "考官", "同人", "殿堂", "箭头", "流派", "伴娘", "对子", "天门", "神医", "东汉", "问号", "淡季", "火势", "宝典", "表盘", "风潮", "书信", "锦旗", "邮轮", "叶轮", "功绩", "时钟", "幻觉", "大葱", "疗程", "月季", "情境", "花粉", "国脚", "夜班", "心声", "卫士", "秋风", "满眼", "密室", "意念", "地摊", "得失", "转子", "味蕾", "轮椅", "冷汗", "东宫", "裂纹", "交情", "强盗", "文具", "猛将", "赛制", "小我", "试管", "助教", "汉奸", "前人", "披肩", "咽喉", "履历", "中枢", "篇幅", "公章", "层级", "矩形", "正统", "肉眼", "烟火", "斑点", "脸面", "胡同", "靠山", "选民", "据点", "先知", "关中", "造化", "淮北", "样板", "外企", "民俗", "火气", "口音", "恩师", "失主", "任期", "柑橘", "长官", "渔船", "药房", "圣旨", "学说", "支线", "墨水", "液晶", "卷子", "脸庞", "垫子", "生母", "扮相", "时限", "中线", "芦荟", "火线", "溶剂", "耳光", "难事", "流苏", "相公", "政客", "长假", "五谷", "辅食", "好意", "百货", "回路", "领带", "腰身", "伙计", "平局", "信贷", "嫁妆", "强人", "死因", "水星", "电车", "魔方", "范本", "薄荷", "画师", "军衔", "屈辱", "霸王", "体操", "窘境", "奴才", "木瓜", "沥青", "奖牌", "身手", "神童", "南极", "民航", "差错", "欢心", "费率", "雨季", "光华", "个案", "墙纸", "实情", "共性", "统帅", "优劣", "管线", "笔下", "罚单", "鼻孔", "警报", "山河", "谜底", "开衫", "智库", "闹剧", "暴风", "年货", "中雨", "扣子", "天敌", "多时", "甜食", "瞳孔", "眼袋", "板栗", "格格", "水体", "好手", "鹦鹉", "钟馗", "月度", "吊灯", "常会", "横幅", "曲目", "重担", "山坡", "管材", "警官", "看台", "纱布", "天皇", "备件", "会展", "屏风", "脉冲", "灯塔", "秀发", "内功", "游艇", "段落", "燕麦", "诺言", "音色", "粗粮", "情缘", "果冻", "义工", "盆景", "血型", "神韵", "演艺", "祭坛", "饵料", "要领", "法令", "胆量", "鲸鱼", "街舞", "星河", "脊柱", "心腹", "进士", "天机", "底薪", "主权", "货款", "黄帝", "黑板", "兽医", "台灯", "刷子", "门板", "夜宵", "袖口", "莲子", "元宵", "天命", "整数", "成败", "歌舞", "公车", "磁性", "肚脐", "可可", "吉星", "写法", "国道", "真菌", "民企", "小生", "烈火", "居室", "分寸", "族群", "监事", "夜空", "江东", "高职", "中餐", "政党", "字形", "金鱼", "坐垫", "说辞", "极光", "法门", "茶馆", "画笔", "时日", "法式", "点位", "披风", "半岛", "老弟", "谜团", "往常", "能耗", "皮毛", "影评", "末尾", "先手", "脉络", "帆布", "心性", "租户", "外传", "菜刀", "杀机", "雏形", "沉香", "功勋", "海滨", "锋芒", "苗木"];
40
40
 
41
+ // src/m3.ts
42
+ var WHITE_X = 95.047;
43
+ var WHITE_Y = 100;
44
+ var WHITE_Z = 108.883;
45
+ function labToXyz(l, a, b) {
46
+ const fy = (l + 16) / 116;
47
+ const fx = fy + a / 500;
48
+ const fz = fy - b / 200;
49
+ const f = /* @__PURE__ */ __name((t) => t > 6 / 29 ? t * t * t : 3 * (6 / 29) ** 2 * (t - 4 / 29), "f");
50
+ return [f(fx) * WHITE_X, f(fy) * WHITE_Y, f(fz) * WHITE_Z];
51
+ }
52
+ __name(labToXyz, "labToXyz");
53
+ function gamma(value) {
54
+ return value <= 31308e-7 ? value * 12.92 : 1.055 * value ** (1 / 2.4) - 0.055;
55
+ }
56
+ __name(gamma, "gamma");
57
+ function xyzToRgb(x, y, z) {
58
+ x /= 100;
59
+ y /= 100;
60
+ z /= 100;
61
+ return [
62
+ gamma(3.2406 * x - 1.5372 * y - 0.4986 * z),
63
+ gamma(-0.9689 * x + 1.8758 * y + 0.0415 * z),
64
+ gamma(0.0557 * x - 0.204 * y + 1.057 * z)
65
+ ];
66
+ }
67
+ __name(xyzToRgb, "xyzToRgb");
68
+ var EPSILON = 1 / 512;
69
+ function lch(tone, chroma, hue) {
70
+ const radian = hue * Math.PI / 180;
71
+ const at = /* @__PURE__ */ __name((c) => xyzToRgb(...labToXyz(tone, Math.cos(radian) * c, Math.sin(radian) * c)), "at");
72
+ const inGamut = /* @__PURE__ */ __name((rgb2) => rgb2.every((value) => value >= -EPSILON && value <= 1 + EPSILON), "inGamut");
73
+ let rgb = at(chroma);
74
+ if (!inGamut(rgb)) {
75
+ let low = 0;
76
+ let high = chroma;
77
+ while (high - low > 0.05) {
78
+ const mid = (low + high) / 2;
79
+ if (inGamut(at(mid))) low = mid;
80
+ else high = mid;
81
+ }
82
+ rgb = at(low);
83
+ }
84
+ return "#" + rgb.map((value) => Math.round(Math.min(1, Math.max(0, value)) * 255).toString(16).padStart(2, "0")).join("");
85
+ }
86
+ __name(lch, "lch");
87
+ function palette(hue, chroma) {
88
+ const cache = /* @__PURE__ */ new Map();
89
+ return (tone) => {
90
+ const hit = cache.get(tone);
91
+ if (hit) return hit;
92
+ const value = lch(tone, chroma, hue);
93
+ cache.set(tone, value);
94
+ return value;
95
+ };
96
+ }
97
+ __name(palette, "palette");
98
+ function palettesOf(hue, options = {}) {
99
+ const { chroma = 56, tertiaryShift = 60 } = options;
100
+ return {
101
+ primary: palette(hue, chroma),
102
+ secondary: palette(hue, Math.max(16, chroma / 3.2)),
103
+ tertiary: palette(hue + tertiaryShift, Math.max(28, chroma / 1.8)),
104
+ neutral: palette(hue, 4),
105
+ neutralVariant: palette(hue, 9),
106
+ error: palette(36, 68)
107
+ };
108
+ }
109
+ __name(palettesOf, "palettesOf");
110
+ function scheme(hue, dark = false, options = {}) {
111
+ const p = palettesOf(hue, options);
112
+ const { primary: P, secondary: S, tertiary: T, neutral: N, neutralVariant: V, error: E } = p;
113
+ if (dark) {
114
+ return {
115
+ primary: P(80),
116
+ onPrimary: P(20),
117
+ primaryContainer: P(30),
118
+ onPrimaryContainer: P(90),
119
+ secondary: S(80),
120
+ onSecondary: S(20),
121
+ secondaryContainer: S(30),
122
+ onSecondaryContainer: S(90),
123
+ tertiary: T(80),
124
+ onTertiary: T(20),
125
+ tertiaryContainer: T(30),
126
+ onTertiaryContainer: T(90),
127
+ error: E(80),
128
+ onError: E(20),
129
+ errorContainer: E(30),
130
+ onErrorContainer: E(90),
131
+ background: N(6),
132
+ onBackground: N(90),
133
+ surface: N(6),
134
+ onSurface: N(90),
135
+ surfaceVariant: V(30),
136
+ onSurfaceVariant: V(80),
137
+ surfaceDim: N(6),
138
+ surfaceBright: N(24),
139
+ surfaceContainerLowest: N(4),
140
+ surfaceContainerLow: N(10),
141
+ surfaceContainer: N(12),
142
+ surfaceContainerHigh: N(17),
143
+ surfaceContainerHighest: N(22),
144
+ outline: V(60),
145
+ outlineVariant: V(30),
146
+ inverseSurface: N(90),
147
+ inverseOnSurface: N(20),
148
+ inversePrimary: P(40),
149
+ scrim: N(0),
150
+ shadow: N(0)
151
+ };
152
+ }
153
+ return {
154
+ primary: P(40),
155
+ onPrimary: P(100),
156
+ primaryContainer: P(90),
157
+ onPrimaryContainer: P(30),
158
+ secondary: S(40),
159
+ onSecondary: S(100),
160
+ secondaryContainer: S(90),
161
+ onSecondaryContainer: S(30),
162
+ tertiary: T(40),
163
+ onTertiary: T(100),
164
+ tertiaryContainer: T(90),
165
+ onTertiaryContainer: T(30),
166
+ error: E(40),
167
+ onError: E(100),
168
+ errorContainer: E(90),
169
+ onErrorContainer: E(30),
170
+ background: N(98),
171
+ onBackground: N(10),
172
+ surface: N(98),
173
+ onSurface: N(10),
174
+ surfaceVariant: V(90),
175
+ onSurfaceVariant: V(30),
176
+ surfaceDim: N(87),
177
+ surfaceBright: N(98),
178
+ surfaceContainerLowest: N(100),
179
+ surfaceContainerLow: N(96),
180
+ surfaceContainer: N(94),
181
+ surfaceContainerHigh: N(92),
182
+ surfaceContainerHighest: N(90),
183
+ outline: V(50),
184
+ outlineVariant: V(80),
185
+ inverseSurface: N(20),
186
+ inverseOnSurface: N(95),
187
+ inversePrimary: P(80),
188
+ scrim: N(0),
189
+ shadow: N(0)
190
+ };
191
+ }
192
+ __name(scheme, "scheme");
193
+ var SHAPE = {
194
+ none: 0,
195
+ extraSmall: 4,
196
+ small: 8,
197
+ medium: 12,
198
+ large: 16,
199
+ largeIncreased: 20,
200
+ extraLarge: 28,
201
+ extraLargeIncreased: 32,
202
+ extraExtraLarge: 48,
203
+ full: 9999
204
+ };
205
+ var FONT_STACK = '"Roboto Flex", "Roboto", "Noto Sans SC", "PingFang SC", "Microsoft YaHei", "Source Han Sans SC", system-ui, sans-serif';
206
+ var MEDAL = {
207
+ gold: lch(58, 52, 85),
208
+ silver: lch(66, 5, 260),
209
+ bronze: lch(48, 36, 48)
210
+ };
211
+
41
212
  // src/view.ts
42
213
  var TIERS = [
43
- { max: 10, name: "咫尺", color: "#B7352B", note: "答案就在手边" },
44
- { max: 50, name: "毗邻", color: "#C4703A", note: "已在同一条街" },
45
- { max: 200, name: "相近", color: "#AE8A2C", note: "方向是对的" },
46
- { max: 1e3, name: "沾边", color: "#6E8B52", note: "擦到了边缘" },
47
- { max: 5e3, name: "疏远", color: "#4E7C93", note: "还隔着几重" },
48
- { max: Infinity, name: "天涯", color: "#4A5470", note: "换个思路吧" }
214
+ { max: 10, name: "咫尺", color: lch(48, 62, 30), note: "答案就在手边" },
215
+ { max: 50, name: "毗邻", color: lch(50, 56, 58), note: "已在同一条街" },
216
+ { max: 200, name: "相近", color: lch(52, 46, 88), note: "方向是对的" },
217
+ { max: 1e3, name: "沾边", color: lch(50, 36, 145), note: "擦到了边缘" },
218
+ { max: 5e3, name: "疏远", color: lch(48, 30, 228), note: "还隔着几重" },
219
+ { max: Infinity, name: "天涯", color: lch(46, 14, 268), note: "换个思路吧" }
49
220
  ];
50
221
  function tierOf(rank) {
51
222
  return TIERS.find((t) => rank <= t.max);
@@ -60,26 +231,59 @@ __name(nearness, "nearness");
60
231
 
61
232
  // src/render.ts
62
233
  var SCALE = 2;
234
+ var HUE = 196;
235
+ var SCHEME = scheme(HUE);
63
236
  var C = {
64
- paper: "#F3EDE1",
65
- paper2: "#EBE2D0",
66
- ink: "#241F1A",
67
- ink2: "#6B6259",
68
- ink3: "#9B9186",
69
- rule: "#D5CAB4",
70
- ruleDark: "#C2B69E",
71
- seal: "#B23A2E",
72
- sealLight: "#B7352B",
73
- bg: "#DED4C0",
74
- white: "#FFFCF4",
75
- fresh: "rgba(178,58,46,0.075)"
237
+ surface: SCHEME.surface,
238
+ surfaceContainerLowest: SCHEME.surfaceContainerLowest,
239
+ surfaceContainerLow: SCHEME.surfaceContainerLow,
240
+ surfaceContainer: SCHEME.surfaceContainer,
241
+ surfaceContainerHigh: SCHEME.surfaceContainerHigh,
242
+ surfaceContainerHighest: SCHEME.surfaceContainerHighest,
243
+ onSurface: SCHEME.onSurface,
244
+ onSurfaceVariant: SCHEME.onSurfaceVariant,
245
+ outline: SCHEME.outline,
246
+ outlineVariant: SCHEME.outlineVariant,
247
+ primary: SCHEME.primary,
248
+ onPrimary: SCHEME.onPrimary,
249
+ primaryContainer: SCHEME.primaryContainer,
250
+ onPrimaryContainer: SCHEME.onPrimaryContainer
76
251
  };
77
- var FONT_SERIF = '"Noto Serif CJK SC", "Noto Serif CJK", serif';
78
- var FONT_NUM = '"Noto Serif CJK SC", "Noto Serif CJK", serif';
252
+ var FRESH = lch(94, 14, HUE);
253
+ var FONT_SANS = FONT_STACK;
254
+ var FONT_NUM = FONT_STACK;
79
255
  function s(n) {
80
256
  return Math.round(n * SCALE);
81
257
  }
82
258
  __name(s, "s");
259
+ function roundRect(ctx, x, y, w, h2, r) {
260
+ const radius = Math.max(0, Math.min(r, w / 2, h2 / 2));
261
+ ctx.beginPath();
262
+ ctx.moveTo(x + radius, y);
263
+ ctx.lineTo(x + w - radius, y);
264
+ ctx.arcTo(x + w, y, x + w, y + radius, radius);
265
+ ctx.lineTo(x + w, y + h2 - radius);
266
+ ctx.arcTo(x + w, y + h2, x + w - radius, y + h2, radius);
267
+ ctx.lineTo(x + radius, y + h2);
268
+ ctx.arcTo(x, y + h2, x, y + h2 - radius, radius);
269
+ ctx.lineTo(x, y + radius);
270
+ ctx.arcTo(x, y, x + radius, y, radius);
271
+ ctx.closePath();
272
+ }
273
+ __name(roundRect, "roundRect");
274
+ function fillRound(ctx, x, y, w, h2, r, color) {
275
+ ctx.fillStyle = color;
276
+ roundRect(ctx, x, y, w, h2, r);
277
+ ctx.fill();
278
+ }
279
+ __name(fillRound, "fillRound");
280
+ function strokeRound(ctx, x, y, w, h2, r, color, width) {
281
+ ctx.strokeStyle = color;
282
+ ctx.lineWidth = width;
283
+ roundRect(ctx, x, y, w, h2, r);
284
+ ctx.stroke();
285
+ }
286
+ __name(strokeRound, "strokeRound");
83
287
  function tierRange(i) {
84
288
  return i === TIERS.length - 1 ? `${TIERS[i - 1].max}+` : `≤${TIERS[i].max}`;
85
289
  }
@@ -152,56 +356,21 @@ function textLeftFit(ctx, text, x, y, maxWidth, font, color, offsetY = 0) {
152
356
  textLeft(ctx, ellipsize(text, maxWidth, fontSizeOf(font)), x, y, font, color, offsetY);
153
357
  }
154
358
  __name(textLeftFit, "textLeftFit");
155
- function drawPaper(ctx, x, y, w, h2) {
156
- ctx.fillStyle = C.paper;
157
- ctx.fillRect(x, y, w, h2);
158
- ctx.fillStyle = "rgba(255,255,255,0.18)";
159
- ctx.fillRect(x, y, w, Math.round(h2 * 0.34));
160
- ctx.save();
161
- ctx.globalAlpha = 0.028;
162
- ctx.strokeStyle = "#78684E";
163
- for (let ly = y; ly < y + h2; ly += s(4)) {
164
- ctx.beginPath();
165
- ctx.moveTo(x, ly);
166
- ctx.lineTo(x + w, ly);
167
- ctx.stroke();
168
- }
169
- for (let lx = x; lx < x + w; lx += s(3)) {
170
- ctx.beginPath();
171
- ctx.moveTo(lx, y);
172
- ctx.lineTo(lx, y + h2);
173
- ctx.stroke();
174
- }
175
- ctx.restore();
359
+ function drawCard(ctx, x, y, w, h2) {
360
+ fillRound(ctx, x, y, w, h2, s(SHAPE.extraLarge), C.surfaceContainerLowest);
176
361
  }
177
- __name(drawPaper, "drawPaper");
362
+ __name(drawCard, "drawCard");
178
363
  async function toPng(service, innerW, innerH, draw) {
179
- const ox = s(6);
180
- const oy = s(6);
181
- const borderOut = s(3);
182
- const gap = s(5);
183
- const canvasW = (ox + borderOut + gap) * 2 + innerW + s(10);
184
- const canvasH = (oy + borderOut + gap) * 2 + innerH + s(10);
364
+ const margin = s(18);
365
+ const canvasW = margin * 2 + innerW;
366
+ const canvasH = margin * 2 + innerH;
185
367
  const canvas = await service.createCanvas(canvasW, canvasH);
186
368
  const ctx = canvas.getContext("2d");
187
369
  try {
188
- ctx.fillStyle = C.bg;
370
+ ctx.fillStyle = C.surface;
189
371
  ctx.fillRect(0, 0, canvasW, canvasH);
190
- const paperX = ox + borderOut + gap;
191
- const paperY = oy + borderOut + gap;
192
- drawPaper(ctx, paperX, paperY, innerW, innerH);
193
- ctx.strokeStyle = C.ink;
194
- ctx.lineWidth = borderOut;
195
- ctx.strokeRect(
196
- ox + borderOut / 2,
197
- oy + borderOut / 2,
198
- canvasW - ox * 2 - borderOut,
199
- canvasH - oy * 2 - borderOut
200
- );
201
- ctx.strokeStyle = C.rule;
202
- ctx.lineWidth = s(1);
203
- ctx.strokeRect(paperX - s(3), paperY - s(3), innerW + s(6), innerH + s(6));
204
- draw(ctx, paperX, paperY, innerW, innerH);
372
+ drawCard(ctx, margin, margin, innerW, innerH);
373
+ draw(ctx, margin, margin, innerW, innerH);
205
374
  return await canvas.toBuffer("image/png");
206
375
  } finally {
207
376
  await canvas.dispose();
@@ -222,31 +391,25 @@ function gridWidth(word, size) {
222
391
  __name(gridWidth, "gridWidth");
223
392
  function drawGridCell(ctx, x, y, size, ch, mode, fontSize, borderW) {
224
393
  const half = size / 2;
394
+ const radius = Math.min(s(SHAPE.large), Math.max(s(SHAPE.extraSmall), size * 0.2));
225
395
  if (mode === "mk") {
226
- ctx.fillStyle = "rgba(205,192,168,0.32)";
227
- ctx.fillRect(x, y, size, size);
228
- ctx.strokeStyle = "#C0B399";
229
- ctx.lineWidth = s(borderW);
396
+ fillRound(ctx, x, y, size, size, radius, C.surfaceContainerHighest);
397
+ ctx.save();
230
398
  ctx.setLineDash([s(3), s(3)]);
231
- ctx.strokeRect(x + s(0.5), y + s(0.5), size - s(1), size - s(1));
232
- ctx.setLineDash([]);
233
- ctx.strokeStyle = "rgba(150,138,120,0.55)";
234
- ctx.lineWidth = s(1);
235
- ctx.setLineDash([s(2), s(2)]);
236
- ctx.beginPath();
237
- ctx.moveTo(x + s(4), y + half);
238
- ctx.lineTo(x + size - s(4), y + half);
239
- ctx.moveTo(x + half, y + s(4));
240
- ctx.lineTo(x + half, y + size - s(4));
241
- ctx.stroke();
242
- ctx.setLineDash([]);
399
+ strokeRound(
400
+ ctx,
401
+ x + s(0.5),
402
+ y + s(0.5),
403
+ size - s(1),
404
+ size - s(1),
405
+ radius,
406
+ C.outline,
407
+ s(borderW)
408
+ );
409
+ ctx.restore();
243
410
  return;
244
411
  }
245
- ctx.fillStyle = C.white;
246
- ctx.fillRect(x, y, size, size);
247
- ctx.strokeStyle = "#B9AC93";
248
- ctx.lineWidth = s(borderW);
249
- ctx.strokeRect(x + s(0.5), y + s(0.5), size - s(1), size - s(1));
412
+ fillRound(ctx, x, y, size, size, radius, C.surfaceContainerHigh);
250
413
  if (ch) {
251
414
  const fs = s(fontSize);
252
415
  textCenter(
@@ -254,8 +417,8 @@ function drawGridCell(ctx, x, y, size, ch, mode, fontSize, borderW) {
254
417
  ch,
255
418
  x + half,
256
419
  y + half,
257
- `600 ${fs}px ${FONT_SERIF}`,
258
- C.ink,
420
+ `600 ${fs}px ${FONT_SANS}`,
421
+ C.onSurface,
259
422
  cjkOffset(fs)
260
423
  );
261
424
  }
@@ -267,7 +430,7 @@ function drawWordGrid(ctx, x, y, word, size, mask) {
267
430
  const gap = s(g.gap);
268
431
  const chars = Array.from(word || "");
269
432
  if (chars.length === 0) {
270
- textCenter(ctx, "—", x + s(14), y + cell / 2, `${s(13)}px ${FONT_SERIF}`, C.ink3);
433
+ textCenter(ctx, "—", x + s(14), y + cell / 2, `${s(13)}px ${FONT_SANS}`, C.outline);
271
434
  return s(28);
272
435
  }
273
436
  let cx = x;
@@ -283,20 +446,13 @@ function drawWordGrid(ctx, x, y, word, size, mask) {
283
446
  }
284
447
  __name(drawWordGrid, "drawWordGrid");
285
448
  function drawSeal(ctx, x, y, size, lines) {
286
- ctx.fillStyle = C.seal;
287
- ctx.fillRect(x, y, size, size);
288
- ctx.strokeStyle = "rgba(247,241,229,0.6)";
289
- ctx.lineWidth = s(1.5);
290
- ctx.strokeRect(x + s(1.5), y + s(1.5), size - s(3), size - s(3));
291
- ctx.strokeStyle = C.seal;
292
- ctx.lineWidth = s(4);
293
- ctx.strokeRect(x + s(4), y + s(4), size - s(8), size - s(8));
449
+ fillRound(ctx, x, y, size, size, s(SHAPE.extraLarge), C.primary);
294
450
  const fs = s(19);
295
451
  const lh = fs * 1.06;
296
452
  const total = lh * lines.length;
297
453
  let cy = y + size / 2 - total / 2 + lh / 2;
298
454
  for (const line of lines) {
299
- textCenter(ctx, line, x + size / 2, cy, `700 ${fs}px ${FONT_SERIF}`, "#F7F1E5");
455
+ textCenter(ctx, line, x + size / 2, cy, `600 ${fs}px ${FONT_SANS}`, C.onPrimary);
300
456
  cy += lh;
301
457
  }
302
458
  }
@@ -309,14 +465,14 @@ function drawHeader(ctx, innerX, innerY, innerW, sub, right) {
309
465
  const h2 = padTop + sealSize + padBottom;
310
466
  drawSeal(ctx, innerX + padX, innerY + padTop, sealSize, ["词", "意"]);
311
467
  const brandX = innerX + padX + sealSize + s(15);
312
- textLeft(ctx, "词意", brandX, innerY + padTop + s(14), `700 ${s(26)}px ${FONT_SERIF}`, C.ink);
468
+ textLeft(ctx, "词意", brandX, innerY + padTop + s(14), `700 ${s(26)}px ${FONT_SANS}`, C.onSurface);
313
469
  textLeft(
314
470
  ctx,
315
471
  "ci yi",
316
472
  brandX,
317
473
  innerY + padTop + s(36),
318
474
  `italic ${s(10)}px ${FONT_NUM}`,
319
- C.ink3
475
+ C.outline
320
476
  );
321
477
  const subRight = right ? innerX + innerW - padX - s(150) : innerX + innerW - padX;
322
478
  textLeftFit(
@@ -325,23 +481,22 @@ function drawHeader(ctx, innerX, innerY, innerW, sub, right) {
325
481
  brandX,
326
482
  innerY + padTop + s(58),
327
483
  subRight - brandX,
328
- `${s(12.5)}px ${FONT_SERIF}`,
329
- C.ink2
484
+ `${s(12.5)}px ${FONT_SANS}`,
485
+ C.onSurfaceVariant
330
486
  );
331
487
  if (right) {
332
488
  const rx = innerX + innerW - padX;
333
- textRight(ctx, right.big, rx, innerY + padTop + s(16), `700 ${s(31)}px ${FONT_NUM}`, C.seal);
334
- textRight(ctx, right.cap, rx, innerY + padTop + s(44), `${s(10.5)}px ${FONT_SERIF}`, C.ink3);
489
+ textRight(ctx, right.big, rx, innerY + padTop + s(16), `700 ${s(31)}px ${FONT_NUM}`, C.primary);
490
+ textRight(ctx, right.cap, rx, innerY + padTop + s(44), `${s(10.5)}px ${FONT_SANS}`, C.outline);
335
491
  }
336
492
  const lineY = innerY + h2;
337
- ctx.strokeStyle = C.rule;
493
+ ctx.strokeStyle = C.outlineVariant;
338
494
  ctx.lineWidth = s(1);
339
495
  ctx.beginPath();
340
496
  ctx.moveTo(innerX, lineY);
341
497
  ctx.lineTo(innerX + innerW, lineY);
342
498
  ctx.stroke();
343
- ctx.fillStyle = C.seal;
344
- ctx.fillRect(innerX + padX, lineY - s(1), s(54), s(2));
499
+ fillRound(ctx, innerX + padX, lineY - s(1.5), s(54), s(3), s(SHAPE.full), C.primary);
345
500
  return h2;
346
501
  }
347
502
  __name(drawHeader, "drawHeader");
@@ -349,9 +504,17 @@ function drawFooter(ctx, innerX, y, innerW, legendItems, tip) {
349
504
  const padX = s(22);
350
505
  const padY = s(12);
351
506
  const h2 = s(36);
352
- ctx.fillStyle = "rgba(36,31,26,0.022)";
353
- ctx.fillRect(innerX, y, innerW, h2 + padY * 2);
354
- ctx.strokeStyle = C.rule;
507
+ const inset = s(10);
508
+ fillRound(
509
+ ctx,
510
+ innerX + inset,
511
+ y,
512
+ innerW - inset * 2,
513
+ h2 + padY * 2,
514
+ s(SHAPE.large),
515
+ C.surfaceContainerLow
516
+ );
517
+ ctx.strokeStyle = C.outlineVariant;
355
518
  ctx.lineWidth = s(1);
356
519
  ctx.beginPath();
357
520
  ctx.moveTo(innerX, y);
@@ -360,15 +523,14 @@ function drawFooter(ctx, innerX, y, innerW, legendItems, tip) {
360
523
  let lx = innerX + padX;
361
524
  const cy = y + padY + h2 / 2;
362
525
  for (const { tier, range } of legendItems) {
363
- ctx.fillStyle = tier.color;
364
- ctx.fillRect(lx, cy - s(4.5), s(9), s(9));
526
+ fillRound(ctx, lx, cy - s(4.5), s(9), s(9), s(SHAPE.full), tier.color);
365
527
  lx += s(9) + s(6);
366
- textLeft(ctx, tier.name, lx, cy, `${s(11.5)}px ${FONT_SERIF}`, C.ink2);
528
+ textLeft(ctx, tier.name, lx, cy, `${s(11.5)}px ${FONT_SANS}`, C.onSurfaceVariant);
367
529
  lx += textWidth(tier.name, s(11.5)) + s(4);
368
- textLeft(ctx, range, lx, cy, `${s(11)}px ${FONT_NUM}`, C.ink3);
530
+ textLeft(ctx, range, lx, cy, `${s(11)}px ${FONT_NUM}`, C.outline);
369
531
  lx += textWidth(range, s(11)) + s(13);
370
532
  }
371
- const tipFont = `${s(11.5)}px ${FONT_SERIF}`;
533
+ const tipFont = `${s(11.5)}px ${FONT_SANS}`;
372
534
  const maxTipWidth = legendItems.length ? s(145) : innerW - padX * 2;
373
535
  textRight(
374
536
  ctx,
@@ -376,7 +538,7 @@ function drawFooter(ctx, innerX, y, innerW, legendItems, tip) {
376
538
  innerX + innerW - padX,
377
539
  cy,
378
540
  tipFont,
379
- C.ink3
541
+ C.outline
380
542
  );
381
543
  return h2 + padY * 2;
382
544
  }
@@ -388,47 +550,50 @@ function drawLegendFull(ctx, x, y, w) {
388
550
  const t = TIERS[i];
389
551
  const cx = x + i % 2 * colW;
390
552
  const cy = y + Math.floor(i / 2) * rowH;
391
- ctx.fillStyle = t.color;
392
- ctx.fillRect(cx, cy - s(4.5), s(9), s(9));
393
- textLeft(ctx, t.name, cx + s(15), cy, `${s(11.5)}px ${FONT_SERIF}`, C.ink2);
394
- textLeft(ctx, tierRange(i), cx + s(52), cy, `${s(11)}px ${FONT_NUM}`, C.ink3);
395
- textLeft(ctx, t.note, cx + s(100), cy, `${s(11.5)}px ${FONT_SERIF}`, C.ink3);
553
+ fillRound(ctx, cx, cy - s(4.5), s(9), s(9), s(SHAPE.full), t.color);
554
+ textLeft(ctx, t.name, cx + s(15), cy, `${s(11.5)}px ${FONT_SANS}`, C.onSurfaceVariant);
555
+ textLeft(ctx, tierRange(i), cx + s(52), cy, `${s(11)}px ${FONT_NUM}`, C.outline);
556
+ textLeft(ctx, t.note, cx + s(100), cy, `${s(11.5)}px ${FONT_SANS}`, C.outline);
396
557
  }
397
558
  return rowH * Math.ceil(TIERS.length / 2) + s(8);
398
559
  }
399
560
  __name(drawLegendFull, "drawLegendFull");
400
561
  function drawSectionTitle(ctx, x, y, w, title) {
401
- ctx.fillStyle = C.seal;
402
- ctx.fillRect(x, y + s(2), s(6), s(6));
403
- textLeft(ctx, title, x + s(15), y + s(5), `${s(11.5)}px ${FONT_SERIF}`, C.ink2);
562
+ fillRound(ctx, x, y - s(1), s(3), s(12), s(SHAPE.full), C.primary);
563
+ textLeft(ctx, title, x + s(15), y + s(5), `600 ${s(11.5)}px ${FONT_SANS}`, C.onSurfaceVariant);
404
564
  const tw = textWidth(title, s(11.5));
405
- ctx.strokeStyle = C.rule;
565
+ ctx.strokeStyle = C.outlineVariant;
406
566
  ctx.lineWidth = s(1);
407
- ctx.setLineDash([s(3), s(4)]);
408
567
  ctx.beginPath();
409
568
  ctx.moveTo(x + s(15) + tw + s(9), y + s(5));
410
569
  ctx.lineTo(x + w, y + s(5));
411
570
  ctx.stroke();
412
- ctx.setLineDash([]);
413
571
  return s(24);
414
572
  }
415
573
  __name(drawSectionTitle, "drawSectionTitle");
416
574
  function drawPanel(ctx, x, y, w, h2) {
417
- ctx.fillStyle = "rgba(255,255,255,0.34)";
418
- ctx.fillRect(x, y, w, h2);
419
- ctx.strokeStyle = C.rule;
420
- ctx.lineWidth = s(1);
421
- ctx.strokeRect(x + s(0.5), y + s(0.5), w - s(1), h2 - s(1));
575
+ fillRound(ctx, x, y, w, h2, s(SHAPE.large), C.surfaceContainer);
422
576
  }
423
577
  __name(drawPanel, "drawPanel");
424
578
  function drawNearBar(ctx, x, y, pct, tier) {
425
579
  const barW = s(88);
426
- const barH = s(6);
427
- ctx.fillStyle = "rgba(36,31,26,0.09)";
428
- ctx.fillRect(x, y - barH / 2, barW, barH);
429
- ctx.fillStyle = tier.color;
430
- ctx.fillRect(x, y - barH / 2, barW * pct / 100, barH);
431
- textLeft(ctx, tier.name, x + barW + s(9), y, `${s(12.5)}px ${FONT_SERIF}`, tier.color);
580
+ const barH = s(8);
581
+ const gap = s(3);
582
+ const fillW = Math.max(barH, barW * pct / 100);
583
+ const top = y - barH / 2;
584
+ fillRound(ctx, x, top, fillW, barH, barH / 2, tier.color);
585
+ if (fillW + gap < barW) {
586
+ fillRound(
587
+ ctx,
588
+ x + fillW + gap,
589
+ top,
590
+ barW - fillW - gap,
591
+ barH,
592
+ barH / 2,
593
+ C.surfaceContainerHighest
594
+ );
595
+ }
596
+ textLeft(ctx, tier.name, x + barW + s(9), y, `600 ${s(12.5)}px ${FONT_SANS}`, tier.color);
432
597
  }
433
598
  __name(drawNearBar, "drawNearBar");
434
599
  function measureBoard(opts) {
@@ -472,12 +637,12 @@ function drawBoardTable(ctx, x, y, w, opts, rowH) {
472
637
  const mtX = mt0 + Math.max(0, (cols.mt - meterBlockW) / 2);
473
638
  const headY = y;
474
639
  const fs = s(10.5);
475
- textLeft(ctx, "序", noX, headY, `${fs}px ${FONT_SERIF}`, C.ink3);
476
- textCenter(ctx, "更近 ◀", nb0 + cols.nb / 2, headY, `${fs}px ${FONT_SERIF}`, C.ink3);
477
- textCenter(ctx, "猜测", gw0 + cols.gw / 2, headY, `${fs}px ${FONT_SERIF}`, C.ink3);
478
- textCenter(ctx, "▶ 更远", nb1 + cols.nb / 2, headY, `${fs}px ${FONT_SERIF}`, C.ink3);
479
- textCenter(ctx, "排名", rk0 + cols.rk / 2, headY, `${fs}px ${FONT_SERIF}`, C.ink3);
480
- textCenter(ctx, "亲疏", mt0 + cols.mt / 2, headY, `${fs}px ${FONT_SERIF}`, C.ink3);
640
+ textLeft(ctx, "序", noX, headY, `${fs}px ${FONT_SANS}`, C.outline);
641
+ textCenter(ctx, "更近 ◀", nb0 + cols.nb / 2, headY, `${fs}px ${FONT_SANS}`, C.outline);
642
+ textCenter(ctx, "猜测", gw0 + cols.gw / 2, headY, `${fs}px ${FONT_SANS}`, C.outline);
643
+ textCenter(ctx, "▶ 更远", nb1 + cols.nb / 2, headY, `${fs}px ${FONT_SANS}`, C.outline);
644
+ textCenter(ctx, "排名", rk0 + cols.rk / 2, headY, `${fs}px ${FONT_SANS}`, C.outline);
645
+ textCenter(ctx, "亲疏", mt0 + cols.mt / 2, headY, `${fs}px ${FONT_SANS}`, C.outline);
481
646
  let ry = y + s(22);
482
647
  let ordinal = 0;
483
648
  for (const row of opts.rows) {
@@ -488,10 +653,10 @@ function drawBoardTable(ctx, x, y, w, opts, rowH) {
488
653
  `⋯ 另有 ${row.gapBefore} 词未列 ⋯`,
489
654
  cx + tableW / 2,
490
655
  ry + s(10),
491
- `${s(11.5)}px ${FONT_SERIF}`,
492
- C.ink3
656
+ `${s(11.5)}px ${FONT_SANS}`,
657
+ C.outline
493
658
  );
494
- ctx.strokeStyle = C.rule;
659
+ ctx.strokeStyle = C.outlineVariant;
495
660
  ctx.beginPath();
496
661
  ctx.moveTo(cx, ry + s(20));
497
662
  ctx.lineTo(cx + tableW, ry + s(20));
@@ -504,12 +669,10 @@ function drawBoardTable(ctx, x, y, w, opts, rowH) {
504
669
  const pct = nearness(history.rank, opts.total);
505
670
  const midY = ry + rowH / 2;
506
671
  if (fresh) {
507
- ctx.fillStyle = C.fresh;
508
- ctx.fillRect(cx, ry, tableW, rowH);
509
- ctx.fillStyle = C.seal;
510
- ctx.fillRect(cx, ry, accentW, rowH);
672
+ fillRound(ctx, cx, ry, tableW, rowH, s(SHAPE.medium), FRESH);
673
+ fillRound(ctx, cx, ry + s(4), accentW, rowH - s(8), s(SHAPE.full), C.primary);
511
674
  }
512
- ctx.strokeStyle = ordinal === 1 ? C.ruleDark : C.rule;
675
+ ctx.strokeStyle = ordinal === 1 ? C.outline : C.outlineVariant;
513
676
  ctx.lineWidth = s(1);
514
677
  ctx.beginPath();
515
678
  ctx.moveTo(cx, ry);
@@ -521,7 +684,7 @@ function drawBoardTable(ctx, x, y, w, opts, rowH) {
521
684
  noX,
522
685
  midY,
523
686
  `${s(13)}px ${FONT_NUM}`,
524
- C.ink3
687
+ C.outline
525
688
  );
526
689
  const nbX = nb0 + (cols.nb - gridWidth(history.leftHint, "sm")) / 2;
527
690
  drawWordGrid(ctx, nbX, midY - s(13), history.leftHint, "sm", 0);
@@ -535,7 +698,7 @@ function drawBoardTable(ctx, x, y, w, opts, rowH) {
535
698
  const hashW = textWidth("#", s(13));
536
699
  const rankBlock = hashW + s(3) + rankWidth;
537
700
  const rankLeft = rk0 + (cols.rk - rankBlock) / 2;
538
- textLeft(ctx, "#", rankLeft, midY, `${s(13)}px ${FONT_NUM}`, C.ink3);
701
+ textLeft(ctx, "#", rankLeft, midY, `${s(13)}px ${FONT_NUM}`, C.outline);
539
702
  textLeft(ctx, rankText, rankLeft + hashW + s(3), midY, rankFont, tier.color);
540
703
  drawNearBar(ctx, mtX, midY, pct, tier);
541
704
  ry += rowH;
@@ -577,31 +740,31 @@ function renderIntroCard(service, opts) {
577
740
  y += s(11);
578
741
  const p1h = s(104);
579
742
  drawPanel(ctx, ix + s(22), y, iw - s(44), p1h);
580
- textLeft(ctx, "开始", ix + s(38), y + s(24), `${s(14)}px ${FONT_SERIF}`, C.seal);
581
- textLeft(ctx, "ciyi.猜 山水", ix + s(96), y + s(24), `${s(13.5)}px ${FONT_NUM}`, C.ink);
743
+ textLeft(ctx, "开始", ix + s(38), y + s(24), `${s(14)}px ${FONT_SANS}`, C.primary);
744
+ textLeft(ctx, "ciyi.猜 山水", ix + s(96), y + s(24), `${s(13.5)}px ${FONT_NUM}`, C.onSurface);
582
745
  textLeftFit(
583
746
  ctx,
584
747
  `开题并报一个两字词${opts.middleware ? ";开题后可直接发词" : ""}`,
585
748
  ix + s(230),
586
749
  y + s(24),
587
750
  iw - s(268),
588
- `${s(14)}px ${FONT_SERIF}`,
589
- C.ink
751
+ `${s(14)}px ${FONT_SANS}`,
752
+ C.onSurface
590
753
  );
591
- textLeft(ctx, "切换", ix + s(38), y + s(52), `${s(14)}px ${FONT_SERIF}`, C.seal);
592
- textLeft(ctx, "ciyi.裸词 开/关", ix + s(96), y + s(52), `${s(13.5)}px ${FONT_NUM}`, C.ink);
754
+ textLeft(ctx, "切换", ix + s(38), y + s(52), `${s(14)}px ${FONT_SANS}`, C.primary);
755
+ textLeft(ctx, "ciyi.裸词 开/关", ix + s(96), y + s(52), `${s(13.5)}px ${FONT_NUM}`, C.onSurface);
593
756
  textLeftFit(
594
757
  ctx,
595
758
  "临时改本群的续猜方式",
596
759
  ix + s(230),
597
760
  y + s(52),
598
761
  iw - s(268),
599
- `${s(14)}px ${FONT_SERIF}`,
600
- C.ink
762
+ `${s(14)}px ${FONT_SANS}`,
763
+ C.onSurface
601
764
  );
602
- textLeft(ctx, "排行", ix + s(38), y + s(80), `${s(14)}px ${FONT_SERIF}`, C.seal);
603
- textLeft(ctx, "ciyi.排行榜", ix + s(96), y + s(80), `${s(13.5)}px ${FONT_NUM}`, C.ink);
604
- textLeft(ctx, "看谁猜中得最多", ix + s(230), y + s(80), `${s(14)}px ${FONT_SERIF}`, C.ink);
765
+ textLeft(ctx, "排行", ix + s(38), y + s(80), `${s(14)}px ${FONT_SANS}`, C.primary);
766
+ textLeft(ctx, "ciyi.排行榜", ix + s(96), y + s(80), `${s(13.5)}px ${FONT_NUM}`, C.onSurface);
767
+ textLeft(ctx, "看谁猜中得最多", ix + s(230), y + s(80), `${s(14)}px ${FONT_SANS}`, C.onSurface);
605
768
  y += p1h + s(19);
606
769
  y += drawSectionTitle(ctx, ix + s(22), y, iw - s(44), "读板");
607
770
  y += s(11);
@@ -625,24 +788,24 @@ function renderIntroCard(service, opts) {
625
788
  "这一行是说:「企业」与今日答案的意思相近程度,排在第 467 位。",
626
789
  ix + s(38),
627
790
  y + s(104),
628
- `${s(12)}px ${FONT_SERIF}`,
629
- C.ink3
791
+ `${s(12)}px ${FONT_SANS}`,
792
+ C.outline
630
793
  );
631
794
  textLeft(
632
795
  ctx,
633
796
  "两侧空格各藏一字:左邻更近,右邻更远。",
634
797
  ix + s(38),
635
798
  y + s(126),
636
- `${s(12)}px ${FONT_SERIF}`,
637
- C.ink3
799
+ `${s(12)}px ${FONT_SANS}`,
800
+ C.outline
638
801
  );
639
802
  textLeft(
640
803
  ctx,
641
804
  "名次越小,离答案越近;#1 就是答案本身。",
642
805
  ix + s(38),
643
806
  y + s(148),
644
- `${s(12)}px ${FONT_SERIF}`,
645
- C.ink2
807
+ `${s(12)}px ${FONT_SANS}`,
808
+ C.onSurfaceVariant
646
809
  );
647
810
  y += sampleH + s(19);
648
811
  y += drawSectionTitle(ctx, ix + s(22), y, iw - s(44), "亲疏");
@@ -664,8 +827,8 @@ function renderIntroCard(service, opts) {
664
827
  "一日一词,猜中即止,次日零点换题",
665
828
  ix + s(22),
666
829
  iy + ih - s(30),
667
- `${s(11.5)}px ${FONT_SERIF}`,
668
- C.ink3
830
+ `${s(11.5)}px ${FONT_SANS}`,
831
+ C.outline
669
832
  );
670
833
  });
671
834
  }
@@ -679,14 +842,14 @@ function renderWinCard(service, opts) {
679
842
  const revealH = s(130);
680
843
  drawPanel(ctx, ix + s(22), y, iw - s(44), revealH);
681
844
  drawSeal(ctx, ix + iw - s(80), y - s(13), s(42), ["中"]);
682
- textLeft(ctx, "今日答案", ix + s(38), y + s(24), `${s(11.5)}px ${FONT_SERIF}`, C.ink3);
845
+ textLeft(ctx, "今日答案", ix + s(38), y + s(24), `${s(11.5)}px ${FONT_SANS}`, C.outline);
683
846
  drawWordGrid(ctx, ix + s(38), y + s(40), opts.answer, "lg");
684
847
  const ax = ix + iw - s(310);
685
848
  if (opts.neighbors.length) {
686
- textLeft(ctx, "意思最近的几个词", ax, y + s(24), `${s(11.5)}px ${FONT_SERIF}`, C.ink3);
849
+ textLeft(ctx, "意思最近的几个词", ax, y + s(24), `${s(11.5)}px ${FONT_SANS}`, C.outline);
687
850
  let nx = ax;
688
851
  let ny = y + s(48);
689
- const chipFont = `${s(14)}px ${FONT_SERIF}`;
852
+ const chipFont = `${s(14)}px ${FONT_SANS}`;
690
853
  const chipRight = ix + iw - s(38);
691
854
  for (const word of opts.neighbors) {
692
855
  const fittedWord = ellipsize(word, s(116), s(14));
@@ -696,15 +859,20 @@ function renderWinCard(service, opts) {
696
859
  ny += s(36);
697
860
  }
698
861
  if (ny + s(14) > y + revealH - s(12)) break;
699
- ctx.fillStyle = "rgba(255,255,255,0.55)";
700
- ctx.fillRect(nx, ny - s(14), pw, s(28));
701
- ctx.strokeStyle = C.rule;
702
- ctx.strokeRect(nx + s(0.5), ny - s(14) + s(0.5), pw - s(1), s(28) - s(1));
703
- textCenter(ctx, fittedWord, nx + pw / 2, ny, chipFont, C.ink, cjkOffset(s(14)));
862
+ fillRound(ctx, nx, ny - s(14), pw, s(28), s(SHAPE.full), SCHEME.secondaryContainer);
863
+ textCenter(
864
+ ctx,
865
+ fittedWord,
866
+ nx + pw / 2,
867
+ ny,
868
+ chipFont,
869
+ SCHEME.onSecondaryContainer,
870
+ cjkOffset(s(14))
871
+ );
704
872
  nx += pw + s(7);
705
873
  }
706
874
  } else {
707
- textLeft(ctx, "今日一词,就此收笔。", ax, y + s(50), `${s(13.5)}px ${FONT_SERIF}`, C.ink2);
875
+ textLeft(ctx, "今日一词,就此收笔。", ax, y + s(50), `${s(13.5)}px ${FONT_SANS}`, C.onSurfaceVariant);
708
876
  }
709
877
  y += revealH + s(14);
710
878
  const statW = (iw - s(44) - s(20)) / 3;
@@ -716,11 +884,11 @@ function renderWinCard(service, opts) {
716
884
  for (let i = 0; i < 3; i++) {
717
885
  const sx = ix + s(22) + i * (statW + s(10));
718
886
  drawPanel(ctx, sx, y, statW, s(56));
719
- textLeft(ctx, stats[i].n, sx + s(14), y + s(22), `700 ${s(23)}px ${FONT_NUM}`, C.seal);
887
+ textLeft(ctx, stats[i].n, sx + s(14), y + s(22), `700 ${s(23)}px ${FONT_NUM}`, C.primary);
720
888
  if (stats[i].u) {
721
- textLeft(ctx, stats[i].u, sx + s(14) + textWidth(stats[i].n, s(23)) + s(3), y + s(26), `${s(12)}px ${FONT_SERIF}`, C.ink2);
889
+ textLeft(ctx, stats[i].u, sx + s(14) + textWidth(stats[i].n, s(23)) + s(3), y + s(26), `${s(12)}px ${FONT_SANS}`, C.onSurfaceVariant);
722
890
  }
723
- textLeft(ctx, stats[i].c, sx + s(14), y + s(44), `${s(10.5)}px ${FONT_SERIF}`, C.ink3);
891
+ textLeft(ctx, stats[i].c, sx + s(14), y + s(44), `${s(10.5)}px ${FONT_SANS}`, C.outline);
724
892
  }
725
893
  const quip = opts.closest === null ? "一击即中,今日无需第二次落笔" : `从 #${opts.closest} 一步跨到 #1`;
726
894
  const footerTip = opts.canStartToday ? "ciyi.猜 山水 · 开启今日新题" : "明日零点换新题 · ciyi.排行榜";
@@ -732,7 +900,7 @@ function renderWinCard(service, opts) {
732
900
  [],
733
901
  footerTip
734
902
  );
735
- const footerFont = `${s(11.5)}px ${FONT_SERIF}`;
903
+ const footerFont = `${s(11.5)}px ${FONT_SANS}`;
736
904
  const footerTipWidth = textWidth(footerTip, s(11.5));
737
905
  textLeftFit(
738
906
  ctx,
@@ -741,7 +909,7 @@ function renderWinCard(service, opts) {
741
909
  iy + ih - s(30),
742
910
  iw - s(62) - footerTipWidth,
743
911
  footerFont,
744
- C.ink2
912
+ C.onSurfaceVariant
745
913
  );
746
914
  });
747
915
  }
@@ -776,16 +944,16 @@ function renderRankCard(service, opts) {
776
944
  "榜上无名。",
777
945
  panelX + panelW / 2,
778
946
  y + s(31),
779
- `${s(13.5)}px ${FONT_SERIF}`,
780
- C.ink3
947
+ `${s(13.5)}px ${FONT_SANS}`,
948
+ C.outline
781
949
  );
782
950
  textCenter(
783
951
  ctx,
784
952
  "今日第一个猜中的人,会写在这里。",
785
953
  panelX + panelW / 2,
786
954
  y + s(61),
787
- `${s(13.5)}px ${FONT_SERIF}`,
788
- C.ink3
955
+ `${s(13.5)}px ${FONT_SANS}`,
956
+ C.outline
789
957
  );
790
958
  } else {
791
959
  let ry = y;
@@ -793,11 +961,10 @@ function renderRankCard(service, opts) {
793
961
  const e = opts.entries[i];
794
962
  const midY = ry + rowH / 2;
795
963
  if (e.me) {
796
- ctx.fillStyle = "rgba(178,58,46,0.055)";
797
- ctx.fillRect(panelX, ry, panelW, rowH);
964
+ fillRound(ctx, panelX, ry, panelW, rowH, s(SHAPE.medium), FRESH);
798
965
  }
799
966
  if (i > 0) {
800
- ctx.strokeStyle = C.rule;
967
+ ctx.strokeStyle = C.outlineVariant;
801
968
  ctx.beginPath();
802
969
  ctx.moveTo(contentLeft, ry);
803
970
  ctx.lineTo(contentRight, ry);
@@ -806,20 +973,13 @@ function renderRankCard(service, opts) {
806
973
  const posSize = s(30);
807
974
  const px = contentLeft;
808
975
  const py = midY - posSize / 2;
809
- const posColors = [
810
- { bg: C.seal, fg: "#F7F1E5", border: C.seal },
811
- { bg: "#4A5470", fg: "#F7F1E5", border: "#4A5470" },
812
- { bg: "#9C7B4B", fg: "#F7F1E5", border: "#9C7B4B" }
813
- ];
814
- const pc = i < 3 ? posColors[i] : { bg: "rgba(255,255,255,0.4)", fg: C.ink2, border: C.rule };
815
- ctx.fillStyle = pc.bg;
816
- ctx.fillRect(px, py, posSize, posSize);
817
- ctx.strokeStyle = pc.border;
818
- ctx.strokeRect(px + s(0.5), py + s(0.5), posSize - s(1), posSize - s(1));
819
- textCenter(ctx, String(i + 1), px + posSize / 2, midY, `700 ${s(14)}px ${FONT_NUM}`, pc.fg);
976
+ const podium = [MEDAL.gold, MEDAL.silver, MEDAL.bronze];
977
+ const pc = i < 3 ? { bg: podium[i], fg: "#ffffff" } : { bg: C.surfaceContainerHighest, fg: C.onSurfaceVariant };
978
+ fillRound(ctx, px, py, posSize, posSize, s(SHAPE.full), pc.bg);
979
+ textCenter(ctx, String(i + 1), px + posSize / 2, midY, `600 ${s(14)}px ${FONT_NUM}`, pc.fg);
820
980
  const name2 = e.username || "无名氏";
821
981
  const nameX = px + posSize + s(14);
822
- const nameFont = `${s(15)}px ${FONT_SERIF}`;
982
+ const nameFont = `${s(15)}px ${FONT_SANS}`;
823
983
  const score = String(e.score);
824
984
  const unitFont = s(11.5);
825
985
  const unitW = textWidth("次", unitFont);
@@ -832,10 +992,10 @@ function renderRankCard(service, opts) {
832
992
  Math.max(0, scoreLeft - s(16) - nameX - meWidth),
833
993
  s(15)
834
994
  );
835
- textLeft(ctx, fittedName, nameX, midY, nameFont, C.ink);
995
+ textLeft(ctx, fittedName, nameX, midY, nameFont, C.onSurface);
836
996
  if (e.me) {
837
997
  const nw = textWidth(fittedName, s(15));
838
- textLeft(ctx, "我", nameX + nw + s(8), midY, `${s(10.5)}px ${FONT_SERIF}`, C.seal);
998
+ textLeft(ctx, "我", nameX + nw + s(8), midY, `${s(10.5)}px ${FONT_SANS}`, C.primary);
839
999
  }
840
1000
  textRight(
841
1001
  ctx,
@@ -843,9 +1003,9 @@ function renderRankCard(service, opts) {
843
1003
  scoreRight,
844
1004
  midY,
845
1005
  `700 ${scoreFont}px ${FONT_NUM}`,
846
- C.ink
1006
+ C.onSurface
847
1007
  );
848
- textRight(ctx, "次", contentRight, midY, `${unitFont}px ${FONT_SERIF}`, C.ink3);
1008
+ textRight(ctx, "次", contentRight, midY, `${unitFont}px ${FONT_SANS}`, C.outline);
849
1009
  ry += rowH;
850
1010
  }
851
1011
  if (opts.hidden > 0) {
@@ -854,8 +1014,8 @@ function renderRankCard(service, opts) {
854
1014
  `⋯ 另有 ${opts.hidden} 人在榜`,
855
1015
  contentLeft,
856
1016
  ry + s(16),
857
- `${s(11.5)}px ${FONT_SERIF}`,
858
- C.ink3
1017
+ `${s(11.5)}px ${FONT_SANS}`,
1018
+ C.outline
859
1019
  );
860
1020
  }
861
1021
  }
@@ -872,8 +1032,8 @@ function renderRankCard(service, opts) {
872
1032
  "每猜中一日之词,记一次",
873
1033
  panelX,
874
1034
  iy + ih - s(30),
875
- `${s(11.5)}px ${FONT_SERIF}`,
876
- C.ink3
1035
+ `${s(11.5)}px ${FONT_SANS}`,
1036
+ C.outline
877
1037
  );
878
1038
  });
879
1039
  }