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.
- package/lib/index.js +373 -213
- package/lib/m3.d.ts +256 -0
- 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:
|
|
44
|
-
{ max: 50, name: "毗邻", color:
|
|
45
|
-
{ max: 200, name: "相近", color:
|
|
46
|
-
{ max: 1e3, name: "沾边", color:
|
|
47
|
-
{ max: 5e3, name: "疏远", color:
|
|
48
|
-
{ max: Infinity, name: "天涯", color:
|
|
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
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
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
|
|
78
|
-
var
|
|
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
|
|
156
|
-
ctx.
|
|
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(
|
|
362
|
+
__name(drawCard, "drawCard");
|
|
178
363
|
async function toPng(service, innerW, innerH, draw) {
|
|
179
|
-
const
|
|
180
|
-
const
|
|
181
|
-
const
|
|
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.
|
|
370
|
+
ctx.fillStyle = C.surface;
|
|
189
371
|
ctx.fillRect(0, 0, canvasW, canvasH);
|
|
190
|
-
|
|
191
|
-
|
|
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
|
|
227
|
-
ctx.
|
|
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
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
ctx.
|
|
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
|
|
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 ${
|
|
258
|
-
C.
|
|
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 ${
|
|
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.
|
|
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, `
|
|
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 ${
|
|
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.
|
|
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 ${
|
|
329
|
-
C.
|
|
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.
|
|
334
|
-
textRight(ctx, right.cap, rx, innerY + padTop + s(44), `${s(10.5)}px ${
|
|
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.
|
|
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.
|
|
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
|
-
|
|
353
|
-
|
|
354
|
-
|
|
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.
|
|
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 ${
|
|
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.
|
|
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 ${
|
|
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.
|
|
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.
|
|
392
|
-
ctx.
|
|
393
|
-
textLeft(ctx,
|
|
394
|
-
textLeft(ctx,
|
|
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.
|
|
402
|
-
ctx
|
|
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.
|
|
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
|
|
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(
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
ctx
|
|
431
|
-
|
|
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 ${
|
|
476
|
-
textCenter(ctx, "更近 ◀", nb0 + cols.nb / 2, headY, `${fs}px ${
|
|
477
|
-
textCenter(ctx, "猜测", gw0 + cols.gw / 2, headY, `${fs}px ${
|
|
478
|
-
textCenter(ctx, "▶ 更远", nb1 + cols.nb / 2, headY, `${fs}px ${
|
|
479
|
-
textCenter(ctx, "排名", rk0 + cols.rk / 2, headY, `${fs}px ${
|
|
480
|
-
textCenter(ctx, "亲疏", mt0 + cols.mt / 2, headY, `${fs}px ${
|
|
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 ${
|
|
492
|
-
C.
|
|
656
|
+
`${s(11.5)}px ${FONT_SANS}`,
|
|
657
|
+
C.outline
|
|
493
658
|
);
|
|
494
|
-
ctx.strokeStyle = C.
|
|
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
|
|
508
|
-
ctx
|
|
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.
|
|
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.
|
|
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.
|
|
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 ${
|
|
581
|
-
textLeft(ctx, "ciyi.猜 山水", ix + s(96), y + s(24), `${s(13.5)}px ${FONT_NUM}`, C.
|
|
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 ${
|
|
589
|
-
C.
|
|
751
|
+
`${s(14)}px ${FONT_SANS}`,
|
|
752
|
+
C.onSurface
|
|
590
753
|
);
|
|
591
|
-
textLeft(ctx, "切换", ix + s(38), y + s(52), `${s(14)}px ${
|
|
592
|
-
textLeft(ctx, "ciyi.裸词 开/关", ix + s(96), y + s(52), `${s(13.5)}px ${FONT_NUM}`, C.
|
|
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 ${
|
|
600
|
-
C.
|
|
762
|
+
`${s(14)}px ${FONT_SANS}`,
|
|
763
|
+
C.onSurface
|
|
601
764
|
);
|
|
602
|
-
textLeft(ctx, "排行", ix + s(38), y + s(80), `${s(14)}px ${
|
|
603
|
-
textLeft(ctx, "ciyi.排行榜", ix + s(96), y + s(80), `${s(13.5)}px ${FONT_NUM}`, C.
|
|
604
|
-
textLeft(ctx, "看谁猜中得最多", ix + s(230), y + s(80), `${s(14)}px ${
|
|
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 ${
|
|
629
|
-
C.
|
|
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 ${
|
|
637
|
-
C.
|
|
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 ${
|
|
645
|
-
C.
|
|
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 ${
|
|
668
|
-
C.
|
|
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 ${
|
|
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 ${
|
|
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 ${
|
|
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
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
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 ${
|
|
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.
|
|
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 ${
|
|
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 ${
|
|
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 ${
|
|
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.
|
|
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 ${
|
|
780
|
-
C.
|
|
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 ${
|
|
788
|
-
C.
|
|
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
|
|
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.
|
|
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
|
|
810
|
-
|
|
811
|
-
|
|
812
|
-
|
|
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 ${
|
|
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.
|
|
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 ${
|
|
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.
|
|
1006
|
+
C.onSurface
|
|
847
1007
|
);
|
|
848
|
-
textRight(ctx, "次", contentRight, midY, `${unitFont}px ${
|
|
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 ${
|
|
858
|
-
C.
|
|
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 ${
|
|
876
|
-
C.
|
|
1035
|
+
`${s(11.5)}px ${FONT_SANS}`,
|
|
1036
|
+
C.outline
|
|
877
1037
|
);
|
|
878
1038
|
});
|
|
879
1039
|
}
|