#10スコア 3/5基盤UI・汎用

AI にファイルアップロードを作らせたら、自分のコンポーネントが半完成だった(やってみた #10)

ルート: /upload
デスクトップ表示
モバイル表示

375px のビューポートで撮影。縦長のページはフレーム内をスクロールします。

解説記事

AI にファイルアップロードを作らせたら、自分のコンポーネントが半完成だった(やってみた #10)

やってみたシリーズ: 自作のデザインシステム @gunjo/ui群青)を、文脈ゼロの cold な AI に実 UI で作らせる連載。複雑系に入って #9 Kanban に続き、今回は ファイルアップロード

条件は同じ(出荷物そのもの+docs だけ、ソース非公開)。お題は /upload に、ドロップゾーン、選択ファイル一覧(名前・サイズ・型・削除)、ファイルごとの進捗バー、全体の Upload all/空状態。

結果 — 3/5(シリーズ最低点)

npm run build 成功、static prerender、コンソールエラー0。

upload

支える部品(Progress/Button/Badge/EmptyState)と typed barrel は今回も良かった、provider 不要・SSR クラッシュなし。でも主役の FileUploader が、シリーズで一番の地雷だった。

目玉 — FileUploader が半完成で、docs が嘘をついていた

cold AI の報告:

① 進捗が "未実装"。しかも死にコメントが残ってる

FileUploader の内部状態には progressstatusフィールドとしては存在するのに、描画されない。ソースにこう書いてある:

{/* Progress Simulation would go here */}

実装するつもりで放置された死にコメント。なのに docs は「アップロード中の進捗を表示できる」と書いている。=docs が実体より先に約束してしまっている(over-promise)。これは #7 の「a11y 内蔵が破れてた」と同じ、主張と実体のズレ。→ #62

② uncontrolled で、外から触れない

value prop が無く、onValueChange最新バッチだけ返す(累積リストを返さない)。さらに内部で独自のファイル行+削除ボタンを描画するが hook できず、外で自前リストを出すと二重表示。cold AI は [data-slot="file-uploader"] > div:nth-child(2){display:none}CSS hack で内部リストを隠すしかなかった。「showFileList={false} が欲しい」と。

③ そして、また固定幅(監査の取りこぼし)

Progressw-[200px]ProgressWidgetw-[320px] 固定。これ——#58 で「固定幅デフォルトを再監査した」はずなのに、Progress 系を取りこぼしていた。 「class ごと監査」したつもりが、漏れていた。正直に #62 に入れた。

(cold AI 自身の React 19 Strict Mode バグも1個あったが、それは AI 側で自己修正・gunjo とは無関係。正直に記録。)

学び — 一番低い点が、一番誠実

#10 はシリーズ最低の 3/5。でもこれこそ、このシリーズをやる理由です。

  • 自分のコンポーネントが半完成(進捗が死にコメント)
  • 自分の docs が、実体より先に約束していた(進捗表示の嘘)
  • 「監査した」と言った固定幅が、取りこぼしていた

これを自分のテストで、公開前に、自分で見つけた。 盛らない・隠さない——低い点を低いまま出して、issue にして直す。複雑系は、単純画面では絶対に出ない「半完成」と「docs の嘘」を炙り出してくれる。まだ全然枯れてない。

次回予告(やってみた #11)

  • カレンダー予約(Calendar / DatePicker / Select)— 日付まわりの複雑系。

試す

まだ alpha。半完成も docs の嘘も、見つけたら全部直す。それが青になるということ。


<!-- 公開前: #62 反映後に記述更新/スクショ確定/相互URL差込/EN(dev.to)ミラー -->

使用した @gunjo/ui コンポーネント

この画面のソースが直接 import している部品です。

cold AI が組み上げた実コード

ファイル名をクリックでソースを展開できます。