feat(ui): start a session from the participant row, and drop the launcher - #63
Conversation
…cher 開始 をランチャ行から参加者の行へ移し、`#launcher` を削除した。 同じライフサイクルの両端が離れていた。終了は #57 で行に乗ったが、開始は 会話面の上のランチャ行に残っており、一つの物事の両端が二つの面にあった。 行は名前の後ろに二つの列を持つ——一列目がライフサイクル(`開始` または `終了`)、二列目が `編集` である。 列は行の状態で動かない。track は中身の有無に依らず幅を持つので、ライフ サイクルを持たない行——起動されない人間、種別 `user`——も列を閉じない。 これが `編集` を他の行より左へずらしていた原因である。`編集` の track は 固定であり、armed の `本当に終了` が伸びるのは名前の側であって `編集` の 位置ではない。ライフサイクルの track を armed の幅に固定する形は採らな かった。パネルは 16.5rem しかなく、実測で「マスター(あなた)」の名前が 出なくなる。四秒の一行のためにリスト全行の幅を払うことになる。 起動中と起動失敗は行が持つ。ランチャのボタンが持っていた `disabled` は 押された行のボタンへ移り、状態の語は名前の隣の note に入る——`未起動` / `終了` / `起動失敗` と同じ場所である。起動に失敗すると端末は破棄される ので、行に残さなければ押したこと自体が消える。理由は `title` に載せ、 status 行はこれまで通り全文を持つ。 `#launcher` に残る仕事は無かった。`accountEl.value` の参照はすべてラン チャ内部で閉じており(`selectedAccount` と `renderAccountOptions` のみ)、 パネル下部の値は選択ではなく画面に出ている端末に従う。どのアカウントを 起動するかは、押された行が答える。 終了の 2 段階 arm は変えていない。開始には付けない——取り消せる操作で あり、間違えて始めたセッションはそれを置き換えるボタンが終わらせる。 Refs #62
`.lifecycle > button { flex: 1 }` を共有規則の `width: 100%` に戻し、その
理由として書いていた「percentage width が track の測定へ食い込み
`本当に終了` を切る」を削除した。**この記述は誤りである。** 測定を誤って
いた——比較用の clone を `#participants` の外へ挿していたため、clone は
padding も font-size も border も失った UA 既定のボタンとして測られて
いた。同じ条件で測り直すと `flex: 1` と `width: 100%` は完全に同一で
あり、どちらも切らない。
実測(Chrome、パネル 16.5rem、7 通りの行):
- `編集` の左端は 211.2px で全行一致。ライフサイクルを持たない種別 `user`
の行でも動かない。
- ライフサイクル track の右端は 206.4px で全行一致。ボタンを持たない行
(`user` / ゲスト)でも track は幅を保つ。
- `開始` と `終了` はいずれも 51.2px、同じ位置。
- armed の `本当に終了` は 69.9px へ左向きに伸び、文字は収まり、`編集` は
動かない。track が max-content なので、字幅の異なる環境でも収まる。
- 行の高さは全行 27.6px。
Refs #62
要件と README を実装に合わせた。 `docs/0-requirements.md`: - 参加者パネルに、行の二列(一列目=ライフサイクル / 二列目=編集)と、列が 行の状態で動かないことを書いた。中身の無い列も幅を保つこと、それが編集 を揃える条件であることを含む。 - 開始を 2 段階にしない理由を書いた。終了の二度押しは取り消せないため であり、開始は取り消せる。 - 起動中と起動失敗を行が読めることを表で書いた。失敗の記録が次の開始まで 残る理由も。 - 「ランチャ行は無い」を新設した。残っていた仕事が無かったことを参照から 示し(`accountEl.value` の読み手は 2 箇所、どちらもランチャ内部)、 ボタンが持っていた状態の行き先を書いた。 - 種別 `user` の記述を「ランチャの選択肢にも出さない」から「その行に開始 も出さない」へ。拒否が唯一の知る手段になってはならない、という理由は 変わっていない。 `README.md`: 行の操作の説明を書き直し、「アカウントを選び『セッション参加』 を押す」を「アカウントの行の『開始』を押す」へ。 Refs #62
`startEl` の click listener を消したとき、その後ろの空行まで一緒に消えて いた。`main` 内の段落の切れ目であり、意味は変わらない。 Refs #62
smileygames
left a comment
There was a problem hiding this comment.
セルフレビュー(auto モード / 人間チェックなし)
完了条件の照合
| #62 の完了条件 | 結果 |
|---|---|
| 参加者の行から開始できる | 満たす |
| 開始と終了が同じ列にある | 満たす。grid の第 2 トラック |
| 編集が常に一番右で、行の状態によって動かない | 満たす。下記の実測 |
| 種別 user の行にライフサイクルのボタンが無い | 満たす。トラックは空のまま保たれる |
| ランチャ行が存在しない | 満たす。参照 0 件(下記) |
| 起動中と起動失敗が読める | 満たす |
| 終了の 2 段階 arm が残っている | 満たす |
親側の指示を、実装が実測で却下した(是認する)
わたしは再開時に「ライフサイクル列をありうる最も広いラベル(本当に終了)に合わせろ」と指示した。実装はこれを測ったうえで却下している。
a fixed 5.6rem track leaves the local user's own row with 15.8px for the name — 「マスター」 disappears behind 「(あなた)」
わたしの案は編集の固定と引き換えに名前を潰す。実装が採ったのは grid の三トラック構成である。
grid-template-columns: minmax(0, 1fr) minmax(3.2rem, auto) 3rem;
編集は固定幅の第 3 トラックにあり、arm でライフサイクル列が伸びてもその伸びを吸収するのは名前列(1fr)であって編集ではない。 わたしが閉じたかった不変条件(arm で編集が動かない)は満たされ、名前は潰れない。
しかも #57 の END_SETTLE_MS(armed ボタンがポインタの下で広がるためのダブルクリック対策)の前提を保っている。固定幅にしていたらあの理由付けが偽になっていた。
わたしの案より良い。 推論で出した指示を、測って否定したのは正しい。
実測値も報告されている。7 つの行形状(自分 / 未起動 / 起動中 / 稼働中 / armed / 失敗 / ゲスト)で編集の左端が 211.2px で一致、ライフサイクル列の右端が 206.4px で一致。
ランチャの削除は参照で確認した
index.html の launcher / account-select / start-session が 0 件。src/main.ts の accountEl / selectedAccount / renderAccountOptions が 0 件。
「他に役目が無い」は仮定ではなく参照で確かめられている。パネル下部の値は shownAccount に従っており、select とは無関係だった。
起動中と失敗の行き先
ボタンが disabled、状態語が名前の隣(起動中 / 起動失敗、理由は title)。launchFailures はアカウント id で保持し、次に開始を押したとき消える。
この保持が必要な理由も報告されている。 失敗した起動は端末を捨てるため、記録が無いと行が黙って 未起動 に戻り、押していないのと同じ見た目になる。ランチャ削除で失われかけた情報が、正しく行へ移っている。
自己訂正のコミット
4d9bdd3 は、実装自身が書いた CSS の理由付け(width: 100% が 本当に終了 を切る)が誤りだったことの訂正である。比較用のクローンを #participants の外へ置いたための誤測定で、同条件で測り直すと flex: 1 と width: 100% は同一出力だった。
偽の理由付けを消し、訂正を別コミットとして残している。 隠していない。
検証
CI(check / CI)いずれも pass。親側で grid のトラック定義、ランチャ参照の消失、diff の範囲を確認した。
実機は未確認(Tauri ビルドが要る)。docs に記載済み。阻却事由としない。
手元の clone の src-tauri/Cargo.toml
実装側が「自分の変更ではない」と報告している。親側で確認したところ HEAD とバイト単位で同一であり、行末コードの stat 差のみ。この PR とも実装側とも無関係で、実害は無い。報告は正しい。
リリース種法
minor と判定する。ランチャ行の廃止と開始の移動により画面構成が変わる。user observable な構造変更。
自己レビュー通過。auto モードのため人間チェックはなく、このままマージへ進む。
Closes #62
セッションの開始を参加者の行へ移し、
#launcherを削除した。行の操作は名前の後ろの二列——一列目がライフサイクル(開始または終了)、二列目が編集である。同じライフサイクルの両端が同じ場所に来た
終了は #57 で行に乗ったが、開始は会話面の上のランチャ行に残っていた。一つの物事の両端が二つの面にあった状態を、片方を動かして解消した。開始には 2 段階 arm を付けていない——取り消せる操作であり、間違えて始めたセッションは、その場所を引き継ぐ終了が終わらせる。終了の 2 段階 arm(#57)はそのままである。
列が動かないこと
以前の並びは
編集終了であり、終了は稼働中の行にしか出ないため、未起動の行では編集が左へずれていた。列は grid の track で持ち、track は中身の有無に依らず幅を持つ。ライフサイクルを持たない行——種別
user、および端末を持たないアカウント——も列を閉じない。閉じれば編集がその行だけ左へ寄る。Chrome での実測(パネル 16.5rem、7 通りの行の形: 本人 / 未起動 / 起動中 / 稼働中 / armed / 起動失敗 / ゲスト):
編集の左端userの行を含む)開始/終了の幅本当に終了編集は動かないarmed の幅にライフサイクル列を固定する形は採らなかった。パネルは 16.5rem しかなく、実測では本人の行の名前が 15.8px まで潰れて読めなくなる(「マスター」+「(あなた)」)。四秒間の一行のために、リスト全行の名前の幅を払うことになる。armed が伸びるのは名前の側であって、
編集の位置ではない。起動中と起動失敗
ランチャのボタンが持っていた
disabledは、押された行のボタンへ移った。状態の語は名前の隣の note に入る——未起動終了と同じ場所であり、note は状態を、ボタンは行為を言う。title、全文は従来通り status 行。次にそのアカウントの開始が押された時点で消える。起動に失敗した端末は破棄されるため、行に残さなければ押したこと自体が画面から消え、行は押される前と同じ
未起動へ戻ってしまう。ランチャ行に残る仕事は無かった
accountEl.valueを読むのはselectedAccount(開始の呼び出し元)とrenderAccountOptions(その select 自身の再描画)の 2 箇所だけで、いずれもランチャ内部で閉じていた。パネル下部のセッションの値は選択ではなく画面に出ている端末に従う。確認した結果、残る役目は見つからなかった。 削除すると会話面が縦に広がる。変更
index.html—#launcherの削除、行の由来のコメントsrc/main.ts—startSessionが account を受け取る形へ。startButtonの追加、launchFailures、selectedAccount/launchableAccounts/renderAccountOptionsの削除src/styles.css— 行を grid 三列へ。.lifecycleと.start、#launcher節の削除(残された#terminalに節見出しを戻した)docs/0-requirements.md— 行の二列、開始に arm を付けない理由、起動中/起動失敗、「ランチャ行は無い」の新設README.md— 行の操作の説明、「アカウントを選び『セッション参加』を押す」→「行の『開始』を押す」追っていないもの
design/Main.dc.html(design canvas)はランチャ行を描いたままである。キャンバスと実装の差は #46 で追う旨が issue と要件に書かれており、その通りに残した。検証
npm run build(tsc+vite build)が通る。