リソース一覧へ
FiveMスクリプト開発中

ukkun_phone_pro

v0.11.0

iPhone のような体験を、サーバーへ。

iPhone を手本にしたモダンなデザインの多機能スマートフォンリソース。あらゆるフレームワークに適合します。

ukkun_phone_pro のホーム画面

Screens

画面を、そのままの比率で。

iPhone を手本にした UI を、実機と同じ画面比率でご覧いただけます。

ホーム画面の画面

ホーム画面

アプリが整列したホーム画面。iPhone を手本にした、なじみのある操作感で。

ロック画面の画面

ロック画面

時計と通知を備えたロック画面。スワイプで自然に開きます。

電卓の画面

電卓

標準アプリも丁寧に作り込み。電卓などをはじめから搭載しています。

ご注意
  • 本リソースは現在開発中であり、まだ販売していません。
  • 掲載しているスクリーンショットでは、開発をしやすくするために実機(iPhone)の壁紙・アイコンなどの素材を使用しています。これらは開発用の仮のものであり、配布物には含まれません。

概要

ukkun_phone_pro は、lb-phone やクェーサーフォンといった著名なスマートフォンリソースと同様に、iPhone をモデルにしたモダンなデザインのフォンリソースです。あらゆるフレームワークへの適合を前提に設計し、最新の技術スタックを採用。セキュリティとパフォーマンスに配慮した、拡張性の高いアーキテクチャを備えています。現在は開発中で、まだ販売していません。

iPhone を手本にした、なじみのある操作感

ホーム画面・アプリ・ロック画面まで、iPhone を手本にした自然な操作感で設計しています。ロールプレイ中でも迷わず使える、洗練された UI を目指しました。

あらゆるフレームワークに適合する設計

特定のフレームワークに依存しないブリッジ構成を採用し、ESX・QBCore・QBox・ox など、主要なフレームワークへの適合を前提に設計しています。既存サーバーへも導入しやすい構造です。

セキュリティとパフォーマンスの両立

最新の技術スタックで構築し、サーバーイベントの検証やデータ保護を徹底。NUI は軽量に動作するよう最適化し、多人数のサーバーでも快適に利用できる設計です。

主な特徴

  • iPhone 風のモダン UI
  • マルチフレームワーク対応
  • アプリの追加・拡張
  • 買った人が自分のアプリを作れる(雛形と開発画面を同梱)
  • セキュアな設計
  • 高いパフォーマンス
  • 多言語対応

更新履歴

最終更新 2026年8月5日

配布側が版を出すたびに書き出している一覧です。第 3 桁だけが変わった版は、設定を触らず 入れ替えるだけで済みます。

v0.11.02026年8月5日最新設定の見直しあり

触り心地の作り直し(視点・大きさ・Esc・打鍵)と MDT が出ない不具合

マウスで端末を触ると、視点も一緒に回っていた 🐛 / 端末が大きすぎた 🔧 / Esc で閉じられるようにした / 文字を打つと端末が閉じていた 🐛 / MDT がホーム画面に出なかった 🐛 / 既定を明るいテーマにした 🔧 / 試験が端末の大きさに寄りかかっていた 🔧

[0.11.0] - 2026-08-05

実際に遊んでもらって出てきたものをまとめて直した。

マウスで端末を触ると、視点も一緒に回っていた 🐛

歩きながら使えるように、端末を開いていてもゲーム入力を通したままに
している。ところが「通したまま」は文字どおり全部で、**指で触っている
つもりの操作がゲームにも届いていた**。カーソルを合わせるだけで景色が
流れるので、狙った場所を押せない。

端末を開いているあいだ、視点(左右・上下・車内のマウス)を止めた。
移動はそのまま通す——歩きながら使えるのは便利で、実機の感覚にも近い。

端末が大きすぎた 🔧

画面の高さの 82% を占めていた。持っているものではなく、貼ってある板に
見える。48% にした。

実機(6.3 型)の外寸は縦およそ 160mm、27 型の 16:9 モニタは縦およそ
336mm。手に持った端末を同じ距離から見たモニタに重ねると 160 / 336 で
約 0.48 になる。Config.UI.placement.heightRatio で変えられる。

Esc で閉じられるようにした

閉じるのは M だけだった。Esc はポーズ画面を開かずに端末だけを閉じる。
文字を打っている最中でも効く。

文字を打つと端末が閉じていた 🐛

端末を開く鍵は既定で M。RegisterKeyMapping で登録した鍵は、NUI に
焦点があってもゲーム側にも届く——歩けるように入力を通したままに
しているので、そうなる。メッセージに「m」を打つたびに閉じていた。

入力欄に焦点があるあいだは、開閉の鍵を効かせないようにした
(UI が打ち始めと打ち終わりだけを知らせる)。閉じたいときは Esc。

MDT がホーム画面に出なかった 🐛

ukkun_emergency は悪くない。こちらの不具合。

外部アプリの一覧を UI へ送る処理を呼ぶ場所が

  • 「自分よりあとに起動したリソースを見つけたとき」
  • 「サーバーから端末データが届いたとき、かつ UI が用意できていれば」

の 2 か所しか無く、どちらも噛み合わなかった。ukkun_emergency
ukkun_phone_pro より先に起動するので前者は発火せず、後者は UI の
準備とサーバー応答の競争。見つけてはいるが渡していない状態だった。

UI が「用意できた」と言ってきた直後に必ず送るようにした。起動の順番にも
応答の速さにも左右されない。

既定を明るいテーマにした 🔧

Config.UI.theme.default = 'light'。実機も工場出荷時は明るい側で、
暗いほうは「夜だけ切り替えるもの」という位置づけ。開発画面も同じ。

試験が端末の大きさに寄りかかっていた 🔧

大きさを縮めたら、指を滑らせる試験が 3 つ落ちた。滑らせる距離を
画素で決め打ちしていたため、閾値に届かない・端末の外へ出る、が起きた。

端末の大きさは設定で変わる。 画素で書くと、設定を変えるたびに試験が
嘘をつく。帯の幅・画面の高さに対する割合で書き直した。

基準画像も 2 枚落ちたが、こちらは「(ダーク)」という名前のまま明るい
画面を撮っていたもの。試験が何を見ているかを既定値に委ねないよう、
テーマを明示するようにした(基準画像は 1 枚も差し替えていない)。

v0.10.02026年8月4日設定の見直しあり

配布物の難読化・fxmanifest の整理・README の作り直し

配布する JavaScript を読みにくくした / fxmanifest をまとめ読みにした / 暗号化しないものを宣言した / README を書き直した

[0.10.0] - 2026-08-04

配布する JavaScript を読みにくくした

Lua は KeyMaster が暗号化してくれるが、**NUI の JavaScript は素のまま
配られる**。ビルド済みなので短い名前へは潰れているものの、開けば処理の
流れは追える。

tools/obfuscate.mjs を足し、pnpm release の中で通すようにした。

  • 文字を隠す — 画面に出る言葉・イベント名・鍵の名前を配列へ追い出し、

呼ぶ側からは番号でしか見えなくする

  • 名前を潰す — 残っている読める名前を意味の無いものへ

制御フローの平坦化と、死んだコードの注入はしない。 どちらも
読みにくさでは効くが、前者は実行が 1.5〜3 倍遅くなり、後者は
出来上がりが 2〜3 倍に膨らむ。この端末は 60fps で描き続けるものなので、
止められない相手のために買った人全員の手触りを落とすのは割に合わない

実測: 0.78 MB → 1.19 MB(+53%)、フレーム間隔は 17ms のまま変わらず。
起動して端末を開き、日本語が出るところまで確かめてある。

registerApp などの SDK の名前はわざと残している。外部のアプリが
その名前で呼ぶので、潰すと全部動かなくなる。

混入の検査より後に通す。 先に読みにくくすると、検査が探している
setupMock のような文字は base64 になっていて、何も見つけられない
「きれいだと言うだけの飾り」になる。

fxmanifest をまとめ読みにした

84 行の明示 → 39 件 + まとめ読み 9 件。新しいファイルを足しても
書き忘れが起きない。

まとめ読みにしたのは並びに意味が無いところだけ。橋(bridge)の
実装は adapters/ の中へ、記録の表は storage/tables/ の中へ、
アプリの受け口は server/apps/ の中へ移した。案内係より先に実装が
読まれると落ちるので、同じ場所に置いたままではまとめ読みにできない
(名前順で esxloader より先に来る)。

設定だけは 1 つずつ並べたまま。 config.sites.luas)が
config.ui.luau)より先に来ると、あとから読まれた config.ui.lua
Config.UI.browser を丸ごと置き直し、ブラウザのお気に入りが**黙って
消える**。まとめ読みにしようとして実際に消えたので、戻した。

tests/unit/serverBoot.test.ts がまとめ読みを展開して、fxmanifest と
同じ順で実際に読み込む。並びを壊すとここで落ちる。

暗号化しないものを宣言した

escrow_ignore を足した。Cfx の Asset Escrow は既定で Lua を丸ごと
暗号化するので、設定と翻訳がそのままだとサーバーの持ち主が開けない
台詞も寸法もどの街を出すかも変えられないのでは、売り物として成立しない。

並べたのは「持ち主が開いて中を書き換えるもの」だけ。

README を書き直した

配布物に開発用の README がそのまま入っていた。中身は pnpm dev
話とディレクトリの構成で、買った人には 1 行も要らない。最初に開く
ファイルがそれでは、何をどうすればよいのか分からない。

  • 配布物の README を別に書き出すようにした(導入 → 設定 → 連携 →

困ったとき の順で、上から読めば運用に入れる形)

  • 根の README を作り直した。何のためのリソースかを先に置き、

開発の進め方と検査の仕組みまで通した

v0.9.42026年8月4日入れ替えるだけ

画面が灰色で塗り潰される不具合を直す

画面が灰色で塗り潰される 🐛 / 見た目の試験を全部すり抜けていた / 記録を既定で出すようにした 🔧

[0.9.4] - 2026-08-04

画面が灰色で塗り潰される 🐛

参加した瞬間に画面全体が灰色になり、他の UI も埋もれてスポーンもできない。

原因は tokens.css:rootcolor-scheme: dark を置いていたこと。
Chromium はこれを見て頁の地そのものを塗るhtmlbody も透明の
とき、地は UA の既定色になり、その既定色が color-scheme に従う。

つまり NUI は最初から「暗い板」だった。 端末を出していようがいまいが
関係なく、ゲームの絵の上に乗り続けていた。

  • :root から外し、[data-theme](端末の入れ物)へ移した。

効かせたいのは端末の中の部品だけで、根に置く必要は無かった

  • html, body の地を rgb(0 0 0 / 0) と明示した。将来また

color-scheme を足しても、こちらが勝つ

  • index.html<meta name="color-scheme"> も外した

ukkun_emergency v0.1.3 と同じ原因。 あちらの記録が無ければ、
こちらはもっと遠回りしていた。

見た目の試験を全部すり抜けていた

端末そのものは正しく描かれるので、基準画像との比較は全部通る。開発
ハーネスは自前の背景を敷いているので目でも分からない。サーバーの
ログにも Lua にも何も出ない。

地を塗っていないことそのものを試験にした
tests/visual/transparency.spec.ts)。:root に戻すと落ちることを
確かめてある。原因が color-scheme でなくても、地を塗った時点で落ちる。

記録を既定で出すようにした 🔧

Config.debug = trueConfig.logLevel = 4(DEBUG まで)。

入れたばかりのサーバーで何かおかしいとき、まず要るのは「どこまで
進んだか」で、それが出ていないと聞くことも答えることもできない。
人が集まる本番では落としてよい。

v0.9.32026年8月4日入れ替えるだけ

NUI が読み込みを断られていたのを直す

NUI が脚本も見た目も読み込めていなかった / 分かっていないこと

[0.9.3] - 2026-08-04

NUI が脚本も見た目も読み込めていなかった

Vite は書き出した index.html の読み込みの札にこう付ける。

<script type="module" crossorigin src="./assets/index-….js"></script>
<link rel="stylesheet" crossorigin href="./assets/index-….css">

crossorigin は「別の生成元から取るので、あちらの許しを確かめる」という
指示。普通の web では同じ生成元なので素通りするが、**NUI は nui://
いう独自の仕組みで配られる**ため確かめが通らない。

Access to script at 'nui://…' has been blocked by CORS policy

脚本も見た目も 1 つも読み込まれない。 それでいて起動は通り、
サーバーのコンソールにも Lua のエラーにも何も出ない。

  • 書き出すときに crossorigin を外す(tools/vite-plugin-nui-html.mjs
  • <meta name="color-scheme"> も外す。読み込みが落ちたときの最後の砦で、

これがあると地が不透明な暗い灰になる。端末の中の色は自分で全部
決めているので、ブラウザの既定に頼っているものは無い

  • 配布ビルドで検査する。 crossorigin が残っていたら、あるいは

根からの道(/assets/…)が書かれていたら、そこで止める

分かっていないこと

報告されている「画面が灰色で塗り潰される」が、これで直るかは
確かめられていない。上の問題は実在するが、灰色との因果は
こちらでは再現できていない。

こちらで確かめた範囲では、端末を出していないあいだの NUI は
1 画素も塗っていない(1280×720 から 3840×2160 まで、四隅と中央の
すべてで透過)。

v0.9.22026年8月4日入れ替えるだけ

表名の衝突・クライアントで落ちる 2 か所を直す

表の名前が他所とぶつかっていた / クライアントで落ちる 2 か所 / 入れ替えるとき

[0.9.2] - 2026-08-04

表の名前が変わります。 0.9.1 以前から入れ替える場合は下の「入れ替えるとき」を読んでください。

表の名前が他所とぶつかっていた

既定の接頭辞が phone_ で、phone_messages のような名前は**どの
スマホスクリプトも使う**。同じデータベースに別のスマホが入っていると、
そのまま相手の表を掴む。

ぶつかったときの壊れ方が悪い。CREATE TABLE IF NOT EXISTS は表が既に
あれば黙って通るので、こちらは「作れた」と思って他所の表へ読み書きを
始める。列が足りないところで初めて落ちるが、そのときには手遅れ。

  • 既定の接頭辞を ukkun_phone_ にした
  • 初回の起動で「こちらが作るはずの表が既にある」ときは、**止めて理由を

出す**。そのまま続けると他所の表を触ることになる

  • 手順が 1 つ失敗したらそこで止める。以前は次へ進んでいたので、

「起動は成功したが表が半分だけ出来ている」状態になっていた

クライアントで落ちる 2 か所

client/modules/clock.lua:85: attempt to index a nil value (global 'os')
shared/settings.lua:368: attempt to call a table value (field 'allowed')
  • os はクライアントに無い。 サーバーには在るので書いているときは

気づかない。現実の時刻は GetLocalTime()、経過時間は GetGameTimer()
から取るようにした(曜日は日付から数える)。同じ間違いが
Utils.uid() にもあり、共通の置き場なので両側から呼ばれうる

  • 選択肢の許可値は「表でも関数でもよい」と決めてあったのに、関数と

して呼ぶだけの作りだった。表で書いた項目に触った瞬間に落ちる。
ここは設定を 1 つ変えるたびに通る道で、起動時の組み立ても通るので、
巻き込まれると端末が出てこない

tools/check-lua-globals.mjs に「クライアントでは使えないもの」の検査を
足した。tests/unit/settingsSanitize.test.ts は、選択肢の許可値を表でも
関数でも通せることを押さえる。

入れ替えるとき

接頭辞が変わるので、表は作り直しになります。0.9.1 以前で貯めた
データは引き継がれません(まだ販売前で、試験運用のみのため)。

古い phone_* の表は消して構いませんが、**phone_messages だけは
確かめてから**にしてください。そこがぶつかっていた場合、それは別の
スクリプトの表です。

接頭辞を元のままにしたい場合は shared/config/config.lua
Config.Storage.tablePrefix で戻せます。

v0.9.12026年8月4日入れ替えるだけ

実機で落ちていた読み込みと翻訳を直す

記録の読み書きが丸ごと死んでいた / 翻訳が 1 つも読めていなかった / 何も間違えていないのに警告が出ていた / 配布物

[0.9.1] - 2026-08-04

0.9.0 はサーバーに載せると動かない。 入れ替えてください。

記録の読み書きが丸ごと死んでいた

サーバーの起動時にこう出ていた。

SCRIPT ERROR: server/storage/phoneData.lua:96:
attempt to index a nil value (global 'DB')

local DB = Phone.DB を書き忘れたファイルが 6 つあり、**読み込みの
時点で全部落ちていた**。連絡先・メッセージ・メール・写真・時計・メモが
一度も保存されない状態だった。同じ書き忘れがクライアント側にもあり
NUI State Log)、そちらは受け口の登録ごと落ちていた。

全部で 25 ファイル・29 か所。

なぜ気づけなかったか。 このコードを通る道が 1 つも無かった。
Lua は大域の読み出しを咎めないので構文検査は通り、型検査は Lua を
見ておらず、単体試験は設定の評価しかしておらず、開発ハーネスは
JavaScript のモックで動くので Lua を 1 行も通らない。

  • tools/check-lua-globals.mjs を足した。束ね忘れをその場で出す
  • tests/unit/serverBoot.test.ts を足した。**fxmanifest と同じ順で

実際に読み込む**。読み込めさえすれば、この種の間違いは必ず出る

  • どちらも pnpm verify に入れた

翻訳が 1 つも読めていなかった

[WARN ] 翻訳 `ja` を読み込めませんでした。`en` へフォールバックします。
[ERROR] 翻訳ファイルが 1 つも読み込めませんでした。

設定と翻訳を shared/ の中へ移したとき、locale.lua
LoadResourceFile の道だけが locales/ のまま残っていた。
LoadResourceFile は無い道でも黙って nil を返すので、起動はする。
画面じゅうに鍵の名前がそのまま出ていた。

実行時に読む道が本当にあるかを、食い違いを見張る道具へ足した。

何も間違えていないのに警告が出ていた

[WARN ] 設定 `Config.UI.contribute.contact` の値が不正です (受け取った値: )。

「連絡先を出さない」が既定なので、空が正しい。空文字を書き忘れとみなす
検査を当てていた。本当の書き間違いの警告が、この手の雑音に埋もれる
ので、空でよい項目は型だけを見るようにした。

配布物

  • 開発キットの 開発画面/ が、静的サーバーで開けることを確かめた
v0.9.02026年8月4日

アプリ 11 個・SDK・開発キット・受け口の守り

アプリ / ブラウザ(続き) / 写真を何枚も送れるようにした / チェーンメール(不幸のメール)— ネタ機能 / メッセージ(新しいアプリ) / 「今日」の面 / ホーム画面から外す / 設定(実機との突き合わせ) / 最近使ったアプリ・ブラウザ(実機との突き合わせ) / ホーム画面(実機との突き合わせ) / コントロールパネル(実機との突き合わせ) / 共通 UI キット

[0.9.0] - 2026-08-04

**0.1.0 の次が 0.9.0 なのは、そのあいだ版を上げずに 105 個のコミットを
積んだため。** 番号を 8 つ飛ばしたのではなく、区切っていなかったぶんを
まとめて 1 つの版にしている。以降は機能ごとに副(0.X.0)を上げる。

この版で入ったものを大きく言うと 3 つ。

  1. アプリが 11 個(電話・メッセージ・メール・メモ・時計・写真・

カメラ・電卓・ブラウザ・ガレージ・設定)

  1. アプリを足すための一式window.PhonePro SDK 1.9.0・雛形・

配れる開発画面)

  1. 守りと確かめ方(受け口の門番・設定の検証・食い違いを見張る道具)

アプリ

  • ブラウザ。開始ページ(お気に入りの升目・よく見る所)、上の欄と検索履歴、

頁の表示、下の帯(戻る・進む・共有・しおり・タブ)、タブ一覧、プライベート。
行き先は 3 通り

  • 街の場所:リソースが registerSite で登録した頁。中身は React の部品で

渡す(HTML 文字列ではないので、書き間違いが端末ごと壊さない)

  • 外の世界:本物の URL を iframe で開く。Config.UI.browser.allowExternal

allowlist でサーバーが範囲を決める

  • 探し物:どちらでもない文字は searchUrl へ渡す
  • 外の頁が「他の頁の中に映ること」を断っている場合、ブラウザの側からは

読み込み中との区別が付かない(断られた枠も読めた枠も、同一生成元の決まりで
中を覗けない)。開く前にサーバーが一度だけ見出しを見に行き、断られる頁は
枠を出さずに理由を出すようにした(Config.UI.browser.probeFraming

  • 見た頁と打った文字は端末の中だけに置く。サーバーへは保存しない。

プライベートでは記録そのものを取らない

  • 見本の街の場所を 3 か所同梱(市庁舎・中古車・掲示板)。

Config.UI.browser.sampleSites で消せる

ブラウザ(続き)

  • 街の場所 3 か所を作り込み、文面を shared/config/config.sites.lua へ出した
  • 市役所:お知らせ(畳んで開く)・手続きの窓口(場所と時間)・部署の連絡先
  • ホイールマーケット:おすすめ 1 台・掲載順/安い順の並べ替え・売る側への案内
  • 街の掲示板:板 → スレッド → 書き込みの 3 段。通し番号・名前・>>2 の参照
  • タブの札を上へ払って閉じられるようにした(× も残す)
  • プライベートへ入るときにロックのパスコードを求める。決めていなければ

その場で決められる。決めずに進むこともできる(守るものが無い人に鍵は強いない)。
ブラウザを閉じると掛かり直す

  • 配布元(in.nozawatec.com)は、許可リストや allowExternal の設定に

かかわらず開ける。使っているスクリプトの説明を端末の中から読めなくすると、
設定を直す人の調べ先が消えるため

写真を何枚も送れるようにした

添付が 1 枚しか持てなかった。 メールは attachment という文字列 1 本で、
メッセージには添付そのものが無かった。写真を何枚か送るという当たり前のことが
できていなかった。

  • 枚数で並べ方が変わる(UI キットの MediaGrid
  • 1 枚 もとの縦横の比のまま。枠のほうが写真に合わせる
  • 2 枚 半分ずつ横に
  • 3 枚 左に大きく 1 枚、右に小さく 2 枚
  • 4 枚〜 2×2。5 枚目からは最後の枠に「+N」
  • 押すと全画面で見られる(MediaViewer)。左右に払う/矢印キーで送れる。

升目に出なかったぶんもここでは見られる

  • メール・メッセージ・チェーンメールが同じものを使う。並べ方を各アプリで

書くと、同じ 3 枚がアプリごとに違う形で出る

  • メッセージの写真は吹き出しの地を敷かない。写真そのものが四角いので、

下に色を敷くと縁取りにしか見えない

  • チェーンメールの「最期の姿」も複数枚。少し間を空けて撮ったものが並ぶ。

1 枚だけだと「たまたま写った」に見えるが、続けて何枚もあると誰かが
見ていたことになる

チェーンメール(不幸のメール)— ネタ機能

映画「着信アリ」の作法をそのまま持ってきた仕掛け。既定は 切ってある
Config.Chain.enabled = false)。

  • ある日、自分のアドレスから自分あてにメールが届く。差出人は自分
  • 本文には、これまで受け取ってきた人たちの名前が積み上がっている

(不幸の手紙の作法)

  • 添付は screenshot-basic で撮った自分の「最期の姿」
  • 決められた時刻までに決められた人数へ転送しなければ、その時刻に何かが起きる
  • 転送すれば逃れられるが、呪いは転送先へ移る
  • 次の相手は連絡先ではなく「転送した先」。原作と違い、勝手に広がりはしない

RP を壊さないために

  • 予告の時刻に起きることは 4 段階(nothing / scare / down / kill)。

既定は scare(画面が乱れて端末が落ちるだけ)。本当に殺すのは運営が
明示的に書き換えたときだけ

  • 始まり方も 3 通り(random / forward / command)。既定は command で、

運営が /chainmail で最初の 1 人を決めたときだけ動く

  • 起きる時間帯・確率・同時に呪われる人数・除外する職業(既定で警察・救急・医者)・

解かれてからの間隔まで、すべて config

  • 呪われているあいだも、電話や通報は塞がない
  • メールの一覧の上に残り時間の帯を出す。1 通開かないと気づけない造りだと、

怖いのではなくただ理不尽になる

  • 予告の時刻には端末そのものが反応する(赤い霧・走査線・「着信アリ」)。

ゲームの画面だけが乱れて端末が平然としていると、「スクリプトが何かしたな」
としか思えない

  • 開発ハーネス(pnpm dev)の左側に一式の口を置いた。掛ける(22 分 / 1 分)・

1 人へ転送した・予告の時刻にする・解く。サーバーを立てずに一通り見られる

修正した不具合

  • 予告の時刻の演出が、始まった瞬間に消えていた。サーバーは「起きた」を

送った直後に「解けました」を送るが、UI がそこで演出まで下ろしていた。
演出は自分の時計で終わるものなので、状態の更新では触らないようにした

メッセージ(新しいアプリ)

実機(素材/実機参考/メッセージ)に合わせた SMS のアプリ。プレイヤー同士で
実際にやり取りできる。

  • 会話の一覧:顔・名前・日付・2 行の抜粋。未読は左端の青い丸。

名前と本文の両方から絞り込める。下端に検索の欄と作る口

  • 会話:吹き出し(受信は左の灰、送信は右の青)。尻尾は同じ向きが続く

塊の最後にだけ付く。時刻は 1 通ごとには出さず、1 時間空いたときと日を
またいだときだけ中央に挟む

  • 新規メッセージ:宛先を打つと連絡先が絞り込まれる。連絡先に無い番号へも

そのまま送れる

  • 相手の詳細:掛ける・連絡先を作る・通知を切る・寄せ付けない・会話を消す
  • 届いたとき:バナーとアイコンの数。数は未読の通数そのもので、端末を

閉じているあいだに届いたぶんも入る。会話を開くとまとめて既読になる

  • 寄せ付けない相手からのものは記録もしない。送った側には「送れた」ように

見せる(拒んだこと自体を相手に知らせないため)

  • Config.Phone.messages で 1 通の長さと読み込む通数を変えられる

この機能のために直したところ

  • 画面のキーボードが、下端の打ち込む欄を覆っていた。キーボードは上の内容を

押し上げず手前に重なる造りで、それでよいのは覆われるものが読み物のときだけ。
キーボードが自分の高さを知らせるようにし(keyboardStore.height)、
下端に欄を置くアプリはそのぶん持ち上げる

  • アプリが自分で名乗ったバッジに、通知の数まで足していた。届いた 1 通で

「未読 1 + 通知 1」の 2 になる。名乗ったならそちらだけを信じる

「今日」の面

  • ホーム画面の 1 ページ目からさらに右へ払うと出る、ウィジェットだけの面。

実機の同じ場所にあるものと同じ

  • 升目ではなく上から順に積む。置ける場所を探さないので、大きいものを

何枚でも並べられる。小さいものは 2 枚で 1 行に組む(1 枚ずつ縦に並ぶと
右半分がずっと空いたまま流れる)

  • 下端に「ウィジェットを追加」と「編集」。実機は「編集」だけだが、空の面に

「編集」しか無いと何を編集するのか分からない

  • 積んだ内容はサーバーへ保存する(HomeLayout.today

修正した不具合

  • フォルダとウィジェットを置くと、配置がまったく保存されなくなっていた

サーバー側の受け入れ検査が枠を「アプリの ID の文字列」しか通しておらず、
表(フォルダ・ウィジェット)が来た時点で保存そのものを断っていた。
フォルダを 1 つ作るだけで、以降の並べ替えが何も残らない状態だった

ホーム画面から外す

  • 並べ替え中、アイコンの左上に外す印(−)が出る(実機と同じ位置・大きさ)。

Dock のアイコンにも出る

  • 外れるのはホーム画面からだけ。アプリそのものは残り、アプリ一覧と検索からは

これまでどおり開ける

  • 戻す場所は 設定 → ホーム画面とアプリ一覧。外したアプリが並び、押すと

今見ているページの空きへ戻る。1 つも外していないときは何も出ない

  • フォルダには印を付けない。まとめて何個も外れるのに、戻すのは 1 つずつに

なるため。フォルダの中身は開いて出せばよい

設定(実機との突き合わせ)

  • 一覧の行を 51 → 53 に。実機の設定アプリを何面か走査すると、印のある行は

53 前後。ここは端末じゅうの一覧が使う寸法なので、2 の差でも全体に効く

  • 「一般」と「アクセシビリティ」の頭に大きな札を置いた(実機 IMG_9391 /

IMG_9414 と同じ形)。行の名前だけでは「一般」が何の一般なのかが伝わらない

  • 「一般」の行に色の付いた印を足した。印が根の面にだけあると、掘った瞬間に

別のアプリへ移ったように見える

  • 検索の欄に声の口(マイク)は足さない。実機には付いているが、こちらは

声で打つ手立てを持たない。押しても何も起きない口は、無いより悪い

最近使ったアプリ・ブラウザ(実機との突き合わせ)

  • お気に入りに配布元の 2 つが出ていなかったshared/config/config.sites.lua

書いた Config.UI.browser.linksvalidate.lua が組み直すときに落として
いた(既知の鍵だけで組み直す造りで、そこに links が無かった)。
設定に書いたのに届かない、という形の不具合

  • 最近使ったアプリでは上端の帯を消す。カードの名札がその高さに来るため。

名札は札の左端から 30 内側(実機と同じ)、絵は 26 角

  • タブ一覧の丸い口(・検索)を縁の光る透けた丸にした。地を塗った丸だと、

背後が透ける札と質感が揃わず、そこだけ別の層に貼ってあるように見える

  • 開発ハーネスが shared/config/config.phone.lua を読んでいなかった(fxmanifest

には入っていた)。電話まわりの設定を変えてもハーネスに反映されない

ホーム画面(実機との突き合わせ)

  • アイコンを 60 → 66 に広げた。実機(画面幅 390)を走査すると 64 で、

こちらは 1 割小さかった。そのぶん余白が広く、指で狙う的が小さくなって
いただけ。ラベルまでの間隔 4 → 8、行の間 21 → 13(行の送り 98 は据え置き)、
左右の余白 32 → 28

  • 大画面(6.9 型)は 7 行 → 6 行。実機は画面が大きくても 6 行のままで、

増えるのはアイコンの大きさと余白。7 行にすると大きい端末なのに的が小さくなる

  • 電池の中に残量の数を出すConfig.UI.statusBar.showBatteryPercent)。

実機(iOS 26)と同じく絵の中を切り抜いて出す。横へ数字を並べると、
そのぶん電波や時刻が押し出される。電池そのものも実測(胴 25 x 11)に合わせた

  • 並べ替え中の「+」「完了」を画面の上端へ移した。実機は時計のあった高さに

2 つのガラスの札を左右へ振り分ける。下に置くと Dock と検索に挟まれて下端が
札で埋まり、アイコンを運ぶ指の通り道を塞ぐ。並べ替え中は時計を消す

  • ページの印を札に入れた。いつもは検索の口だけを出し、並べ替え中と

ページを送っている最中だけ、同じ場所・同じ大きさで点の並びへ入れ替わる。
常に両方出していたので、下端に札が 2 段重なっていた

  • アプリ一覧の大きな見出しを外した。実機も題を出さず、検索の欄の中の

文字が面の名前を兼ねる。題と欄が縦に並ぶと、同じことを 2 回言うために
升目 1 行ぶんが消える。欄の中の案内は中央寄せ(実機と同じ)。
分類の札は実測(159 角・間隔 21)に寄せた

コントロールパネル(実機との突き合わせ)

  • 開いているあいだ上端の帯を消す。すぐ下の要約が電波も電池ももっと

詳しく出しているので、同じものが上下に二つ並んでいた。空いた高さまで
と電源が上がる(StatusBarhidden を追加)

  • 回線と電池の要約から黒い札を外した。下に並ぶガラスの升目と同じ「面」に

見えて押せそうだったが、これは押せない表示。文字は一回り大きくした

  • 升目の寸法を実測値へ寄せた(丸の直径 67・間隔 15.3・左右余白 38/画面幅 390)
  • 画面の向きを固定すると絵がになる。ほかの入っているボタンと同じ黒だと、

「今わざと止めてある」という警告の意味が消える

  • 明るさの絵は満ちた白の上で黄色(実機と同じ)。白の上に白は置けず、

灰色にすると何の量の棒なのか絵を読むまで分からない

  • いちばん下の丸を外観の切り替えにした(明→暗)。以前は何もしない飾り
  • 集中モードの月に丸い地を敷いた。絵だけだと押す場所がピル全体なのか

分からない

  • アイコンを追加:qrCodecircleHalf(外観)・rewindfastForward

chevronUpDownrotationLock は錠を回る矢印が囲む形へ描き直し、
moon に塗り版を足した

共通 UI キット

  • Toolbar(下に浮かせる操作の帯。TabBar と違い選択状態を持たない)
  • Tile(色の板に字か絵をひとつ置いた、升目用の札。角丸はホーム画面と同じ超楕円)
  • SearchFieldonSubmit(改行で確定)と raiseKeyboard(画面のキーボードを

出すか)を足した

  • Menu が出る場所を自分で決めるようになったuseMenu()

triggerProps を押す口へ渡し、anchorMenu へ渡すと、下に入らなければ
上へ返し、横も画面の中へ寄せる。呼ぶ側が「ここは上」と書く必要はない

  • 板は表示領域([data-screen])へ直に差し込まれる。呼ぶ側の入れ物が

overflow: hidden でも切られないため。アプリの入れ物の子ではなくなるので、
試験から掴むときは page 側から探すこと

  • useSwipeAway(土台)。上へ払って消す操作の手応え(追従・下向きの抵抗・

距離に応じた薄れ・放った勢いの引き継ぎ・戻りの弾み)を 1 か所にまとめた。
アプリスイッチャーとブラウザのタブが同じ手応えになる

  • アイコンに book(しおり)と handRaised(プライベート)を追加
  • SDK は 1.8.0。registerSite と、上記 2 つの部品を公開

修正した不具合

  • SearchField が画面のキーボードとゲーム側のカーソルを起こしていなかった

TextField の説明にある取り決めを呼んでいなかった)

  • アプリスイッチャーのカードが指に付いてこなかった。上へ払うと消えはするが、

その途中は何も動かないので「押しただけ」に見えていた

  • 共有のメニューが画面の下からはみ出していた
  • 背景を加工できないガラス面に色が一切出ていなかった。差し替え用の層に

位置指定が無く、高さ 0 の箱になっていた。同時に出せる数(既定 8)を
超えた面もこちらへ落ちるため、「後ろのほうの面だけ色が無い」形で出ていた。
併せて、加工できない面は暗く落とすぶんが無いので、専用のティント
--glass-tint-opaque)で加工できる面と同じ暗さに揃えた

ukkun_phone_pro | 野澤組