Skip to content

feat(gui): add MobileGui skeleton + opt-in dispatcher (Phase 2-A of #572)#581

Merged
takaokouji merged 1 commit into
developfrom
fix/issue-572-phase-2a-mobile-gui-skeleton
Apr 29, 2026
Merged

feat(gui): add MobileGui skeleton + opt-in dispatcher (Phase 2-A of #572)#581
takaokouji merged 1 commit into
developfrom
fix/issue-572-phase-2a-mobile-gui-skeleton

Conversation

@takaokouji
Copy link
Copy Markdown

Summary

iPhone 等の狭幅画面向けレスポンシブ対応 (issue #572 Phase 2) の基礎となる MobileGui スケルトン + オプトイン切替 を導入。

採用戦略

B 案 (MobileGui 並走) + URL フラグでオプトイン (Phase 2 が未完成のまま develop にマージしても影響ゼロ):

  • upstream の <GUI> には手を入れず、別コンポーネント <MobileGui> を並走させる
  • Phase 2-A (本 PR) ではスケルトン: <MobileGui> の中身は <GUI> 素通し
  • 後続 PR で <MobileGui> 内のレイアウトを徐々に置き換える:
    • PR-2B: ボトムタブ × 5 (ブロック / Ruby / スプライト / コスチューム / 音)
    • PR-2C: ステージ全画面プレビュー (▶ 起動 + 自動実行、⏹ 停止 + 戻る)
    • PR-2D: ブロックパレットドロワー
    • PR-2E: ハンバーガーメニュー

URL フラグ

URL viewport レンダリング
?mobile_gui 未指定 (デフォルト) 任意 <GUI> (既存挙動、変更なし)
?mobile_gui=1 指定 < 768px <MobileGui> (現状は <GUI> 素通し)
?mobile_gui=1 指定 ≥ 768px <GUI> (PC レイアウト維持)

変更ファイル

新規 (Smalruby 固有)

  • src/lib/use-is-narrow-screen.jsmatchMedia('(max-width: 767px)') を購読する共有 hook (旧 narrow-screen-warning.jsx から抽出)
  • src/lib/responsive-gui.jsx — 切替ロジック。フラグ + viewport を見て <GUI><MobileGui> を返す
  • src/components/mobile-gui/{mobile-gui.jsx,index.js} — スケルトンコンポーネント
  • test/unit/lib/use-is-narrow-screen.test.js — hook 3 ケース
  • test/unit/lib/responsive-gui.test.jsx — 切替 5 ケース (フラグ × viewport の全組合せ)

変更

  • src/lib/url-params.jsmobile_gui パラメーターの解釈を追加 (既存 Smalruby 専用ファイル)
  • src/components/narrow-screen-warning/narrow-screen-warning.jsxuseIsNarrowScreen を共有 hook に置き換え
  • src/playground/render-gui.jsxupstream ファイル。Smalruby マーカーで囲んだ 4 行追加 (import 1 行 + ResponsiveGui への差し替え + コメント 2 行)。インデント変更・条件分岐追加なし

メタファイル

  • .prettierignore / smalruby-prettier-files.md (scratch-gui) — 新規ファイルをホワイトリストに追加
  • smalruby-markers.mdrender-gui.jsx の MobileGui dispatcher マーカーを追加

検証

ユニットテスト (jest, 13 件)

  • useIsNarrowScreen: 3 ケース (狭幅 true / 広幅 false / viewport 変化で切替)
  • ResponsiveGui: 5 ケース (フラグ × viewport の全組合せ + props 透過)
  • NarrowScreenWarning (既存、共有 hook 利用): 5 ケース (リグレッションなし)

Playwright (Chromium、390×844 設定)

URL 結果
?no_beforeunload=1 GUI 描画 + Phase 1 バナー / overflow-y: clip 維持 ✓
?no_beforeunload=1&mobile_gui=1 MobileGui (中身は GUI) 描画 + Phase 1 機能維持 ✓

Test plan

  • ユニットテスト 13/13 緑
  • ESLint / Prettier クリーン
  • Playwright で 2 つの URL で動作確認
  • フラグ未指定時に既存挙動 (デフォルト GUI) が壊れていないこと
  • CI green (push 後)

Related

🤖 Generated with Claude Code

…se 2-A)

iPhone 等の狭幅画面向けレスポンシブ対応 (issue #572 Phase 2) の基礎を実装。

採用戦略 = B 案 (MobileGui 並走):
- upstream の <GUI> には手を入れず、別コンポーネント <MobileGui> を並走させる
- Phase 2-A (本 PR) ではスケルトン: <MobileGui> の中身は <GUI> 素通し
- 後続 PR (2B〜2E) でボトムタブ・ステージ全画面・ドロワー・ハンバーガーを
  順次 <MobileGui> 内に実装し、徐々に <GUI> から切り離す

未完成中の develop マージを安全にするため、URL パラメーター
`mobile_gui=1` での **オプトイン** を必須にする:

- フラグ未指定 (デフォルト): すべての viewport で <GUI> が動く (既存挙動)
- フラグ指定 + 狭幅 (<768px): <MobileGui> が動く
- フラグ指定 + 広幅 / フラグ未指定: <GUI> が動く

新規ファイル:
- src/lib/use-is-narrow-screen.js — matchMedia 共有 hook (旧 narrow-screen-warning から抽出)
- src/lib/responsive-gui.jsx — 切替ロジックを担うラッパー
- src/components/mobile-gui/{mobile-gui.jsx,index.js} — スケルトン
- test/unit/lib/use-is-narrow-screen.test.js — hook 3 ケース
- test/unit/lib/responsive-gui.test.jsx — 切替 5 ケース (フラグ × viewport の全組合せ)

upstream への影響:
- src/playground/render-gui.jsx に Smalruby マーカー付きで 4 行の追加
  (import 1 行 + ResponsiveGui へ差し替え 1 行 + コメント 2 行)
- src/lib/url-params.js に mobile_gui 解釈を追加 (既存 Smalruby 専用ファイル)

検証:
- ユニットテスト 13 ケース (3 ファイル) すべて pass
- ESLint / Prettier クリーン
- Playwright (390x844) で確認:
  - URL に mobile_gui=1 無し → 既存 GUI 描画 ✓
  - URL に mobile_gui=1 有り → MobileGui (中身は GUI) 描画 ✓
  - Phase 1 (バナー、min-width、overflow-y: clip) も維持されている

Refs #572

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@github-actions
Copy link
Copy Markdown

@takaokouji takaokouji merged commit b274dc6 into develop Apr 29, 2026
9 checks passed
@takaokouji takaokouji deleted the fix/issue-572-phase-2a-mobile-gui-skeleton branch April 29, 2026 13:30
github-actions Bot pushed a commit that referenced this pull request Apr 29, 2026
…-phase-2a-mobile-gui-skeleton

feat(gui): add MobileGui skeleton + opt-in dispatcher (Phase 2-A of #572)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant