Skip to content

feat(ui): show the row lifecycle controls as icons #71

Description

@smileygames

目的

参加者の行のライフサイクル操作を、文字から記号の表示へ変える。併せて 終了 の確認を、ボタンの armed 状態から webview 内のダイアログへ移す。

Master の指示(2026-08-24):

開始→▶️ 終了→❌ 編集→⚙️ のラベル表示に変えられる?これは表示だけでいいやつね。

ワンクリックしたら[モーダル]だっけ?[ポップアップ]で本当に終了しますか?を出せばいいんじゃない?

前提

いまの形

三つとも src/main.tstextContent に文字を入れている。いずれも title を既に持っており、アカウント名を含む説明が出る。

操作 位置 いまの表示 いまの title
開始 startButton(866行) 開始 {name} のセッションを開始する / 起動中は {name} を起動しています
編集 editButton(880行) 編集 {name} の設定
終了 endButton(1168行) 終了 / armed で 本当に終了 {name} のセッションを終了する / armed で もう一度押すと {name} のセッションを終了します。

window.confirm を断った記録は二層ある

docs/0-requirements.md:406src/main.tsendButton のコメントに、モーダルを採らなかった理由が二つ書かれている。混ぜて読まないこと。

  1. ホスト依存の失敗。 window.confirm はホストが答えなかった場合の失敗の向きがどちらも誤りになる——答えを待たない実装ではボタンが黙って死に、既定を肯定と読む実装では一度のクリックで落ちる。
  2. 状態の置き場所。 ボタン自身がどちらの状態にいるかを表示する形を選び、モーダルが別の場所でそれを言う形を採らなかった。

An arm state held on this side has neither failure, and the button says which state it is in rather than a modal saying it elsewhere.

決まったこと

  • 開始▶️
  • 編集 → ⚙️
  • 終了 → ❌
  • 終了 の確認はダイアログで出す(Master、2026-08-24)。1 クリックでダイアログが開き、そこで「本当に終了しますか?」に答える。

受け入れた代償

上記 2(状態はボタン自身が表示する)を手放す。Master は (a) ❌ のまま色で伝える案・(c) armed のとき文字へ戻す案を含む三択を見た上で、ダイアログを選んだ。決着済みとして扱い、実装時に蒸し返さない。

上記 1 は手放さない。window.confirm は使わない。 #account-dialog と同じく webview 内の <dialog> で持つ。ホストが答えないという失敗の形がそもそも起きない。

この決定が連れてくるもの

armed の機構が丸ごと不要になる。src/main.tsarmedEnd / armedTimer / armedAt / END_SETTLE_MS / armEnd / disarmEndshowView からの disarmEnd() 呼び出し、src/styles.css:530.end.armed

とくに END_SETTLE_MS(400ms)は、その存在理由ごと消える。src/main.ts:329 がこう書いている——

The armed button is wider than the resting one and grows under the pointer

armed でボタンが広がるためポインタの下に伸び、resting 側を狙ったクリックが armed に当たる。それを捨てるための窓であった。❌ 固定でボタンの幅が動かなくなり、確認が別の面へ出るなら、この前提が無い。

docs/0-requirements.md:315(armed 時の横幅がパネル 16.5rem の中で本人の行の名前を押し出す件)も同じ理由で解消する。

実装の形

未決だった三点を、着手にあたって次のとおり決めた。

  • 確認ダイアログは新設する。 #account-dialog を流用しない。あれはアカウントの編集フォーム(.field / .preview / .launch / .actions)であり、確認とは中身が別物である。一枚の <dialog> に二役を持たせると、開くたびにどちらの姿で開くかの分岐を抱えることになる。確認だけを持つ小さな <dialog> を別に置く。
  • 記号の並ぶ列は幅を固定する。 絵文字はフォントによって幅が揺れる。#participants .member の三つのボタン(.start / .edit / .endsrc/styles.css:482)に固定の寸法を与え、記号はその中で中央に置く。.end が armed で広がっていた可変幅は、ここで消える。
  • アカウントの削除は本 issue で触らない。 feat(account): decide whether 削除 follows 終了 out of its armed state #72 へ切り出した。feat(ui): show the row lifecycle controls as icons #71 の成果物は 削除 に触れなくても単独で出荷できるため、sibling issue の litmus に従った。

制約

  • window.confirm を使わない。 webview 内の <dialog> で持つ。上記 1 は生きている。
  • 押した先で起きることを変えない。 変えるのは確認の出し方だけ。
  • title を落とさない。 記号だけの表示になるため、アクセシブルな名前として aria-label を併せて持たせる。記号は読み上げに耐えない。

対象ファイル

  • index.html — 確認ダイアログ
  • src/main.tsstartButton / editButton / endButton、armed 機構の撤去
  • src/styles.css — 記号表示に伴う幅・字送り、.end.armed の撤去
  • docs/0-requirements.md — 行の操作の記述、armed の記述(315行)、window.confirm の節(406行。window.confirm を使わないことと、<dialog> で確認を出すことは別であるため、書き分けが要る)

関連

Metadata

Metadata

Assignees

Labels

enhancement新機能・改善要望ready本文が実装開始できる形まで収束している状態。ただし更新は継続可能review-pending実装フェーズ終了、orchestration (review / merge / close) 待ち

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions