diff --git a/README.md b/README.md index b066ce8..b88882d 100644 --- a/README.md +++ b/README.md @@ -46,6 +46,8 @@ npm run test:browser 维护模式回归直接测试发布页面,并对照退役前版本核对主页文字及布局。原认证、媒体生命周期回归仅在测试服务器的响应中关闭维护开关,以保留未启用代码的验证;线上没有查询参数或浏览器存储开关可恢复 AI 服务。 +游戏专项覆盖异常存档的保留与恢复、受限存储、旧 Service Worker 更新,以及 320px/390px/短横屏弹窗的触摸滚动、关闭与焦点恢复。Frontier 回归检查快速暂停恢复仅有一条动画循环、后台停帧和实际触摸移动;游戏画质保持不变。大厅仍保留竖屏游玩限制,已打开的弹窗可在横屏操作。 + 公开仓库只包含前端和测试,不包含生产凭据、用户数据或 Worker 私有源码。后端在本机 `.local-secrets/ray-backend` 独立版本管理,包含迁移、恢复验证和受保护发布工具;该目录不能提交到本仓库或暴露给 HTTP 服务。 - [云存档协议与迁移](docs/game-save-cloud-api.md) diff --git a/arcade/css/style.css b/arcade/css/style.css index 8d5c842..6a280ab 100644 --- a/arcade/css/style.css +++ b/arcade/css/style.css @@ -458,21 +458,30 @@ p { backdrop-filter: blur(8px); } +html.arcade-modal-open, +body.arcade-modal-open { + overflow: hidden; + touch-action: pan-y; +} + .modal-backdrop { position: fixed; inset: 0; z-index: 50; display: grid; place-items: center; - padding: calc(env(safe-area-inset-top) + 16px) 18px calc(env(safe-area-inset-bottom) + 16px); + padding: calc(env(safe-area-inset-top) + 16px) calc(env(safe-area-inset-right) + 18px) calc(env(safe-area-inset-bottom) + 16px) calc(env(safe-area-inset-left) + 18px); background: rgba(1, 3, 17, .66); backdrop-filter: blur(10px); - touch-action: none; + touch-action: pan-y; + overscroll-behavior: contain; } .modal-card { width: min(100%, 420px); - max-height: min(78svh, 78dvh); + min-height: 0; + max-height: calc(100vh - env(safe-area-inset-top) - env(safe-area-inset-bottom) - 32px); + max-height: calc(100dvh - env(safe-area-inset-top) - env(safe-area-inset-bottom) - 32px); overflow: hidden; display: flex; flex-direction: column; @@ -486,15 +495,39 @@ p { } .modal-head { + display: flex; + align-items: center; + gap: 8px; + flex-shrink: 0; padding: 20px 18px 0; } .modal-title { + flex: 1; + min-width: 0; + overflow-wrap: anywhere; font-size: 22px; - letter-spacing: -.03em; + letter-spacing: 0; +} + +.modal-close { + flex: 0 0 44px; + width: 44px; + min-height: 44px; + padding: 0; + border: 1px solid rgba(103, 232, 249, .24); + border-radius: 12px; + background: rgba(255, 255, 255, .06); + color: inherit; + font: inherit; + font-size: 26px; + cursor: pointer; } .modal-body { + min-height: 0; + overscroll-behavior: contain; + overflow-wrap: anywhere; overflow-y: auto; -webkit-overflow-scrolling: touch; touch-action: pan-y; @@ -510,12 +543,23 @@ p { .modal-actions { display: flex; + flex-shrink: 0; + flex-wrap: wrap; gap: 10px; padding: 0 18px 18px; } .modal-actions button { - flex: 1; + flex: 1 1 88px; + min-height: 44px; + min-width: 0; + white-space: normal; + overflow-wrap: anywhere; +} + +@media (max-height: 420px) { + .modal-head { padding-top: 8px; } + .modal-actions { padding-bottom: 8px; } } .toast { @@ -1021,6 +1065,10 @@ p { } } +body.arcade-modal-open .orientation-lock { + display: none; +} + @media (max-width: 374px) { .game-topbar { grid-template-columns: auto 1fr auto auto; diff --git a/arcade/frontier/index.html b/arcade/frontier/index.html index b64a515..4cbc21f 100644 --- a/arcade/frontier/index.html +++ b/arcade/frontier/index.html @@ -100,10 +100,10 @@