Newer
Older
client_dwatch / lib / ui / modal.ts
/**
 * モーダル共通の純粋関数(指示書AY 段階9-2。M2)。
 * React / DOM を import しない。画面部品はここから読む。
 */

/**
 * 背景のクリックで閉じてよいか。
 * ★押した(mousedown)のも離した(click)のも背景そのもののときだけ★閉じる。
 * 入力の中で文字を選び、背景の上で離したときに閉じないため。
 */
export function shouldCloseOnBackdrop(downOnOverlay: boolean, clickOnOverlay: boolean): boolean {
  return downOnOverlay && clickOnOverlay;
}

/**
 * Tab でフォーカスを窓の中に閉じ込める。
 * `count` は押した時点のフォーカスできる要素の数、`activeIndex` は今のフォーカスの位置(窓の外なら -1)。
 * 戻り値はフォーカスを移す位置。null はブラウザの既定の移動に任せる。
 */
export function trapFocusIndex(count: number, activeIndex: number, backward: boolean): number | null {
  if (count <= 0) return null;
  const last = count - 1;
  if (backward) return activeIndex <= 0 || activeIndex > last ? last : null;
  return activeIndex < 0 || activeIndex >= last ? 0 : null;
}