← MomijiUI ドキュメント

MomijiUI 郚品化ビルド時展開蚭蚈 — E2

Generated by Claude Opus 4.8 — 2026幎6月2日

05-uikit-cross-media-next-steps の E2頻出構成の郚品化 を、A案ビルド時展開で実装するための蚭蚈。メメントモリ颚モックの䜜り蟌みで顕圚化した「ヘッダヌ/タブバヌ/ステヌタス行/カヌドが画面間でコピペ耇補」を、レンダラnative C++ / web JSを䞀切倉えずに解消する。

1. 目的・非目的

目的

  • 頻出構成を再利甚郚品componentずしお1箇所で定矩し、画面JSONから参照で展開する。
  • nativeMomiji.cpp:nodeFromJsonず webweb-momijiの䞡パヌサを無改修に保぀。
  • momiji-validate を展開埌ツリヌに掛けお埓来どおり怜蚌できる。

非目的

  • ランタむム動的UI実行䞭に郚品を差し替える等は察象倖。{var} 補間gamehost.jsは既存のたた。
  • スキヌマmomiji-schema.jsonの widget enum 拡匵はしない。郚品既存12 widget の構成物。

2. 蚭蚈原則展開はビルド時、レンダラは玠のJSONだけ食う

画面JSONを読む経路が2぀あるMomiji.cpp:47 の C++ 再垰パヌサ / web-momiji/src/momiji.js の JS。ここに参照解決を入れるず二重実装drift05 のリスク欄・F2 の懞念になる。

→ 参照解決を前凊理ステップに寄せ、玠の UiNode ツリヌぞ平坊化しおから配る。 䞡レンダラは平坊化枈みJSONを今たでどおり読むだけ。scaffold-game.mjsNode・䟝存れロの兄匟ツヌルずしお実装でき、CI/AI からも呌べる。

components/*.json ─┐
                   ├─[expand-components.mjs]→ 平坊な screens/*.json ─┬→ native nodeFromJson無改修
画面JSON(use参照) ─┘                          │                      ├→ web momiji.js無改修
                                              └→ momiji-validate無改修・展開埌に怜蚌

3. デヌタ圢匏

3.1 郚品定矩 components/<name>.json

郚品はパラメヌタpropsずスロット子ツリヌ差し蟌み口を持぀1぀の UiNode サブツリヌ。

{
  "name": "stat-row",
  "props": { "label": "HP", "value": 0.9, "color": "#b1894e" },
  "node": {
    "type": "HorizontalLayout", "gap": 8,
    "children": [
      { "type": "Label", "text": "{{label}}", "w": 60 },
      { "type": "Slider", "value": "{{value}}", "color": "{{color}}", "flex": 1 }
    ]
  }
}
  • props: 既定倀぀きパラメヌタ。型は string / number / color(string)。
  • node: 郚品本䜓。文字列倀の䞭の {{propName}} を props で眮換。
  • スロット子差し蟌みは本䜓に { "slot": "body" } プレヌスホルダを眮く。

3.2 画面JSONからの参照

参照ノヌドは type を持たず use を持぀埌述のずおり展開前JSONは momiji-schema 非適合で構わない — 怜蚌は展開埌。

{ "type": "VerticalLayout", "children": [
  { "use": "header", "props": { "title": "キャラクタヌ" } },
  { "use": "stat-row", "props": { "label": "ATK", "value": 0.78, "color": "#5aa05a" } },
  { "use": "card", "props": { "name": "リ゚ラ" }, "slots": {
      "body": [ { "type": "Label", "text": "Lv60" } ] } }
] }
  • props: 郚品の既定倀を䞊曞き指定キヌのみ。
  • slots: スロット名 → 差し蟌む子ノヌド配列。

3.3 デリミタ芏玄最重芁

蚘法解決タむミング解決者䟋
{{prop}}ビルド時展開噚expand-components.mjs{{title}}
{var}ランタむムgamehost.js / native{coins}

二重ブレヌスず単䞀ブレヌスで局を分離。郚品の䞭にランタむム {var} を残したい堎合䟋通貚ピル郚品が画面ごずに違う倉数を芋るは、props で倉数名を枡し {{ }} → {coins} のような単䞀ブレヌス文字列を生成できる。展開噚は {{ }} のみ凊理し、{ } は玠通しする。

3.4 反埩ず遞択repeat / selection— 蚈算を䌎う構成

䞋郚ナビ党画面に同型8セルやカヌドグリッド同型カヌド×Nは「同じ構造の反埩遞択セルの匷調」で、文字列眮換だけでは畳めない。これを算術なしで衚珟するため、子配列に反埩ディレクティブを眮ける。

{ "repeat": "tabs", "as": "t", "indexAs": "i", "selected": "active",
  "node": { "type": "VerticalLayout", "action": "{{t.action}}", "children": [
    { "$whenSelected": { "type": "Image", "h": 4, "color": "{{navOn}}" } },
    { "type": "Label", "text": "{{t.name}}",
      "textColor": { "$selected": "{{navOn}}", "$else": "{{navOff}}" } }
  ] } }
  • repeat: 配列 prop 名"tabs" / "{{tabs}}"。芁玠ごずに node を1぀生成し芪の子ずしお䞊べる。
  • as / indexAs: 各芁玠・添字のバむンド名。テンプレ内で {{t.field}}ドット参照・{{i}}。
  • selected: 遞択添字を持぀ prop 名。反埩䞭、その添字の芁玠だけ「遞択」文脈になる。
  • {"$selected":A,"$else":B}: 倀の遞択切替遞択セルは A、他は B。
  • {"$whenSelected": node}: 遞択セルにのみ挿入されるノヌドむンゞケヌタ等。

むンゞケヌタは active*160 の絶察座暙でなく遞択セル先頭のアクセントバヌで等䟡衚珟するため、算術ロゞックは䞍芁。レンダラは無改修のたた。

3.5 算術匏 {{ expr }} — 重なり型カヌドの郚品化

゜シャゲ/攟眮ゲヌムの䞭心は、枠・ポヌトレヌト・バッゞ・星・ゲヌゞを重ね合わせた絶察座暙カヌド。レンダラはプレヌンコンテナ(Image/Panel)の子を芪原点でオフセットしないMomiji.cpp:369/378・web 同様ため、自己完結カヌドの内郚 offset を盞察化できない。これを算術なしでは畳めないので、{{ }} の䞭身を匏ずしお評䟡できるようにした。

{ "type": "Image", "x": "{{cx + 4}}", "y": "{{cy + ch - 56}}", "w": "{{cw - 8}}" }
  • 䞭身が単䞀識別子({{cx}} / {{c.frame}})なら props の玠の型数倀/色文字列/配列をそのたた返す埓来どおり。
  • 挔算子(+ - * / %)・括匧を含めば数倀匏ずしお評䟡再垰䞋降・eval 䞍䜿甚の小型評䟡噚。識別子は数倀に解決される必芁があり、未解決・非数倀は ERROR。
  • デヌタ偎がカヌドの cx/cy を持ち、内郚 offset は匏で衚珟 → 重なり型カヌドも repeat で量産でき、芋た目は䞍倉。条件付き芁玠(NEW バッゞ)は「非該圓時は透明色+空文字で垞時同梱」で分岐を回避。

4. 展開アルゎリズム

expandNode(node, registry):
  if node.use:
    comp = registry[node.use]                 # 無ければ ERROR で停止
    props = { ...comp.props, ...node.props }   # 既定倀に䞊曞きをマヌゞ
    body  = deepClone(comp.node)
    substituteProps(body, props)               # 文字列内 {{key}} を眮換数倀prop→数倀化
    fillSlots(body, node.slots ?? {})          # {slot:name} を子配列で眮換、未指定スロットは陀去
    return expandChildren(body, registry)      # 郚品が郚品を䜿う堎合に再垰展開
  else:
    node.children = node.children.map(expandNode)   # 通垞ノヌドは子だけ展開
    return node
  • ネスト: 郚品が別郚品を use しおよいexpandChildren で再垰。
  • 再垰怜出: 展開スタックに同名が再出珟したら埪環ずしお ERROR無限展開防止。
  • 数倀prop: "value": "{{value}}" で倀党䜓が単䞀の {{key}} のずき、props が number なら文字列でなく数倀ずしお埋めるSlider.value は number 必須。
  • 未解決 {{key}}: props に無いキヌが残ったら ERRORタむポ怜出。

5. ツヌル構成

packages/native-engine/tools/
  scaffold-game.mjs        # 既存
  expand-components.mjs    # 新芏: <game>/ を読み、components 参照を平坊化しお出力
  • 入力: <game>/screens/*.json + <game>/components/*.json
  • 出力: 既定で <game>/.expanded/screens/*.json元を砎壊しない。--in-place で䞊曞きも可。
  • 䟝存れロ暙準 Node のみ。scaffold-game.mjs の copyTree/parseArgs を螏襲。
  • CLI:
    node tools/expand-components.mjs --game assets/games/mementomori-mock
    node tools/expand-components.mjs --game <dir> --out /tmp/expanded
    

パむプラむン䞊の䜍眮

[author/AI が screens + components を曞く]
   → expand-components.mjs                # 平坊化
   → momiji-validate <expanded>/screens/*  # 怜蚌既存・無改修
   → kaedevn_game / web-momiji が <expanded> を読む

native のアセット配眮assets/games/<id>/screens/や web の fetchmain.jsは展開埌ディレクトリを指すよう配線するだけ。ビルド時に .expanded を実䜓の screens/ に眮く運甚でも可芁・配眮方針の決定 → §7。

6. テスト方針

局内容
展開噚ナニットprops 䞊曞き / 数倀prop / slot 差し蟌み / ネスト / 埪環怜出 / 未解決キヌ ERROR を Node test で網矅
怜蚌連携展開埌ツリヌが momiji-validate を通る既存 CLI を呌ぶ
䞍倉性回垰メメントモリ既存画面を「郚品化前の手曞きJSON」ず「郚品化→展開した結果」でバむト䞀臎 or ノヌド等䟡を照合。芋た目を倉えずにリファクタした保蚌
媒䜓䞀臎展開埌JSONで native collectedHits ず web 幟䜕を照合05 F2 ず同じ仕組み・展開埌に掛ける

7. 方針決定2026-06-02 確定

前提運甚方針: 宣蚀的UI(MomijiUI) は生成AIが参照画像を再珟しお画面JSONを䜜る。ブロック゚ディタはノベルゲヌム専甚で圓面機胜远加なく、宣蚀的UIを゚ディタで開くパスは無く、䜜らない。確認はプレむ画面の実描画kaedevn_game --capture 等で行う。

  1. 配眮方針 → 決定: 展開はパむプラむンの1ステップ。AIが use 入り画面を生成 → 展開噚で玠のツリヌぞ平坊化 → レンダラは展開埌を読み、プレむ画面で描画確認。゚ディタ経路が無いため .expanded/ 別眮きの凝った芏玄は䞍芁。珟状の build-mm-screens は in-process 展開生成時に平坊化しお screens/ に盎接曞くでこの方針に合臎。AI生成ゲヌムgame-produceでは生成埌に expand-components を1ステップ挟む。
  2. ゚ディタ schema 連携 → 決定: 䞍芁やらない。use ノヌドの゚ディタ察応・GET /api/editor-schema ぞの郚品掲茉はしない。宣蚀的UIの線集はAI生成で完結し、人手の゚ディタ線集察象にしない。
  3. 郚品の所圚 → 決定: 暪断共有 _components/_templates/ ず同階局。ゲヌム個別 <game>/components/ も展開噚はフォヌルバック察応枈みgame-local 優先。
  4. 未指定スロット → 決定: 陀去任意スロット扱い。実装・テスト枈み。

→ 4点ずも確定。残るは応甚カヌド系の郚品化・web-momiji 衚瀺確認・CI 配線のみ。

8. 段階導入

  1. expand-components.mjs + ナニットテスト郚品れロでも玠通しする no-op から。
  2. メメントモリの header / tab-bar を郚品化 → 党画面眮換 → 䞍倉性テストで芋た目䞍倉を保蚌。
  3. stat-row / card / currency-pill を順次郚品化。
  4. momiji-validate をパむプラむンの展開埌に固定CI 配線。
  5. 配眮方針§7-1を確定し native/web の参照先を展開埌ぞ。
  6. scaffold-game.mjs のテンプレを郚品参照ベヌスに曎新E3 ず合流。

芏暡感は 05 の E2「M」のたた。レンダラ無改修なので native/web 双方が同時に恩恵を受ける。

9. 既存 build-mm-screens.mjs ずの関係

メメントモリ画面は tools/build-mm-screens.mjsJS ビルダヌが生成しおおり、そこでは既に nav(active)䞋郚8タブ・topTabs(...)・カヌド factory ずしお JS 関数で郚品化されおいる。぀たり「耇補」は生成された出力JSONに出おいお、゜ヌス偎は JS で factoring 枈み。ただしこの方匏は native モック専甚・䞀回限りで、web-momiji / momiji-validate / game-produce(AI) のどれにも乗らない。

本蚭蚈の宣蚀的 components/*.json 展開噚は、その JS factory を移怍可胜・怜蚌可胜・AI/web 共有可胜にした版。topTabs() は top-tabs.json、nav() は bottom-nav.json に1察1で写せる。移行は build-mm-screens の各 factory を宣蚀的郚品ぞ眮き換える圢で段階実斜できる。

10. 実装状況2026-06-02

  • ✅ tools/expand-components.mjs 実装props {{ }} 眮換 / ドット参照 / 数倀prop / slot / repeat / selection$selected・$whenSelected / ネスト / 埪環怜出 / 未解決ERROR / {var} 玠通し / game-local + 共有 _components フォヌルバック / .expanded 出力。
  • ✅ tools/expand-components.test.mjs — ナニット20件すべお通過node --test。
  • ✅ 共有郚品: _components/top-tabs.jsontopTabs() 盞圓、_components/bottom-nav.jsonnav(active) 盞圓・8セル遞択ハむラむト。
  • ✅ E2E 実蚌:
    • top-tabs: 展開結果が実 characters.json の ToggleGroup ずノヌド䞀臎。
    • bottom-nav: {"use":"bottom-nav","props":{"active":N}} の1行 → 8セル遞択セルのアクセント/色分けを算術なしで生成。CLI 展開 → momiji-validate 通過。党9画面の玄11ノヌド耇補を1参照に集玄可胜。
  • ✅ build-mm-screens.mjs を郚品参照ぞ移行: nav()→{use:bottom-nav}、topTabs()→{use:top-tabs, slots}。write() が曞き出し時に expandScreen で平坊化するので生成 screens に use は残らないnative/web 無改修。党9画面 regenerate → momiji-validate 通過、use 残存れロ。
    • 芖芚怜蚌: 旧むンラむン nav ず 郚品 bottom-nav を kaedevn_game --capture で実描画しお等䟡確認暗色バヌ/8セル/遞択セルの金アクセント・金文字が䞀臎。characters(top-tabs+nav)・quest(nav active=3) の実画面も正しく描画。
    • 構造は倉化nav が flat 3兄匟 → Image>HorizontalLayout の入れ子、むンゞケヌタは遞択セル先頭アクセントに移動だが衚瀺は䞍倉。
  • ✅ §7 方針4点を確定゚ディタ連携=䞍芁、配眮=パむプラむン1ステップ展開、郚品所圚=共有 _components/、未指定slot=陀去。前提: 宣蚀的UIは生成AIが画像を再珟しお䜜り、確認はプレむ画面の実描画。
  • ✅ web-momiji クロスメディア確認: 静的配信Playwright で web-momiji(Canvas2D) に同䞀 screens を描画。characters(top-tabsnav active=1) ず quest(nav active=3) が native(kaedevn_game --capture) ず同䞀衚瀺。郚品(top-tabs/bottom-nav)・selection($selected/$whenSelected) が web でも正しく動䜜同じ画面JSONが native/web で䞀臎。
  • ✅ 算術匏 {{ expr }}§3.5を展開噚に远加小型評䟡噚・eval 䞍䜿甚・テスト蚈30件通過。今埌゜シャゲ/攟眮ゲヌムの重なり型カヌドを郚品化するための土台ずしお A 案展開噚に算術を採甚。
  • ✅ 重なり型カヌドの郚品化: 共有郚品 _components/char-card.json枠/ポヌトレヌト/属性バッゞ/星/Lvバヌ/NEW を算術 offset で内郚配眮。build-mm-screens の charCard() を use 参照ぞ移行。characters å…š21枚を郚品化し、カヌド移行前(HEAD) ず移行埌で PNG バむト完党䞀臎cmp 確認芋た目䞍倉を厳密怜蚌。
  • ✅ パむプラむン組み蟌み: scaffold-game.mjs に展開ステップexpandScreensInPlaceを远加。テンプレが use/repeat/算術を含んでも scaffold 時に平坊化され、native/web はそのたた読める。
  • ✅ グリッド郚品 _components/card-grid.json: repeat + 算術列 i % cols / 行 (i - i % cols) / cols の敎数陀算で char-card をグリッド配眮。デヌタ配列を枡すだけでカヌド盀面を生成。
  • ✅ 新ゞャンルテンプレ _templates/gacha/: bottom-nav + card-grid + char-card のみで構成。scaffold-game --genre gacha で新芏ガチャゲヌムが共有郚品から1本立ち䞊がるこずを実蚌ヘッダヌ7列14枚グリッド10連ボタンナビ、momiji-validate 通過・描画確認。メメントモリ以倖の新芏ゲヌムでも本機構で量産可胜。
  • ✅ game-produce skill に郚品システムを明蚘: パむプラむン図に展開ステップ、共有郚品カタログtop-tabs/bottom-nav/char-card/card-grid、use/repeat/selection/算術の蚘法、scaffold 自動展開を远蚘。AI 生成経路が郚品を䜿う前提に。
  • ✅ 攟眮ゲヌテンプレ _templates/idle/: bottom-nav + 攟眮報酬パネル + ステヌゞ + ボタンで構成。scaffold --genre idle で攟眮RPGメむン画面が立ち䞊がり描画確認{gold}/{stage} 補間も動䜜。gacha ず合わせ ゜シャゲ/攟眮の2ゞャンルが郚品ベヌスで量産可胜。
  • ✅ CI 配線: tools/validate-screens.mjs実ゲヌムは screens を盎接、_templates は展開しおから momiji-validate。ci.yml の native-tests に怜蚌ステップ远加momiji-validate はそこで既にビルド枈み、pre-push にもバむナリがあれば走る圢で远加。䞍正画面で exit 1 を確認。
  • ✅ SSIM 回垰: tools/screen-regression.mjs — 画面を撮り盎しコミット枈みベヌスラむン PNG ず SSIM 比范ImageMagick compare・CPU・GPU䞍芁。閟倀 0.99 未満で exit 1、--update で曎新。無倉曎→党画面 1.0000、パネル色倉曎→0.9292 で怜知。蚭蚈 03 の回垰自動化の実装。
  • ⬜ 残任意・蚭蚈刀断なし: 実デヌタ実画像でのカヌド/立ち絵差し蟌みsprite/fit:cover は実装枈、玠材を入れるだけ、攟眮/別゜シャゲの本実装、game-produce のゞャンルテンプレ拡充。

bottom-nav の蚭蚈刀断採甚: 展開噚に repeat/selection を远加

nav(active) は「アクティブ色分けむンゞケヌタ䜍眮 active*160」ずいう蚈算を持ち、ToggleGroup は各セルを1行テキストでしか描かないnative Momiji.cpp:428 / web momiji.js:210 同䞀挙動ため2段セルを畳めない。遞択肢は (1) 展開噚に repeat/selection 远加、(2) nav を生成据え眮き、(3) TabBar りィゞェット新蚭レンダラ改修=Cゟヌン。(1) を採甚 — レンダラ無改修を保ち、nav ず同型反埩カヌドグリッド等の双方に効くため。


この文曞は Claude Opus 4.8 が生成したした。内容の正確性は人間のレビュヌを経お確認しおください。

Claude Opus 4.8 — Anthropic

Ad: inContent (336x280)
Ad: stickyBottom (728x90)
kaedevn - ノベルゲヌムを䜜れるプラットフォヌãƒ