Skip to content

デザインパターンにドラッグ&ドロップのパターンを追加#1894

Open
kesteer wants to merge 7 commits intomainfrom
add-rich-interactive-elements-to-design-patterns
Open

デザインパターンにドラッグ&ドロップのパターンを追加#1894
kesteer wants to merge 7 commits intomainfrom
add-rich-interactive-elements-to-design-patterns

Conversation

@kesteer
Copy link
Copy Markdown

@kesteer kesteer commented Feb 26, 2026

課題・背景

  • リッチなインタラクションが最近プロダクトに増えている(特にDnD系)ので、ベストプラクティスなどを教えるために追加しました
  • 実装方法次第でa11yのNGチケットとつながりやすい状態になっていますので、全プロダクトの統一感を出したいと思っています。

やったこと

- デザインパターンにドラッグ&ドロップに関するページを追加し、想定されるパターンと説明を記載した。

やらなかったこと

動作確認

プレビューをみてください!
https://deploy-preview-1894--smarthr-design-system.netlify.app/products/design-patterns/drag-and-drop/

キャプチャ

@netlify
Copy link
Copy Markdown

netlify bot commented Feb 26, 2026

Deploy Preview for smarthr-design-system ready!

Name Link
🔨 Latest commit 92825cf
🔍 Latest deploy log https://app.netlify.com/projects/smarthr-design-system/deploys/69b903cd3087a20008b4bf83
😎 Deploy Preview https://deploy-preview-1894--smarthr-design-system.netlify.app
📱 Preview on mobile
Toggle QR Code...

QR Code

Use your smartphone camera to open QR code link.

To edit notification comments on pull requests, go to your Netlify project configuration.

@kesteer kesteer requested a review from a team February 27, 2026 04:09
@neet neet self-requested a review February 27, 2026 04:10
@kesteer kesteer marked this pull request as ready for review March 3, 2026 08:00
@kesteer kesteer requested a review from a team as a code owner March 3, 2026 08:00
@kesteer kesteer requested review from Qs-F and minami-70128 and removed request for Qs-F and minami-70128 March 3, 2026 08:00
Copy link
Copy Markdown
Contributor

@schktjm schktjm left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

いろいろな気になりが合ったのでコメントしたのですが、私の意見も間違っているかもなので他の方の意見も聞きたくなりました!

Comment thread src/content/articles/products/design-patterns/rich-interactive-elements/index.mdx Outdated
Comment thread src/content/articles/products/design-patterns/rich-interactive-elements/index.mdx Outdated
Comment thread src/content/articles/products/design-patterns/rich-interactive-elements/index.mdx Outdated
Comment thread src/content/articles/products/design-patterns/rich-interactive-elements/index.mdx Outdated
Comment thread src/content/articles/products/design-patterns/rich-interactive-elements/index.mdx Outdated
Comment thread src/content/articles/products/design-patterns/rich-interactive-elements/index.mdx Outdated
Comment thread src/content/articles/products/design-patterns/rich-interactive-elements/index.mdx Outdated
Comment thread src/content/articles/products/design-patterns/rich-interactive-elements/index.mdx Outdated
Comment thread src/content/articles/products/design-patterns/rich-interactive-elements/index.mdx Outdated
Comment thread src/content/articles/products/design-patterns/rich-interactive-elements/index.mdx Outdated
@maiha2
Copy link
Copy Markdown
Contributor

maiha2 commented Mar 4, 2026

@kesteer いくつかコメント残しました!その他、検討してほしいことを以下に書きます。

サマリー

  1. ドキュメントのタイトルを「ドラッグ&ドロップ」に変更してはどうか
  2. 掲載する情報の順序をデザイン・UI設計→実装の順に整理するとよさそう
  3. 「ドラッグ可能な領域」で書かれているルールについて確認

1.ドキュメントのタイトルを「ドラッグ&ドロップ」に変更してはどうか

ドラッグ&ドロップに関する情報だけで、ある程度の量になりましたし「リッチなインタラクション」ではなく「ドラッグ&ドロップ」で独立したページにするのはどうでしょうか?

2.掲載する情報の順序をデザイン・UI設計→実装の順に整理するとよさそう

Design Systemのプロダクトに関するドキュメントのパターンとしては
デザイン・UI設計的な情報が先に来て、実装情報が後に来る流れが多いです。

「UIに関するルールが先にあり、それをウェブで実現する方法として実装がある」と考えると
この情報の順序は自然かなと思います。

これを踏まえ、今回のドキュメントの構成は
領域→アクションのキャンセル→キーボード操作 の順がいいと思いました。

セクション「ドラッグ可能な領域」の内容も
UI設計・デザインの話→スクショ→実装という感じでまとめられると良いと思います。

3.「ドラッグ可能な領域」で書かれているルールについて確認

現在の説明+スクショだと、「状況にかかわらずカード全体をdraggableにするのはNG」のように読めましたが
これは意図どおりでしょうか?

貼ってあるスクショのように、draggableなカードが、他のintractiveなUI(ボタンなど)を内包する場合は「drag-handleのみが、dragの起点になる」で良いと思いますが
intractiveなUIを内包しない場合はどうでしょうか?

これについてAtrassianのdesign systemにはこう書いてあります。

Which parts of an entity should be draggable?
As a starting position, if an entity is draggable (eg a card), then make the whole entity draggable. If the entity has other interactive parts (eg buttons, dropdowns), then just make the drag handle icon the draggable part of the entity.
https://atlassian.design/components/pragmatic-drag-and-drop/design-guidelines

このAtrasianのルールをSmartHRとしても適用して良さそうに思います!

@kesteer kesteer changed the title デザインパターンにリッチなインタラクションのパターンを追加 デザインパターンにドラッグ&のパターンを追加 Mar 17, 2026
@kesteer kesteer changed the title デザインパターンにドラッグ&のパターンを追加 デザインパターンにドラッグ&ドロップのパターンを追加 Mar 17, 2026
@kesteer
Copy link
Copy Markdown
Author

kesteer commented Mar 23, 2026

Copy link
Copy Markdown
Contributor

@oti oti left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ナイスな基準追加ありがとうございます! 全体の書き口に違和感があったので多めにコメントしました! 🙇

suggestionの内容はアイデアですのでそのまま取り込まなくて大丈夫ですので、まずはご確認ください!

Comment on lines +19 to +20
ドラッグ&ドロップが必要なUIには、ユーザーを混乱させないように操作に一貫性をもたせることが重要です。
ただ、それぞれのUIのパターンにおいて、アクセシビリティを確保することも重要です。
Copy link
Copy Markdown
Contributor

@oti oti Mar 23, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
ドラッグ&ドロップが必要なUIには、ユーザーを混乱させないように操作に一貫性をもたせることが重要です。
ただ、それぞれのUIのパターンにおいて、アクセシビリティを確保することも重要です。
ドラッグ&ドロップが必要なUIには、ユーザーを混乱させないように操作に一貫性をもたせつつアクセシビリティを確保することが重要です。

[IMO] この時点では読み手は複数のUIパターンがあることを知らないので、「それぞれのUIパターン」はトルツメしたいです。また、アクセシビリティが重要であることはいつもなので、シンプルに説明されて欲しいと思いました。

## ドラッグ&ドロップリスト
<Text weight="bold">ドラッグ&ドロップリスト</Text>は、ユーザーがアイテムをドラッグして順序を変更できるUIのパターンです。

### インタラクティブな領域
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
### インタラクティブな領域
### インタラクティブな領域の注意点

このセクションで伝えたいことは、「インタラクティブな領域内に別のインタラクティブ要素を入れないで」とうことだと思うので、それがわかる見出しになっているとよさそうです。

Comment on lines +28 to +29
インタラクティブな領域とは、<Text weight="bold">ユーザーがアイテムをドラッグできる領域のこと</Text>です。
インタラクティブな領域は、ユーザーがアイテムをドラッグするためのドラッグ操作を開始できる要素を提供する必要があります。
Copy link
Copy Markdown
Contributor

@oti oti Mar 23, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
インタラクティブな領域とは、<Text weight="bold">ユーザーがアイテムをドラッグできる領域のこと</Text>です。
インタラクティブな領域は、ユーザーがアイテムをドラッグするためのドラッグ操作を開始できる要素を提供する必要があります。
インタラクティブな領域とは、<Text weight="bold">ユーザーがアイテムをドラッグする操作に反応する領域のこと</Text>です。ユーザーはこの領域でアイテムをドラッグする操作を開始できます。
インタラクティブな領域はHTMLのインタラクティブな要素でマークアップしてください。

「ドラッグできる領域」だと、ドラッグできるアイテム自体のことなのか、ドラッグアイテムをドロップ可能なコンテナ範囲のことなのかがスッとわからなかったです。例えば suggestion のような文章でどうでしょうか。

Comment on lines +36 to +37
しかし、インタラクティブな要素を使用しているカードの中に、さらにインタラクティブな要素をネストすると、支援技術で内側のインタラクティブな要素にフォーカスできないなどの問題が起こります。
この場合、カードの内部にインタラクティブな要素が存在するための<Text weight="bold">ハンドル形式</Text>パターンもあります。
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
しかし、インタラクティブな要素を使用しているカードの中に、さらにインタラクティブな要素をネストすると、支援技術で内側のインタラクティブな要素にフォーカスできないなどの問題が起こります。
この場合、カードの内部にインタラクティブな要素が存在するための<Text weight="bold">ハンドル形式</Text>パターンもあります。
このとき、インタラクティブな領域内にアクションボタンやリンクなどのインタラクティブな要素を含まないでください。支援技術が内側のインタラクティブな要素にフォーカスできないなどの問題が起こります。
こうしたカードの内部にインタラクティブな要素が存在する場合は、<Text weight="bold">ハンドル形式</Text>パターンで対応してください。

何が問題なのか、どう解決すればいいのかを簡潔に伝えたいです。

この場合、カードの内部にインタラクティブな要素が存在するための<Text weight="bold">ハンドル形式</Text>パターンもあります。

#### ハンドル形式
HTMLのインタラクティブ要素をカードの中にインタラクティブな要素を配置したい場合は、カードコンポーネントとは別のドラッグ操作のためのハンドルを提供します。
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
HTMLのインタラクティブ要素をカードの中にインタラクティブな要素を配置したい場合は、カードコンポーネントとは別のドラッグ操作のためのハンドルを提供します
カードの中にインタラクティブな要素を配置したい場合は、カード全体をインタラクティブな領域にはせず、ドラッグ操作のためのハンドルを提供します

Comment on lines +55 to +59
##### 補足
どうしても、デザインがカード全体がインタラクティブな領域になることを要求する場合は、
カード全体をインタラクティブな要素から`div`要素に変更し、正確なARIA属性とHTMLの[drag-and-drop API](https://developer.mozilla.org/en-US/docs/Web/API/HTML_Drag_and_Drop_API)を使用できます。

<Text weight="bold">注意</Text>: この方法はアクセシビリティの支援技術の不具合と繋がる可能性が高いため推奨しません。
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
##### 補足
どうしても、デザインがカード全体がインタラクティブな領域になることを要求する場合は、
カード全体をインタラクティブな要素から`div`要素に変更し、正確なARIA属性とHTMLの[drag-and-drop API](https://developer.mozilla.org/en-US/docs/Web/API/HTML_Drag_and_Drop_API)を使用できます
<Text weight="bold">注意</Text>: この方法はアクセシビリティの支援技術の不具合と繋がる可能性が高いため推奨しません。
##### やむを得ない場合の対応方法
どうしても、インタラクティブな要素を含むカード全体をインタラクティブな領域にしなければならない場合は、カードを`div`要素にして正確なARIA属性とHTMLの[drag-and-drop API](https://developer.mozilla.org/en-US/docs/Web/API/HTML_Drag_and_Drop_API)を使用してください
ですがこの方法は支援技術の動作に不具合が発生する可能性が高いため<Text weight="bold">推奨しません。</Text>

最終手段であるようなことがわかる表現にしたくなりました。

- [WCAG 4.1.2: 名前 (name)・役割 (role)・値 (value)](https://waic.jp/translations/WCAG22/Understanding/name-role-value.html)

### キーボードの操作
すべてのユーザーがマウスやタッチ入力を使用できるわけではないため、ドラッグ&ドロップの操作をキーボードでも可能にすることが重要です。
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
すべてのユーザーがマウスやタッチ入力を使用できるわけではないため、ドラッグ&ドロップの操作をキーボードでも可能にすることが重要です
すべてのユーザーがマウスやタッチ入力を使用できるわけではないため、ドラッグ&ドロップの操作をキーボードでも可能にする必要があります

重要であると言うだけでは逃げられてしまうので、要求しましょう!

### キーボードの操作
すべてのユーザーがマウスやタッチ入力を使用できるわけではないため、ドラッグ&ドロップの操作をキーボードでも可能にすることが重要です。

これを実現する一般的な方法は、<Text weight="bold">アイテムを上下に移動するためのボタンを提供すること</Text>や、カード用のドロップダウンメニューをオプションとして提供することです。
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
これを実現する一般的な方法は、<Text weight="bold">アイテムを上下に移動するためのボタンを提供すること</Text>や、カード用のドロップダウンメニューをオプションとして提供することです
一般的な実現方法としては、<Text weight="bold">アイテムの位置を変更できるボタン</Text>や、ドラッグ&ドロップと同じ操作を行えるドロップダウンメニューをオプションとして提供することです

上下の移動となっているのはサンプル画像での話で、実際のプロダクトでは上下だけでなく左右もなくはないと思います。汎用的な説明にするのが良さそうです。

Comment on lines +73 to +76
<DoAndDont type="do" width="calc(50% - 8px)">
<Image slot="img" src={doUseKeyboard} alt="Do" />
<Text slot="label">ドラッグ&ドロップの操作をキーボードでも可能にする</Text>
</DoAndDont>
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[IMO]

ドラッグ&ドロップと同じ操作を行えるドロップダウンメニューをオプションとして提供

このサンプルも欲しくなりました。

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@oti できれば、Do/Dontに表示したかた(一番わかりやすい)が、Dontの例が両方で一緒になるからどういう概念で表示すればいいかなと思いました。この場合、デザインパターンにはどういう風に対応しますか?Dontが同じでも、Do/Dontで表示する感じですかね?

全然追加してもいいだと思っていますが、この部分だけを悩んでいます

Copy link
Copy Markdown
Contributor

@oti oti Mar 24, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@kesteer まずDoを2つ並べて、改行してDontを1つおくのはどうでしょう?

<Do> / <Do>
<Dont>

の形です。

Comment on lines +90 to +106
### アクションのキャンセル操作

ユーザーがアイテムをドラッグしている最中にアクションをキャンセルできるようにする必要があります。一般的には、`Escape`キーを使用してキャンセルする方法が実装されます。

アクションをキャンセルできない場合は、最新のアクションを元に戻す方法を提供する必要があります。これは、`元に戻す`ボタンやメニューのオプションを通じて行なうことができます。

<Cluster gap={1}>
<DoAndDont type="do" width="calc(50% - 8px)">
<Image slot="img" src={doCancelAction} alt="Do" />
<Text slot="label">②と③の位置を変えるアクションのあとで、アクションをキャンセルをできるようにする</Text>
</DoAndDont>

<DoAndDont type="dont" width="calc(50% - 8px)">
<Image slot="img" src={dontCancelAction} alt="Dont" />
<Text slot="label">②と③の位置を変えるアクションのあとで、アクションをキャンセルする方法がない</Text>
</DoAndDont>
</Cluster>
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

キャンセル操作と元に戻す操作を混ぜているのが気になりました。

マウスやタッチでドラッグ中にEscapeを押してキャンセルできる話をまずして、次にキーボードサポートとして元に戻すボタンを提供すべし、という順番はどうでしょうか。

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

この部分が少し難しいですね。確かに、元に戻す処理とキャンセルが概念的に違う事の考え方もわかりつつ、一応WCAGのルールの場面から同じ扱いとなっています。

中止又は元に戻すことができる
機能の完了にはアップイベントを使用し、かつ機能の完了前に中止する、又は機能の完了後に元に戻すためのメカニズムが利用できる。

綺麗にキーボードとマウスの分け方をできないからまとめています。(例えば、キーボードの実装次第で、Escapeのキーを使う場合もある、マウスの場合も戻す処理も当てはまる)

これは少し検討して良さそうかな

Copy link
Copy Markdown
Contributor

@oti oti Mar 24, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

綺麗にキーボードとマウスの分け方をできない

たしかに!  

改めて見ると、元に戻すボタンよりEscapeとを優先して実装すべしと読めるのですが、これ自体はWCAGの方針に合っていますか? 個人的には優先度に差はなく、どちらも実装されているのは良いが、どちらかはなくてはならない、という認識でした。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants