GH GambleHub

モーダルと出口パネル

1)何を使うか

モーダル(背景との対話)-アクションの確認、法的同意、危険な操作、短いフォーム≤ 1-2フィールド。背景をロックします。
引き出し/シート(プルアウトパネル)-インプレイス拡張機能:オブジェクトの詳細、属性編集、リストからの選択、補助ナビゲーション。背景が表示されます→コンテキストが保存されます。

選択ルール:
  • アクションが濃度と確認を必要とする場合→モーダル。
  • コンテキストを保存し、→Drawerの「パラレル」の概要を与えるとき。

2)構造および次元

モーダル(Modal)

タイトル(必須)→本体→CTA(プライマリ/セカンダリ/破壊)。
寸法:S (480-560 px)、 M (640-720 px)、 L (≤ 840 px)。モバイル-フルスクリーンシートで。

引き出し/シート

方向:右エッジ(デスクトップ、編集)、下(モバイル、アクション)、時には左(ナビゲーション)。
幅:360-480 (S)、 480-640 (M)、 640-800 (L)携帯電話で:90-100%の幅/高さ。

コンテンツの高さは常に制限され、内部をスクロールします。header/STAが修正されました。

3)コピーライティングとCTA

タイトル=アクション/意味:レートの確認、支払い方法の選択、KYC必須。
短いテキスト、1-2文。あいまいな数式は避けてください。
CTA: 1つのプライマリ、次のセカンダリ(「キャンセル」)と、必要に応じて、破壊的。

危険なアクションについては、1行の説明を追加します。10秒以内にキャンセルすることができます(可能な場合)"

4)行動と状態

開始:100ミリ秒≤即刻の応答、それからアニメーション120-180ミリ秒。
閉じる:開始(80-140ミリ秒)より速く、トリガーに焦点を戻して下さい。
Busy:コンテナの'aria-busy=「true」、再試行ロック付きボタン。
保存されていない(汚れたフォーム):終了時-ダイアログ警告(「保存されていない変更があります」)。
エスケープ/バックグラウンドをクリック:危険ではないダイアログで許容されます。クリティカル-明示的なボタンのみ。

5)空室状況(A11y)

コンテナ:'role=「dialog」と'aria-modal=「true」(実際のモーダルの場合)。
タイトルは'aria-labelledby'を介してリンクされています。description-'aria-descripedby'。
中のフォーカストラップ;主な焦点はヘッダーまたは最初のインタラクティブアイテムです。
閉じた後に元のトリガーにフォーカスを返します。
スクロールの背景がありません:'ドキュメント。body {overflow: hidden;}'または'inert 'DOMの残りの部分。
キーボードのサポート:タブ/シフト+タブは周期的です;Escは閉じます(スクリプトが禁止されていない限り)。
'prefers-reduced-motion':アニメーションの無効化/簡略化。

テンプレート:
html
<div class="backdrop" data-open hidden></div>
<div class="dialog" role="dialog" aria-modal="true" aria-labelledby="d-title" aria-describedby="d-desc" hidden>
<h2 id =" d-title "> Confirm Bid </h2>
<p id =" d-desc "> Sum of 200 ₴ by factor 1. 85</p>
<div class="actions">
<button class =" btn btn--primary "> Confirm </button>
<button class =" btn btn--ghost "> Cancel </button>
</div>
</div>

6)パフォーマンスとアーキテクチャ

ポータルを介してレンダリングする(アプリケーション上のレイヤー)→Zインデックスの問題が少なくなります。
最初に開いたときに遅延してコンテンツをマウントし、アニメーションを閉じた後にマウントを解除します(またはオフスクリーンを翻訳します)。
'transform/opacity'のみをアニメーション化します。高価なぼかし/特大の影を避けてください。
バックグラウンドスクロール(スクロールロック)をロックし、閉じた後に「ジャンプ」しないように現在の位置を維持します。
引き出しの大きなリスト-仮想化を使用します。

7)モバイルパターン

クイックアクション/確認のためのボトムシート:ジェスチャーをスワイプして閉じます(しきい値)。
底の粘着性があるCTA;close button-左上から。
セーフエリアのインデント(ノッチ/ジェスチャーエリア)。
画面上のキーボードはCTAと重なってはいけません。レイアウト-「持ち上がる」コンテンツまたはキーボードの上の固定パネル。

8)モーションデザイン

入力:フェード+ライトシフト(モーダル:Yに沿って、引き出し:外観の軸に沿って)。120-180ミリ秒。

出力: より短い(80-140ミリ秒)、easing 'cubic-bezier (0。2,0,0.2,1)`.

Background-Opacityは0→0です。4–0.6.脈動と無限のまぶしさなし。
'prefers-reduced-motion'の場合:シフトなし、フェードのみ。

9)クロージングマネジメント

安全な操作のためだけの即時閉鎖。
エラーがある場合、私たちは対話にとどまり、理由を示し、再試行します。
background execution-ダイアログを閉じてトースト「We execute in the background……」、加えて「History」セクションを表示します。

10)典型的なiGamingシナリオ

10.1入札確認(モーダル)

内容:イベント、係数、量、潜在的な利得、係数の有効期間。
ボタン:「確認」(プライマリ)、「キャンセル」。
遅延パターン>3 s: text「確認を待っています……」;係数が変われば正直な更新。

10.2キャッシュアウト(モーダル/シート)

現在のキャッシュアウト量とウィンドウタイマーを表示します。
確認+可能な元に戻す(規制が許可されている場合)。

10.3お支払い方法の選択(引き出し)

手数料/ETAのメソッドのリスト。ミニフォームの→を選択します。

デフォルトのメソッドを保存します。入力を損なうことなくリターン

10.4 KYC(引き出し→モーダル)

ドキュメント/プロンプトをロードするための引き出し。
不完全な負荷で閉じる場合のモーダル:未保存についての警告。

10.5責任あるプレイ制限(モーダル)

ラジオ「Day/Week/Month」、 amountフィールド、line 「will take effect in……」……

11)アンチパターン

ネストされたモーダル(モーダル上のモーダル)。単一のダイアログまたはステップシーケンスを使用します。
コンテンツを定期的に閲覧するためのModalka(より良い引き出し/ページ)。
「マイクロゾーン」によってのみ隠されたクロスまたはクローズ。
危険なアクション→"by background'を閉じる権限。
モーダルの長い形状(→を別の画面/パネルに移動)。
トリガーにフォーカスが戻りません。

12)システムトークンの設計(例)

json
{
"dialog": {
"radius": 12,
"shadow": "var(--elev-4)",
"sizes": { "s": 520, "m": 680, "l": 840 },
"backdropOpacity": 0. 5,
"padding": "20 24",
"gap": 16
},
"drawer": {
"width": { "s": 360, "m": 480, "l": 640 },
"edge": "right",
"radius": 12,
"shadow": "var(--elev-4)"
},
"motion": {
"inMs": 160,
"outMs": 120,
"ease": "cubic-bezier(0. 2,0,0. 2,1)",
"reduce": true
},
"a11y": {
"useAriaModal": true,
"focusTrap": true,
"returnFocus": true
}
}
CSSプリセット(コンセプト):
css
.backdrop[data-open]{position:fixed; inset:0; background:rgba(0,0,0,.5); backdrop-filter:saturate(80%); opacity:1; transition:opacity. 16s}
.dialog,[data-drawer]{position:fixed; background:var(--bg-elevated); border-radius:12px; box-shadow:var(--elev-4);}
.dialog{inset:auto; left:50%;top:50%;transform:translate(-50%,-50%); max-width:840px; width:min(100% - 32px, var(--dialog-w,680px));}
[data-drawer="right"]{top:0; right:0; height:100%;width:var(--drawer-w,480px); transform:translateX(0)}
.dialog[hidden],.backdrop[hidden]{display:none}

13)行動のスニペット

フォーカストラップ+フォーカスリターン:
js const openBtn = document. getElementById('open');
const dlg = document. querySelector('.dialog');
let prevFocus;

function openDialog() {
prevFocus = document. activeElement;
dlg. hidden = false; document. body. style. overflow = 'hidden';
const focusable = dlg. querySelectorAll('button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])');
(focusable[0]        dlg). focus();
function onKey(e){
if(e. key==='Escape') return closeDialog();
if(e. key!=='Tab') return;
const first = focusable[0], last = focusable[focusable. length-1];
if(e. shiftKey && document. activeElement===first){ e. preventDefault(); last. focus(); }
else if(!e.shiftKey && document. activeElement===last){ e. preventDefault(); first. focus(); }
}
dlg. addEventListener('keydown', onKey);
dlg. dataset. off = ()=> dlg. removeEventListener('keydown', onKey);
}
function closeDialog() {
dlg. dataset. off && dlg. dataset. off();
dlg. hidden = true; document. body. style. overflow = '';
prevFocus && prevFocus. focus();
}
閉じるジェスチャー付きシート(モバイル、簡略化):
js let startY=0, delta=0;
const sheet = document. querySelector('.sheet');
sheet. addEventListener('touchstart', e => startY = e. touches[0].clientY);
sheet. addEventListener('touchmove', e => {
delta = Math. max(0, e. touches[0].clientY - startY);
sheet. style. transform = `translateY(${delta}px)`;
});
sheet. addEventListener('touchend', () => {
if (delta > 120) sheet. classList. remove('open'); else sheet. style. transform = '';
delta = 0;
});

14)メトリクスと実験

Open Rate/Complete Rate by modal:アクションを開いて完了した回数。
Time-to-Decision:開始からプライマリをクリックするまで。
Dismiss率と理由(Esc/background closeと「Cancel」)。
ビジースクリプトのエラー/再試行レート。
A/B:モーダルと引き出し、CTAテキスト、フィールド順序「、確認」と「元に戻す」。

15) QAチェックリスト

可用性について

  • 'role=「dialog」'、 'aria-modal=「true」、正しい'aria-labelledby/-describby'。
  • フォーカストラップは動作します。フォーカスはトリガーに戻ります。
  • Escは閉じます(許可されている場合)。タブは周期的です。
  • 対照≥ AA;意味を伝えるのは色だけではありません。

動作

  • TTFF ≤ 100ミリ秒;120-180 ms/out 80-140 msのアニメーション。
  • ページを「ジャンプ」せずにバックグラウンドをスクロールロックします。
  • 汚れた形で保管されていないガード。
  • ビジー状態、正しい再試行/エラー。

インターフェイス

  • ヘッダーとプライマリCTAをクリアします。
  • クロス/クローズボタンが利用可能です。
  • 寸法は適応性があります。携帯電話で-ジェスチャーとシート。

パフォーマンス

  • ポータル/z-indexが正しい;「伝達」なし。
  • 遅延初期化;transform/opacityのみがアニメーション化されます。

16)設計システムにおけるドキュメンテーション

コンポーネント:'Modal'、 'Drawer/Sheet'、 'ConfirmDialog'、 'UnsavedGuard'。
トークン:寸法、インデント、影、アニメーション、背景、フォーカスリング。
ガイド:「モーダルと引き出しのとき」、コピーライティングパターン、危険なアクション(確認/取り消し)、スクロールロックとポータル、動きを減らします。
Do/Don 't gallery:ネストされたモーダル(don' t)、モーダルの長いフォーム(don 't)、コンテキストを展開するシート(do)。

概要

Modalka-完全な注意の下での決定のために、引き出し-フローを破ることなく、コンテキストを拡大します。構造をシンプルにし、CTAを明確にし、相互作用を予測可能でアクセス可能にします。パフォーマンスを尊重し、バックグラウンドをロックし、フォーカスを戻します。iGamingシナリオでは、これは直接信頼に影響します。ベットの確認、キャッシュアウト、支払い方法の選択、およびKYCは公正で迅速で安全でなければなりません。

Contact

お問い合わせ

ご質問やサポートが必要な場合はお気軽にご連絡ください。いつでもお手伝いします!

Telegram
@Gamble_GC
統合を開始

Email は 必須。Telegram または WhatsApp は 任意

お名前 任意
Email 任意
件名 任意
メッセージ 任意
Telegram 任意
@
Telegram を入力いただいた場合、Email に加えてそちらにもご連絡します。
WhatsApp 任意
形式:+国番号と電話番号(例:+81XXXXXXXXX)。

ボタンを押すことで、データ処理に同意したものとみなされます。