添付ファイル
hc-attachment はファイルカードです: アイコン、ファイル名、
サイズ、削除ボタンが 1 つのグリッド行に並びます。hc-attachments は
それを包むリストです — hc-chips と同じく複数形です。添付ファイルの
リストそのものだからで、本物の <ul>/<li> に保つことでセットが
読み上げ可能になります。純 CSS です:
ドロップゾーンが
ファイルを集め、
ファイルアップロードレシピが
マルチパート + 進捗の契約を所有し、
hc-progress が
installUploadProgress() の駆動するバーです。
基本の HTML
Section titled “基本の HTML”<ul class="hc-attachments" aria-label="Attachments"> <li class="hc-attachment"> <span class="hc-attachment__icon" aria-hidden="true">📄</span> <span class="hc-attachment__name">notes.md</span> <span class="hc-attachment__size">4 KB</span> <button class="hc-attachment__remove" type="button" aria-label="Remove notes.md">×</button> </li></ul>data-state がなければファイルは確定 — アップロード済みで一覧に
載った状態です。アイコンのスロットにはインライン SVG(または絵文字の
プレースホルダ)が入ります。装飾なので aria-hidden に保って
ください。長いファイル名は行を壊さず、省略記号で切り詰められます。
data-state="uploading" はカードの進捗行を表示します — カードの
全幅にわたるネイティブの
hc-progress 要素で、
htmx がフォームをアップロードする間、その value を
installUploadProgress() が駆動します。data-state="error" は共有の
ステータストークンでカードを
色づけします。
<ul class="hc-attachments" aria-label="Attachments"> <li class="hc-attachment" data-state="uploading"> <span class="hc-attachment__icon" aria-hidden="true">📄</span> <span class="hc-attachment__name">report.pdf</span> <span class="hc-attachment__size">1.2 MB</span> <progress class="hc-progress hc-attachment__progress" max="100" value="40" aria-label="Uploading report.pdf"></progress> <button class="hc-attachment__remove" type="button" aria-label="Remove report.pdf">×</button> </li>
<li class="hc-attachment" data-state="error"> <span class="hc-attachment__icon" aria-hidden="true">📄</span> <span class="hc-attachment__name">huge.iso</span> <span class="hc-attachment__size">9.8 GB</span> <button class="hc-attachment__remove" type="button" aria-label="Remove huge.iso">×</button> </li></ul>進捗行は data-state="uploading" の間だけ描画されます — サーバの
成功フラグメントは確定カード(状態なし、<progress> なし)をそのまま
スワップし、失敗は data-state="error" をスワップします。
添付ファイルカードはファイルアップロードフローの表示側です。 残りの半分はすでに存在します:
- ドロップゾーンが
ファイルを集めます — ドロップはネイティブの
<input type="file">に 代入して普通のchangeを発火するので、周囲のフォームはいつも どおりシリアライズされます。 - ファイルアップロードレシピが
マルチパート + 進捗の契約を所有します: htmx がフォームを POST し、
installUploadProgress()が実際のアップロード進捗を<progress>要素へ写し、レスポンスが確定フラグメントを追記してフォームを out-of-band でリセットします。
アクセシビリティ
Section titled “アクセシビリティ”- 削除コントロールは本物の
<button>で、aria-labelにファイル名を 含めます — 素の「×」ではなく「Remove report.pdf」です。 <ul>/<li>構造により、セットは位置と件数つきで読み上げ可能です。 見出しが名前になっていないときはリストにaria-labelを与えて ください。<progress>はアクセシブルネームを持ちます(そのaria-labelも ファイル名を含む)。読み上げられるパーセンテージがどのファイルの ものか分かります。- アイコンは装飾(
aria-hidden="true")です — アイデンティティは ファイル名のテキストが担います。
テーマ用トークン
Section titled “テーマ用トークン”component トークン(component.tokens.json):
| トークンパス | 用途 |
|---|---|
attachment.bg / border / radius | カードの面。 |
attachment.gap | カード内のグリッドギャップとカード間のギャップ。 |
attachment.padding-block / padding-inline | カードのパディング。 |
attachment.name-fg / size-fg | ファイル名 / サイズの文字。 |
attachment.icon-size | アイコンと削除ボタンの正方形。 |
attachment.error-bg / error-border | エラー状態のカード。 |
CSS 変数
Section titled “CSS 変数”生成される CSS 変数を表示
--hc-attachment-bg | -border | -radius | -gap--hc-attachment-padding-block | -padding-inline--hc-attachment-name-fg | -size-fg | -icon-size--hc-attachment-error-bg | -error-border- ドロップゾーン — このカードが表示するファイルを集めます。
- プログレス — アップロード中状態の中のネイティブなバー。
- チップ — ファイルではない事実のための、より軽いトークン。
- ファイルアップロードレシピ — マルチパート + ライブ進捗のパターン一式。
レシピでの利用: チャットメッセージ