/*
【2026-06-15 05:50:52 +08:00】-1.视频生成后可在页面预览播放 2.参考剪映那种方式，制作几套模版，包括转场。画面滤镜，场景编排等配置 3.模型生成的视频镜头太近了，只能看到一部分晶形，清晰度也不够
----------------------------------------------------
【2026-06-14 21:48:13 +08:00】-入口改为矿物详情页添加按钮，之后矿物信息和矿物模型视频直接带出，不需要用户选择或者上传；我的里面改为查看生成的视频历史列表
----------------------------------------------------
【2026-06-14 07:26:48 +08:00】-我想开发一个功能，用户上传自己的多张矿物，然后我通过引用矿物相关信息，模型视频，帮用户生成一段视频下载，用户可以把视频上传抖音等社交平台
[2026-06-03 17:34:08 +08:00]-按这个思路实现吧；注意PC端和M端的兼容性
【2026-06-03 16:10:00 +08:00】-1、每页多少个放到页码处 2、每个列表都是按更新时间倒序排列 3、状态类筛选都默认待处理，待审核这种需要优先处理的选项 4、页码处添加输入页码直接跳转的控件，还有跳到最后一页的按钮 5、用户列表增加查看、封禁、私信；C端在我的页快捷入口增加官方消息信封和未读红点
----------------------------------------------------
【2026-06-03 15:19:00 +08:00】-后台也拆成PC，M两套样式方式，参考前台的样式切换逻辑，PC端样式按附件中的样式改版，菜单区，工具栏区，筛选区，列表区，列表操作区，使用开源的标准样式模版最好
----------------------------------------------------
【2026-06-03 11:05:00 +08:00】-1、隐藏矿物信息中的这些字段 2、查看化学式中的乱码情况，使用标准的化学式展示方法，比如上标，下标等 3、看下还是英文显示的描述文本，为什么没有汉化
----------------------------------------------------
【2026-06-03 09:53:49 +08:00】-1、如附件，将第一个模型详情中的矿物信息挪到第二个图的位置，默认按钮收起状态，但是晶型相关的信息还保留在原来页面，展开显示即可
----------------------------------------------------
【2026-06-02 10:21:03 +08:00】--------------------------------------------
1、这个GIF按钮隐藏掉
2、整体工具栏置顶跟模型画布区上沿对齐
3、生成的视频左上角打上矿物中文名/矿物英文名
----------------------------------------------------
【2026-05-31 20:56:51 +08:00】--------------------------------------------
晶库拥有按钮、字母索引滑动、PC/M单图头图、页脚政策按钮同排、资料审核列表样式。
----------------------------------------------------
[2026-05-28 18:01:00 +08:00]-1、锁头小一点，变成现在的一半，更靠近左上角
2、每个页面改成不同的url,刷新页面时刷新本页面，而不是回到首页
[2026-05-28 17:51:19 +08:00]-天梯赛未解锁状态那个白叉叉也太丑了，如果锁链效果不好做，做成左上角一个小锁的图表吧
[2026-05-28 00:00:00 +08:00]-天梯赛，10连斩，5连斩，20连斩，如果没有解锁，变成黑白的，有一个锁链交叉锁住的效果，解锁后变成现在彩色的样子
[2026-05-27 17:12:26 +08:00]-首先在列表页对正文没有做内容限制，只展示2行，多出来的用...隐藏调
[2026-05-22 09:20:00 +08:00]-这块还是有一个很生硬的突出
[2026-05-21 18:18:00 +08:00]-首页左上角的logo，感觉跟整个这一行有些突出，而且有色差，出个方案解决这个问题
[2026-05-21 18:04:00 +08:00]-整体图片不能被拉伸，图片可以展示不全，但是不要出现图片覆盖不到的区域；滑块划到缺失位时，跟周围的图片要能拼接上
[2026-05-21 17:35:00 +08:00]-滑块上的图片跟背景图片可能比例不一致，拖过去后，整体图片错位了
[2026-05-21 16:36:00 +08:00]-机器人验证滑块背景太丑了，取几张矿图作为随机切换的背景吧
[2026-05-21 15:50:00 +08:00]-星空图做成无法点击
[2026-05-21 15:30:00 +08:00]-还是糊在一起，我的目的是让用户进来能够一眼看到自己在全量矿里面拥有了哪些
[2026-05-21 15:08:00 +08:00]-这个点半径太大了，就几个像素就行，小方块吧，可以借鉴第二张图的例子
[2026-05-21 15:05:00 +08:00]-这个圆形也太大了，用那种密集的小点阵就可以，要在我框出来的区域展示代表所有矿物的5223个点
[2026-05-21 14:45:00 +08:00]-如果是查看全部状态，下面添加一个切换开关：矿盒/星空图；切换按钮放在标注位置；星空图全量矿物等距点，未拥有灰色，拥有蓝色，头图金色
[2026-05-21 14:24:00 +08:00]-菜单栏还是折行了，下面矿盒间间距太大了，紧贴这就好了
[2026-05-21 14:11:00 +08:00]-我的矿柜要加一个懒加载，只显示当前视图的矿盒，后面的下拉再刷新
[2026-05-21 12:05:00 +08:00]-问题1：新加的tab让横向菜单栏这行了，这个要在一行里面；2、矿盒太宽了，变窄一点，比字宽一点就可以，这样能多看一点；3、从其他测试账户中，洗给45449350@qq.com100张矿图，5张头图，我用来测试
README
【2026-05-27 22:04:51 +08:00】--------------------------------------------
针对不满足的地方进行整改，整改完直接上线
----------------------------------------------------
[2026-05-21 11:20:44 +08:00]-头图的标识为金色发光表示，左上角有金黄色头图字样，点击我拥有的按钮，头图置顶显示
[2026-05-21 11:11:15 +08:00]-PLEASE IMPLEMENT THIS PLAN: 我的矿柜实施计划，在我的主页新增“我的矿柜”tab，后端新增GET /api/my/mineral-cabinet，按已审核跟图点亮矿物并支持矿物墙展示。
[2026-05-20 18:08:00 +08:00]-帖子正文，上面显示图片，多张的话可以左右移动，正文在下面显示
[2026-05-20 18:05:00 +08:00]-附件1问题：列表展示时，标题限制显示两行，正文限制显示两行，超出的用...省略 附件2问题：不要用浮层，直接打开现页面，按照开发设计规范，左上角添加返回按钮 留言如果没有，后面不要na,改为留言条数0
[2026-05-20 17:25:00 +08:00]-1、晶体图片j计数说明提到晶体模型计数上面 2、晶体模型和晶体图片假如是0个则不显示该行说明 3、隐藏截图中显示的图片模块 4、将晒图按钮和下面的晒图列表提到矿物页面，放在模型列表下面，一个晒矿按钮，下面是图片列表
[2026-05-20 16:20:00 +08:00]-用户跟图模块修改一下样式 每一行一个图片，昨天是图片的缩略图，右边对应两行，上面是上传者的头像和昵称，下面是上传时间，点击图片弹出图片查看插件，同时显示图片的详细信息，上传者、产地、备注信息 点击用户调到上传者的主页，点击产地无反应 图片按上传时间升序，越早的越在上面，第一报名在图片左上角加上金色角标，角标中有1的标识，第二名银色角标，中间有2的标识，第三名灰色角标，有3的标识
【2026-05-18 18:25:00 +08:00】-我的里面新增修改密码菜单，填写老密码，两次确认新密码，点击报错提交
[2026-05-18 18:12:00 +08:00]-机器人识别模块现在没有背景图，要有一些干扰背景图
【2026-05-18 18:05:00 +08:00】-刚进首页会加载一个其他页面，然后才出首页，这个改成鱼骨图加在
【2026-05-18 15:46:32 +08:00】-1、对代码进行安全扫描 2、反爬虫 3、后台管理都添加分页逻辑、列表上面添加筛选条件
[2026-05-18 14:49:54 +08:00]-按你的组合方案来吧
[2026-05-18 10:29:00 +08:00]-PC端天梯赛模型展示模块，一大块白色
【2026-05-15 17:43:21 +08:00】-请按照m端的所有功能，补全PC端的功能；PC端实现M端所有功能，并按照PC端开发设计标准重新设计适合PC端的交互方式。
[2026-05-15 16:50:00 +08:00]-注册改成仅支持邮箱注册，邮箱登录；邮箱注册时发送验证码，验证码通过可以注册；注册不要直接展开，登录页面下面有注册和忘记密码两个按钮；忘记密码通过邮箱验证码修改密码；登录、注册、忘记密码都做成全屏页面。
[2026-05-15 16:25:36 +08:00]-页面统计使用中文名，不要用英文
[2026-05-15 16:24:11 +08:00]-M端和PC端分开统计
[2026-05-15 15:09:55 +08:00]-每个矿物模型下面为什么只有一张矿物晒图，是进行了截断么，我要展示该矿物的所有图片；没有模型的矿物，如果有图片，也要展示
[2026-05-15 14:31:30 +08:00]-帮我设计一套埋点方案，要求能够分析用户行为、页面热度、漏斗、桑基等分析功能、并在后台添加一个用户行为分析页面
[2026-05-12 17:30:00 +08:00]-PLEASE IMPLEMENT THIS PLAN: 晶库展示全部矿物、晶库搜索和字母索引、矿物图片迁移到晒矿、详情工具栏固定、全屏登录/微信注册、备案悬挂。
----------------------------------------------------
【2026-05-09 16:10:00 +08:00】-矿物列表增加标签，本矿物晶型来源,如果是多个来源则用/隔开
----------------------------------------------------
【2026-05-09 15:30:00 +08:00】-模型详情数据加载失败
----------------------------------------------------
【2026-05-09 15:20:00 +08:00】-测试页面，模型下方平铺矿物images_json中的图片链接，图片要符合图片预览插件
----------------------------------------------------
【2026-05-09 10:45:00 +08:00】-------------------------------------------
不替换社区了，在我的里面添加一行用来测试这个新功能吧
----------------------------------------------------
【2026-05-06 18:04:39 +08:00】--------------------------------------------
没有关注按钮
----------------------------------------------------
【2026-05-06 17:16:45 +08:00】--------------------------------------------
用户首页头像右侧添加关注按钮，关注后变成取消关注，点击取消关注变成关注
----------------------------------------------------
【2026-05-06 17:02:40 +08:00】--------------------------------------------
用户主页增加
获赞、关注、粉丝
搜索里面添加搜索用户逻辑，搜网名可以调到用户主页
----------------------------------------------------
【2026-05-06 16:23:45 +08:00】--------------------------------------------
去掉首图下面的矿物名称，上传者和产地前面都添加说明比如上传者：阔海，产地：广州
改完直接上线
----------------------------------------------------
【2026-05-06 16:07:15 +08:00】--------------------------------------------
首图下面的3条信息空间被首图遮盖了一点
切换tab后的页面没有置顶
点击首图下面的上传者，直接跳到我的里面的主页按钮一样的页面就可以，不需要跳到一个新页面
后台设为头图点击报错
----------------------------------------------------
【2026-05-06 15:41:34 +08:00】--------------------------------------------
没有用完一整行的空间，而3个信息还是挤在一起，而且点击上传者，还是没有跳转到上传者主页
----------------------------------------------------
【2026-05-06 15:37:03 +08:00】--------------------------------------------
上传者、矿物名称、产地可以占满一整行顺排，如果显示不了隐藏超过1/3一长度的那一列、
现在点击上传者还是没有跳转到上传者主页，请修复
----------------------------------------------------
【2026-05-06 15:31:34 +08:00】--------------------------------------------
首图下面的信息折行了，要在一行展示，点击上传者也没有跳转到上传者主页
----------------------------------------------------
【2026-05-06 15:23:21 +08:00】--------------------------------------------
头图还是不能点击预览，头图下面添加一行上传者、矿物名称，矿物产地的信息模块，点击上传者进入上传者主页、点击矿物名称进入晶型详情页
----------------------------------------------------
【2026-05-06 15:16:48 +08:00】--------------------------------------------
图片预览，退出按钮折行，图片可以通过双指放大缩小，放大后，右下角加入可视区域预览小缩略图，并可通过拖动移动可视区域放大观察图片。
这个图片预览写入交互标准，头图、帖子里面的图片，晒图都使用此交互
----------------------------------------------------
【2026-05-06 15:08:57 +08:00】--------------------------------------------
所有图片都可以通过点击全屏展示，并且可以通过按钮退出，练习模式增加退出按钮
----------------------------------------------------
【2026-05-06 15:04:30 +08:00】--------------------------------------------
矿物晒图要切换到晶型维度，在哪一个晶型上传的图片，只在这一个晶型展示
----------------------------------------------------
【2026-05-06 14:50:22 +08:00】--------------------------------------------
晒矿图是挂在晶型下面的不是挂在矿物维度下面的
晶体被拖动后也会自动继续选择，现在是拖动模型后，模型就不自己转动了
游戏模式下用户需要拖动才能看到所有选项和按钮，这个要改成用户不需要滑动就能看到所有内容
按照M段的逻辑编写PC段交互方案，并实施
----------------------------------------------------
【2026-05-06 14:36:37 +08:00】--------------------------------------------
游戏模式现在需要下滑才能看到所有选项，这里不要让用户下滑就能看到页面所有内容
----------------------------------------------------
【2026-05-06 14:32:50 +08:00】--------------------------------------------
天梯游戏，点击进去黑屏了
----------------------------------------------------
【2026-05-06 14:24:30 +08:00】--------------------------------------------
backend/doc/m端交互方案
补到文档，并且按这个方案实施
----------------------------------------------------
【2026-05-06 14:14:09 +08:00】--------------------------------------------
只是修改交互和样式，不要改变页面结构
另外配色还是改成深色主题，交互方案文档可修改
----------------------------------------------------
【2026-05-06 12:47:17 +08:00】--------------------------------------------
看图识矿游戏 完整用户积分等级&境界体系
实现上面逻辑：
每次判定得分要有弹窗提示
要在用户积分显示位置添加一个积分解释页面，将上面规则向用户解释清楚，文案组织一下，要让用户一目了然
----------------------------------------------------
【2026-05-06 12:17:48 +08:00】--------------------------------------------
天梯赛天梯榜显示头像和昵称，这里只记录用户ID，用户信息改动要随时能获取到新网名和头像
----------------------------------------------------
【2026-05-06 12:06:22 +08:00】--------------------------------------------
在天梯赛配置每个游戏增加一个固定选题池数量，比如我在5连斩配了选题池10，那么我的题目只会在评分最低的10个题目内选题
----------------------------------------------------
【2026-05-06 11:51:43 +08:00】--------------------------------------------
白榴石的下面还是没有审核通过的晒图
----------------------------------------------------
【2026-05-06 11:06:54 +08:00】--------------------------------------------
1. 后台做成 m 端自适应
2. 后台天梯赛保存时，弹窗提示保存成功
3. 后台审核列表显示所有数据，添加审核条件筛选
4. 天梯赛错题显示，模型也要可以用手拖动
5. 搜索条，我输入中文矿物名称例如石英，直接点回车，没有搜索结果，应该跳出矿物晶体列表或者几个矿物的备选列表（如无完整匹配矿物）
6. 矿晶晒图还是没有显示，之前有过审核通过的晒图，晒图应该显示在矿物晶体详情下面
7. 后台配置的10连斩全是 L1前台玩的时候还会出现 L3
----------------------------------------------------
【2026-05-04 06:28:35 +08:00】--------------------------------------------
天梯赛我获得了10连斩资格，当我退出登录再回来，资格消失嘞
我在白榴石下面晒矿，通过审核后，我的晒矿图片没有在白榴石的晶体详情里面出现，请修复
在计算矿物难度时，增加稀有度权重
难度得分=晶面复杂度得分*50+稀有程度得分*50%
大概得一个权重，具体子项得分需要你再考虑一下融合公式，这个公式希望能够在后台配置得一个权重，具体子项得分需要你再考虑一下融合公
----------------------------------------------------
【2026-05-03 18:37:00 +08:00】--------------------------------------------
答案选项显示
中文名/英文名：晶习（如果有晶习显示晶习的中文翻译，这里可能要维护晶习的中文说明），中文名或晶习为待补充时隐藏
后台的第二个int空间看不到显示的数字，如截图
测试完直接上线
----------------------------------------------------
【2026-05-03 18:08:00 +08:00】--------------------------------------------
难度设置改成多级设置比如
5连斩：
L1-L2 3个
L2-L7  1个
L8-10 1个
每个挑战可以设置3个区间，添加配置的校验，不能自相矛盾
题目右上角显示题目难度
L1~L3字体是绿色，添加萌宠标识
L4~L7自提是黄色，添加恶龙标识
L8~L10字体是红色并添加恶魔头像标识
----------------------------------------------------
【2026-05-03 17:58:21 +08:00】--------------------------------------------
在后台添加菜单：天梯赛配置
1、题目难度设置为1—10级
2、5连斩、10连斩、20连斩分别设置难度范围例如
5连斩：通过两个int来限制1-2就是1<=难度<=2
----------------------------------------------------
【2026-05-03 17:49:56 +08:00】--------------------------------------------
将用户的各种状态都存到数据库中，用户换设备后应该能正确获取到正确的当前状态
用户选择答案后自动跳到下一题
有些表中的中文名还是英文，使用mineral_en_cn补全用户中文名
----------------------------------------------------
【2026-05-03 17:38:21 +08:00】--------------------------------------------
先实现M端天梯赛的功能
进入天天赛，头部有3个方块入口，5连斩、10连斩、20连斩
下面是20斩天梯榜，用时递增显示前10名用户
5连斩全对获得10连斩资格、10连斩全对获得20斩资格，20斩全对答题时间作为用户的天梯记录
用户进入天梯赛会展示用户的连斩标签和20斩时间、天梯排名名次
答题逻辑：
不管几连斩逻辑都是一样的
用户选择5连斩，进入答题说明，用户可以勾选不再提示，下次进入直接开始答题
答题第一行为计时器，用户开始答题开始记录，
第二行显示随机显示一个3D矿晶模型详情画布
下面列出4个相似的矿物名称（相似算法你定一下，但是不要有两个都重复的情况）
用户选择后可以点击下一题，模型会自动准备下一个题的模型生成和渲染，用户点下一题直接展示
用户再完成之前可以前后移动题目，并且修改答案，用户在最后一题答题完毕后可以点击提交按钮
结算页会告诉用户得分和错题集，用户可以翻阅错题，上面是模型，下面是用户选择的错误答案（标红）和正确的答案（标绿）
如果全对：
5连斩：恭喜获得10连斩挑战资格，20连斩通关后即可进行天梯冲榜
10连斩：恭喜获得20连斩挑战资格，20连斩通关后即可进行天梯冲榜
20连斩：恭喜获得天梯赛上榜资格，20连斩通关后即可进行天梯冲榜
用户答题时要有动画特效，挑战成功要有庆祝动画特效
----------------------------------------------------
【2026-05-02 10:42:52 +08:00】--------------------------------------------
搜索框放到第一行中间
模型画布中只展示了模型的一小部分，需要调整一下镜头距离和让矿物处在画布中心
晶库tab要换成PC风格，左侧边栏显示A~Z的矿物名称，右侧为矿物展示区
----------------------------------------------------
【2026-05-02 10:22:00 +08:00】--------------------------------------------
将PC页面按照M段的功能实现一遍，但是不要影响M端的布局和功能
PC页面：
第一行，左侧logo，右侧，登录、退出、语言、个人中心（包含我的里面的所有功能，交互你自己设计）
第二行，通栏banner图，图片宽度自适应，图片中心与banner图中心重合，超出高度的图片部分不显示
第三行：菜单，从做到右、首页、晶库、社区
下面内容根据首页、晶库、社区来设计，你自己设计布局
----------------------------------------------------
【2026-05-02 00:12:05 +08:00】--------------------------------------------
不做简洁/预览切换开关了，只做一个预览模式的开关，预览模式默认关闭，且不缓存状态，每次进来都是预览模式关闭状态。
预览模式使用分步加载的方式，只加载当前页面可视区到下面两行的矿物，且从上到下依次加载，不要一次加载过多
----------------------------------------------------
【2026-05-02 00:05:17 +08:00】--------------------------------------------
预览模式不是只显示名称描述，是跟搜索列表一样显示所有的晶体模型
2、修改模型默认值，坐标和晶体角度信息默认改成关闭，如果用户打开，则通过浏览器缓存记录，后续沿用
----------------------------------------------------
【2026-05-02 00:03:03 +08:00】--------------------------------------------
个人信息添加昵称
头像右边显示昵称
主页头像右边显示昵称
----------------------------------------------------
【2026-05-02 00:00:21 +08:00】--------------------------------------------
1、晶库中切换到中文的时候，发现英文方式会在底部出现，这里切换中英文后，另外一种语言的列表隐藏
2、头部中英文左边再添加一个开关：
简洁/预览：默认简洁
简洁：目前的形式
预览：每个矿物名称下面直接列出所有晶型列表
----------------------------------------------------
【2026-05-01 23:57:49 +08:00】--------------------------------------------
天梯赛相关，点击弹出tost:功能建设中，敬请期待！
----------------------------------------------------
【2026-05-01 23:56:21 +08:00】--------------------------------------------
我的里面的按钮不用非得填充完一行，一行还是4个槽位，现在占两个就行
----------------------------------------------------
【2026-05-01 23:55:02 +08:00】--------------------------------------------
中间的tab还是改成天梯赛，我的里面的主页跳转到主页
----------------------------------------------------
【2026-05-01 23:53:57 +08:00】--------------------------------------------
不要3个按钮了，变成2个按钮，
主页，跳转现在的主页
天梯赛，后面再写逻辑
----------------------------------------------------
【2026-05-01 23:48:30 +08:00】--------------------------------------------
做成这种类似透明线稿的风格
----------------------------------------------------
【2026-05-01 23:46:22 +08:00】--------------------------------------------
在我的tab里面，语言那一行上面加3个并排的方块按钮分别是，帖子、跟图、头图
上面是图标，下面是文字，分别跳转到主页的3个tab
主页tab换成，天梯赛图标，天梯赛逻辑后面再做
----------------------------------------------------
【2026-05-01 21:36:34 +08:00】--------------------------------------------
这些配置不记录到库里面了，记录到浏览器缓存吧，不然感觉影响页面性能，也不需要保存按钮了，设置完随时更新缓存
----------------------------------------------------
【2026-05-01 21:22:03 +08:00】--------------------------------------------
颜色滑块里面缺少黑色，最右侧设置为黑色
----------------------------------------------------
【2026-05-01 21:19:58 +08:00】--------------------------------------------
线面颜色饱和度调成70%
颜色滑块游标变成白色
----------------------------------------------------
【2026-05-01 21:11:04 +08:00】--------------------------------------------
位置还是不对，放到
<div class="expanded-viewer preview-host is-preview-ready" id="expandedViewer">
            <div class="loading-state" id="loadingState" style="display: none;">已加载 1007 条 SMORF 晶型数据</div>
          <canvas data-engine="three.js r158" width="585" height="734" style="display: block; touch-action: none;"></canvas></div>这个元素同级的下面，当展开配置打开时其他元素顺序向下移动
配置项定义：
1、晶面透明度：0~100%，默认100%
2、边线颜色：现在的颜色增加黑白两种颜色，默认值为白色
3、边线粗细：0~100%，默认0
4、顶点颜色：现在的颜色增加黑白两种颜色，默认值为白色
5、顶点大小：0~100%，默认值为0
6、恢复默认按钮，保存按钮
保存后，这些配置放到用户数据存到库中，下次进入引用配置
复位按钮不起作用，点击它，晶体模型应该恢复到初始状态
----------------------------------------------------
【2026-05-01 20:59:24 +08:00】--------------------------------------------
放到这个位置
----------------------------------------------------
【2026-05-01 20:56:42 +08:00】--------------------------------------------
将展开设置项放到div class="expanded-info"下面
----------------------------------------------------
【2026-05-01 20:53:03 +08:00】--------------------------------------------
设置按钮点击后，展开的位置在画布下面
----------------------------------------------------
【2026-05-01 20:51:26 +08:00】--------------------------------------------
设置里面添加一个线条颜色，滑动选择所有颜色
----------------------------------------------------
【2026-05-01 20:48:34 +08:00】--------------------------------------------
将模型设置按钮放到右侧按钮的最下面，复位按钮好像失灵了，也修复一下
----------------------------------------------------
【2026-05-01 20:46:19 +08:00】--------------------------------------------
按钮放在我箭头指的地方
----------------------------------------------------
【2026-05-01 20:43:53 +08:00】--------------------------------------------
详情页模型配置页面按钮挪到最下面，展开控制项放到按钮下方，点击按钮收起展开项，默认项为透明度100%，线宽度0，不加顶点
----------------------------------------------------
【2026-05-01 20:29:13 +08:00】--------------------------------------------
边线按钮变成一个模型设置按钮
点击展开几个调试空间
1、边线重量：滑动调节0~100
2、晶面透明度：滑动调节0~100
3、顶点加强：开关，默认关，开加一个小红球
----------------------------------------------------
【2026-05-01 20:19:57 +08:00】--------------------------------------------
详情页和列表页加一个边线加强按钮，这个按钮默认不选中，选中后晶边添加一条明显的黑色边线
----------------------------------------------------
【2026-05-01 20:12:51 +08:00】--------------------------------------------
把详情页右侧的按钮都加到列表页顶部
----------------------------------------------------
【2026-05-01 20:08:16 +08:00】--------------------------------------------
列表页，当晶型过多的时候就按正常尺寸展示，不够就下滑，但是顶部标题和简介锁定不动
----------------------------------------------------
【2026-05-01 19:46:43 +08:00】--------------------------------------------
当我在搜索结果页点击拍照或者GIF时，想截取的是我红框标出的区域
----------------------------------------------------
【2026-05-01 18:08:35 +08:00】--------------------------------------------
搜索结果页顶部，也添加拍照和GIF按钮，GIF按钮，就改成GIF三个字母，详情页也这样改
----------------------------------------------------
【2026-05-01 17:42:02 +08:00】--------------------------------------------
在晶模详情页增加两个按钮，一个拍照按钮，一个GIF按钮，拍照是下载当前图片，GIF是下载GIF格式图片，为模型旋水平转360度的GIF，下载的图片和GIF都带上域名水印 crystalhome.cn
----------------------------------------------------
【2026-05-01 17:20:42 +08:00】--------------------------------------------
搜索结果页前面的标题和简介折行了；点击返回没有应该返回首页，返回了一个空白页
----------------------------------------------------
【2026-05-01 16:59:48 +08:00】--------------------------------------------
搜索结果页内容太靠顶了，空出返回按钮那一行，从下面开始显示；搜索结果页的晶模加上晶面数据和坐标，要持续转动；浏览器访问本地社区，点击登录会报错
----------------------------------------------------
【2026-05-01 16:49:18 +08:00】--------------------------------------------
搜索结果页是一个新的页面，不显示首页的头图和海量晶模库标题
----------------------------------------------------
【2026-05-01 15:29:49 +08:00】--------------------------------------------
1、所有需要关闭当前页面，返回之前页面的操作都改成左上方的返回箭头按钮，不再使用右上角的叉号
2、晶库选择一个矿物不是直接进详情页，而是跟搜索结果一样，进矿物的晶型列表
3、搜索框BUG，输入黄铁矿，下面没有出搜索结果，依然是无关的搜索词推荐，只要输入了内容就要根据内容调整推荐，评估是否可以服用搜索结果页
4、搜索结果页是一个新的页面，不是在首页展示
5、社区tab弹出登录，点击登录报错
----------------------------------------------------
【2026-05-01 15:01:09 +08:00】--------------------------------------------
首页海标题：海量晶模库后面记一个说明目前已经有多少晶型数据，比如海量晶模库1400条（10px字体）
----------------------------------------------------
【2026-05-01 14:50:42 +08:00】--------------------------------------------
首页所有标题字号都变成13PX
----------------------------------------------------
【2026-05-01 14:46:21 +08:00】--------------------------------------------
首页几个标题字号变为现在的一半
----------------------------------------------------
【2026-05-01 14:38:53 +08:00】--------------------------------------------
1、首页增加几个标题
Banner图上面，今日首图
矿物模型：3D晶模
2、所有需要登录状态的地方都自动弹出登录界面，比如切到主页没有登录，需弹出登录页
3、我的里面不要把个人信息摊出来展示，在头像右边加个编辑按钮，点击进入个人信息编辑页面，下面依次是语言，切换账号、退出登录，我的矿图和我的帖子不要了
4、主页tab增加一个跟旁边风格一致的图标，小房子那种就可以
----------------------------------------------------
【2026-05-01 14:12:00 +08:00】--------------------------------------------
网站标签页没有图标，用logo搞个图标放到浏览器标签页上面，可以做成透明图标状态，不要里面的域名
晶库右侧加一个开关，按中/英，有些矿物没有中文名字需要在数据库里面补全，使每一个矿物都有中英文名字
我的里面增加，用户增加个人信息，包括头像，性别，简介，支持编辑
在tab中间增加主页栏，主页进去左上角头像，下面是简介，在下面是两个分栏，我的帖子、我的矿图、我的头图
我的帖子是当前用户的帖子列表按时间倒序，我的矿图是跟图时间倒序，我的头图是被评选为头图的矿图会出现在这里，这个要加个特效代表荣光，把一些帖子和跟图、头图挂到admin用户下面便于测试效果
----------------------------------------------------
【2026-05-01 13:46:50 +08:00】--------------------------------------------
1、更改首页布局，只保留一个晶体模型，下面是精华帖子（按发布时间倒序排）
2、帖子里面图片很多无法显示的，造50条，验证一下要求图片都是可以显示的，图片要下到本地
3、跟图和跟帖是两个逻辑，跟图是跟矿物模型关联的，只在矿物模型下面展示，且信息有限，图片（可多张）、产地、矿物名称、简介，帖子是自由度很高的图文形态
4、目前跟帖按钮和晒图按钮点击都没有反应且报错，请修复
5、晶库tab现在点击去是空白的没有数字，另外不要在页面显示：按晶型名称首字母排序的字样
----------------------------------------------------
【2026-05-01 13:20:00 +08:00】--------------------------------------------
1、首页图标改成黑色长条
2、晶库改成中文简单矿物名，现在展示的事晶型字段，按A~Z分档
3、晒图按钮搞大一点，设计的显眼一点，文案改成晒矿，矿物信息改成默认收起状态，用户点按钮再展开
4、晒图和发帖按钮目前点都没有反应
5、晒图和发帖都造10条数据，要去网上搜真实恰当的素材，不能有虚假感
----------------------------------------------------
【2026-05-01 12:30:00 +08:00】--------------------------------------------
后台管理改成景点的管理后台布局，左侧是菜单栏，右侧是操作区
菜单：
1、矿物跟图管理
用户可以再矿物下面跟图，这里能看到用户上传的图片，可以点通过或者驳回
2、图文贴管理：
这里可以对用户上传的图文贴进行审核，可以驳回或者通过，通过后在社区才能可见
3、用户管理：这里可以搜索到用户
M段功能添加：
1、矿物跟图
在矿物详情下面有一个晒图按钮，点击晒图按钮可以上传本地图片，还有矿物名称、产地、扩展信息3个字段，经过后台审核后，跟图会展示在矿物模型下面，图片下面有点赞和存疑按钮，一个点赞加一分，一个存疑减一分，按排分递减，前三名左上角有金银铜3色脚标，跟图下面可以留言
2、在社区栏下面中间有一个➕跟帖按钮，用户可以点击按钮进行图文贴编辑，帖子通过审核后会在社区栏显示，单图的左文右图，一张以上的上文下图，文字只显示两行其他隐藏，帖子下面可以留言
3.我的里面添加两行，我的矿图、我的帖子，点开是跟图和帖子列表，点击分别跳转该跟图页面或者帖子页面
----------------------------------------------------
【2026-05-01 12:05:00 +08:00】--------------------------------------------
在页面底部加4个吸底的tab栏，分别是，首页，晶库，社区，我的
搜索栏放到logo旁边，中英文切换按钮和登录退出放到我的里面
首页就是当前页面，晶库按晶型名首字母排序做一个列表，
社区做一个帖子列表，
----------------------------------------------------
【2026-05-01 10:45:00 +08:00】--------------------------------------------
点击进入详情页，banner图和搜索框遮盖模型画布
2、模型画布万向滑动的时候，页面会被拖动造成模型拖拽失败，画布范围操作不应该识别成页面操作
----------------------------------------------------
【2026-05-01 10:30:00 +08:00】--------------------------------------------
每次刷新都会先出我截图的页面，然后才出现首页，去掉这个页面
----------------------------------------------------
【2026-05-01 10:25:00 +08:00】--------------------------------------------
我打开页面看了下，模型加载不出来了，一直处在loading界面，进度条去掉斜着的光波，只保留中间的进度条，上面加一行模型渲染中
----------------------------------------------------
【2026-05-01 00:00:00 +08:00】--------------------------------------------
搜索词推荐框，被模型控件遮挡了
修改完后发布线上
----------------------------------------------------
【2026-04-30 22:20:48 +08:00】--------------------------------------------
1、搜索框点击，下拉随机推荐3个矿物名作为搜索建议
2、首页下面的矿物模型要一直转，而且10秒钟随机变化一种矿物，矿物上的坐标系和晶面数据都显示出来
----------------------------------------------------
【2026-04-30 22:07:40 +08:00】--------------------------------------------
下面是优化M端样式
1.首页改为默认加载两个槽位，用户下拉每次添加两个槽位
2、模型加载有点慢，添加懒加载策略
3、加载过程要有科技感强的loading条
4、看下模型渲染过程性能优化，缩短渲染时长
----------------------------------------------------
【2026-04-30 17:45:00 +08:00】-搜索结果中的缩略图下面只展示矿物名称 点进详情矿物没在中间，需要拉远镜头，保持矿物在可见画布中间 矿物的信息展示在模型画布下面 详情右上角添加一个关闭按钮，点击返回上一个页面
【2026-04-30 17:40:00 +08:00】-resources\banner里面有很多图片，但是没有轮播，轮播的时候控件左下角要有个页码展示，让用户知道这个在轮播，而且可以左右滑动
【2026-04-30 15:45:00 +08:00】-隔离一下吧
【2026-04-30 14:20:00 +08:00】-增加一个M端页面 识别到设备为移动设备时，切换到移动端样式，要适合移动端操作习惯
【2026-05-03 17:38:21 +08:00】--------------------------------------------
先实现M端天梯赛的功能
进入天天赛，头部有3个方块入口，5连斩、10连斩、20连斩
下面是20斩天梯榜，用时递增显示前10名用户
5连斩全对获得10连斩资格、10连斩全对获得20斩资格，20斩全对答题时间作为用户的天梯记录
用户进入天梯赛会展示用户的连斩标签和20斩时间、天梯排名名次
答题逻辑：
不管几连斩逻辑都是一样的
用户选择5连斩，进入答题说明，用户可以勾选不再提示，下次进入直接开始答题
答题第一行为计时器，用户开始答题开始记录，
第二行显示随机显示一个3D矿晶模型详情画布
下面列出4个相似的矿物名称（相似算法你定一下，但是不要有两个都重复的情况）
用户选择后可以点击下一题，模型会自动准备下一个题的模型生成和渲染，用户点下一题直接展示
用户再完成之前可以前后移动题目，并且修改答案，用户在最后一题答题完毕后可以点击提交按钮
结算页会告诉用户得分和错题集，用户可以翻阅错题，上面是模型，下面是用户选择的错误答案（标红）和正确的答案（标绿）
如果全对：
5连斩：恭喜获得10连斩挑战资格，20连斩通关后即可进行天梯冲榜
10连斩：恭喜获得20连斩挑战资格，20连斩通关后即可进行天梯冲榜
20连斩：恭喜获得天梯赛上榜资格，20连斩通关后即可进行天梯冲榜
用户答题时要有动画特效，挑战成功要有庆祝动画特效
----------------------------------------------------
【2026-04-30 16:55:00 +08:00】-我要更新M端的布局 1、第一行左侧logo，右侧靠右，语言切换按钮（默认中文，PC一样）、登录或退出按钮 2、第二行banner图控件，轮播resources\banner中的图片、banner控件高度固定，图片居中显示，如果图片高度超过控件高度则只显示控件高度的图片内容 3、第三行：搜索控件 4、第四行：未进行搜索，随机展示3个矿物模型的详情页，5秒钟切换一次 5、第四行：搜索操作后，显示搜索结果页，显示5条可上下滑动 6、点击其中一个矿物，展示矿物下的模型缩略图，每行两个，展示3行，可滑动展示
【2026-04-30 17:15:00 +08:00】-问题还是没解决，模型还是无法展示完整
【2026-04-30 17:35:00 +08:00】-模型下面简洁的展示矿物的名字
【2026-04-30 13:40:00 +08:00】-resources\黑色_横栏.png将网站logo放到页面左上方
【2026-04-30 11:45:00 +08:00】-中间区域当晶型过多时，会使晶型无法显示完整，修复这个问题，晶型过多时就顺排到后面通过下滑查看，但每个晶型都要显示完整
[2026-04-29 17:42:00 +08:00]-1、建立登录系统，用户名、密码、微信扫码验证 2、矿物模型详情下面增加用户跟帖功能，可以发布相同矿物图片，需人工审核，审核通过后可以展示在下面，展示第一张图片缩略图，点进去浮层展示矿物图片和详情字段，上传者、矿物名，产地，备注 3、管理后台开发审核列表，可以操作审核或者驳回 4、管理后台增加图片列表，按时间倒序排列，按时间筛选，可以操作上头图，头部添加头图banner图
[2026-04-29 17:09:00 +08:00]-晶型详情里面添加如下内容，并设置开关可以控制是否显示：晶型数据 坐标系
[2026-04-29 00:00:00 +08:00]-按矿物聚合，每个矿物，模型平铺到中间，点击其中一个扩展到整个中间区域
[2026-04-29 00:00:00 +08:00]-还是没找到复杂聚形的页面，这样你直接写一个新的页面，只展示这171条数据
*/

:root {
  color-scheme: dark;
  --bg: #0c0e11;
  --panel: #15181d;
  --panel-2: #1b2027;
  --line: #2b323c;
  --text: #f1f4f7;
  --muted: #98a3af;
  --focus: #70c7ff;
}

* { box-sizing: border-box; }

body {
  margin: 0;
  height: 100vh;
  overflow: hidden;
  background: var(--bg);
  color: var(--text);
  font-family: Arial, "Microsoft YaHei", sans-serif;
}

body.app-starting {
  overflow: hidden;
}

body.app-starting .app-shell,
body.app-starting .mobile-tabbar {
  visibility: hidden;
}

.startup-skeleton {
  position: fixed;
  inset: 0;
  z-index: 9999;
  display: grid;
  place-items: center;
  background: #090a0c;
}

.startup-skeleton-inner {
  width: min(420px, calc(100vw - 32px));
  display: grid;
  gap: 14px;
}

.startup-skeleton-logo,
.startup-skeleton-hero,
.startup-skeleton-line,
.startup-skeleton-grid span {
  position: relative;
  overflow: hidden;
  background: #171b20;
  border: 1px solid #242a31;
}

.startup-skeleton-logo::after,
.startup-skeleton-hero::after,
.startup-skeleton-line::after,
.startup-skeleton-grid span::after {
  content: "";
  position: absolute;
  inset: 0;
  transform: translateX(-100%);
  background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.08), transparent);
  animation: startupSkeletonSweep 1200ms ease-in-out infinite;
}

.startup-skeleton-logo {
  width: 132px;
  height: 26px;
  border-radius: 4px;
}

.startup-skeleton-hero {
  height: 220px;
  border-radius: 8px;
}

.startup-skeleton-line {
  width: 72%;
  height: 14px;
  border-radius: 4px;
}

.startup-skeleton-line.wide {
  width: 100%;
}

.startup-skeleton-grid {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 10px;
}

.startup-skeleton-grid span {
  height: 86px;
  border-radius: 8px;
}

@keyframes startupSkeletonSweep {
  to { transform: translateX(100%); }
}

html.is-mobile-shell body:not(.is-mobile) {
  height: auto;
  min-height: 100vh;
  overflow: auto;
  background: #090a0c;
}

html.is-mobile-shell body:not(.is-mobile) .app-shell {
  display: block;
  height: auto;
  min-height: 100vh;
}

html.is-mobile-shell body:not(.is-mobile) .sidebar {
  position: relative;
  top: 0;
  z-index: 120;
  display: grid;
  grid-template-columns: 118px minmax(0, 1fr);
  grid-template-rows: 64px 36px 264px;
  max-height: none;
  overflow: visible;
  border-right: 0;
  border-bottom: 1px solid var(--line);
}

html.is-mobile-shell body:not(.is-mobile) .site-logo {
  grid-column: 1;
  grid-row: 1;
  min-height: 44px;
  padding: 0 8px;
  justify-content: flex-start;
  border-right: 0;
  border-bottom: 0;
  background: transparent;
}

html.is-mobile-shell body:not(.is-mobile) .site-logo .brand-mark {
  width: 28px;
  height: 28px;
}

html.is-mobile-shell body:not(.is-mobile) .site-logo .brand-mark img {
  width: 22px;
  height: 22px;
}

html.is-mobile-shell body:not(.is-mobile) .site-logo .brand-word {
  max-width: 74px;
  overflow: hidden;
  font-size: 11px;
  text-overflow: ellipsis;
}

html.is-mobile-shell body:not(.is-mobile) .hero-banner {
  grid-column: 1 / -1;
  grid-row: 3;
  height: 264px;
  min-height: 264px;
  padding: 0 14px;
  align-items: flex-end;
}

html.is-mobile-shell body:not(.is-mobile) .mobile-banner-title {
  grid-column: 1 / -1;
  grid-row: 2;
}

html.is-mobile-shell body:not(.is-mobile) .sidebar-header {
  display: none;
  grid-column: 2;
  grid-row: 1;
  align-items: center;
  justify-content: flex-end;
  padding: 10px 12px 10px 0;
  border-bottom: 0;
}

html.is-mobile-shell body:not(.is-mobile) .sidebar-header > div:first-child,
html.is-mobile-shell body:not(.is-mobile) .header-actions a.icon-link,
html.is-mobile-shell body:not(.is-mobile) .toolbar select,
html.is-mobile-shell body:not(.is-mobile) .summary-row,
html.is-mobile-shell body:not(.is-mobile) .species-list,
html.is-mobile-shell body:not(.is-mobile) .main-pane,
html.is-mobile-shell body:not(.is-mobile) .detail-pane {
  display: none;
}

html.is-mobile-shell body:not(.is-mobile) .toolbar {
  grid-column: 2;
  grid-row: 1;
  align-self: center;
  padding: 10px 12px 10px 0;
}

html.is-mobile-shell body:not(.is-mobile) .search-wrap {
  min-height: 46px;
  font-size: 16px;
}

html.is-mobile-shell body:not(.is-mobile) .language-switch,
html.is-mobile-shell body:not(.is-mobile) .icon-link {
  width: 44px;
  height: 44px;
  min-height: 44px;
}

html.is-mobile-shell body:not(.is-mobile) .language-switch {
  width: 64px;
  padding: 0 8px;
}

button, input, select { font: inherit; }

.app-shell {
  display: grid;
  grid-template-columns: minmax(280px, 330px) minmax(520px, 1fr) minmax(320px, 380px);
  height: 100vh;
}

.sidebar, .detail-pane {
  min-width: 0;
  background: var(--panel);
  overflow: hidden;
}

.sidebar { border-right: 1px solid var(--line); }
.detail-pane {
  border-left: 1px solid var(--line);
  overflow-y: auto;
  padding: 16px;
}

.site-logo {
  min-height: 64px;
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 0 14px;
  border-bottom: 1px solid var(--line);
  background: linear-gradient(180deg, rgba(11, 18, 28, 0.96), rgba(9, 15, 23, 0.96));
  text-decoration: none;
  overflow: hidden;
}

.brand-mark {
  width: 30px;
  height: 30px;
  display: grid;
  place-items: center;
  flex: 0 0 auto;
  border: 1px solid rgba(112, 199, 255, 0.16);
  border-radius: 8px;
  background: rgba(112, 199, 255, 0.08);
}

.brand-mark img {
  display: block;
  width: 24px;
  height: 24px;
  object-fit: contain;
}

.brand-word {
  min-width: 0;
  color: #dcecf8;
  font-size: 13px;
  font-weight: 700;
  letter-spacing: 0;
  white-space: nowrap;
  opacity: 0.94;
}

.hero-banner {
  position: relative;
  min-height: 96px;
  display: flex;
  align-items: flex-end;
  padding: 12px 16px;
  border-bottom: 1px solid var(--line);
  background: linear-gradient(135deg, #26364a, #111820);
  background-position: center;
  background-size: cover;
  color: #fff;
  font-weight: 700;
  text-shadow: 0 1px 6px rgba(0,0,0,0.72);
  touch-action: pan-y;
  user-select: none;
  overflow: hidden;
}

.mobile-home-title {
  display: none;
}

html.is-mobile-shell body:not(.is-mobile) .mobile-banner-title {
  display: block;
  padding: 8px 14px;
  border-bottom: 1px solid var(--line);
  background: #15181d;
  color: var(--text);
  font-size: 13px;
  font-weight: 900;
}

.hero-banner-image {
  position: absolute;
  inset: 0;
  z-index: 0;
  display: block;
  width: 100%;
  height: 100%;
  object-fit: cover;
  object-position: center;
  pointer-events: none;
}

.hero-banner-ghost {
  position: absolute;
  inset: 0;
  z-index: 0;
  display: block;
  width: 100%;
  height: 100%;
  object-fit: cover;
  object-position: center;
  pointer-events: none;
  will-change: transform;
}

.hero-banner.is-dragging .hero-banner-image {
  will-change: transform, opacity;
}

.hero-banner-image[hidden] {
  display: none;
}

.hero-banner > span {
  position: relative;
  z-index: 1;
}

.hero-banner-pager {
  position: absolute;
  left: 12px;
  bottom: 10px;
  z-index: 2;
  padding: 3px 8px;
  border-radius: 999px;
  background: rgba(0, 0, 0, 0.54);
  color: #fff;
  font-size: 12px;
  line-height: 1.4;
  font-weight: 700;
}

.hero-banner-pager[hidden] {
  display: none;
}

.banner-meta,
.pc-banner-meta {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  align-items: center;
  gap: 8px;
  width: 100%;
  min-height: 38px;
  padding: 8px 12px;
  border-bottom: 1px solid var(--line);
  background: #101720;
  color: var(--muted);
  font-size: 12px;
  line-height: 1.35;
  overflow: hidden;
  white-space: nowrap;
}

.banner-meta.hidden,
.pc-banner-meta.hidden {
  display: none;
}

.banner-meta button,
.pc-banner-meta button {
  min-width: 0;
  max-width: 100%;
  min-height: 28px;
  overflow: hidden;
  padding: 0 10px;
  border: 1px solid rgba(112, 199, 255, 0.22);
  border-radius: 999px;
  background: rgba(112, 199, 255, 0.1);
  color: var(--text);
  cursor: pointer;
  font-size: 12px;
  font-weight: 900;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.banner-meta span,
.pc-banner-meta span {
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.sidebar-header, .main-topbar {
  display: flex;
  align-items: flex-start;
  justify-content: space-between;
  gap: 12px;
  padding: 16px;
  border-bottom: 1px solid var(--line);
}

h1, h2, h3, p { margin: 0; }
h1 { font-size: 20px; }
h2 { font-size: 18px; }
h3 { margin-bottom: 10px; font-size: 14px; color: var(--muted); }
p { margin-top: 5px; color: var(--muted); font-size: 12px; }

.icon-link, .view-actions button, .expanded-actions button {
  display: grid;
  place-items: center;
  width: 34px;
  height: 34px;
  border: 1px solid var(--line);
  border-radius: 6px;
  background: var(--panel-2);
  color: var(--text);
  text-decoration: none;
  cursor: pointer;
}

.header-actions {
  display: flex;
  gap: 8px;
}

.language-switch {
  width: 64px;
  height: 34px;
  border: 1px solid var(--line);
  border-radius: 6px;
  background: var(--panel-2);
  color: var(--text);
  font-weight: 700;
  text-align: center;
}

.expanded-actions button.active {
  border-color: var(--focus);
  color: #dff3ff;
  box-shadow: inset 0 0 0 1px rgba(112, 199, 255, 0.28);
}

.expanded-actions button:disabled {
  opacity: 0.56;
  cursor: wait;
}

.expanded-actions button.is-busy {
  color: var(--focus);
}

.gif-text-button {
  font-size: 12px;
  font-weight: 900;
  letter-spacing: 0;
}

body.admin-page .admin-page-jump {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  color: #64748b;
  font-size: 13px;
}

body.admin-page .admin-page-jump input {
  width: 64px;
  min-height: 30px;
  border: 1px solid #d8dee8;
  border-radius: 6px;
  padding: 0 8px;
}

.gif-text-button {
  display: none !important;
}

.model-settings-panel.hidden {
  display: none;
}

.model-settings-panel {
  pointer-events: auto;
  display: grid;
  gap: 10px;
  width: min(320px, calc(100vw - 32px));
  padding: 10px;
  border: 1px solid rgba(112, 199, 255, 0.28);
  border-radius: 8px;
  background: rgba(12, 16, 22, 0.96);
  box-shadow: 0 16px 34px rgba(0,0,0,0.36), inset 0 0 0 1px rgba(255,255,255,0.03);
}

.expanded-model-settings {
  position: relative;
  display: grid;
  gap: 10px;
  pointer-events: auto;
}

.expanded-model-settings > button {
  display: grid;
  place-items: center;
  width: 34px;
  height: 34px;
  border: 1px solid var(--line);
  border-radius: 6px;
  background: var(--panel-2);
  color: var(--text);
  cursor: pointer;
}

.expanded-model-settings > button.active {
  border-color: var(--focus);
  color: #dff3ff;
  box-shadow: inset 0 0 0 1px rgba(112, 199, 255, 0.28);
}

.expanded-model-settings-panel {
  position: relative;
  z-index: 3;
  left: auto;
  bottom: auto;
  margin: 0 16px 12px;
  width: min(420px, calc(100% - 32px));
}

.model-setting-row,
.model-setting-toggle {
  display: grid;
  align-items: center;
  gap: 8px;
  color: var(--text);
  font-size: 12px;
}

.model-setting-row {
  grid-template-columns: 82px minmax(0, 1fr) 34px;
}

.model-setting-row span,
.model-setting-toggle span {
  color: var(--muted);
}

.model-setting-row input[type="range"] {
  width: 100%;
  accent-color: var(--focus);
}

.model-setting-row input.color-range {
  accent-color: transparent;
  background: linear-gradient(90deg, #fff 0 1%, hsl(0, 70%, 50%) 1%, hsl(60, 70%, 50%), hsl(120, 70%, 50%), hsl(180, 70%, 50%), hsl(240, 70%, 50%), hsl(300, 70%, 50%), hsl(360, 70%, 50%) 99%, #000 100%);
  border-radius: 999px;
}

.model-setting-row input.color-range::-webkit-slider-runnable-track {
  height: 6px;
  border-radius: 999px;
  background: linear-gradient(90deg, #fff 0 1%, hsl(0, 70%, 50%) 1%, hsl(60, 70%, 50%), hsl(120, 70%, 50%), hsl(180, 70%, 50%), hsl(240, 70%, 50%), hsl(300, 70%, 50%), hsl(360, 70%, 50%) 99%, #000 100%);
}

.model-setting-row input.color-range::-moz-range-track {
  height: 6px;
  border-radius: 999px;
  background: linear-gradient(90deg, #fff 0 1%, hsl(0, 70%, 50%) 1%, hsl(60, 70%, 50%), hsl(120, 70%, 50%), hsl(180, 70%, 50%), hsl(240, 70%, 50%), hsl(300, 70%, 50%), hsl(360, 70%, 50%) 99%, #000 100%);
}

.model-setting-row input.color-range::-webkit-slider-thumb {
  width: 18px;
  height: 18px;
  margin-top: -6px;
  border: 2px solid rgba(10, 12, 16, 0.72);
  border-radius: 999px;
  background: #fff;
  box-shadow: 0 0 0 1px rgba(255,255,255,0.82), 0 2px 8px rgba(0,0,0,0.42);
}

.model-setting-row input.color-range::-moz-range-thumb {
  width: 18px;
  height: 18px;
  border: 2px solid rgba(10, 12, 16, 0.72);
  border-radius: 999px;
  background: #fff;
  box-shadow: 0 0 0 1px rgba(255,255,255,0.82), 0 2px 8px rgba(0,0,0,0.42);
}

.model-setting-row strong {
  color: var(--text);
  text-align: right;
}

.model-setting-row .color-chip {
  justify-self: end;
  width: 22px;
  height: 22px;
  border: 1px solid rgba(255,255,255,0.62);
  border-radius: 999px;
  box-shadow: 0 0 0 2px rgba(0,0,0,0.24);
}

.model-setting-actions {
  display: grid;
  grid-template-columns: 1fr;
  gap: 8px;
}

.model-setting-actions button {
  min-height: 34px;
  border: 1px solid var(--line);
  border-radius: 6px;
  background: var(--panel-2);
  color: var(--text);
  font-weight: 700;
  cursor: pointer;
}

.model-setting-toggle {
  grid-template-columns: 1fr auto;
}

.model-setting-toggle input {
  width: 18px;
  height: 18px;
  accent-color: var(--focus);
}

.model-setting-toggle strong {
  display: none;
}

.toolbar {
  position: relative;
  z-index: 90;
  display: grid;
  gap: 10px;
  padding: 12px 16px;
  border-bottom: 1px solid var(--line);
}

.search-wrap {
  position: relative;
  z-index: 100;
  display: grid;
  grid-template-columns: 18px 1fr;
  align-items: center;
  gap: 8px;
  min-height: 38px;
  padding: 0 10px;
  border: 1px solid var(--line);
  border-radius: 6px;
  background: #0f1216;
}

.search-suggestions {
  position: absolute;
  z-index: 999;
  left: 0;
  right: 0;
  top: calc(100% + 7px);
  display: grid;
  gap: 6px;
  padding: 7px;
  border: 1px solid rgba(112, 199, 255, 0.26);
  border-radius: 8px;
  background: rgba(13, 17, 23, 0.98);
  box-shadow: 0 16px 34px rgba(0,0,0,0.36), inset 0 0 0 1px rgba(255,255,255,0.03);
}

.search-suggestion-item {
  min-width: 0;
  min-height: 42px;
  display: grid;
  grid-template-columns: minmax(0, 1fr) auto;
  align-items: center;
  gap: 10px;
  padding: 8px 10px;
  border: 1px solid transparent;
  border-radius: 6px;
  background: #111923;
  color: var(--text);
  text-align: left;
  cursor: pointer;
}

.search-suggestion-item:hover,
.search-suggestion-item:focus-visible {
  border-color: var(--focus);
  outline: none;
  background: #142033;
}

.search-suggestion-item span {
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  font-size: 13px;
  font-weight: 700;
}

.search-suggestion-item small {
  color: var(--muted);
  font-size: 11px;
}

.user-search-item {
  grid-template-columns: 36px minmax(0, 1fr);
  align-items: center;
}

.user-search-item img {
  grid-row: span 2;
  width: 36px;
  height: 36px;
  object-fit: cover;
  border: 1px solid rgba(112, 199, 255, 0.36);
  border-radius: 999px;
  background: #050607;
}

.search-wrap input, .toolbar select {
  width: 100%;
  min-width: 0;
  border: 0;
  outline: none;
  background: transparent;
  color: var(--text);
}

.toolbar select {
  min-height: 38px;
  padding: 0 10px;
  border: 1px solid var(--line);
  border-radius: 6px;
  background: #0f1216;
}

.summary-row {
  display: flex;
  justify-content: space-between;
  gap: 12px;
  padding: 10px 16px;
  border-bottom: 1px solid var(--line);
  color: var(--muted);
  font-size: 12px;
}

.summary-row strong { color: var(--text); }

.species-list {
  height: calc(100vh - 176px);
  overflow-y: auto;
  padding: 8px;
}

.species-item {
  width: 100%;
  min-height: 58px;
  margin-bottom: 6px;
  padding: 9px 10px;
  border: 1px solid transparent;
  border-radius: 7px;
  background: transparent;
  color: var(--text);
  text-align: left;
  cursor: pointer;
}

.species-item:hover, .species-item.active {
  border-color: #405066;
  background: var(--panel-2);
}

.species-item.active { border-color: var(--focus); }
.species-name { display: block; font-size: 13px; font-weight: 700; }
.species-meta { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 7px; }

.badge, .chip {
  max-width: 100%;
  padding: 3px 7px;
  border: 1px solid var(--line);
  border-radius: 999px;
  color: var(--muted);
  font-size: 11px;
  line-height: 1.2;
}

.main-pane {
  position: relative;
  min-width: 0;
  min-height: 0;
  display: grid;
  grid-template-rows: auto minmax(0, 1fr);
  overflow: hidden;
  background: #090a0c;
}

.main-topbar {
  height: 74px;
  background: rgba(12, 14, 17, 0.96);
}

.grid-view {
  min-height: 0;
  height: auto;
  overflow-y: auto;
  padding: 16px;
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));
  grid-auto-rows: max-content;
  align-content: start;
  gap: 14px;
}

.model-tile {
  min-width: 0;
  min-height: 292px;
  border: 1px solid var(--line);
  border-radius: 8px;
  background: var(--panel);
  overflow: hidden;
  cursor: pointer;
}

.model-tile:hover, .model-tile.active {
  border-color: var(--focus);
}

.tile-viewer {
  position: relative;
  height: 230px;
  background: #090a0c;
  overflow: hidden;
}

.tile-viewer canvas {
  display: block;
  width: 100%;
  height: 100%;
}

.preview-host canvas {
  opacity: 0;
  transition: opacity 220ms ease;
}

.preview-host.is-preview-ready canvas {
  opacity: 1;
}

.model-loading {
  position: absolute;
  inset: 0;
  z-index: 3;
  display: grid;
  place-items: center;
  pointer-events: none;
  background:
    radial-gradient(circle at 50% 42%, rgba(112, 199, 255, 0.18), transparent 34%),
    linear-gradient(180deg, rgba(4, 8, 14, 0.2), rgba(4, 8, 14, 0.78));
  overflow: hidden;
  transition: opacity 220ms ease;
}

.preview-host.is-preview-ready .model-loading {
  opacity: 0;
}

.preview-host.is-preview-failed .model-loading {
  background:
    radial-gradient(circle at 50% 42%, rgba(112, 199, 255, 0.08), transparent 34%),
    linear-gradient(180deg, rgba(4, 8, 14, 0.18), rgba(4, 8, 14, 0.7));
}

.model-loading-core {
  position: relative;
  width: min(72%, 260px);
  min-height: 48px;
  display: grid;
  gap: 11px;
  align-items: center;
}

.model-loading-text {
  color: rgba(241, 244, 247, 0.92);
  font-size: 13px;
  line-height: 1.2;
  text-align: center;
}

.model-loading-track {
  position: relative;
  height: 5px;
  overflow: hidden;
  border: 1px solid rgba(112, 199, 255, 0.42);
  border-radius: 999px;
  background: rgba(5, 10, 16, 0.78);
  box-shadow: 0 0 18px rgba(112, 199, 255, 0.28), inset 0 0 12px rgba(112, 199, 255, 0.16);
}

.model-loading-track span {
  position: absolute;
  inset: 0 auto 0 0;
  width: 44%;
  border-radius: inherit;
  background: linear-gradient(90deg, transparent, #70c7ff, #55d98b, transparent);
  filter: drop-shadow(0 0 8px rgba(112, 199, 255, 0.9));
  animation: modelLoadBar 1.05s ease-in-out infinite;
}

@keyframes modelLoadBar {
  0% { transform: translateX(-120%); }
  100% { transform: translateX(250%); }
}

.tile-info {
  min-height: 60px;
  padding: 10px;
  border-top: 1px solid var(--line);
}

.tile-title {
  display: block;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  font-size: 13px;
  font-weight: 700;
}

.tile-subtitle {
  margin-top: 6px;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  color: var(--muted);
  font-size: 11px;
}

.expanded-view {
  position: absolute;
  inset: 74px 0 0;
  background: #090a0c;
}

.expanded-view.hidden { display: none; }
.hidden { display: none !important; }
.mobile-home { display: none; }
.mobile-tab-panel { display: none; }
.mobile-tabbar { display: none; }
.expanded-close { display: none; }
.mobile-expanded-detail-grid { display: none; }

.expanded-viewer {
  position: absolute;
  inset: 0;
  overflow: hidden;
  touch-action: none;
  overscroll-behavior: contain;
}

.expanded-view.has-mineral-images .expanded-viewer {
  inset: 0 0 132px;
}

.expanded-viewer canvas {
  display: block;
  width: 100%;
  height: 100%;
  touch-action: none;
  user-select: none;
  -webkit-user-select: none;
}

.mineral-image-strip {
  position: absolute;
  z-index: 2;
  left: 16px;
  right: 16px;
  bottom: 14px;
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(92px, 1fr));
  gap: 8px;
  max-height: 104px;
  overflow-y: auto;
  padding: 10px;
  border: 1px solid rgba(112, 199, 255, 0.22);
  border-radius: 8px;
  background: rgba(9, 10, 12, 0.82);
  backdrop-filter: blur(8px);
}

.mineral-image-strip img {
  width: 100%;
  aspect-ratio: 1;
  display: block;
  object-fit: cover;
  border: 1px solid rgba(255, 255, 255, 0.14);
  border-radius: 6px;
  background: #050607;
  cursor: zoom-in;
}

.expanded-info {
  position: absolute;
  z-index: 2;
  left: 16px;
  right: 16px;
  top: 16px;
  display: flex;
  justify-content: space-between;
  gap: 12px;
  pointer-events: none;
}

.expanded-actions {
  display: flex;
  gap: 8px;
  pointer-events: auto;
}

.loading-state {
  position: absolute;
  inset: 0;
  display: grid;
  place-items: center;
  color: var(--muted);
}

.detail-pane section {
  padding-bottom: 16px;
  margin-bottom: 16px;
  border-bottom: 1px solid var(--line);
}

.section-header {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 10px;
  margin-bottom: 10px;
}

.section-header h3 { margin-bottom: 0; }

.small-button, .primary-button {
  min-height: 32px;
  border: 1px solid var(--line);
  border-radius: 6px;
  background: var(--panel-2);
  color: var(--text);
  cursor: pointer;
}

.small-button { padding: 0 10px; font-size: 12px; }
.primary-button {
  width: 100%;
  min-height: 38px;
  background: #22577a;
  border-color: #347aa8;
}

.post-list, .admin-list {
  display: grid;
  gap: 10px;
}

.post-card, .admin-item {
  border: 1px solid var(--line);
  border-radius: 8px;
  background: #0f1216;
  overflow: hidden;
}

.post-card {
  position: relative;
  display: grid;
  grid-template-columns: 74px 1fr;
  cursor: pointer;
}

.post-rank {
  position: absolute;
  top: 0;
  left: 0;
  z-index: 2;
  width: 30px;
  height: 24px;
  display: grid;
  place-items: center;
  border-radius: 7px 0 8px 0;
  color: #0b0d10;
  font-size: 12px;
  font-weight: 900;
}

.post-rank.gold { background: #f4c84a; }
.post-rank.silver { background: #cbd5df; }
.post-rank.bronze { background: #c78a4a; }

.post-card img, .admin-thumb {
  width: 100%;
  height: 74px;
  object-fit: cover;
  background: #090a0c;
}

.post-card-body, .admin-item-body {
  min-width: 0;
  padding: 9px;
  font-size: 12px;
}

.post-card-title, .admin-item-title {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  font-weight: 700;
}

.post-card-meta, .admin-item-meta {
  margin-top: 5px;
  color: var(--muted);
  line-height: 1.45;
}

.admin-actions {
  display: flex;
  flex-wrap: wrap;
  gap: 7px;
  padding: 0 9px 9px;
}

.admin-page {
  height: 100vh;
  overflow: hidden;
  background: #0b0d10;
}

.admin-dashboard {
  display: grid;
  grid-template-columns: 220px minmax(0, 1fr);
  height: 100vh;
}

.admin-sidebar {
  display: flex;
  flex-direction: column;
  gap: 10px;
  padding: 22px 14px;
  border-right: 1px solid var(--line);
  background: #111820;
}

.admin-sidebar h1 {
  margin: 0 0 12px;
  font-size: 20px;
}

.admin-sidebar button,
.admin-sidebar a {
  min-height: 40px;
  display: flex;
  align-items: center;
  justify-content: flex-start;
  padding: 0 12px;
  border: 1px solid transparent;
  border-radius: 8px;
  background: transparent;
  color: var(--muted);
  text-decoration: none;
  cursor: pointer;
}

.admin-sidebar button.active,
.admin-sidebar a:hover,
.admin-sidebar button:hover {
  border-color: rgba(112, 199, 255, 0.45);
  background: rgba(112, 199, 255, 0.12);
  color: var(--text);
}

.admin-sidebar #logoutButton {
  margin-top: auto;
}

.admin-workspace {
  min-width: 0;
  overflow: auto;
  padding: 24px;
}

.admin-header {
  display: flex;
  align-items: center;
  justify-content: space-between;
  margin-bottom: 16px;
}

.admin-header h2,
.admin-header p {
  margin: 0;
}

.admin-header p {
  margin-top: 6px;
  color: var(--muted);
}

.admin-panel {
  border: 1px solid var(--line);
  border-radius: 8px;
  background: #11151b;
  padding: 16px;
}

.admin-form-grid,
.admin-toolbar {
  display: flex;
  flex-wrap: wrap;
  gap: 10px;
  align-items: end;
  margin-bottom: 14px;
}

.admin-toolbar label,
.admin-form-grid label {
  display: grid;
  gap: 6px;
  color: var(--muted);
  font-size: 12px;
}

.admin-toolbar input,
.admin-toolbar select,
.admin-form-grid input {
  min-height: 36px;
  padding: 0 10px;
  border: 1px solid var(--line);
  border-radius: 7px;
  background: #0c0f14;
  color: var(--text);
}

.admin-pagination {
  display: flex;
  align-items: center;
  justify-content: flex-end;
  gap: 10px;
  margin-top: 14px;
  color: var(--muted);
  font-size: 13px;
}

.admin-page-info {
  min-width: 150px;
  text-align: center;
}

.admin-config-panel {
  display: grid;
  gap: 14px;
}

.admin-config-panel.hidden {
  display: none !important;
}

.admin-config-note {
  padding: 10px 12px;
  border: 1px dashed rgba(112, 199, 255, 0.36);
  border-radius: 8px;
  background: rgba(112, 199, 255, 0.08);
  color: var(--muted);
  font-size: 13px;
}

.ladder-segment-grid {
  display: grid;
  gap: 14px;
}

.ladder-config-card {
  display: grid;
  gap: 10px;
  padding: 12px;
  border: 1px solid var(--line);
  border-radius: 8px;
  background: #0c1016;
}

.ladder-config-card h3 {
  margin: 0;
  font-size: 16px;
}

.ladder-config-rows {
  display: grid;
  gap: 8px;
}

.ladder-weight-row {
  display: grid;
  grid-template-columns: repeat(2, minmax(120px, 1fr));
  gap: 10px;
}

.ladder-pool-row {
  display: grid;
  gap: 6px;
  color: var(--muted);
  font-size: 12px;
}

.ladder-pool-row input {
  width: min(220px, 100%);
  min-height: 36px;
  padding: 0 10px;
  border: 1px solid var(--line);
  border-radius: 7px;
  background: #0c0f14;
  color: var(--text);
}

.ladder-pool-row small {
  color: #7f8b99;
}

.ladder-config-row {
  display: grid;
  grid-template-columns: 64px minmax(96px, 1fr) 24px minmax(96px, 1fr) minmax(110px, 1.1fr);
  align-items: end;
  gap: 8px;
}

.ladder-config-row strong,
.ladder-config-row span {
  color: var(--muted);
  font-size: 12px;
}

.ladder-config-row label,
.ladder-weight-row label {
  display: grid;
  gap: 5px;
  color: var(--muted);
  font-size: 12px;
}

.ladder-config-row input,
.ladder-weight-row input {
  width: 100%;
  min-height: 36px;
  padding: 0 10px;
  border: 1px solid var(--line);
  border-radius: 7px;
  background: #0c0f14;
  color: var(--text);
}

/* Admin console v2: PC/M split layout. */
body.admin-page {
  --admin-topbar: 56px;
  --admin-sidebar: 226px;
  height: 100vh;
  overflow: hidden;
  background: #f3f5f9;
  color: #1f2a44;
}

body.admin-page .admin-dashboard {
  display: grid;
  grid-template-columns: var(--admin-sidebar) minmax(0, 1fr);
  grid-template-rows: var(--admin-topbar) minmax(0, 1fr);
  height: 100vh;
}

body.admin-page .admin-topbar {
  grid-column: 1 / -1;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 16px;
  min-width: 0;
  padding: 0 20px;
  background: #1f2a55;
  color: #dbe7ff;
  box-shadow: 0 1px 0 rgba(15, 23, 42, 0.12);
}

body.admin-page .admin-topbar-left,
body.admin-page .admin-topbar-right {
  display: flex;
  align-items: center;
  gap: 16px;
  min-width: 0;
}

body.admin-page .admin-menu-toggle {
  width: 38px;
  height: 38px;
  display: grid;
  place-items: center;
  border: 0;
  border-radius: 8px;
  background: rgba(255, 255, 255, 0.08);
  color: #fff;
}

body.admin-page .admin-brand {
  display: inline-flex;
  align-items: center;
  gap: 10px;
  min-width: 158px;
  color: #fff;
  text-decoration: none;
}

body.admin-page .admin-brand-mark {
  width: 34px;
  height: 34px;
  display: grid;
  place-items: center;
  border-radius: 10px;
  background: linear-gradient(135deg, #1890ff, #31c2ff);
  color: #fff;
  font-weight: 900;
}

body.admin-page .admin-brand strong {
  font-size: 17px;
  letter-spacing: 0.02em;
}

body.admin-page .admin-topnav {
  display: flex;
  align-items: center;
  gap: 8px;
}

body.admin-page .admin-topnav button {
  height: 34px;
  padding: 0 12px;
  border: 0;
  border-radius: 6px;
  background: transparent;
  color: #c7d2fe;
  cursor: default;
}

body.admin-page .admin-topnav button.active,
body.admin-page .admin-topnav button:hover {
  background: rgba(255, 255, 255, 0.12);
  color: #fff;
}

body.admin-page .admin-global-search {
  position: relative;
  display: flex;
  align-items: center;
  width: min(330px, 28vw);
  min-width: 220px;
  color: #8a94a6;
}

body.admin-page .admin-global-search input {
  width: 100%;
  height: 36px;
  padding: 0 40px 0 14px;
  border: 1px solid #d7dce5;
  border-radius: 4px;
  background: #fff;
  color: #1f2a44;
}

body.admin-page .admin-global-search svg {
  position: absolute;
  right: 12px;
  width: 18px;
  height: 18px;
}

body.admin-page .admin-topbar-right a,
body.admin-page #adminTopbarUser {
  color: #dbe7ff;
  text-decoration: none;
  white-space: nowrap;
  font-size: 14px;
}

body.admin-page .admin-sidebar {
  grid-column: 1;
  grid-row: 2;
  display: flex;
  flex-direction: column;
  gap: 14px;
  min-width: 0;
  padding: 18px 12px;
  border-right: 1px solid #e5e8ef;
  background: #fff;
  color: #64748b;
  overflow: auto;
}

body.admin-page .admin-sidebar h1 {
  margin: 0;
  padding: 0 10px;
  color: #1e293b;
  font-size: 18px;
}

body.admin-page .admin-sidebar > p {
  margin: -8px 0 4px;
  padding: 0 10px;
  color: #94a3b8;
  font-size: 12px;
}

body.admin-page .admin-menu-group {
  display: grid;
  gap: 4px;
}

body.admin-page .admin-menu-group > span {
  padding: 8px 10px 4px;
  color: #94a3b8;
  font-size: 12px;
}

body.admin-page .admin-sidebar button,
body.admin-page .admin-sidebar a {
  min-height: 40px;
  display: flex;
  align-items: center;
  justify-content: flex-start;
  gap: 10px;
  padding: 0 12px;
  border: 0;
  border-radius: 6px;
  background: transparent;
  color: #53627c;
  text-decoration: none;
  cursor: pointer;
  font-weight: 600;
}

body.admin-page .admin-sidebar button svg {
  width: 17px;
  height: 17px;
  color: #8a94a6;
}

body.admin-page .admin-sidebar button.active,
body.admin-page .admin-sidebar a:hover,
body.admin-page .admin-sidebar button:hover {
  background: #eef4ff;
  color: #245bdb;
}

body.admin-page .admin-sidebar button.active svg,
body.admin-page .admin-sidebar button:hover svg {
  color: #245bdb;
}

body.admin-page .admin-sidebar #logoutButton {
  margin-top: auto;
  border: 1px solid #e5e8ef;
  justify-content: center;
}

body.admin-page .admin-workspace {
  grid-column: 2;
  grid-row: 2;
  min-width: 0;
  overflow: auto;
  padding: 0 22px 32px;
  background: #f3f5f9;
}

body.admin-page .admin-header {
  min-height: 86px;
  display: flex;
  align-items: center;
  justify-content: space-between;
  margin: 0;
}

body.admin-page .admin-breadcrumb {
  margin-bottom: 8px;
  color: #64748b;
  font-size: 13px;
}

body.admin-page .admin-header h2 {
  margin: 0;
  color: #101828;
  font-size: 24px;
}

body.admin-page .admin-header p {
  margin: 6px 0 0;
  color: #64748b;
}

body.admin-page .admin-panel {
  border: 0;
  border-radius: 0;
  background: transparent;
  padding: 0;
}

body.admin-page .login-panel {
  max-width: 520px;
  margin: 80px auto 0;
  padding: 28px;
  border: 1px solid #e5e8ef;
  border-radius: 10px;
  background: #fff;
  box-shadow: 0 10px 30px rgba(15, 23, 42, 0.08);
}

body.admin-page .admin-toolbar {
  display: grid;
  grid-template-columns: repeat(3, minmax(180px, 1fr));
  gap: 18px 28px;
  align-items: end;
  margin: 0 0 18px;
  padding: 22px;
  border: 1px solid #e5e8ef;
  border-radius: 6px;
  background: #fff;
  box-shadow: 0 1px 2px rgba(15, 23, 42, 0.04);
}

body.admin-page .admin-form-grid {
  display: grid;
  grid-template-columns: repeat(2, minmax(160px, 1fr));
  gap: 14px;
}

body.admin-page .admin-toolbar label,
body.admin-page .admin-form-grid label {
  display: grid;
  grid-template-columns: 82px minmax(0, 1fr);
  align-items: center;
  gap: 10px;
  margin: 0;
  color: #53627c;
  font-size: 14px;
}

body.admin-page .admin-toolbar input,
body.admin-page .admin-toolbar select,
body.admin-page .admin-form-grid input {
  width: 100%;
  min-height: 36px;
  padding: 0 12px;
  border: 1px solid #d7dce5;
  border-radius: 4px;
  background: #fff;
  color: #1f2a44;
}

body.admin-page .admin-toolbar button {
  min-height: 36px;
  justify-content: center;
}

body.admin-page .admin-toolbar #adminClearFilterButton {
  justify-self: end;
  width: 78px;
}

body.admin-page .admin-toolbar #refreshButton {
  width: 86px;
  border-color: #2f6bff;
  background: #2f6bff;
  color: #fff;
}

body.admin-page .admin-table-panel {
  border: 1px solid #e5e8ef;
  border-radius: 6px;
  background: #fff;
  box-shadow: 0 1px 2px rgba(15, 23, 42, 0.04);
}

body.admin-page .admin-table-tabs {
  display: flex;
  align-items: center;
  gap: 22px;
  min-height: 48px;
  padding: 0 20px;
  border-bottom: 1px solid #edf0f5;
}

body.admin-page .admin-table-tabs button {
  height: 48px;
  border: 0;
  border-bottom: 2px solid transparent;
  background: transparent;
  color: #53627c;
  font-weight: 700;
}

body.admin-page .admin-table-tabs button.active {
  border-bottom-color: #2f6bff;
  color: #2f6bff;
}

body.admin-page .admin-table-actions {
  margin-left: auto;
}

body.admin-page .admin-table-actions .primary-button {
  min-height: 34px;
  padding: 0 14px;
  border-radius: 4px;
}

body.admin-page .admin-list {
  display: grid;
  gap: 0;
  padding: 0 16px 12px;
}

body.admin-page .admin-list > p {
  margin: 22px 0;
  color: #64748b;
}

body.admin-page .admin-item {
  display: grid;
  grid-template-columns: 72px minmax(0, 1fr) minmax(230px, auto);
  align-items: center;
  gap: 14px;
  min-height: 64px;
  padding: 10px 0;
  border: 0;
  border-bottom: 1px solid #edf0f5;
  border-radius: 0;
  background: transparent;
  box-shadow: none;
}

body.admin-page .admin-item-user,
body.admin-page .admin-item-comment,
body.admin-page .admin-item-report {
  grid-template-columns: minmax(0, 1fr) minmax(230px, auto);
}

body.admin-page .admin-thumb {
  width: 54px;
  height: 54px;
  border-radius: 4px;
  object-fit: cover;
  background: #eef2f7;
}

body.admin-page .admin-item-body {
  min-width: 0;
  display: grid;
  gap: 4px;
}

body.admin-page .admin-item-title {
  color: #1f2a44;
  font-size: 14px;
  font-weight: 700;
}

body.admin-page .admin-item-meta,
body.admin-page .admin-item-body p {
  margin: 0;
  color: #64748b;
  font-size: 13px;
}

body.admin-page .admin-actions {
  display: flex;
  justify-content: flex-end;
  flex-wrap: wrap;
  gap: 6px;
  padding: 0;
}

body.admin-page .admin-actions .small-button {
  min-height: 30px;
  padding: 0 8px;
  border: 0;
  background: transparent;
  color: #245bdb;
  box-shadow: none;
}

body.admin-page .admin-actions .small-button:hover {
  background: #eef4ff;
}

body.admin-page .admin-pagination {
  display: flex;
  align-items: center;
  justify-content: flex-end;
  gap: 10px;
  margin: 0;
  padding: 14px 16px;
  color: #64748b;
  font-size: 13px;
}

body.admin-page .admin-page-info {
  min-width: 150px;
  text-align: center;
}

body.admin-page .admin-pagination #adminPageSizeWrap,
body.admin-page .admin-page-jump {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  margin: 0;
  color: #64748b;
  font-size: 13px;
}

body.admin-page .admin-page-jump input {
  width: 64px;
  height: 32px;
  border: 1px solid #d5dbe7;
  border-radius: 4px;
  color: #334155;
  text-align: center;
}

@media (max-width: 760px) {
  .admin-page {
    height: auto;
    overflow: auto;
  }

  .admin-dashboard {
    display: block;
    min-height: 100vh;
    height: auto;
  }

  .admin-sidebar {
    position: sticky;
    top: 0;
    z-index: 10;
    display: grid;
    grid-template-columns: repeat(4, minmax(0, 1fr));
    gap: 8px;
    padding: 10px;
    border-right: 0;
    border-bottom: 1px solid var(--line);
  }

  .admin-sidebar h1 {
    grid-column: 1 / -1;
    margin: 0;
    font-size: 17px;
  }

  .admin-sidebar button,
  .admin-sidebar a {
    min-height: 36px;
    justify-content: center;
    padding: 0 8px;
    font-size: 12px;
    text-align: center;
  }

  .admin-sidebar #logoutButton {
    margin-top: 0;
  }

  .admin-workspace {
    padding: 14px 10px 24px;
  }

  .admin-header {
    align-items: flex-start;
    flex-direction: column;
  }

  .admin-panel {
    padding: 12px;
  }

  .admin-toolbar,
  .admin-form-grid {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 10px;
  }

  .admin-toolbar label,
  .admin-form-grid label,
  .admin-toolbar button {
    min-width: 0;
  }

  .admin-list {
    gap: 10px;
  }

  .admin-item {
    grid-template-columns: 74px minmax(0, 1fr);
    align-items: start;
  }

  .admin-actions {
    grid-column: 1 / -1;
    justify-content: flex-start;
  }

  .ladder-weight-row,
  .ladder-config-row {
    grid-template-columns: 1fr 1fr;
  }

  .ladder-config-row strong {
    grid-column: 1 / -1;
  }

  .ladder-config-row span {
    display: none;
  }
}

@media (max-width: 420px) {
  .admin-sidebar,
  .admin-toolbar,
  .admin-form-grid {
    grid-template-columns: 1fr 1fr;
  }

  .admin-item {
    grid-template-columns: 1fr;
  }

  .admin-thumb {
    width: 100%;
    height: 150px;
  }
}

body.admin-page.is-mobile {
  --admin-topbar: 54px;
  height: auto;
  min-height: 100vh;
  overflow: auto;
  background: #f3f5f9;
}

body.admin-page.is-mobile .admin-dashboard {
  display: block;
  min-height: 100vh;
  height: auto;
}

body.admin-page.is-mobile .admin-topbar {
  position: sticky;
  top: 0;
  z-index: 30;
  min-height: var(--admin-topbar);
  padding: 0 12px;
}

body.admin-page.is-mobile .admin-brand {
  min-width: 0;
}

body.admin-page.is-mobile .admin-brand strong {
  font-size: 15px;
}

body.admin-page.is-mobile .admin-topnav,
body.admin-page.is-mobile .admin-global-search,
body.admin-page.is-mobile .admin-topbar-right a {
  display: none;
}

body.admin-page.is-mobile #adminTopbarUser {
  max-width: 96px;
  overflow: hidden;
  text-overflow: ellipsis;
}

body.admin-page.is-mobile .admin-sidebar {
  position: fixed;
  z-index: 40;
  top: var(--admin-topbar);
  left: 0;
  bottom: 0;
  width: min(82vw, 286px);
  display: flex;
  grid-template-columns: none;
  transform: translateX(-105%);
  transition: transform 0.2s ease;
  box-shadow: 12px 0 30px rgba(15, 23, 42, 0.18);
}

body.admin-page.is-mobile.admin-menu-open .admin-sidebar {
  transform: translateX(0);
}

body.admin-page.is-mobile .admin-sidebar h1 {
  display: block;
  grid-column: auto;
}

body.admin-page.is-mobile .admin-sidebar button,
body.admin-page.is-mobile .admin-sidebar a {
  justify-content: flex-start;
  font-size: 14px;
}

body.admin-page.is-mobile .admin-workspace {
  padding: 14px 10px 24px;
  overflow: visible;
}

body.admin-page.is-mobile .admin-header {
  min-height: auto;
  align-items: flex-start;
  flex-direction: column;
  margin-bottom: 12px;
}

body.admin-page.is-mobile .admin-header h2 {
  font-size: 21px;
}

body.admin-page.is-mobile .login-panel {
  margin: 30px 0 0;
  padding: 18px;
}

body.admin-page.is-mobile .admin-toolbar {
  display: grid;
  grid-template-columns: 1fr;
  gap: 10px;
  padding: 14px;
  margin-bottom: 12px;
}

body.admin-page.is-mobile .admin-toolbar label,
body.admin-page.is-mobile .admin-form-grid label {
  grid-template-columns: 72px minmax(0, 1fr);
}

body.admin-page.is-mobile .admin-form-grid {
  grid-template-columns: 1fr;
}

body.admin-page.is-mobile .admin-toolbar #adminClearFilterButton,
body.admin-page.is-mobile .admin-toolbar #refreshButton {
  width: 100%;
  justify-self: stretch;
}

body.admin-page.is-mobile .admin-table-tabs {
  gap: 14px;
  padding: 0 12px;
  overflow-x: auto;
}

body.admin-page.is-mobile .admin-table-actions {
  display: none;
}

body.admin-page.is-mobile .admin-list {
  gap: 10px;
  padding: 12px;
}

body.admin-page.is-mobile .admin-item,
body.admin-page.is-mobile .admin-item-user,
body.admin-page.is-mobile .admin-item-comment,
body.admin-page.is-mobile .admin-item-report {
  grid-template-columns: 74px minmax(0, 1fr);
  gap: 10px;
  padding: 12px;
  border: 1px solid #e5e8ef;
  border-radius: 8px;
  background: #fff;
}

body.admin-page.is-mobile .admin-item-user,
body.admin-page.is-mobile .admin-item-comment,
body.admin-page.is-mobile .admin-item-report {
  grid-template-columns: 1fr;
}

body.admin-page.is-mobile .admin-actions {
  grid-column: 1 / -1;
  justify-content: flex-start;
  padding-top: 4px;
}

body.admin-page.is-mobile .admin-thumb {
  width: 74px;
  height: 74px;
}

body.admin-page.is-mobile .admin-pagination {
  justify-content: center;
  flex-wrap: wrap;
}

.modal.hidden { display: none; }

.modal {
  position: fixed;
  z-index: 5000;
  inset: 0;
  display: grid;
  place-items: center;
  padding: 24px;
  background: rgba(0, 0, 0, 0.68);
}

.modal-card {
  width: min(560px, 100%);
  max-height: 88vh;
  overflow: auto;
  padding: 16px;
  border: 1px solid var(--line);
  border-radius: 8px;
  background: var(--panel);
  box-shadow: 0 20px 70px rgba(0,0,0,0.45);
}

.admin-card { width: min(980px, 100%); }
.image-card {
  width: 100vw;
  max-width: none;
  height: 100dvh;
  max-height: none;
  display: grid;
  grid-template-rows: auto minmax(0, 1fr) auto;
  overflow: hidden;
  border: 0;
  border-radius: 0;
  background: rgba(0, 0, 0, 0.94);
}
.points-card,
.public-profile-card {
  width: min(720px, 100%);
}

.points-rules {
  display: grid;
  gap: 12px;
  color: var(--muted);
  line-height: 1.7;
}

.points-rules p {
  margin: 0;
}

.points-rules h3 {
  margin: 8px 0 0;
  color: var(--text);
  font-size: 15px;
}

.public-profile-summary {
  margin: 0 0 12px;
  color: var(--muted);
  font-size: 13px;
}

.public-profile-head {
  display: grid;
  grid-template-columns: 58px minmax(0, 1fr) auto;
  align-items: center;
  gap: 12px;
  margin-bottom: 12px;
  padding: 10px;
  border: 1px solid var(--line);
  border-radius: 8px;
  background: #101720;
}

.public-profile-head img {
  width: 58px;
  height: 58px;
  object-fit: cover;
  border: 1px solid rgba(112, 199, 255, 0.42);
  border-radius: 999px;
  background: #050607;
}

.public-profile-head strong,
.public-profile-head span {
  display: block;
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.public-profile-head strong {
  color: var(--text);
  font-size: 17px;
}

.public-profile-head span {
  margin-top: 5px;
  color: var(--muted);
  font-size: 12px;
}

.profile-stats {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: 8px;
}

.profile-stats span {
  display: grid;
  place-items: center;
  min-width: 0;
  padding: 9px 8px;
  border: 1px solid rgba(112, 199, 255, 0.24);
  border-radius: 8px;
  background: rgba(8, 12, 18, 0.58);
}

.profile-stats strong {
  color: var(--text);
  font-size: 17px;
  line-height: 1.1;
}

.profile-stats small {
  margin-top: 4px;
  color: var(--muted);
  font-size: 12px;
}

.public-profile-list {
  display: grid;
  gap: 10px;
}

.public-profile-post {
  display: grid;
  grid-template-columns: 92px minmax(0, 1fr);
  gap: 12px;
  padding: 10px;
  border: 1px solid var(--line);
  border-radius: 8px;
  background: #101720;
  cursor: pointer;
}

.public-profile-post img {
  width: 92px;
  height: 92px;
  object-fit: cover;
  border-radius: 6px;
  background: #050607;
}

.public-profile-post strong,
.public-profile-post span,
.public-profile-post p {
  display: block;
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
}

.public-profile-post strong {
  color: var(--text);
  white-space: nowrap;
}

.public-profile-post span,
.public-profile-post p {
  color: var(--muted);
  font-size: 12px;
  line-height: 1.45;
}

.public-profile-post p {
  display: -webkit-box;
  margin: 6px 0 0;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
}

.points-pill {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: fit-content;
  max-width: 100%;
  min-height: 30px;
  padding: 0 10px;
  border: 1px solid rgba(255, 210, 111, 0.42);
  border-radius: 999px;
  background: rgba(255, 210, 111, 0.1);
  color: #ffd26f;
  font-size: 12px;
  font-weight: 800;
  line-height: 1.2;
  white-space: nowrap;
}

.points-pill:hover {
  border-color: rgba(255, 210, 111, 0.72);
  background: rgba(255, 210, 111, 0.16);
}

.modal-header {
  display: flex;
  align-items: center;
  justify-content: flex-start;
  gap: 12px;
  margin-bottom: 14px;
}

.modal-header .icon-link {
  order: -1;
}

.image-card .modal-header {
  margin: 0;
  padding: 12px 14px;
}

.image-card .modal-header h2 {
  min-width: 0;
  overflow: hidden;
  color: #fff;
  font-size: 16px;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.image-exit-button {
  width: auto;
  min-width: 86px;
  min-height: 40px;
  display: inline-flex;
  flex: 0 0 auto;
  align-items: center;
  justify-content: center;
  gap: 6px;
  padding: 0 12px;
  border-color: rgba(255, 255, 255, 0.26);
  background: rgba(255, 255, 255, 0.1);
  color: #fff;
  white-space: nowrap;
}

.image-exit-button span {
  white-space: nowrap;
}

.field-label {
  display: grid;
  gap: 6px;
  margin-bottom: 12px;
  color: var(--muted);
  font-size: 12px;
}

.field-label input, .field-label textarea, .field-label select, .admin-toolbar input {
  width: 100%;
  min-height: 36px;
  padding: 8px 10px;
  border: 1px solid var(--line);
  border-radius: 6px;
  outline: none;
  background: #0f1216;
  color: var(--text);
}

.wechat-box {
  display: grid;
  grid-template-columns: 92px 1fr auto;
  align-items: center;
  gap: 10px;
  margin-bottom: 12px;
}

.qr-box {
  display: grid;
  place-items: center;
  width: 92px;
  height: 92px;
  border: 1px solid var(--line);
  border-radius: 6px;
  background:
    linear-gradient(45deg, #fff 25%, transparent 25%),
    linear-gradient(-45deg, #fff 25%, transparent 25%),
    linear-gradient(45deg, transparent 75%, #fff 75%),
    linear-gradient(-45deg, transparent 75%, #fff 75%);
  background-color: #111820;
  background-size: 18px 18px;
  color: #0f1216;
  font-size: 12px;
  font-weight: 700;
}

.form-hint {
  margin: 0 0 12px;
}

.image-gallery {
  min-height: 0;
  display: flex;
  align-items: center;
  gap: 12px;
  overflow: auto;
  margin: 0;
  padding: 12px 14px;
  touch-action: none;
}

.image-preview-frame {
  position: relative;
  width: calc(100vw - 28px);
  height: 100%;
  min-width: calc(100vw - 28px);
  display: grid;
  place-items: center;
  overflow: hidden;
  border-radius: 8px;
  background: #030405;
  touch-action: none;
}

.image-preview-main {
  max-width: 100%;
  max-height: 100%;
  object-fit: contain;
  user-select: none;
  will-change: transform;
  transform-origin: center center;
}

.image-preview-map {
  position: absolute;
  right: 14px;
  bottom: 14px;
  z-index: 3;
  width: min(28vw, 132px);
  height: min(20vw, 96px);
  overflow: hidden;
  border: 1px solid rgba(255, 255, 255, 0.72);
  border-radius: 6px;
  background: rgba(0, 0, 0, 0.56);
  box-shadow: 0 8px 24px rgba(0, 0, 0, 0.44);
  touch-action: none;
}

.image-preview-map[hidden] {
  display: none;
}

.image-preview-map img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  opacity: 0.74;
  pointer-events: none;
}

.image-preview-window {
  position: absolute;
  border: 2px solid #70c7ff;
  border-radius: 4px;
  background: rgba(112, 199, 255, 0.16);
  box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.5);
  pointer-events: none;
}

img:not([src$=".svg"]) {
  cursor: zoom-in;
}

.image-card img,
button img,
a img {
  cursor: inherit;
}

.image-card .detail-grid {
  max-height: min(26dvh, 220px);
  overflow: auto;
  margin: 0;
  padding: 12px 14px calc(12px + env(safe-area-inset-bottom));
  border-top: 1px solid rgba(255, 255, 255, 0.12);
  color: rgba(255, 255, 255, 0.82);
}

.image-card .detail-grid:empty {
  display: none;
}

.admin-toolbar {
  display: flex;
  flex-wrap: wrap;
  align-items: flex-end;
  gap: 10px;
  margin-bottom: 16px;
}

.admin-toolbar label {
  display: grid;
  gap: 6px;
  color: var(--muted);
  font-size: 12px;
}

.detail-grid {
  display: grid;
  grid-template-columns: 110px minmax(0, 1fr);
  gap: 8px 10px;
  margin: 0;
  font-size: 12px;
}

.detail-grid dt { color: var(--muted); }
.detail-grid dd { min-width: 0; margin: 0; overflow-wrap: anywhere; }

.chemical-formula {
  font-family: var(--font-sans);
  letter-spacing: 0.01em;
  overflow-wrap: anywhere;
}

.chemical-formula sub,
.chemical-formula sup {
  font-size: 0.72em;
  line-height: 0;
}
.chip-list, .legend { display: flex; flex-wrap: wrap; gap: 7px; }

.legend-item {
  display: grid;
  grid-template-columns: 12px auto;
  align-items: center;
  gap: 7px;
  color: var(--muted);
  font-size: 12px;
}

.swatch {
  width: 12px;
  height: 12px;
  border-radius: 2px;
  border: 1px solid rgba(255,255,255,0.32);
}

pre {
  max-height: 280px;
  margin: 0;
  overflow: auto;
  padding: 12px;
  border: 1px solid var(--line);
  border-radius: 7px;
  background: #0f1216;
  color: #d9e0e8;
  white-space: pre-wrap;
  overflow-wrap: anywhere;
  font-size: 12px;
  line-height: 1.55;
}

/* PC layout namespace. Keep desktop-only layout edits here. */
body:not(.is-mobile) {
  height: 100vh;
  overflow: hidden;
}

body:not(.is-mobile) .app-shell {
  display: grid;
  grid-template-columns: minmax(280px, 330px) minmax(520px, 1fr) minmax(320px, 380px);
  height: 100vh;
}

body:not(.is-mobile) .sidebar {
  border-right: 1px solid var(--line);
}

body:not(.is-mobile) .detail-pane {
  border-left: 1px solid var(--line);
  overflow-y: auto;
  padding: 16px;
}

body:not(.is-mobile) .species-list {
  height: calc(100vh - 176px);
  overflow-y: auto;
}

body:not(.is-mobile) .main-pane {
  display: grid;
  grid-template-rows: auto minmax(0, 1fr);
  overflow: hidden;
}

body:not(.is-mobile) .grid-view {
  min-height: 0;
  height: auto;
  overflow-y: auto;
  grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));
}

body:not(.is-mobile) .expanded-view {
  position: absolute;
  inset: 74px 0 0;
}

body:not(.is-mobile) .expanded-viewer {
  position: absolute;
  inset: 0;
}

@media (max-width: 1050px) {
  body:not(.is-mobile) { overflow: auto; }
  body:not(.is-mobile) .app-shell { grid-template-columns: 1fr; height: auto; min-height: 100vh; }
  body:not(.is-mobile) .species-list { height: 260px; }
  body:not(.is-mobile) .grid-view { height: auto; min-height: 520px; }
  body:not(.is-mobile) .expanded-view { position: relative; inset: auto; height: 620px; }
}

/* Mobile layout namespace. Keep mobile-only layout edits here. */
body.is-mobile {
  height: auto;
  min-height: 100vh;
  overflow: auto;
  background: #090a0c;
  -webkit-text-size-adjust: 100%;
  padding-bottom: 72px;
}

body.is-mobile .app-shell {
  display: block;
  height: auto;
  min-height: 100vh;
}

body.is-mobile .sidebar,
body.is-mobile .main-pane,
body.is-mobile .detail-pane {
  width: 100%;
  border: 0;
}

body.is-mobile .sidebar {
  position: relative;
  top: 0;
  z-index: 120;
  max-height: none;
  overflow: visible;
  display: grid;
  grid-template-columns: 152px minmax(0, 1fr);
  grid-template-rows: 64px 36px 264px;
  border-bottom: 1px solid var(--line);
  box-shadow: 0 12px 28px rgba(0,0,0,0.34);
}

body.is-mobile .site-logo {
  grid-column: 1;
  grid-row: 1;
  min-height: 44px;
  padding: 0 8px;
  justify-content: flex-start;
  border-right: 1px solid var(--line);
}

body.is-mobile .site-logo .brand-mark {
  width: 28px;
  height: 28px;
}

body.is-mobile .site-logo .brand-mark img {
  width: 22px;
  height: 22px;
}

body.is-mobile .site-logo .brand-word {
  font-size: 11px;
}

body.is-mobile .hero-banner {
  grid-column: 1 / -1;
  grid-row: 3;
  min-height: 264px;
  height: 264px;
  padding: 0 14px;
  font-size: 14px;
  align-items: flex-end;
  background-position: center;
  background-size: cover;
  overflow: hidden;
}

body.is-mobile .mobile-banner-title {
  grid-column: 1 / -1;
  grid-row: 2;
  border-bottom: 1px solid var(--line);
  background: #15181d;
}

body.is-mobile .hero-banner-pager {
  left: 12px;
  bottom: 12px;
}

body.is-mobile .sidebar-header {
  display: none;
  grid-column: 2;
  grid-row: 1;
  align-items: center;
  justify-content: flex-end;
  padding: 10px 12px 10px 0;
  border-bottom: 0;
}

body.is-mobile .sidebar-header > div:first-child { display: none; }

body.is-mobile .sidebar-header h1 {
  font-size: 20px;
}

body.is-mobile .header-actions {
  gap: 6px;
  display: flex;
  align-items: center;
  justify-content: flex-end;
}

body.is-mobile .header-actions a.icon-link {
  display: none;
}

body.is-mobile .language-switch,
body.is-mobile .icon-link,
body.is-mobile .view-actions button,
body.is-mobile .expanded-actions button {
  width: 44px;
  height: 44px;
  min-height: 44px;
}

body.is-mobile .language-switch {
  width: 64px;
  padding: 0 8px;
}

body.is-mobile .toolbar {
  grid-column: 2;
  grid-row: 1;
  position: relative;
  z-index: 140;
  align-self: center;
  padding: 10px 12px 10px 0;
  gap: 8px;
}

body.is-mobile .search-wrap {
  z-index: 150;
}

body.is-mobile .search-suggestions {
  z-index: 2000;
}

body.is-mobile .toolbar select {
  display: none;
}

body.is-mobile .search-wrap,
body.is-mobile .toolbar select {
  min-height: 46px;
  font-size: 16px;
}

body.is-mobile .summary-row {
  display: none;
  grid-template-columns: 1fr 1fr;
  padding: 9px 14px;
  font-size: 12px;
}

body.is-mobile .summary-row span:last-child {
  text-align: right;
}

body.is-mobile .species-list {
  display: none;
}

body.is-mobile .species-item {
  min-height: 52px;
  margin-bottom: 8px;
  padding: 10px 12px;
}

body.is-mobile .main-pane {
  display: block;
  min-height: auto;
  overflow: visible;
}

body.is-mobile .main-topbar {
  display: none;
}

body.is-mobile .main-topbar h2 {
  font-size: 20px;
}

body.is-mobile .grid-view {
  display: none;
}

body.is-mobile .model-tile {
  min-height: 318px;
  border-radius: 8px;
}

body.is-mobile .tile-viewer {
  height: 252px;
}

body.is-mobile .tile-info {
  min-height: 64px;
  padding: 10px 12px;
}

body.is-mobile .tile-title,
body.is-mobile .tile-subtitle {
  white-space: normal;
  display: -webkit-box;
  -webkit-box-orient: vertical;
}

body.is-mobile .tile-title {
  -webkit-line-clamp: 2;
}

body.is-mobile .tile-subtitle {
  -webkit-line-clamp: 2;
}

body.is-mobile .expanded-view {
  position: fixed;
  inset: 0;
  z-index: 3000;
  height: 100dvh;
  overflow-y: auto;
  background: #090a0c;
  overscroll-behavior: contain;
}

body.is-mobile .expanded-viewer {
  position: relative;
  inset: auto;
  height: 58dvh;
  min-height: 390px;
  touch-action: none;
}

body.is-mobile .expanded-view.has-mineral-images .expanded-viewer {
  inset: auto;
  height: 52dvh;
  min-height: 340px;
}

body.is-mobile .mineral-image-strip {
  position: relative;
  left: auto;
  right: auto;
  bottom: auto;
  grid-auto-flow: column;
  grid-auto-columns: 92px;
  grid-template-columns: none;
  max-height: none;
  overflow-x: auto;
  overflow-y: hidden;
  padding: 10px 12px;
  border-width: 1px 0;
  border-radius: 0;
  background: #090a0c;
}

body.is-mobile .expanded-info {
  position: relative;
  left: auto;
  right: auto;
  top: auto;
  display: block;
  min-height: 0;
  padding: 14px;
  border-top: 1px solid var(--line);
  background: #0c1016;
  pointer-events: auto;
}

body.is-mobile .expanded-actions {
  position: fixed;
  right: 12px;
  top: 72px;
  z-index: 69;
  display: grid;
  gap: 8px;
  flex-wrap: wrap;
  justify-content: center;
}

body.is-mobile .expanded-view:not(.hidden) .expanded-actions {
  position: fixed !important;
  right: max(10px, env(safe-area-inset-right, 0px));
  top: max(10px, env(safe-area-inset-top, 0px));
  z-index: 120;
}

body.is-mobile .expanded-model-settings {
  margin-top: 0;
}

body.is-mobile .expanded-model-settings > button {
  border-radius: 8px;
}

body.is-mobile .expanded-model-settings-panel {
  position: relative;
  left: auto;
  top: auto;
  bottom: auto;
  z-index: 2;
  width: calc(100% - 28px);
  max-width: 420px;
  margin: 0 14px 12px;
  transform: none;
}

body.is-mobile .expanded-close {
  position: fixed;
  top: 12px;
  left: 12px;
  z-index: 70;
  display: grid;
  background: rgba(14, 18, 25, 0.86);
  backdrop-filter: blur(8px);
}

body.is-mobile .mobile-expanded-detail-grid {
  display: none;
  grid-template-columns: 82px minmax(0, 1fr);
  gap: 8px 10px;
  margin-top: 12px;
}

body.is-mobile .mobile-expanded-detail-grid.is-open {
  display: grid;
}

body.is-mobile .mobile-show-post {
  width: 100%;
  min-height: 48px;
  margin: 12px 0 10px;
  border-color: rgba(246, 197, 73, 0.85);
  background: linear-gradient(135deg, #d9951f, #f6c549);
  color: #111;
  font-size: 17px;
  font-weight: 900;
  box-shadow: 0 8px 22px rgba(246, 197, 73, 0.22);
}

body.is-mobile .mobile-info-toggle {
  width: 100%;
  min-height: 40px;
  border: 1px solid var(--line);
  border-radius: 8px;
  background: #121923;
  color: var(--text);
  font-weight: 800;
}

body.is-mobile .mobile-info-toggle.active {
  border-color: rgba(112, 199, 255, 0.7);
  background: rgba(112, 199, 255, 0.14);
}

body.is-mobile .mobile-expanded-posts {
  display: grid;
  gap: 10px;
  padding: 0 12px 16px;
}

body:not(.is-mobile) .mobile-expanded-posts {
  display: none;
}

body.is-mobile .detail-pane {
  display: none;
}

body.is-mobile .detail-grid {
  grid-template-columns: minmax(96px, 34%) minmax(0, 1fr);
  gap: 8px 10px;
}

body.is-mobile .modal {
  padding: 12px;
  align-items: flex-end;
}

body.is-mobile .modal-card {
  width: 100%;
  max-height: 92dvh;
  border-radius: 12px 12px 0 0;
}

body.is-mobile .mobile-home {
  position: relative;
  z-index: 1;
  display: grid;
  gap: 14px;
  padding: 12px;
}

body.is-mobile .mobile-tab-panel {
  display: block;
  padding: 14px 12px 88px;
}

body.is-mobile .mobile-tab-panel.hidden {
  display: none !important;
}

body.is-mobile .mobile-panel-header {
  padding: 8px 2px 14px;
}

body.is-mobile .mobile-panel-header-row {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 12px;
}

body.is-mobile .mobile-panel-header h2 {
  margin: 0;
  font-size: 22px;
}

body.is-mobile .mobile-panel-header p {
  margin: 4px 0 0;
}

body.is-mobile .mobile-home-title,
body.is-mobile .mobile-model-heading {
  display: block;
  padding: 10px 14px 8px;
  color: var(--text);
  font-size: 13px;
  font-weight: 900;
}

body.is-mobile .mobile-model-heading {
  padding: 12px 2px 10px;
}

body.is-mobile .mobile-model-heading h2 {
  margin: 0;
  font-size: 13px;
}

body.is-mobile .mobile-model-heading h2 span {
  margin-left: 4px;
  font-size: 10px;
  font-weight: 800;
  color: var(--muted);
}

body.is-mobile .mobile-library-list,
body.is-mobile .mobile-community-list,
body.is-mobile .mobile-message-list,
body.is-mobile .mobile-mine-list,
body.is-mobile .mobile-featured-list,
body.is-mobile .mobile-profile-list {
  display: grid;
  gap: 10px;
}

body.is-mobile .mobile-message-card {
  display: grid;
  gap: 8px;
  padding: 14px;
  border: 1px solid var(--line);
  border-radius: 12px;
  background: #101720;
}

body.is-mobile .mobile-message-card.is-unread {
  border-color: rgba(112, 199, 255, 0.7);
  box-shadow: inset 3px 0 0 rgba(112, 199, 255, 0.9);
}

body.is-mobile .mobile-message-card > div {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 10px;
}

body.is-mobile .mobile-message-card strong {
  color: var(--text);
  font-size: 15px;
}

body.is-mobile .mobile-message-card time {
  flex: 0 0 auto;
  color: var(--muted);
  font-size: 11px;
}

body.is-mobile .mobile-message-card p,
body.is-mobile .mobile-message-empty {
  margin: 0;
  color: var(--muted);
  line-height: 1.65;
  white-space: pre-wrap;
}

.nav-badge {
  position: absolute;
  right: 12px;
  top: 8px;
  min-width: 16px;
  height: 16px;
  padding: 0 4px;
  border-radius: 999px;
  background: #ff4d5e;
  color: #fff;
  font-size: 10px;
  font-weight: 900;
  line-height: 16px;
  text-align: center;
}

body.is-mobile .mobile-mine-shortcuts button {
  position: relative;
}

body.is-mobile .mobile-tabbar [data-mobile-tab] {
  position: relative;
}

body.is-mobile .mobile-mine-shortcuts .nav-badge {
  right: 10px;
  top: 8px;
}

body.is-mobile .mobile-library-switch,
body.is-mobile .mobile-profile-tabs {
  display: inline-grid;
  grid-auto-flow: column;
  gap: 4px;
  padding: 4px;
  border: 1px solid var(--line);
  border-radius: 999px;
  background: #080b10;
}

body.is-mobile .mobile-library-controls {
  display: flex;
  align-items: center;
  justify-content: flex-end;
  gap: 8px;
}

body.is-mobile .mobile-library-preview-toggle {
  min-height: 38px;
  padding: 0 12px;
  border: 1px solid var(--line);
  border-radius: 999px;
  background: #080b10;
  color: var(--muted);
  font-weight: 900;
}

body.is-mobile .mobile-library-preview-toggle.active {
  background: rgba(112, 199, 255, 0.22);
  color: var(--text);
}

body.is-mobile .mobile-library-switch button,
body.is-mobile .mobile-profile-tabs button {
  min-width: 38px;
  min-height: 30px;
  border: 0;
  border-radius: 999px;
  background: transparent;
  color: var(--muted);
  font-weight: 900;
}

body.is-mobile .mobile-library-switch button.active,
body.is-mobile .mobile-profile-tabs button.active {
  background: rgba(112, 199, 255, 0.22);
  color: var(--text);
}

body.is-mobile .mobile-profile-tabs {
  width: 100%;
  grid-auto-flow: initial;
  grid-template-columns: repeat(4, minmax(0, 1fr));
  align-items: stretch;
  gap: 3px;
}

body.is-mobile .mobile-profile-tabs button {
  min-width: 0;
  min-height: 28px;
  padding: 0 4px;
  font-size: 12px;
  line-height: 1;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}

.mineral-cabinet {
  display: grid;
  gap: 12px;
}

.mineral-cabinet-head {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 10px;
  padding: 10px;
  border: 1px solid rgba(112, 199, 255, 0.22);
  border-radius: 8px;
  background: linear-gradient(135deg, rgba(16, 23, 34, 0.96), rgba(7, 10, 15, 0.98));
}

.mineral-cabinet-counter {
  min-width: 0;
  display: flex;
  align-items: baseline;
  gap: 7px;
  color: var(--muted);
  font-weight: 900;
}

.mineral-cabinet-counter strong {
  min-width: 52px;
  padding: 2px 7px;
  border: 1px solid rgba(123, 240, 255, 0.36);
  border-radius: 4px;
  background: #030709;
  color: #7bf0ff;
  font-family: "Courier New", monospace;
  font-size: 24px;
  line-height: 1;
  letter-spacing: 0;
  text-align: right;
  text-shadow: 0 0 9px rgba(123, 240, 255, 0.9);
}

.mineral-cabinet-counter small {
  color: #89a2b8;
  font-weight: 800;
}

.mineral-cabinet-owned-toggle {
  min-height: 34px;
  padding: 0 12px;
  border: 1px solid rgba(112, 199, 255, 0.42);
  border-radius: 999px;
  background: rgba(112, 199, 255, 0.12);
  color: var(--text);
  cursor: pointer;
  font-weight: 900;
  white-space: nowrap;
}

.mineral-cabinet-owned-toggle.active {
  background: rgba(112, 199, 255, 0.26);
  box-shadow: 0 0 16px rgba(112, 199, 255, 0.28);
}

.mineral-cabinet-view-toggle {
  width: max-content;
  max-width: 100%;
  display: inline-grid;
  grid-template-columns: repeat(2, minmax(0, 58px));
  gap: 3px;
  padding: 3px;
  border: 1px solid rgba(112, 199, 255, 0.24);
  border-radius: 7px;
  background: rgba(8, 11, 16, 0.94);
}

.mineral-cabinet-view-toggle button {
  min-width: 0;
  min-height: 26px;
  border: 0;
  border-radius: 5px;
  background: transparent;
  color: var(--muted);
  cursor: pointer;
  font-size: 12px;
  font-weight: 900;
  white-space: nowrap;
}

.mineral-cabinet-view-toggle button.active {
  background: rgba(112, 199, 255, 0.2);
  color: var(--text);
  box-shadow: inset 0 0 0 1px rgba(112, 199, 255, 0.28);
}

.mineral-cabinet-wall {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(68px, 82px));
  gap: 4px;
  align-items: stretch;
  justify-content: start;
}

.mineral-cabinet-stars {
  --cabinet-star-cols: 78;
  --cabinet-star-height: 320px;
  --cabinet-star-dot: 2px;
  display: grid;
  grid-template-columns: repeat(var(--cabinet-star-cols), minmax(0, 1fr));
  grid-auto-rows: minmax(0, 1fr);
  gap: 0;
  width: 100%;
  height: var(--cabinet-star-height);
  min-height: 260px;
  max-height: none;
  overflow: hidden;
  align-content: stretch;
  justify-content: stretch;
  padding: 4px;
  border: 1px solid rgba(112, 199, 255, 0.14);
  border-radius: 8px;
  background:
    radial-gradient(circle at 20% 15%, rgba(112, 199, 255, 0.08), transparent 28%),
    radial-gradient(circle at 78% 70%, rgba(255, 210, 78, 0.07), transparent 24%),
    #020509;
}

.mineral-cabinet-star {
  position: relative;
  display: block;
  width: 100%;
  height: 100%;
  min-width: 0;
  min-height: 0;
  padding: 0;
  border: 0;
  border-radius: 0;
  background: transparent;
  cursor: default;
  opacity: 1;
  box-shadow: none;
  appearance: none;
  pointer-events: none;
}

.mineral-cabinet-star::before {
  content: "";
  position: absolute;
  left: 50%;
  top: 50%;
  width: var(--cabinet-star-dot);
  height: var(--cabinet-star-dot);
  border-radius: 1px;
  background: rgba(94, 107, 121, 0.28);
  transform: translate(-50%, -50%);
}

.mineral-cabinet-star.is-owned {
  background: transparent;
}

.mineral-cabinet-star.is-owned::before {
  width: calc(var(--cabinet-star-dot) + 1px);
  height: calc(var(--cabinet-star-dot) + 1px);
  background: #42c7ff;
  box-shadow: 0 0 4px rgba(66, 199, 255, 0.8);
}

.mineral-cabinet-star.is-banner {
  background: transparent;
}

.mineral-cabinet-star.is-banner::before {
  width: calc(var(--cabinet-star-dot) + 1px);
  height: calc(var(--cabinet-star-dot) + 1px);
  background: #ffd24e;
  box-shadow: 0 0 5px rgba(255, 210, 78, 0.86);
}

.mineral-cabinet-box {
  position: relative;
  width: 100%;
  min-width: 68px;
  max-width: 112px;
  min-height: 54px;
  display: grid;
  place-items: center;
  padding: 12px 7px 9px;
  border: 1px solid rgba(104, 126, 148, 0.46);
  border-radius: 8px;
  background: linear-gradient(145deg, #151d28 0%, #0b1017 72%, #070a0f 100%);
  color: #d8e6f5;
  cursor: pointer;
  overflow: hidden;
  box-shadow:
    inset 0 1px 0 rgba(255,255,255,0.08),
    inset -10px -12px 0 rgba(0,0,0,0.18),
    0 8px 16px rgba(0,0,0,0.28);
  transform: perspective(420px) rotateX(9deg);
  transform-origin: center bottom;
}

.mineral-cabinet-box::before {
  content: "";
  position: absolute;
  inset: 0;
  background:
    linear-gradient(145deg, rgba(255,255,255,0.08), transparent 34%),
    linear-gradient(45deg, transparent 0 70%, rgba(255,255,255,0.05) 70% 100%);
  clip-path: polygon(8% 0, 92% 0, 100% 10%, 100% 84%, 92% 100%, 8% 100%, 0 84%, 0 10%);
  pointer-events: none;
}

.mineral-cabinet-box::after {
  content: "";
  position: absolute;
  left: 7px;
  right: 7px;
  bottom: 3px;
  height: 9px;
  border-radius: 0 0 7px 7px;
  background: rgba(0, 0, 0, 0.26);
  pointer-events: none;
}

.mineral-cabinet-box.is-s {
  min-height: 54px;
}

.mineral-cabinet-box.is-m {
  min-height: 54px;
}

.mineral-cabinet-box.is-tall {
  min-height: 54px;
}

.mineral-cabinet-box.is-wide {
  min-height: 54px;
}

.mineral-cabinet-box.is-owned {
  border-color: rgba(112, 199, 255, 0.76);
  background: linear-gradient(145deg, #15354d 0%, #0b2234 70%, #06111b 100%);
  box-shadow:
    inset 0 1px 0 rgba(255,255,255,0.13),
    inset -10px -12px 0 rgba(0,0,0,0.16),
    0 0 22px rgba(112, 199, 255, 0.34),
    0 10px 18px rgba(0,0,0,0.3);
}

.mineral-cabinet-box.is-banner {
  border-color: rgba(255, 210, 78, 0.92);
  background: linear-gradient(145deg, #4c3a11 0%, #1a2730 58%, #08111a 100%);
  box-shadow:
    inset 0 1px 0 rgba(255,255,255,0.17),
    inset -10px -12px 0 rgba(0,0,0,0.18),
    0 0 26px rgba(255, 196, 54, 0.52),
    0 10px 20px rgba(0,0,0,0.34);
}

.mineral-cabinet-banner-badge {
  position: absolute;
  top: 7px;
  left: 7px;
  z-index: 2;
  padding: 2px 6px;
  border: 1px solid rgba(255, 226, 118, 0.82);
  border-radius: 4px;
  background: rgba(92, 61, 0, 0.88);
  color: #ffe36f;
  font-size: 11px;
  font-weight: 1000;
  line-height: 1.1;
  text-shadow: 0 0 8px rgba(255, 214, 72, 0.9);
}

.mineral-cabinet-box-name {
  position: relative;
  z-index: 1;
  display: -webkit-box;
  max-width: 100%;
  overflow: hidden;
  -webkit-box-orient: vertical;
  -webkit-line-clamp: 2;
  color: inherit;
  font-size: 13px;
  font-weight: 1000;
  line-height: 1.18;
  overflow-wrap: anywhere;
  text-align: center;
}

body.is-mobile .mineral-cabinet-wall {
  grid-template-columns: repeat(auto-fill, minmax(66px, 80px));
  gap: 4px;
}

body.is-mobile .mineral-cabinet-stars {
  --cabinet-star-dot: 2px;
  min-height: 260px;
  padding: 4px;
}

body.is-mobile .mineral-cabinet-stars .mineral-cabinet-star {
  width: 100%;
  height: 100%;
  min-width: 0;
  min-height: 0;
  padding: 0;
}

body.is-mobile .mineral-cabinet-box {
  min-width: 66px;
  max-width: 106px;
  min-height: 52px;
}

.mineral-cabinet-empty {
  grid-column: 1 / -1;
}

.mineral-cabinet-load-sentinel {
  grid-column: 1 / -1;
  min-height: 36px;
  display: grid;
  place-items: center;
  color: var(--muted);
  font-size: 12px;
  font-weight: 800;
}

body.is-mobile .mobile-profile-head {
  display: grid;
  grid-template-columns: 76px minmax(0, 1fr) auto;
  align-items: center;
  gap: 12px;
  padding: 12px;
  border: 1px solid var(--line);
  border-radius: 8px;
  background: #101722;
}

.profile-follow-button {
  min-width: 74px;
  min-height: 34px;
  padding: 0 12px;
  border: 1px solid rgba(112, 199, 255, 0.54);
  border-radius: 999px;
  background: rgba(112, 199, 255, 0.18);
  color: var(--text);
  font-size: 13px;
  font-weight: 900;
}

.profile-follow-button.is-followed {
  border-color: rgba(255, 255, 255, 0.18);
  background: rgba(255, 255, 255, 0.08);
  color: var(--muted);
}

.profile-follow-button:disabled {
  opacity: 0.62;
}

body.is-mobile .mobile-mine-account {
  display: grid;
  grid-template-columns: 76px minmax(0, 1fr) auto;
  align-items: center;
  gap: 12px;
  margin-bottom: 14px;
  padding: 12px;
  border: 1px solid var(--line);
  border-radius: 8px;
  background: #101722;
}

body.is-mobile .mobile-mine-account strong {
  min-width: 0;
  overflow: hidden;
  color: var(--text);
  font-size: 18px;
  font-weight: 900;
  text-overflow: ellipsis;
  white-space: nowrap;
}

body.is-mobile .mobile-mine-account > div {
  display: grid;
  min-width: 0;
  gap: 6px;
}

body.is-mobile .mobile-mine-account .points-pill {
  justify-self: start;
}

body.is-mobile .mobile-mine-account .small-button {
  justify-self: end;
  min-width: 82px;
}

body.is-mobile .mobile-mine-shortcuts {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: 10px;
}

body.is-mobile .mobile-mine-shortcuts button {
  display: grid;
  place-items: center;
  gap: 7px;
  aspect-ratio: 1 / 1;
  min-width: 0;
  border: 1px solid rgba(112, 199, 255, 0.42);
  border-radius: 8px;
  background:
    linear-gradient(145deg, rgba(112, 199, 255, 0.12), rgba(255, 255, 255, 0.02)),
    rgba(6, 11, 16, 0.28);
  box-shadow:
    inset 0 0 0 1px rgba(255, 255, 255, 0.06),
    inset 0 0 18px rgba(112, 199, 255, 0.08);
  color: var(--text);
  font-size: 13px;
  font-weight: 900;
  backdrop-filter: blur(10px);
}

body.is-mobile .mobile-mine-shortcuts button:active {
  border-color: rgba(112, 199, 255, 0.72);
  background: rgba(112, 199, 255, 0.14);
}

body.is-mobile .mobile-mine-shortcuts svg {
  width: 27px;
  height: 27px;
  color: #70c7ff;
  stroke-width: 1.65;
  filter: drop-shadow(0 0 6px rgba(112, 199, 255, 0.36));
}

body.is-mobile .mobile-mine-shortcuts span {
  color: rgba(238, 246, 255, 0.86);
}

.app-toast {
  position: fixed;
  left: 50%;
  bottom: calc(84px + env(safe-area-inset-bottom));
  z-index: 5000;
  max-width: calc(100vw - 48px);
  padding: 10px 16px;
  border: 1px solid rgba(112, 199, 255, 0.34);
  border-radius: 8px;
  background: rgba(8, 12, 18, 0.88);
  box-shadow: 0 12px 32px rgba(0, 0, 0, 0.32);
  color: var(--text);
  font-size: 13px;
  font-weight: 800;
  opacity: 0;
  pointer-events: none;
  transform: translate(-50%, 10px);
  transition: opacity 0.18s ease, transform 0.18s ease;
  backdrop-filter: blur(12px);
}

.app-toast.show {
  opacity: 1;
  transform: translate(-50%, 0);
}

body.is-mobile .profile-avatar {
  width: 76px;
  height: 76px;
  object-fit: cover;
  border: 1px solid rgba(112, 199, 255, 0.42);
  border-radius: 999px;
  background: #050607;
}

body.is-mobile .mobile-profile-head h2 {
  margin: 0;
  font-size: 21px;
}

body.is-mobile .mobile-profile-head p,
body.is-mobile .mobile-profile-bio {
  margin: 6px 0 0;
  color: var(--muted);
}

body.is-mobile .mobile-profile-bio {
  padding: 0 3px 4px;
  line-height: 1.6;
  font-size: 13px;
}

body.is-mobile .mobile-profile-tabs {
  width: 100%;
  grid-template-columns: repeat(4, minmax(0, 1fr));
  gap: 3px;
  margin: 8px 0 2px;
}

body.is-mobile .mobile-profile-editor {
  display: grid;
  gap: 12px;
  margin-bottom: 14px;
  padding: 12px;
  border: 1px solid var(--line);
  border-radius: 8px;
  background: #101722;
}

body.is-mobile .mobile-profile-editor.hidden {
  display: none !important;
}

body.is-mobile .mobile-mine.is-editing-profile .mobile-mine-account,
body.is-mobile .mobile-mine.is-editing-profile > .mobile-mine-list,
body.is-mobile .mobile-mine.is-editing-profile > .mobile-panel-header,
body.is-mobile .mobile-mine.is-editing-password .mobile-mine-account,
body.is-mobile .mobile-mine.is-editing-password > .mobile-mine-list,
body.is-mobile .mobile-mine.is-editing-password > .mobile-panel-header {
  display: none;
}

body.is-mobile .mobile-profile-editor.is-disabled {
  opacity: 0.62;
}

body.is-mobile .profile-editor-head {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 12px;
}

body.is-mobile .profile-editor-back {
  justify-self: start;
}

body.is-mobile .profile-avatar-picker {
  display: inline-grid;
  place-items: center;
  min-width: 86px;
}

body.is-mobile .profile-avatar-picker input {
  display: none;
}

body.is-mobile .field-label select {
  width: 100%;
  min-height: 38px;
  padding: 0 10px;
  border: 1px solid var(--line);
  border-radius: 6px;
  background: #0f1216;
  color: var(--text);
}

body.is-mobile .mobile-community-card.is-glory {
  position: relative;
  border-color: rgba(246, 197, 73, 0.86);
  box-shadow: 0 0 0 1px rgba(246, 197, 73, 0.22), 0 0 28px rgba(246, 197, 73, 0.18);
}

body.is-mobile .mobile-community-card.is-glory::after {
  content: "";
  position: absolute;
  inset: -2px;
  border-radius: 10px;
  pointer-events: none;
  background: linear-gradient(120deg, transparent 0%, rgba(255,255,255,0.22) 46%, transparent 58%);
  animation: glorySweep 2.2s ease-in-out infinite;
}

.glory-badge {
  display: inline-flex;
  width: fit-content;
  margin-bottom: 6px;
  padding: 3px 8px;
  border-radius: 999px;
  background: linear-gradient(135deg, #f6c549, #fff0a6);
  color: #221700;
  font-size: 11px;
  font-style: normal;
  font-weight: 900;
}

@keyframes glorySweep {
  0%, 100% { opacity: 0; transform: translateX(-18%); }
  45%, 60% { opacity: 1; transform: translateX(18%); }
}

body.is-mobile .mobile-library-list {
  gap: 0;
}

body.is-mobile .mobile-section-title {
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 4px 2px 0;
}

body.is-mobile .mobile-section-title h2 {
  margin: 0;
  font-size: 13px;
}

body.is-mobile .mobile-featured {
  display: grid;
  gap: 10px;
}

body.is-mobile .mobile-featured.hidden {
  display: none !important;
}

body.is-mobile .mobile-library-letter {
  padding: 18px 4px 6px;
  color: var(--focus);
  background: #090a0c;
  font-size: 16px;
  font-weight: 800;
}

body.is-mobile .mobile-library-item,
body.is-mobile .mobile-setting-row {
  width: 100%;
  min-height: 58px;
  display: grid;
  gap: 4px;
  padding: 11px 12px;
  border: 1px solid var(--line);
  border-radius: 8px;
  background: #101722;
  color: var(--text);
  text-align: left;
}

body.is-mobile .mobile-library-item {
  min-height: 42px;
  grid-template-columns: minmax(0, 1fr) auto;
  align-items: center;
  padding: 8px 4px;
  border: 0;
  border-radius: 0;
  background: transparent;
}

body.is-mobile .mobile-library-row,
.pc-library-row {
  display: grid;
  grid-template-columns: minmax(0, 1fr) auto;
  align-items: center;
  gap: 8px;
}

.library-owned-button {
  min-width: 66px;
  min-height: 30px;
  padding: 4px 8px;
  border: 1px solid rgba(139, 153, 168, 0.32);
  border-radius: 999px;
  background: rgba(139, 153, 168, 0.12);
  color: #82909f;
  font-size: 12px;
  font-weight: 800;
  white-space: nowrap;
  cursor: pointer;
}

.library-owned-button.is-owned {
  border-color: rgba(112, 199, 255, 0.62);
  background: rgba(31, 143, 255, 0.22);
  color: #70c7ff;
}

body.is-mobile .mobile-library-item.is-preview {
  align-items: start;
  padding: 10px 4px 4px;
}

body.is-mobile .mobile-library-item > span,
body.is-mobile .mobile-library-name {
  font-weight: 800;
}

body.is-mobile .mobile-library-item small {
  display: grid;
  gap: 2px;
  justify-items: end;
  color: var(--muted);
  font-size: 12px;
  line-height: 1.35;
}

body.is-mobile .mobile-library-preview-grid {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 10px;
  padding: 0 0 12px;
}

body.is-mobile .mobile-library-model-tile {
  min-height: 0;
}

body.is-mobile .mobile-community-card {
  display: grid;
  grid-template-columns: minmax(0, 1fr) 86px;
  gap: 12px;
  padding: 10px;
  border: 1px solid var(--line);
  border-radius: 8px;
  background: #101722;
}

body.is-mobile .mobile-community-card img {
  width: 86px;
  height: 86px;
  object-fit: cover;
  border-radius: 6px;
  background: #050607;
}

body.is-mobile .mobile-community-card.is-multi {
  grid-template-columns: 1fr;
}

body.is-mobile .mobile-community-images {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: 6px;
}

body.is-mobile .mobile-community-card:not(.is-multi) .mobile-community-images {
  grid-template-columns: 1fr;
}

body.is-mobile .mobile-community-card.is-multi .mobile-community-images img {
  width: 100%;
  height: 92px;
}

body.is-mobile .mobile-community-card p {
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
}

body.is-mobile .mobile-community-card strong {
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
  text-overflow: ellipsis;
}

body.is-mobile .mobile-article-detail {
  min-height: calc(100dvh - 72px);
  padding: 12px;
  background: #090a0c;
}

body.is-mobile .mobile-detail-header {
  position: sticky;
  top: 0;
  z-index: 5;
  display: grid;
  grid-template-columns: 44px minmax(0, 1fr);
  align-items: center;
  gap: 8px;
  padding: 0 0 10px;
  background: #090a0c;
}

body.is-mobile .mobile-detail-header h2 {
  min-width: 0;
  margin: 0;
  overflow: hidden;
  color: var(--mobile-title);
  font-size: 16px;
  font-weight: 900;
  text-overflow: ellipsis;
  white-space: nowrap;
}

body.is-mobile .mobile-article-body {
  display: grid;
  gap: 12px;
  padding-bottom: 76px;
}

body.is-mobile .mobile-article-gallery {
  display: grid;
  grid-auto-flow: column;
  grid-auto-columns: 100%;
  gap: 10px;
  overflow-x: auto;
  overscroll-behavior-x: contain;
  scroll-snap-type: x mandatory;
  scrollbar-width: none;
}

body.is-mobile .mobile-article-gallery::-webkit-scrollbar {
  display: none;
}

body.is-mobile .mobile-article-gallery img {
  width: 100%;
  max-height: 54dvh;
  object-fit: contain;
  border-radius: 8px;
  background: #050607;
  scroll-snap-align: start;
}

body.is-mobile .mobile-article-content {
  display: grid;
  gap: 10px;
  padding: 12px;
  border: 1px solid var(--line);
  border-radius: 8px;
  background: #101722;
}

body.is-mobile .mobile-article-content h3,
body.is-mobile .mobile-article-content p {
  margin: 0;
}

body.is-mobile .mobile-article-content h3 {
  color: var(--mobile-title);
  font-size: 18px;
  line-height: 1.35;
}

body.is-mobile .mobile-article-meta {
  display: flex;
  flex-wrap: wrap;
  gap: 6px 10px;
  color: var(--muted);
  font-size: 12px;
}

body.is-mobile .mobile-article-locality {
  color: var(--focus);
  font-size: 13px;
  line-height: 1.55;
}

body.is-mobile .mobile-article-text {
  color: var(--mobile-title);
  font-size: 14px;
  line-height: 1.75;
  white-space: pre-wrap;
}

body.is-mobile .mobile-ladder,
body.is-mobile .mobile-ladder-play {
  min-height: calc(100dvh - 82px);
  background:
    radial-gradient(circle at 50% -12%, rgba(246, 197, 73, 0.18), transparent 30%),
    #090a0c;
}

body.is-mobile .ladder-user-card {
  display: grid;
  grid-template-columns: minmax(0, 1fr) auto;
  gap: 10px;
  align-items: center;
  margin-bottom: 12px;
  padding: 12px;
  border: 1px solid rgba(246, 197, 73, 0.36);
  border-radius: 8px;
  background: #111821;
}

body.is-mobile .ladder-user-card strong {
  display: block;
  color: var(--text);
  font-size: 18px;
}

body.is-mobile .ladder-user-card p {
  margin: 4px 0 0;
  color: var(--muted);
  font-size: 12px;
}

body.is-mobile .ladder-user-tags {
  display: flex;
  flex-wrap: wrap;
  justify-content: flex-end;
  gap: 6px;
}

body.is-mobile .ladder-tag,
body.is-mobile .ladder-rank-pill {
  display: inline-flex;
  align-items: center;
  min-height: 24px;
  padding: 0 8px;
  border-radius: 999px;
  background: rgba(112, 199, 255, 0.16);
  color: #dff3ff;
  font-size: 11px;
  font-weight: 900;
}

body.is-mobile .ladder-tag.is-locked {
  background: rgba(255, 255, 255, 0.08);
  color: var(--muted);
}

body.is-mobile .ladder-entry-grid {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: 10px;
  margin-bottom: 16px;
}

body.is-mobile .ladder-entry-grid button {
  position: relative;
  overflow: hidden;
  display: grid;
  place-items: center;
  gap: 8px;
  aspect-ratio: 1 / 1;
  border: 1px solid rgba(246, 197, 73, 0.42);
  border-radius: 8px;
  background:
    linear-gradient(145deg, rgba(246, 197, 73, 0.16), rgba(112, 199, 255, 0.08)),
    #101722;
  color: var(--text);
  font-weight: 900;
  box-shadow: inset 0 0 22px rgba(246, 197, 73, 0.08);
}

body.is-mobile .ladder-entry-grid button.is-locked {
  border-color: var(--line);
  background: linear-gradient(145deg, #11151b, #07090c);
  color: #a4abb4;
  filter: grayscale(1) saturate(0.16);
  box-shadow: inset 0 0 24px rgba(0, 0, 0, 0.42);
}

body.is-mobile .ladder-entry-grid button.is-locked::before,
body.is-mobile .ladder-entry-grid button.is-locked::after {
  content: "";
  position: absolute;
  pointer-events: none;
  z-index: 2;
}

body.is-mobile .ladder-entry-grid button.is-locked::before {
  left: 6px;
  top: 5px;
  width: 8px;
  height: 8px;
  border: 2px solid rgba(229, 235, 242, 0.88);
  border-bottom: 0;
  border-radius: 6px 6px 0 0;
  box-shadow: 0 2px 7px rgba(0, 0, 0, 0.42);
}

body.is-mobile .ladder-entry-grid button.is-locked::after {
  left: 4px;
  top: 12px;
  width: 15px;
  height: 12px;
  border: 1px solid rgba(255, 255, 255, 0.24);
  border-radius: 4px;
  background: linear-gradient(180deg, rgba(232, 238, 246, 0.92), rgba(154, 164, 176, 0.9));
  box-shadow:
    inset 0 1px 0 rgba(255, 255, 255, 0.48),
    0 4px 12px rgba(0, 0, 0, 0.42);
}

body.is-mobile .ladder-entry-grid button.is-locked > * {
  position: relative;
  z-index: 1;
}

body.is-mobile .ladder-entry-grid svg {
  width: 30px;
  height: 30px;
  color: #f6c549;
}

body.is-mobile .ladder-practice-actions {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 10px;
  margin-bottom: 16px;
}

body.is-mobile .ladder-practice-actions button {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 8px;
  min-height: 48px;
  border: 1px solid rgba(112, 199, 255, 0.38);
  border-radius: 8px;
  background: #111821;
  color: var(--text);
  font-weight: 900;
}

body.is-mobile .ladder-practice-actions svg {
  width: 20px;
  height: 20px;
  color: #70c7ff;
}

body.is-mobile .ladder-board-list,
body.is-mobile .ladder-play-host,
body.is-mobile .ladder-wrong-list,
body.is-mobile .ladder-record-detail-list {
  display: grid;
  gap: 10px;
}

body.is-mobile .ladder-board-row,
body.is-mobile .ladder-record-row {
  display: grid;
  grid-template-columns: 28px 36px minmax(0, 1fr) auto;
  align-items: center;
  gap: 10px;
  min-height: 48px;
  padding: 10px 12px;
  border: 1px solid var(--line);
  border-radius: 8px;
  background: #101722;
}

body.is-mobile .ladder-record-row {
  grid-template-columns: 34px minmax(0, 1fr) auto;
  width: 100%;
  color: var(--text);
  text-align: left;
}

body.is-mobile .ladder-board-row strong {
  color: #f6c549;
}

body.is-mobile .ladder-avatar-button {
  width: 36px;
  height: 36px;
  padding: 0;
  border: 0;
  border-radius: 50%;
  background: transparent;
  cursor: pointer;
}

body.is-mobile .ladder-avatar-button:active {
  transform: scale(0.94);
}

body.is-mobile .ladder-avatar-button img {
  width: 36px;
  height: 36px;
  border-radius: 50%;
  object-fit: cover;
  border: 1px solid rgba(112, 199, 255, 0.32);
  background: #050607;
}

body.is-mobile .ladder-board-row span {
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

body.is-mobile .ladder-board-row small,
body.is-mobile .ladder-record-row small {
  color: var(--muted);
}

body.is-mobile .ladder-empty,
body.is-mobile .ladder-info {
  padding: 12px;
  border: 1px dashed rgba(112, 199, 255, 0.34);
  border-radius: 8px;
  color: var(--muted);
  background: rgba(112, 199, 255, 0.06);
}

body.is-mobile .ladder-intro,
body.is-mobile .ladder-result {
  display: grid;
  gap: 12px;
  padding: 14px;
  border: 1px solid rgba(246, 197, 73, 0.34);
  border-radius: 8px;
  background: #101722;
}

body.is-mobile .ladder-intro h2,
body.is-mobile .ladder-result h2 {
  margin: 0;
  font-size: 22px;
}

body.is-mobile .ladder-intro p,
body.is-mobile .ladder-result p {
  margin: 0;
  color: var(--muted);
  line-height: 1.6;
}

body.is-mobile .ladder-intro label {
  display: flex;
  align-items: center;
  gap: 8px;
  color: var(--text);
  font-weight: 800;
}

body.is-mobile .ladder-setup-title {
  color: var(--text);
  font-size: 14px;
}

body.is-mobile .ladder-choice-grid {
  display: grid;
  grid-template-columns: repeat(4, minmax(0, 1fr));
  gap: 8px;
}

body.is-mobile .ladder-choice-grid button,
body.is-mobile .ladder-level-grid label {
  min-height: 40px;
  border: 1px solid var(--line);
  border-radius: 8px;
  background: #121923;
  color: var(--text);
  font-size: 13px;
  font-weight: 900;
}

body.is-mobile .ladder-choice-grid button.active {
  border-color: rgba(246, 197, 73, 0.8);
  background: rgba(246, 197, 73, 0.16);
}

body.is-mobile .ladder-level-grid {
  display: grid;
  grid-template-columns: repeat(4, minmax(0, 1fr));
  gap: 8px;
}

body.is-mobile .ladder-level-grid label {
  justify-content: center;
  padding: 0 6px;
}

body.is-mobile .ladder-actions,
body.is-mobile .ladder-nav {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 10px;
}

body.is-mobile .ladder-actions button,
body.is-mobile .ladder-nav button,
body.is-mobile .ladder-primary {
  min-height: 46px;
  border: 1px solid rgba(112, 199, 255, 0.36);
  border-radius: 8px;
  background: #121923;
  color: var(--text);
  font-weight: 900;
}

body.is-mobile .ladder-primary {
  border-color: rgba(246, 197, 73, 0.78);
  background: linear-gradient(135deg, #d9951f, #f6c549);
  color: #151006;
}

body.is-mobile .ladder-question-top {
  position: sticky;
  top: 0;
  z-index: 20;
  display: grid;
  grid-template-columns: auto minmax(0, 1fr) auto auto;
  align-items: center;
  gap: 10px;
  padding: 8px 0 10px;
  background: #090a0c;
}

body.is-mobile .ladder-timer {
  color: #f6c549;
  font-size: 20px;
  font-variant-numeric: tabular-nums;
  font-weight: 900;
}

body.is-mobile .ladder-progress {
  color: var(--muted);
  font-size: 12px;
  text-align: center;
}

body.is-mobile .ladder-difficulty {
  display: inline-flex;
  align-items: center;
  gap: 5px;
  min-height: 30px;
  padding: 0 8px;
  border: 1px solid currentColor;
  border-radius: 999px;
  background: rgba(255, 255, 255, 0.06);
  font-size: 12px;
  font-weight: 900;
  white-space: nowrap;
}

body.is-mobile .ladder-difficulty::before {
  display: inline-grid;
  place-items: center;
  width: 18px;
  height: 18px;
  border-radius: 999px;
  background: rgba(255, 255, 255, 0.12);
  font-size: 10px;
  content: "";
}

body.is-mobile .ladder-difficulty.is-easy {
  color: #5fe08a;
}

body.is-mobile .ladder-difficulty.is-easy::before {
  content: "萌";
}

body.is-mobile .ladder-difficulty.is-mid {
  color: #f6c549;
}

body.is-mobile .ladder-difficulty.is-mid::before {
  content: "龙";
}

body.is-mobile .ladder-difficulty.is-hard {
  color: #ff6b6b;
}

body.is-mobile .ladder-difficulty.is-hard::before {
  content: "魔";
}

body.is-mobile .ladder-exit {
  width: auto;
  min-width: 58px;
  height: 42px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 4px;
  padding: 0 10px;
  border: 1px solid var(--line);
  border-radius: 8px;
  background: #111821;
  color: var(--text);
  font-size: 12px;
  font-weight: 900;
}

body.is-mobile .ladder-question-card {
  display: grid;
  gap: 12px;
  animation: ladderQuestionIn 0.24s ease;
}

body.is-mobile .ladder-viewer {
  height: 42dvh;
  min-height: 300px;
  overflow: hidden;
  border: 1px solid rgba(112, 199, 255, 0.22);
  border-radius: 8px;
  background: #050607;
}

body.is-mobile .ladder-options {
  display: grid;
  gap: 10px;
}

body.is-mobile .ladder-options button {
  min-height: 50px;
  padding: 10px 12px;
  border: 1px solid var(--line);
  border-radius: 8px;
  background: #101722;
  color: var(--text);
  text-align: left;
  font-size: 15px;
  font-weight: 900;
}

body.is-mobile .ladder-options button.active {
  border-color: rgba(246, 197, 73, 0.8);
  background: rgba(246, 197, 73, 0.16);
  box-shadow: 0 0 22px rgba(246, 197, 73, 0.12);
}

body.is-mobile .ladder-options button.is-wrong {
  border-color: rgba(255, 107, 107, 0.86);
  background: rgba(255, 107, 107, 0.16);
  color: #ffd7d7;
}

body.is-mobile .ladder-options button.is-right {
  border-color: rgba(95, 224, 138, 0.86);
  background: rgba(95, 224, 138, 0.14);
  color: #d9ffe4;
}

body.is-mobile .ladder-nav {
  grid-template-columns: 1fr 1fr 1.15fr;
}

body.is-mobile .ladder-nav button:disabled {
  opacity: 0.45;
}

body.is-mobile .ladder-wrong-card {
  display: grid;
  gap: 10px;
  padding: 10px;
  border: 1px solid var(--line);
  border-radius: 8px;
  background: #101722;
}

body.is-mobile .ladder-wrong-viewer {
  height: 280px;
  overflow: hidden;
  border-radius: 8px;
  background: #050607;
}

body.is-mobile .ladder-answer-row {
  display: grid;
  gap: 6px;
  font-weight: 900;
}

body.is-mobile .ladder-answer-row .wrong {
  color: #ff7c7c;
}

body.is-mobile .ladder-answer-row .right {
  color: #5fe08a;
}

body.is-mobile .ladder-record-detail-row {
  display: grid;
  gap: 6px;
  padding: 10px 12px;
  border: 1px solid var(--line);
  border-radius: 8px;
  background: #101722;
}

body.is-mobile .ladder-record-detail-row strong {
  color: #f6c549;
}

body.is-mobile .ladder-record-detail-row span {
  color: var(--text);
  font-weight: 900;
}

body.is-mobile .ladder-record-detail-row small {
  color: var(--muted);
}

body.is-mobile .ladder-celebrate {
  position: fixed;
  inset: 0;
  z-index: 5200;
  pointer-events: none;
  background:
    radial-gradient(circle at 20% 20%, rgba(246,197,73,0.34) 0 2px, transparent 3px),
    radial-gradient(circle at 72% 30%, rgba(112,199,255,0.34) 0 2px, transparent 3px),
    radial-gradient(circle at 48% 68%, rgba(95,224,138,0.34) 0 2px, transparent 3px);
  background-size: 52px 52px, 68px 68px, 74px 74px;
  animation: ladderCelebrate 1.4s ease forwards;
}

@keyframes ladderQuestionIn {
  from { opacity: 0; transform: translateY(10px) scale(0.99); }
  to { opacity: 1; transform: translateY(0) scale(1); }
}

@keyframes ladderCelebrate {
  0% { opacity: 0; transform: scale(0.96); }
  18% { opacity: 1; }
  100% { opacity: 0; transform: scale(1.08) translateY(-28px); }
}

body.is-mobile .ladder-options button {
  animation: ladderOptionIn 260ms ease-out both;
  animation-delay: calc(var(--option-index, 0) * 40ms);
}

body.is-mobile .ladder-options button:disabled {
  opacity: 0.96;
}

body.is-mobile .ladder-options button.is-right {
  animation: ladderAnswerCorrect 420ms ease-out both;
  box-shadow: 0 0 0 1px rgba(0, 180, 42, 0.3), 0 0 24px rgba(0, 180, 42, 0.2);
}

body.is-mobile .ladder-options button.is-wrong {
  animation: ladderAnswerWrong 180ms ease-in-out both;
  box-shadow: 0 0 0 1px rgba(245, 63, 63, 0.3), 0 0 22px rgba(245, 63, 63, 0.18);
}

body.is-mobile .ladder-timer.is-warning {
  color: #ffb45a;
  animation: ladderTimerPulse 900ms ease-in-out infinite;
}

body.is-mobile .ladder-timer.is-danger {
  color: #ff6b6b;
}

.ladder-combo-burst {
  position: fixed;
  left: 50%;
  top: calc(82px + env(safe-area-inset-top));
  z-index: 5400;
  padding: 9px 18px;
  border: 1px solid rgba(246, 197, 73, 0.72);
  border-radius: 999px;
  background: rgba(18, 24, 34, 0.92);
  box-shadow: 0 14px 34px rgba(0, 0, 0, 0.36), 0 0 24px rgba(246, 197, 73, 0.18);
  color: #f6c549;
  font-size: 18px;
  font-weight: 900;
  pointer-events: none;
  transform: translate(-50%, -18px) scale(0.94);
  animation: ladderComboBurst 1100ms ease-out forwards;
}

.model-reset-pulse::after {
  content: "";
  position: absolute;
  inset: 8px;
  z-index: 3;
  border: 1px solid rgba(112, 199, 255, 0.62);
  border-radius: 12px;
  pointer-events: none;
  animation: modelResetPulse 420ms ease-out forwards;
}

.model-reset-pulse {
  position: relative;
}

@keyframes ladderOptionIn {
  from { opacity: 0; transform: translateY(8px) scale(0.98); }
  to { opacity: 1; transform: translateY(0) scale(1); }
}

@keyframes ladderAnswerCorrect {
  0% { transform: scale(1); }
  45% { transform: scale(1.035); }
  100% { transform: scale(1); }
}

@keyframes ladderAnswerWrong {
  0%, 100% { transform: translateX(0); }
  25% { transform: translateX(-5px); }
  50% { transform: translateX(5px); }
  75% { transform: translateX(-3px); }
}

@keyframes ladderTimerPulse {
  0%, 100% { transform: scale(1); opacity: 1; }
  50% { transform: scale(1.05); opacity: 0.78; }
}

@keyframes ladderComboBurst {
  0% { opacity: 0; transform: translate(-50%, -18px) scale(0.94); }
  18% { opacity: 1; transform: translate(-50%, 0) scale(1.04); }
  70% { opacity: 1; transform: translate(-50%, 0) scale(1); }
  100% { opacity: 0; transform: translate(-50%, -8px) scale(0.98); }
}

@keyframes modelResetPulse {
  from { opacity: 0.9; transform: scale(0.96); }
  to { opacity: 0; transform: scale(1.05); }
}

@media (prefers-reduced-motion: reduce) {
  body.is-mobile .ladder-options button,
  body.is-mobile .ladder-options button.is-right,
  body.is-mobile .ladder-options button.is-wrong,
  body.is-mobile .ladder-timer.is-warning,
  .ladder-combo-burst,
  .pc-tab-panel,
  .pc-model-panel,
  .model-reset-pulse::after {
    animation: none !important;
  }
}

/* Final one-screen ladder play override. Keep this after generic ladder styles. */
body.is-mobile.mobile-tab-ladderPlay {
  overflow: hidden;
}

body.is-mobile.mobile-tab-ladderPlay .mobile-tabbar,
body.is-mobile.mobile-tab-ladderPlay .community-create-button {
  display: none;
}

body.is-mobile.mobile-tab-ladderPlay .mobile-ladder-play {
  height: 100dvh;
  min-height: 100dvh;
  overflow: hidden;
  padding: calc(6px + env(safe-area-inset-top)) 10px calc(6px + env(safe-area-inset-bottom));
}

body.is-mobile.mobile-tab-ladderPlay .ladder-play-host {
  height: 100%;
  min-height: 0;
  overflow: hidden;
}

body.is-mobile.mobile-tab-ladderPlay .ladder-question-card {
  height: 100%;
  min-height: 0;
  display: grid;
  grid-template-rows: 36px minmax(118px, 1fr) auto 38px;
  gap: 6px;
}

body.is-mobile.mobile-tab-ladderPlay .ladder-question-top {
  position: relative;
  grid-template-columns: auto minmax(0, 1fr) auto auto;
  gap: 6px;
  padding: 0;
  background: transparent;
}

body.is-mobile.mobile-tab-ladderPlay .ladder-timer {
  font-size: 17px;
}

body.is-mobile.mobile-tab-ladderPlay .ladder-progress {
  min-width: 0;
  overflow: hidden;
  font-size: 11px;
  text-overflow: ellipsis;
  white-space: nowrap;
}

body.is-mobile.mobile-tab-ladderPlay .ladder-difficulty {
  min-height: 26px;
  padding: 0 6px;
  font-size: 11px;
}

body.is-mobile.mobile-tab-ladderPlay .ladder-difficulty::before {
  width: 16px;
  height: 16px;
  font-size: 9px;
}

body.is-mobile.mobile-tab-ladderPlay .ladder-exit {
  width: auto;
  min-width: 52px;
  height: 34px;
  min-height: 34px;
  padding: 0 8px;
}

body.is-mobile.mobile-tab-ladderPlay .ladder-viewer {
  height: auto;
  min-height: 118px;
  max-height: none;
  border-radius: 12px;
}

body.is-mobile.mobile-tab-ladderPlay .ladder-options {
  gap: 6px;
}

body.is-mobile.mobile-tab-ladderPlay .ladder-options button {
  min-height: 38px;
  padding: 6px 10px;
  border-radius: 10px;
  font-size: 12px;
  line-height: 1.22;
}

body.is-mobile.mobile-tab-ladderPlay .ladder-nav {
  grid-template-columns: 0.9fr 0.9fr 1fr;
  gap: 6px;
}

body.is-mobile.mobile-tab-ladderPlay .ladder-nav button {
  min-height: 38px;
  padding: 0 8px;
  border-radius: 10px;
  font-size: 12px;
}

.post-actions {
  display: flex;
  flex-wrap: wrap;
  gap: 6px;
  margin-top: 8px;
}

.post-actions button,
.post-actions span {
  min-height: 26px;
  display: inline-flex;
  align-items: center;
  padding: 0 8px;
  border: 1px solid var(--line);
  border-radius: 999px;
  background: #0b1016;
  color: var(--text);
  font-size: 11px;
}

body.is-mobile .community-create-button {
  position: fixed;
  left: 50%;
  bottom: calc(76px + env(safe-area-inset-bottom));
  z-index: 2600;
  min-width: 88px;
  height: 50px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 4px;
  border: 1px solid rgba(112, 199, 255, 0.65);
  border-radius: 999px;
  background: #0d5f88;
  color: #fff;
  font-weight: 900;
  transform: translateX(-50%);
  box-shadow: 0 10px 28px rgba(0, 0, 0, 0.35);
}

body:not(.is-mobile) .community-create-button {
  display: none;
}

body.is-mobile .mobile-community-card strong,
body.is-mobile .mobile-community-card span,
body.is-mobile .mobile-community-card p {
  display: block;
  margin: 0;
  overflow-wrap: anywhere;
}

body.is-mobile .mobile-community-card span,
body.is-mobile .mobile-community-card p {
  margin-top: 6px;
  color: var(--muted);
  font-size: 12px;
}

body.is-mobile .mobile-community-card strong,
body.is-mobile .pc-post-card strong,
body.is-mobile .pc-post-card p {
  display: -webkit-box;
  -webkit-box-orient: vertical;
  overflow: hidden;
  text-overflow: ellipsis;
}

body.is-mobile .mobile-community-card strong,
body.is-mobile .pc-post-card strong {
  -webkit-line-clamp: 2;
}

body.is-mobile .mobile-community-card p,
body.is-mobile .pc-post-card p {
  -webkit-line-clamp: 2;
}

.pc-post-card strong,
.pc-profile-post-card strong,
.pc-post-card p,
.pc-profile-post-card p {
  display: -webkit-box;
  -webkit-box-orient: vertical;
  overflow: hidden;
  text-overflow: ellipsis;
}

.pc-post-card strong,
.pc-profile-post-card strong {
  -webkit-line-clamp: 2;
}

.pc-post-card p,
.pc-profile-post-card p {
  -webkit-line-clamp: 2;
}

body.is-mobile .mobile-setting-row {
  grid-template-columns: minmax(0, 1fr) auto;
  align-items: center;
  font-weight: 800;
}

body.is-mobile .mobile-setting-row.active {
  border-color: rgba(112, 199, 255, 0.75);
  box-shadow: inset 0 0 0 1px rgba(112, 199, 255, 0.28);
}

body.is-mobile .mobile-language-toggle {
  width: 100%;
  min-height: 58px;
  display: grid;
  grid-template-columns: minmax(0, 1fr) auto;
  align-items: center;
  padding: 11px 12px;
  border: 1px solid var(--line);
  border-radius: 8px;
  background: #101722;
  color: var(--text);
  text-align: left;
  font-weight: 800;
}

body.is-mobile .mobile-language-toggle strong {
  position: relative;
  width: 78px;
  height: 32px;
  display: grid;
  grid-template-columns: 1fr 1fr;
  align-items: center;
  border-radius: 999px;
  background: #080b10;
  color: var(--muted);
  font-size: 12px;
  text-align: center;
}

body.is-mobile .mobile-language-toggle strong::before {
  content: "";
  position: absolute;
  top: 3px;
  left: 3px;
  width: 36px;
  height: 26px;
  border-radius: 999px;
  background: rgba(112, 199, 255, 0.28);
  transition: transform 180ms ease;
}

body.is-mobile .mobile-language-toggle.is-en strong::before {
  transform: translateX(36px);
}

body.is-mobile.mobile-tab-secondary .sidebar {
  display: none;
}

body.is-mobile.mobile-tab-secondary .mobile-tab-panel {
  padding-top: 18px;
}

body.is-mobile.mobile-tab-models .mobile-model-heading {
  display: none;
}

body.is-mobile.mobile-tab-models {
  overflow: hidden;
}

body.is-mobile.mobile-tab-models .mobile-home {
  height: calc(100vh - 64px - env(safe-area-inset-bottom));
  overflow: hidden;
}

body.is-mobile .mobile-tabbar {
  position: fixed;
  left: 0;
  right: 0;
  bottom: 0;
  z-index: 2500;
  display: grid;
  grid-template-columns: repeat(5, 1fr);
  height: 64px;
  padding: 6px 8px calc(6px + env(safe-area-inset-bottom));
  border-top: 1px solid var(--line);
  background: rgba(12, 16, 22, 0.96);
  backdrop-filter: blur(12px);
}

body:not(.is-mobile) .mobile-tabbar {
  display: none;
}

body.is-mobile .mobile-tabbar button {
  display: grid;
  place-items: center;
  gap: 2px;
  border: 0;
  border-radius: 8px;
  background: transparent;
  color: var(--muted);
  font-size: 11px;
}

body.is-mobile .mobile-tabbar button.active {
  color: var(--text);
  background: rgba(112, 199, 255, 0.12);
}

body.is-mobile .mobile-tabbar svg {
  width: 20px;
  height: 20px;
}

/* Mobile interaction spec V1.0 alignment */
body.is-mobile {
  --mobile-blue: #70c7ff;
  --mobile-success: #00b42a;
  --mobile-warning: #ff7d00;
  --mobile-danger: #f53f3f;
  --mobile-title: #eef6ff;
  --mobile-body: #b8c2ce;
  --mobile-muted: #7e8a98;
  --mobile-line: rgba(112, 199, 255, 0.18);
  --mobile-bg: #090a0c;
  --mobile-card: #101722;
  background: var(--mobile-bg);
  color: var(--mobile-title);
  padding-bottom: calc(82px + env(safe-area-inset-bottom));
}

body.is-mobile button,
body.is-mobile a,
body.is-mobile .mobile-community-card,
body.is-mobile .mobile-library-item,
body.is-mobile .mobile-model-tile,
body.is-mobile .post-card {
  -webkit-tap-highlight-color: transparent;
  transition: transform 100ms ease, opacity 100ms ease, background-color 100ms ease, border-color 100ms ease;
}

body.is-mobile button:active,
body.is-mobile a:active {
  opacity: 0.7;
  transform: scale(0.95);
}

body.is-mobile .mobile-community-card:active,
body.is-mobile .mobile-library-item:active,
body.is-mobile .mobile-model-tile:active,
body.is-mobile .post-card:active {
  background: var(--mobile-line);
}

body.is-mobile button,
body.is-mobile .icon-link,
body.is-mobile .small-button,
body.is-mobile .primary-button {
  min-width: 44px;
  min-height: 44px;
}

body.is-mobile .sidebar {
  grid-template-columns: 132px minmax(0, 1fr);
  grid-template-rows: 56px 40px 188px 36px;
  padding-top: env(safe-area-inset-top);
  border-bottom: 0;
  background: var(--mobile-bg);
  box-shadow: none;
}

body.is-mobile .site-logo {
  min-height: 44px;
  padding-left: 8px;
  border-right: 0;
  border-bottom: 0;
  background: transparent;
}

body.is-mobile .site-logo .brand-word {
  max-width: 74px;
  overflow: hidden;
  text-overflow: ellipsis;
}

body.is-mobile .toolbar {
  padding: 8px 8px 8px 0;
  background: transparent;
}

body.is-mobile .search-wrap {
  min-height: 44px;
  border: 1px solid var(--mobile-line);
  border-radius: 12px;
  background: rgba(5, 10, 16, 0.86);
  color: var(--mobile-title);
}

body.is-mobile .search-wrap input {
  color: var(--mobile-title);
}

body.is-mobile .mobile-banner-title {
  padding: 8px 16px;
  border-bottom: 0;
  background: var(--mobile-card);
  color: var(--mobile-title);
  font-size: 14px;
}

body.is-mobile .hero-banner {
  height: 188px;
  min-height: 188px;
  margin: 0 16px;
  padding: 0 16px 14px;
  border-radius: 16px;
}

body.is-mobile .banner-meta {
  grid-column: 1 / -1;
  grid-row: 4;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 6px;
  width: auto;
  min-height: 36px;
  margin: 0 16px 8px;
  padding: 6px 8px;
  border: 1px solid var(--mobile-line);
  border-top: 0;
  border-radius: 0 0 16px 16px;
  background: var(--mobile-card);
  font-size: 11px;
}

body.is-mobile .banner-meta button {
  min-height: 26px;
  padding: 0 8px;
  font-size: 11px;
}

body.is-mobile .public-profile-card {
  width: 100vw;
  max-height: 100dvh;
  height: 100dvh;
  border: 0;
  border-radius: 0;
}

body.is-mobile .mobile-home {
  gap: 16px;
  padding: 16px 16px 24px;
}

body.is-mobile .mobile-section-title,
body.is-mobile .mobile-model-heading,
body.is-mobile .mobile-panel-header {
  padding: 0;
  color: var(--mobile-title);
}

body.is-mobile .mobile-section-title h2,
body.is-mobile .mobile-model-heading h2,
body.is-mobile .mobile-panel-header h2 {
  font-size: 18px;
  line-height: 1.3;
}

body.is-mobile .mobile-tab-panel {
  padding: calc(16px + env(safe-area-inset-top)) 16px calc(104px + env(safe-area-inset-bottom));
  background: var(--mobile-bg);
}

body.is-mobile .mobile-ladder-play {
  height: 100dvh;
  min-height: 100dvh;
  overflow: hidden;
  padding: calc(8px + env(safe-area-inset-top)) 12px calc(8px + env(safe-area-inset-bottom));
}

body.is-mobile .ladder-play-host {
  height: 100%;
  min-height: 0;
}

body.is-mobile .ladder-question-card {
  height: 100%;
  min-height: 0;
  display: grid;
  grid-template-rows: auto minmax(170px, 1fr) auto auto;
  gap: 8px;
}

body.is-mobile .ladder-question-top {
  position: relative;
  grid-template-columns: auto minmax(0, 1fr) auto auto;
  gap: 8px;
  padding: 0;
  background: transparent;
}

body.is-mobile .ladder-timer {
  font-size: 18px;
}

body.is-mobile .ladder-progress {
  min-width: 0;
  overflow: hidden;
  font-size: 11px;
  text-overflow: ellipsis;
  white-space: nowrap;
}

body.is-mobile .ladder-difficulty {
  min-height: 28px;
  padding: 0 7px;
  font-size: 11px;
}

body.is-mobile .ladder-exit {
  width: auto;
  min-width: 52px;
  height: 36px;
  min-height: 36px;
  padding: 0 8px;
}

body.is-mobile .ladder-viewer {
  height: auto;
  min-height: 170px;
  max-height: none;
  border-radius: 12px;
}

body.is-mobile .ladder-options {
  gap: 8px;
}

body.is-mobile .ladder-options button {
  min-height: 44px;
  padding: 8px 12px;
  font-size: 13px;
  line-height: 1.25;
}

body.is-mobile .ladder-nav {
  grid-template-columns: 0.9fr 0.9fr 1fr;
  gap: 8px;
}

body.is-mobile .ladder-nav button {
  min-height: 42px;
  padding: 0 8px;
}

@media (max-height: 720px) {
  body.is-mobile .mobile-ladder-play {
    padding-top: calc(6px + env(safe-area-inset-top));
  }

  body.is-mobile .ladder-question-card {
    grid-template-rows: auto minmax(128px, 1fr) auto auto;
    gap: 6px;
  }

  body.is-mobile .ladder-viewer {
    min-height: 128px;
  }

  body.is-mobile .ladder-options {
    gap: 6px;
  }

  body.is-mobile .ladder-options button {
    min-height: 40px;
    padding: 6px 10px;
    font-size: 12px;
  }

  body.is-mobile .ladder-nav button {
    min-height: 38px;
  }
}

body.is-mobile .mobile-profile-head,
body.is-mobile .mobile-mine-account,
body.is-mobile .mobile-profile-editor,
body.is-mobile .mobile-community-card,
body.is-mobile .mobile-setting-row,
body.is-mobile .mobile-language-toggle,
body.is-mobile .ladder-user-card,
body.is-mobile .ladder-board-row,
body.is-mobile .ladder-record-row,
body.is-mobile .ladder-intro,
body.is-mobile .ladder-result,
body.is-mobile .ladder-question-card,
body.is-mobile .ladder-wrong-card,
body.is-mobile .ladder-record-detail-row {
  border: 1px solid var(--mobile-line);
  border-radius: 12px;
  background: var(--mobile-card);
  color: var(--mobile-title);
  box-shadow: none;
}

body.is-mobile .mobile-community-card {
  grid-template-columns: minmax(0, 1fr) 100px;
  min-height: 120px;
  padding: 16px;
}

body.is-mobile .mobile-community-card img {
  width: 100px;
  height: 100px;
  border-radius: 8px;
}

body.is-mobile .mobile-community-card span,
body.is-mobile .mobile-community-card p,
body.is-mobile .mobile-profile-head p,
body.is-mobile .mobile-profile-bio,
body.is-mobile .mobile-panel-header p,
body.is-mobile .ladder-user-card p,
body.is-mobile .ladder-board-row small,
body.is-mobile .ladder-record-row small {
  color: var(--mobile-body);
}

body.is-mobile .mobile-library-list,
body.is-mobile .mobile-community-list,
body.is-mobile .mobile-mine-list,
body.is-mobile .mobile-featured-list,
body.is-mobile .mobile-profile-list,
body.is-mobile .ladder-board-list {
  gap: 12px;
}

body.is-mobile .mobile-library-letter {
  padding: 16px 0 8px;
  background: transparent;
  color: var(--mobile-muted);
  font-size: 12px;
}

body.is-mobile .mobile-library-item {
  min-height: 88px;
  padding: 16px;
  border: 1px solid var(--mobile-line);
  border-radius: 12px;
  background: var(--mobile-card);
}

body.is-mobile .mobile-mine-shortcuts button,
body.is-mobile .ladder-entry-grid button,
body.is-mobile .ladder-practice-actions button {
  border: 1px solid var(--mobile-line);
  border-radius: 12px;
  background: var(--mobile-card);
  color: var(--mobile-title);
  box-shadow: none;
}

body.is-mobile .mobile-mine-shortcuts svg,
body.is-mobile .ladder-practice-actions svg {
  color: var(--mobile-blue);
  filter: none;
}

body.is-mobile .ladder-entry-grid button {
  min-height: 80px;
  aspect-ratio: auto;
}

body.is-mobile .ladder-entry-grid svg,
body.is-mobile .ladder-board-row strong,
body.is-mobile .ladder-timer {
  color: var(--mobile-warning);
}

body.is-mobile .ladder-ladder,
body.is-mobile .mobile-ladder,
body.is-mobile .mobile-ladder-play,
body.is-mobile .ladder-question-top {
  background: var(--mobile-bg);
}

body.is-mobile .ladder-viewer {
  max-height: 400px;
  border-color: var(--mobile-line);
  border-radius: 16px;
  background: #000;
}

body.is-mobile .ladder-options {
  gap: 12px;
}

body.is-mobile .ladder-options button {
  min-height: 88px;
  padding: 16px;
  border-color: var(--mobile-line);
  border-radius: 12px;
  background: var(--mobile-card);
  color: var(--mobile-title);
  font-size: 14px;
}

body.is-mobile .ladder-options button.is-right {
  border-color: var(--mobile-success);
  background: rgba(0, 180, 42, 0.16);
  color: var(--mobile-title);
}

body.is-mobile .ladder-options button.is-wrong {
  border-color: var(--mobile-danger);
  background: rgba(245, 63, 63, 0.16);
  color: var(--mobile-title);
}

body.is-mobile .primary-button,
body.is-mobile .mobile-show-post,
body.is-mobile .ladder-primary {
  min-height: 44px;
  border: 0;
  border-radius: 12px;
  background: var(--mobile-blue);
  color: #fff;
  box-shadow: none;
}

body.is-mobile .field-label input,
body.is-mobile .field-label textarea,
body.is-mobile .field-label select {
  min-height: 44px;
  border: 1px solid transparent;
  border-radius: 12px;
  background: #0b1118;
  color: var(--mobile-title);
  font-size: 14px;
}

body.is-mobile .field-label textarea {
  min-height: 120px;
}

body.is-mobile .field-label input:focus,
body.is-mobile .field-label textarea:focus,
body.is-mobile .field-label select:focus {
  border-color: var(--mobile-blue);
  outline: 0;
}

body.is-mobile .modal {
  padding: 0;
  background: rgba(0, 0, 0, 0.5);
}

body.is-mobile .modal-card {
  max-height: 88dvh;
  padding: 16px;
  border: 1px solid var(--mobile-line);
  border-radius: 16px 16px 0 0;
  background: var(--mobile-card);
  color: var(--mobile-title);
  animation: mobileSheetIn 250ms ease-out;
}

body.is-mobile .modal-header h2 {
  color: var(--mobile-title);
}

body.is-mobile .image-card {
  max-height: 100dvh;
  min-height: 100dvh;
  width: 100vw;
  height: 100dvh;
  display: grid;
  grid-template-rows: auto minmax(0, 1fr) auto;
  overflow: hidden;
  padding: 0;
  border: 0;
  border-radius: 0;
  background: rgba(0, 0, 0, 0.9);
}

body.is-mobile .points-rules,
body.is-mobile .form-hint {
  color: var(--mobile-body);
}

body.is-mobile .points-rules h3 {
  color: var(--mobile-title);
}

body.is-mobile .mobile-tabbar {
  height: calc(64px + env(safe-area-inset-bottom));
  padding: 6px 8px calc(6px + env(safe-area-inset-bottom));
  border-top: 1px solid var(--mobile-line);
  background: rgba(12, 16, 22, 0.96);
}

body.is-mobile .mobile-tabbar button {
  min-height: 44px;
  color: var(--mobile-muted);
}

body.is-mobile .mobile-tabbar button.active {
  background: rgba(112, 199, 255, 0.12);
  color: var(--mobile-blue);
}

body.is-mobile .app-toast {
  bottom: calc(96px + env(safe-area-inset-bottom));
  max-width: calc(100vw - 48px);
  border: 0;
  border-radius: 12px;
  background: rgba(0, 0, 0, 0.78);
  color: #fff;
}

@keyframes mobileSheetIn {
  from { transform: translateY(100%); }
  to { transform: translateY(0); }
}

body.is-mobile .mobile-random {
  display: grid;
  gap: 12px;
}

body.is-mobile .mobile-detail-card {
  min-height: 0;
  display: block;
  overflow: hidden;
  border: 1px solid var(--line);
  border-radius: 8px;
  background: #0c1016;
  box-shadow: 0 16px 34px rgba(0,0,0,0.22);
}

body.is-mobile .mobile-detail-viewer {
  position: relative;
  height: 320px;
  min-height: 320px;
  background: #050607;
  overflow: hidden;
}

body.is-mobile .mobile-detail-viewer canvas,
body.is-mobile .mobile-model-viewer canvas {
  display: block;
  width: 100%;
  height: 100%;
}

body.is-mobile .mobile-detail-name {
  padding: 10px 12px 12px;
  color: var(--text);
  font-size: 16px;
  font-weight: 700;
  line-height: 1.35;
  text-align: center;
  overflow-wrap: anywhere;
}

body.is-mobile .mobile-search-results {
  max-height: 330px;
  overflow-y: auto;
  display: grid;
  gap: 8px;
}

body.is-mobile .mobile-result-item {
  min-height: 58px;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 12px;
  padding: 10px 12px;
  border: 1px solid var(--line);
  border-radius: 8px;
  background: #101722;
  color: var(--text);
  text-align: left;
}

body.is-mobile .mobile-result-item.user-search-item {
  display: grid;
  grid-template-columns: 36px minmax(0, 1fr) auto;
}

body.is-mobile .mobile-result-item span {
  min-width: 0;
  overflow-wrap: anywhere;
  font-weight: 700;
}

body.is-mobile .mobile-result-item small {
  flex: 0 0 auto;
  color: var(--muted);
}

body.is-mobile .mobile-models-header {
  display: grid;
  grid-template-columns: 44px minmax(0, 1fr);
  align-items: center;
  gap: 10px;
  margin-bottom: 10px;
}

body.is-mobile.mobile-tab-models .mobile-models-header {
  grid-template-columns: 44px minmax(0, 1fr) auto;
  flex: 0 0 auto;
  align-items: start;
  gap: 12px;
  margin-bottom: 14px;
  padding-top: 6px;
}

body.is-mobile .mobile-models-header > .model-settings-panel {
  grid-column: 1 / -1;
  width: 100%;
}

body.is-mobile .mobile-model-capture-area {
  display: grid;
  gap: 10px;
  min-width: 0;
}

body.is-mobile.mobile-tab-models .mobile-models {
  display: flex;
  flex-direction: column;
  height: 100%;
  min-height: 0;
}

body.is-mobile.mobile-tab-models .mobile-model-capture-area {
  flex: 1 1 auto;
  min-height: 0;
  grid-template-rows: auto minmax(0, 1fr);
}

body.is-mobile.mobile-tab-models .mobile-models-title-block {
  position: sticky;
  top: 0;
  z-index: 2;
  background: #090a0c;
}

body.is-mobile .mobile-model-export-actions {
  display: flex;
  grid-column: 3;
  justify-self: end;
  max-width: calc(100vw - 76px);
  gap: 6px;
  overflow-x: auto;
  scrollbar-width: none;
}

body.is-mobile .mobile-model-export-actions::-webkit-scrollbar {
  display: none;
}

body.is-mobile .mobile-model-export-actions .icon-link {
  flex: 0 0 auto;
  width: 40px;
  height: 40px;
  min-height: 40px;
}

body.is-mobile .mobile-model-export-actions .icon-link.active {
  border-color: var(--focus);
  color: #dff3ff;
  box-shadow: inset 0 0 0 1px rgba(112, 199, 255, 0.28);
}

body.is-mobile .mobile-model-export-actions .icon-link:disabled {
  opacity: 0.56;
  cursor: wait;
}

body.is-mobile .mobile-model-export-actions .icon-link.is-busy {
  color: var(--focus);
}

body.is-mobile .mobile-models-title-block h2 {
  margin: 0 0 3px;
  font-size: 19px;
}

body.is-mobile .mobile-models-title-block p {
  margin: 0;
  color: var(--muted);
  font-size: 13px;
}

body.is-mobile .mobile-model-grid {
  max-height: none;
  min-height: 0;
  overflow-y: auto;
  overscroll-behavior: contain;
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  grid-auto-rows: max-content;
  align-content: start;
  gap: 10px;
  padding-bottom: 12px;
}

body.is-mobile .mobile-model-tile {
  min-width: 0;
  overflow: hidden;
  border: 1px solid var(--line);
  border-radius: 8px;
  background: #0c1016;
}

body.is-mobile .mobile-model-viewer {
  position: relative;
  height: 150px;
  background: #050607;
  overflow: hidden;
}

body.is-mobile .model-source-badge,
.pc-model-tile .model-source-badge {
  display: inline-flex;
  max-width: calc(100% - 16px);
  margin: 8px 8px 0;
  padding: 3px 7px;
  border: 1px solid rgba(111, 227, 255, 0.34);
  border-radius: 999px;
  color: #aeeeff;
  background: rgba(111, 227, 255, 0.1);
  font-size: 11px;
  line-height: 1.2;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}

body.is-mobile .mobile-model-title {
  min-height: 38px;
  padding: 8px;
  color: var(--text);
  font-size: 12px;
  line-height: 1.3;
  overflow-wrap: anywhere;
}

body.is-mobile .mobile-empty {
  padding: 18px;
  border: 1px solid var(--line);
  border-radius: 8px;
  color: var(--muted);
  background: #0c1016;
}

body.is-mobile .mobile-load-sentinel {
  min-height: 54px;
  display: grid;
  place-items: center;
  border: 1px solid rgba(112, 199, 255, 0.24);
  border-radius: 8px;
  background:
    linear-gradient(135deg, rgba(112, 199, 255, 0.08), rgba(85, 217, 139, 0.05)),
    #0c1016;
  overflow: hidden;
}

body.is-mobile .mobile-load-line {
  width: min(62vw, 220px);
  height: 4px;
  border-radius: 999px;
  background: linear-gradient(90deg, transparent, #70c7ff, #55d98b, transparent);
  box-shadow: 0 0 14px rgba(112, 199, 255, 0.44);
  animation: modelLoadPulse 1.2s ease-in-out infinite;
}

body.is-mobile .mobile-load-dot {
  width: 7px;
  height: 7px;
  margin-top: 8px;
  border-radius: 999px;
  background: #70c7ff;
  box-shadow: 0 0 12px rgba(112, 199, 255, 0.88);
}

@keyframes modelLoadPulse {
  0%, 100% { opacity: 0.4; transform: scaleX(0.82); }
  50% { opacity: 1; transform: scaleX(1); }
}

#adminButton {
  display: none;
}

.admin-page {
  min-height: 100vh;
  overflow: auto;
  background: #080b10;
  color: var(--text);
}

.admin-shell {
  width: min(1180px, calc(100vw - 32px));
  margin: 0 auto;
  padding: 28px 0 48px;
}

.admin-header {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 16px;
  margin-bottom: 18px;
}

.admin-header h1 {
  margin: 0;
  font-size: 24px;
}

.admin-header p {
  margin: 6px 0 0;
  color: var(--muted);
}

.admin-header-actions {
  display: flex;
  align-items: center;
  gap: 10px;
}

.admin-panel {
  border: 1px solid var(--line);
  background: #0d1118;
  border-radius: 8px;
  padding: 18px;
}

.admin-form-grid {
  display: grid;
  grid-template-columns: repeat(2, minmax(180px, 1fr));
  gap: 12px;
  margin-bottom: 12px;
}

.admin-columns {
  display: grid;
  grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
  gap: 18px;
  margin-top: 18px;
}

.analytics-summary-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(128px, 1fr));
  gap: 12px;
  margin-bottom: 16px;
}

.analytics-tabs {
  display: flex;
  gap: 8px;
  margin-bottom: 16px;
  overflow-x: auto;
  padding-bottom: 2px;
  scrollbar-width: thin;
}

.analytics-tabs button {
  border: 1px solid var(--line);
  background: rgba(255,255,255,0.04);
  color: var(--muted);
  border-radius: 8px;
  padding: 9px 14px;
  white-space: nowrap;
  cursor: pointer;
}

.analytics-tabs button.active {
  border-color: rgba(102, 200, 255, 0.72);
  background: rgba(102, 200, 255, 0.14);
  color: var(--text);
}

.analytics-tab-panel {
  display: block;
}

.analytics-card,
.analytics-section {
  border: 1px solid var(--line);
  background: #090d13;
  border-radius: 8px;
  padding: 14px;
}

.analytics-card span {
  display: block;
  color: var(--muted);
  font-size: 12px;
}

.analytics-card strong {
  display: block;
  margin-top: 8px;
  font-size: 24px;
}

.analytics-grid {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 14px;
  margin: 14px 0;
}

.analytics-device-breakdown {
  display: grid;
  gap: 16px;
  margin: 16px 0;
}

.analytics-device-section {
  display: grid;
  gap: 12px;
  border: 1px solid var(--line);
  background: rgba(9, 13, 19, 0.68);
  border-radius: 8px;
  padding: 14px;
}

.analytics-device-section > h3 {
  margin: 0;
  font-size: 18px;
}

.analytics-summary-grid-compact {
  grid-template-columns: repeat(5, minmax(96px, 1fr));
  margin-bottom: 0;
}

.analytics-section h3 {
  margin: 0 0 12px;
  font-size: 16px;
}

.analytics-section {
  overflow-x: auto;
}

.analytics-table {
  width: 100%;
  min-width: 520px;
  border-collapse: collapse;
  font-size: 13px;
}

.analytics-table th,
.analytics-table td {
  border-bottom: 1px solid rgba(255,255,255,0.08);
  padding: 8px 6px;
  text-align: left;
  vertical-align: top;
}

.analytics-table th {
  color: var(--muted);
  font-weight: 600;
}

.analytics-bars,
.analytics-funnel,
.analytics-sankey-list {
  display: grid;
  gap: 8px;
}

.analytics-bar-row,
.analytics-funnel-step,
.analytics-sankey-row {
  display: grid;
  grid-template-columns: minmax(92px, 0.8fr) minmax(120px, 2fr) minmax(64px, auto);
  align-items: center;
  gap: 10px;
  color: var(--muted);
  font-size: 12px;
}

.analytics-sankey-row {
  grid-template-columns: minmax(82px, 1fr) minmax(110px, 1.4fr) minmax(82px, 1fr) minmax(42px, auto);
}

.analytics-bar-row div,
.analytics-funnel-step div,
.analytics-sankey-row div {
  height: 10px;
  background: rgba(255,255,255,0.08);
  border-radius: 999px;
  overflow: hidden;
}

.analytics-bar-row i,
.analytics-funnel-step i,
.analytics-sankey-row i {
  display: block;
  height: 100%;
  background: linear-gradient(90deg, #66c8ff, #7ce3c3);
  border-radius: inherit;
}

.analytics-funnel-step {
  grid-template-columns: minmax(100px, 1fr) minmax(120px, 1.5fr) minmax(112px, auto);
}

.analytics-empty {
  margin: 0;
  color: var(--muted);
}

.analytics-multi-trend,
.analytics-status-grid {
  display: grid;
  gap: 10px;
}

.analytics-multi-day {
  display: grid;
  grid-template-columns: minmax(86px, 0.4fr) minmax(220px, 1.6fr);
  gap: 12px;
  align-items: start;
  color: var(--muted);
  font-size: 12px;
}

.analytics-multi-day > strong {
  color: var(--text);
  font-weight: 600;
}

.analytics-multi-day > div {
  display: grid;
  gap: 6px;
}

.analytics-multi-day span {
  display: grid;
  grid-template-columns: minmax(80px, 1fr) minmax(84px, auto);
  align-items: center;
  gap: 8px;
}

.analytics-multi-day i {
  display: block;
  height: 8px;
  background: linear-gradient(90deg, #66c8ff, #7ce3c3);
  border-radius: 999px;
}

.analytics-multi-day b {
  font-weight: 500;
  color: var(--muted);
  white-space: nowrap;
}

.analytics-status-grid {
  grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
}

.analytics-status-block {
  border: 1px solid rgba(255,255,255,0.08);
  border-radius: 8px;
  padding: 10px;
  background: rgba(255,255,255,0.03);
}

.analytics-status-block h4 {
  margin: 0 0 8px;
  font-size: 13px;
}

.analytics-status-block div {
  display: flex;
  justify-content: space-between;
  gap: 10px;
  padding: 5px 0;
  color: var(--muted);
  font-size: 12px;
}

.analytics-status-block div + div {
  border-top: 1px solid rgba(255,255,255,0.06);
}

.analytics-status-block strong {
  color: var(--text);
}

@media (max-width: 820px) {
  .admin-columns,
  .admin-form-grid,
  .analytics-summary-grid,
  .analytics-grid {
    grid-template-columns: 1fr;
  }

  .admin-header {
    align-items: flex-start;
    flex-direction: column;
  }

  .analytics-tabs {
    margin-inline: -2px;
  }

  .analytics-tabs button {
    padding: 8px 12px;
  }

  .analytics-card strong {
    font-size: 20px;
  }

  .analytics-multi-day {
    grid-template-columns: 1fr;
  }

  .analytics-bar-row,
  .analytics-funnel-step,
  .analytics-sankey-row {
    min-width: 520px;
  }
}

/* PC shell */
.pc-shell {
  display: none;
}

html.is-pc-shell body:not(.is-mobile),
body.is-pc {
  height: auto;
  min-height: 100vh;
  overflow: auto;
  background: #080b0f;
}

html.is-pc-shell body:not(.is-mobile) .app-shell,
body.is-pc .app-shell {
  display: block;
  height: auto;
  min-height: 100vh;
}

html.is-pc-shell body:not(.is-mobile) .app-shell > .sidebar,
html.is-pc-shell body:not(.is-mobile) .app-shell > .main-pane,
html.is-pc-shell body:not(.is-mobile) .app-shell > .detail-pane,
body.is-pc .app-shell > .sidebar,
body.is-pc .app-shell > .main-pane,
body.is-pc .app-shell > .detail-pane {
  display: none;
}

html.is-pc-shell body:not(.is-mobile) .pc-shell,
body.is-pc .pc-shell {
  display: block;
  min-height: 100vh;
  background: #080b0f;
}

body.is-mobile .pc-shell {
  display: none !important;
}

.pc-topbar {
  position: sticky;
  top: 0;
  z-index: 180;
  display: grid;
  grid-template-columns: 190px minmax(360px, 720px) minmax(320px, 1fr);
  align-items: center;
  gap: 18px;
  height: 72px;
  padding: 0 clamp(20px, 4vw, 56px);
  border-bottom: 1px solid rgba(255,255,255,0.08);
  background: rgba(8, 11, 15, 0.94);
  backdrop-filter: blur(14px);
}

.pc-logo {
  grid-column: 1;
  display: flex;
  align-items: center;
  gap: 10px;
  height: 72px;
  text-decoration: none;
}

.pc-logo .brand-mark {
  width: 34px;
  height: 34px;
}

.pc-logo .brand-mark img {
  width: 27px;
  height: 27px;
}

.pc-logo .brand-word {
  font-size: 15px;
}

.pc-top-actions {
  grid-column: 3;
  justify-self: end;
  display: flex;
  align-items: center;
  justify-content: flex-end;
  gap: 10px;
}

.pc-text-button,
.pc-icon-button,
.pc-language-switch,
.pc-profile-button {
  min-height: 38px;
  border: 1px solid rgba(112, 199, 255, 0.24);
  border-radius: 8px;
  background: #101720;
  color: var(--text);
  cursor: pointer;
}

.pc-text-button {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 7px;
  padding: 0 13px;
  font-size: 13px;
  font-weight: 800;
}

.pc-icon-button {
  display: grid;
  place-items: center;
  width: 38px;
  height: 38px;
  padding: 0;
}

.pc-language-switch {
  width: 70px;
  padding: 0 10px;
  font-weight: 900;
}

.pc-profile-button {
  display: inline-grid;
  grid-template-columns: 30px minmax(72px, auto) 16px;
  align-items: center;
  gap: 8px;
  padding: 4px 10px 4px 5px;
  font-weight: 900;
}

.pc-profile-button img,
.pc-profile-head img,
.pc-detail-posts img {
  background: #050607;
}

.pc-profile-button img {
  width: 30px;
  height: 30px;
  object-fit: cover;
  border: 1px solid rgba(112, 199, 255, 0.36);
  border-radius: 999px;
}

.pc-hero-banner {
  position: relative;
  height: clamp(220px, 26vw, 360px);
  overflow: hidden;
  display: flex;
  align-items: flex-end;
  padding: 0 clamp(20px, 4vw, 56px) 22px;
  border-bottom: 1px solid rgba(255,255,255,0.08);
  background: #121821;
  color: #fff;
  font-size: clamp(22px, 3vw, 36px);
  font-weight: 900;
  text-shadow: 0 2px 12px rgba(0,0,0,0.72);
  user-select: none;
  cursor: grab;
  transition: border-color 180ms ease, filter 180ms ease;
}

.pc-hero-banner:hover {
  filter: saturate(1.05) brightness(1.04);
}

.pc-hero-banner.is-dragging,
.pc-hero-banner:active {
  cursor: grabbing;
}

.pc-hero-banner-image {
  position: absolute;
  inset: 0;
  display: block;
  width: 100%;
  height: 100%;
  object-fit: cover;
  object-position: center;
  pointer-events: none;
}

.pc-hero-banner-image[hidden] {
  display: none;
}

.pc-hero-banner > span {
  position: relative;
  z-index: 1;
}

.pc-hero-banner-pager {
  position: absolute;
  left: clamp(20px, 4vw, 56px);
  bottom: 18px;
  z-index: 2;
  padding: 4px 9px;
  border-radius: 999px;
  background: rgba(0,0,0,0.55);
  color: #fff;
  font-size: 12px;
  line-height: 1.4;
}

.pc-hero-banner-pager[hidden] {
  display: none;
}

.pc-banner-meta {
  min-height: 44px;
  padding-inline: clamp(20px, 4vw, 56px);
  border-color: rgba(255, 255, 255, 0.08);
  background: #0d131b;
}

.pc-menu {
  position: sticky;
  top: 72px;
  z-index: 170;
  display: flex;
  align-items: center;
  gap: 4px;
  height: 54px;
  padding: 0 clamp(20px, 4vw, 56px);
  border-bottom: 1px solid rgba(255,255,255,0.08);
  background: rgba(10, 14, 19, 0.96);
  backdrop-filter: blur(14px);
}

.pc-menu button {
  min-width: 104px;
  height: 38px;
  border: 0;
  border-radius: 8px;
  background: transparent;
  color: var(--muted);
  cursor: pointer;
  font-size: 14px;
  font-weight: 900;
  transition: background 160ms ease, color 160ms ease, transform 100ms ease;
}

.pc-menu button:hover {
  background: rgba(112, 199, 255, 0.1);
  color: var(--text);
}

.pc-menu button:active {
  transform: scale(0.97);
}

.pc-menu button:focus-visible,
.pc-topbar button:focus-visible,
.pc-profile-button:focus-visible,
.pc-card:focus-visible,
.pc-list-item:focus-visible,
.pc-search-wrap input:focus-visible,
.pc-search-row select:focus-visible {
  outline: 2px solid rgba(112, 199, 255, 0.82);
  outline-offset: 2px;
}

.pc-menu button.active {
  background: rgba(112, 199, 255, 0.16);
  color: var(--text);
}

.pc-content {
  width: min(1320px, calc(100vw - 40px));
  margin: 0 auto;
  padding: 24px 0 56px;
}

.pc-tab-panel,
.pc-model-panel {
  display: grid;
  gap: 18px;
  animation: pcPanelIn 220ms ease-out;
}

.pc-tab-panel.hidden,
.pc-model-panel.hidden,
.pc-profile-panel.hidden,
.pc-detail-overlay.hidden,
.pc-search-results.hidden {
  display: none !important;
}

@keyframes pcPanelIn {
  from {
    opacity: 0;
    transform: translateY(8px);
  }
  to {
    opacity: 1;
    transform: translateY(0);
  }
}

.pc-search-row {
  display: grid;
  grid-template-columns: minmax(280px, 1fr) 220px;
  gap: 12px;
}

.pc-top-search {
  position: absolute;
  left: 50%;
  width: clamp(360px, 38vw, 640px);
  transform: translateX(-50%);
}

.pc-search-wrap {
  display: grid;
  grid-template-columns: 20px minmax(0, 1fr);
  align-items: center;
  gap: 10px;
  min-height: 48px;
  padding: 0 14px;
  border: 1px solid var(--line);
  border-radius: 8px;
  background: #101720;
  transition: border-color 160ms ease, background 160ms ease, box-shadow 160ms ease;
}

.pc-search-wrap:focus-within {
  border-color: rgba(112, 199, 255, 0.78);
  box-shadow: 0 0 0 3px rgba(112, 199, 255, 0.12);
}

.pc-search-wrap input,
.pc-search-row select,
.pc-profile-editor select {
  width: 100%;
  min-width: 0;
  border: 0;
  outline: none;
  background: transparent;
  color: var(--text);
}

.pc-search-row select {
  min-height: 48px;
  padding: 0 14px;
  border: 1px solid var(--line);
  border-radius: 8px;
  background: #101720;
}

.pc-search-results,
.pc-library-list,
.pc-profile-list {
  display: grid;
  gap: 8px;
}

.pc-library-workspace {
  display: grid;
  grid-template-columns: 300px minmax(0, 1fr);
  gap: 18px;
  align-items: start;
}

.pc-library-list {
  position: sticky;
  top: 144px;
  max-height: calc(100vh - 168px);
  overflow-y: auto;
  padding: 10px;
  border: 1px solid var(--line);
  border-radius: 8px;
  background: #0d131b;
}

.pc-library-display {
  min-width: 0;
  display: grid;
  gap: 14px;
  padding: 16px;
  border: 1px solid var(--line);
  border-radius: 8px;
  background: #0d131b;
}

.pc-search-result,
.pc-library-item {
  width: 100%;
  min-height: 42px;
  display: grid;
  grid-template-columns: minmax(0, 1fr) auto;
  align-items: center;
  gap: 16px;
  padding: 8px 6px;
  border: 1px solid transparent;
  border-radius: 6px;
  background: transparent;
  color: var(--text);
  text-align: left;
  cursor: pointer;
  transition: border-color 160ms ease, background 160ms ease, transform 100ms ease;
}

.pc-search-result.user-search-item {
  grid-template-columns: 36px minmax(0, 1fr) auto;
}

.pc-search-result:hover,
.pc-library-item:hover,
.pc-library-item.active,
.pc-text-button:hover,
.pc-icon-button:hover,
.pc-profile-button:hover,
.pc-profile-actions button:hover,
.pc-profile-tabs button:hover {
  border-color: rgba(112, 199, 255, 0.62);
}

.pc-search-result:active,
.pc-library-item:active,
.pc-model-tile:active,
.pc-post-card:active,
.pc-profile-post-card:active {
  transform: scale(0.985);
}

.pc-library-item.active {
  background: rgba(112, 199, 255, 0.14);
}

.pc-search-result > span,
.pc-library-item > span {
  min-width: 0;
  overflow: hidden;
  font-weight: 900;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.pc-search-result small,
.pc-library-item small {
  display: grid;
  gap: 2px;
  justify-items: end;
  color: var(--muted);
  font-size: 12px;
  line-height: 1.35;
}

.pc-section-head {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 16px;
}

.pc-section-head h2 {
  margin: 0;
  font-size: 20px;
}

.pc-section-head h2 span {
  margin-left: 6px;
  color: var(--muted);
  font-size: 12px;
}

.pc-section-head p {
  margin: 4px 0 0;
}

.pc-model-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(230px, 1fr));
  gap: 14px;
}

.pc-model-tile {
  min-width: 0;
  overflow: hidden;
  border: 1px solid var(--line);
  border-radius: 8px;
  background: #101720;
  cursor: pointer;
  transition: border-color 160ms ease, background 160ms ease, transform 100ms ease, filter 160ms ease;
}

.pc-model-tile:hover {
  border-color: var(--focus);
  background: #121b26;
  filter: brightness(1.04);
}

.pc-model-viewer {
  position: relative;
  height: 220px;
  overflow: hidden;
  background: #050607;
}

.pc-library-display .pc-model-viewer {
  height: 250px;
}

.pc-model-tile .model-source-badge {
  margin: 10px 12px 0;
}

.pc-model-title {
  min-height: 46px;
  padding: 10px 12px;
  color: var(--text);
  font-size: 13px;
  line-height: 1.35;
  overflow-wrap: anywhere;
}

.pc-post-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
  gap: 14px;
}

.pc-post-card,
.pc-profile-post-card {
  overflow: hidden;
  border: 1px solid var(--line);
  border-radius: 8px;
  background: #101720;
  cursor: pointer;
  transition: border-color 160ms ease, background 160ms ease, transform 100ms ease, filter 160ms ease;
}

.pc-post-card:hover,
.pc-profile-post-card:hover {
  border-color: rgba(112, 199, 255, 0.62);
  background: #121b26;
  filter: brightness(1.03);
}

.pc-post-card {
  display: grid;
  grid-template-columns: minmax(0, 1fr) 116px;
  gap: 12px;
  padding: 12px;
}

.pc-post-card.is-multi {
  grid-template-columns: 1fr;
}

.pc-post-copy strong,
.pc-profile-post-copy strong {
  display: block;
  overflow: hidden;
  color: var(--text);
  font-size: 15px;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.pc-post-copy span,
.pc-post-copy p,
.pc-profile-post-copy span,
.pc-profile-post-copy p {
  display: block;
  margin-top: 7px;
  color: var(--muted);
  font-size: 12px;
  line-height: 1.45;
}

.pc-post-copy p,
.pc-profile-post-copy p {
  display: -webkit-box;
  overflow: hidden;
  -webkit-box-orient: vertical;
  -webkit-line-clamp: 2;
}

.pc-post-images {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: 6px;
}

.pc-post-card:not(.is-multi) .pc-post-images {
  grid-template-columns: 1fr;
}

.pc-post-images img {
  width: 100%;
  height: 104px;
  object-fit: cover;
  border-radius: 6px;
  background: #050607;
}

.pc-post-card:not(.is-multi) .pc-post-images img {
  height: 116px;
}

.pc-library-letter {
  padding: 14px 4px 4px;
  color: var(--focus);
  font-size: 16px;
  font-weight: 900;
}

.pc-segmented,
.pc-profile-tabs {
  display: inline-grid;
  grid-auto-flow: column;
  gap: 4px;
  padding: 4px;
  border: 1px solid var(--line);
  border-radius: 999px;
  background: #080b10;
}

.pc-segmented button,
.pc-profile-tabs button {
  min-height: 30px;
  min-width: 56px;
  border: 0;
  border-radius: 999px;
  background: transparent;
  color: var(--muted);
  cursor: pointer;
  font-weight: 900;
}

.pc-segmented button.active,
.pc-profile-tabs button.active {
  background: rgba(112, 199, 255, 0.2);
  color: var(--text);
}

.pc-profile-tabs {
  width: 100%;
  grid-auto-flow: initial;
  grid-template-columns: repeat(4, minmax(0, 1fr));
}

.pc-profile-tabs button {
  min-width: 0;
  padding: 0 8px;
  white-space: nowrap;
}

.pc-empty {
  padding: 22px;
  border: 1px solid var(--line);
  border-radius: 8px;
  background: #101720;
  color: var(--muted);
}

.pc-profile-panel {
  position: fixed;
  top: 84px;
  right: clamp(20px, 4vw, 56px);
  z-index: 4200;
  width: min(420px, calc(100vw - 40px));
  max-height: calc(100vh - 104px);
  overflow-y: auto;
  display: grid;
  gap: 14px;
  padding: 14px;
  border: 1px solid rgba(112, 199, 255, 0.3);
  border-radius: 8px;
  background: rgba(12, 17, 24, 0.98);
  box-shadow: 0 22px 58px rgba(0,0,0,0.46);
  backdrop-filter: blur(14px);
}

.pc-profile-head {
  display: grid;
  grid-template-columns: 64px minmax(0, 1fr) 38px;
  align-items: center;
  gap: 12px;
}

.pc-profile-head img {
  width: 64px;
  height: 64px;
  object-fit: cover;
  border: 1px solid rgba(112, 199, 255, 0.42);
  border-radius: 999px;
}

.pc-profile-head h2 {
  margin: 0;
  font-size: 20px;
}

.pc-profile-head p {
  margin-top: 5px;
}

.pc-profile-head .points-pill {
  margin-top: 8px;
}

.pc-profile-actions {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(72px, 1fr));
  gap: 10px;
}

.pc-profile-actions button {
  display: grid;
  place-items: center;
  gap: 7px;
  min-height: 82px;
  border: 1px solid rgba(112, 199, 255, 0.3);
  border-radius: 8px;
  background: #0d131b;
  color: var(--text);
  cursor: pointer;
  font-weight: 900;
}

.pc-profile-actions svg {
  color: var(--focus);
}

.pc-profile-editor {
  display: grid;
  gap: 10px;
  padding: 12px;
  border: 1px solid var(--line);
  border-radius: 8px;
  background: #0d131b;
}

.pc-avatar-picker {
  width: fit-content;
  min-height: 32px;
  display: inline-grid;
  place-items: center;
  padding: 0 10px;
  border: 1px solid var(--line);
  border-radius: 6px;
  background: var(--panel-2);
  color: var(--text);
  cursor: pointer;
  font-size: 12px;
}

.pc-avatar-picker input {
  display: none;
}

.pc-profile-list {
  max-height: 360px;
  overflow-y: auto;
}

.pc-profile-post-card {
  display: grid;
  grid-template-columns: minmax(0, 1fr) 84px;
  gap: 10px;
  padding: 10px;
}

.pc-profile-post-card img {
  width: 84px;
  height: 84px;
  object-fit: cover;
  border-radius: 6px;
  background: #050607;
}

.pc-profile-post-card.is-glory {
  border-color: rgba(246, 197, 73, 0.78);
  box-shadow: 0 0 0 1px rgba(246, 197, 73, 0.18), 0 0 20px rgba(246, 197, 73, 0.14);
}

.pc-detail-overlay {
  position: fixed;
  inset: 0;
  z-index: 4100;
  display: grid;
  place-items: center;
  padding: 26px;
  background: rgba(2, 4, 8, 0.74);
  backdrop-filter: blur(12px);
}

.pc-detail-card {
  position: relative;
  width: min(1180px, calc(100vw - 52px));
  height: min(760px, calc(100vh - 52px));
  display: grid;
  grid-template-columns: minmax(480px, 1fr) 390px;
  overflow: hidden;
  border: 1px solid rgba(112, 199, 255, 0.28);
  border-radius: 8px;
  background: #090d13;
  box-shadow: 0 22px 64px rgba(0,0,0,0.58);
}

.pc-detail-close {
  position: absolute;
  top: 12px;
  left: 12px;
  z-index: 5;
  background: rgba(12, 17, 24, 0.9);
}

.pc-detail-viewer {
  position: relative;
  min-width: 0;
  min-height: 0;
  overflow: hidden;
  background: #050607;
  touch-action: none;
}

.pc-detail-info {
  min-width: 0;
  overflow-y: auto;
  display: grid;
  align-content: start;
  gap: 14px;
  padding: 18px;
  border-left: 1px solid var(--line);
  background: #0d131b;
}

.pc-detail-title-row {
  display: flex;
  align-items: flex-start;
  justify-content: space-between;
  gap: 12px;
}

.pc-detail-title-row h2 {
  margin: 0;
  font-size: 21px;
}

.pc-detail-title-row p {
  margin-top: 6px;
}

.pc-detail-post-head {
  padding-top: 4px;
}

.pc-detail-posts {
  display: grid;
  gap: 10px;
}

.pc-detail-post {
  position: relative;
  display: grid;
  grid-template-columns: 96px minmax(0, 1fr);
  gap: 10px;
  padding: 10px;
  border: 1px solid var(--line);
  border-radius: 8px;
  background: #101720;
  cursor: pointer;
}

.pc-detail-post img {
  width: 96px;
  height: 96px;
  object-fit: cover;
  border-radius: 6px;
}

.pc-detail-post strong,
.pc-detail-post span {
  display: block;
}

.pc-detail-post span {
  margin-top: 6px;
  color: var(--muted);
  font-size: 12px;
  line-height: 1.45;
}

.pc-ladder-panel {
  min-width: 0;
}

.pc-ladder-shell {
  display: grid;
  grid-template-columns: minmax(300px, 360px) minmax(0, 1fr);
  gap: 18px;
  align-items: start;
}

.pc-ladder-sidebar {
  position: sticky;
  top: 144px;
  display: grid;
  gap: 14px;
  max-height: calc(100vh - 168px);
  overflow-y: auto;
  padding-right: 2px;
}

.pc-ladder-user-card,
.pc-ladder-board,
.pc-ladder-records,
.pc-ladder-workspace {
  min-width: 0;
  border: 1px solid var(--line);
  border-radius: 8px;
  background: #0d131b;
}

.pc-ladder-user-card {
  display: grid;
  gap: 12px;
  padding: 14px;
  border-color: rgba(246, 197, 73, 0.34);
  background:
    linear-gradient(145deg, rgba(246, 197, 73, 0.08), transparent 52%),
    #101720;
}

.pc-ladder-user-card strong {
  display: block;
  overflow: hidden;
  color: var(--text);
  font-size: 19px;
  font-weight: 900;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.pc-ladder-user-card p {
  margin: 5px 0 0;
  color: var(--muted);
  font-size: 12px;
  line-height: 1.5;
}

.pc-ladder-user-card .ladder-user-tags,
.pc-ladder-play-host .ladder-user-tags {
  display: flex;
  flex-wrap: wrap;
  gap: 6px;
}

.pc-ladder-panel .ladder-tag,
.pc-ladder-panel .ladder-rank-pill {
  display: inline-flex;
  align-items: center;
  min-height: 24px;
  padding: 0 8px;
  border: 1px solid rgba(112, 199, 255, 0.26);
  border-radius: 999px;
  background: rgba(112, 199, 255, 0.1);
  color: var(--text);
  font-size: 11px;
  font-weight: 900;
}

.pc-ladder-panel .ladder-tag.is-locked {
  border-color: rgba(255,255,255,0.12);
  background: rgba(255,255,255,0.05);
  color: var(--muted);
}

.pc-ladder-entry-grid,
.pc-ladder-practice-actions {
  display: grid;
  gap: 8px;
}

.pc-ladder-entry-grid {
  grid-template-columns: repeat(3, minmax(0, 1fr));
}

.pc-ladder-practice-actions {
  grid-template-columns: repeat(2, minmax(0, 1fr));
}

.pc-ladder-entry-grid button,
.pc-ladder-practice-actions button,
.pc-ladder-play-host .ladder-actions button,
.pc-ladder-play-host .ladder-nav button,
.pc-ladder-play-host .ladder-choice-grid button,
.pc-ladder-play-host .ladder-level-grid label {
  min-width: 0;
  min-height: 42px;
  border: 1px solid rgba(112, 199, 255, 0.24);
  border-radius: 8px;
  background: #101720;
  color: var(--text);
  cursor: pointer;
  font-weight: 900;
  transition: border-color 160ms ease, background 160ms ease, transform 100ms ease, filter 160ms ease;
}

.pc-ladder-entry-grid button,
.pc-ladder-practice-actions button {
  position: relative;
  overflow: hidden;
  display: grid;
  place-items: center;
  gap: 6px;
  padding: 11px 8px;
  text-align: center;
}

.pc-ladder-entry-grid svg,
.pc-ladder-practice-actions svg {
  width: 22px;
  height: 22px;
  color: #70c7ff;
}

.pc-ladder-entry-grid button:hover,
.pc-ladder-practice-actions button:hover,
.pc-ladder-play-host .ladder-actions button:hover,
.pc-ladder-play-host .ladder-nav button:hover,
.pc-ladder-play-host .ladder-choice-grid button:hover,
.pc-ladder-play-host .ladder-level-grid label:hover,
.pc-ladder-records .ladder-record-row:hover,
.pc-ladder-board-list .ladder-board-row:hover {
  border-color: rgba(112, 199, 255, 0.68);
  background: #121b26;
  filter: brightness(1.03);
}

.pc-ladder-entry-grid button:active,
.pc-ladder-practice-actions button:active,
.pc-ladder-play-host .ladder-actions button:active,
.pc-ladder-play-host .ladder-nav button:active,
.pc-ladder-play-host .ladder-options button:active {
  transform: scale(0.985);
}

.pc-ladder-entry-grid button.is-locked {
  opacity: 1;
  color: #a3acb7;
  background: linear-gradient(145deg, #11161d, #07090d);
  border-color: rgba(160, 168, 178, 0.26);
  filter: grayscale(1) saturate(0.14);
  box-shadow: inset 0 0 22px rgba(0, 0, 0, 0.46);
}

.pc-ladder-entry-grid button.is-locked::before,
.pc-ladder-entry-grid button.is-locked::after {
  content: "";
  position: absolute;
  pointer-events: none;
  z-index: 2;
}

.pc-ladder-entry-grid button.is-locked::before {
  left: 6px;
  top: 5px;
  width: 8px;
  height: 8px;
  border: 2px solid rgba(229, 235, 242, 0.88);
  border-bottom: 0;
  border-radius: 6px 6px 0 0;
  box-shadow: 0 2px 7px rgba(0, 0, 0, 0.42);
}

.pc-ladder-entry-grid button.is-locked::after {
  left: 4px;
  top: 12px;
  width: 15px;
  height: 12px;
  border: 1px solid rgba(255, 255, 255, 0.24);
  border-radius: 4px;
  background: linear-gradient(180deg, rgba(232, 238, 246, 0.92), rgba(154, 164, 176, 0.9));
  box-shadow:
    inset 0 1px 0 rgba(255, 255, 255, 0.48),
    0 4px 12px rgba(0, 0, 0, 0.42);
}

.pc-ladder-entry-grid button.is-locked > * {
  position: relative;
  z-index: 1;
}

.pc-ladder-board,
.pc-ladder-records {
  display: grid;
  gap: 10px;
  padding: 14px;
}

.pc-ladder-board h3,
.pc-ladder-records h3 {
  margin: 0;
  color: var(--text);
  font-size: 15px;
}

.pc-ladder-board-list,
.pc-ladder-records > div,
.pc-ladder-play-host .ladder-wrong-list,
.pc-ladder-play-host .ladder-record-detail-list {
  display: grid;
  gap: 8px;
}

.pc-ladder-board-list .ladder-board-row,
.pc-ladder-records .ladder-record-row {
  width: 100%;
  min-width: 0;
  min-height: 44px;
  display: grid;
  align-items: center;
  gap: 8px;
  border: 1px solid transparent;
  border-radius: 7px;
  background: #101720;
  color: var(--text);
}

.pc-ladder-board-list .ladder-board-row {
  grid-template-columns: 28px 34px minmax(0, 1fr) auto;
  padding: 7px 9px;
}

.pc-ladder-records .ladder-record-row {
  grid-template-columns: 54px minmax(0, 1fr);
  padding: 9px 10px;
  cursor: pointer;
  text-align: left;
}

.pc-ladder-board-list .ladder-board-row strong,
.pc-ladder-records .ladder-record-row strong {
  color: #f6c549;
  font-size: 13px;
  font-weight: 900;
}

.pc-ladder-board-list .ladder-board-row span,
.pc-ladder-records .ladder-record-row span {
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.pc-ladder-board-list .ladder-board-row small,
.pc-ladder-records .ladder-record-row small {
  color: var(--muted);
  font-size: 12px;
}

.pc-ladder-records .ladder-record-row small {
  grid-column: 2;
}

.pc-ladder-panel .ladder-avatar-button {
  display: grid;
  place-items: center;
  width: 32px;
  height: 32px;
  padding: 0;
  border: 1px solid rgba(112, 199, 255, 0.28);
  border-radius: 999px;
  background: #06090d;
  cursor: pointer;
}

.pc-ladder-panel .ladder-avatar-button img {
  width: 30px;
  height: 30px;
  object-fit: cover;
  border-radius: 999px;
}

.pc-ladder-panel .ladder-empty,
.pc-ladder-panel .ladder-info {
  padding: 13px;
  border: 1px dashed rgba(112, 199, 255, 0.22);
  border-radius: 8px;
  background: rgba(112, 199, 255, 0.05);
  color: var(--muted);
  font-size: 13px;
  line-height: 1.55;
}

.pc-ladder-workspace {
  min-height: min(650px, calc(100vh - 168px));
  overflow: hidden;
}

.pc-ladder-play-host {
  min-height: min(650px, calc(100vh - 168px));
  display: grid;
  padding: 16px;
}

.pc-ladder-idle {
  min-height: 100%;
  display: grid;
  place-content: center;
  gap: 10px;
  padding: 32px;
  border: 1px dashed rgba(112, 199, 255, 0.22);
  border-radius: 8px;
  background:
    radial-gradient(circle at 18% 12%, rgba(246, 197, 73, 0.1), transparent 32%),
    radial-gradient(circle at 86% 28%, rgba(112, 199, 255, 0.12), transparent 30%),
    #0b1017;
  color: var(--muted);
  text-align: center;
}

.pc-ladder-idle h3 {
  margin: 0;
  color: var(--text);
  font-size: 20px;
}

.pc-ladder-idle p {
  max-width: 560px;
  margin: 0;
  line-height: 1.7;
}

.pc-ladder-play-host .ladder-intro,
.pc-ladder-play-host .ladder-result {
  align-self: stretch;
  display: grid;
  align-content: start;
  gap: 14px;
  padding: 18px;
  border: 1px solid rgba(112, 199, 255, 0.22);
  border-radius: 8px;
  background: #101720;
}

.pc-ladder-play-host .ladder-intro h2,
.pc-ladder-play-host .ladder-result h2 {
  margin: 0;
  color: var(--text);
  font-size: 24px;
}

.pc-ladder-play-host .ladder-intro p,
.pc-ladder-play-host .ladder-result p {
  margin: 0;
  color: var(--muted);
  line-height: 1.65;
}

.pc-ladder-play-host .ladder-setup-title {
  margin-top: 6px;
  color: var(--text);
  font-size: 14px;
}

.pc-ladder-play-host .ladder-choice-grid {
  display: grid;
  grid-template-columns: repeat(4, minmax(0, 1fr));
  gap: 10px;
}

.pc-ladder-play-host .ladder-level-grid {
  display: grid;
  grid-template-columns: repeat(5, minmax(0, 1fr));
  gap: 8px;
}

.pc-ladder-play-host .ladder-choice-grid button,
.pc-ladder-play-host .ladder-level-grid label {
  display: grid;
  place-items: center;
  padding: 0 10px;
  text-align: center;
}

.pc-ladder-play-host .ladder-choice-grid button.active,
.pc-ladder-play-host .ladder-level-grid label:has(input:checked) {
  border-color: rgba(246, 197, 73, 0.72);
  background: rgba(246, 197, 73, 0.14);
  color: #fff3c4;
}

.pc-ladder-play-host .ladder-level-grid input {
  position: absolute;
  opacity: 0;
  pointer-events: none;
}

.pc-ladder-play-host .ladder-actions,
.pc-ladder-play-host .ladder-nav {
  display: flex;
  flex-wrap: wrap;
  gap: 10px;
}

.pc-ladder-play-host .ladder-actions button,
.pc-ladder-play-host .ladder-nav button {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  padding: 0 18px;
}

.pc-ladder-play-host .ladder-primary {
  border-color: rgba(246, 197, 73, 0.72) !important;
  background: linear-gradient(135deg, #d9951f, #f6c549) !important;
  color: #120d02 !important;
}

.pc-ladder-play-host .ladder-question-card {
  align-self: stretch;
  min-height: min(620px, calc(100vh - 200px));
  display: grid;
  grid-template-columns: minmax(0, 1fr) minmax(300px, 360px);
  grid-template-rows: auto minmax(0, 1fr) auto;
  gap: 14px;
}

.pc-ladder-play-host .ladder-question-top {
  grid-column: 1 / -1;
  min-width: 0;
  display: grid;
  grid-template-columns: auto minmax(0, 1fr) auto auto;
  align-items: center;
  gap: 12px;
  padding: 12px 14px;
  border: 1px solid var(--line);
  border-radius: 8px;
  background: #101720;
}

.pc-ladder-play-host .ladder-timer {
  color: #f6c549;
  font-size: 20px;
  font-weight: 900;
}

.pc-ladder-play-host .ladder-timer.is-warning {
  color: #ffbd66;
}

.pc-ladder-play-host .ladder-timer.is-danger {
  color: #ff6d6d;
}

.pc-ladder-play-host .ladder-progress {
  min-width: 0;
  overflow: hidden;
  color: var(--text);
  font-weight: 900;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.pc-ladder-play-host .ladder-difficulty {
  display: inline-flex;
  align-items: center;
  gap: 5px;
  min-height: 28px;
  padding: 0 9px;
  border: 1px solid rgba(112, 199, 255, 0.28);
  border-radius: 999px;
  color: var(--text);
  font-size: 12px;
  font-weight: 900;
}

.pc-ladder-play-host .ladder-difficulty.is-easy {
  border-color: rgba(80, 210, 138, 0.55);
  background: rgba(80, 210, 138, 0.12);
}

.pc-ladder-play-host .ladder-difficulty.is-mid {
  border-color: rgba(246, 197, 73, 0.58);
  background: rgba(246, 197, 73, 0.13);
}

.pc-ladder-play-host .ladder-difficulty.is-hard {
  border-color: rgba(255, 105, 105, 0.58);
  background: rgba(255, 105, 105, 0.12);
}

.pc-ladder-play-host .ladder-exit {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 6px;
  min-height: 34px;
  padding: 0 10px;
  border: 1px solid rgba(255,255,255,0.13);
  border-radius: 8px;
  background: #0c1118;
  color: var(--muted);
  cursor: pointer;
  font-weight: 900;
}

.pc-ladder-play-host .ladder-exit:hover {
  border-color: rgba(255, 105, 105, 0.54);
  color: #ffd2d2;
}

.pc-ladder-play-host .ladder-viewer {
  position: relative;
  grid-column: 1;
  grid-row: 2 / 4;
  min-height: 0;
  overflow: hidden;
  border: 1px solid rgba(112, 199, 255, 0.18);
  border-radius: 8px;
  background: #050607;
  touch-action: none;
}

.pc-ladder-play-host .ladder-viewer canvas {
  display: block;
  width: 100%;
  height: 100%;
  background: #050607;
}

.pc-ladder-play-host .ladder-options {
  grid-column: 2;
  grid-row: 2;
  align-self: stretch;
  display: grid;
  align-content: start;
  gap: 10px;
  min-height: 0;
  overflow-y: auto;
}

.pc-ladder-play-host .ladder-options button {
  min-height: 56px;
  padding: 10px 12px;
  border: 1px solid rgba(112, 199, 255, 0.24);
  border-radius: 8px;
  background: #101720;
  color: var(--text);
  cursor: pointer;
  font-weight: 900;
  line-height: 1.35;
  text-align: left;
  overflow-wrap: anywhere;
  transition: border-color 160ms ease, background 160ms ease, transform 100ms ease;
}

.pc-ladder-play-host .ladder-options button:hover {
  border-color: rgba(112, 199, 255, 0.72);
  background: #121b26;
}

.pc-ladder-play-host .ladder-options button.active {
  border-color: rgba(246, 197, 73, 0.75);
  background: rgba(246, 197, 73, 0.16);
}

.pc-ladder-play-host .ladder-options button.is-right {
  border-color: rgba(80, 210, 138, 0.72);
  background: rgba(80, 210, 138, 0.16);
}

.pc-ladder-play-host .ladder-options button.is-wrong {
  border-color: rgba(255, 105, 105, 0.72);
  background: rgba(255, 105, 105, 0.15);
}

.pc-ladder-play-host .ladder-options button:disabled,
.pc-ladder-play-host .ladder-nav button:disabled {
  cursor: not-allowed;
  opacity: 0.62;
}

.pc-ladder-play-host .ladder-nav {
  grid-column: 2;
  grid-row: 3;
  align-self: end;
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
}

.pc-ladder-play-host .ladder-nav button {
  min-height: 44px;
  padding-inline: 10px;
}

.pc-ladder-play-host .ladder-wrong-list {
  grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
}

.pc-ladder-play-host .ladder-wrong-card {
  display: grid;
  gap: 10px;
  padding: 10px;
  border: 1px solid var(--line);
  border-radius: 8px;
  background: #0d131b;
}

.pc-ladder-play-host .ladder-wrong-viewer {
  height: 180px;
  overflow: hidden;
  border-radius: 7px;
  background: #050607;
}

.pc-ladder-play-host .ladder-answer-row {
  display: grid;
  gap: 5px;
  color: var(--muted);
  font-size: 12px;
  line-height: 1.45;
}

.pc-ladder-play-host .ladder-answer-row .wrong {
  color: #ff9d9d;
}

.pc-ladder-play-host .ladder-answer-row .right {
  color: #85e0ad;
}

.pc-ladder-play-host .ladder-record-detail-list {
  grid-template-columns: repeat(auto-fill, minmax(230px, 1fr));
}

.pc-ladder-play-host .ladder-record-detail-row {
  display: grid;
  gap: 7px;
  padding: 12px;
  border: 1px solid var(--line);
  border-radius: 8px;
  background: #0d131b;
}

.pc-ladder-play-host .ladder-record-detail-row strong {
  color: #f6c549;
}

.pc-ladder-play-host .ladder-record-detail-row span {
  overflow: hidden;
  color: var(--text);
  font-weight: 900;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.pc-ladder-play-host .ladder-record-detail-row small {
  color: var(--muted);
  line-height: 1.45;
}

.pc-ladder-panel button:focus-visible,
.pc-ladder-panel label:focus-visible,
.pc-detail-tools button:focus-visible,
.public-profile-tabs button:focus-visible {
  outline: 2px solid rgba(112, 199, 255, 0.82);
  outline-offset: 2px;
}

.pc-detail-title-row {
  display: grid;
  align-items: start;
}

.pc-detail-tools {
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
  min-width: 0;
}

.pc-detail-tools .pc-text-button {
  min-width: 86px;
}

.pc-detail-tools .pc-icon-button,
.pc-detail-tools .gif-text-button {
  flex: 0 0 auto;
}

.pc-detail-tools .pc-icon-button.active,
.pc-detail-tools .pc-text-button.active {
  border-color: rgba(112, 199, 255, 0.78);
  background: rgba(112, 199, 255, 0.16);
  color: #e7f6ff;
  box-shadow: inset 0 0 0 1px rgba(112, 199, 255, 0.16);
}

.pc-model-settings-panel {
  width: 100%;
}

.public-profile-tabs {
  width: 100%;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  margin: 10px 0 2px;
}

.public-profile-tabs button {
  cursor: pointer;
}

@media (max-height: 780px) and (min-width: 981px) {
  .pc-ladder-play-host {
    min-height: calc(100vh - 154px);
    padding: 12px;
  }

  .pc-ladder-play-host .ladder-question-card {
    min-height: calc(100vh - 178px);
    grid-template-columns: minmax(0, 1fr) 330px;
    gap: 10px;
  }

  .pc-ladder-play-host .ladder-question-top {
    padding: 9px 11px;
  }

  .pc-ladder-play-host .ladder-options button {
    min-height: 48px;
    padding: 8px 10px;
  }

  .pc-ladder-play-host .ladder-viewer {
    min-height: 420px;
  }
}

@media (max-width: 980px) {
  html.is-pc-shell body:not(.is-mobile) .pc-topbar,
  html.is-pc-shell body:not(.is-mobile) .pc-menu,
  html.is-pc-shell body:not(.is-mobile) .pc-hero-banner,
  body.is-pc .pc-topbar,
  body.is-pc .pc-menu,
  body.is-pc .pc-hero-banner {
    padding-left: 18px;
    padding-right: 18px;
  }

  .pc-search-row,
  .pc-topbar,
  .pc-library-workspace,
  .pc-ladder-shell,
  .pc-ladder-play-host .ladder-question-card,
  .pc-detail-card {
    grid-template-columns: 1fr;
  }

  .pc-topbar {
    height: auto;
    padding-top: 10px;
    padding-bottom: 10px;
  }

  .pc-top-search {
    position: static;
    justify-self: stretch;
    width: 100%;
    transform: none;
  }

  .pc-top-actions {
    grid-column: auto;
    justify-self: start;
    justify-content: flex-start;
    flex-wrap: wrap;
  }

  .pc-menu {
    top: auto;
  }

  .pc-library-list {
    position: relative;
    top: auto;
    max-height: 320px;
  }

  .pc-detail-card {
    overflow-y: auto;
  }

  .pc-detail-viewer {
    min-height: 420px;
  }

  .pc-detail-info {
    border-left: 0;
    border-top: 1px solid var(--line);
  }

  .pc-ladder-sidebar {
    position: relative;
    top: auto;
    max-height: none;
  }

  .pc-ladder-play-host .ladder-viewer,
  .pc-ladder-play-host .ladder-options,
  .pc-ladder-play-host .ladder-nav {
    grid-column: auto;
    grid-row: auto;
  }

  .pc-ladder-play-host .ladder-question-card {
    min-height: 720px;
  }
}

.mobile-library-search,
.pc-library-search {
  display: flex;
  align-items: center;
  gap: 8px;
  min-height: 42px;
  padding: 0 12px;
  border: 1px solid var(--line);
  border-radius: 8px;
  background: rgba(14, 20, 30, 0.86);
  color: var(--muted);
}

.mobile-library-search input,
.pc-library-search input {
  width: 100%;
  min-width: 0;
  border: 0;
  outline: 0;
  background: transparent;
  color: var(--text);
  font: inherit;
}

.pc-library-search {
  margin-bottom: 12px;
}

.pc-library-sidebar {
  display: grid;
  grid-template-columns: 28px minmax(0, 1fr);
  gap: 8px;
  min-height: 0;
}

.mobile-library-index,
.pc-library-index {
  display: grid;
  gap: 2px;
  align-content: center;
  touch-action: none;
  user-select: none;
}

.mobile-library-index button,
.pc-library-index button {
  width: 24px;
  min-height: 18px;
  border: 0;
  border-radius: 4px;
  background: transparent;
  color: var(--accent);
  font: 700 11px/1 var(--font-sans);
}

.mobile-library-index button.active,
.pc-library-index button.active {
  background: rgba(112, 199, 255, 0.22);
  color: #fff;
}

.pc-library-index {
  position: sticky;
  top: 12px;
  align-self: start;
}

.mobile-library {
  position: relative;
}

body.is-mobile .mobile-library-search {
  margin: 0 14px 10px;
}

body.is-mobile .mobile-library-index {
  position: fixed;
  right: 3px;
  top: 112px;
  bottom: 96px;
  z-index: 40;
  width: 24px;
  pointer-events: auto;
}

body.is-mobile .mobile-library-list {
  padding-right: 28px;
}

.mineral-info-panel {
  grid-column: 1 / -1;
  padding: 14px;
  border: 1px solid var(--line);
  border-radius: 8px;
  background: rgba(12, 17, 25, 0.78);
}

.mineral-info-panel.is-collapsible {
  padding: 0;
  overflow: hidden;
}

.mineral-info-toggle {
  width: 100%;
  min-height: 44px;
  border: 0;
  background: #121923;
  color: var(--text);
  font: 800 15px/1 var(--font-sans);
  cursor: pointer;
}

.mineral-info-toggle.active {
  border-bottom: 1px solid var(--line);
  background: rgba(112, 199, 255, 0.14);
  color: #fff;
}

.mineral-info-panel.is-collapsible .detail-grid {
  padding: 14px;
}

.mineral-info-panel h3 {
  margin: 0 0 12px;
  font-size: 16px;
}

.mineral-info-empty {
  grid-column: 1 / -1;
}

.mineral-image-panel {
  grid-column: 1 / -1;
  display: grid;
  gap: 12px;
  padding: 14px;
  border: 1px solid var(--line);
  border-radius: 8px;
  background: rgba(12, 17, 25, 0.78);
}

.mobile-expanded-posts {
  display: none !important;
}

.mobile-show-post {
  display: none !important;
}

.mineral-image-panel h3 {
  margin: 0;
  font-size: 16px;
}

.mineral-image-grid {
  display: grid;
  grid-template-columns: 1fr;
  gap: 12px;
}

.mineral-image-grid.is-empty {
  display: block;
  color: var(--muted);
}

.mineral-image-card {
  position: relative;
  display: grid;
  grid-template-columns: 112px minmax(0, 1fr);
  align-items: center;
  gap: 12px;
  min-height: 112px;
  overflow: hidden;
  border: 1px solid var(--line);
  border-radius: 8px;
  background: rgba(7, 10, 16, 0.92);
  color: var(--text);
  text-align: left;
}

.mineral-image-thumb {
  position: relative;
  display: block;
  width: 112px;
  height: 112px;
  padding: 0;
  border: 0;
  background: #05070b;
  cursor: zoom-in;
}

.mineral-image-thumb img {
  display: block;
  width: 100%;
  height: 100%;
  object-fit: cover;
}

.mineral-image-copy {
  display: grid;
  gap: 10px;
  min-width: 0;
  padding: 10px 12px 10px 0;
}

.mineral-image-user {
  display: inline-grid;
  grid-template-columns: 28px minmax(0, auto);
  align-items: center;
  justify-content: start;
  gap: 8px;
  min-width: 0;
  padding: 0;
  border: 0;
  background: transparent;
  color: var(--text);
  font: inherit;
  font-weight: 900;
  text-align: left;
  cursor: pointer;
}

.mineral-image-user img {
  width: 28px;
  height: 28px;
  border-radius: 50%;
  object-fit: cover;
  background: #111827;
}

.mineral-image-user span {
  overflow: hidden;
  white-space: nowrap;
  text-overflow: ellipsis;
}

.mineral-image-copy time,
.post-source-label {
  color: var(--muted);
  font-size: 12px;
}

.follow-rank {
  position: absolute;
  top: 0;
  left: 0;
  z-index: 1;
  min-width: 28px;
  height: 24px;
  padding: 3px 8px 0 6px;
  color: #111827;
  font-size: 13px;
  font-weight: 1000;
  line-height: 1;
  clip-path: polygon(0 0, 100% 0, 74% 100%, 0 100%);
}

.follow-rank.gold {
  background: #f6c453;
}

.follow-rank.silver {
  background: #c9d2df;
}

.follow-rank.bronze {
  background: #9ca3af;
}

.site-beian {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  gap: 8px 16px;
  padding: 16px;
  color: var(--muted);
  font-size: 12px;
}

.site-beian a {
  color: var(--muted);
  text-decoration: none;
}

.site-beian span,
.site-beian button {
  color: var(--muted);
}

.site-policy-links {
  display: inline-flex;
  flex-wrap: nowrap;
  gap: 8px;
  white-space: nowrap;
}

.site-beian button {
  border: 0;
  padding: 0;
  background: transparent;
  font: inherit;
  cursor: pointer;
}

.site-beian a:hover,
.site-beian button:hover {
  color: var(--accent);
}

body.is-mobile .site-beian {
  padding-bottom: 96px;
}

.auth-modal {
  align-items: stretch;
  justify-items: stretch;
  padding: 0;
}

.auth-modal .login-card {
  width: 100vw;
  max-width: none;
  height: 100dvh;
  max-height: none;
  display: grid;
  align-content: start;
  gap: 12px;
  padding: max(18px, env(safe-area-inset-top, 0px)) max(18px, env(safe-area-inset-right, 0px)) max(24px, env(safe-area-inset-bottom, 0px)) max(18px, env(safe-area-inset-left, 0px));
  border: 0;
  border-radius: 0;
  background: #0b111a;
}

.auth-view {
  display: grid;
  gap: 14px;
  width: min(560px, 100%);
  margin: 0 auto;
}

.auth-view.hidden {
  display: none;
}

.auth-switch-row,
.auth-code-field span {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 10px;
}

.auth-code-field span {
  grid-template-columns: minmax(0, 1fr) auto;
  align-items: center;
}

.auth-code-field .small-button {
  min-height: 44px;
  white-space: nowrap;
}

.auth-captcha {
  --auth-captcha-image: url("./resources/community/post-01.webp");
  --auth-captcha-stage-width: 320px;
  --auth-captcha-stage-height: 74px;
  --auth-captcha-cover-width: 320px;
  --auth-captcha-cover-height: 74px;
  --auth-captcha-piece-bg-x: 0px;
  --auth-captcha-piece-bg-y: -18px;
  display: grid;
  gap: 8px;
  padding: 10px;
  border: 1px solid rgba(112, 199, 255, 0.22);
  border-radius: 8px;
  background: #101720;
}

.auth-captcha-stage {
  position: relative;
  height: 74px;
  overflow: hidden;
  border-radius: 7px;
  background-image:
    linear-gradient(90deg, rgba(3, 7, 12, 0.2), rgba(3, 7, 12, 0.08)),
    var(--auth-captcha-image);
  background-size: auto, cover;
  background-position: center, center;
  background-repeat: no-repeat;
}

.auth-captcha-stage::before,
.auth-captcha-stage::after {
  content: "";
  position: absolute;
  inset: 0;
  pointer-events: none;
}

.auth-captcha-stage::before {
  opacity: 0.5;
  background:
    radial-gradient(circle at 16% 28%, rgba(246, 197, 73, 0.36) 0 4px, transparent 5px),
    radial-gradient(circle at 72% 35%, rgba(112, 199, 255, 0.34) 0 3px, transparent 4px),
    radial-gradient(circle at 42% 78%, rgba(80, 210, 138, 0.28) 0 4px, transparent 5px),
    repeating-radial-gradient(circle at 20% 50%, rgba(255,255,255,0.12) 0 1px, transparent 1px 9px);
}

.auth-captcha-stage::after {
  opacity: 0.38;
  background:
    linear-gradient(155deg, transparent 0 22%, rgba(255,255,255,0.18) 22% 23%, transparent 23% 52%, rgba(255,255,255,0.13) 52% 53%, transparent 53%),
    repeating-linear-gradient(0deg, transparent 0 10px, rgba(255,255,255,0.07) 10px 11px);
  box-shadow: inset 0 0 0 1px rgba(255,255,255,0.08), inset 0 0 26px rgba(0,0,0,0.36);
}

.auth-captcha-gap,
.auth-captcha-piece {
  position: absolute;
  z-index: 1;
  top: 18px;
  width: 38px;
  height: 38px;
  border-radius: 7px;
}

.auth-captcha-gap {
  border: 2px solid rgba(246, 197, 73, 0.9);
  background: rgba(2, 6, 12, 0.34);
  box-shadow: inset 0 0 16px rgba(0, 0, 0, 0.34), 0 0 18px rgba(246, 197, 73, 0.28);
  transform: translateX(-50%);
}

.auth-captcha-piece {
  left: 0;
  border: 1px solid rgba(112, 199, 255, 0.72);
  background-image:
    linear-gradient(135deg, rgba(255, 255, 255, 0.18), rgba(3, 7, 12, 0.08)),
    var(--auth-captcha-image);
  background-size: auto, var(--auth-captcha-cover-width) var(--auth-captcha-cover-height);
  background-position: center, var(--auth-captcha-piece-bg-x) var(--auth-captcha-piece-bg-y);
  background-repeat: no-repeat;
  box-shadow: 0 0 18px rgba(112, 199, 255, 0.22);
  transition: border-color 160ms ease, background 160ms ease, box-shadow 160ms ease;
}

.auth-captcha-track {
  position: relative;
  height: 44px;
  display: grid;
  place-items: center;
  overflow: hidden;
  border: 1px solid rgba(255,255,255,0.13);
  border-radius: 8px;
  background: #080d13;
  color: var(--muted);
  font-size: 13px;
  user-select: none;
}

.auth-captcha-thumb {
  position: absolute;
  z-index: 2;
  left: 3px;
  top: 3px;
  width: 38px;
  height: 38px;
  display: grid;
  place-items: center;
  border: 1px solid rgba(112, 199, 255, 0.58);
  border-radius: 7px;
  background: #132234;
  color: #dff3ff;
  cursor: grab;
  touch-action: none;
}

.auth-captcha-thumb:active {
  cursor: grabbing;
}

.auth-captcha.is-verified {
  border-color: rgba(80, 210, 138, 0.62);
}

.auth-captcha.is-verified .auth-captcha-piece {
  border-color: rgba(80, 210, 138, 0.82);
  background-image:
    linear-gradient(135deg, rgba(80, 210, 138, 0.34), rgba(3, 7, 12, 0.08)),
    var(--auth-captcha-image);
  box-shadow: 0 0 22px rgba(80, 210, 138, 0.3);
}

.auth-captcha.is-verified .auth-captcha-track {
  color: #85e0ad;
}

.auth-captcha.is-failed {
  border-color: rgba(255, 105, 105, 0.62);
}

.auth-captcha.is-failed .auth-captcha-track {
  color: #ff9d9d;
}

.form-hint.is-error {
  color: #ff8f8f;
}

.auth-divider {
  display: grid;
  grid-template-columns: 1fr auto 1fr;
  gap: 10px;
  align-items: center;
  color: var(--muted);
  font-size: 12px;
}

.auth-divider::before,
.auth-divider::after {
  content: "";
  height: 1px;
  background: var(--line);
}

.auth-provider-row {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 10px;
}

.mobile-community-copy,
.pc-post-copy,
.pc-profile-post-copy {
  min-width: 0;
  overflow: hidden;
}

body.is-mobile .mobile-community-card .mobile-community-copy p,
body.is-mobile .mobile-featured-list .mobile-community-card .mobile-community-copy p,
body.is-mobile .mobile-community-list .mobile-community-card .mobile-community-copy p,
.mobile-community-card .mobile-community-copy p,
.pc-post-card .pc-post-copy p,
.pc-profile-post-card .pc-profile-post-copy p {
  display: -webkit-box !important;
  overflow: hidden;
  max-height: calc(1.45em * 2);
  -webkit-box-orient: vertical;
  -webkit-line-clamp: 2;
  text-overflow: ellipsis;
  white-space: normal;
  word-break: break-word;
  line-height: 1.45;
}

.video-studio-modal {
  align-items: stretch;
  padding: 24px;
}

.video-studio-card {
  width: min(1180px, 100%);
  max-height: calc(100vh - 48px);
  margin: auto;
  overflow: auto;
  background:
    radial-gradient(circle at 8% 5%, rgba(76, 185, 255, 0.12), transparent 30%),
    #0b1118;
}

.video-studio-card > .modal-header {
  align-items: flex-start;
}

.video-studio-card > .modal-header p,
.video-history-head p {
  margin: 6px 0 0;
  color: var(--muted);
  font-size: 13px;
}

.video-studio-layout {
  display: grid;
  grid-template-columns: minmax(0, 1fr) minmax(360px, 0.82fr);
  gap: 28px;
}

.video-studio-form,
.video-project-history {
  display: grid;
  align-content: start;
  gap: 16px;
}

.video-current-mineral {
  display: grid;
  gap: 5px;
  padding: 14px 16px;
  border: 1px solid rgba(104, 196, 255, 0.28);
  border-radius: 12px;
  background: rgba(104, 196, 255, 0.07);
}

.video-current-mineral span,
.video-current-mineral small {
  color: var(--muted);
  font-size: 12px;
}

.video-current-mineral strong {
  color: #eef8ff;
  font-size: 17px;
}

.video-studio-modal.is-history-only .video-studio-form {
  display: none;
}

.video-studio-modal.is-history-only .video-studio-layout {
  grid-template-columns: minmax(0, 760px);
  justify-content: center;
}

.video-template-preview {
  position: relative;
  min-height: 210px;
  display: grid;
  place-items: center;
  align-content: center;
  gap: 10px;
  overflow: hidden;
  border: 1px solid rgba(104, 196, 255, 0.28);
  border-radius: 16px;
  background:
    linear-gradient(155deg, rgba(104, 196, 255, 0.2), transparent 45%),
    radial-gradient(circle at 50% 120%, rgba(104, 196, 255, 0.3), transparent 55%),
    #070d14;
  color: #eef8ff;
  text-align: center;
}

.video-template-preview::before,
.video-template-preview::after {
  content: "";
  position: absolute;
  width: 240px;
  height: 240px;
  border: 1px solid rgba(104, 196, 255, 0.14);
  border-radius: 50%;
}

.video-template-preview::after {
  width: 360px;
  height: 360px;
}

.video-template-preview svg {
  width: 42px;
  height: 42px;
  color: #68c4ff;
  fill: rgba(104, 196, 255, 0.18);
}

.video-template-preview strong {
  z-index: 1;
  font-size: 22px;
}

.video-template-preview small {
  z-index: 1;
  color: #a9bfd0;
}

.video-template-badge {
  position: absolute;
  top: 14px;
  right: 14px;
  padding: 5px 9px;
  border: 1px solid rgba(104, 196, 255, 0.34);
  border-radius: 999px;
  background: rgba(5, 12, 19, 0.74);
  color: #9bd7ff;
  font-size: 11px;
}

.video-template-fieldset {
  min-width: 0;
  margin: 0;
  padding: 0;
  border: 0;
}

.video-template-fieldset legend {
  margin-bottom: 9px;
  color: var(--muted);
  font-size: 13px;
}

.video-template-options {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: 9px;
}

.video-template-option {
  position: relative;
  cursor: pointer;
}

.video-template-option input {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  margin: 0;
  opacity: 0;
  cursor: pointer;
}

.video-template-option > span {
  min-height: 116px;
  display: grid;
  align-content: start;
  gap: 7px;
  padding: 13px;
  border: 1px solid var(--line);
  border-radius: 11px;
  background: rgba(255, 255, 255, 0.025);
  transition: border-color 160ms ease, background 160ms ease, transform 160ms ease;
}

.video-template-option strong {
  color: #edf8ff;
  font-size: 14px;
}

.video-template-option small {
  color: var(--muted);
  font-size: 11px;
  line-height: 1.55;
}

.video-template-option input:checked + span {
  border-color: rgba(104, 196, 255, 0.78);
  background: rgba(104, 196, 255, 0.11);
  box-shadow: inset 0 0 0 1px rgba(104, 196, 255, 0.12);
  transform: translateY(-1px);
}

.video-image-preview {
  display: grid;
  grid-template-columns: repeat(6, minmax(0, 1fr));
  gap: 8px;
}

.video-image-preview img {
  width: 100%;
  aspect-ratio: 3 / 4;
  object-fit: cover;
  border: 1px solid var(--line);
  border-radius: 8px;
  background: #071018;
}

.video-model-actions,
.video-history-head,
.video-project-head,
.video-project-actions {
  display: flex;
  align-items: center;
  gap: 12px;
}

.video-model-actions {
  align-items: flex-start;
}

.video-model-actions > span {
  flex: 1;
  color: var(--muted);
  font-size: 12px;
  line-height: 1.5;
}

.video-generate-button {
  min-height: 48px;
  display: inline-flex;
  justify-content: center;
  align-items: center;
  gap: 9px;
}

.video-history-head,
.video-project-head {
  justify-content: space-between;
}

.video-history-head h3,
.video-project-card h4 {
  margin: 0;
}

.video-project-list {
  display: grid;
  gap: 12px;
}

.video-project-card {
  display: grid;
  gap: 11px;
  padding: 14px;
  border: 1px solid var(--line);
  border-radius: 12px;
  background: rgba(255, 255, 255, 0.025);
}

.video-project-card p {
  margin: 0;
  color: var(--muted);
  font-size: 12px;
}

.video-project-card .video-template-summary {
  margin-top: 4px;
  color: #83cfff;
}

.video-output-preview {
  width: min(100%, 280px);
  max-height: 420px;
  justify-self: center;
  border: 1px solid rgba(104, 196, 255, 0.22);
  border-radius: 12px;
  background: #020508;
  aspect-ratio: 9 / 16;
  object-fit: contain;
}

.video-status-badge {
  padding: 4px 8px;
  border-radius: 999px;
  background: rgba(255, 255, 255, 0.08);
  color: #c8d4dc;
  font-size: 11px;
}

.video-status-badge.is-completed {
  background: rgba(62, 207, 133, 0.14);
  color: #79e6a9;
}

.video-status-badge.is-failed {
  background: rgba(255, 105, 105, 0.14);
  color: #ff9d9d;
}

.video-progress {
  height: 7px;
  overflow: hidden;
  border-radius: 999px;
  background: rgba(255, 255, 255, 0.08);
}

.video-progress > span {
  display: block;
  height: 100%;
  border-radius: inherit;
  background: linear-gradient(90deg, #398dff, #70d9ff);
  transition: width 240ms ease;
}

.video-project-actions {
  justify-content: flex-end;
}

.video-download-link {
  display: inline-flex;
  align-items: center;
  gap: 7px;
  padding: 8px 12px;
  border-radius: 7px;
  background: #e9f7ff;
  color: #071018;
  font-size: 13px;
  font-weight: 700;
  text-decoration: none;
}

.video-empty {
  padding: 32px 18px;
  border: 1px dashed var(--line);
  border-radius: 12px;
  color: var(--muted);
  text-align: center;
}

body.is-mobile .video-studio-modal {
  padding: 0;
}

body.is-mobile .video-studio-card {
  width: 100%;
  max-height: 100vh;
  min-height: 100vh;
  border: 0;
  border-radius: 0;
}

body.is-mobile .video-studio-layout {
  grid-template-columns: 1fr;
}

body.is-mobile .video-image-preview {
  grid-template-columns: repeat(4, minmax(0, 1fr));
}

body.is-mobile .video-template-options {
  grid-template-columns: 1fr;
}

body.is-mobile .video-template-option > span {
  min-height: auto;
}

body.is-mobile .video-model-actions {
  flex-direction: column;
}
