Skip to content

feat(gui): add mobile sprite management panel (Phase 2-F)#587

Merged
takaokouji merged 2 commits into
developfrom
fix/issue-572-phase-2f-sprite-panel
Apr 29, 2026
Merged

feat(gui): add mobile sprite management panel (Phase 2-F)#587
takaokouji merged 2 commits into
developfrom
fix/issue-572-phase-2f-sprite-panel

Conversation

@takaokouji
Copy link
Copy Markdown

Summary

issue #572 Phase 2-F: モバイル用スプライト管理パネルを追加します。元の Issue 報告 (smalruby/smalruby3-develop#80 "I can't add sprites nor costumes on safari on iOS") の核心症状の解消です。

bottom-tabs の「スプライト」タブをタップすると、上部バーと下部タブの間に full-width のオーバーレイが立ち上がり、upstream の <TargetPane> がそのまま使えるレイアウトでスプライト追加 / 削除 / 名前変更 / ステージ背景管理が可能になります。

実装

  • MobileSpritePanel (新規): スプライトタブが active のときだけ表示する portal オーバーレイ。upstream <TargetPane> を再利用して全機能 (Choose / Paint / Surprise / Upload + 削除 + 複製 + 名前変更 + ステージ背景) を流用。
  • MobileGui: spriteTabActive を useState で保持し、子コンポーネントに共有。
  • MobileBottomTabs: スプライトタブの active 状態を親管理に変更 (controlled component 化)。
  • MobileSpritePanel CSS:
    • upstream <TargetPane> の flex-direction を column に上書き (270px 右ペイン前提の row レイアウトを mobile 全幅に流すと stage-selector が右に張り付いて違和感があるため)
    • ReactModal__Overlay の z-index を 9999 に引き上げ (upstream の 510 だとモバイル UI 9000+ に隠れて操作不能)

upstream への影響 (Smalruby マーカー)

src/components/target-pane/target-pane.jsxhideSpriteLibrary prop を追加。

  • 同じツリーで <TargetPane> を 2 つ描画すると <SpriteLibrary> モーダルが 2 重に portal されるため、mobile copy 側だけ抑止
  • 上流右ペインの <TargetPane> がモーダル描画を担当 (single instance)

.claude/rules/scratch-gui/smalruby-markers.md 一覧に追加済み。

Test plan

  • Unit tests: npm exec jest test/unit/components/mobile-{sprite-panel,bottom-tabs}.test.jsx → 12 件 pass
  • Lint + format check pass
  • dev server (?mobile_gui=1 + 390x844 viewport) で:
    • スプライトタブをタップ → パネルが正しい位置に表示される (top-bar と bottom-tabs の間)
    • 「スプライトを選ぶ」(+ FAB) → SpriteLibrary モーダルが全画面で開く (二重表示なし)
    • スプライトを選択 → モーダルが閉じてリストに追加される
  • iOS Safari 実機で操作性確認

残タスク

PR-2F でブロッカー #1 (スプライト管理) は解消しますが、残タスクとして直前の整理に挙げた:

  1. スプライト管理 (← issue bug: iOS Safari など狭幅画面でスプライト/コスチューム追加が画面外になり操作不能 (responsive 対応) #572 の元の症状)
  2. コードタブの編集レイアウト (通常画面)
  3. ルビータブ (Monaco editor) のタッチ操作確認
  4. コスチューム / 音タブのモバイル最適化
  5. 拡張機能の追加メニュー

… が残っています。次は #2 を予定。

🤖 Generated with Claude Code

issue #572 Phase 2-F: モバイル用スプライト管理パネルを追加。元の Issue
報告 (smalruby/smalruby3-develop#80, "I can't add sprites nor costumes
on safari on iOS") の解消。

実装:
- MobileSpritePanel (新規): bottom-tabs の「スプライト」タブが active の
  ときだけ表示する overlay。upstream の <TargetPane> を全幅で再描画して、
  スプライト追加 (Choose / Paint / Surprise / Upload) / 削除 / 名前変更 /
  位置変更、ステージ背景管理を全機能再利用する。
- MobileGui: spriteTabActive を useState で保持し、MobileBottomTabs と
  MobileSpritePanel に共有。
- MobileBottomTabs: スプライトタブの状態を親管理に変更 (controlled
  component に)。

upstream への影響 (Smalruby マーカー):
- target-pane.jsx に hideSpriteLibrary prop を追加。MobileSpritePanel が
  独立ツリーで TargetPane を再描画するため、SpriteLibrary モーダルが
  二重表示されないよう mobile copy 側だけ抑止する。

CSS:
- mobile-sprite-panel.css: TargetPane の flex-direction を column に上書き
  (元々右ペイン 270px 幅前提の row レイアウトを mobile 全幅に流し込むと
  stage-selector が右に張り付くので、スプライト一覧 → ステージ背景の縦並び
  に変更)
- ReactModal__Overlay の z-index を 9999 に上げる。upstream のデフォルト 510
  だと Smalruby のモバイル UI (z-index 9000+) で隠れて操作不能になるため。

Tests:
- mobile-sprite-panel.test.jsx (新規, 2 件): active=false で何も描画されず、
  active=true で TargetPane stub と panel testid が描画される。
- mobile-bottom-tabs.test.jsx: spriteActive を controlled prop ベースに
  書き直し (8 件)。
@github-actions
Copy link
Copy Markdown

… sprite panel

stageSize="small" だと <SpriteInfo> が name/x/y のみに省略されるため、
モバイルでも全項目を編集できるよう "middle" に変更する。viewport が
390px 以上ある現状では full set がきちんと収まる。
@takaokouji takaokouji merged commit dc92404 into develop Apr 29, 2026
9 checks passed
@takaokouji takaokouji deleted the fix/issue-572-phase-2f-sprite-panel branch April 29, 2026 23:07
github-actions Bot pushed a commit that referenced this pull request Apr 29, 2026
…-phase-2f-sprite-panel

feat(gui): add mobile sprite management panel (Phase 2-F)
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